Изучение кода с помощью визуализатора синтаксиса Roslyn в Visual Studio

Эта статья содержит обзор средства визуализатора синтаксиса, входящего в состав пакета SDK для .NET Compiler Platform ("Roslyn"). Визуализатор синтаксиса — окно инструментов, помогающее просматривать и изучать деревья синтаксиса. Это средство играет важную роль, так как понимает понять модели для кода, который требуется проанализировать. Оно также помогает выполнять отладку при разработке приложений с помощью пакета SDK для .NET Compiler Platform ("Roslyn"). Откройте это средство, чтобы создать свои первые анализаторы. Визуализатор помогает понять модели, используемые API-интерфейсами. Вы также можете использовать такие средства, как SharpLab или LINQPad, для просмотра кода и изучения деревьев синтаксиса.

Инструкции по установке — Visual Studio Installer

Найти SDK-пакет .NET Compiler Platform в Visual Studio Installer можно двумя способами:

Установка с помощью Visual Studio Installer — представление "Рабочие нагрузки"

SDK-пакет .NET Compiler Platform не выбирается автоматически в рамках рабочей нагрузки разработки расширений Visual Studio. Его необходимо выбрать как дополнительный компонент.

  1. Запустите Visual Studio Installer.
  2. Выберите Изменить.
  3. Отметьте рабочую нагрузку Разработка расширений Visual Studio.
  4. Откройте узел Разработка расширений Visual Studio в дереве сводки.
  5. Установите флажок SDK-пакет .NET Compiler Platform. Нужный пакет будет представлен последним в списке дополнительных компонентов.

Кроме того, вы можете настроить редактор DGML для отображения диаграмм в средстве визуализации:

  1. Откройте узел Отдельные компоненты в дереве сводки.
  2. Установите флажок Редактор DGML

Установка с помощью Visual Studio Installer — вкладка "Отдельные компоненты"

  1. Запустите Visual Studio Installer.
  2. Выберите Изменить.
  3. Откройте вкладку Отдельные компоненты.
  4. Установите флажок SDK-пакет .NET Compiler Platform. Нужный пакет будет представлен в разделе Компиляторы, средства сборки и среды выполнения в самом начале.

Кроме того, вы можете настроить редактор DGML для отображения диаграмм в средстве визуализации:

  1. Установите флажок Редактор DGML. Нужный пакет будет представлен в разделе Средства для работы с кодом.

Вы можете ознакомиться с основными понятиями, используемыми в пакете SDK для .NET Compiler Platform, прочитав обзорную статью. Она содержит вводные сведения о деревьях синтаксиса, узлах, токенах и дополнительной информации.

Визуализатор синтаксиса

Визуализатор синтаксиса позволяет просматривать дерево синтаксиса для файла кода C# или Visual Basic в текущем активном окне редактора внутри интегрированной среды разработки Visual Studio. Визуализатор можно запустить, выбрав Вид>Другие окна>Визуализатор синтаксиса. Вы также можете воспользоваться панелью инструментов Быстрый запуск в правом верхнем углу. Введите "синтаксис", после чего должна появиться команда, позволяющая открыть визуализатор синтаксиса.

Эта команда открывает визуализатор синтаксиса в виде перемещаемого окна инструментов. Если у вас не открыто окно редактора кода, никакие данные не отображаются, как показано на рисунке ниже.

Окно инструментов визуализатора синтаксиса

Закрепите это окно инструментов в удобном месте среды Visual Studio, например слева. Визуализатор отображает сведения о текущем файле кода.

Создайте проект с помощью команды Файл>Создать проект. Можно создать проект Visual Basic или C#. Когда Visual Studio открывает основной файл кода для этого проекта, визуализатор отображает для него дерево синтаксиса. Вы можете открыть любой существующий файл C#/Visual Basic в этом экземпляре Visual Studio, и визуализатор отобразит для него дерево синтаксиса. Если в Visual Studio открыто несколько файлов кода, визуализатор отображает дерево синтаксиса для активного файла (на который установлен фокус ввода).

Как показано на рисунках выше, окно инструментов визуализатора отображает дерево синтаксиса сверху и сетку свойств снизу. Сетка свойств содержит свойства элемента, выбранного в дереве, включая Тип .NET и Вид (SyntaxKind) этого элемента.

Деревья синтаксиса состоят из трех типов элементов — узлов, токенов и дополнительной информации. Подробнее об этих типах см. в статье Работа с синтаксисом. Элементы каждого типа выделены определенным цветом. Нажмите кнопку "Условные обозначения", чтобы просмотреть используемые цвета.

Каждый элемент в дереве также отображает свой диапазон. Диапазон — это индексы (начальное и конечное положение) узла в текстовом файле. В предыдущем примере C# выбранный токен "UsingKeyword [0..5)" имеет диапазон шириной пять символов — [0..5). Нотация "[..)" означает, что начальный индекс входит в диапазон, а конечный — нет.

Перемещаться по дереву можно двумя способами:

  • Разверните или щелкните элементы в дереве. Визуализатор автоматически выбирает текст, соответствующий диапазону этого элемента в редакторе кода.
  • Щелкните или выберите текст в редакторе кода. Если в предыдущем примере Visual Basic выбрать в редакторе кода строку, содержащую "Module Module1", визуализатор автоматически переходит к соответствующему узлу ModuleStatement в дереве.

Визуализатор выделяет в дереве элемент, диапазон которого лучше всего соответствует диапазону текста, выделенного в редакторе.

Визуализатор обновляет дерево, чтобы отразить изменения в активном файле кода. Добавьте вызов Console.WriteLine() внутрь Main(). По мере ввода визуализатор обновляет дерево.

Введя Console., остановитесь. Некоторые элементы в дереве выделены розовым цветом. На данном этапе введенный код содержит ошибки (это также называется диагностикой). Эти ошибки присоединяются к узлам, токенам и дополнительной информации в дереве синтаксиса. Визуализатор показывает, к каким элементам присоединены ошибки, выделяя их фон розовым цветом. Вы можете просмотреть ошибки для любого элемента, выделенного розовым цветом, наведя на него указатель мыши. Визуализатор отображает только синтаксические ошибки (связанные с синтаксисом введенного кода); семантические ошибки он не показывает.

Графы синтаксиса

Щелкните правой кнопкой мыши любой элемент в дереве и выберите команду View Directed Syntax Graph (Просмотреть направленный граф синтаксиса).

Визуализатор отображает графическое представление поддерева, корнем которого является выбранный элемент. Повторите эти шаги для узла MethodDeclaration, соответствующего методу Main() в примере C#. Визуализатор отображает граф синтаксиса, который выглядит следующим образом:

Просмотр графа синтаксиса C#

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

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

Ниже представлен макет закрепления для окна инструментов визуализатора и окна графа синтаксиса:

Один макет закрепления для окна визуализатора и графа синтаксиса

При работе с двумя мониторами можно также вывести окно графа синтаксиса на второй монитор.

Изучение семантики

Визуализатор синтаксиса обладает простейшими функциями для просмотра символов и семантической информации. Введите double x = 1 + 1; внутри Main() в примере C#. Выберите выражение 1 + 1 в окне редактора кода. Визуализатор выделяет узел AddExpression. Щелкните правой кнопкой мыши узел AddExpression и выберите команду View Symbol (if any) (Просмотреть символ (при наличии)). Обратите внимание, что большинство пунктов меню имеют квалификатор "if any" (при наличии). Визуализатор синтаксиса проверяет свойства узла, включая свойства, которые могут присутствовать не для всех узлов.

Сетка свойств в визуализаторе обновляется, как показано на рисунке ниже. Символом для выражения является SynthesizedIntrinsicOperatorSymbol, у которого Вид = Метод.

Свойства символов в Syntax Visualizer

Попробуйте выбрать команду View TypeSymbol (if any) (Просмотреть символ типа (при наличии)) для того же узла AddExpression. Сетка свойств в визуализаторе обновляется, как показано на рисунке ниже, указывая, что выбранное выражение имеет тип Int32.

Свойства символа типа

Попробуйте выбрать команду View Converted TypeSymbol (if any) (Просмотреть преобразованный символ типа (при наличии)) для того же узла AddExpression. Сетка свойств обновляется, указывая, что, хотя выражение имеет тип Int32, преобразованным типом выражения является Double, как показано на рисунке ниже. Этот узел включает сведения о преобразованном символе типа, так как выражение Int32 находится в контексте, где его необходимо преобразовать в Double. Это преобразование удовлетворяет типу Double, указанному для переменной x в левой части оператора присваивания.

Свойства преобразованного символа типа

Наконец, попробуйте выбрать команду View Constant Value (if any) (Просмотреть постоянное значение (при наличии)) для того же узла AddExpression. Сетка свойств показывает, что значением выражения является константа времени компиляции со значением 2.

Постоянное значение

Предыдущий пример также можно воспроизвести в Visual Basic. Введите Dim x As Double = 1 + 1 в файле Visual Basic. Выберите выражение 1 + 1 в окне редактора кода. Визуализатор выделяет соответствующий узел AddExpression. Повторите предыдущие шаги для данного узла AddExpression, полученные результаты должны быть теми же самыми.

Изучите дополнительный код в Visual Basic. Измените основной файл Visual Basic, используя следующий код:

Imports C = System.Console

Module Program
    Sub Main(args As String())
        C.WriteLine()
    End Sub
End Module

Этот код представляет псевдоним C, сопоставляемый с типом System.Console в начале файла, и использует его внутри Main(). Выберите использование этого псевдонима — C в C.WriteLine() — внутри метода Main(). Визуализатор выбирает соответствующий узел IdentifierName. Щелкните этот узел правой кнопкой мыши и выберите команду View Symbol (if any) (Просмотреть символ, если есть). Сетка свойств указывает, что этот идентификатор привязан к типу System.Console, как показано на следующем рисунке:

Свойства символа C в визуализаторе синтаксиса

Попробуйте выбрать команду View AliasSymbol (if any) (Просмотреть символ псевдонима (при наличии)) для того же узла IdentifierName. Сетка свойств указывает, что этот идентификатор является псевдонимом с именем C, который привязан к целевому объекту System.Console. Другими словами, сетка свойств предоставляет сведения о AliasSymbol, соответствующем идентификатору C.

Свойства символа псевдонима

Изучите символ, соответствующей любому объявленному типу, методу, свойству. Выберите соответствующий узел в визуализаторе и щелкните элемент View Symbol (if any) (Просмотреть символ (при наличии)). Выберите метод Sub Main(), включая его тело. Щелкните View Symbol (if any) (Просмотреть символ (при наличии)) для соответствующего узла SubBlock в визуализаторе. Сетка свойств показывает, что MethodSymbol для этого SubBlock имеет имя Main с типом возвращаемого значения Void.

Просмотр символа для объявления метода

Приведенные выше примеры Visual Basic можно легко воспроизвести в C#. Введите using C = System.Console; вместо Imports C = System.Console для псевдонима. Выполнение описанных выше действий в C# приводит к аналогичным результатам в окне визуализатора.

Операции семантической проверки доступны только на узлах. Они недоступны для токенов или дополнительной информации. Не все узлы имеют значимые семантические сведения для изучения. Если узел не содержит значимой семантической информации, при выборе элемента View * Symbol (if any) (Просмотреть символ * (при наличии)) отображается пустая сетка свойств.

Подробнее об API для выполнения семантического анализа см. в обзорном документе Работа с семантикой.

Закрытие визуализатора синтаксиса

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