Поделиться через


Индексирование рабочей области

В решении системы проектов отвечают за предоставление функциональных возможностей для создания, отладки, поиска символов GoTo и многое другое. Системы проектов могут выполнять эту работу, так как они понимают отношение и возможности файлов в проекте. Рабочая область Open Folder требует того же анализа, чтобы обеспечить богатые возможности интегрированной среды разработки. Коллекция и постоянное хранение этих данных — это процесс, называемый индексированием рабочей области. Эти индексированные данные можно запрашивать с помощью набора асинхронных API. Расширители могут участвовать в процессе индексирования, предоставляя IFileScanner, которые знают, как обрабатывать определенные типы файлов.

Типы индексированных данных

Существует три типа данных, индексированных. Обратите внимание, что тип, ожидаемый от сканеров файлов, отличается от типа, десериализованного из индекса.

Данные Тип средства проверки файлов Тип результата запроса индекса Связанные типы
Ссылки FileReferenceInfo FileReferenceResult FileReferenceInfoType
Символы SymbolDefinition SymbolDefinitionSearchResult ISymbolService следует использовать вместо IIndexWorkspaceService для запросов
Значения данных FileDataValue FileDataResult<T>

Запрос индексированных данных

Существует два асинхронных типа, доступных для доступа к сохраненным данным. Первое — через IIndexWorkspaceData. Он предоставляет базовый доступ к FileReferenceResult и FileDataResult данным одного файла, а также кэширует результаты. Второй — это IIndexWorkspaceService, которая не использует кэширование, но позволяет использовать дополнительные возможности запроса.

using Microsoft.VisualStudio.Workspace;
using Microsoft.VisualStudio.Workspace.Indexing;

private static IIndexWorkspaceData GetCachedIndexedData(IWorkspace workspace)
{
    // Gets access to indexed data wrapped in a cache.
    return workspace?.GetIndexWorkspaceDataService()?.CreateIndexWorkspaceData();
}

private static IIndexWorkspaceService GetDirectIndexedData(IWorkspace workspace)
{
    // Gets direct access to indexed data.
    // Can also be casted to IIndexWorkspaceService2.
    return workspace?.GetIndexWorkspaceService();
}

Участие в индексировании

Индексирование рабочей области примерно соответствует следующей последовательности:

  1. Обнаружение и сохранение сущностей файловой системы в рабочей области (только при первоначальном сканировании открытия).
  2. Для каждого файла поставщику сопоставления с наивысшим приоритетом предлагается проверить наличие FileReferenceInfos.
  3. Для каждого файла поставщику сопоставления с наивысшим приоритетом предлагается проверить наличие SymbolDefinitions.
  4. Для каждого файла все поставщики запрашиваются на предоставление FileDataValueединиц.

Расширения могут экспортировать сканер, осуществляя реализацию IWorkspaceProviderFactory<IFileScanner> и экспортируя тип с помощью ExportFileScannerAttribute. Аргумент атрибута SupportedTypes должен быть одним или несколькими значениями из FileScannerTypeConstants. В примере VSSDK см. пример сканера.

Предупреждение

Не экспортируйте сканер файлов, поддерживающий тип FileScannerTypeConstants.FileScannerContentType. Он используется только для внутренних целей Майкрософт.

В сложных ситуациях расширение может динамически поддерживать произвольный набор типов файлов. Вместо того чтобы MEF экспортировал IWorkspaceProviderFactory<IFileScanner>, расширение может экспортировать IWorkspaceProviderFactory<IFileScannerProvider>. При начале индексирования этот тип фабрики будет импортирован, создан экземпляр и вызван его GetSymbolScannersAsync методом. IFileScanner экземпляры, поддерживающие любое значение из FileScannerTpeConstants, будут учитываться, включая символы.