📄 Core/MemberCollectors/AttributedMembersCollector.cs
using System.Collections.Generic;
using System.Linq;
using Microsoft.CodeAnalysis;

namespace Reacher.MemberCollectors;

internal sealed class AttributedMembersCollector(string attributeName) : MembersCollector()
{
    public static IEnumerable<ISymbol> CollectMembers(string attributeName, IEnumerable<Compilation> compilations)
    {
        var collector = new AttributedMembersCollector(attributeName);
        compilations.Accept(collector);
        return collector.Members;
    }

    protected override bool ShouldMemberBeIncluded(ISymbol member) =>
        member
            .GetAttributes()
            .Any(attr =>
                attr.AttributeClass?.Name is string name
                && (name == attributeName || name == attributeName + "Attribute")
            );
}