gpt4 book ai didi

c# - 有没有办法在 Roslyn 中可视化 SemanticModel

转载 作者:行者123 更新时间:2023-11-30 20:18:33 24 4
gpt4 key购买 nike

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

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

Syntax nodes and their symbols

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

更新

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

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

关于c# - 有没有办法在 Roslyn 中可视化 SemanticModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40820584/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com