Skip to content

Commit ce7f7dc

Browse files
committed
Add minimal Scala support - tree-sitter, Metals
Adds - Scala syntax highlighting using `tree-sitter-scala` - basic Metals LSP support, without automatic installation Most of the tree-sitter queries have been picked up and repurposed from [tree-sitter-scala](https://github.com/tree-sitter/tree-sitter-scala) and [nvim-treesitter](https://github.com/nvim-treesitter/nvim-treesitter/tree/master/queries/scala) projects.
1 parent ed8aa6d commit ce7f7dc

File tree

11 files changed

+418
-0
lines changed

11 files changed

+418
-0
lines changed

Cargo.lock

+10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,7 @@ tree-sitter-python = "0.20.2"
303303
tree-sitter-racket = { git = "https://github.com/zed-industries/tree-sitter-racket", rev = "eb010cf2c674c6fd9a6316a84e28ef90190fe51a" }
304304
tree-sitter-ruby = "0.20.0"
305305
tree-sitter-rust = "0.20.3"
306+
tree-sitter-scala = { git = "https://github.com/tree-sitter/tree-sitter-scala.git", rev = "45b5ba0e749a8477a8fd2666f082f352859bdc3c" }
306307
tree-sitter-scheme = { git = "https://github.com/6cdh/tree-sitter-scheme", rev = "af0fd1fa452cb2562dc7b5c8a8c55551c39273b9" }
307308
tree-sitter-svelte = { git = "https://github.com/Himujjal/tree-sitter-svelte", rev = "bd60db7d3d06f89b6ec3b287c9a6e9190b5564bd" }
308309
tree-sitter-toml = { git = "https://github.com/tree-sitter/tree-sitter-toml", rev = "342d9be207c2dba869b9967124c679b5e6fd0ebe" }

crates/languages/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ tree-sitter-python.workspace = true
7272
tree-sitter-racket.workspace = true
7373
tree-sitter-ruby.workspace = true
7474
tree-sitter-rust.workspace = true
75+
tree-sitter-scala.workspace = true
7576
tree-sitter-scheme.workspace = true
7677
tree-sitter-svelte.workspace = true
7778
tree-sitter-toml.workspace = true

crates/languages/src/lib.rs

+3
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ mod purescript;
3434
mod python;
3535
mod ruby;
3636
mod rust;
37+
mod scala;
3738
mod svelte;
3839
mod tailwind;
3940
mod terraform;
@@ -109,6 +110,7 @@ pub fn init(
109110
("racket", tree_sitter_racket::language()),
110111
("ruby", tree_sitter_ruby::language()),
111112
("rust", tree_sitter_rust::language()),
113+
("scala", tree_sitter_scala::language()),
112114
("scheme", tree_sitter_scheme::language()),
113115
("svelte", tree_sitter_svelte::language()),
114116
("toml", tree_sitter_toml::language()),
@@ -359,6 +361,7 @@ pub fn init(
359361
))]
360362
);
361363
language!("dart", vec![Arc::new(dart::DartLanguageServer {})]);
364+
language!("scala", vec![Arc::new(scala::MetalsLspAdapter {})]);
362365
}
363366

364367
#[cfg(any(test, feature = "test-support"))]

crates/languages/src/scala.rs

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
use anyhow::{anyhow, Result};
2+
use async_trait::async_trait;
3+
pub use language::*;
4+
use lsp::LanguageServerBinary;
5+
use std::{any::Any, path::PathBuf};
6+
7+
pub struct MetalsLspAdapter;
8+
9+
#[async_trait]
10+
impl LspAdapter for MetalsLspAdapter {
11+
fn name(&self) -> LanguageServerName {
12+
LanguageServerName("metals".into())
13+
}
14+
15+
async fn fetch_latest_server_version(
16+
&self,
17+
_: &dyn LspAdapterDelegate,
18+
) -> Result<Box<dyn 'static + Any + Send>> {
19+
Ok(Box::new(()))
20+
}
21+
22+
async fn fetch_server_binary(
23+
&self,
24+
_version: Box<dyn 'static + Send + Any>,
25+
_container_dir: PathBuf,
26+
_: &dyn LspAdapterDelegate,
27+
) -> Result<LanguageServerBinary> {
28+
Err(anyhow!(
29+
"metals must be installed and available in your $PATH"
30+
))
31+
}
32+
33+
async fn cached_server_binary(
34+
&self,
35+
_: PathBuf,
36+
_: &dyn LspAdapterDelegate,
37+
) -> Option<LanguageServerBinary> {
38+
Some(LanguageServerBinary {
39+
path: "metals".into(),
40+
env: None,
41+
arguments: vec![],
42+
})
43+
}
44+
45+
fn can_be_reinstalled(&self) -> bool {
46+
false
47+
}
48+
49+
async fn installation_test_binary(
50+
&self,
51+
_container_dir: PathBuf,
52+
) -> Option<LanguageServerBinary> {
53+
None
54+
}
55+
}
56+
57+
#[cfg(test)]
58+
mod tests {}
+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
("(" @open ")" @close)
2+
("[" @open "]" @close)
3+
("{" @open "}" @close)
+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
name = "Scala"
2+
grammar = "scala"
3+
path_suffixes = ["scala", "sbt", "sc"]
4+
line_comments = ["// "]
5+
autoclose_before = ";:.,=}])"
6+
brackets = [
7+
{ start = "{", end = "}", close = true, newline = true },
8+
{ start = "[", end = "]", close = true, newline = true },
9+
{ start = "(", end = ")", close = true, newline = true },
10+
{ start = "\"", end = "\"", close = true, newline = false, not_in = ["comment", "string"] },
11+
{ start = "'", end = "'", close = true, newline = false, not_in = ["comment", "string"] },
12+
{ start = "`", end = "`", close = true, newline = false, not_in = ["comment", "string"] },
13+
{ start = "/*", end = " */", close = true, newline = false, not_in = ["comment", "string"] }
14+
]
15+
collapsed_placeholder = " /* ... */ "

0 commit comments

Comments
 (0)