使用Roslyn

时间:2018-02-23 17:37:13

标签: c# roslyn roslyn-code-analysis

我正在努力用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);
}

1 个答案:

答案 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 ) ) );