在许多不同的情况下,我使用Roslyn在SemanticModel
中搜索符号但找不到它。
var sm = compilation.GetSemanticModel(tree);
sm.GetSymbolInfo(node);
sm.GetDeclaredSymbol(node);
所以我想检查一下语义模型。
SemanticModel
?SemanticModel
中提供的所有内容?无需搜索特定符号。SemanticModel
?这在调试时会有所帮助。
遵循Dudi Keleti的方法,这个片段非常有效:
return tree.GetRoot().DescendantNodesAndSelf()
.Where(node => node as ClassDeclarationSyntax != null || node as InterfaceDeclarationSyntax != null)
.Select(node => new KeyValuePair<SyntaxNode, ISymbol>(node, model.GetSymbolInfo(node).Symbol ?? model.GetDeclaredSymbol(node)));
答案 0 :(得分:4)
我不了解可视化工具,但您可以这样做:
static IEnumerable<ISymbol> GetTeeSymbols(SyntaxTree tree, SemanticModel model)
{
return tree.GetRoot().
DescendantNodesAndSelf().
Select(node => model.GetSymbolInfo(node).Symbol ?? model.GetDeclaredSymbol(node)).Where(info => info != null);
}
你可以在树上以扩展方法的形式进行,并在语义模型上发送语义模型或扩展,然后发送IEnumerable<SyntaxTree>
而不是遍历它们并执行LINQ
我不知道它是否完美,但它会让你知道发生了什么。 在我的编译中,它看起来像这样:
有了这个,您可以构建自己的可视化工具,也可以创建一个VISX以在Visual Studio中显示它。
<强>更新强>
在我写完之后,我找到了一个sample code in Roslyn,它在编译中枚举了符号。
同时选中GetAllFieldAndMethodSymbolsInACompilation和TraverseAllExpressionsInASyntaxTreeUsingAWalker。 请记住,要获得完整的解决方案,您还需要跟踪引用的程序集。
答案 1 :(得分:2)
SemanticModel
仅仅是语法和符号之间的桥梁,它允许您查询符号的部分语法。但是,这些符号都可以从Compilation
获得。在这方面Compilation.GetTypeByMetadataName
是你的朋友。