📄 Core/DocumentationCommentIdMemberCollector.cs
using System.Collections.Generic;
using Microsoft.CodeAnalysis;

namespace Reacher;

internal class DocumentationCommentIdMemberCollector(HashSet<string> documentationIds) : SymbolVisitor
{
    public static IEnumerable<IMethodSymbol> CollectMembers(
        IEnumerable<string> documentationIds,
        Compilation[] compilations
    )
    {
        var collector = new DocumentationCommentIdMemberCollector([.. documentationIds]);
        foreach (var compilation in compilations)
        {
            compilation.Assembly.Accept(collector);
        }
        return collector.Members;
    }

    public IEnumerable<IMethodSymbol> Members => members;
    private readonly HashSet<IMethodSymbol> members = [];

    public override void VisitAssembly(IAssemblySymbol symbol)
    {
        symbol.GlobalNamespace.Accept(this);
    }

    public override void VisitNamespace(INamespaceSymbol symbol)
    {
        foreach (var namespaceOrType in symbol.GetMembers())
        {
            namespaceOrType.Accept(this);
        }
    }

    public override void VisitNamedType(INamedTypeSymbol type)
    {
        foreach (var member in type.GetMembers())
        {
            member.Accept(this);
        }

        foreach (var nestedType in type.GetTypeMembers())
        {
            nestedType.Accept(this);
        }
    }

    public override void VisitMethod(IMethodSymbol member)
    {
        if (
            member.GetDocumentationCommentId() is not string documentationId
            || !documentationIds.Contains(documentationId)
        )
        {
            return;
        }

        members.Add(member);
    }
}