Как перехватить синтаксический узел для идентификатора в группе выражений LINQ ... в <identifier> - PullRequest
1 голос
/ 14 октября 2019

Я хочу обработать все идентификаторы в коде с помощью моего специального анализатора кода. Я перехватил все это, кроме идентификатора y в таком выражении:

var z = from x in new int[] { }
        group x by x into y
        select new { };

Пример минимального исходного кода анализатора:

[DiagnosticAnalyzer(LanguageNames.CSharp)]
public class IdentifierAnalyzer : DiagnosticAnalyzer
{
    private static readonly DiagnosticDescriptor Rule = new DiagnosticDescriptor("Id", "", "", "Naming", DiagnosticSeverity.Warning, true, null);
    public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);
    public override void Initialize(AnalysisContext context)
    {
        context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.Analyze | GeneratedCodeAnalysisFlags.ReportDiagnostics);
        context.EnableConcurrentExecution();
        context.RegisterSyntaxNodeAction(AnalyzeNode, SyntaxKinds);
    }

    private static readonly SyntaxKind[] SyntaxKinds = new[] {
                                                           SyntaxKind.JoinIntoClause,
                                                           //TODO: LINQ group...into <identifier>
                                                       };

    private static void AnalyzeNode(SyntaxNodeAnalysisContext context)
    {
        switch (context.Node)
        {
            case JoinIntoClauseSyntax joinIntoClause:
                if (IsNotValid(joinIntoClause.Identifier.Text))
                    context.ReportDiagnostic(Diagnostic.Create(Rule, joinIntoClause.Identifier.GetLocation(), joinIntoClause.Identifier.Text));
                break;
            //TODO: LINQ group...into <identifier>
        }
    }

    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    private static bool IsNotValid(string text)
    {            
        return true;
    }
}

1 Ответ

1 голос
/ 14 октября 2019
switch (context.Node)
        {
            case JoinIntoClauseSyntax joinIntoClause:
                if (IsNotValid(joinIntoClause.Identifier.Text))
                    context.ReportDiagnostic(Diagnostic.Create(Rule, joinIntoClause.Identifier.GetLocation(), joinIntoClause.Identifier.Text));
                break;
            case QueryContinuationSyntax continuationSyntax:
                if (IsNotValid(continuationSyntax.Identifier.Text))
                    context.ReportDiagnostic(Diagnostic.Create(Rule, continuationSyntax.Identifier.GetLocation(), continuationSyntax.Identifier.Text));
                break;
        }
...