【发布时间】:2015-09-09 19:57:58
【问题描述】:
我正在使用 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”类型的异常,但未在用户代码中处理
附加信息:指定的项目不是列表的元素。
我必须使用生成器吗?我错过了什么?
谢谢
【问题讨论】: