Compartilhar via


Trabalhar com semântica

As árvores de sintaxe representam a estrutura lexical e sintactica do código-fonte. Embora essas informações sejam suficientes para descrever todas as declarações e lógicas na origem, não são informações suficientes para identificar o que está sendo referenciado. Um nome pode representar:

  • um tipo
  • um campo
  • um método
  • uma variável local

Embora cada um deles seja exclusivamente diferente, determinar a qual um identificador realmente se refere geralmente requer uma compreensão profunda das regras de linguagem.

Há elementos de programa representados no código-fonte e os programas também podem se referir a bibliotecas compiladas anteriormente, empacotadas em arquivos de assembly. Embora nenhum código-fonte e, portanto, nenhum nó ou árvore de sintaxe, esteja disponível para assemblies, os programas ainda podem se referir a elementos contidos neles.

Para essas tarefas, você precisa do modelo semântico.

Além de um modelo sintactico do código-fonte, um modelo semântico encapsula as regras de linguagem, oferecendo uma maneira fácil de corresponder corretamente os identificadores com o elemento de programa correto que está sendo referenciado.

Compilação

Uma compilação é uma representação de tudo o que é necessário para compilar um programa C# ou Visual Basic, que inclui todas as referências de assembly, opções do compilador e arquivos de origem.

Como todas essas informações estão em um só lugar, os elementos contidos no código-fonte podem ser descritos com mais detalhes. A compilação representa cada tipo declarado, membro ou variável como um símbolo. A compilação contém uma variedade de métodos que ajudam a localizar e relacionar os símbolos que foram declarados no código-fonte ou importados como metadados de um assembly.

Semelhantes às árvores de sintaxe, as compilações são imutáveis. Depois de criar uma compilação, ela não pode ser alterada por você ou por qualquer outra pessoa com quem você possa compartilhá-la. No entanto, você pode criar uma nova compilação a partir de uma compilação existente, especificando uma alteração conforme você faz isso. Por exemplo, você pode criar uma compilação que seja a mesma em todos os sentidos que uma compilação existente, exceto que ela pode incluir um arquivo de origem adicional ou uma referência de assembly.

Símbolos

Um símbolo representa um elemento distinto declarado pelo código-fonte ou importado de um assembly como metadados. Cada namespace, tipo, método, propriedade, campo, evento, parâmetro ou variável local é representado por um símbolo.

Uma variedade de métodos e propriedades no Compilation tipo ajudam você a encontrar símbolos. Por exemplo, você pode encontrar um símbolo para um tipo declarado por seu nome de metadados comum. Você também pode acessar a tabela de símbolos inteira como uma árvore de símbolos com raiz pelo namespace global.

Os símbolos também contêm informações adicionais que o compilador determina da origem ou dos metadados, como outros símbolos referenciados. Cada tipo de símbolo é representado por uma interface separada derivada de ISymbol, cada uma com seus próprios métodos e propriedades detalhando as informações coletadas pelo compilador. Muitas dessas propriedades fazem referência direta a outros símbolos. Por exemplo, a propriedade IMethodSymbol.ReturnType indica o símbolo de tipo real que o método retorna.

Os símbolos apresentam uma representação comum de namespaces, tipos e membros, entre o código-fonte e metadados. Por exemplo, um método que foi declarado no código-fonte e um método que foi importado de metadados são representados por um IMethodSymbol com as mesmas propriedades.

Os símbolos são semelhantes no conceito ao sistema de tipos CLR, conforme representado pela System.Reflection API, mas são mais ricos, pois modelam mais do que apenas tipos. Namespaces, variáveis locais e rótulos são todos símbolos. Além disso, os símbolos são uma representação de conceitos de linguagem, não conceitos clr. Há muita sobreposição, mas há muitas distinções significativas também. Por exemplo, um método iterador em C# ou Visual Basic é um único símbolo. No entanto, quando o método iterador é convertido em metadados CLR, ele é um tipo e vários métodos.

Modelo semântico

Um modelo semântico representa todas as informações semânticas de um único arquivo de origem. Você pode usá-lo para descobrir o seguinte:

  • Os símbolos referenciados em uma posição específica na fonte.
  • O tipo resultante de qualquer expressão.
  • Todo o diagnóstico, que são erros e avisos.
  • Como as variáveis fluem dentro e fora de regiões de origem.
  • As respostas para perguntas mais especulativas.