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

Post on 22-May-2015

671 Views

Category:

Documents

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

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

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

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

Эволюция

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

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

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

Исходныйкод

Source codeSource code

.NET сборка

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

Проблема

Class

Field

public Foo

private

string

X

Решение

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

Исходныйкод

Source codeSource code

.NET сборка

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

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

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

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

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

Syntax Tree API – узлы

CompilationUnit

TypeDeclaration

MethodDeclaration

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

ParameterList

Block

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

Syntax Tree API – токены

CompilationUnit

TypeDeclaration

class C {MethodDeclaratio

n}

EOF

void MParameterLi

stBlock

( ) { }

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

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▫

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▫

Компиляция

Синтакси-

ческое

дерево

Ссылки на

сборки

Компиляц

ия• Sy

mbols

• Semantic Model

• Flow Analysis

• Diagnostics

• Emit

Workspace API

Host Environment

Workspace

Solution

Project Project

Document

Document

Solution2 Solutionn

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

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

SyntaxTree

Compilation

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

Code Actions API

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

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

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

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

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

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

ВОПРОСЫ?

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

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

Ingate Development

BingoRUS

top related