有没有办法可视化Roslyn

时间:2016-11-26 16:40:38

标签: c# .net 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)));

2 个答案:

答案 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

我不知道它是否完美,但它会让你知道发生了什么。 在我的编译中,它看起来像这样:

Syntax nodes and their symbols

有了这个,您可以构建自己的可视化工具,也可以创建一个VISX以在Visual Studio中显示它。

<强>更新

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

同时选中GetAllFieldAndMethodSymbolsInACompilationTraverseAllExpressionsInASyntaxTreeUsingAWalker。 请记住,要获得完整的解决方案,您还需要跟踪引用的程序集。

答案 1 :(得分:2)

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