Indexação do espaço de trabalho

Em uma solução, os sistemas de projeto são responsáveis por fornecer funcionalidade para compilação, depuração, pesquisa de símbolos GoTo e muito mais. Os sistemas de projeto podem fazer esse trabalho porque entendem a relação e as funcionalidades dos arquivos em um projeto. Um workspace Abrir Pasta também precisa do mesmo insight para fornecer recursos avançados do IDE. A coleção e o armazenamento persistente desses dados é um processo chamado indexação de workspace. Esses dados indexados podem ser consultados por meio de um conjunto de APIs assíncronas. Os extensores podem participar do processo de indexação fornecendo IFileScanners que sabem como lidar com determinados tipos de arquivos.

Tipos de dados indexados

Há três tipos de dados indexados. Observe que o tipo esperado dos verificadores de arquivos difere do tipo desserializado do índice.

Dados Tipo de verificador de arquivo Tipo de resultado da consulta de índice Tipos relacionados
Referências FileReferenceInfo FileReferenceResult FileReferenceInfoType
Símbolos SymbolDefinition SymbolDefinitionSearchResult ISymbolService deve ser usado em vez de IIndexWorkspaceService para consultas
Valores de dados FileDataValue FileDataResult<T>

Consultando dados indexados

Há dois tipos assíncronos disponíveis para acessar dados persistentes. O primeiro é por meio de IIndexWorkspaceData. Ele fornece acesso básico aos dados de FileReferenceResult e FileDataResult de um único arquivo e armazena em cache os resultados. A segunda é a IIndexWorkspaceService que não usa cache, mas permite mais recursos de consulta.

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();
}

Participando da indexação

A indexação do workspace segue aproximadamente a seguinte sequência:

  1. Descoberta e persistência de entidades do sistema de arquivos no workspace (somente na verificação de abertura inicial).
  2. Para cada arquivo, o provedor correspondente com a prioridade mais alta é solicitado a verificar FileReferenceInfos.
  3. Para cada arquivo, o provedor correspondente com a prioridade mais alta é solicitado a verificar SymbolDefinitions.
  4. Por arquivo, todos os provedores são solicitados por FileDataValues.

As extensões podem exportar um verificador implementando IWorkspaceProviderFactory<IFileScanner> e exportando o tipo com ExportFileScannerAttribute. O argumento de atributo SupportedTypes deve ser um ou mais valores de FileScannerTypeConstants. Para um verificador de exemplo, consulte o exemplo do VSSDK.

Aviso

Não exporte um verificador de arquivos que dê suporte ao tipo FileScannerTypeConstants.FileScannerContentType. Ele é usado apenas para fins internos da Microsoft.

Em situações avançadas, uma extensão pode dar suporte dinamicamente a um conjunto arbitrário de tipos de arquivo. Em vez do MEF exportar IWorkspaceProviderFactory<IFileScanner>, uma extensão pode fazer a exportação de IWorkspaceProviderFactory<IFileScannerProvider>. Quando a indexação começar, esse tipo de fábrica será importado, instanciado e terá seu método GetSymbolScannersAsync invocado. Instâncias de IFileScanner que aceitam qualquer valor de FileScannerTpeConstants serão consideradas, não apenas símbolos.