进程遇到的符号,同时也可以访问Roslyn中的SemanticModel

本文关键字:访问 也可以 Roslyn 中的 SemanticModel 遇到 符号 进程 | 更新日期: 2023-09-27 17:54:20

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

现在,我认为我可以简单地使用RegisterSymbolActionAnalysisContext上注册符号动作,但问题是,虽然我有能力直接打破符号(不做任何语法操作),但我没有SemanticModel来解释我发现的符号,因为它不在SymbolAnalysisContext类型上。这意味着我甚至不能检查属性的类型是否正确,更不用说进行任何其他相关的比较操作了。

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

我并不是说这不是一个有效的解决方案,我只是在寻找一个潜在的替代方案,我不知道。我可能在考虑CompilationAnalysisContextCodeBlockAnalysisContext之类的东西,但到目前为止,我还没有运气。

进程遇到的符号,同时也可以访问Roslyn中的SemanticModel

如果我理解正确,你正试图从SymbolAnalysisContext访问SemanticModel ?

Compilation属性上,您可以使用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!
}
相关文章: