File: src\Workspaces\SharedUtilitiesAndExtensions\Compiler\CSharp\Extensions\MemberDeclarationSyntaxExtensions.DeclarationFinder.cs
Web Access
Project: src\src\CodeStyle\CSharp\Analyzers\Microsoft.CodeAnalysis.CSharp.CodeStyle.csproj (Microsoft.CodeAnalysis.CSharp.CodeStyle)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
#nullable disable
 
using System.Collections.Generic;
using Microsoft.CodeAnalysis.CSharp.Syntax;
 
namespace Microsoft.CodeAnalysis.CSharp.Extensions;
 
internal partial class MemberDeclarationSyntaxExtensions
{
    private sealed class DeclarationFinder : CSharpSyntaxWalker
    {
        private readonly Dictionary<string, List<SyntaxToken>> _map = [];
 
        private DeclarationFinder()
            : base(SyntaxWalkerDepth.Node)
        {
        }
 
        public static Dictionary<string, List<SyntaxToken>> GetAllDeclarations(SyntaxNode syntax)
        {
            var finder = new DeclarationFinder();
            finder.Visit(syntax);
            return finder._map;
        }
 
        private void Add(SyntaxToken syntaxToken)
        {
            if (syntaxToken.Kind() == SyntaxKind.IdentifierToken)
            {
                var identifier = syntaxToken.ValueText;
                if (!_map.TryGetValue(identifier, out var list))
                {
                    list = [];
                    _map.Add(identifier, list);
                }
 
                list.Add(syntaxToken);
            }
        }
 
        public override void VisitVariableDeclarator(VariableDeclaratorSyntax node)
        {
            base.VisitVariableDeclarator(node);
            Add(node.Identifier);
        }
 
        public override void VisitCatchDeclaration(CatchDeclarationSyntax node)
        {
            base.VisitCatchDeclaration(node);
            Add(node.Identifier);
        }
 
        public override void VisitParameter(ParameterSyntax node)
        {
            base.VisitParameter(node);
            Add(node.Identifier);
        }
 
        public override void VisitFromClause(FromClauseSyntax node)
        {
            base.VisitFromClause(node);
            Add(node.Identifier);
        }
 
        public override void VisitLetClause(LetClauseSyntax node)
        {
            base.VisitLetClause(node);
            Add(node.Identifier);
        }
 
        public override void VisitJoinClause(JoinClauseSyntax node)
        {
            base.VisitJoinClause(node);
            Add(node.Identifier);
        }
 
        public override void VisitJoinIntoClause(JoinIntoClauseSyntax node)
        {
            base.VisitJoinIntoClause(node);
            Add(node.Identifier);
        }
 
        public override void VisitQueryContinuation(QueryContinuationSyntax node)
        {
            base.VisitQueryContinuation(node);
            Add(node.Identifier);
        }
    }
}