diff options
| author | Heitor Augusto <44377258+HeitorAugustoLN@users.noreply.github.com> | 2026-01-18 16:54:59 -0300 |
|---|---|---|
| committer | Heitor Augusto <44377258+HeitorAugustoLN@users.noreply.github.com> | 2026-01-18 17:01:26 -0300 |
| commit | c9d3c16463214ba220a586b2b4a7154fc7c30532 (patch) | |
| tree | cf60ae538d5f0ed8de2e38d37c0c04ccba2586b5 | |
| parent | 46e6cf2e4e92888a2eef6b393c7219eac4a5a612 (diff) | |
vimPlugins.nvim-treesitter: add parser and query dependencies
3 files changed, 273 insertions, 24 deletions
diff --git a/pkgs/applications/editors/vim/plugins/nvim-treesitter/generated.nix b/pkgs/applications/editors/vim/plugins/nvim-treesitter/generated.nix index 86decf313fdb..01e2eb329ffa 100644 --- a/pkgs/applications/editors/vim/plugins/nvim-treesitter/generated.nix +++ b/pkgs/applications/editors/vim/plugins/nvim-treesitter/generated.nix @@ -52,6 +52,9 @@ rev = "3bd2036e710f609ea08fcfca5a1eb1169ecc114f"; hash = "sha256-VdfPZ39AEjvl+9r/LZNRGNIQsiTB9S065AnUc4MeohU="; }; + passthru.requires = [ + "html" + ]; meta.homepage = "https://github.com/dlvandenberg/tree-sitter-angular"; }; apex = buildGrammar { @@ -75,6 +78,9 @@ rev = "53eb391da4c6c5857f8defa2c583c46c2594f565"; hash = "sha256-qQVUWCOZ4y9FTsIf0FI3vmYBhLYz4hcqRTo+5C2MYvc="; }; + passthru.requires = [ + "cpp" + ]; meta.homepage = "https://github.com/tree-sitter-grammars/tree-sitter-arduino"; }; asm = buildGrammar { @@ -97,6 +103,9 @@ rev = "213f6e6973d9b456c6e50e86f19f66877e7ef0ee"; hash = "sha256-TpXs3jbYn39EHxTdtSfR7wLA1L8v9uyK/ATPp5v4WqE="; }; + passthru.requires = [ + "html" + ]; meta.homepage = "https://github.com/virchau13/tree-sitter-astro"; }; authzed = buildGrammar { @@ -405,6 +414,9 @@ rev = "12bd6f7e96080d2e70ec51d4068f2f66120dde35"; hash = "sha256-vmXTv6Idf0Le5ZVa8Rc1DVefqzUxkGeLGsYcSDNBpQU="; }; + passthru.requires = [ + "c" + ]; meta.homepage = "https://github.com/tree-sitter/tree-sitter-cpp"; }; css = buildGrammar { @@ -428,6 +440,9 @@ hash = "sha256-9mW0kT4av/ULFqLXdMuyLrMPtQxrIOKY60GQ4QDB33o="; }; location = "csv"; + passthru.requires = [ + "tsv" + ]; meta.homepage = "https://github.com/tree-sitter-grammars/tree-sitter-csv"; }; cuda = buildGrammar { @@ -439,6 +454,9 @@ rev = "48b066f334f4cf2174e05a50218ce2ed98b6fd01"; hash = "sha256-sX9AOe8dJJsRbzGq20qakWBnLiwYQ90mQspAuYxQzoQ="; }; + passthru.requires = [ + "cpp" + ]; meta.homepage = "https://github.com/tree-sitter-grammars/tree-sitter-cuda"; }; cue = buildGrammar { @@ -882,6 +900,9 @@ rev = "69086d7627c03e1f4baf766bcef14c60d9e92331"; hash = "sha256-U0P9QoOZST1h6XI83CI0/6/CDTvqkv1Yiq62h6YdHpI="; }; + passthru.requires = [ + "gap" + ]; meta.homepage = "https://github.com/gap-system/tree-sitter-gaptst"; }; gdscript = buildGrammar { @@ -1003,6 +1024,9 @@ rev = "12d98944c1d5077b957cbdb90d663a7c4d50118c"; hash = "sha256-3cJI6vcbU62kUIhphprNeAl9RyY9TThrzVeArdLfxnI="; }; + passthru.requires = [ + "typescript" + ]; meta.homepage = "https://github.com/NullVoxPopuli/tree-sitter-glimmer-typescript"; }; glsl = buildGrammar { @@ -1014,6 +1038,9 @@ rev = "24a6c8ef698e4480fecf8340d771fbcb5de8fbb4"; hash = "sha256-TjF79WH3bX4nueYr8CbPptkNb2lNkHQNB0VZoMB35Nk="; }; + passthru.requires = [ + "c" + ]; meta.homepage = "https://github.com/tree-sitter-grammars/tree-sitter-glsl"; }; gn = buildGrammar { @@ -1268,6 +1295,9 @@ rev = "02fa3b79b3ff9a296066da6277adfc3f26cbc9e0"; hash = "sha256-NsTf3DR3gHVMYZDmTNvThB5bJcDwTcJ1+3eJhvsiDn8="; }; + passthru.requires = [ + "json" + ]; meta.homepage = "https://github.com/winston0410/tree-sitter-hjson"; }; hlsl = buildGrammar { @@ -1279,6 +1309,9 @@ rev = "bab9111922d53d43668fabb61869bec51bbcb915"; hash = "sha256-BWjgXtMN6y/0ahD44Cm8a+MxxVMpCNhkf33V/vsCBTU="; }; + passthru.requires = [ + "cpp" + ]; meta.homepage = "https://github.com/tree-sitter-grammars/tree-sitter-hlsl"; }; hlsplaylist = buildGrammar { @@ -1422,6 +1455,9 @@ rev = "9b2f9aec2106b94b4e099fe75e73ebd8ae707c04"; hash = "sha256-vxe+g7o0gXgB4GjhjkxqLqcLL2+8wqMB3tm1xQFSitI="; }; + passthru.requires = [ + "c" + ]; meta.homepage = "https://github.com/tree-sitter-grammars/tree-sitter-ispc"; }; janet_simple = buildGrammar { @@ -1478,6 +1514,9 @@ hash = "sha256-a4/+tsouuYkkVEStpOEUiIos9H4Hw7NhJOFaasylWUk="; }; location = "tree-sitter-jinja"; + passthru.requires = [ + "jinja_inline" + ]; meta.homepage = "https://github.com/cathaysia/tree-sitter-jinja"; }; jinja_inline = buildGrammar { @@ -1788,6 +1827,9 @@ rev = "a8914d6c1fc5131f8e1c13f769fa704c9f5eb02f"; hash = "sha256-5qbZA2mxTvrsfUrpgD+4y3oeJsifA91c/hfcVwQBRgI="; }; + passthru.requires = [ + "lua" + ]; meta.homepage = "https://github.com/tree-sitter-grammars/tree-sitter-luau"; }; m68k = buildGrammar { @@ -1822,6 +1864,9 @@ hash = "sha256-IYqh6JT74deu1UU4Nyls9Eg88BvQeYEta2UXZAbuZek="; }; location = "tree-sitter-markdown"; + passthru.requires = [ + "markdown_inline" + ]; meta.homepage = "https://github.com/tree-sitter-grammars/tree-sitter-markdown"; }; markdown_inline = buildGrammar { @@ -1945,6 +1990,9 @@ rev = "4ad352773688deb84a95eeaa9872acda5b466439"; hash = "sha256-dinMmbD36o1QkcLk2mgycgHZ9sW5Mg6lfnxssynaj58="; }; + passthru.requires = [ + "nim_format_string" + ]; meta.homepage = "https://github.com/alaviss/tree-sitter-nim"; }; nim_format_string = buildGrammar { @@ -2011,6 +2059,9 @@ rev = "181a81b8f23a2d593e7ab4259981f50122909fda"; hash = "sha256-7W8ozhQJL+f+tQYz61EZexk9NkMu1pCAP5IIy1m3qak="; }; + passthru.requires = [ + "c" + ]; meta.homepage = "https://github.com/tree-sitter-grammars/tree-sitter-objc"; }; objdump = buildGrammar { @@ -2046,6 +2097,9 @@ hash = "sha256-8u1jtUFMjykVG6aCDzqcb4vFCY401CZ2o+JPGMadg6o="; }; location = "grammars/interface"; + passthru.requires = [ + "ocaml" + ]; meta.homepage = "https://github.com/tree-sitter/tree-sitter-ocaml"; }; ocamllex = buildGrammar { @@ -2125,6 +2179,9 @@ hash = "sha256-XEKlsqC7HJ3mShmcwmfpezNP9DHE8f73f7/ru4MuxEo="; }; location = "php"; + passthru.requires = [ + "php_only" + ]; meta.homepage = "https://github.com/tree-sitter/tree-sitter-php"; }; php_only = buildGrammar { @@ -2259,6 +2316,9 @@ hash = "sha256-SEqqmkfV/wsr1ObcBN5My29RY9TWfxnQlsnEEIZyR18="; }; location = "grammars/problog"; + passthru.requires = [ + "prolog" + ]; meta.homepage = "https://github.com/foxyseta/tree-sitter-prolog"; }; prolog = buildGrammar { @@ -2327,6 +2387,9 @@ hash = "sha256-9mW0kT4av/ULFqLXdMuyLrMPtQxrIOKY60GQ4QDB33o="; }; location = "psv"; + passthru.requires = [ + "tsv" + ]; meta.homepage = "https://github.com/tree-sitter-grammars/tree-sitter-csv"; }; pug = buildGrammar { @@ -2712,6 +2775,9 @@ rev = "c478c6868648eff49eb04a4df90d703dc45b312a"; hash = "sha256-BFtMT6eccBWUyq6b8UXRAbB1R1XD3CrrFf1DM3aUI5c="; }; + passthru.requires = [ + "css" + ]; meta.homepage = "https://github.com/serenadeai/tree-sitter-scss"; }; sflog = buildGrammar { @@ -3126,6 +3192,9 @@ hash = "sha256-Kq0KtkF6xtZcN2s8KzYGyguJH2iOTlA2WRytZ+KGTUE="; }; location = "dialects/terraform"; + passthru.requires = [ + "hcl" + ]; meta.homepage = "https://github.com/MichaHoffmann/tree-sitter-hcl"; }; textproto = buildGrammar { @@ -3227,6 +3296,9 @@ hash = "sha256-A0M6IBoY87ekSV4DfGHDU5zzFWdLjGqSyVr6VENgA+s="; }; location = "tsx"; + passthru.requires = [ + "typescript" + ]; meta.homepage = "https://github.com/tree-sitter/tree-sitter-typescript"; }; turtle = buildGrammar { @@ -3528,6 +3600,9 @@ hash = "sha256-0ztP30xWqVWy5upWPp0JwhpQphOJufzlcYn+KvLejVs="; }; location = "xml"; + passthru.requires = [ + "dtd" + ]; meta.homepage = "https://github.com/tree-sitter-grammars/tree-sitter-xml"; }; xresources = buildGrammar { @@ -3642,18 +3717,29 @@ }; angular = buildQueries { language = "angular"; + requires = [ + "html" + "html_tags" + ]; }; apex = buildQueries { language = "apex"; }; arduino = buildQueries { language = "arduino"; + requires = [ + "cpp" + ]; }; asm = buildQueries { language = "asm"; }; astro = buildQueries { language = "astro"; + requires = [ + "html" + "html_tags" + ]; }; authzed = buildQueries { language = "authzed"; @@ -3738,15 +3824,24 @@ }; cpp = buildQueries { language = "cpp"; + requires = [ + "c" + ]; }; css = buildQueries { language = "css"; }; csv = buildQueries { language = "csv"; + requires = [ + "tsv" + ]; }; cuda = buildQueries { language = "cuda"; + requires = [ + "cpp" + ]; }; cue = buildQueries { language = "cue"; @@ -3870,6 +3965,9 @@ }; gaptst = buildQueries { language = "gaptst"; + requires = [ + "gap" + ]; }; gdscript = buildQueries { language = "gdscript"; @@ -3900,12 +3998,21 @@ }; glimmer_javascript = buildQueries { language = "glimmer_javascript"; + requires = [ + "ecma" + ]; }; glimmer_typescript = buildQueries { language = "glimmer_typescript"; + requires = [ + "typescript" + ]; }; glsl = buildQueries { language = "glsl"; + requires = [ + "c" + ]; }; gn = buildQueries { language = "gn"; @@ -3975,9 +4082,15 @@ }; hjson = buildQueries { language = "hjson"; + requires = [ + "json" + ]; }; hlsl = buildQueries { language = "hlsl"; + requires = [ + "cpp" + ]; }; hlsplaylist = buildQueries { language = "hlsplaylist"; @@ -3990,6 +4103,9 @@ }; html = buildQueries { language = "html"; + requires = [ + "html_tags" + ]; }; html_tags = buildQueries { language = "html_tags"; @@ -4020,6 +4136,9 @@ }; ispc = buildQueries { language = "ispc"; + requires = [ + "c" + ]; }; janet_simple = buildQueries { language = "janet_simple"; @@ -4032,9 +4151,16 @@ }; javascript = buildQueries { language = "javascript"; + requires = [ + "ecma" + "jsx" + ]; }; jinja = buildQueries { language = "jinja"; + requires = [ + "jinja_inline" + ]; }; jinja_inline = buildQueries { language = "jinja_inline"; @@ -4122,6 +4248,9 @@ }; luau = buildQueries { language = "luau"; + requires = [ + "lua" + ]; }; m68k = buildQueries { language = "m68k"; @@ -4131,6 +4260,9 @@ }; markdown = buildQueries { language = "markdown"; + requires = [ + "markdown_inline" + ]; }; markdown_inline = buildQueries { language = "markdown_inline"; @@ -4164,6 +4296,9 @@ }; nim = buildQueries { language = "nim"; + requires = [ + "nim_format_string" + ]; }; nim_format_string = buildQueries { language = "nim_format_string"; @@ -4182,6 +4317,9 @@ }; objc = buildQueries { language = "objc"; + requires = [ + "c" + ]; }; objdump = buildQueries { language = "objdump"; @@ -4191,6 +4329,9 @@ }; ocaml_interface = buildQueries { language = "ocaml_interface"; + requires = [ + "ocaml" + ]; }; ocamllex = buildQueries { language = "ocamllex"; @@ -4212,6 +4353,9 @@ }; php = buildQueries { language = "php"; + requires = [ + "php_only" + ]; }; php_only = buildQueries { language = "php_only"; @@ -4248,6 +4392,9 @@ }; problog = buildQueries { language = "problog"; + requires = [ + "prolog" + ]; }; prolog = buildQueries { language = "prolog"; @@ -4266,6 +4413,9 @@ }; psv = buildQueries { language = "psv"; + requires = [ + "tsv" + ]; }; pug = buildQueries { language = "pug"; @@ -4290,6 +4440,9 @@ }; qmljs = buildQueries { language = "qmljs"; + requires = [ + "ecma" + ]; }; query = buildQueries { language = "query"; @@ -4371,6 +4524,9 @@ }; scss = buildQueries { language = "scss"; + requires = [ + "css" + ]; }; sflog = buildQueries { language = "sflog"; @@ -4443,6 +4599,9 @@ }; svelte = buildQueries { language = "svelte"; + requires = [ + "html_tags" + ]; }; sway = buildQueries { language = "sway"; @@ -4482,6 +4641,9 @@ }; terraform = buildQueries { language = "terraform"; + requires = [ + "hcl" + ]; }; textproto = buildQueries { language = "textproto"; @@ -4509,6 +4671,11 @@ }; tsx = buildQueries { language = "tsx"; + requires = [ + "ecma" + "jsx" + "typescript" + ]; }; turtle = buildQueries { language = "turtle"; @@ -4518,6 +4685,9 @@ }; typescript = buildQueries { language = "typescript"; + requires = [ + "ecma" + ]; }; typespec = buildQueries { language = "typespec"; @@ -4569,6 +4739,9 @@ }; vue = buildQueries { language = "vue"; + requires = [ + "html_tags" + ]; }; wgsl = buildQueries { language = "wgsl"; @@ -4590,6 +4763,9 @@ }; xml = buildQueries { language = "xml"; + requires = [ + "dtd" + ]; }; xresources = buildQueries { language = "xresources"; diff --git a/pkgs/applications/editors/vim/plugins/nvim-treesitter/overrides.nix b/pkgs/applications/editors/vim/plugins/nvim-treesitter/overrides.nix index 9786265ec6de..3e6ed03ace08 100644 --- a/pkgs/applications/editors/vim/plugins/nvim-treesitter/overrides.nix +++ b/pkgs/applications/editors/vim/plugins/nvim-treesitter/overrides.nix @@ -17,12 +17,15 @@ let inherit (neovimUtils) grammarToPlugin; buildQueries = - { language }: + { + language, + requires ? [ ], + }: vimUtils.toVimPlugin ( runCommand "nvim-treesitter-queries-${language}" { passthru = { - inherit language; + inherit language requires; isTreesitterQuery = true; }; meta.description = "Queries for ${language} from nvim-treesitter"; @@ -45,18 +48,50 @@ let inherit (generated) parsers queries; - parsersWithMeta = lib.mapAttrs ( + queriesWithDeps = lib.mapAttrs ( + lang: query: + let + requires = query.requires or [ ]; + dependencies = map (req: queries.${req}) requires; + in + if dependencies != [ ] then + query.overrideAttrs (old: { + passthru = old.passthru or { } // { + inherit dependencies; + }; + }) + else + query + ) queries; + + parsersWithQueries = lib.mapAttrs ( lang: parser: - if lib.hasAttr lang queries then + if lib.hasAttr lang queriesWithDeps then parser.overrideAttrs (old: { - passthru = (old.passthru or { }) // { - associatedQuery = queries.${lang}; + passthru = old.passthru or { } // { + associatedQuery = queriesWithDeps.${lang}; }; }) else parser ) parsers; + parsersWithMeta = lib.mapAttrs ( + lang: parser: + let + requires = parser.requires or [ ]; + dependencies = map (req: grammarToPlugin parsersWithQueries.${req}) requires; + in + if dependencies != [ ] then + parser.overrideAttrs (old: { + passthru = old.passthru or { } // { + inherit dependencies; + }; + }) + else + parser + ) parsersWithQueries; + # add aliases so grammars from `tree-sitter` are overwritten in `withPlugins` # for example, for ocaml_interface, the following aliases will be added # ocaml-interface @@ -92,7 +127,7 @@ let grammarPlugins = map grammarToPlugin selectedGrammars; queryPlugins = lib.pipe selectedGrammars [ - (map (g: g.passthru.associatedQuery or null)) + (map (g: g.associatedQuery or null)) (lib.filter (q: q != null)) ]; in @@ -115,9 +150,9 @@ in grammarToPlugin withPlugins withAllGrammars - queries ; + queries = queriesWithDeps; parsers = grammarPlugins; tests = { diff --git a/pkgs/applications/editors/vim/plugins/utils/nvim-treesitter/update.py b/pkgs/applications/editors/vim/plugins/utils/nvim-treesitter/update.py index cc71c9495dc4..ce1ff9bdef87 100755 --- a/pkgs/applications/editors/vim/plugins/utils/nvim-treesitter/update.py +++ b/pkgs/applications/editors/vim/plugins/utils/nvim-treesitter/update.py @@ -15,12 +15,10 @@ log = logging.getLogger("vim-updater") NURR_JSON_URL = ( "https://raw.githubusercontent.com/lumen-oss/nurr/main/tree-sitter-parsers.json" ) -NVIM_TREESITTER_QUERIES_URL = ( - "https://api.github.com/repos/nvim-treesitter/nvim-treesitter/contents/runtime/queries" -) +NVIM_TREESITTER_QUERIES_URL = "https://api.github.com/repos/nvim-treesitter/nvim-treesitter/contents/runtime/queries" -def generate_grammar(lang, parser_info): +def generate_grammar(lang, parser_info, parsers_map): """Generate grammar for a language based on the parser info""" if "install_info" not in parser_info: log.warning(f"Parser {lang} does not have install_info, skipping") @@ -36,9 +34,7 @@ def generate_grammar(lang, parser_info): version = "0.0.0+rev={rev[:7]}"; src = """ - generated += subprocess.check_output( - ["nurl", url, rev, "--indent=6"], text=True - ) + generated += subprocess.check_output(["nurl", url, rev, "--indent=6"], text=True) generated += ";" location = install_info.get("location", "") @@ -50,6 +46,23 @@ def generate_grammar(lang, parser_info): generated += """ generate = true;""" + # Add requires field - only include parsers + requires = parser_info.get("requires", []) + if requires: + # Filter to only include parser dependencies (those with install_info) + parser_requires = [ + req + for req in requires + if req in parsers_map and "install_info" in parsers_map[req] + ] + if parser_requires: + generated += """ + passthru.requires = [ +""" + for req in parser_requires: + generated += f' "{req}"\n' + generated += " ];" + generated += f""" meta.homepage = "{url}"; }}; @@ -58,12 +71,28 @@ def generate_grammar(lang, parser_info): return generated -def generate_query(lang): +def generate_query(lang: str, parser_info: dict | None, queries_set: set[str]): """Generate query derivation for a language""" - return f""" {lang} = buildQueries {{ - language = "{lang}"; - }}; + generated = f""" {lang} = buildQueries {{ + language = "{lang}";""" + + # Add requires field for queries - include everything that has queries + if parser_info and "requires" in parser_info: + requires = parser_info["requires"] + # Filter to only include langs that have queries + query_requires = [req for req in requires if queries_set and req in queries_set] + if query_requires: + generated += """ + requires = [ """ + for req in query_requires: + generated += f' "{req}"\n' + generated += " ];" + + generated += """ + }; +""" + return generated def fetch_nurr_parsers(): @@ -111,9 +140,9 @@ def fetch_available_queries(): return languages -def process_parser_info(parser_info): +def process_parser_info(parser_info, parsers_map): """Process a single parser info entry and generate grammar for it""" - return generate_grammar(parser_info["lang"], parser_info) + return generate_grammar(parser_info["lang"], parser_info, parsers_map) def update_grammars(): @@ -121,6 +150,9 @@ def update_grammars(): parsers_info = fetch_nurr_parsers() queries_list = fetch_available_queries() + # Create a mapping of lang -> parser_info for quick lookup + parsers_map = {p["lang"]: p for p in parsers_info} + generated_file = """# generated by pkgs/applications/editors/vim/plugins/utils/nvim-treesitter/update.py # Using parser data from https://github.com/nvim-neorocks/nurr/blob/main/tree-sitter-parsers.json @@ -141,7 +173,9 @@ def update_grammars(): # Process parsers in parallel for better performance with ThreadPoolExecutor(max_workers=5) as executor: - for generated in executor.map(process_parser_info, parsers_info): + for generated in executor.map( + lambda p: process_parser_info(p, parsers_map), parsers_info + ): generated_file += generated generated_file += """ }; @@ -149,9 +183,13 @@ def update_grammars(): queries = { """ - # Process queries + # Convert queries list to a set for fast lookup + queries_set = set(queries_list) + + # Process queries - include parser info if available for requires field for lang in queries_list: - generated_file += generate_query(lang) + parser_info = parsers_map.get(lang) + generated_file += generate_query(lang, parser_info, queries_set) generated_file += " };\n}\n" return generated_file |
