IdentifierToken 未在 Roslyn 分析器中被击中

IdentifierToken not being hit in Roslyn Analyzer

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

代码形式看起来像

 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 标记设置断点。令牌的深度是否有限制?我应该如何找到这些电话?

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

这是语法可视化工具在我突出显示 WaitForExternalEvent<List<Application>> 时向我显示的内容。

因此,像这样设置操作:

context.RegisterSyntaxNodeAction(AnalyzeSyntaxNode, SyntaxKind.GenericName);

你的方法的开头应该这样做:

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

而且我确实设法让它到达了断点。