2016-08-24 5 views
2

사용자가 마우스 오른쪽 단추를 클릭 한 클래스의 내용을 보는 Visual Studio 2015 확장을 작성하고 있습니다.Visual Studio 확장 ProjectItem에서 Roslyn SemanticModel 받기

나는 ProjectItem을 얻었지만, 어떻게 이것을 SemanticModel (및 SyntaxTree)으로 만들 수 있습니까?

파일에 선언 된 몇 가지 유형의 속성을 조회해야합니다. 컨텍스트에서 SemanticModel을 제공하는 코드 분석기를 작성했지만 여기서이 코드를 가져 오는 방법을 알 수는 없습니다. 검색이 유용하지 않습니다. 파일 내용을 읽음으로써 SyntaxTree을 파싱하는 방법을 찾았지만, SemanticModel을 사용하면 쉽지 않을 것입니다. 이론적으로는 VS가 이미 파일 용으로 빌드 한 모델에 연결해야합니다.

+0

그래, 어떤 방법이 있어야한다 VisualStudioWorkspace로 이동하십시오. 우리는 작업 공간에서 FileCodeModel로가는 쉬운 도우미가 있지만, 기이하게도 다른 방법이 있는지 모르겠습니다. 확인하기 만하면 원래 ProjectItem을 준 것은 무엇부터 시작 했습니까? –

+0

@JasonMalinowski SolutionExplorer의 컨텍스트 메뉴 항목에서 실행중인 명령이 있습니다. 호출 될 때 DTE2.ToolWindows.SolutionExplorer.SelectedItems를 사용하고 Object 속성을 ProjectItem으로 캐스팅합니다. – RandomEngy

답변

2

알아 냈어.

  1. 대상을 .NET Framework 4.6.2로 업그레이드하십시오.
  2. Microsoft.VisualStudio.LanguageServices NuGet package을 설치하십시오.
  3. 다운 그레이드 System.Collections.Imutable 1.2.0에서 1.1.37, 그렇지 않으면 나중에 코드에서 MissingMethodException이 발생합니다.
  4. 패키지 클래스의 Initialize 메서드에서 VisualStudioWorkspace를 가져옵니다. 나중에 잡기 위해 여기 정적 속성에 저장 :

    var componentModel = (IComponentModel)this.GetService(typeof(SComponentModel)); 
    VisualStudioWorkspace = componentModel.GetService<VisualStudioWorkspace>(); 
    

는 이제 파일 경로에서 SyntaxTree와 SemanticModel와 문서를 얻을 수 있습니다 :

Microsoft.CodeAnalysis.Solution solution = CreateUnitTestBoilerplateCommandPackage.VisualStudioWorkspace.CurrentSolution; 
DocumentId documentId = solution.GetDocumentIdsWithFilePath(inputFilePath).FirstOrDefault(); 
var document = solution.GetDocument(documentId); 

SyntaxNode root = await document.GetSyntaxRootAsync(); 
SemanticModel semanticModel = await document.GetSemanticModelAsync();