【发布时间】: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:我已经更新了问题。