From 48d334fce9a92c2b50c946fc32d23ad5d6800f3c Mon Sep 17 00:00:00 2001 From: Marc Jakobi Date: Wed, 27 Mar 2024 22:06:33 +0100 Subject: [PATCH] feat: support query packages without parser sources --- fixtures/tree-sitter-html_tags-scm-1.rockspec | 271 ++++++++++++++++++ flake.nix | 4 +- nix/overlay.nix | 21 ++ src/luarocks/build/treesitter-parser.lua | 14 +- 4 files changed, 303 insertions(+), 7 deletions(-) create mode 100644 fixtures/tree-sitter-html_tags-scm-1.rockspec diff --git a/fixtures/tree-sitter-html_tags-scm-1.rockspec b/fixtures/tree-sitter-html_tags-scm-1.rockspec new file mode 100644 index 0000000..9e6aff7 --- /dev/null +++ b/fixtures/tree-sitter-html_tags-scm-1.rockspec @@ -0,0 +1,271 @@ +local git_ref = '548853648d7cff7e0d959ff95209e8aa97a793bc' +local modrev = 'scm' +local specrev = '1' + +local repo_url = 'https://github.com/nvim-neorocks/luarocks-stub' + +rockspec_format = '3.0' +package = 'tree-sitter-html_tags' +version = modrev ..'-'.. specrev + +description = { + summary = 'tree-sitter parser for html_tags', + labels = { 'neovim', 'tree-sitter' } , + homepage = 'https://github.com/nvim-neorocks/luarocks-stub', + license = 'Apache-2.0' +} + +dependencies = { + 'luarocks-build-treesitter-parser >= 1.1.1', +} + +source = { + url = repo_url .. '/archive/' .. git_ref .. '.zip', + dir = 'luarocks-stub-' .. '548853648d7cff7e0d959ff95209e8aa97a793bc', +} + +build = { + type = "treesitter-parser", + lang = "html_tags", + sources = {}, + queries = { + ["highlights.scm"] = [==[ +(tag_name) @tag + +; (erroneous_end_tag_name) @error ; we do not lint syntax errors +(comment) @comment @spell + +(attribute_name) @tag.attribute + +((attribute + (quoted_attribute_value) @string) + (#set! "priority" 99)) + +(text) @none @spell + +((element + (start_tag + (tag_name) @_tag) + (text) @markup.heading) + (#eq? @_tag "title")) + +((element + (start_tag + (tag_name) @_tag) + (text) @markup.heading.1) + (#eq? @_tag "h1")) + +((element + (start_tag + (tag_name) @_tag) + (text) @markup.heading.2) + (#eq? @_tag "h2")) + +((element + (start_tag + (tag_name) @_tag) + (text) @markup.heading.3) + (#eq? @_tag "h3")) + +((element + (start_tag + (tag_name) @_tag) + (text) @markup.heading.4) + (#eq? @_tag "h4")) + +((element + (start_tag + (tag_name) @_tag) + (text) @markup.heading.5) + (#eq? @_tag "h5")) + +((element + (start_tag + (tag_name) @_tag) + (text) @markup.heading.6) + (#eq? @_tag "h6")) + +((element + (start_tag + (tag_name) @_tag) + (text) @markup.strong) + (#any-of? @_tag "strong" "b")) + +((element + (start_tag + (tag_name) @_tag) + (text) @markup.italic) + (#any-of? @_tag "em" "i")) + +((element + (start_tag + (tag_name) @_tag) + (text) @markup.strikethrough) + (#any-of? @_tag "s" "del")) + +((element + (start_tag + (tag_name) @_tag) + (text) @markup.underline) + (#eq? @_tag "u")) + +((element + (start_tag + (tag_name) @_tag) + (text) @markup.raw) + (#any-of? @_tag "code" "kbd")) + +((element + (start_tag + (tag_name) @_tag) + (text) @string.special.url) + (#eq? @_tag "a")) + +((attribute + (attribute_name) @_attr + (quoted_attribute_value + (attribute_value) @string.special.url)) + (#any-of? @_attr "href" "src")) + +[ + "<" + ">" + "" +] @tag.delimiter + +"=" @operator +]==], + ["indents.scm"] = [==[ +[ + ((element + (start_tag + (tag_name) @_not_special)) + (#not-any-of? @_not_special "meta" "link")) + (element + (self_closing_tag)) +] @indent.begin + +; These tags are usually written one-lined and doesn't use self-closing tags so special-cased them +; but add indent to the tag to make sure attributes inside them are still indented if written multi-lined +((start_tag + (tag_name) @_special) + (#any-of? @_special "meta" "link")) @indent.begin + +; These are the nodes that will be captured when we do `normal o` +; But last element has already been ended, so capturing this +; to mark end of last element +(element + (end_tag + ">" @indent.end)) + +(element + (self_closing_tag + "/>" @indent.end)) + +; Script/style elements aren't indented, so only branch the end tag of other elements +(element + (end_tag) @indent.branch) + +[ + ">" + "/>" +] @indent.branch + +(comment) @indent.ignore +]==], + ["injections.scm"] = [==[ +((comment) @injection.content + (#set! injection.language "comment")) + +; +; +; Add "lang" to predicate check so that vue/svelte can inherit this +; without having this element being captured twice +((style_element + (start_tag) @_no_type_lang + (raw_text) @injection.content) + (#not-lua-match? @_no_type_lang "%slang%s*=") + (#not-lua-match? @_no_type_lang "%stype%s*=") + (#set! injection.language "css")) + +((style_element + (start_tag + (attribute + (attribute_name) @_type + (quoted_attribute_value + (attribute_value) @_css))) + (raw_text) @injection.content) + (#eq? @_type "type") + (#eq? @_css "text/css") + (#set! injection.language "css")) + +; +; +((script_element + (start_tag) @_no_type_lang + (raw_text) @injection.content) + (#not-lua-match? @_no_type_lang "%slang%s*=") + (#not-lua-match? @_no_type_lang "%stype%s*=") + (#set! injection.language "javascript")) + +;