处理遇到的符号,同时还可以访问 Roslyn 中的 SemanticModel

Process encountered symbols while also having access to a SemanticModel in Roslyn

在 Roslyn Analyzer 项目中,我想标记所有标有特定属性的符号。例如,如果符号是一个方法,那么我希望在它所在的任何地方检查这个方法(或者更确切地说,它的定义,虽然这个区别不是很相关,因为 GetAttributes 给了我我需要的东西)在没有任何直接调用的情况下被调用甚至简单地使用(例如在方法组中)。同样,我希望检查对特定(命名)类型的任何引用(变量声明、强制转换、类型参数、return 类型等),以查看该类型是否装饰有相应的属性。

现在,我认为我可以通过在 AnalysisContext 上使用 RegisterSymbolAction 简单地注册一个符号操作来逃脱,但问题是,虽然我有能力直接中断符号(没有做任何语法操作),我没有 SemanticModel 来解释我找到的符号,因为它不在 SymbolAnalysisContext 类型上。这意味着我什至无法检查属性是否属于正确的类型,更不用说进行任何其他相关的比较操作了。

现在,根据我从源代码中收集到的信息,当为特定符号调用提供给 RegisterSymbolAction 的处理程序方法时,语义模型不能保证有效(因为它甚至可能还没有完成构建)。话虽这么说,有没有办法同时实际提供一个符号(或至少是遇到的符号的集合)和相应的有效语义模型?如果可以的话,我试图避免的是被迫遍历整个语法树(很可能是从 SemanticModelAnalysisContext 获得的)并将每个节点解释为其潜在的等效符号。

我并不是说这不是一个有效的解决方案,我只是在寻找一个我不知道的潜在替代方案。我可能在考虑 CompilationAnalysisContextCodeBlockAnalysisContext 的思路,但到目前为止,我还没有成功。

如果我没理解错的话,您是想从 SymbolAnalysisContext 访问 SemanticModel

Compilation property you can use GetSemanticModel() 上并传入您正在查看的符号的语法树。

private static void AnalyzeSymbol(SymbolAnalysisContext context)
{
    var compilation = context.Compilation;
    var syntax = context.Symbol.DeclaringSyntaxReferences.First(); //Careful, partial methods might burn you
    var model = compilation.GetSemanticModel(syntax.SyntaxTree);
    //Use your model however you please!
}