提问人:marcelloptr 提问时间:10/17/2023 更新时间:10/17/2023 访问量:24
Microsoft.CodeAnalysis:如何将节点替换为不同NameSyntax类型的节点?
Microsoft.CodeAnalysis: how do I ReplaceNodes into nodes of different NameSyntax type?
问:
.NET Framework 4.6.1(我不应该更改版本).NET Framework 4.6.1 (and I should not change version)
我正在修复一个代码,该代码将一种语言从一个版本翻译成较新的版本。
为此,一个名为“LastBarIndexPainted”的属性将(我无法更改)转换为“ChartBars.ToIndex”,这会导致转换器中出现异常并显示错误消息:
无法将类型为“Microsoft.CodeAnalysis.CSharp.Syntax.QualifiedNameSyntax”的对象强制转换为类型“Microsoft.CodeAnalysis.CSharp.Syntax.SimpleNameSyntax”
因为单词“LastBarIndexPainted”和“ChartBars.ToIndex”在语法上是不同的,并且函数 CodeAnalysis.ReplaceNodes() 只接受将节点替换为其他相同类型的节点
。
更具体地说,让我们有一个替换字典:
private Dictionary<string, string> _renamedProperties = new Dictionary<string, string>
{
{ "CalculateOnBarClose", "Calculate" },
{ "LastBarIndexPainted", "ChartBars.ToIndex" },
};
它由转换函数使用,其代码为:
private SyntaxNode ReplacePropertyNames(SyntaxNode node, Dictionary<string, string> propertyNameLookup)
{
IEnumerable<NameSyntax> propertyIdentifiers = node
.DescendantNodes()
.OfType<NameSyntax>()
.Where(n => propertyNameLookup.ContainsKey(n.ToString()));
var replacements = new Dictionary<SyntaxNode, SyntaxNode>();
SyntaxNode newIdentifierName2 = null;
foreach (NameSyntax identifierName in propertyIdentifiers)
{
string newName = propertyNameLookup[identifierName.ToString()];
SyntaxNode newIdentifierName = SyntaxFactory.ParseName(newName).WithTriviaFrom(identifierName);
replacements.Add(identifierName, newIdentifierName); newIdentifierName2 = newIdentifierName;
}
return node.ReplaceNodes(replacements.Keys, (n, _) => replacements[n]); # <== EXCEPTION IS THROWN HERE
}
再
使用字典的第一个元素,我们需要将类型的单词“CalculateOnBarClose”翻译成具有相同类型的单词“Calculate”,这样我们就不会崩溃。
Syntax.SimpleNameSyntax
Syntax.SimpleNameSyntax
使用字典的第二个元素,我们需要将类型的单词“LastBarIndexPainted”翻译成具有相同类型的单词“ChartBars.ToIndex”,因为有点,这会导致崩溃。
Syntax.SimpleNameSyntax
Syntax.QualifiedNameSyntax
我应该怎么做?
答: 暂无答案
评论