我试图用完全不同的东西替换代码中的语句。从:
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;
即使declaration
和node
都被定义为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 =
,但错误消失了。