Roslyn Analyzer中未击中IdentifierToken

时间:2019-02-02 16:37:55

标签: c# roslyn roslyn-code-analysis

我正在尝试编写一个Roslyn分析器,该分析器需要拦截对函数调用WaitForExternalEvent的调用,并对该函数的参数执行一些逻辑。我有一棵看起来像

的语法树

Syntax tree

在代码的形式,它看起来像

 public static class HireEmployee
    {
        [FunctionName("HireEmployee")]
        public static async Task<Application> RunOrchestrator(
            [OrchestrationTrigger] DurableOrchestrationContext context,
            ILogger log)
        {
            var applications = context.GetInput<List<Application>>();
            var approvals = await context.WaitForExternalEvent<List<Application>>("ApplicationsFiltered");
            log.LogInformation($"Approval received. {approvals.Count} applicants approved");
            return approvals.OrderByDescending(x => x.Score).First();
        }
...

当我注册动作此我这样做等

context.RegisterSyntaxNodeAction(AnalyzeSyntax, SyntaxKind.IdentifierName);

在我的AnalyzeSyntax方法内的断点确实为IdentifierName令牌命中了断点,但从未为WaitForExternalEvent令牌命中断点。是有一些限制的令牌有多深,可以吗?我应该如何去寻找有关这些电话?

1 个答案:

答案 0 :(得分:1)

在我看来,您需要使用SyntaxKind.GenericName而不是SyntaxKind.IdentifierName注册操作。然后,在您的AnalyzeSyntax方法中,您想将context.Node转换为GenericName类型。

这是当我突出显示WaitForExternalEvent<List<Application>>时,语法可视化器向我显示的内容。

enter image description here

因此,请设置以下操作:

context.RegisterSyntaxNodeAction(AnalyzeSyntaxNode, SyntaxKind.GenericName);

方法的开始应该这样做:

private void AnalyzeSyntaxNode(SyntaxNodeAnalysisContext context)
{
    var syntax = context.Node as GenericNameSyntax;
}

我确实设法使其达到了断点。 enter image description here