Add Heex language

This commit is contained in:
Max Brunsfeld 2023-06-12 16:29:59 -07:00
parent 01bd5c30fc
commit df76ab98cf
8 changed files with 195 additions and 104 deletions

10
Cargo.lock generated
View file

@ -7423,6 +7423,15 @@ dependencies = [
"tree-sitter", "tree-sitter",
] ]
[[package]]
name = "tree-sitter-heex"
version = "0.0.1"
source = "git+https://github.com/phoenixframework/tree-sitter-heex?rev=2e1348c3cf2c9323e87c2744796cf3f3868aa82a#2e1348c3cf2c9323e87c2744796cf3f3868aa82a"
dependencies = [
"cc",
"tree-sitter",
]
[[package]] [[package]]
name = "tree-sitter-html" name = "tree-sitter-html"
version = "0.19.0" version = "0.19.0"
@ -8876,6 +8885,7 @@ dependencies = [
"tree-sitter-elixir", "tree-sitter-elixir",
"tree-sitter-embedded-template", "tree-sitter-embedded-template",
"tree-sitter-go", "tree-sitter-go",
"tree-sitter-heex",
"tree-sitter-html", "tree-sitter-html",
"tree-sitter-json 0.20.0", "tree-sitter-json 0.20.0",
"tree-sitter-lua", "tree-sitter-lua",

View file

@ -109,6 +109,7 @@ tree-sitter-css = { git = "https://github.com/tree-sitter/tree-sitter-css", rev
tree-sitter-elixir = { git = "https://github.com/elixir-lang/tree-sitter-elixir", rev = "4ba9dab6e2602960d95b2b625f3386c27e08084e" } tree-sitter-elixir = { git = "https://github.com/elixir-lang/tree-sitter-elixir", rev = "4ba9dab6e2602960d95b2b625f3386c27e08084e" }
tree-sitter-embedded-template = "0.20.0" tree-sitter-embedded-template = "0.20.0"
tree-sitter-go = { git = "https://github.com/tree-sitter/tree-sitter-go", rev = "aeb2f33b366fd78d5789ff104956ce23508b85db" } tree-sitter-go = { git = "https://github.com/tree-sitter/tree-sitter-go", rev = "aeb2f33b366fd78d5789ff104956ce23508b85db" }
tree-sitter-heex = { git = "https://github.com/phoenixframework/tree-sitter-heex", rev = "2e1348c3cf2c9323e87c2744796cf3f3868aa82a" }
tree-sitter-json = { git = "https://github.com/tree-sitter/tree-sitter-json", rev = "40a81c01a40ac48744e0c8ccabbaba1920441199" } tree-sitter-json = { git = "https://github.com/tree-sitter/tree-sitter-json", rev = "40a81c01a40ac48744e0c8ccabbaba1920441199" }
tree-sitter-rust = "0.20.3" tree-sitter-rust = "0.20.3"
tree-sitter-markdown = { git = "https://github.com/MDeiml/tree-sitter-markdown", rev = "330ecab87a3e3a7211ac69bbadc19eabecdb1cca" } tree-sitter-markdown = { git = "https://github.com/MDeiml/tree-sitter-markdown", rev = "330ecab87a3e3a7211ac69bbadc19eabecdb1cca" }

View file

@ -34,110 +34,109 @@ mod yaml;
struct LanguageDir; struct LanguageDir;
pub fn init(languages: Arc<LanguageRegistry>, node_runtime: Arc<NodeRuntime>) { pub fn init(languages: Arc<LanguageRegistry>, node_runtime: Arc<NodeRuntime>) {
fn adapter_arc(adapter: impl LspAdapter) -> Arc<dyn LspAdapter> { let language = |name, grammar, adapters| {
Arc::new(adapter) languages.register(name, load_config(name), grammar, adapters, load_queries)
} };
let languages_list = [ language(
( "c",
"c", tree_sitter_c::language(),
tree_sitter_c::language(), vec![Arc::new(c::CLspAdapter) as Arc<dyn LspAdapter>],
vec![adapter_arc(c::CLspAdapter)], );
), language(
( "cpp",
"cpp", tree_sitter_cpp::language(),
tree_sitter_cpp::language(), vec![Arc::new(c::CLspAdapter)],
vec![adapter_arc(c::CLspAdapter)], );
), language("css", tree_sitter_css::language(), vec![]);
("css", tree_sitter_css::language(), vec![]), language(
( "elixir",
"elixir", tree_sitter_elixir::language(),
tree_sitter_elixir::language(), vec![Arc::new(elixir::ElixirLspAdapter)],
vec![adapter_arc(elixir::ElixirLspAdapter)], );
), language(
( "go",
"go", tree_sitter_go::language(),
tree_sitter_go::language(), vec![Arc::new(go::GoLspAdapter)],
vec![adapter_arc(go::GoLspAdapter)], );
), language(
( "heex",
"json", tree_sitter_heex::language(),
tree_sitter_json::language(), vec![Arc::new(elixir::ElixirLspAdapter)],
vec![adapter_arc(json::JsonLspAdapter::new( );
node_runtime.clone(), language(
languages.clone(), "json",
))], tree_sitter_json::language(),
), vec![Arc::new(json::JsonLspAdapter::new(
("markdown", tree_sitter_markdown::language(), vec![]), node_runtime.clone(),
( languages.clone(),
"python", ))],
tree_sitter_python::language(), );
vec![adapter_arc(python::PythonLspAdapter::new( language("markdown", tree_sitter_markdown::language(), vec![]);
node_runtime.clone(), language(
))], "python",
), tree_sitter_python::language(),
( vec![Arc::new(python::PythonLspAdapter::new(
"rust", node_runtime.clone(),
tree_sitter_rust::language(), ))],
vec![adapter_arc(rust::RustLspAdapter)], );
), language(
("toml", tree_sitter_toml::language(), vec![]), "rust",
( tree_sitter_rust::language(),
"tsx", vec![Arc::new(rust::RustLspAdapter)],
tree_sitter_typescript::language_tsx(), );
vec![ language("toml", tree_sitter_toml::language(), vec![]);
adapter_arc(typescript::TypeScriptLspAdapter::new(node_runtime.clone())), language(
adapter_arc(typescript::EsLintLspAdapter::new(node_runtime.clone())), "tsx",
], tree_sitter_typescript::language_tsx(),
), vec![
( Arc::new(typescript::TypeScriptLspAdapter::new(node_runtime.clone())),
"typescript", Arc::new(typescript::EsLintLspAdapter::new(node_runtime.clone())),
tree_sitter_typescript::language_typescript(), ],
vec![ );
adapter_arc(typescript::TypeScriptLspAdapter::new(node_runtime.clone())), language(
adapter_arc(typescript::EsLintLspAdapter::new(node_runtime.clone())), "typescript",
], tree_sitter_typescript::language_typescript(),
), vec![
( Arc::new(typescript::TypeScriptLspAdapter::new(node_runtime.clone())),
"javascript", Arc::new(typescript::EsLintLspAdapter::new(node_runtime.clone())),
tree_sitter_typescript::language_tsx(), ],
vec![ );
adapter_arc(typescript::TypeScriptLspAdapter::new(node_runtime.clone())), language(
adapter_arc(typescript::EsLintLspAdapter::new(node_runtime.clone())), "javascript",
], tree_sitter_typescript::language_tsx(),
), vec![
( Arc::new(typescript::TypeScriptLspAdapter::new(node_runtime.clone())),
"html", Arc::new(typescript::EsLintLspAdapter::new(node_runtime.clone())),
tree_sitter_html::language(), ],
vec![adapter_arc(html::HtmlLspAdapter::new(node_runtime.clone()))], );
), language(
( "html",
"ruby", tree_sitter_html::language(),
tree_sitter_ruby::language(), vec![Arc::new(html::HtmlLspAdapter::new(node_runtime.clone()))],
vec![adapter_arc(ruby::RubyLanguageServer)], );
), language(
( "ruby",
"erb", tree_sitter_ruby::language(),
tree_sitter_embedded_template::language(), vec![Arc::new(ruby::RubyLanguageServer)],
vec![adapter_arc(ruby::RubyLanguageServer)], );
), language(
("scheme", tree_sitter_scheme::language(), vec![]), "erb",
("racket", tree_sitter_racket::language(), vec![]), tree_sitter_embedded_template::language(),
( vec![Arc::new(ruby::RubyLanguageServer)],
"lua", );
tree_sitter_lua::language(), language("scheme", tree_sitter_scheme::language(), vec![]);
vec![adapter_arc(lua::LuaLspAdapter)], language("racket", tree_sitter_racket::language(), vec![]);
), language(
( "lua",
"yaml", tree_sitter_lua::language(),
tree_sitter_yaml::language(), vec![Arc::new(lua::LuaLspAdapter)],
vec![adapter_arc(yaml::YamlLspAdapter::new(node_runtime))], );
), language(
]; "yaml",
tree_sitter_yaml::language(),
for (name, grammar, lsp_adapters) in languages_list { vec![Arc::new(yaml::YamlLspAdapter::new(node_runtime))],
languages.register(name, load_config(name), grammar, lsp_adapters, load_queries); );
}
} }
#[cfg(any(test, feature = "test-support"))] #[cfg(any(test, feature = "test-support"))]

View file

@ -0,0 +1,7 @@
; Phoenix HTML template
((sigil
(sigil_name) @_sigil_name
(quoted_content) @content)
(#eq? @_sigil_name "H")
(#set! language "heex"))

View file

@ -9,4 +9,4 @@
"%>" "%>"
"-%>" "-%>"
"_%>" "_%>"
] @keyword ] @keyword

View file

@ -0,0 +1,7 @@
name = "HEEX"
path_suffixes = ["heex"]
autoclose_before = ">})"
brackets = [
{ start = "<", end = ">", close = true, newline = true },
]
block_comment = ["<%#", "%>"]

View file

@ -0,0 +1,54 @@
; HEEx delimiters
[
"%>"
"--%>"
"-->"
"/>"
"<!"
"<!--"
"<"
"<%!--"
"<%"
"<%#"
"<%%="
"<%="
"</"
"</:"
"<:"
">"
"{"
"}"
] @punctuation.bracket
; HEEx operators are highlighted as such
"=" @operator
; HEEx inherits the DOCTYPE tag from HTML
(doctype) @constant
(comment) @comment
; HEEx tags and slots are highlighted as HTML
[
(tag_name)
(slot_name)
] @tag
; HEEx attributes are highlighted as HTML attributes
(attribute_name) @attribute
; HEEx special attributes are highlighted as keywords
(special_attribute_name) @keyword
[
(attribute_value)
(quoted_attribute_value)
] @string
; HEEx components are highlighted as Elixir modules and functions
(component_name
[
(module) @module
(function) @function
"." @punctuation.delimiter
])

View file

@ -0,0 +1,13 @@
((directive (partial_expression_value) @content)
(#set! language "elixir")
(#set! include-children)
(#set! combined))
; Regular expression_values do not need to be combined
((directive (expression_value) @content)
(#set! language "elixir"))
; expressions live within HTML tags, and do not need to be combined
; <link href={ Routes.static_path(..) } />
((expression (expression_value) @content)
(#set! language "elixir"))