![](/img/trans.png)
[英]How to use Roslyn SemanticModel to get TypeInfo with ScriptCompilation
[英]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中找到了一个示例代码,该代码枚举了编译中的符号。
还要检查GetAllFieldAndMethodSymbolsInACompilation和TraverseAllExpressionsInASyntaxTreeUsingAWalker 。 请记住,对于完整的解决方案,您还需要跟踪引用的程序集。
SemanticModel
只是语法和符号之间的桥梁,它使您可以查询语法的某些部分以获取符号。 但是,这些符号都可以从Compilation
。 在这方面, Compilation.GetTypeByMetadataName
是您的朋友。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.