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.
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.
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.
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.