Metals
your IDE FOR SCALA 3
Tomasz Godzik
Agenda
1. Introduction
2. BASIC FEATURES.
3. GETTING STARTED WITH SCALA 3
4. Demo
5. Advanced features
6. BSP AND LSP
7. Recent work
8. Upcoming work
9. Questions!
Questions!
Please ask in the Q&A!
Will try to answer all at the end.
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/9062049/Peek_2021-10-28_15-30.gif)
Metals - Scala (3) language server with rich ide features
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619434/metals.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7460374/pasted-from-clipboard.png)
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/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)
tooling
- Scala is not just the compiler
- it's the whole tooling ecosystem
- Proper IDE is important for users to pick up the language
Tooling
- coordinating efforts with the compiler team
- each Scala 3 compiler release is synced with Metals
- upstream fixes to the compiler
![](https://media4.giphy.com/media/5pUAw9XjALuWepcOgV/giphy.gif)
Scala 3 support
- Based on Dotty language server
- evolved heavily since then
- we still depends on the compiler itself
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/9078603/Selection_114.png)
completions
most of the existing functionality on par with Scala 2
Improved with each release
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/9081483/completions-scala3.gif)
hover
information shown when mouse over symbol
additional Scala 3 specific info - extension methods and enums
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/9081488/hover-scala3.gif)
Definition
uses information from semanticdb generated during compilation
fallback uses the compiler
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/9081495/definition-scala3.gif)
References
uses semanticdb
needs compilation
responsive
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/9081505/references-scala3.gif)
Renames
uses semanticdb
needs compilation
will rename all symbol overrides
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/9081507/renames-scala3.gif)
GET STARTED WITH scala3
Via coursier
> cs install giter8
> g8 scala/scala3.g8
> cd dotty
> code .
VIA NEW PROJECT WIZARD
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/9081509/new-project-scala3.gif)
GET STARTED WITH scala 3
New CLI tool to work with Scala
Not only 3!
Support for Native and JS
Seamless, friction less experience
DEMO!
![](https://media3.giphy.com/media/SLL8Dvv9Niwacz8Rnw/giphy.gif)
in an online IDE
1. go to https://GITHUB.COM/TGODZIK/CREATIVE-SCALA
2. Click on the first link available
or
Just use the ready link:
https://gitpod.io/#https://github.com/tgodzik/creative-scala
in an online IDE
You can also join me in my workspace!
https://indigo-ptarmigan-67ssord3.ws-eu17.gitpod.io
Let's try to use doodle to create a shape mosaic from all the people
![](https://media2.giphy.com/media/QuxqWk7m9ffxyfoa0a/giphy.gif)
Advanced features
run/debug
run and debug your scala 3 programs
you can use the new @main annotation
via lenses, launch.json or special commands
EXPRESSION EVALUATION STILL WORKED ON
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/9081515/rundebug-scala3.gif)
Pasting code
automatically fix indentation when copy pasting
based on the current indentation at paste
additional setting
metals.enableIndentOnPaste
still experimental
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/9078904/scala3-example-project-1635969515602.gif)
scalafmt support
metals will automatically set up .scalafmt.conf file
it will make sure a proper dialect is used for each source root
always most recent version
version = "3.0.5"
runner.dialect = scala212
fileOverride {
"glob:**/tests/input3/src/main/scala/**" {
runner.dialect = scala3
}
"glob:**/mtags/target/target3/scala-3.1.0/src_managed/main/**" {
runner.dialect = scala3
}
"glob:**/mtags/src/main/scala-3/**" {
runner.dialect = scala3
}
}
Organize imports
works for all Scala 3 code except given imports
fix available in the next release
works with unsaved code
can be configured to work on CI
works with defaults
no unused imports
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/9080193/metals-1636022024009.gif)
Additional decorations
Starting with 3.1.0 -> type decorations!
can be turned on via toggle or in settings
great work by Rikito Taniguchi in the compiler
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/9081520/decorations-scala3.gif)
source file analyzer
Different ways to view your Scala files:
- javap
- semanticdb
- tasty
- soon java decompiler
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/9081517/tasty-scala3.gif)
worksheets
- allow you to quickly experiment with the language and workspace
- can work with source or totally independently
- powered by mdoc
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/9081535/worksheets-scala3.gif)
The language server protocol
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)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/9065534/Selection_113.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/6620026/maven.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6620025/gradle.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/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/7210391/pasted-from-clipboard.png)
Metals
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/6620026/maven.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6620025/gradle.png)
Metals
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6619434/metals.png)
![](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/6620029/impure-logo-bloop.png)
- can generate configuration files for Bloop Build server
- standalone server
- supports Scala 3
Mill
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/6620029/impure-logo-bloop.png)
- can generate configuration files for Bloop Build server
- standalone server
- SUPPORTS SCALA 3
![](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/6620029/impure-logo-bloop.png)
- can generate configuration files for Bloop Build server
- SUPPORTS SCALA 3
![](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)
- can generate configuration files for Bloop Build server
- SUPPORTS SCALA 3 from 7.3 version
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
BSP Server
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
How does it work?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
BSP Server
![](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)
How does it work?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
BSP Server
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
Which project?
How does it work?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
BSP Server
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
Which project?
How does it work?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
BSP Server
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
How does it work?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
BSP Server
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
Project Foo
How does it work?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
BSP Server
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
Project Foo
How does it work?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
BSP Server
![](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)
How does it work?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
BSP Server
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
Compile Foo!
How does it work?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
BSP Server
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
Compile Foo!
How does it work?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
BSP Server
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
How does it work?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
BSP Server
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
Error report
How does it work?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
BSP Server
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
Error report
How does it work?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
BSP Server
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7210333/pasted-from-clipboard.png)
LSP Server
Diagnostics
How does it work?
Recent Work
- expression evaluator (Scala 3 coming later)
- type on selection
- search text files in jars
- continuous Scala 3 improvements
NEWEST Metals FEATURES
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/9062667/Selection_111.png)
NEWEST Metals FEATURES
Quick look
![](https://media4.giphy.com/media/l0MYJge4UQzC9pEHK/giphy.gif)
What do we need to work on
Custom Completions
new Scala 3 specific completions
Expression evaluator for debugging
Some of the refactorings including `Implement all members`
![](https://media1.giphy.com/media/nCVVpakhBTwBi/giphy.gif)
Don't hestitate to sent us ideas
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/7190204/pasted-from-clipboard.png)
We do listen!
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1147195/images/9078878/Selection_115.png)
Scala Days talk by Ólafur Páll Geirsson: https://tinyurl.com/metals-scala
Great in-depth explanation by Chris Kipp: https://tinyurl.com/metals-explained
Metals in vim
https://tinyurl.com/metals-vim
Intro to working with metals
https://tinyurl.com/metals-intro
Related Talks
Presentation: https://slides.com/tomekgodzik/scala3-ide
Metals documentation: https://scalameta.org/metals/
Bloop documentation: https://scalacenter.github.io/bloop/
Reach out to me on Twitter: @TomekGodzik
OR
Ask me about anything on gitter/discord!
QUESTIONS?
Metals - your IDE for Scala 3
By Tomek Godzik
Metals - your IDE for Scala 3
- 183