2017-04-17 94 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