Общие сведения о модели пакета SDK для .NET Compiler Platform
Компиляторы обрабатывают код, который вы пишете, следуя структурированным правилам, которые часто отличаются от того, как читают и воспринимают код люди. Понимание принципов работы модели, используемой компиляторами, важно для изучения API, используемых при создании средств на основе Roslyn.
Функциональные области конвейера компилятора
Пакет SDK для .NET Compiler Platform реализует функции анализа кода в компиляторах C# и Visual Basic, предоставляя слой API, отражающий традиционный конвейер компилятора.
Каждый этап конвейера — это отдельный компонент. Сначала на этапе синтаксического анализа выполняется расстановка токенов и анализ текста исходного кода с учетом синтаксиса, а затем и грамматики языка. Потом на этапе объявления анализируется источник и импортированные метаданные для формирования именованных символов. Далее на этапе привязки идентификаторы в коде сопоставляются с символами. Наконец, на этапе порождения создается сборка со всеми сведениями, сформированными компилятором.
В соответствии с каждым из этих этапов пакет SDK для .NET Compiler Platform предоставляет объектную модель, обеспечивающую доступ к информации на этом этапе. Этап анализа предоставляет дерево синтаксиса, этап объявления предоставляет таблицу иерархических символов, этап привязки предоставляет результат семантического анализа компилятора, а этап порождения — это API, создающий коды байтов IL.
Каждой компилятор сочетает в себе эти компоненты, образуя единый процесс.
Эти API также используются в Visual Studio. Например, функции структурирования и форматирования кода используют деревья синтаксиса, обозреватель объектов и функции навигации — таблицу символов, рефакторинг и операции Перейти к определению — семантическую модель, а операция Изменить и продолжить использует их все, включая API порождения.
Слои API
Пакет SDK компилятора .NET состоит из нескольких основных слоев API: API компилятора, API диагностики, API скриптов и API рабочих областей.
API компилятора
Слой компилятора содержит объектные модели, которые соответствуют сведениям, представляемым на каждом этапе конвейера компилятора, как синтаксическим, так и семантическим. Слой компилятора также содержит неизменяемый моментальный снимок однократного вызова компилятора, включая ссылки на сборки, параметры компилятора и файлы исходного кода. Существует два отдельных API, представляющих язык C# и Visual Basic. Эти два API похожи по форме, но для обеспечения высокой точности привязаны к конкретному языку. Этот слой не имеет зависимостей от компонентов Visual Studio.
API диагностики
В процессе анализа компилятор может создать набор данных диагностики, охватывающий все — от синтаксиса, семантики и явных ошибок присваивания до различных предупреждений и информационных диагностических сообщений. Слой API компилятора предоставляет диагностику посредством расширяемого API, который разрешает подключать пользовательские анализаторы к процессу компиляции. Она позволяет создавать заданные пользователем диагностические данные, например, формируемые такими программами, как StyleCop, параллельно с диагностическими данными, определенными компилятором. Такое формирование данных диагностики дает преимущество естественной интеграции со средствами, такими как MSBuild и Visual Studio, которые зависят от диагностики при применении таких процедур, как прерывание сборки на основе политики, отображение динамических волнистых линий в редакторе и предложение исправлений кода.
API скриптов
Api размещения и скриптов создаются на основе слоя компилятора. Api-интерфейсы сценариев можно использовать для выполнения фрагментов кода и получения контекста выполнения среды выполнения. Интерактивная среда REPL (read-evaluate-print loop) C# использует эти API. REPL позволяет использовать C# в качестве языка сценариев, выполняя код в интерактивном режиме при написании.
API рабочих областей
Слой рабочих областей содержит соответствующий API, который является отправной точкой для анализа кода и рефакторинга в рамках целых решений. Он помогает упорядочить всю информацию о проектах в решении в рамках одной объектной модели, предоставляя вам прямой доступ к объектным моделям слоя компилятора без необходимости анализировать файлы, настраивать параметры или управлять зависимостями между проектами.
Кроме того, слой рабочих областей предоставляет набор API, используемый реализацией средств анализа кода и рефакторинга, которые работают в среде размещения, таких как Visual Studio IDE. В качестве примеров можно привести API "Найти все ссылки", "Форматирование" и "Создание кода".
Этот слой не имеет зависимостей от компонентов Visual Studio.