gpt4 book ai didi

c# - 修改语法树,然后得到更新的语义模型

转载 作者:太空狗 更新时间:2023-10-29 17:40:31 26 4
gpt4 key购买 nike

我正在尝试修改语法树,然后更新语义模型。这是我目前所拥有的:

var tree = Roslyn.Compilers.CSharp.SyntaxTree.ParseCompilationUnit(code);
var compilation = Roslyn.Compilers.CSharp.Compilation.Create(
"MyCompilation",
syntaxTrees: new[] { tree },
references: new[] { mscorlib });
var semanticModel = compilation.GetSemanticModel(tree);
...
var oldStatementNode = (parent as ExpressionStatementSyntax); //some SyntaxNode in the tree
var oldExpressionNode = oldStatementNode.Expression;
var newExpressionNode = Syntax.ParenthesizedExpression(oldExpressionNode);
var newRootNode = tree.GetRoot().ReplaceNode(oldExpressionNode, newExpressionNode);

var semanticInfo = semanticModel.GetTypeInfo(newExpressionNode); //throws exception "Syntax node is not within syntax tree"

如果我尝试调用 semanticModel = compilation.GetSemanticModel(tree); 或者甚至在调用 GetTypeInfo() 之前使用 tree 进行新的编译- 同样的异常(exception)。

那么如何更新 SemanticModel?(当然我可以获得修改后的源代码并从头开始做所有事情,但我想还有更有效的方法)。

我确定我在这里遗漏了一些明显的东西,也许在某处创建了一个新的语法树?

最佳答案

Roslyn 类型是不可变的,因此您需要为您的newRootNode 构造一个新的SyntaxTree,然后调用compilation.UpdateSyntaxTree 来获得一个new Compilation,然后可以调用newCompilation.GetSemanticModel(newTree)得到一个新的SemanticModel

考虑升级到服务级别并改用 ISolution。像这样的东西:

var doc = Solution.Create(SolutionId.CreateNewId()).AddCSharpProject("MyCompilation", "MyCompilation").AddMetadataReference(mscorlib).AddDocument("MyFile", code);

var semanticModel = (SemanticModel)doc.GetSemanticModel();
var root = (CompilationUnitSyntax)doc.GetSyntaxRoot();

SyntaxNode parent = null;
var oldStatementNode = (parent as ExpressionStatementSyntax); //some SyntaxNode in the tree
var oldExpressionNode = oldStatementNode.Expression;
var newExpressionNode = Syntax.ParenthesizedExpression(oldExpressionNode);
var newRootNode = root.ReplaceNode(oldExpressionNode, newExpressionNode);

doc = doc.UpdateSyntaxRoot(newRootNode);
semanticModel = (SemanticModel)doc.GetSemanticModel();

关于c# - 修改语法树,然后得到更新的语义模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12164769/

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