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