roslyn - компилятор как сервис
Post on 22-May-2015
671 Views
Preview:
DESCRIPTION
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