diff options
| author | Alexei Mozaidze <lexerpexer@proton.me> | 2024-02-21 17:44:01 +0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-21 13:44:01 +0000 |
| commit | 7d1bab65469bd53e7a68666de071d9a82a522a40 (patch) | |
| tree | 5e5b93043134bc74c46efc9f538bd02a68883354 | |
| parent | docs(template): use builtin commands (diff) | |
| download | nvim-treesitter-7d1bab65469bd53e7a68666de071d9a82a522a40.tar nvim-treesitter-7d1bab65469bd53e7a68666de071d9a82a522a40.tar.gz nvim-treesitter-7d1bab65469bd53e7a68666de071d9a82a522a40.tar.bz2 nvim-treesitter-7d1bab65469bd53e7a68666de071d9a82a522a40.tar.lz nvim-treesitter-7d1bab65469bd53e7a68666de071d9a82a522a40.tar.xz nvim-treesitter-7d1bab65469bd53e7a68666de071d9a82a522a40.tar.zst nvim-treesitter-7d1bab65469bd53e7a68666de071d9a82a522a40.zip | |
feat(fennel)!: switch to maintained parser (#6132)
Change the Fennel parser to a simpler and more consistent one, along with updating all the queries.
| -rw-r--r-- | lockfile.json | 2 | ||||
| -rw-r--r-- | lua/nvim-treesitter/parsers.lua | 4 | ||||
| -rw-r--r-- | queries/fennel/folds.scm | 38 | ||||
| -rw-r--r-- | queries/fennel/highlights.scm | 267 | ||||
| -rw-r--r-- | queries/fennel/injections.scm | 146 | ||||
| -rw-r--r-- | queries/fennel/locals.scm | 46 |
6 files changed, 397 insertions, 106 deletions
diff --git a/lockfile.json b/lockfile.json index 062071ed9..f6e2e5b5b 100644 --- a/lockfile.json +++ b/lockfile.json @@ -162,7 +162,7 @@ "revision": "9e514af33bfe061d0ccf1999dbcc93fca91f133c" }, "fennel": { - "revision": "15e4f8c417281768db17080c4447297f8ff5343a" + "revision": "389e9ec34d9a56ecf3dd74232de8675b3c4b5487" }, "firrtl": { "revision": "2b5adae629c8cba528c7b1e4aa67a8ae28934ea5" diff --git a/lua/nvim-treesitter/parsers.lua b/lua/nvim-treesitter/parsers.lua index 087f28fc8..324529cad 100644 --- a/lua/nvim-treesitter/parsers.lua +++ b/lua/nvim-treesitter/parsers.lua @@ -529,10 +529,10 @@ list.faust = { list.fennel = { install_info = { - url = "https://github.com/travonted/tree-sitter-fennel", + url = "https://github.com/alexmozaidze/tree-sitter-fennel", files = { "src/parser.c" }, }, - maintainers = { "@TravonteD" }, + maintainers = { "@alexmozaidze" }, } list.firrtl = { diff --git a/queries/fennel/folds.scm b/queries/fennel/folds.scm index 619300c4f..b4901d96a 100644 --- a/queries/fennel/folds.scm +++ b/queries/fennel/folds.scm @@ -1,11 +1,35 @@ [ (list) (table) - (sequential_table) - (let) - (fn) - (let_clause) - (quoted_list) - (local) - (global) + (sequence) ] @fold + +(list + . + (symbol) @_let + (#eq? @_let "let") + . + (sequence) @fold) @fold + +(list + . + (symbol) @_local + (#eq? @_local "local")) @fold + +(list + . + (symbol) @_global + (#eq? @_global "global")) @fold + +(list + . + (symbol) @_fn + (#any-of? @_fn "fn" "lambda" "λ" "hashfn")) @fold + +(reader_macro + macro: + [ + "'" + "`" + ] + expression: (_) @fold) diff --git a/queries/fennel/highlights.scm b/queries/fennel/highlights.scm index ec2a82759..d9f375312 100644 --- a/queries/fennel/highlights.scm +++ b/queries/fennel/highlights.scm @@ -1,3 +1,6 @@ +; Most primitive nodes +(shebang) @keyword.directive + (comment) @comment @spell [ @@ -9,18 +12,8 @@ "]" ] @punctuation.bracket -[ - ":" - ":until" - "&" - "&as" - "?" -] @punctuation.special - (nil) @constant.builtin -(vararg) @punctuation.special - (boolean) @boolean (number) @number @@ -33,11 +26,7 @@ (multi_symbol "." @punctuation.delimiter - (symbol) @variable.member) - -(multi_symbol_method - ":" @punctuation.delimiter - (symbol) @function.method.call .) + member: (symbol_fragment) @variable.member) (list . @@ -46,80 +35,218 @@ (list . (multi_symbol - (symbol) @function.call .)) + member: (symbol_fragment) @function.call .)) -((symbol) @variable.builtin - (#lua-match? @variable.builtin "^[$]")) +(multi_symbol_method + ":" @punctuation.delimiter + method: (symbol_fragment) @function.method.call .) -(binding) @string.special.symbol +; Just `&` is only used in destructuring +((symbol) @punctuation.special + (#eq? @punctuation.special "&")) -[ - "fn" - "lambda" - "hashfn" - "#" -] @keyword.function +; BUG: $ arguments should only be valid inside hashfn of any depth, but +; it's impossible to express such query at the moment of writing. +; See tree-sitter/tree-sitter#880 +((symbol) @variable.parameter + (#eq? @variable.parameter "$...")) -(fn - name: - [ - (symbol) @function - (multi_symbol - (symbol) @function .) - ]) +((symbol) @variable.parameter + (#lua-match? @variable.parameter "^%$[1-9]$")) -(lambda - name: - [ - (symbol) @function - (multi_symbol - (symbol) @function .) - ]) +((symbol) @operator + ; format-ignore + (#any-of? @operator + ; arithmetic + "+" "-" "*" "/" "//" "%" "^" + ; comparison + ">" "<" ">=" "<=" "=" "~=" + ; other + "#" "." "?." "..")) -[ - "for" - "each" -] @keyword.repeat +((symbol) @keyword.operator + ; format-ignore + (#any-of? @keyword.operator + ; comparison + "not=" + ; boolean + "and" "or" "not" + ; bitwise + "lshift" "rshift" "band" "bor" "bxor" "bnot" + ; other + "length")) -((symbol) @keyword.repeat - (#any-of? @keyword.repeat "while")) +(reader_macro + macro: "#" @keyword.function) -"match" @keyword.conditional +((symbol) @keyword.function + (#any-of? @keyword.function "fn" "lambda" "λ" "hashfn")) -((symbol) @keyword.conditional - (#any-of? @keyword.conditional "if" "when")) +((symbol) @keyword.repeat + (#any-of? @keyword.repeat "for" "each" "while")) -[ - "global" - "local" - "let" - "set" - "var" - "where" - "or" -] @keyword +((symbol) @keyword.conditional + (#any-of? @keyword.conditional "if" "when" "match" "case")) ((symbol) @keyword - (#any-of? @keyword "comment" "do" "doc" "eval-compiler" "lua" "macros" "quote" "tset" "values")) + ; format-ignore + (#any-of? @keyword + "global" + "local" + "let" + "set" + "var" + "comment" + "do" + "doc" + "eval-compiler" + "lua" + "macros" + "unquote" + "quote" + "tset" + "values" + "tail!")) ((symbol) @keyword.import (#any-of? @keyword.import "require" "require-macros" "import-macros" "include")) -[ - "collect" - "icollect" - "accumulate" -] @function.macro - ((symbol) @function.macro - (#any-of? @function.macro "->" "->>" "-?>" "-?>>" "?." "doto" "macro" "macrodebug" "partial" "pick-args" "pick-values" "with-open")) + ; format-ignore + (#any-of? @function.macro + "collect" + "icollect" + "fcollect" + "accumulate" + "faccumulate" + "->" + "->>" + "-?>" + "-?>>" + "?." + "doto" + "macro" + "macrodebug" + "partial" + "pick-args" + "pick-values" + "with-open")) + +; TODO: Highlight builtin methods (`table.unpack`, etc) as @function.builtin +([ + (symbol) @module.builtin + (multi_symbol + base: (symbol_fragment) @module.builtin) +] + (#any-of? @module.builtin "vim" "_G" "debug" "io" "jit" "math" "os" "package" "string" "table" "utf8")) + +([ + (symbol) @variable.builtin + (multi_symbol + . + (symbol_fragment) @variable.builtin) +] + (#eq? @variable.builtin "arg")) + +((symbol) @variable.builtin + (#eq? @variable.builtin "...")) -; Lua builtins ((symbol) @constant.builtin - (#any-of? @constant.builtin "arg" "_ENV" "_G" "_VERSION")) + (#eq? @constant.builtin "_VERSION")) ((symbol) @function.builtin - (#any-of? @function.builtin "assert" "collectgarbage" "dofile" "error" "getmetatable" "ipairs" "load" "loadfile" "next" "pairs" "pcall" "print" "rawequal" "rawget" "rawlen" "rawset" "require" "select" "setmetatable" "tonumber" "tostring" "type" "warn" "xpcall")) + ; format-ignore + (#any-of? @function.builtin + "assert" + "collectgarbage" + "dofile" + "error" + "getmetatable" + "ipairs" + "load" + "loadfile" + "next" + "pairs" + "pcall" + "print" + "rawequal" + "rawget" + "rawlen" + "rawset" + "require" + "select" + "setmetatable" + "tonumber" + "tostring" + "type" + "warn" + "xpcall" + "module" + "setfenv" + "loadstring" + "unpack")) -((symbol) @function.builtin - (#any-of? @function.builtin "loadstring" "module" "setfenv" "unpack")) +(table + (table_pair + key: (symbol) @keyword.directive + (#eq? @keyword.directive "&as"))) + +(list + . + (symbol) @keyword.function + (#any-of? @keyword.function "fn" "lambda" "λ") + . + [ + (symbol) @function + (multi_symbol + (symbol_fragment) @function .) + ] + . + (sequence + ((symbol) @variable.parameter + (#not-any-of? @variable.parameter "&" "...")))) + +(list + . + (symbol) @function.macro + (#any-of? @function.macro "collect" "icollect" "fcollect") + . + (sequence + [ + (symbol) + (string) + ] @keyword.directive + (#any-of? @keyword.directive "&into" ":into"))) + +(list + . + (symbol) @function.macro + (#any-of? @function.macro "for" "each" "collect" "icollect" "fcollect" "accumulate" "faccumulate") + . + (sequence + [ + (symbol) + (string) + ] @keyword.directive + (#any-of? @keyword.directive "&until" ":until"))) + +(list + . + (symbol) @keyword.conditional + (#any-of? @keyword.conditional "match" "case") + . + (_) + . + ((list + . + (symbol) @keyword + (#eq? @keyword "where")) + . + (_))* + . + (list + . + (symbol) @keyword + (#eq? @keyword "where")) + . + (_)? .) diff --git a/queries/fennel/injections.scm b/queries/fennel/injections.scm index 2f0e58eb6..cea50c4a3 100644 --- a/queries/fennel/injections.scm +++ b/queries/fennel/injections.scm @@ -1,2 +1,148 @@ ((comment) @injection.content (#set! injection.language "comment")) + +(list + . + (multi_symbol) @_vimcmd_identifier + (#any-of? @_vimcmd_identifier "vim.cmd" "vim.api.nvim_command" "vim.api.nvim_exec2") + . + (string + (string_content) @injection.content + (#set! injection.language "vim"))) + +; NOTE: Matches *exactly* `ffi.cdef` +(list + . + (multi_symbol) @_cdef_identifier + (#eq? @_cdef_identifier "ffi.cdef") + . + (string + (string_content) @injection.content + (#set! injection.language "c"))) + +(list + . + (multi_symbol) @_ts_query_identifier + (#any-of? @_ts_query_identifier "vim.treesitter.query.set" "vim.treesitter.query.parse") + . + (_) + . + (_) + . + (string + (string_content) @injection.content + (#set! injection.language "query"))) + +(list + . + (multi_symbol) @_vimcmd_identifier + (#eq? @_vimcmd_identifier "vim.api.nvim_create_autocmd") + . + (_) + . + (table + (table_pair + key: + (string + (string_content) @_command + (#eq? @_command "command")) + value: + (string + (string_content) @injection.content + (#set! injection.language "vim"))))) + +(list + . + (multi_symbol) @_user_cmd + (#eq? @_user_cmd "vim.api.nvim_create_user_command") + . + (_) + . + (string + (string_content) @injection.content + (#set! injection.language "vim"))) + +(list + . + (multi_symbol) @_user_cmd + (#eq? @_user_cmd "vim.api.nvim_buf_create_user_command") + . + (_) + . + (_) + . + (string + (string_content) @injection.content + (#set! injection.language "vim"))) + +(list + . + (multi_symbol) @_map + (#any-of? @_map "vim.api.nvim_set_keymap" "vim.keymap.set") + . + (_) + . + (_) + . + (string + (string_content) @injection.content + (#set! injection.language "vim"))) + +(list + . + (multi_symbol) @_map + (#eq? @_map "vim.api.nvim_buf_set_keymap") + . + (_) + . + (_) + . + (_) + . + (string + (string_content) @injection.content + (#set! injection.language "vim"))) + +; highlight string as query if starts with `; query` +(string + (string_content) @injection.content + (#lua-match? @injection.content "^%s*;+%s?query") + (#set! injection.language "query")) + +; ────────────────────────────────────────────────────────────────────── +; (string.match "123" "%d+") +(list + . + (multi_symbol + member: (symbol_fragment) @_func + . + (#any-of? @_func "find" "match" "gmatch" "gsub")) + . + (_) + . + (string + (string_content) @injection.content + (#set! injection.language "luap") + (#set! injection.include-children))) + +; (my-string:match "%d+") +(list + . + (multi_symbol_method + method: (symbol_fragment) @_method + (#any-of? @_method "find" "match" "gmatch" "gsub")) + . + (string + (string_content) @injection.content + (#set! injection.language "luap") + (#set! injection.include-children))) + +; (string.format "pi = %.2f" 3.14159) +(list + . + (multi_symbol) @_func + (#eq? @_func "string.format") + . + (string + (string_content) @injection.content + (#set! injection.language "printf"))) diff --git a/queries/fennel/locals.scm b/queries/fennel/locals.scm index bf3701a50..05c9582de 100644 --- a/queries/fennel/locals.scm +++ b/queries/fennel/locals.scm @@ -1,32 +1,26 @@ -[ - (program) - (fn) - (lambda) - (let) - (each) - (for) - (match) -] @local.scope +; TODO: Add tests +; TODO: Improve queries +(program) @local.scope ((list . - (symbol) @_special) @local.scope - (#any-of? @_special "while" "if" "when" "do" "collect" "icollect" "accumulate")) + (symbol) @_call) @local.scope + (#any-of? @_call "let" "fn" "lambda" "λ" "while" "each" "for" "if" "when" "do" "collect" "icollect" "accumulate" "case" "match")) -(fn - name: (symbol) @local.definition.function - (#set! definition.function.scope "parent")) - -(lambda - name: (symbol) @local.definition.function - (#set! definition.function.scope "parent")) - -; TODO: use @local.definition.parameter for parameters -(binding - (symbol) @local.definition.var) +(symbol) @local.reference -(for_clause +(list . - (symbol) @local.definition.var) - -(symbol) @local.reference + (symbol) @_fn + (#any-of? @_fn "fn" "lambda" "λ") + . + [ + (symbol) @local.definition.function + (multi_symbol + member: (symbol_fragment) @local.definition.function .) + ] + (#set! definition.function.scope "parent") + . + (sequence + (symbol)* @local.definition.parameter + (#not-contains? @local.definition.parameter "&"))) |
