2017-04-17 9 views
0

Visual Studio 용 코드 픽스를 개발 중입니다. 나는 NA가있는 "Analyzer with Code fix"프로젝트를 가지고 있으며, 자동으로 생성 된 포터블 프로젝트를 표준 C# 라이브러리 프로젝트로 변형 시켰습니다.Visual Studio - Lightbulb 클릭 이벤트 구독

내 수정 코드는 데이터가 수집 된 파일을 생성합니다. 즉, 등록 된 코드 수정 프로그램이 실행될 때 전구 수정 제안을 가리키 자마자 파일이 생성된다는 것이 문제입니다.

// 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 apis를 사용하여 새 문서를 만들고 추가하면 코드 수정이 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/roslyn-code-action-how-to-check-if-preview-or-real-execution /). 어쩌면 이것이 당신의 솔루션이 충분하지 않은 미래의 독자들에게 도움이 될 것입니다. – Wolfsblvt

+1

나는 @Wolfsblvt도 그렇게했다. 쓰는 주셔서 감사합니다. 나는 초기 질문에 대한 직접적인 대답이 아니기 때문에 처음에는 그것을 쓰지 않았다. 그것은 그것을 해결할 최선의 방법입니다. –

+0

그래, 나도 좋은 정보를 찾지 못했다. 그래서 내 솔루션을 게시하면 멋지다고 생각했다. 그래서 미래의 사람들은 그것을 발견하고 스파 스 소스를 몇 시간 동안 검색하지 않아도 도움을 얻을 수있다. – Wolfsblvt