diff --git a/CHANGELOG.md b/CHANGELOG.md index a98d76344..2ddfaf389 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ Improved diff cost model to prefer finding unchanged variable names over unchanged punctuation. +### Parsing + +Added support for QML. + ## 0.35 (released 2nd September 2022) ### Diffing diff --git a/build.rs b/build.rs index 7980a1e64..b62d2ca64 100644 --- a/build.rs +++ b/build.rs @@ -287,6 +287,11 @@ fn main() { src_dir: "vendor/tree-sitter-python-src", extra_files: vec!["scanner.cc"], }, + TreeSitterParser { + name: "tree-sitter-qmljs", + src_dir: "vendor/tree-sitter-qmljs-src", + extra_files: vec!["scanner.c"], + }, TreeSitterParser { name: "tree-sitter-ruby", src_dir: "vendor/tree-sitter-ruby-src", diff --git a/manual/src/languages_supported.md b/manual/src/languages_supported.md index 563a66d8c..f7692351f 100644 --- a/manual/src/languages_supported.md +++ b/manual/src/languages_supported.md @@ -36,6 +36,7 @@ with `difft --list-languages`. | Perl | [ganezdragon/tree-sitter-perl](https://github.com/ganezdragon/tree-sitter-perl) | | PHP | [tree-sitter/tree-sitter-php](https://github.com/tree-sitter/tree-sitter-php) | | Python | [tree-sitter/tree-sitter-python](https://github.com/tree-sitter/tree-sitter-python) | +| QML | [tree-sitter/tree-sitter-qmljs](https://github.com/yuja/tree-sitter-qmljs) | | 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/tree/non_special_token)) | | Scala | [tree-sitter/tree-sitter-scala](https://github.com/tree-sitter/tree-sitter-scala) | diff --git a/sample_files/compare.expected b/sample_files/compare.expected index 28a87530b..fcefadedc 100644 --- a/sample_files/compare.expected +++ b/sample_files/compare.expected @@ -139,6 +139,9 @@ sample_files/prefer_outer_before.el sample_files/prefer_outer_after.el sample_files/preprocesor_before.h sample_files/preprocesor_after.h 3e4331cb935cbe735a79ebc43786cd3a - +sample_files/qml_before.qml sample_files/qml_after.qml +53ddc9a9a88f7d0381558e4fabf46212 - + sample_files/ruby_before.rb sample_files/ruby_after.rb d88046b43f826a34bbd4a7b9d6bb704d - diff --git a/sample_files/qml_after.qml b/sample_files/qml_after.qml new file mode 100644 index 000000000..c7149a924 --- /dev/null +++ b/sample_files/qml_after.qml @@ -0,0 +1,29 @@ +// Taken from https://doc.qt.io/qt-6/qmlapplications.html +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +ApplicationWindow { + width: 400 + height: 400 + visible: true + + Button { + id: button + hoverEnabled: true + text: "A Special Button" + background: Rectangle { + implicitWidth: 100 + implicitHeight: 40 + color: { + if (button.down || button.hovered) { + "#d6d6d6" + } else { + "#f6f6f6" + } + } + border.color: "#26282a" + border.width: button.down ? 2 : 1 + radius: 4 + } + } +} diff --git a/sample_files/qml_before.qml b/sample_files/qml_before.qml new file mode 100644 index 000000000..84bb4bc16 --- /dev/null +++ b/sample_files/qml_before.qml @@ -0,0 +1,22 @@ +// Taken from https://doc.qt.io/qt-6/qmlapplications.html +import QtQuick +import QtQuick.Controls + +ApplicationWindow { + width: 400 + height: 400 + visible: true + + Button { + id: button + text: "A Special Button" + background: Rectangle { + implicitWidth: 100 + implicitHeight: 40 + color: button.down ? "#d6d6d6" : "#f6f6f6" + border.color: "#26282a" + border.width: 1 + radius: 4 + } + } +} diff --git a/src/diff/sliders.rs b/src/diff/sliders.rs index 327dc20e6..43bc642b4 100644 --- a/src/diff/sliders.rs +++ b/src/diff/sliders.rs @@ -69,8 +69,8 @@ fn prefer_outer_delimiter(language: guess_language::Language) -> bool { // the inner delimiter is more relevant. Bash | C | CMake | CPlusPlus | CSharp | Css | Dart | Elixir | Elm | Elvish | Gleam | Go | Hack | Haskell | Html | Java | JavaScript | Jsx | Julia | Kotlin | Lua | Make | Nix - | OCaml | OCamlInterface | Perl | Php | Python | Ruby | Rust | Scala | Swift | Tsx - | TypeScript | Yaml | Zig => false, + | OCaml | OCamlInterface | Perl | Php | Python | Qml | Ruby | Rust | Scala | Swift + | Tsx | TypeScript | Yaml | Zig => false, } } diff --git a/src/parse/guess_language.rs b/src/parse/guess_language.rs index 64ca3cb54..a7647e241 100644 --- a/src/parse/guess_language.rs +++ b/src/parse/guess_language.rs @@ -52,6 +52,7 @@ pub enum Language { Php, Perl, Python, + Qml, Ruby, Rust, Scala, @@ -101,6 +102,7 @@ pub fn language_name(language: Language) -> &'static str { Php => "PHP", Perl => "Perl", Python => "Python", + Qml => "QML", Ruby => "Ruby", Rust => "Rust", Scala => "Scala", @@ -181,6 +183,7 @@ pub const LANG_EXTENSIONS: &'static [(Language, &[&str])] = &[ (Php, &["php"]), (Perl, &["pm", "pl"]), (Python, &["py", "py3", "pyi", "bzl"]), + (Qml, &["qml"]), (Ruby, &["rb", "builder", "spec", "rake"]), (Rust, &["rs"]), (Scala, &["scala", "sbt", "sc"]), diff --git a/src/parse/tree_sitter_parser.rs b/src/parse/tree_sitter_parser.rs index beef27f78..a9c2073b0 100644 --- a/src/parse/tree_sitter_parser.rs +++ b/src/parse/tree_sitter_parser.rs @@ -73,6 +73,7 @@ extern "C" { fn tree_sitter_php() -> ts::Language; fn tree_sitter_perl() -> ts::Language; fn tree_sitter_python() -> ts::Language; + fn tree_sitter_qmljs() -> ts::Language; fn tree_sitter_ruby() -> ts::Language; fn tree_sitter_rust() -> ts::Language; fn tree_sitter_scala() -> ts::Language; @@ -608,6 +609,25 @@ pub fn from_language(language: guess::Language) -> TreeSitterConfig { .unwrap(), } } + Qml => { + let language = unsafe { tree_sitter_qmljs() }; + TreeSitterConfig { + language, + atom_nodes: vec!["string", "template_string", "regex"] + .into_iter() + .collect(), + delimiter_tokens: vec![("{", "}"), ("(", ")"), ("[", "]"), ("<", ">")], + highlight_query: ts::Query::new( + language, + concat!( + include_str!("../../vendor/highlights/javascript.scm"), + include_str!("../../vendor/highlights/typescript.scm"), + include_str!("../../vendor/highlights/qmljs.scm"), + ), + ) + .unwrap(), + } + } Ruby => { let language = unsafe { tree_sitter_ruby() }; TreeSitterConfig { diff --git a/vendor/highlights/qmljs.scm b/vendor/highlights/qmljs.scm new file mode 120000 index 000000000..6ba8919bf --- /dev/null +++ b/vendor/highlights/qmljs.scm @@ -0,0 +1 @@ +../tree-sitter-qmljs/queries/highlights.scm \ No newline at end of file diff --git a/vendor/tree-sitter-qmljs-src b/vendor/tree-sitter-qmljs-src new file mode 120000 index 000000000..d5ebef1e4 --- /dev/null +++ b/vendor/tree-sitter-qmljs-src @@ -0,0 +1 @@ +tree-sitter-qmljs/src \ No newline at end of file