C# 进程在访问Roslyn中的语义模型时遇到符号
在Roslyn Analyzer项目中,我想标记所有用特定属性标记的符号。例如,如果符号是一个方法,那么我希望在调用该方法的任何地方,甚至在没有任何直接调用的情况下(例如在方法组中),检查该方法(或者更确切地说,它的定义,尽管这种区别并不那么相关,因为它提供了我所需要的东西)的该属性。同样,我希望检查对某个(命名)类型的任何引用(变量声明、强制转换、类型参数、返回类型等),以查看该类型是否用相应的属性修饰 现在,我想我可以通过使用C# 进程在访问Roslyn中的语义模型时遇到符号,c#,roslyn,analyzer,C#,Roslyn,Analyzer,在Roslyn Analyzer项目中,我想标记所有用特定属性标记的符号。例如,如果符号是一个方法,那么我希望在调用该方法的任何地方,甚至在没有任何直接调用的情况下(例如在方法组中),检查该方法(或者更确切地说,它的定义,尽管这种区别并不那么相关,因为它提供了我所需要的东西)的该属性。同样,我希望检查对某个(命名)类型的任何引用(变量声明、强制转换、类型参数、返回类型等),以查看该类型是否用相应的属性修饰 现在,我想我可以通过使用AnalysisContext注册一个符号操作,但问题是,虽然我有
AnalysisContext
注册一个符号操作,但问题是,虽然我有能力直接打断符号(不做任何语法操作),但我没有SemanticModel
来解释我找到的符号,因为它不在SymbolAnalysisContext
类型上。这意味着我甚至无法检查属性的类型是否正确,更不用说执行任何其他相关的比较操作了
现在,根据我从源代码收集的信息,当为特定符号调用提供给RegisterSymbolAction
的处理程序方法时(因为它可能还没有完成构建),语义模型不能保证有效。也就是说,有没有一种方法可以同时提供一个符号(或者至少是一组遇到的符号)和相应的有效语义模型?如果可以的话,我试图避免的是被迫遍历整个语法树(最有可能从语义模型分析上下文
中获得),并将每个节点解释为其潜在的等效符号
我并不是说这不是一个有效的解决方案,我只是在寻找一个我不知道的潜在替代方案。我可能想到了类似于
compileationanalysiscontext
或CodeBlockAnalysisContext
的东西,但到目前为止,我运气不好。如果我理解正确,您是在试图从SymbolAnalysisContext
访问语义模型
在属性上,您可以使用并传入正在查看的符号的语法树
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!
}
我想我可以采用DeclaringSyntaxReferences
的方法,但是,正如你所提到的,局部方法可能会给我带来一些麻烦。另外,我觉得去极化syntaxreferences
可能不是最轻的操作性能(我可能在这方面错了),我会为分析器遇到的每个符号调用它。不过这是个不错的选择。我很想知道这是否比通过语法树获取符号更值得。经验法则似乎是,如果它没有标记为async
,那么对于一个分析器来说应该不会太贵DeclaringSyntaxReferences
尤其是一个属性,这让我相信我们可以从中获得良好的性能。很好的一点,我没有注意到它是一个属性。我只是看了看源代码,它似乎没有那么糟糕。我仍然会把这个问题留待考虑,看看是否还有其他人有更多的想法,否则我很可能会按照你的建议去做。