From cc651ad14ac6655a7566ec6538f9c126c05472ca Mon Sep 17 00:00:00 2001 From: Hugo van Rijswijk Date: Tue, 18 Jan 2022 12:38:52 +0100 Subject: [PATCH] Add Scala support --- README.md | 1 + build.rs | 5 +++++ sample_files/scala_after.scala | 21 +++++++++++++++++++++ sample_files/scala_before.scala | 21 +++++++++++++++++++++ src/guess_language.rs | 2 ++ src/tree_sitter_parser.rs | 11 +++++++++++ vendor/tree-sitter-scala-src | 1 + 7 files changed, 62 insertions(+) create mode 100644 sample_files/scala_after.scala create mode 100644 sample_files/scala_before.scala create mode 120000 vendor/tree-sitter-scala-src diff --git a/README.md b/README.md index 0c6fb30d3..1e52da8cf 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,7 @@ Difftastic supports the following languages: * Python * Ruby * Rust +* Scala * TypeScript (and TSX) If a file has an unrecognised extension, difftastic uses a diff --git a/build.rs b/build.rs index 96c5cb259..50adca9cf 100644 --- a/build.rs +++ b/build.rs @@ -149,6 +149,11 @@ fn main() { src_dir: "vendor/tree-sitter-rust-src", extra_files: vec!["scanner.c"], }, + TreeSitterParser { + name: "tree-sitter-scala", + src_dir: "vendor/tree-sitter-scala-src", + extra_files: vec!["scanner.c"], + }, TreeSitterParser { name: "tree-sitter-tsx", src_dir: "vendor/tree-sitter-typescript-src/tsx/src", diff --git a/sample_files/scala_after.scala b/sample_files/scala_after.scala new file mode 100644 index 000000000..18413d1b1 --- /dev/null +++ b/sample_files/scala_after.scala @@ -0,0 +1,21 @@ +package foo + +import foo.Baz + +class Foo { + + private def blah(): Other { + throw new Exception("after"); + } + + var result = Option.empty[T] + val fn = pf.lift + object traverser extends SimpleTraverser { + override def apply(t: Tree): Unit = { + result = fn(t).orElse(result) + if (result.nonEmpty) { + super.apply(t) + } + } + } +} diff --git a/sample_files/scala_before.scala b/sample_files/scala_before.scala new file mode 100644 index 000000000..6bb06d96b --- /dev/null +++ b/sample_files/scala_before.scala @@ -0,0 +1,21 @@ +package foo + +import foo.Bar + +class Foo { + + def blah(): Int { + throw new Exception("before"); + } + + var result = Option.empty[T] + object traverser extends SimpleTraverser { + override def apply(t: Tree): Unit = { + if (result.isEmpty && pf.isDefinedAt(t)) { + result = Some(pf(t)) + } else if (result.isEmpty) { + super.apply(t) + } + } + } +} diff --git a/src/guess_language.rs b/src/guess_language.rs index f6b8d5168..eeb9bca52 100644 --- a/src/guess_language.rs +++ b/src/guess_language.rs @@ -38,6 +38,7 @@ pub enum Language { Python, Ruby, Rust, + Scala, Tsx, TypeScript, } @@ -139,6 +140,7 @@ fn from_extension(extension: &OsStr) -> Option { "py" | "py3" | "pyi" | "bzl" => Some(Python), "rb" | "builder" | "spec" | "rake" => Some(Ruby), "rs" => Some(Rust), + "scala" | "sbt" | "sc" => Some(Scala), "ts" => Some(TypeScript), "tsx" => Some(Tsx), _ => None, diff --git a/src/tree_sitter_parser.rs b/src/tree_sitter_parser.rs index 71d0ec929..1680be197 100644 --- a/src/tree_sitter_parser.rs +++ b/src/tree_sitter_parser.rs @@ -62,6 +62,7 @@ extern "C" { fn tree_sitter_python() -> ts::Language; fn tree_sitter_ruby() -> ts::Language; fn tree_sitter_rust() -> ts::Language; + fn tree_sitter_scala() -> ts::Language; fn tree_sitter_tsx() -> ts::Language; fn tree_sitter_typescript() -> ts::Language; } @@ -379,6 +380,16 @@ pub fn from_language(language: guess::Language) -> TreeSitterConfig { .unwrap(), } } + Scala => { + let language = unsafe { tree_sitter_scala() }; + TreeSitterConfig { + name: "Rust", + language: unsafe { tree_sitter_scala() }, + atom_nodes: (vec!["string", "template_string"]).into_iter().collect(), + delimiter_tokens: (vec![("{", "}"), ("(", ")"), ("[", "]")]), + highlight_query: ts::Query::new(language, "").unwrap(), + } + } TypeScript => { let language = unsafe { tree_sitter_typescript() }; TreeSitterConfig { diff --git a/vendor/tree-sitter-scala-src b/vendor/tree-sitter-scala-src new file mode 120000 index 000000000..2383d5323 --- /dev/null +++ b/vendor/tree-sitter-scala-src @@ -0,0 +1 @@ +tree-sitter-scala/src \ No newline at end of file