gpt4 book ai didi

c# - 如何从 SemanticModel 为新创建的类获取声明的符号?

转载 作者:太空狗 更新时间:2023-10-29 18:31:21 25 4
gpt4 key购买 nike

从我刚刚创建的 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/

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