我正在使用Roslyn语法树来更新if / else语句。这是我的代码:

foreach (StatementSyntax statement in blockNode.Statements)
{
    if (statement.IsKind(SyntaxKind.IfStatement))
    {
        BlockSyntax ifBlock = statement.ChildNodes().OfType<BlockSyntax>().FirstOrDefault();
        if (ifBlock != null)
        {
            ReturnStatementSyntax newRSS = ifBlock.ChildNodes().OfType<ReturnStatementSyntax>().FirstOrDefault();
            blockNode = blockNode.InsertNodesBefore(newRSS, newExitCode);
        }
        ElseClauseSyntax elseBlock = statement.ChildNodes().OfType<ElseClauseSyntax>().FirstOrDefault();
        if (elseBlock != null)
        {
            BlockSyntax block = elseBlock.ChildNodes().OfType<BlockSyntax>().FirstOrDefault();
            if (block != null)
            {
                ReturnStatementSyntax newRSS = block.ChildNodes().OfType<ReturnStatementSyntax>().FirstOrDefault();
                blockNode = blockNode.InsertNodesBefore(newRSS, newExitCode);
            }
        }
        newBlock = newBlock.AddRange(blockNode.Statements);
    }
}


谁能解释为什么第一个blockNode插入节点起作用,而第二个不起作用?我看到了两次都想插入的代码,但是只有第一个更新了语法树。第二个什么也不做。

更新:我已经完成了JoshVarty建议的更改。我使用DocumentEditor来加载更改。我现在调用GetChangedDocument时遇到异常。这是我的代码:

DocumentEditor editor = DocumentEditor.CreateAsync(doc).Result;
editor.InsertBefore(blockNode, newEntryCode);
editor.InsertAfter(blockNode, newExitCode);
Document newDoc = editor.GetChangedDocument();


例外是:Microsoft.CodeAnalysis.CSharp.dll中发生了'System.InvalidOperationException'类型的例外,但未在用户代码中处理

附加信息:指定的项目不是列表的元素。

我必须使用发电机吗?我错过了什么?

谢谢

最佳答案

我相信这里的问题是,您从statement创建了新树,然后尝试使用该新树的某些部分随后与statement进行比较。

基本上,此行第二次不执行任何操作:

blockNode = blockNode.InsertNodesBefore(newRSS, newExitCode);


blockNode是您创建的全新树,不包含newRSS。因此它找不到newRss并插入您的newExitCode


newRss来自block
block来自elseBlock
elseBlock来自原始的statement


尝试一次将多个更改应用于语法树时,有三个选项:


使用DocumentEditor-请参阅:https://stackoverflow.com/a/30563669/300908
使用Annotations(第235和239行)
使用.TrackNodes()


我的理解是DocumentEditor是最简单的选项,它会自动为您跟踪/注释节点。

关于c# - Roslyn If陈述,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31012602/

10-11 02:05