The language server protocol
Your favourite language in you favourite Editor
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619858/vscode.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619857/eclipse.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619856/atom.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619867/vim.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619871/emacs.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619875/sublime.png)
How does it work
Client Editor
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210335/pasted-from-clipboard.png)
LSP Server
How does it work
Client Editor
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210335/pasted-from-clipboard.png)
LSP Server
object Main{
def adding(a : Int, b : Int) = a + b
val additional = ""
val one = 1
val two = 2
addi_
}
How does it work
Client Editor
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210335/pasted-from-clipboard.png)
LSP Server
Completions
object Main{
def adding(a : Int, b : Int) = a + b
val additional = ""
val one = 1
val two = 2
addi_
}
How does it work
Client Editor
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210335/pasted-from-clipboard.png)
LSP Server
Completions
object Main{
def adding(a : Int, b : Int) = a + b
val additional = ""
val one = 1
val two = 2
addi_
}
How does it work
Client Editor
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210335/pasted-from-clipboard.png)
LSP Server
object Main{
def adding(a : Int, b : Int) = a + b
val additional = ""
val one = 1
val two = 2
addi_
}
How does it work
Client Editor
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210335/pasted-from-clipboard.png)
LSP Server
- adding()
- additional
object Main{
def adding(a : Int, b : Int) = a + b
val additional = ""
val one = 1
val two = 2
addi_
}
How does it work
Client Editor
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210335/pasted-from-clipboard.png)
LSP Server
- adding()
- additional
object Main{
def adding(a : Int, b : Int) = a + b
val additional = ""
val one = 1
val two = 2
addi_
}
How does it work
Client Editor
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210335/pasted-from-clipboard.png)
LSP Server
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210358/pasted-from-clipboard.png)
object Main{
def adding(a : Int, b : Int) = a + b
val additional = ""
val one = 1
val two = 2
addi_
}
How does it work
Client Editor
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210335/pasted-from-clipboard.png)
LSP Server
object Main{
def adding(a : Int, b : Int) = a + b
val additional = ""
val one = 1
val two = 2
adding(_)
}
The build server protocol
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6620029/impure-logo-bloop.png)
The universe of Build tools
Mill
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6620027/sbt.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6620024/fury.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6620026/maven.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6620025/gradle.png)
Seed
The universe of Build tools
Mill
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6620027/sbt.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6620024/fury.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6620026/maven.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6620025/gradle.png)
Seed
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210391/pasted-from-clipboard.png)
Metals
Mill
Seed
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6620027/sbt.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6620024/fury.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6620026/maven.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6620025/gradle.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6620029/impure-logo-bloop.png)
The universe of Build tools
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
Bloop
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
BLOOP AND BSP
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
Bloop
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
What is this code a part of!
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210404/pasted-from-clipboard.png)
BLOOP AND BSP
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
Bloop
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
Which project?
BLOOP AND BSP
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
Bloop
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
BLOOP AND BSP
Which project?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
Bloop
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
BLOOP AND BSP
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
Bloop
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
Project Foo
BLOOP AND BSP
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
Bloop
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
Project Foo
BLOOP AND BSP
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
Bloop
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
I don't know how to compile it!
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210404/pasted-from-clipboard.png)
BLOOP AND BSP
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
Bloop
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
Compile Foo!
BLOOP AND BSP
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
Bloop
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
Compile Foo!
BLOOP AND BSP
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
Bloop
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
BLOOP AND BSP
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
Bloop
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
Error report
BLOOP AND BSP
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
Bloop
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
Error report
BLOOP AND BSP
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
Bloop
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
Diagnostics
BLOOP AND BSP
SemanticDB
$ metap .
Test.scala
----------
Summary:
Schema => SemanticDB v4
Uri => Test.scala
Text => empty
Language => Scala
Symbols => 3 entries
Occurrences => 7 entries
Symbols:
_empty_/Test. => final object Test extends AnyRef { +1 decls }
_empty_/Test.main(). => method main(args: Array[String]): Unit
_empty_/Test.main().(args) => param args: Array[String]
Occurrences:
[0:7..0:11) <= _empty_/Test.
[1:6..1:10) <= _empty_/Test.main().
[1:11..1:15) <= _empty_/Test.main().(args)
[1:17..1:22) => scala/Array#
[1:23..1:29) => scala/Predef.String#
[1:33..1:37) => scala/Unit#
[2:4..2:11) => scala/Predef.println(+1).
Used in:
ReferenceProvider
ImplementationProvider
SyntheticDecorationsProvider
Anything that work file wide
Scalameta parser
- used for syntax based feature
- does not require versions specific feature
- easy to implement new features for all ScalaVersions
- FoldingProvider, DocumentSymbolProvider, some code actions
Scala presentation compiler
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
Scala Presentation Compiler (mtags)
2.13.4 / 2.12.13 / 2.12.12 / 3.0.0-RC1 ...
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210358/pasted-from-clipboard.png)
Java Interfaces
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
Metals Server (mtags)
- Used for anything that needs to work on newest unsaved version of the code
- Can work in non-compiling code
- Implements one off features that work for a single point
- HoverProvider, SignatureHelpProvider, DefinitionProvider (fallback)
Scala Spree
By Tomek Godzik
Scala Spree
- 342