Compreender o modelo do SDK da plataforma de compilador .NET
Os compiladores processam o código que você escreve seguindo regras estruturadas que muitas vezes diferem da maneira como os humanos leem e entendem o código. Uma compreensão básica do modelo usado pelos compiladores é essencial para entender as APIs que você usa ao criar ferramentas baseadas em Roslyn.
Áreas funcionais do pipeline do compilador
O SDK da plataforma de compilador .NET expõe a análise de código dos compiladores C# e Visual Basic para você como consumidor, fornecendo uma camada de API que espelha um pipeline de compilador tradicional.
Cada fase deste pipeline é um componente separado. Primeiro, a fase de análise tokeniza e analisa o texto de origem em sintaxe que segue a gramática da linguagem. Em segundo lugar, a fase de declaração analisa a origem e os metadados importados para formar símbolos nomeados. Em seguida, a fase de ligação faz a correspondência entre identificadores no código e símbolos. Finalmente, a fase de emissão emite um assembly com todas as informações construídas pelo compilador.
Correspondendo a cada uma dessas fases, o .NET Compiler Platform SDK expõe um modelo de objeto que permite o acesso às informações nessa 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árquicos, a fase de vinculação expõe o resultado da análise semântica do compilador e a fase de emissão é uma API que produz códigos de bytes IL.
Cada compilador combina esses componentes como um único todo de ponta a ponta.
Essas APIs são as mesmas usadas pelo Visual Studio. Por exemplo, os recursos de estrutura de tópicos e formatação de código usam as árvores de sintaxe, o Pesquisador de Objetos e os recursos de navegação usam a tabela de símbolos, refatorações e Ir para Definição usam o modelo semântico e Editar e Continuar usam todos eles, incluindo a API Emit.
Camadas da API
O SDK do compilador .NET consiste em várias camadas de APIs: APIs de compilador, APIs de diagnóstico, APIs de script e APIs 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. As duas APIs são semelhantes em forma, mas adaptadas para alta fidelidade a cada idioma individual. Essa camada não tem dependências em componentes do Visual Studio.
APIs de diagnóstico
Como parte de sua análise, o compilador pode produzir um conjunto de diagnósticos que abrangem tudo, desde sintaxe, semântica e erros de atribuição definidos até vários avisos e diagnósticos informativos. A camada da API do compilador expõe diagnósticos por meio de uma API extensível que permite que analisadores definidos pelo usuário sejam conectados ao processo de compilação. Ele permite que diagnósticos definidos pelo usuário, como aqueles produzidos por ferramentas como o StyleCop, sejam produzidos juntamente com diagnósticos definidos pelo compilador. Produzir diagnósticos dessa maneira tem o benefício de se integrar naturalmente com ferramentas como MSBuild e Visual Studio, que dependem de diagnósticos para experiências como interromper uma compilação com base em políticas e mostrar squiggles ao vivo no editor e sugerir correções de código.
APIs de script
As APIs de hospedagem e script são construídas sobre a camada do compilador. Você pode usar as APIs de script para executar trechos de código e acumular um contexto de execução em tempo de execução. O REPL interativo em C# (Read-Evaluate-Print Loop) usa essas APIs. O REPL permite que você use C# como uma linguagem de script, executando o código interativamente enquanto o escreve.
APIs de espaços de trabalho
A camada Workspaces contém a API Workspace, que é o ponto de partida para fazer análise de código e refatoração em soluções inteiras. Ele ajuda você a organizar todas as informações sobre os projetos em 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 de projeto para projeto.
Além disso, a camada Workspaces apresenta um conjunto de APIs usadas ao implementar ferramentas de análise e refatoração de código que funcionam em um ambiente de host como o IDE do Visual Studio. Os 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.