Поделиться через


Работа с семантикой

Деревья синтаксиса представляют лексическую и синтаксическую структуру исходного кода. Хотя эти сведения достаточно, чтобы описать все объявления и логику в источнике, недостаточно информации, чтобы определить, на что ссылается ссылка. Имя может представлять:

  • тип
  • поле;
  • метод
  • локальная переменная

Хотя каждое из них уникально различно, для определения того, на какой идентификатор на самом деле ссылаются, часто требуется глубокое понимание правил языка.

Существуют элементы программы, представленные в исходном коде, и программы также могут ссылаться на ранее скомпилированные библиотеки, упакованные в файлы сборок. Хотя для сборок недоступен исходный код, а значит, нет синтаксических узлов или деревьев, программы по-прежнему могут ссылаться на элементы внутри них.

Для этих задач требуется семантическая модель.

Помимо синтаксической модели исходного кода, семантическая модель инкапсулирует правила языка, что позволяет легко сопоставить идентификаторы с правильным элементом программы, на который ссылается.

Компиляция

Компиляция — это представление всех необходимых для компиляции программы C# или Visual Basic, которая включает все ссылки на сборки, параметры компилятора и исходные файлы.

Так как все эти сведения хранятся в одном месте, элементы, содержащиеся в исходном коде, можно более подробно описать. Компиляция представляет каждый объявленный тип, член или переменную в виде символа. Компиляция содержит различные методы, которые помогают найти и связать символы, объявленные в исходном коде или импортированные в виде метаданных из сборки.

Как и в деревьях синтаксиса, компиляции неизменяемы. После создания компиляции его нельзя изменить вами или кем-либо другим пользователем, с которым вы можете предоставить общий доступ. Однако можно создать новую компиляцию из существующей компиляции, указав изменение при этом. Например, можно создать компиляцию, которая одинакова во всех отношениях с существующей компиляцией, за исключением того, что она может содержать дополнительную исходную ссылку или ссылку на сборку.

Символы

Символ представляет отдельный элемент, объявленный исходным кодом или импортированный из сборки в виде метаданных. Каждое пространство имен, тип, метод, свойство, поле, событие, параметр или локальная переменная представлена символом.

Различные методы и свойства Compilation типа помогают находить символы. Например, можно найти символ объявленного типа по общему имени метаданных. Вы также можете получить доступ ко всей таблице символов в виде дерева символов, с корнем в глобальном пространстве имен.

Символы также содержат дополнительные сведения, которые компилятор определяет из источника или метаданных, например других ссылочных символов. Каждый тип символа представлен отдельным интерфейсом, производным от ISymbol, каждый из них имеет свои методы и свойства, подробно описывающие информацию, собранную компилятором. Многие из этих свойств напрямую ссылались на другие символы. Например, свойство IMethodSymbol.ReturnType сообщает вам фактический символ типа, который возвращает метод.

Символы представляют собой общее представление пространств имен, типов и элементов между исходным кодом и метаданными. Например, метод, объявленный в исходном коде, и метод, импортированный из метаданных, представлены одинаковыми IMethodSymbol свойствами.

Символы похожи на систему типов CLR, представленную System.Reflection API, но они более богаты в том, что они моделиируют больше, чем просто типы. Пространства имен, локальные переменные и метки — это все символы. Кроме того, символы являются представлением концепций языка, а не концепций CLR. В этом есть много пересечений, но также существуют значимые различия. Например, метод итератора в C# или Visual Basic является одним символом. Однако при переводе метода итератора в метаданные CLR он становится типом и включает несколько методов.

Семантическая модель

Семантическая модель представляет все семантические сведения для одного исходного файла. Его можно использовать для обнаружения следующих элементов:

  • Символы, на которые ссылается определенное расположение в источнике.
  • Результирующий тип любого выражения.
  • Все диагностические сведения, включающие ошибки и предупреждения.
  • Как переменные втекают и выходят из регионов источника.
  • Ответы на более спекулятивные вопросы.