【问题标题】:Is there a way to visualize the SemanticModel in Roslyn有没有办法在 Roslyn 中可视化 SemanticModel
【发布时间】:2018-06-01 12:31:08
【问题描述】:

在许多不同的情况下,我使用 Roslyn 在 SemanticModel 中搜索一个符号,但找不到它。

var sm = compilation.GetSemanticModel(tree);
sm.GetSymbolInfo(node);
sm.GetDeclaredSymbol(node);

所以我想检查语义模型。

  • 是否可以获得在SemanticModel 中加载的类型的完整列表?
  • 是否可以查看SemanticModel 中可用的所有内容?无需搜索特定符号。
  • 是否有可视化工具用于可视化SemanticModel

这将有助于调试。

编辑

按照 Dudi Keleti 的方法,这个 sn-p 非常有效:

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)));

【问题讨论】:

  • 您是只对编译中声明的符号感兴趣,还是对刚刚引用的符号感兴趣?
  • 记住,SemanticModel 是每个 SyntaxTree,无法想象一种合理的方式来可视化整个编译(有多个 SyntaxTrees)
  • 您是如何搜索符号的?假设您正在分析的程序没有错误,Roslyn 应该总能找到您需要的符号。还要确保您使用的是 .GetDeclaredSymbol().GetSymbolInfo()(视情况而定)。
  • 大家好,感谢您的 cmets。 @svick:我有兴趣了解语法树中的哪些节点被 SemanticModel 覆盖,哪些没有。 @m0sa:是的,我知道,我更新的问题应该很明显。 @JoshVarty:我已经更新了问题。

标签: c# .net roslyn


【解决方案1】:

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

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&lt;SyntaxTree&gt;,而不是遍历它们中的每一个并执行 LINQ

我不知道它是否完美,但它可以让您了解正在发生的事情。 在我的编译中,它看起来像这样:

使用它,您可以构建自己的可视化工具,或者创建一个 VISX 以在 Visual Studio 中显示它。

更新

在我写完这个之后,我找到了一个sample code in Roslyn,它在编译中枚举了符号。

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

【讨论】:

  • 看起来很有用。虽然我不知道您在那里使用哪种可视化工具来查看树。在 VS 中调试时似乎可以使用...
  • 确实很好用,嘟嘟!我添加了另一个对我的问题更通用的 sn-p,它非常有用。
  • @Andry 谢谢。我很乐意提供帮助。我使用的工具叫做OzCode,这个特定的功能叫做LINQ debugging。实际上它是用于在 VS 中进行调试的。这是一个很棒的工具。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2019-05-03
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 2018-12-05
    • 2021-11-28
    • 2021-11-15
    相关资源
    最近更新 更多