diff options
| author | Chris Dragan <chris@dragan.dev> | 2026-01-04 10:08:07 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-01-04 11:08:07 +0100 |
| commit | 31fc7e10cd7c1fd7717b439050d0f91c2c4f0a4b (patch) | |
| tree | 32249e8a96f55c0f9bad63e8d4712a08cb3f4034 | |
| parent | fix(beancount): update to windows-compatible version (#8401) (diff) | |
| download | nvim-treesitter-31fc7e10cd7c1fd7717b439050d0f91c2c4f0a4b.tar nvim-treesitter-31fc7e10cd7c1fd7717b439050d0f91c2c4f0a4b.tar.gz nvim-treesitter-31fc7e10cd7c1fd7717b439050d0f91c2c4f0a4b.tar.bz2 nvim-treesitter-31fc7e10cd7c1fd7717b439050d0f91c2c4f0a4b.tar.lz nvim-treesitter-31fc7e10cd7c1fd7717b439050d0f91c2c4f0a4b.tar.xz nvim-treesitter-31fc7e10cd7c1fd7717b439050d0f91c2c4f0a4b.tar.zst nvim-treesitter-31fc7e10cd7c1fd7717b439050d0f91c2c4f0a4b.zip | |
feat: add kos parser and queries (#8389)
| -rw-r--r-- | SUPPORTED_LANGUAGES.md | 1 | ||||
| -rw-r--r-- | lua/nvim-treesitter/parsers.lua | 8 | ||||
| -rw-r--r-- | runtime/queries/kos/folds.scm | 19 | ||||
| -rw-r--r-- | runtime/queries/kos/highlights.scm | 141 | ||||
| -rw-r--r-- | runtime/queries/kos/injections.scm | 6 | ||||
| -rw-r--r-- | runtime/queries/kos/locals.scm | 41 | ||||
| -rw-r--r-- | tests/query/highlights/kos/test.kos | 149 |
7 files changed, 365 insertions, 0 deletions
diff --git a/SUPPORTED_LANGUAGES.md b/SUPPORTED_LANGUAGES.md index a487c7cca..153483006 100644 --- a/SUPPORTED_LANGUAGES.md +++ b/SUPPORTED_LANGUAGES.md @@ -157,6 +157,7 @@ jsx (queries only)[^jsx] | unstable | `HFIJ ` | @steelsojka [kconfig](https://github.com/tree-sitter-grammars/tree-sitter-kconfig) | unstable | `HFIJL` | @amaanq [kdl](https://github.com/tree-sitter-grammars/tree-sitter-kdl) | unstable | `HFIJL` | @amaanq [kitty](https://github.com/OXY2DEV/tree-sitter-kitty) | unstable | `H J ` | @OXY2DEV +[kos](https://github.com/kos-lang/tree-sitter-kos) | unstable | `HF JL` | @cdragan [kotlin](https://github.com/fwcd/tree-sitter-kotlin) | unstable | `HF JL` | @SalBakraa [koto](https://github.com/koto-lang/tree-sitter-koto) | unstable | `HF JL` | @irh [kusto](https://github.com/Willem-J-an/tree-sitter-kusto) | unstable | `H J ` | @Willem-J-an diff --git a/lua/nvim-treesitter/parsers.lua b/lua/nvim-treesitter/parsers.lua index 9ce38664d..b7037d245 100644 --- a/lua/nvim-treesitter/parsers.lua +++ b/lua/nvim-treesitter/parsers.lua @@ -1187,6 +1187,14 @@ return { maintainers = { '@OXY2DEV' }, tier = 2, }, + kos = { + install_info = { + revision = '5f11d41b3150b0837e8b3964151ebb7fc4f367e9', + url = 'https://github.com/kos-lang/tree-sitter-kos', + }, + maintainers = { '@cdragan' }, + tier = 2, + }, kotlin = { install_info = { revision = '57fb4560ba8641865bc0baa6b3f413b236112c4c', diff --git a/runtime/queries/kos/folds.scm b/runtime/queries/kos/folds.scm new file mode 100644 index 000000000..ca51a5406 --- /dev/null +++ b/runtime/queries/kos/folds.scm @@ -0,0 +1,19 @@ +[ + (function_decl) + (constructor_literal) + (function_literal) + (class_decl) + (class_literal) + (do_statement) + (if_statement) + (try_statement) + (defer_statement) + (with_statement) + (switch_statement) + (switch_case) + (default_case) + (loop_statement) + (repeat_statement) + (while_statement) + (for_statement) +] @fold diff --git a/runtime/queries/kos/highlights.scm b/runtime/queries/kos/highlights.scm new file mode 100644 index 000000000..0942b2b89 --- /dev/null +++ b/runtime/queries/kos/highlights.scm @@ -0,0 +1,141 @@ +(hash_bang) @keyword.directive + +(comment) @comment @spell + +(number) @number + +(identifier) @variable + +(property_identifier) @property + +[ + (string_literal) + (string_literal_begin) + (string_literal_continuation) + (string_literal_end) +] @string + +[ + "case" + "default" + "else" + "if" + "switch" +] @keyword.conditional + +"import" @keyword.import + +[ + (break_statement) + (continue_statement) + "for" + "loop" + "repeat" + "while" +] @keyword.repeat + +(for_statement + "in" @keyword.repeat) + +"class" @keyword.type + +[ + "return" + "yield" +] @keyword.return + +[ + "catch" + "defer" + "throw" + "try" +] @keyword.exception + +[ + "constructor" + "fun" + "=>" +] @keyword.function + +[ + "_" + (line) + "assert" + ;"async" + "const" + "do" + "extends" + (fallthrough_statement) + ;"get" + ;"match" + "public" + ;"set" + ;"static" + "var" + "with" +] @keyword + +[ + (this) + (super) +] @variable.builtin + +[ + (false) + (true) +] @boolean + +(void) @constant.builtin + +[ + "(" + ")" + "[" + "]" + "{" + "}" +] @punctuation.bracket + +[ + ";" + ":" + "." + "," +] @punctuation.delimiter + +[ + (arithmetic_assignment_operator) + (comparison_operator) + (bitwise_operator) + (additive_operator) + (multiplicative_operator) + (logical_operator) + (unary_operator) + "->" + "..." + "=" + "?" +] @operator + +(conditional_expression + [ + "?" + ":" + ] @keyword.conditional.ternary) + +(class_member + (function_decl + name: (identifier) @function.method)) + +(function_decl + name: (identifier) @function) + +(class_decl + name: (identifier) @type) + +(invocation + (identifier) @function.call) + +(invocation + (refinement + property: (property_identifier) @function.method.call)) diff --git a/runtime/queries/kos/injections.scm b/runtime/queries/kos/injections.scm new file mode 100644 index 000000000..2677f272b --- /dev/null +++ b/runtime/queries/kos/injections.scm @@ -0,0 +1,6 @@ +(((comment) @_jsdoc_comment + (#lua-match? @_jsdoc_comment "^/[*][*][^*].*[*]/$")) @injection.content + (#set! injection.language "jsdoc")) + +((comment) @injection.content + (#set! injection.language "comment")) diff --git a/runtime/queries/kos/locals.scm b/runtime/queries/kos/locals.scm new file mode 100644 index 000000000..37f14f4e6 --- /dev/null +++ b/runtime/queries/kos/locals.scm @@ -0,0 +1,41 @@ +; Scopes +;------- +(compound_statement) @local.scope + +(for_statement) @local.scope + +(function_decl) @local.scope + +(constructor_literal) @local.scope + +(function_literal) @local.scope + +(with_statement) @local.scope + +(catch_clause) @local.scope + +; Definitions +;------------ +(variable_decl + variable: (identifier) @local.definition.var) + +(parameter + parameter: (identifier) @local.definition.parameter) + +(import + module: (identifier) @local.definition.import) + +(import + symbol: (identifier) @local.definition.import) + +(function_decl + name: (identifier) @local.definition.function + (#set! definition.var.scope parent)) + +(class_decl + name: (identifier) @local.definition.type + (#set! definition.var.scope parent)) + +; References +;------------ +(identifier) @local.reference diff --git a/tests/query/highlights/kos/test.kos b/tests/query/highlights/kos/test.kos new file mode 100644 index 000000000..981fdb313 --- /dev/null +++ b/tests/query/highlights/kos/test.kos @@ -0,0 +1,149 @@ +#!/usr/bin/env kos +# ^ keyword.directive +public var item = 1; +# ^ keyword +# ^ keyword +# ^ variable +# ^ operator +# ^ number +# ^ punctuation.delimiter + +# hash comment +# <- @comment @spell + +// slash comment +# <- @comment @spell + +/* block comment */ +# <- @comment @spell + +fun name(arg1, +# ^ keyword.function +# ^ function +# ^ punctuation.bracket +# ^ variable +# ^ punctuation.delimiter + arg2 = "default", +# ^ variable +# ^ operator +# ^ string +# ^ punctuation.delimiter + arg3...) +# ^ variable +# ^ operator +# ^ punctuation.bracket +{ +# <- punctuation.bracket + arg1 += 1 + # ^ variable + # ^ operator + # ^ number + arg1 -= 2 + # ^ variable + # ^ operator + # ^ number + arg1 *= 3 + # ^ variable + # ^ operator + # ^ number + arg1 /= 4 + # ^ variable + # ^ operator + # ^ number + arg1 %= 5 + # ^ variable + # ^ operator + # ^ number + arg1 |= 6 + # ^ variable + # ^ operator + # ^ number + arg1 &= 7 + # ^ variable + # ^ operator + # ^ number + arg1 ^= 8 + # ^ variable + # ^ operator + # ^ number + arg1 <<= 9 + # ^ variable + # ^ operator + # ^ number + arg1 >>= 10 + # ^ variable + # ^ operator + # ^ number + arg1 >>>= 11 + # ^ variable + # ^ operator + # ^ number + arg1.prop[arg1](arg1)[void] = true + # ^ variable + # ^ punctuation.delimiter + # ^ property + # ^ punctuation.bracket + # ^ variable + # ^ punctuation.bracket + # ^ punctuation.bracket + # ^ variable + # ^ punctuation.bracket + # ^ punctuation.bracket + # ^ constant.builtin + # ^ operator + # ^ boolean + arg1 = 1 * (arg1 + 2) / arg1 - 3 % arg1 + # ^ variable + # ^ operator + # ^ number + # ^ operator + # ^ punctuation.bracket + # ^ variable + # ^ operator + # ^ number + # ^ punctuation.bracket + # ^ operator + # ^ variable + # ^ operator + # ^ number + # ^ operator + # ^ variable + for const elem in arg1 { + # ^ keyword.repeat + # ^ keyword + # ^ variable + # ^ keyword.repeat + # ^ variable + # ^ punctuation.bracket + if elem { + # ^ keyword.conditional + # ^ variable + # ^ punctuation.bracket + continue + # ^ keyword.repeat + } + # ^ punctuation.bracket + else { + # ^ keyword.conditional + # ^ punctuation.bracket + break + # ^ keyword.repeat + } + # ^ punctuation.bracket + } + # <- punctuation.bracket +} +# <- punctuation.bracket + +name(42) +# <- function.call +# ^ punctuation.bracket +# ^ number +# ^ punctuation.bracket + +name.name() +# <- variable +# ^ punctuation.delimiter +# ^ function.method.call +# ^ punctuation.bracket +# ^ punctuation.bracket |
