Metals LSP Server
growing the community!
Tomasz Godzik
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7230340/pasted-from-clipboard.png)
Questions!
Please ask in the chat!
Will try to answer all at the end.
Or at the Q&A session next
Why am I Here?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619438/virtuslab.png)
Why am I Here?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619432/scalacenter.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619438/virtuslab.png)
Why am I Here?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619432/scalacenter.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619438/virtuslab.png)
Why am I Here?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619434/metals.png)
Currently working on Metals as one of the main contributors as a part of the collaboration between VirtusLab and Scala Center.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619432/scalacenter.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619438/virtuslab.png)
Who Contributed to what metals is today?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619784/gabriele.jpeg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619783/jorge.jpeg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619782/olafur.jpeg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210230/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619784/gabriele.jpeg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619783/jorge.jpeg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619782/olafur.jpeg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210230/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210231/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210232/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210233/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210238/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210240/pasted-from-clipboard.png)
Who Contributed to what metals is today?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619784/gabriele.jpeg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619783/jorge.jpeg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619782/olafur.jpeg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210230/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210231/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210232/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210233/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210236/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210238/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210239/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210240/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210242/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210244/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210245/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210247/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210248/pasted-from-clipboard.png)
Who Contributed to what metals is today?
Metals - Scala language server with rich ide features
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619434/metals.png)
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(_)
}
Many other features!
- Diagnostics
- Goto definition
- Completions
- Hover
- Parameter hints
- Find references
- Find implementations
- Rename symbol
- Code actions
- Document symbols
- Workspace symbols
- Formatting
- Folding
- Highlight
Many other features!
- Diagnostics
- Goto definition
- Completions
- Hover
- Parameter hints
- Find references
- Find implementations
- Rename symbol
- Code actions
- Document symbols
- Workspace symbols
- Formatting
- Folding
- Highlight
- Execute command
Extensions!
- Worksheets
- Tree view
- Quick pick
- Slow task
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
Scala
The pain points
AKA
What we are doing to grow the community?
Hard to hire new developers
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210690/how-long.png)
How long have you been using Scala?
Hard to hire new developers
Where did you learn scala?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210726/where-scala.png)
Hard to hire new developers
How are you using Scala?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210736/how-scala.png)
JDK setup
- done automatically for you by Metals.
- Just install Visual Studio Code plugin and you're good to go
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210827/install.gif)
- lenses appear over any code to run
- just click and run
EASY WAY TO RUN AND DEBUG
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7211003/debug.gif)
- evaluate any code on the go!
- no need for a build tool
- can share classpath with project
Worksheets
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210908/worksheet.gif)
- reuse the g8 templates
- list of default curated templates
- Download others from github
- PR Soon
New project setup
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7229526/new-project2.gif)
- Gitpod allows to open any project in an online workspace
Gitpod and Eclipse Theia
- Gitpod allows to open any project in an online workspace
- uses eclipse theia ide
Gitpod and Eclipse Theia
Gitpod and Eclipse Theia
- Gitpod allows to open any project in an online workspace
- uses eclipse theia ide
- go to GITHUB.COM/TGODZIK/METALS-SAMPLE
Gitpod and Eclipse Theia
- Gitpod allows to open any project in an online workspace
- uses eclipse theia ide
- go to GITHUB.COM/TGODZIK/METALS-SAMPLE
- GREAT OPPORTUNITY FOR LEARNING SETUP
Gitpod and Eclipse Theia
- Gitpod allows to open any project in an online workspace
- uses eclipse theia ide
- go to GITHUB.COM/TGODZIK/METALS-SAMPLE
- GREAT OPPORTUNITY FOR LEARNING SETUP
- NO NEED TO WRANGLE WITH ANY ISSUE SPECIFIC TO USER'S COMPUTER
Gitpod and Eclipse Theia
- Gitpod allows to open any project in an online workspace
- uses eclipse theia ide
- go to GITHUB.COM/TGODZIK/METALS-SAMPLE
- GREAT OPPORTUNITY FOR LEARNING SETUP
- NO NEED TO WRANGLE WITH ANY ISSUE SPECIFIC TO USER'S COMPUTER
- ALL IMPROVEMENTS AVAILABLE AS SOON AS THEY ARE MERGED
ONLINE IDES
![](https://media1.giphy.com/media/69lYfuao0xTPy0fl75/giphy.gif)
DEMO!
Tooling
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210729/tools_chart.png)
Scala main pain points in daily work?
Tooling - others
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210678/word-bubble.png)
Pain points in dev setup
tooling
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210749/tool-pains.png)
Long Compile times
Bloop is fast and optimized for development experience
![](https://media1.giphy.com/media/lRnUWhmllPI9a/giphy.gif)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6620029/impure-logo-bloop.png)
It will be possible to offload compilation to Bloop from build tools
Only compile once
works with hydra
MEtals as an Alternative to Intellij
- Intellij is still the most wholesome solution
- multiple features
- a lot of additional tools
- probably best for Scala
![](https://media1.giphy.com/media/yNbzQkYolmwk8/giphy.gif)
MEtals as an Alternative to Intellij
- not everyone needs every possible feature
- indexing times are a killer
- it's large and unwieldy for quick editing
- additional barrier if you start with Scala
![](https://media0.giphy.com/media/B2vBunhgt9Pc4/giphy.gif)
- Intellij is still the most wholesome solution
- multiple features
- a lot of additional tools
- probably best for Scala
![](https://media1.giphy.com/media/yNbzQkYolmwk8/giphy.gif)
but
Sbt / Build tool setup
- many supported build (tools 6 + 2 in progress)
- there is an initiative to create zero dependencies workspaces
- possible simple build tool that could work for beginners and generate sbt
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/7210783/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210784/pasted-from-clipboard.png)
- reuse the same mechanism as Gitpod
OPTIMIZED WORKSPACES
OPTIMIZED WORKSPACES
- REUSE THE SAME MECHANISM AS GITPOD
- CREATE DOCKER IMAGES WITH READY COMPILED CODE AND INDEXES PREPARED
OPTIMIZED WORKSPACES
- REUSE THE SAME MECHANISM AS GITPOD
- CREATE DOCKER IMAGES WITH READY COMPILED CODE AND INDEXES PREPARED
- CONNECT VIA VISUAL STUDIO CODE SSH
OPTIMIZED WORKSPACES
- REUSE THE SAME MECHANISM AS GITPOD
- CREATE DOCKER IMAGES WITH READY COMPILED CODE AND INDEXES PREPARED
- CONNECT VIA VISUAL STUDIO CODE SSH
- DOCKER CONTAINERS CAN BE ACCESSIBLE VIA WEB
OPTIMIZED WORKSPACES
- REUSE THE SAME MECHANISM AS GITPOD
- CREATE DOCKER IMAGES WITH READY COMPILED CODE AND INDEXES PREPARED
- CONNECT VIA VISUAL STUDIO CODE SSH
- DOCKER CONTAINERS CAN BE ACCESSIBLE VIA WEB
- KUBERNETES? ECLIPSE CHE?
OPTIMIZED WORKSPACES
DEMO
OPTIMIZED WORKSPACES
Again?!!!
![](https://media2.giphy.com/media/LPHXLKEOZw6T6/giphy.gif)
DEMO
SCALA 3 MIGRATION
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210756/scala-3.png)
What are your fears with regards to Scala 3?
THE FUTURE OR SCALA 3
- PR with support ready
THE FUTURE OR SCALA 3
- PR with support ready
- More features coming soon
THE FUTURE OR SCALA 3
- PR with support ready
- More features coming soon
- Will make sure there is feature parity with current Metals Scala 2 support
THE FUTURE OR SCALA 3
- PR with support ready
- More features coming soon
- Will make sure there is feature parity with current Metals Scala 2 support
- making sure everything works well for the developer
- PR with support ready
- More features coming soon
- Will make sure there is feature parity with current Metals Scala 2 support
- making sure everything works well for the developer
- more features will done for Scala 3 itself (Optional braces)
THE FUTURE OR SCALA 3
Some fun new concepts
THE FUTURE OR SCALA 3
Some fun new concepts
THE FUTURE OR SCALA 3
trait A:
def f: Int
class C(x: Int) extends A:
def f = x
object O:
def f = 3
Optional braces
Some fun new concepts
THE FUTURE OR SCALA 3
trait A:
def f: Int
class C(x: Int) extends A:
def f = x
object O:
def f = 3
Optional braces
val x: String = ???
val y: String | Null = ???
x == null // error
x eq null // error
"hello" == null // error
y == null // ok
y == x // ok
explicit nulls
Some fun new concepts
THE FUTURE OR SCALA 3
trait A:
def f: Int
class C(x: Int) extends A:
def f = x
object O:
def f = 3
Optional braces
val x: String = ???
val y: String | Null = ???
x == null // error
x eq null // error
"hello" == null // error
y == null // ok
y == x // ok
explicit nulls
@main def helloWorld(
age: Int,
name: String,
others: String*
) = {
println(s"Hello $name!")
println(s"You are $age years old")
}
outer methods
Some fun new concepts
THE FUTURE OR SCALA 3
trait A:
def f: Int
class C(x: Int) extends A:
def f = x
object O:
def f = 3
Optional braces
val x: String = ???
val y: String | Null = ???
x == null // error
x eq null // error
"hello" == null // error
y == null // ok
y == x // ok
explicit nulls
@main def helloWorld(
age: Int,
name: String,
others: String*
) = {
println(s"Hello $name!")
println(s"You are $age years old")
}
outer methods
case class Circle(
x: Double,
y: Double,
radius: Double
)
def (c: Circle).circumference: Double =
c.radius * math.Pi * 2
Extension methods
Some fun new concepts
Besides:
- simplified pattern matching
- better macros
- enums
- focus on ease of migration
- implicit suggestions
- a lot of even more modern features
THE FUTURE OR SCALA 3
trait A:
def f: Int
class C(x: Int) extends A:
def f = x
object O:
def f = 3
Optional braces
val x: String = ???
val y: String | Null = ???
x == null // error
x eq null // error
"hello" == null // error
y == null // ok
y == x // ok
explicit nulls
@main def helloWorld(
age: Int,
name: String,
others: String*
) = {
println(s"Hello $name!")
println(s"You are $age years old")
}
outer methods
case class Circle(
x: Double,
y: Double,
radius: Double
)
def (c: Circle).circumference: Double =
c.radius * math.Pi * 2
Extension methods
Recent Work
- run and debug for tests and main methods
- go to implementations
- rename symbol
- code actions
- worksheet support
NEWEST Metals FEATURES
Coming soon
- go to parent code lenses
Coming soon
- go to parent code lenses
- BETTER SUPPORT FOR LAUNCHING MAIN METHODS AND TESTS
Coming soon
- go to parent code lenses
- BETTER SUPPORT FOR LAUNCHING MAIN METHODS AND TESTS
- Ammonite script support
Coming soon
- go to parent code lenses
- BETTER SUPPORT FOR LAUNCHING MAIN METHODS AND TESTS
- Ammonite script support
- SUPPORT FOR SCALA 3!!!
![](https://media0.giphy.com/media/ZUomWFktUWpFu/giphy.gif)
Future work
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7190204/pasted-from-clipboard.png)
Last year Scala Days talk by Ólafur Páll Geirsson
https://tinyurl.com/metals-scala
Presentation: https://slides.com/tomekgodzik/growing
Metals documentation: https://scalameta.org/metals/
Bloop documentation: https://scalacenter.github.io/bloop/
Shout at me on Twitter: @TomekGodzik
OR
Ask me about anything on Slack!
QUESTIONS?
Metals - growing the community
By Tomek Godzik
Metals - growing the community
- 255