SyntaxNode ReplaceNode не заменяет узел - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь полностью заменить оператор в коде чем-то другим.От:

var results = item.Axes.GetDescendants();

Кому (что-то вроде):

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 - узел для замены.Однако, когда я отлаживаю это, я получаю сообщение об ошибке:

Невозможно привести объект типа 'Microsoft.CodeAnalysis.CSharp.Syntax.IdentifierNameSyntax' к типу 'Microsoft.CodeAnalysis.CSharp.Syntax.VariableDeclarationSyntax'.

Несмотря на то, что declaration и node оба определены как SyntaxNode, его нет, потому что объявление - VariableDeclarationSyntax, а узел - IdentifierNameSyntax.

Если я назову ReplaceNode примерно так:

var newSyntax = syntaxRoot.ReplaceNode((SyntaxNode)declaration, (SyntaxNode)node);

ошибка исчезнет, ​​но на самом деле ничего не происходит, newSyntax точно так же, как и исходный syntaxRoot.

Как получить правильный CodeFix для старого оператора?

edit

Если я использую выражение item.Axes.GetDescendants(); вместо полного var results = item.Axes.GetDescendants(); в качестве declaration, оно начинает работать.Конечно, это не совсем то, что я хочу, потому что мне нужно также удалить часть объявления (var results =) ...

Я попытался вставить новый узел перед старым, вместо этого используя (await document.GetSyntaxRootAsync()).InsertNodesBefore(declaration, listOfOneNode), но это ошибки.

...