Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 进程在访问Roslyn中的语义模型时遇到符号_C#_Roslyn_Analyzer - Fatal编程技术网

C# 进程在访问Roslyn中的语义模型时遇到符号

C# 进程在访问Roslyn中的语义模型时遇到符号,c#,roslyn,analyzer,C#,Roslyn,Analyzer,在Roslyn Analyzer项目中,我想标记所有用特定属性标记的符号。例如,如果符号是一个方法,那么我希望在调用该方法的任何地方,甚至在没有任何直接调用的情况下(例如在方法组中),检查该方法(或者更确切地说,它的定义,尽管这种区别并不那么相关,因为它提供了我所需要的东西)的该属性。同样,我希望检查对某个(命名)类型的任何引用(变量声明、强制转换、类型参数、返回类型等),以查看该类型是否用相应的属性修饰 现在,我想我可以通过使用AnalysisContext注册一个符号操作,但问题是,虽然我有

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

现在,我想我可以通过使用
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
尤其是一个属性,这让我相信我们可以从中获得良好的性能。很好的一点,我没有注意到它是一个属性。我只是看了看源代码,它似乎没有那么糟糕。我仍然会把这个问题留待考虑,看看是否还有其他人有更多的想法,否则我很可能会按照你的建议去做。