Compartir a través de


Trabajar con semántica

Los árboles de sintaxis representan la estructura léxica y sintáctica del código fuente. Aunque esta información es suficiente para describir todas las declaraciones y la lógica del origen, no es suficiente información para identificar lo que se hace referencia. Un nombre puede representar:

  • un tipo
  • un campo
  • un método
  • una variable local

Aunque cada uno de ellos es de forma única diferente, determinar a qué identificador se refiere realmente a menudo requiere una comprensión profunda de las reglas de lenguaje.

Hay elementos de programa representados en el código fuente y los programas también pueden hacer referencia a bibliotecas compiladas previamente empaquetadas en archivos de ensamblado. Aunque no hay código fuente y, por tanto, no hay nodos o árboles de sintaxis disponibles para ensamblados, los programas pueden seguir haciendo referencia a elementos dentro de ellos.

Para esas tareas, necesita el modelo semántico.

Además de un modelo sintáctico del código fuente, un modelo semántico encapsula las reglas de lenguaje, lo que proporciona una manera sencilla de hacer coincidir correctamente los identificadores con el elemento de programa correcto al que se hace referencia.

Compilación

Una compilación es una representación de todo lo necesario para compilar un programa de C# o Visual Basic, que incluye todas las referencias de ensamblado, las opciones del compilador y los archivos de código fuente.

Dado que toda esta información está en un solo lugar, los elementos contenidos en el código fuente se pueden describir con más detalle. La compilación representa cada tipo declarado, miembro o variable como símbolo. La compilación contiene una variedad de métodos que le ayudan a encontrar y relacionar los símbolos que se han declarado en el código fuente o importados como metadatos de un ensamblado.

De forma similar a los árboles de sintaxis, las compilaciones son inmutables. Después de crear una compilación, usted o cualquier otra persona con la que pueda compartirla no puede cambiarla. Sin embargo, puede crear una nueva compilación a partir de una compilación existente, especificando un cambio tal como lo hace. Por ejemplo, puede crear una compilación que sea la misma de todas las formas que una compilación existente, excepto que puede incluir un archivo de origen o una referencia de ensamblado adicional.

Símbolos

Un símbolo representa un elemento distinto declarado por el código fuente o importado desde un ensamblado como metadatos. Cada espacio de nombres, tipo, método, propiedad, campo, evento, parámetro o variable local se representa mediante un símbolo.

Una variedad de métodos y propiedades en el Compilation tipo le ayudan a encontrar símbolos. Por ejemplo, puede encontrar un símbolo para un tipo declarado por su nombre de metadatos común. También puede acceder a toda la tabla de símbolos como un árbol de símbolos rooteado por el espacio de nombres global.

Los símbolos también contienen información adicional que el compilador determina a partir del origen o los metadatos, como otros símbolos a los que se hace referencia. Cada tipo de símbolo se representa mediante una interfaz independiente derivada de ISymbol, cada una con sus propios métodos y propiedades que detallan la información que el compilador ha recopilado. Muchas de estas propiedades hacen referencia directamente a otros símbolos. Por ejemplo, la IMethodSymbol.ReturnType propiedad indica el símbolo de tipo real que devuelve el método.

Los símbolos presentan una representación común de los espacios de nombres, los tipos y los miembros, entre el código fuente y los metadatos. Por ejemplo, un método que se declaró en el código fuente y un método que se importó a partir de metadatos se representan mediante un IMethodSymbol con las mismas propiedades.

Los símbolos son similares en concepto al sistema de tipos CLR como representado por la System.Reflection API, pero son más ricos en que modelan más que solo tipos. Los espacios de nombres, las variables locales y las etiquetas son símbolos. Además, los símbolos son una representación de los conceptos del lenguaje, no los conceptos clR. Hay una gran superposición, pero también hay muchas distinciones significativas. Por ejemplo, un método de iterador en C# o Visual Basic es un único símbolo. Sin embargo, cuando el método iterador se traduce a metadatos clR, es un tipo y varios métodos.

Modelo semántico

Un modelo semántico representa toda la información semántica de un único archivo de origen. Puede usarlo para detectar lo siguiente:

  • Símbolos a los que se hace referencia en una ubicación específica en el origen.
  • Tipo resultante de cualquier expresión.
  • Todos los diagnósticos, que son errores y advertencias.
  • Cómo fluyen las variables dentro y fuera de las regiones de origen.
  • Las respuestas a preguntas más especulativas.