Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Александр Кугушев «Roslyn: очевидные неочевидности»

Александр Кугушев «Roslyn: очевидные неочевидности»

Разработка синтаксических анализаторов и рефакторингов с помощью Roslyn (Microsoft.CodeAnalysys) интересное и захватывющее занятие. Но путь изучения тернист, полон неожиданностей и неочевидностей. Давайте же рассмотрим основные сложности, которые вы можете встретить и составим шпаргалку, которая поможет вам в нелёгком деле синтаксического анализа.

DotNetRu

July 27, 2017
Tweet

More Decks by DotNetRu

Other Decks in Programming

Transcript

  1. Цели • Рассмотреть топ неочевидных особенностей CodeAnalysis • Синхронизировать свое

    мышление со спецификой рассматриваемого API • Написать шпаргалку молодого анализаторописателя https://github.com/AleksandrKugushev/how-to-roslyn 3
  2. Первый шаг • Получить объект Syntax Tree • Получить корень

    этого дерева • Пройтись от корня по всему дереву в поисках класса • Внести необходимые изменения в класс • Заменить класс в исходном синтаксическом дереве • Вернуть измененное дерево в виде строки https://github.com/AleksandrKugushev/how-to-roslyn 5
  3. Неочевидность №1: Для всего есть фабрика Фабричный метод • CSharpSyntaxTree

    Статическая фабрика • SyntaxFactory https://github.com/AleksandrKugushev/how-to-roslyn 7
  4. Неочевидность №2: DescendantNodes Node Node Node Node Node Node Node

    Node Node Node https://github.com/AleksandrKugushev/how-to-roslyn 8
  5. ServiceLocator.Resolve<Service>() InvocationExpression SimpleMemberAccessExpression: ServiceLocator.Resolve<Service> OperatorToken: . IdentifierName: ServiceLocator Identifier: ServiceLocator

    GenericName: Resolve<Service> Identifier: Resolve TypeArgumentList: Service ArgumentList: () https://github.com/AleksandrKugushev/how-to-roslyn 12
  6. Шпаргалка №4: Помимо типа узла есть SyntaxKind • В Syntax

    Visualizer отображается именно SyntaxKind • Все SyntaxToken различаются именно значением SyntaxKind • Если чего то нет в SyntaxKind, этого нет в языке https://github.com/AleksandrKugushev/how-to-roslyn 14
  7. Как будем убивать ServiceLocator? • Создадим конструктор если нет подходящего

    • Добавим соотвествующие поля • Добавим в конструктор необходимые параметры • Проинициализируем поля в конструкторе • Заменим вызовы ServiceLocator обращениями к полям https://github.com/AleksandrKugushev/how-to-roslyn 17
  8. Шпаргалка №7: With….\Update…\Add… With…\Update… • Возвращает новый экземпляр с полностью

    замененной частью • Существует версия для любой части синтаксиса кнкретной SyntaxNode • Включает в себя токены Add… • Возвращает новый экземпляр с дополненой частью • Существует если только если в этом есть смысл https://github.com/AleksandrKugushev/how-to-roslyn 19
  9. Неочевидность №7: Если меняешь узел дерева, меняешь все дерево Node

    Node Node Node Node Node* Node* Node* Node* https://github.com/AleksandrKugushev/how-to-roslyn 23
  10. Что мы узнали 1. Не забываем использовать SyntaxVisualizer что бы

    понять структуру кода 2. Узлы с одинаковым типом могут отличаться по SyntaxKind 3. Все объекты синтаксической модели создаются средствами SyntaxFactory 4. Все синтаксические узлы следуют конфенции именования Add/Update/With 5. Есть много полезных функций: ReplaceNode, IsEquivalentTo, NormalizeWhitespace и проч. https://github.com/AleksandrKugushev/how-to-roslyn 25