Entender o modelo do SDK do .NET Compiler Platform

Os compiladores processam o código escrito seguindo regras estruturadas que geralmente diferem da forma como os humanos leem e entendem um código. Uma compreensão básica do modelo usado pelos compiladores é essencial para compreender as APIs usadas ao criar ferramentas baseadas no Roslyn.

Áreas funcionais do pipeline do compilador

O SDK do .NET Compiler Platform expõe a análise de código dos compiladores C# e Visual Basic para você como um consumidor, fornecendo uma camada de API que espelha um pipeline de compilador tradicional.

steps of the compiler pipeline processing source code to object code

Cada fase desse pipeline é um componente separado. Primeiro, a fase de análise cria tokens do texto de origem e o analisa na sintaxe que segue a gramática da linguagem. Depois, a fase de declaração analisa os metadados de origem e importados para formar símbolos nomeados. Em seguida, a fase de associação corresponde os identificadores no código aos símbolos. Por fim, a fase de emissão emite um assembly com todas as informações criadas pelo compilador.

compiler pipeline api provides access to each step that is part of the compiler pipeline

Correspondente a cada uma dessas fases, o SDK do .NET Compiler Platform expõe um modelo de objeto que permite o acesso às informações da fase. A fase de análise expõe uma árvore de sintaxe, a fase de declaração expõe uma tabela de símbolos hierárquica, a fase de associação expõe o resultado da análise semântica do compilador e a fase de emissão é uma API que gera códigos de bytes de IL.

the language services available from the compiler api at each step of the compiler pipeline

Cada compilador combina esses componentes como um único inteiro de ponta a ponta.

Essas APIs são as mesmas usadas pelo Visual Studio. Por exemplo, os recursos de formatação e estrutura de tópicos do código usam as árvores de sintaxe, o Pesquisador de Objetos e os recursos de navegação usam a tabela de símbolos, as refatorações e o recurso Ir para Definição usam o modelo semântico e o recurso Editar e Continuar usa todos eles, inclusive a API de Emissão.

Camadas de API

O SDK do compilador .NET consiste em várias camadas de APIs, ou seja: APIs de compilador, de diagnóstico, de script e de espaços de trabalho.

APIs do compilador

A camada do compilador contém os modelos de objeto que correspondem às informações expostas em cada fase do pipeline do compilador, tanto sintáticas quanto semânticas. A camada do compilador também contém um instantâneo imutável de uma única invocação de um compilador, incluindo referências de assembly, opções do compilador e arquivos de código-fonte. Há duas APIs distintas que representam a linguagem C# e a linguagem Visual Basic. Essas duas APIs são semelhantes na forma, mas adaptadas para alta fidelidade a cada linguagem individual. Essa camada não tem dependências em componentes do Visual Studio.

APIs de diagnóstico

Como parte da análise, o compilador pode produzir um conjunto de diagnósticos que abrangem tudo, desde sintaxe, semântica e erros de atribuição definida a vários diagnósticos de avisos e informativos. A camada de API do Compilador expõe o diagnóstico por meio de uma API extensível que permite que os analisadores definidos pelo usuário sejam conectados ao processo de compilação. Ela possibilita que o diagnóstico definido pelo usuário, como aqueles gerados por ferramentas como o StyleCop, seja produzido junto com o diagnóstico definido pelo compilador. Essa forma de produção de diagnóstico tem o benefício da integração natural a ferramentas como o MSBuild e o Visual Studio, que dependem do diagnóstico para experiências como interrupção de um build com base na política, exibição de textos sublinhados em tempo real no editor e sugestão de correções de código.

APIs de script

As APIs de hospedagem e de script foram criadas com base na camada do compilador. Você pode usar as APIs de script para executar snippets de código e acumular um contexto de execução de runtime. O REPL (Loop de Leitura-Avaliação-Impressão) interativo do C# usa essas APIs. O REPL permite que você use o C# como a linguagem de script, executando o código de maneira interativa enquanto o escreve.

APIs dos workspaces

A camada Workspaces contém a API de Workspace, que é o ponto de partida para fazer a análise de código e refatoração em soluções inteiras. Ela ajuda a organizar todas as informações sobre os projetos de uma solução em um único modelo de objeto, oferecendo acesso direto aos modelos de objeto da camada do compilador, sem a necessidade de analisar arquivos, configurar opções ou gerenciar dependências projeto a projeto.

Além disso, a camada Workspaces expõe um conjunto de APIs usado ao implementar ferramentas de análise de código e refatoração que funcionam em um ambiente de host como o IDE do Visual Studio. Exemplos incluem as APIs Localizar Todas as Referências, Formatação e Geração de Código.

Essa camada não tem dependências em componentes do Visual Studio.