2016-08-24 6 views
2

Я пишу расширение Visual Studio 2015, которое просматривает содержимое класса, на который пользователь щелкнул правой кнопкой мыши.Получение Roslyn SemanticModel из ProjectItem в расширении Visual Studio

У меня есть ProjectItem, но как вы получаете SemanticModelSyntaxTree)?

Мне нужно найти некоторые свойства, объявленные в файле. Я написал анализатор кода, который дает вам SemanticModel в контексте, но я не могу понять, как его получить здесь. Поиски не принесли ничего полезного. Я нашел, как разобрать SyntaxTree, прочитав содержимое файла, но с SemanticModel это будет не так просто. В идеале я бы подключился к модели VS, уже построенной для файла.

+0

Да, там должен быть какой-то способ для доступа к VisualStudioWorkspace. У нас есть простые помощники, чтобы перейти из рабочей области в FileCodeModel, но с любопытством я не знаю, есть ли у нас другой способ. Просто, чтобы проверить, что вы изначально начали с того, что дало вам ProjectItem? –

+0

@JasonMalinowski У меня есть команда, запущенная из пункта контекстного меню в SolutionExplorer. Когда он вызывается, я использую DTE2.ToolWindows.SolutionExplorer.SelectedItems, а затем перебрасывает свойство Object в ProjectItem. – RandomEngy

ответ

2

Выяснил это.

  1. Обновите свой проект до целевой платформы .NET 4.6.2.
  2. Установите Microsoft.VisualStudio.LanguageServices NuGet package.
  3. Downgrade System.Collections.Immutable от 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(); 

 Смежные вопросы

  • Нет связанных вопросов^_^