diff --git a/Cargo.lock b/Cargo.lock index 67ebe26b46..293179305e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -283,6 +283,7 @@ dependencies = [ "tree-sitter-clojure-orchard", "tree-sitter-cmake", "tree-sitter-commonlisp", + "tree-sitter-containerfile", "tree-sitter-cpp", "tree-sitter-css", "tree-sitter-dart-orchard", @@ -1109,6 +1110,16 @@ dependencies = [ "tree-sitter-language", ] +[[package]] +name = "tree-sitter-containerfile" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1555ef425ecf06d7f65d58b3f9d3db3bb7fbd4ad135b4e7e40f194b0859ea16f" +dependencies = [ + "cc", + "tree-sitter-language", +] + [[package]] name = "tree-sitter-cpp" version = "0.23.4" diff --git a/Cargo.toml b/Cargo.toml index 9a580ae7e6..f7fd64fa72 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -82,6 +82,7 @@ tree-sitter-c = "0.24" tree-sitter-c-sharp = "0.23.1" tree-sitter-clojure-orchard = "0.2.5" tree-sitter-cmake = "0.7.1" +tree-sitter-containerfile = "0.8.0" tree-sitter-cpp = "0.23.4" tree-sitter-css = "0.25.0" tree-sitter-dart-orchard = "0.3.0" diff --git a/src/parse/guess_language.rs b/src/parse/guess_language.rs index 111712553e..51a06088db 100644 --- a/src/parse/guess_language.rs +++ b/src/parse/guess_language.rs @@ -32,6 +32,7 @@ pub(crate) enum Language { Css, Dart, DeviceTree, + Dockerfile, Elixir, Elm, Elvish, @@ -134,6 +135,7 @@ pub(crate) fn language_name(language: Language) -> &'static str { Css => "CSS", Dart => "Dart", DeviceTree => "Device Tree", + Dockerfile => "Dockerfile", Elixir => "Elixir", Elm => "Elm", Elvish => "Elvish", @@ -266,6 +268,7 @@ pub(crate) fn language_globs(language: Language) -> Vec { Css => &["*.css"], Dart => &["*.dart"], DeviceTree => &["*.dts", "*.dtsi", "*.dtso", "*.its"], + Dockerfile => &["Dockerfile", "Containerfile"], 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 3c33adb9c4..ae1f35a339 100644 --- a/src/parse/tree_sitter_parser.rs +++ b/src/parse/tree_sitter_parser.rs @@ -333,6 +333,41 @@ pub(crate) fn from_language(language: guess::Language) -> TreeSitterConfig { sub_languages: vec![], } } + Dockerfile => { + let language_fn = tree_sitter_containerfile::LANGUAGE; + let language = tree_sitter::Language::new(language_fn); + TreeSitterConfig { + language: language.clone(), + atom_nodes: [ + "shell_command", + "json_string_array", + "json_string", + "double_quoted_string", + "single_quoted_string", + "unquoted_string", + "env_pair", + "image_name", + "image_tag", + "image_digest", + ] + .into_iter() + .collect(), + delimiter_tokens: vec![ + ("[", "]"), + ("{", "}"), + ("(", ")"), + ("\"", "\""), + ("<<", ">>"), + ], + ignore_trailing_tokens: vec![], + highlight_query: ts::Query::new( + &language, + tree_sitter_containerfile::HIGHLIGHTS_QUERY, + ) + .unwrap(), + sub_languages: vec![], + } + } Elixir => { let language_fn = tree_sitter_elixir::LANGUAGE; let language = tree_sitter::Language::new(language_fn);