diff --git a/Cargo.lock b/Cargo.lock index 075d683c2..020fda059 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -295,6 +295,7 @@ dependencies = [ "tree-sitter-ocaml", "tree-sitter-pascal", "tree-sitter-php", + "tree-sitter-proto", "tree-sitter-python", "tree-sitter-ruby", "tree-sitter-rust-orchard", @@ -1224,6 +1225,16 @@ dependencies = [ "tree-sitter-language", ] +[[package]] +name = "tree-sitter-proto" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e4360b434b5980fc397137ef29e1988619fef4159ac86fa7ac5777d459d3924" +dependencies = [ + "cc", + "tree-sitter-language", +] + [[package]] name = "tree-sitter-python" version = "0.23.5" diff --git a/Cargo.toml b/Cargo.toml index 1ca422bda..c95b1d521 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -98,6 +98,7 @@ tree-sitter-objc = "3.0.2" tree-sitter-ocaml = "0.23.2" tree-sitter-pascal = "0.10.0" tree-sitter-php = "0.23.11" +tree-sitter-proto = "0.2.0" tree-sitter-python = "0.23.5" tree-sitter-ruby = "0.23.1" tree-sitter-rust-orchard = "0.13.0" diff --git a/src/parse/guess_language.rs b/src/parse/guess_language.rs index d714550bc..0f0a01625 100644 --- a/src/parse/guess_language.rs +++ b/src/parse/guess_language.rs @@ -61,6 +61,7 @@ pub(crate) enum Language { Pascal, Perl, Php, + Proto, Python, Qml, R, @@ -161,6 +162,7 @@ pub(crate) fn language_name(language: Language) -> &'static str { Pascal => "Pascal", Perl => "Perl", Php => "PHP", + Proto => "Proto", Python => "Python", Qml => "QML", R => "R", @@ -354,6 +356,7 @@ pub(crate) fn language_globs(language: Language) -> Vec { Php => &[ "*.php", "*.phtml", "*.php3", "*.php4", "*.php5", "*.php7", "*.phps", ], + Proto => &["*.proto"], Python => &["*.py", "*.py3", "*.pyi", "*.bzl", "TARGETS", "BUCK", "DEPS"], Qml => &["*.qml"], R => &["*.R", "*.r", "*.rd", "*.rsx", ".Rprofile", "expr-dist"], diff --git a/src/parse/tree_sitter_parser.rs b/src/parse/tree_sitter_parser.rs index 97408f77b..9b6f25ba5 100644 --- a/src/parse/tree_sitter_parser.rs +++ b/src/parse/tree_sitter_parser.rs @@ -839,6 +839,21 @@ pub(crate) fn from_language(language: guess::Language) -> TreeSitterConfig { sub_languages: vec![], } } + Proto => { + let language_fn = tree_sitter_proto::LANGUAGE; + let language = tree_sitter::Language::new(language_fn); + TreeSitterConfig { + language: language.clone(), + atom_nodes: ["string"].into_iter().collect(), + delimiter_tokens: vec![("{", "}")], + highlight_query: ts::Query::new( + &language, + include_str!("../../vendored_parsers/highlights/proto.scm"), + ) + .unwrap(), + sub_languages: vec![], + } + } Python => { let language_fn = tree_sitter_python::LANGUAGE; let language = tree_sitter::Language::new(language_fn); diff --git a/vendored_parsers/highlights/proto.scm b/vendored_parsers/highlights/proto.scm new file mode 100644 index 000000000..d2893f146 --- /dev/null +++ b/vendored_parsers/highlights/proto.scm @@ -0,0 +1,48 @@ +[ + "syntax" + "edition" + "package" + "option" + "import" + "service" + "rpc" + "returns" + "message" + "enum" + "oneof" + "repeated" + "reserved" + "to" +] @keyword + +[ + (key_type) + (type) + (message_name) + (enum_name) + (service_name) + (rpc_name) +]@type + +(string) @string + +[ + (int_lit) + (float_lit) +] @number + +[ + (true) + (false) +] @constant.builtin + +(comment) @comment + +[ + "(" + ")" + "[" + "]" + "{" + "}" +] @punctuation.bracket