我正在努力用Roslyn代码修复提供程序中的多个语句替换单个语句。当我调用root.ReplaceNode(assignmentStatement,newStatements)时,我总是得到System.InvalidOperationException'指定的项不是列表的元素。'我发现可能新的节点列表应该从旧节点开始,但我想用多个新语句替换整个当前语句。我怎么能做到这一点?
private async Task<Document> GenerateCodeFix(Document document, SyntaxToken culprit, CancellationToken cancellationToken)
{
var statement = FindAddigmentStatementToReplace(culprit.Parent);
if (statement == null)
{
return document;
}
var root = await document.GetSyntaxRootAsync(cancellationToken);
var newStatements = GenerateNewStatements()
var newRoot = root.ReplaceNode(assignmentStatement, newStatements)
return document.WithSyntaxRoot(newRoot);
}
答案 0 :(得分:0)
您可以使用ReplaceNode重载并将语句作为IEnumerable<SyntaxNode>
传递。例如:
var statement = ( StatementSyntax ) root.FindNode( diagnostic.Location.SourceSpan );
var statements = new SyntaxNode[]
{
SomeStatement() ,
SomeStatement()
};
return Task.FromResult( context.Document.WithSyntaxRoot( root.ReplaceNode( statement , statements ) ) );