- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
从我刚刚创建的 ClassDeclaration
中获取 ISymbol
的最简单方法是什么?
考虑以下代码:
AdhocWorkspace workspace = new AdhocWorkspace();
Project project = workspace.AddProject("Test", LanguageNames.CSharp);
ClassDeclarationSyntax classDeclaration = SyntaxFactory.ClassDeclaration("MyClass");
CompilationUnitSyntax compilationUnit = SyntaxFactory.CompilationUnit().AddMembers(classDeclaration);
Document document = project.AddDocument("Test.cs", compilationUnit);
SemanticModel semanticModel = await document.GetSemanticModelAsync();
ISymbol symbol = semanticModel.GetDeclaredSymbol(classDeclaration); // <-- Throws Exception
最后一行抛出异常“语法节点不在语法树中”。
我假设我需要从新的 SyntaxTree
中获取我刚刚创建的 ClassDeclarationSyntax
。但是,鉴于我只有旧的 ClassDeclarationSyntax
,在新的 SyntaxTree
中找到它的最简单方法是什么?
在上面的示例中,该类是 SyntaxTree
中唯一的类,并且是 CompilationUnit
的第一个子级,因此在这个简单的例子中很容易找到.但是想象一下这样一种情况,语法树包含很多可能嵌套的声明,而寻找的类声明嵌套得很深?有什么方法可以使用旧的 ClassDeclarationSyntax
找到新的吗? (或者我在这里做的事情都是错误的?)
最佳答案
您可以使用 SyntaxAnnotation
跟踪您的类节点:
AdhocWorkspace workspace = new AdhocWorkspace();
Project project = workspace.AddProject("Test", LanguageNames.CSharp);
//Attach a syntax annotation to the class declaration
var syntaxAnnotation = new SyntaxAnnotation("ClassTracker");
var classDeclaration = SyntaxFactory.ClassDeclaration("MyClass")
.WithAdditionalAnnotations(syntaxAnnotation);
var compilationUnit = SyntaxFactory.CompilationUnit().AddMembers(classDeclaration);
Document document = project.AddDocument("Test.cs", compilationUnit);
SemanticModel semanticModel = document.GetSemanticModelAsync().Result;
//Use the annotation on our original node to find the new class declaration
var changedClass = document.GetSyntaxRootAsync().Result.DescendantNodes().OfType<ClassDeclarationSyntax>()
.Where(n => n.HasAnnotation(syntaxAnnotation)).Single();
var symbol = semanticModel.GetDeclaredSymbol(changedClass);
无论您最终将类添加到哪种复杂文档,这都应该有效。
关于c# - 如何从 SemanticModel 为新创建的类获取声明的符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32636933/
在某些情况下,当我尝试获取语法节点的 ISymbol 时,使用 SemanticModel.GetSymbolInfo 会失败(获取 null),但使用 SemanticModel.GetDeclar
您好,我根据 java-web-plugin 3.5 的一些检查(依赖于 java-checks 3.5 的 pom)为 Sonar 5.1.2 编写了自己的插件,当我尝试对项目运行分析时出现错误:
我正在研究 Roslyn extension警告未 protected .Value访问 Nullable值(value)观。 这提供了以下行为: 这个扩展已经可以工作了,但是测试访问是否“安全”的代
从我刚刚创建的 ClassDeclaration 中获取 ISymbol 的最简单方法是什么? 考虑以下代码: AdhocWorkspace workspace = new AdhocWorkspac
在许多不同的情况下,我使用 Roslyn 在 SemanticModel 中搜索一个符号,但找不到它。 var sm = compilation.GetSemanticModel(tree); sm.
为了找到 ExpressionSyntax 实例的目标,我调用了 mySemanticModel.GetSymbolInfo(myExpressionSyntax)。 我有几个 SemanticMod
我在解决 Roslyn 中的某些类型时遇到问题。 大多数时候它按预期工作 但是在某些情况下,在某些文件中,某些类型无法解析。 这是我用来处理类型的代码: private string GetTypeN
我试图从 ObjectCreationExpressionSyntax 对象获取类型信息但失败了。 这是重现问题的示例(请参阅代码中的“ti.Type is null”): using Microso
我正在编写一个 Visual Studio 2015 扩展,它查看用户右键单击的类的内容。 我有 ProjectItem,但是如何从中获取 SemanticModel(和 SyntaxTree)? 我
我是一名优秀的程序员,十分优秀!