【发布时间】:2018-03-03 19:01:01
【问题描述】:
我已经实现了一个自定义 CodeFixProvider,它向成员添加了一些 XML 文档。
例子:
public void MyMethod() { }
将转换为
/// <summary></summary>
public void MyMethod() { }
CodeFixProvider 是这样实现的:
public class MyCodeFixProvider : CodeFixProvider
{
...
public async override Task RegisterCodeFixesAsync(CodeFixContext context)
{
await Task.Run(() =>
{
Diagnostics diagnostics = context.Diagnostics.First();
CodeAction codeFix = CodeAction.Create("Title", c => CreateXmlDocs(...));
context.RegisterCodeFix(codeFix, diagnostics);
}
).ConfigureAwait(false);
}
...
}
一切都按预期进行。
现在我想添加一些额外的功能:应用代码修复后,插入符号应该移动到空摘要标记内。
我发现 Microsoft.CodeAnalysis.Features NuGet 包中包含 DocumentNavigationOperation 类。此类应该能够将插入符号移动到指定位置。但我找不到任何说明如何使用这个类。如果我从我的 CreateXmlDocs 方法中调用它,则会引发异常:
Navigation must be performed on the foreground thread.
代码:
private static async Task<Solution> CreateXmlDocs()
{
...
new DocumentNavigationOperation(newDocument.Id, 42)
.Apply(newDocument.Project.Solution.Workspace, cancellationToken);
...
}
我不确定在我的 CreateXmlDocs 方法中使用此类是否有意义,因为在调用 DocumentNavigationOperation 时 Visual Studio 尚未应用在此方法中创建的新解决方案。
有人知道在应用代码修复后移动插入符号的解决方案吗?
【问题讨论】:
-
Roslyn 旨在与 IDE 无关:它可以使用 Visual Studio,但也可以使用命令行。从这个意义上说,在您的代码修复中包含与 IDE 相关的功能就没那么有意义了,因为这是一个环境问题,您可能想要考虑进行扩展。自从我真正与 Roslyn 合作以来已经有一段时间了,但除非情况发生变化,否则这将是你的理由。
标签: c# roslyn codefixprovider