SlideShare uma empresa Scribd logo
1 de 40
Baixar para ler offline
Taking ReSharper
out of process
Matt Ellis
@citizenmatt
Why build a .NET IDE now?
How do you build a .NET IDE?
How do you build a 

cross platform .NET IDE?
How do you build a 

cross platform IDE?
Hello IntelliJ
Hello IntelliJ IDEA
Hello IntelliJ Platform
https://github.com/JetBrains/intellij-community
Uh-oh. JVM
How do you build a .NET IDE in the JVM?
Options?
ReSharper out of process
• Language server
• Headless. Command line process. IntelliJ provides the UI

Client/server communication
• Cross platform

.NET Framework on Windows. Mono on MacOS and Linux
• Removes Visual Studio in-process constraints

Memory usage. 64 bit
• Continued investment in ReSharper
Thick Client? Thin Client?
• IntelliJ provides high level UI elements, functionality and infrastructure

Editors, Alt+Enter, completion, Find Usages, test runner, debugging…

Searchable tree views, popup dialogs, settings pages…
• No knowledge of syntax trees or semantic model

Parsing, resolving, syntax highlighting, folding, inspections, refactoring,
code completion, etc. all owned by ReSharper
• (Some standalone functionality)

Find in path, REST client, Databases, VCS
• Optimisations

Lexing for initial syntax highlighting
Alt+Enter
• IntelliJ provides editor, text caret, and tracks Alt+Enter keypress
• Asks current language for items
• Current language is an IntelliJ facade for ReSharper out-of-proc

Asks ReSharper for items at current location
• ReSharper returns list of display names, icons and submenus
• IntelliJ displays items in Alt+Enter menu
Inspection highlights
• IntelliJ provides infrastructure to display “squigglies”
• Opposite direction, pushed from ReSharper
• Source file is opened, or modified

IntelliJ notifies ReSharper
• ReSharper analyses the file, runs inspections, gathers highlights
• ReSharper publishes list of range, severity and tooltip
• IntelliJ displays squiggles
Modifying source
• Bi-directional
• User typing

IntelliJ publishes changes as delta of typed characters at offset
• ReSharper rewriting code

Publishes delta as chunk of code

Renamed variable, new method, additional `using` statement, etc.
Observations
• Enabling functionality, rather than implementing it

Can show all Alt+Enter menus, run all inspections, rewrite code in
context actions and quick fixes
• As long as there is no UI…
• The data is very lightweight
IPC - RPC?
• Boilerplate - define calls and messages for each required action
• Imperative
• Conflict resolution?

Who wins? How to reset/resync state?
• JSON? Protobuf?
Client

(IntelliJ)
Server

(ReSharper)
MVVM
• Only send data required for UI components
• Lightweight View Model data
View

(IntelliJ)
Model

(ReSharper)
View

Model
Hierarchical View Model
Shared View Model
• Single view of state of entire IDE

Shared between front end and back end

Keep in sync. Only need to update changed fields
• Becomes declarative

No more boilerplate messages, just update View Model
• Reactive/observable. Composable

Subscribe for changes
• Two way

Client and server can both contribute to View Model

E.g. button click/refactoring results
• Tightly coupled? 🤔
Conflict resolution
• The client is always right
• Each value has a version
• Version increments only when client changes value
• If server changes value, no version update
• Only accept change with same or newer version
“foo”/1
“foo”/1
“bar”/2
“bar”/2
“quux”/2
“quux”/2
“wibble”/3 “blah”/2
“wibble”/3
Client
(IntelliJ)
Server
(ReSharper)
Wire protocol
• Becomes trivial - no messages, just deltas

Don’t change the protocol, just extend model
• Supports batching
• Serialisation by code generation via DSL
• Binary wire protocol, with logging
• Sockets
Rider Framework
• Two libraries, C# and Kotlin

Provides primitives and handles communication
• Kotlin based DSL to describe View Model
• Generates real code - C# and Kotlin

Interfaces, implementation and serialisation
• Business logic subscribes to and manipulates “real model”

Magic happens
View Model building blocks
• Lifetime
• Signals (events)
• Properties (observable value)
• Maps (observable collections)
• Fields (immutable)
• Call (async RPC)
• string
• int
• enum
• classdef (node)
• structdef (data)
Lifetime
class Lifetime {
static Lifetime Eternal;
void Add(Action action);
}
class LifetimeDef {
ctor(Lifetime parent);
Lifetime Lifetime;
void Terminate();
}
Dual of IDisposable
Signal
// Produce event
interface ISource<T> {
void Fire(T value);
}
// Subscribe to event
interface ISink<T> {
void Advise(Lifetime l, Action<T> handler);
}
// Composable event
interface ISignal<T> : ISource<T>, ISink<T> {
}
Properties
// Subscribe to event
interface ISink<T> {
void Advise(Lifetime l, Action<T> handler);
}
// Observable property
interface IProperty<T> : ISink<T> {
T Value { get; set; }
void View(Lifetime l, Action<Lifetime, T> action);
}
Stateful signal
Maps
class MapEvent<K,V> {
enum Kind { Add, Remove }
Kind kind;
K key;
V value;
}
// Observable collection
interface IViewableMap<K,V>
: IDictionary<K,V>, ISink<MapEvent<K,V >> {
void View(Lifetime l, Action<Lifetime, K, V> action);
}
Kotlin DSL
fun classdef (
name : String,
init : ClassdefNode.() -> Unit
)
classdef (
“Foo”,
{
myClassdef.map(…)
	 }
)
classdef (
“Foo”,
{
map(…)
}
)
Kotlin DSL
fun classdef (
name : String,
init : ClassdefNode.() -> Unit
)
classdef (
“Foo”,
{ lambda_expression }
)
classdef (“Foo”) {
lambda_expression
}
object Solution {
init {
map(“editors”, string, classdef(“Editor”) {
list(“document”, char)
property(“caret”, int)
map(“highlighters”, Range, Highlighter)
property(“completion”, Completion.nullable)
})
voidSource(“build”)
}
val Range = classdef(“Range”) {
field(“start”, int)
field(“length”, int)
}
val Highlighter = classdef(“Highlighter”) {
…
}
}
Challenges
• Rider’s Project Model very different to IntelliJ

Replace Project view with Solution Explorer

IntelliJ uses “project” where we expect “solution”
• What about duplicate language implementations?

E.g. JavaScript - WebStorm or ReSharper?

C++ CLion or ReSharper?
• Plugins are more complex

Front end and back end
• ReSharper out of process with Visual Studio? 🙊
Thanks!
Matt Ellis
@citizenmatt
www.jetbrains.com/rider

Mais conteúdo relacionado

Semelhante a Rider - Taking ReSharper out of Process

.Net overviewrajnish
.Net overviewrajnish.Net overviewrajnish
.Net overviewrajnish
Rajnish Kalla
 
E yantra robot abstractions
E yantra robot abstractionsE yantra robot abstractions
E yantra robot abstractions
Akshar Desai
 
Unmanaged Parallelization via P/Invoke
Unmanaged Parallelization via P/InvokeUnmanaged Parallelization via P/Invoke
Unmanaged Parallelization via P/Invoke
Dmitri Nesteruk
 
[Td 2015] what is new in visual c++ 2015 and future directions(ulzii luvsanba...
[Td 2015] what is new in visual c++ 2015 and future directions(ulzii luvsanba...[Td 2015] what is new in visual c++ 2015 and future directions(ulzii luvsanba...
[Td 2015] what is new in visual c++ 2015 and future directions(ulzii luvsanba...
Sang Don Kim
 
El camino a las Cloud Native Apps - Introduction
El camino a las Cloud Native Apps - IntroductionEl camino a las Cloud Native Apps - Introduction
El camino a las Cloud Native Apps - Introduction
Plain Concepts
 
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
jeffz
 
Using Smalltalk for controlling robotics systems
Using Smalltalk for controlling robotics systemsUsing Smalltalk for controlling robotics systems
Using Smalltalk for controlling robotics systems
Serge Stinckwich
 

Semelhante a Rider - Taking ReSharper out of Process (20)

NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...
NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...
NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...
 
.Net overviewrajnish
.Net overviewrajnish.Net overviewrajnish
.Net overviewrajnish
 
Fluttering
FlutteringFluttering
Fluttering
 
E sampark with c#.net
E sampark with c#.netE sampark with c#.net
E sampark with c#.net
 
Use C++ and Intel® Threading Building Blocks (Intel® TBB) for Hardware Progra...
Use C++ and Intel® Threading Building Blocks (Intel® TBB) for Hardware Progra...Use C++ and Intel® Threading Building Blocks (Intel® TBB) for Hardware Progra...
Use C++ and Intel® Threading Building Blocks (Intel® TBB) for Hardware Progra...
 
E yantra robot abstractions
E yantra robot abstractionsE yantra robot abstractions
E yantra robot abstractions
 
Summer training vhdl
Summer training vhdlSummer training vhdl
Summer training vhdl
 
Unmanaged Parallelization via P/Invoke
Unmanaged Parallelization via P/InvokeUnmanaged Parallelization via P/Invoke
Unmanaged Parallelization via P/Invoke
 
[Td 2015] what is new in visual c++ 2015 and future directions(ulzii luvsanba...
[Td 2015] what is new in visual c++ 2015 and future directions(ulzii luvsanba...[Td 2015] what is new in visual c++ 2015 and future directions(ulzii luvsanba...
[Td 2015] what is new in visual c++ 2015 and future directions(ulzii luvsanba...
 
Ice mini guide
Ice mini guideIce mini guide
Ice mini guide
 
El camino a las Cloud Native Apps - Introduction
El camino a las Cloud Native Apps - IntroductionEl camino a las Cloud Native Apps - Introduction
El camino a las Cloud Native Apps - Introduction
 
Summer training vhdl
Summer training vhdlSummer training vhdl
Summer training vhdl
 
02 direct3 d_pipeline
02 direct3 d_pipeline02 direct3 d_pipeline
02 direct3 d_pipeline
 
Windows 8 für .net Entwickler
Windows 8 für .net EntwicklerWindows 8 für .net Entwickler
Windows 8 für .net Entwickler
 
An Open Source Workbench for Prototyping Multimodal Interactions Based on Off...
An Open Source Workbench for Prototyping Multimodal Interactions Based on Off...An Open Source Workbench for Prototyping Multimodal Interactions Based on Off...
An Open Source Workbench for Prototyping Multimodal Interactions Based on Off...
 
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
 
dot net technology
dot net technologydot net technology
dot net technology
 
Using Smalltalk for controlling robotics systems
Using Smalltalk for controlling robotics systemsUsing Smalltalk for controlling robotics systems
Using Smalltalk for controlling robotics systems
 
Summer training vhdl
Summer training vhdlSummer training vhdl
Summer training vhdl
 
Summer training vhdl
Summer training vhdlSummer training vhdl
Summer training vhdl
 

Mais de citizenmatt

Mais de citizenmatt (10)

How to Parse a File (NDC London 2018)
How to Parse a File (NDC London 2018)How to Parse a File (NDC London 2018)
How to Parse a File (NDC London 2018)
 
How to Parse a File (DDD North 2017)
How to Parse a File (DDD North 2017)How to Parse a File (DDD North 2017)
How to Parse a File (DDD North 2017)
 
The how-dare-you-call-me-an-idiot’s guide to the .NET Standard (NDC London 2017)
The how-dare-you-call-me-an-idiot’s guide to the .NET Standard (NDC London 2017)The how-dare-you-call-me-an-idiot’s guide to the .NET Standard (NDC London 2017)
The how-dare-you-call-me-an-idiot’s guide to the .NET Standard (NDC London 2017)
 
.NET Core Blimey! Windows Platform User Group, Manchester
.NET Core Blimey! Windows Platform User Group, Manchester.NET Core Blimey! Windows Platform User Group, Manchester
.NET Core Blimey! Windows Platform User Group, Manchester
 
.NET Core Blimey! (Shropshire Devs Mar 2016)
.NET Core Blimey! (Shropshire Devs Mar 2016).NET Core Blimey! (Shropshire Devs Mar 2016)
.NET Core Blimey! (Shropshire Devs Mar 2016)
 
.NET Core Blimey! (dotnetsheff Jan 2016)
.NET Core Blimey! (dotnetsheff Jan 2016).NET Core Blimey! (dotnetsheff Jan 2016)
.NET Core Blimey! (dotnetsheff Jan 2016)
 
.net Core Blimey - Smart Devs UG
.net Core Blimey - Smart Devs UG.net Core Blimey - Smart Devs UG
.net Core Blimey - Smart Devs UG
 
.Net Core Blimey! (16/07/2015)
.Net Core Blimey! (16/07/2015).Net Core Blimey! (16/07/2015)
.Net Core Blimey! (16/07/2015)
 
C# 6.0 - DotNetNotts
C# 6.0 - DotNetNottsC# 6.0 - DotNetNotts
C# 6.0 - DotNetNotts
 
What's New in ReSharper 9?
What's New in ReSharper 9?What's New in ReSharper 9?
What's New in ReSharper 9?
 

Último

Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 

Último (20)

ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
A Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusA Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source Milvus
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 

Rider - Taking ReSharper out of Process

  • 1. Taking ReSharper out of process Matt Ellis @citizenmatt
  • 2.
  • 3. Why build a .NET IDE now?
  • 4. How do you build a .NET IDE?
  • 5. How do you build a 
 cross platform .NET IDE?
  • 6. How do you build a 
 cross platform IDE?
  • 7.
  • 13. How do you build a .NET IDE in the JVM?
  • 15.
  • 16. ReSharper out of process • Language server • Headless. Command line process. IntelliJ provides the UI
 Client/server communication • Cross platform
 .NET Framework on Windows. Mono on MacOS and Linux • Removes Visual Studio in-process constraints
 Memory usage. 64 bit • Continued investment in ReSharper
  • 17. Thick Client? Thin Client? • IntelliJ provides high level UI elements, functionality and infrastructure
 Editors, Alt+Enter, completion, Find Usages, test runner, debugging…
 Searchable tree views, popup dialogs, settings pages… • No knowledge of syntax trees or semantic model
 Parsing, resolving, syntax highlighting, folding, inspections, refactoring, code completion, etc. all owned by ReSharper • (Some standalone functionality)
 Find in path, REST client, Databases, VCS • Optimisations
 Lexing for initial syntax highlighting
  • 18.
  • 19. Alt+Enter • IntelliJ provides editor, text caret, and tracks Alt+Enter keypress • Asks current language for items • Current language is an IntelliJ facade for ReSharper out-of-proc
 Asks ReSharper for items at current location • ReSharper returns list of display names, icons and submenus • IntelliJ displays items in Alt+Enter menu
  • 20. Inspection highlights • IntelliJ provides infrastructure to display “squigglies” • Opposite direction, pushed from ReSharper • Source file is opened, or modified
 IntelliJ notifies ReSharper • ReSharper analyses the file, runs inspections, gathers highlights • ReSharper publishes list of range, severity and tooltip • IntelliJ displays squiggles
  • 21. Modifying source • Bi-directional • User typing
 IntelliJ publishes changes as delta of typed characters at offset • ReSharper rewriting code
 Publishes delta as chunk of code
 Renamed variable, new method, additional `using` statement, etc.
  • 22. Observations • Enabling functionality, rather than implementing it
 Can show all Alt+Enter menus, run all inspections, rewrite code in context actions and quick fixes • As long as there is no UI… • The data is very lightweight
  • 23. IPC - RPC? • Boilerplate - define calls and messages for each required action • Imperative • Conflict resolution?
 Who wins? How to reset/resync state? • JSON? Protobuf? Client
 (IntelliJ) Server
 (ReSharper)
  • 24. MVVM • Only send data required for UI components • Lightweight View Model data View
 (IntelliJ) Model
 (ReSharper) View
 Model
  • 26. Shared View Model • Single view of state of entire IDE
 Shared between front end and back end
 Keep in sync. Only need to update changed fields • Becomes declarative
 No more boilerplate messages, just update View Model • Reactive/observable. Composable
 Subscribe for changes • Two way
 Client and server can both contribute to View Model
 E.g. button click/refactoring results • Tightly coupled? 🤔
  • 27. Conflict resolution • The client is always right • Each value has a version • Version increments only when client changes value • If server changes value, no version update • Only accept change with same or newer version
  • 29. Wire protocol • Becomes trivial - no messages, just deltas
 Don’t change the protocol, just extend model • Supports batching • Serialisation by code generation via DSL • Binary wire protocol, with logging • Sockets
  • 30. Rider Framework • Two libraries, C# and Kotlin
 Provides primitives and handles communication • Kotlin based DSL to describe View Model • Generates real code - C# and Kotlin
 Interfaces, implementation and serialisation • Business logic subscribes to and manipulates “real model”
 Magic happens
  • 31. View Model building blocks • Lifetime • Signals (events) • Properties (observable value) • Maps (observable collections) • Fields (immutable) • Call (async RPC) • string • int • enum • classdef (node) • structdef (data)
  • 32. Lifetime class Lifetime { static Lifetime Eternal; void Add(Action action); } class LifetimeDef { ctor(Lifetime parent); Lifetime Lifetime; void Terminate(); } Dual of IDisposable
  • 33. Signal // Produce event interface ISource<T> { void Fire(T value); } // Subscribe to event interface ISink<T> { void Advise(Lifetime l, Action<T> handler); } // Composable event interface ISignal<T> : ISource<T>, ISink<T> { }
  • 34. Properties // Subscribe to event interface ISink<T> { void Advise(Lifetime l, Action<T> handler); } // Observable property interface IProperty<T> : ISink<T> { T Value { get; set; } void View(Lifetime l, Action<Lifetime, T> action); } Stateful signal
  • 35. Maps class MapEvent<K,V> { enum Kind { Add, Remove } Kind kind; K key; V value; } // Observable collection interface IViewableMap<K,V> : IDictionary<K,V>, ISink<MapEvent<K,V >> { void View(Lifetime l, Action<Lifetime, K, V> action); }
  • 36. Kotlin DSL fun classdef ( name : String, init : ClassdefNode.() -> Unit ) classdef ( “Foo”, { myClassdef.map(…) } ) classdef ( “Foo”, { map(…) } )
  • 37. Kotlin DSL fun classdef ( name : String, init : ClassdefNode.() -> Unit ) classdef ( “Foo”, { lambda_expression } ) classdef (“Foo”) { lambda_expression }
  • 38. object Solution { init { map(“editors”, string, classdef(“Editor”) { list(“document”, char) property(“caret”, int) map(“highlighters”, Range, Highlighter) property(“completion”, Completion.nullable) }) voidSource(“build”) } val Range = classdef(“Range”) { field(“start”, int) field(“length”, int) } val Highlighter = classdef(“Highlighter”) { … } }
  • 39. Challenges • Rider’s Project Model very different to IntelliJ
 Replace Project view with Solution Explorer
 IntelliJ uses “project” where we expect “solution” • What about duplicate language implementations?
 E.g. JavaScript - WebStorm or ReSharper?
 C++ CLion or ReSharper? • Plugins are more complex
 Front end and back end • ReSharper out of process with Visual Studio? 🙊