gpt4 book ai didi

c# - 从新节点获取符号信息

转载 作者:行者123 更新时间:2023-12-04 08:11:31 25 4
gpt4 key购买 nike

我有一个 CSharpSyntaxRewriter覆盖 VisitMemberAccessExpression ,在那个方法里面,我调用MemberAccessExpressionSyntax.WithName() ,但它返回的节点有不同的 SyntaxTree与原始节点相比,这是一个问题,因为这意味着调用 SemanticModel.GetSymbolInfo(node) 时会引发错误.
有没有办法改变NameMemberAccessExpressionSyntax但仍有 SyntaxTreeSemanticModel.GetSymbolInfo(node) 一起使用?
我的代码是:

public sealed override SyntaxNode VisitNode(SyntaxNode node)
{
var nodeSyntax = (MemberAccessExpressionSyntax) node;
if (nodeSyntax.Name.ToString() == OldModifier && !HasSymbol(nodeSyntax, out _))
{
if (ModifierType == ModifierType.Damage)
nodeSyntax = nodeSyntax.WithName(IdentifierName($"GetDamage({NewModifier})"));
else
nodeSyntax = nodeSyntax.WithName(IdentifierName($"GetCritChance({NewModifier})"));

nodeSyntax = nodeSyntax.WithLeadingTrivia(node.GetLeadingTrivia()).WithTrailingTrivia(node.GetTrailingTrivia());
}

return nodeSyntax;
}
( VisitNodeVisitMemberAccessExpression 调用)
以下是显示 SyntaxTree 差异的图像:
原文: original node
调用 WithName后: modified node

最佳答案

有几种方法可以处理这样的事情:
改变您的访问方式
在对 VisitMemberAccessExpression 进行任何更改之前,您可以重组代码以调用 VisitNode 吗?例如,您可以从:

var memberAccess = memberAccess.With...();
memberAccess = VisitNode(memberAccess);
return memberAccess;
var memberAccess = VisitNode(memberAccess);
memberAccess = memberAccess.With...();
return memberAccess;
那么这可能意味着您在完成重写之前正在访问原始节点。请注意,如果您正在执行递归操作,这仍然很棘手。
使用替换节点
有一个 helper method您可以使用而不是重写器。这将调用您传递的函数在每一步进行重写,但是该函数同时被传递给原始树中的原始节点和子节点被重写后的节点;您可以使用原始问题来询问绑定(bind)问题(因为它来自原始树)并使用已重写的问题以进行递归重写。
把你的问题分成两个步骤
进行两次遍历:首先获取所有需要更新的地方的列表,将这些 SyntaxNode 添加到 HashSet 或类似的地方,然后在要更新这些地方的地方进行第二次重写。

关于c# - 从新节点获取符号信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65929197/

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