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

时间:2015-06-09 01:06:52

标签: c# roslyn analyzer

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

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

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

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

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您是否尝试从SemanticModel访问SymbolAnalysisContext

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!
}