diff --git a/CHANGELOG.md b/CHANGELOG.md index ddcf74edb..dbefba438 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ### Parsing -Added support for Kotlin. +Added support for Kotlin and TOML. Fixed an issue with YAML and `|` block strings. diff --git a/build.rs b/build.rs index 3199513bb..1f90e2b19 100644 --- a/build.rs +++ b/build.rs @@ -194,6 +194,11 @@ fn main() { src_dir: "vendor/tree-sitter-scala-src", extra_files: vec!["scanner.c"], }, + TreeSitterParser { + name: "tree-sitter-toml", + src_dir: "vendor/tree-sitter-toml-src", + extra_files: vec!["scanner.c"], + }, TreeSitterParser { name: "tree-sitter-tsx", src_dir: "vendor/tree-sitter-typescript-src/tsx/src", diff --git a/manual/src/upstream_parsers.md b/manual/src/upstream_parsers.md index 6e32ddf4b..3f777ca11 100644 --- a/manual/src/upstream_parsers.md +++ b/manual/src/upstream_parsers.md @@ -30,6 +30,7 @@ Difftastic uses the following tree-sitter parsers: | Ruby | [tree-sitter/tree-sitter-ruby](https://github.com/tree-sitter/tree-sitter-ruby) | | Rust | [tree-sitter/tree-sitter-rust](https://github.com/tree-sitter/tree-sitter-rust) ([forked](https://github.com/Wilfred/tree-sitter-rust)) | | Scala | [tree-sitter/tree-sitter-scala](https://github.com/tree-sitter/tree-sitter-scala) | +| TOML | [ikatyang/tree-sitter-toml](https://github.com/ikatyang/tree-sitter-toml) | | TypeScript, TSX | [tree-sitter/tree-sitter-typescript](https://github.com/tree-sitter/tree-sitter-typescript) | | YAML | [ikatyang/tree-sitter-yaml](https://github.com/ikatyang/tree-sitter-yaml) | | Zig | [maxxnino/tree-sitter-zig](https://github.com/maxxnino/tree-sitter-zig) | diff --git a/sample_files/compare.expected b/sample_files/compare.expected index 05fdd5887..e3b01238a 100644 --- a/sample_files/compare.expected +++ b/sample_files/compare.expected @@ -139,6 +139,9 @@ dfc3495b8d5931029b479f0c878a3219 - sample_files/todomvc_before.gleam sample_files/todomvc_after.gleam c1d8b44875121d81c583dd3a8fb43232 - +sample_files/toml_before.toml sample_files/toml_after.toml +9928c1f07b655860c27e2e1002d94106 - + sample_files/typing_before.ml sample_files/typing_after.ml ceba89e4ffc8406454d337638c7d45e6 - diff --git a/sample_files/toml_after.toml b/sample_files/toml_after.toml new file mode 100644 index 000000000..42674efd7 --- /dev/null +++ b/sample_files/toml_after.toml @@ -0,0 +1,27 @@ +# This is a TOML document + +title = "TOML Example Changed" + +[owner] +name = "Tom Preston-Werner" +dob = 2000-01-31T07:32:00-08:00 + +[database] +enabled = true +ports = [ 8000, 8002 ] +data = [ ["delta", "phi"], [3.14] ] +temp_targets = { cpu = 79.5, case = 72.0 } + +[servers] + +[servers.alpha] +ip = "10.0.0.1" +role = "frontend" + +[servers.beta] +ip = "10.0.0.2" +role = "backend" + +str1 = """ +Roses are red +Violets are blue""" diff --git a/sample_files/toml_before.toml b/sample_files/toml_before.toml new file mode 100644 index 000000000..0c938b7e1 --- /dev/null +++ b/sample_files/toml_before.toml @@ -0,0 +1,35 @@ +# This is a TOML document + +title = "TOML Example" + +[owner] +name = "Tom Preston-Werner" +dob = 1979-05-27T07:32:00-08:00 + +[database] +enabled = true +ports = [ 8000, 8001, 8002 ] +data = [ ["delta", "phi"], [3.14] ] +temp_targets = { cpu = 79.5, case = 72.0 } + +[servers] + +[servers.alpha] +ip = "10.0.0.1" +role = "frontend" + +[servers.beta] +ip = "10.0.0.2" +role = "backend" + +str1 = """ +Roses are red +Violets are blue""" + +str2 = """\ + The quick brown \ + fox jumps over \ + the lazy dog.\ + """ + +path = 'C:\Users\nodejs\templates' diff --git a/src/guess_language.rs b/src/guess_language.rs index 6ffce91b9..a50de8215 100644 --- a/src/guess_language.rs +++ b/src/guess_language.rs @@ -47,6 +47,7 @@ pub enum Language { Ruby, Rust, Scala, + Toml, Tsx, TypeScript, Yaml, @@ -117,6 +118,7 @@ fn from_emacs_mode_header(src: &str) -> Option { "rust" => Some(Rust), "scala" => Some(Scala), "sh" => Some(Bash), + "toml" => Some(Toml), "tuareg" => Some(OCaml), "typescript" => Some(TypeScript), "yaml" => Some(Yaml), @@ -175,6 +177,7 @@ fn from_name(path: &Path) -> Option { ".emacs" | "_emacs" | "Cask" => Some(EmacsLisp), "TARGETS" | "BUCK" | "DEPS" => Some(Python), "Gemfile" | "Rakefile" => Some(Ruby), + "Cargo.lock" | "Gopkg.lock" | "Pipfile" | "poetry.lock" => Some(Toml), _ => None, }, None => None, @@ -221,6 +224,7 @@ pub fn from_extension(extension: &OsStr) -> Option { "rb" | "builder" | "spec" | "rake" => Some(Ruby), "rs" => Some(Rust), "scala" | "sbt" | "sc" => Some(Scala), + "toml" => Some(Toml), "ts" => Some(TypeScript), "tsx" => Some(Tsx), "yaml" | "yml" => Some(Yaml), diff --git a/src/sliders.rs b/src/sliders.rs index 8e63c20e4..4184dc699 100644 --- a/src/sliders.rs +++ b/src/sliders.rs @@ -54,9 +54,9 @@ fn prefer_outer_delimiter(language: guess_language::Language) -> bool { // For Lisp family languages, we get the best result with the // outer delimiter. EmacsLisp | Clojure | CommonLisp | JanetSimple => true, - // JSON is like Lisp: the outer delimiter in an array object + // JSON and TOML are like Lisp: the outer delimiter in an array object // is the most relevant. - Json => true, + Json | Toml => true, // For everything else, prefer the inner delimiter. These // languages have syntax like `foo(bar)` or `foo[bar]` where // the inner delimiter is more relevant. diff --git a/src/tree_sitter_parser.rs b/src/tree_sitter_parser.rs index c0c888ec5..776341be7 100644 --- a/src/tree_sitter_parser.rs +++ b/src/tree_sitter_parser.rs @@ -71,6 +71,7 @@ extern "C" { fn tree_sitter_ruby() -> ts::Language; fn tree_sitter_rust() -> ts::Language; fn tree_sitter_scala() -> ts::Language; + fn tree_sitter_toml() -> ts::Language; fn tree_sitter_tsx() -> ts::Language; fn tree_sitter_typescript() -> ts::Language; fn tree_sitter_yaml() -> ts::Language; @@ -538,6 +539,20 @@ pub fn from_language(language: guess::Language) -> TreeSitterConfig { .unwrap(), } } + Toml => { + let language = unsafe { tree_sitter_toml() }; + TreeSitterConfig { + name: "TOML", + language, + atom_nodes: vec!["string"].into_iter().collect(), + delimiter_tokens: vec![("{", "}"), ("[", "]")], + highlight_query: ts::Query::new( + language, + include_str!("../vendor/highlights/toml.scm"), + ) + .unwrap(), + } + } TypeScript => { let language = unsafe { tree_sitter_typescript() }; TreeSitterConfig { diff --git a/vendor/highlights/toml.scm b/vendor/highlights/toml.scm new file mode 120000 index 000000000..95af975ea --- /dev/null +++ b/vendor/highlights/toml.scm @@ -0,0 +1 @@ +../tree-sitter-toml/queries/highlights.scm \ No newline at end of file diff --git a/vendor/tree-sitter-toml-src b/vendor/tree-sitter-toml-src new file mode 120000 index 000000000..baa1e54d4 --- /dev/null +++ b/vendor/tree-sitter-toml-src @@ -0,0 +1 @@ +tree-sitter-toml/src \ No newline at end of file