From e6b27caf06693e4d78d6b60e808cfc2f568e0455 Mon Sep 17 00:00:00 2001 From: Brandon Maier Date: Tue, 13 Feb 2024 22:08:15 +0000 Subject: [PATCH] Add support for devicetrees --- build.rs | 5 ++ manual/src/languages_supported.md | 1 + sample_files/compare.expected | 3 ++ sample_files/devicetree_after.dts | 60 +++++++++++++++++++++ sample_files/devicetree_before.dts | 58 ++++++++++++++++++++ src/parse/guess_language.rs | 3 ++ src/parse/tree_sitter_parser.rs | 17 ++++++ vendored_parsers/highlights/devicetree.scm | 1 + vendored_parsers/tree-sitter-devicetree-src | 1 + 9 files changed, 149 insertions(+) create mode 100644 sample_files/devicetree_after.dts create mode 100644 sample_files/devicetree_before.dts create mode 120000 vendored_parsers/highlights/devicetree.scm create mode 120000 vendored_parsers/tree-sitter-devicetree-src diff --git a/build.rs b/build.rs index 222abf7cd..b36eddf34 100644 --- a/build.rs +++ b/build.rs @@ -126,6 +126,11 @@ fn main() { src_dir: "vendored_parsers/tree-sitter-dart-src", extra_files: vec!["scanner.c"], }, + TreeSitterParser { + name: "tree-sitter-devicetree", + src_dir: "vendored_parsers/tree-sitter-devicetree-src", + extra_files: vec![], + }, TreeSitterParser { name: "tree-sitter-elisp", src_dir: "vendored_parsers/tree-sitter-elisp-src", diff --git a/manual/src/languages_supported.md b/manual/src/languages_supported.md index 96a48ecae..a4766d16c 100644 --- a/manual/src/languages_supported.md +++ b/manual/src/languages_supported.md @@ -18,6 +18,7 @@ with `difft --list-languages`. | CMake | [uyha/tree-sitter-cmake](https://github.com/uyha/tree-sitter-cmake) | | Common Lisp | [theHamsta/tree-sitter-commonlisp](https://github.com/theHamsta/tree-sitter-commonlisp) | | Dart | [UserNobody14/tree-sitter-dart](https://github.com/UserNobody14/tree-sitter-dart) | +| Devicetree | [joelspadin/tree-sitter-devicetree](https://github.com/joelspadin/tree-sitter-devicetree) | | Elixir | [elixir-lang/tree-sitter-elixir](https://github.com/elixir-lang/tree-sitter-elixir) | | Elm | [elm-tooling/tree-sitter-elm](https://github.com/elm-tooling/tree-sitter-elm) | | Elvish | [ckafi/tree-sitter-elvish](https://github.com/ckafi/tree-sitter-elvish) | diff --git a/sample_files/compare.expected b/sample_files/compare.expected index 754dcb7ac..a9d57fdfe 100644 --- a/sample_files/compare.expected +++ b/sample_files/compare.expected @@ -49,6 +49,9 @@ sample_files/css_before.css sample_files/css_after.css sample_files/dart_before.dart sample_files/dart_after.dart 73dd776f2587bbaf2d29fbe20dd8de40 - +sample_files/devicetree_before.dts sample_files/devicetree_after.dts +7b5e6987b493b8bb3386f8e56c02578f - + sample_files/elisp_before.el sample_files/elisp_after.el 4342ed34fe5304644afe5b224f0fd83b - diff --git a/sample_files/devicetree_after.dts b/sample_files/devicetree_after.dts new file mode 100644 index 000000000..6222e2984 --- /dev/null +++ b/sample_files/devicetree_after.dts @@ -0,0 +1,60 @@ +/dts-v1/; + +/memreserve/ 0x1000000000000000 0x0000000002000000; +/memreserve/ 0x2000000000000000 0x0100000000000000; +/memreserve/ 0x0000000000000000 0x0000000000000014; + +/ { + model = "MyBoardNamev2"; + compatible = "MyBoardName", "MyBoardFamilyName", "MyBoardRevision"; + #address-cells = <2>; + #size-cells = <2>; + + cpus { + linux,phandle = <0x1>; + #address-cells = <1>; + #size-cells = <0>; + PowerPC,970@0 { + name = "PowerPC,970"; + device_type = "cpu"; + reg = <0x00000000>; + clock-frequency = <1600000000>; + timebase-frequency = <33333333>; + linux,boot-cpu; + i-cache-size = <65536>; + d-cache-size = <32768>; + }; + }; + + randomparentnode { + randomnode { + string = "\xff\0stuffstuff\t\t\t\n\n\n"; + blob = [0a 0b 0c 0d de ea ad be ef]; + ref = < &{/memory@0} >; + mixed = "abc", + [1234], + <0xa 0xb 0xc>; + new = <12345>; + }; + }; + + memory@0 { + device_type = "memory"; + memreg: reg = < + 0x00000000 0x00000000 + 0x00000000 0x20000000>; + }; + + memory@100000 { + device_type = "memory"; + memreg: reg = < + 0x00100000 0x00000000 + 0x00100000 0x20000000>; + }; + + chosen { + linux,platform = <0x600>; + bootargs = "root=/dev/sda2"; + }; + +}; diff --git a/sample_files/devicetree_before.dts b/sample_files/devicetree_before.dts new file mode 100644 index 000000000..63bdf505a --- /dev/null +++ b/sample_files/devicetree_before.dts @@ -0,0 +1,58 @@ +/dts-v1/; + +/memreserve/ 0x1000000000000000 0x0000000002000000; +/memreserve/ 0x2000000000000000 0x0100000000000000; +/memreserve/ 0x0000000000000000 0x0000000000000014; + +/ { + model = "MyBoardName"; + compatible = "MyBoardName", "MyBoardFamilyName"; + #address-cells = <2>; + #size-cells = <2>; + + cpus { + linux,phandle = <0x1>; + #address-cells = <1>; + #size-cells = <0>; + PowerPC,970@0 { + name = "PowerPC,970"; + device_type = "cpu"; + reg = <0x00000000>; + clock-frequency = <1600000000>; + timebase-frequency = <33333333>; + linux,boot-cpu; + i-cache-size = <65536>; + d-cache-size = <32768>; + }; + + PowerPC,970@1 { + name = "PowerPC,970"; + device_type = "cpu"; + reg = <0x00000001>; + clock-frequency = <1600000000>; + timebase-frequency = <33333333>; + i-cache-size = <65536>; + d-cache-size = <32768>; + }; + + }; + + randomnode { + string = "\xff\0stuffstuff\t\t\t\n\n\n"; + blob = [0a 0b 0c 0d de ea ad be ef]; + ref = < &{/memory@0} >; + mixed = "abc", [1234], <0xa 0xb 0xc>; + old = <12345>; + }; + + memory@0 { + device_type = "memory"; + memreg: reg = <0x00000000 0x00000000 0x00000000 0x20000000>; + }; + + chosen { + bootargs = "root=/dev/sda2"; + linux,platform = <0x600>; + }; + +}; diff --git a/src/parse/guess_language.rs b/src/parse/guess_language.rs index 732901669..c832504f8 100644 --- a/src/parse/guess_language.rs +++ b/src/parse/guess_language.rs @@ -29,6 +29,7 @@ pub(crate) enum Language { CSharp, Css, Dart, + Devicetree, Elixir, Elm, Elvish, @@ -119,6 +120,7 @@ pub(crate) fn language_name(language: Language) -> &'static str { CSharp => "C#", Css => "CSS", Dart => "Dart", + Devicetree => "Devicetree", Elixir => "Elixir", Elm => "Elm", Elvish => "Elvish", @@ -243,6 +245,7 @@ pub(crate) fn language_globs(language: Language) -> Vec { CSharp => &["*.cs"], Css => &["*.css"], Dart => &["*.dart"], + Devicetree => &["*.dts", "*.dtsi", "*.dtso", "*.its"], Elm => &["*.elm"], EmacsLisp => &["*.el", ".emacs", "_emacs", "Cask"], Elixir => &["*.ex", "*.exs"], diff --git a/src/parse/tree_sitter_parser.rs b/src/parse/tree_sitter_parser.rs index 86f8a27f8..5d9f3a55e 100644 --- a/src/parse/tree_sitter_parser.rs +++ b/src/parse/tree_sitter_parser.rs @@ -71,6 +71,7 @@ extern "C" { fn tree_sitter_commonlisp() -> ts::Language; fn tree_sitter_css() -> ts::Language; fn tree_sitter_dart() -> ts::Language; + fn tree_sitter_devicetree() -> ts::Language; fn tree_sitter_elisp() -> ts::Language; fn tree_sitter_elixir() -> ts::Language; fn tree_sitter_elm() -> ts::Language; @@ -314,6 +315,22 @@ pub(crate) fn from_language(language: guess::Language) -> TreeSitterConfig { sub_languages: vec![], } } + Devicetree => { + let language = unsafe { tree_sitter_devicetree() }; + TreeSitterConfig { + language, + atom_nodes: vec!["byte_string_literal", "string_literal"] + .into_iter() + .collect(), + delimiter_tokens: vec![("<", ">"), ("{", "}"), ("(", ")")], + highlight_query: ts::Query::new( + language, + include_str!("../../vendored_parsers/highlights/devicetree.scm"), + ) + .unwrap(), + sub_languages: vec![], + } + } EmacsLisp => { let language = unsafe { tree_sitter_elisp() }; TreeSitterConfig { diff --git a/vendored_parsers/highlights/devicetree.scm b/vendored_parsers/highlights/devicetree.scm new file mode 120000 index 000000000..624abd669 --- /dev/null +++ b/vendored_parsers/highlights/devicetree.scm @@ -0,0 +1 @@ +../tree-sitter-devicetree/queries/highlights.scm \ No newline at end of file diff --git a/vendored_parsers/tree-sitter-devicetree-src b/vendored_parsers/tree-sitter-devicetree-src new file mode 120000 index 000000000..ca87aa2df --- /dev/null +++ b/vendored_parsers/tree-sitter-devicetree-src @@ -0,0 +1 @@ +tree-sitter-devicetree/src/ \ No newline at end of file