SyntaxNode ReplaceNode不替换节点

时间:2018-06-07 15:14:04

标签: c# roslyn-code-analysis codefixprovider

我试图用完全不同的东西替换代码中的语句。从:

var results = item.Axes.GetDescendants();

To(类似):

using (var context = ContentSearchManager.GetIndex("someindex").CreateSearchContext())
{
    IQueryable<SearchResultItem> searchQuery = Context.GetQueryable<SearchResultItem>().Where(item => item.Paths.Path.Contains("some arbitrary path"));
}
var results = searchQuery.GetResults();

为此,我有这个任务:

context.RegisterCodeFix(
                CodeAction.Create(
                    title: title,
                    equivalenceKey: title,
                    createChangedDocument: c => RemoveDeclarationAsync(context.Document, nodeToRemove, c)
                    ),
                diagnostic);

RemoveDeclarationAsync看起来像这样:

private async Task<Document> RemoveDeclarationAsync(Document document, SyntaxNode declaration, CancellationToken cancellationToken)
{
    SyntaxNode node = SyntaxFactory.ParseExpression(snippet);

    var syntaxRoot = (await document.GetSyntaxRootAsync());
    var newSyntax = syntaxRoot.ReplaceNode(declaration, node);
    return document.WithSyntaxRoot(newSyntax);
}

snippet实际上是using语句作为字符串。 declaration是要替换的节点。但是,当我调试这个时,我收到一条错误消息:

  

无法投射类型的对象   &#39; Microsoft.CodeAnalysis.CSharp.Syntax.IdentifierNameSyntax&#39;输入   &#39; Microsoft.CodeAnalysis.CSharp.Syntax.VariableDeclarationSyntax&#39;

即使declarationnode都被定义为SyntaxNode,它也没有它,因为声明是VariableDeclarationSyntax而节点是{{1} }}

如果我这样打电话给IdentifierNameSyntax

ReplaceNode

错误消失,但实际上没有发生任何事情,var newSyntax = syntaxRoot.ReplaceNode((SyntaxNode)declaration, (SyntaxNode)node); 与原始newSyntax完全相同。

如何为旧语句获取正确的CodeFix?

修改

如果我使用语句syntaxRoot而不是完整的item.Axes.GetDescendants();作为var results = item.Axes.GetDescendants();,它就会开始工作。当然,这并不完全是我想要的,因为我还需要删除声明部分(declaration)......

我已尝试在旧节点之前插入新节点,而不是使用var results =,但错误消失了。

0 个答案:

没有答案