2017-04-17 50 views
0

我正在开发Visual Studio的代码修复程序。我有一个“分析器与代码修复”项目,我已经将自动生成的可移植项目转换为标准的C#库项目。Visual Studio - 订阅灯泡点击事件

在我的扩展中,代码修复会生成一个包含收集数据的文件,问题在于,只要我将鼠标悬停在灯泡修复建议中,即执行我注册的代码修复时,就会生成该文件。

// Register a code action that will invoke the fix. 
context.RegisterCodeFix(
    CodeAction.Create(
     title: Title, 
     createChangedDocument: c => MakeDataDrivenAsync(context.Document, methodDeclaration, c), 
     equivalenceKey: Title), 
     diagnostic); 

我希望它只在单击建议(接受它)时生成文件。

这可能吗? 我正在考虑订阅建议点击事件,但我不知道如何,我没有找到表明这是可能的信息。

回答

0

无论何时生成预览,Roslyn API都会执行代码修复。如果使用System.IO生成文件,那么Roslyn可以执行的操作很少,但是如果您使用Roslyn API创建新文档并将其添加,那么在IDE中执行代码修复之前,文件将不会持久保存到磁盘中而不是在预览中)。请参阅MoveTypeEditor需要在当前项目中创建新文档以将类型移入。

+0

只有当我生成的文档是代码时,对吗?我没有真正生成代码。 (但很高兴知道它,非常有用) –

+0

如果您的代码修复是在文件系统上创建roslyn一无所知的文件,那么您将需要编写和扩展,以创建与roslyn基础结构完全断开的灯泡会话。看看[this](https://github.com/Microsoft/VSSDK-Extensibility-Samples/tree/master/LightBulb)例子,了解如何做到这一点。 –

+2

或者你可以创建一个'AdditionalDocument'。 – SLaks

1

我跟着SLaks的建议。它工作正常。 用例:

SourceText st = SourceText.From(csv.GetStringDocument(), Encoding.UTF8); 
var additionalDoc = doc.Project.AddAdditionalDocument(filename, st, new List<string> { "_TestData" }); 
return additionalDoc.Project.Solution; 

source.roslyn.io

缺点(或没有)是该文件被添加到项目中(这是很好的在我的情况)。

+0

如果没有问题将文件添加到项目中,这是一个很好的解决方案,是的。否则,我有一个类似的问题,我想要一些代码只在未预览时执行,然后我想出了一个'CustomCodeAction',你可以在这里看到我的问题(https://stackoverflow.com/questions/44243781 /罗斯林码 - 动作 - 如何做 - 检查 - 如果 - 预览或实时的执行/)。也许这有助于未来的读者,你的解决方案是不够的。 – Wolfsblvt

+1

我也结束了这么做@Wolfsblvt。感谢您编写它。我最初没有写这个,因为它不是我最初的问题的直接答案。这绝对是解决问题的最佳方式。 –

+0

是的,我还没有找到任何好的信息,这就是为什么我发布我的解决方案会很酷,以便将来的人们可以找到它,并且可以得到帮助,而无需搜索稀少的来源数小时。 – Wolfsblvt