繁体   English   中英

有没有办法在Roslyn中可视化SemanticModel

[英]Is there a way to visualize the SemanticModel in Roslyn

在许多不同的情况下,我使用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)));

我不了解可视化工具,但是您可以执行以下操作:

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中显示它。

更新

写完这些之后,我在Roslyn中找到了一个示例代码,代码枚举了编译中的符号。

还要检查GetAllFieldAndMethodSymbolsInACompilationTraverseAllExpressionsInASyntaxTreeUsingAWalker 请记住,对于完整的解决方案,您还需要跟踪引用的程序集。

SemanticModel只是语法和符号之间的桥梁,它使您可以查询语法的某些部分以获取符号。 但是,这些符号都可以从Compilation 在这方面, Compilation.GetTypeByMetadataName是您的朋友。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM