Microsoft.CodeAnalysis:如何将节点替换为不同NameSyntax类型的节点?

Microsoft.CodeAnalysis: how do I ReplaceNodes into nodes of different NameSyntax type?

提问人:marcelloptr 提问时间:10/17/2023 更新时间:10/17/2023 访问量:24

问:

.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.SimpleNameSyntaxSyntax.SimpleNameSyntax

  • 使用字典的第二个元素,我们需要将类型的单词“LastBarIndexPainted”翻译成具有相同类型的单词“ChartBars.ToIndex”,因为有点这会导致崩溃Syntax.SimpleNameSyntaxSyntax.QualifiedNameSyntax


我应该怎么做?

C# 标记 Roslyn

评论


答: 暂无答案