roslyn - компилятор как сервис

16
КОМПИЛЯТОР КАК СЕРВИС СЕРГЕЙ ЗВЯГИН INGATE DEVELOPMENT СПЕЦИАЛЬНО ДЛЯ GetDev.NET

Upload: getdevnet

Post on 22-May-2015

670 views

Category:

Documents


4 download

DESCRIPTION

Видео со встречи - http://getdev.net/Event/roslyn Roslyn Project - это компилятор, который предоставляет разработчику API для доступа к его внутренним данным. Теперь можно анализировать код, проводить его модификацию и создавать дополнительную функциональность для .NET-языков.

TRANSCRIPT

Page 1: Roslyn - компилятор как сервис

КОМПИЛЯТОР КАК СЕРВИС

СЕРГЕЙ ЗВЯГИНINGATE DEVELOPMENT

СПЕЦИАЛЬНО ДЛЯ GetDev.NET

Page 2: Roslyn - компилятор как сервис

Эволюция

Managed Code

Generics

LINQ

Dynamic

C# 5.0 + VB 11.0Windows Runtime + async

C# 1.0 + VB 7.0

C# 2.0 + VB 8.0

C# 3.0 + VB 9.0

C# 4.0 + VB 10.0

Page 3: Roslyn - компилятор как сервис

Компилятор – черный ящик

КомпиляторSource codeSource code

Исходныйкод

Source codeSource code

.NET сборка

Page 4: Roslyn - компилятор как сервис

Лексический, синтаксический и сематнический анализ кода выполняется ещё до компиляции программыЭто позволяет подсвечивать код, применять автоматический рефакторинг, использовать IntelliSense

Проблема

Page 5: Roslyn - компилятор как сервис

Class

Field

public Foo

private

string

X

Решение

КомпиляторSource codeSource code

Исходныйкод

Source codeSource code

.NET сборка

Метапрограммирование Read-Eval-Print Loop

Объектнаямодель языка

Встраивание DSL

Page 6: Roslyn - компилятор как сервис

Roslyn APIs

Language Service

Form

atte

r

Colo

rizer

Outlin

ing

Navig

ate

To

Obje

ct B

row

ser

Com

ple

tion

List

Find A

ll R

efe

rence

s

Renam

e

Quick In

fo

Sig

natu

re

Help

Extra

ct M

eth

od

Go To

D

efinitio

n

Edit a

nd

Contin

ue

Compiler Pipeline ParserMetadata

Import

Binder IL Emitter

Symbols

Compiler API Syntax Tree API

Binding and Flow Analysis APIs

Emit APISymbol API

Page 7: Roslyn - компилятор как сервис

Roslyn API Layers

Symbol API

Services APIs

Compiler APIsSyntax Tree API

Binding and Flow Analysis APIs

Emit API

Scripting APIs

Workspace API

Code FormattingFind All

ReferencesName

Simplification…

Editor Services Code Actions Classification Completion …Outlining

Page 8: Roslyn - компилятор как сервис

Syntax Tree API – узлы

CompilationUnit

TypeDeclaration

MethodDeclaration

class C{ void M() { }}// C▫

ParameterList

Block

var tree = SyntaxTree.ParseCompilationUnit("...");

Page 9: Roslyn - компилятор как сервис

Syntax Tree API – токены

CompilationUnit

TypeDeclaration

class C {MethodDeclaratio

n}

EOF

void MParameterLi

stBlock

( ) { }

class C{ void M() { }}// C▫

Page 10: Roslyn - компилятор как сервис

Syntax Tree API – вся информация о дереве

CompilationUnit

TypeDeclaration

class C {MethodDeclaratio

n}

EOF

void MParameterLi

stBlock

( )

{ }

SP EOL EOL // C

SPx4 SP

EOL

EOL

EOLSPx4 EOL SPx4

class∙C{∙∙∙∙void∙M()∙∙∙∙{∙∙∙∙}}// C▫

Page 11: Roslyn - компилятор как сервис

Syntax Tree API – изменение узла

CompilationUnit

TypeDeclaration

class C {MethodDeclaratio

n}

EOF

void MParameterLi

stBlock

( ) { }

class C{ void M(int x) { }}// C▫

var oldList = method.ParameterList;var newList = oldList.Update(     openParenToken: oldList.OpenParenToken,     parameters: Syntax.SeparatedList(         Syntax.Parameter(             typeOpt: Syntax.ParseTypeName("int "),             identifier: Syntax.Identifier("x"))),     closeParenToken: oldList.CloseParenToken);

var newRoot = tree.Root.ReplaceNode(oldList, newList);

( )Parameter

int

xPredefinedTyp

e

class C{ void M() { }}// C▫

Page 12: Roslyn - компилятор как сервис

Компиляция

Синтакси-

ческое

дерево

Ссылки на

сборки

Компиляц

ия• Sy

mbols

• Semantic Model

• Flow Analysis

• Diagnostics

• Emit

Page 13: Roslyn - компилятор как сервис

Workspace API

Host Environment

Workspace

Solution

Project Project

Document

Document

Solution2 Solutionn

Применение результатов

Редактирование

SyntaxTree

Compilation

События (нажатия клавиш)

Page 14: Roslyn - компилятор как сервис

Code Actions API

Представление изменения кодаCode Action

• Можно управлять изменением и предпросмотром того, что изменяем

Отображение исходного кодаCode Issue

• Вызывается для любой ноды, токена или сущности• Optional: Можно получить доступ к списку ошибок (Error Window)• Optional: Можно получить доступ к Code Action

Контекстно-зависимые Code ActionCode Refactoring

• Применяются к выделенному блоку кода в окне редактора• Можно получить доступ к Code Action

Page 15: Roslyn - компилятор как сервис

ВОПРОСЫ?

Page 16: Roslyn - компилятор как сервис

СПАСИБО ЗА ВНИМАНИЕ!

Сергей Звягин

Ingate Development

BingoRUS