From 655f0e7d77d4c33ba8fbfdd58b92b1678d0370a0 Mon Sep 17 00:00:00 2001 From: Syed Daanish Date: Fri, 26 Dec 2025 20:46:36 +0000 Subject: [PATCH] Feat: Add syntax highlighting for a lot more languages --- .gitmodules | 6 +- Makefile | 10 +- README.md | 4 +- grammar/bash.scm | 356 ++++++------- grammar/c.scm | 646 +++++++++++++++-------- grammar/cpp.scm | 952 ++++++++++++++++------------------ grammar/css.scm | 95 ++++ grammar/diff.scm | 57 ++ grammar/embedded_template.scm | 20 + grammar/fish.scm | 191 +++++++ grammar/gdscript.scm | 336 ++++++++++++ grammar/gitattributes.scm | 70 +++ grammar/gitignore.scm | 46 ++ grammar/go.scm | 286 ++++++++++ grammar/gomod.scm | 46 ++ grammar/h.scm | 952 ++++++++++++++++------------------ grammar/haskell.scm | 207 ++++++++ grammar/html.scm | 146 ++++++ grammar/ini.scm | 34 ++ grammar/javascript.scm | 318 ++++++++++++ grammar/json.scm | 22 + grammar/lua.scm | 312 +++++++++++ grammar/make.scm | 191 +++++++ grammar/markdown.scm | 321 ++++++++++++ grammar/markdown_inline.scm | 90 ++++ grammar/nginx.scm | 54 ++ grammar/php.scm | 453 ++++++++++++++++ grammar/python.scm | 412 +++++++++++++++ grammar/query.scm | 122 +++++ grammar/regex.scm | 77 +++ grammar/ruby.scm | 103 ++-- grammar/rust.scm | 663 +++++++++++++++++++++++ grammar/sql.scm | 469 +++++++++++++++++ grammar/toml.scm | 56 ++ grammar/yaml.scm | 98 ++++ include/maps.h | 11 +- include/ts_def.h | 26 +- libs/tree-sitter-cabal | 1 - samples/Makefile | 119 +++++ samples/css.css | 70 +++ samples/diff.patch | 102 ++++ samples/embedded_template.erb | 71 +++ samples/fish.fish | 92 ++++ samples/gdscript.gd | 81 +++ samples/go.go | 95 ++++ samples/go.mod | 32 ++ samples/haskell.hs | 59 +++ samples/html.html | 87 ++++ samples/ini.ini | 41 ++ samples/javascript.js | 147 ++++++ samples/json.jsonc | 51 ++ samples/lua.lua | 119 +++++ samples/markdown.md | 41 ++ samples/nginx.conf | 87 ++++ samples/php.php | 130 +++++ samples/python.py | 163 ++++++ samples/regex.regex | 18 + samples/rust.rs | 406 +++++++++++++++ samples/sample.gitattributes | 5 + samples/sample.gitignore | 12 + samples/sql.sql | 83 +++ samples/toml.toml | 53 ++ src/ts.cc | 167 +++--- src/utils.cc | 47 +- 64 files changed, 9030 insertions(+), 1607 deletions(-) create mode 100644 grammar/css.scm create mode 100644 grammar/diff.scm create mode 100644 grammar/embedded_template.scm create mode 100644 grammar/fish.scm create mode 100644 grammar/gdscript.scm create mode 100644 grammar/gitattributes.scm create mode 100644 grammar/gitignore.scm create mode 100644 grammar/go.scm create mode 100644 grammar/gomod.scm create mode 100644 grammar/haskell.scm create mode 100644 grammar/html.scm create mode 100644 grammar/ini.scm create mode 100644 grammar/javascript.scm create mode 100644 grammar/json.scm create mode 100644 grammar/lua.scm create mode 100644 grammar/make.scm create mode 100644 grammar/markdown.scm create mode 100644 grammar/markdown_inline.scm create mode 100644 grammar/nginx.scm create mode 100644 grammar/php.scm create mode 100644 grammar/python.scm create mode 100644 grammar/query.scm create mode 100644 grammar/regex.scm create mode 100644 grammar/rust.scm create mode 100644 grammar/sql.scm create mode 100644 grammar/toml.scm create mode 100644 grammar/yaml.scm delete mode 160000 libs/tree-sitter-cabal create mode 100644 samples/Makefile create mode 100644 samples/css.css create mode 100644 samples/diff.patch create mode 100644 samples/embedded_template.erb create mode 100644 samples/fish.fish create mode 100644 samples/gdscript.gd create mode 100644 samples/go.go create mode 100644 samples/go.mod create mode 100644 samples/haskell.hs create mode 100644 samples/html.html create mode 100644 samples/ini.ini create mode 100644 samples/javascript.js create mode 100644 samples/json.jsonc create mode 100644 samples/lua.lua create mode 100644 samples/markdown.md create mode 100644 samples/nginx.conf create mode 100644 samples/php.php create mode 100644 samples/python.py create mode 100644 samples/regex.regex create mode 100644 samples/rust.rs create mode 100644 samples/sample.gitattributes create mode 100644 samples/sample.gitignore create mode 100644 samples/sql.sql create mode 100644 samples/toml.toml diff --git a/.gitmodules b/.gitmodules index 15f9b26..cb88702 100644 --- a/.gitmodules +++ b/.gitmodules @@ -19,7 +19,7 @@ url = https://github.com/tree-sitter/tree-sitter-cpp.git ignore = dirty [submodule "libs/tree-sitter-css"] - path = libs/tree-sitter-css + path = libs/tree-sitter-css url = https://github.com/tree-sitter/tree-sitter-css.git ignore = dirty [submodule "libs/tree-sitter-html"] @@ -90,10 +90,6 @@ path = libs/tree-sitter-query url = https://github.com/tree-sitter-grammars/tree-sitter-query ignore = dirty -[submodule "libs/tree-sitter-cabal"] - path = libs/tree-sitter-cabal - url = https://gitlab.com/magus/tree-sitter-cabal - ignore = dirty [submodule "libs/tree-sitter-go-mod"] path = libs/tree-sitter-go-mod url = https://github.com/camdencheek/tree-sitter-go-mod diff --git a/Makefile b/Makefile index 1b3dd52..d371a86 100644 --- a/Makefile +++ b/Makefile @@ -41,12 +41,12 @@ GITIGNORE_OBJ_PARSER := libs/tree-sitter-gitignore/build/Release/obj.target/tree FISH_OBJ_PARSER := libs/tree-sitter-fish/build/Release/obj.target/tree_sitter_fish_binding/src/parser.o FISH_OBJ_SCANNER := libs/tree-sitter-fish/build/Release/obj.target/tree_sitter_fish_binding/src/scanner.o -CABAL_OBJ_PARSER := libs/tree-sitter-cabal/build/Release/obj.target/tree_sitter_cabal_binding/src/parser.o -CABAL_OBJ_SCANNER := libs/tree-sitter-cabal/src/libscanner.a - MD_OBJ_PARSER := libs/tree-sitter-markdown/build/Release/obj.target/tree_sitter_markdown_binding/tree-sitter-markdown/src/parser.o MD_OBJ_SCANNER := libs/tree-sitter-markdown/build/Release/obj.target/tree_sitter_markdown_binding/tree-sitter-markdown/src/scanner.o +MD_I_OBJ_PARSER := libs/tree-sitter-markdown/build/Release/obj.target/tree_sitter_markdown_binding/tree-sitter-markdown-inline/src/parser.o +MD_I_OBJ_SCANNER := libs/tree-sitter-markdown/build/Release/obj.target/tree_sitter_markdown_binding/tree-sitter-markdown-inline/src/scanner.o + LIBS := \ libs/libgrapheme/libgrapheme.a \ libs/tree-sitter/libtree-sitter.a \ @@ -56,10 +56,10 @@ LIBS := \ $(GITIGNORE_OBJ_PARSER) \ $(FISH_OBJ_PARSER) \ $(FISH_OBJ_SCANNER) \ - $(CABAL_OBJ_PARSER) \ - $(CABAL_OBJ_SCANNER) \ $(MD_OBJ_PARSER) \ $(MD_OBJ_SCANNER) \ + $(MD_I_OBJ_PARSER) \ + $(MD_I_OBJ_SCANNER) \ -lpcre2-8 -lmagic SRC := $(wildcard $(SRC_DIR)/*.cc) diff --git a/README.md b/README.md index 1318c0b..01a36b6 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ A TUI IDE. # TODO -- [ ] Get all tree-sitter grammars needed and write down their scm files. +- [ ] Get lsp warnings byte offsets/lengths and render them as background color. - [ ] Add support for LSP & autocomplete / snippets. - First research - `textDocument/documentHighlight` - for highlighting stuff (probably tree-sitter is enough) @@ -28,6 +28,8 @@ A TUI IDE. 2. One for stuff that only affects highlighting and styles . like symbol highlighting etc. 3. One for Warnings/errors and inlay hints etc. (stuff that adds virtual text to the editor) 4. One for fromatting and stuff like that. (stuff that edits the buffer text) +- [ ] Make tree sitter spans truly incremental - or atleast make them pos based and not byte so minor changes only shifts inline + - And make inner trees incremental too - [ ] Use LSP to add inlay hints in order to test virtual text. then make an iterator over screen that mimics the renderer for scrolling functions. - [ ] Add codeium/copilot support for auto-completion (uses the VAI virtual text) as a test phase. - [ ] Add a whitespace highlighter (nerd font). for spaces and tabs at start/end of line. not as virtual but instead at render time. diff --git a/grammar/bash.scm b/grammar/bash.scm index 25879c7..3ae0614 100644 --- a/grammar/bash.scm +++ b/grammar/bash.scm @@ -265,12 +265,6 @@ (case_item value: (word) @variable.parameter) -;; #95E6CB #000000 0 0 0 2 -[ - (regex) - (extglob_pattern) -] @string.regexp - ;; #AAD94C #000000 0 0 0 3 ((program . @@ -279,219 +273,163 @@ ; Injections -( -;; !bash - (heredoc_body) @bash_injection - ((heredoc_end) @lang - (#match? @lang "BASH")) -) - -( -;; !c - (heredoc_body) @c_injection - ((heredoc_end) @lang - (#match? @lang "C$")) -) - -( -;; !cpp - (heredoc_body) @cpp_injection - ((heredoc_end) @lang - (#match? @lang "CPP")) -) - -( -;; !css - (heredoc_body) @css_injection - ((heredoc_end) @lang - (#match? @lang "CSS")) -) - -( -;; !fish - (heredoc_body) @fish_injection - ((heredoc_end) @lang - (#match? @lang "FISH")) -) - -( -;; !go - (heredoc_body) @go_injection - ((heredoc_end) @lang - (#match? @lang "GO")) -) - -( -;; !haskell - (heredoc_body) @haskell_injection - ((heredoc_end) @lang - (#match? @lang "HASKELL")) -) - -( -;; !html - (heredoc_body) @html_injection - ((heredoc_end) @lang - (#match? @lang "HTML")) -) - -( -;; !javascript - (heredoc_body) @javascript_injection - ((heredoc_end) @lang - (#match? @lang "JAVASCRIPT")) -) - -( -;; !json - (heredoc_body) @json_injection - ((heredoc_end) @lang - (#match? @lang "JSON")) -) - -( -;; !lua - (heredoc_body) @lua_injection - ((heredoc_end) @lang - (#match? @lang "LUA")) -) - -( -;; !make - (heredoc_body) @make_injection - ((heredoc_end) @lang - (#match? @lang "MAKE")) -) - -( -;; !python - (heredoc_body) @python_injection - ((heredoc_end) @lang - (#match? @lang "PYTHON")) -) - -( -;; !ruby - (heredoc_body) @ruby_injection - ((heredoc_end) @lang - (#match? @lang "RUBY")) -) - -( -;; !rust - (heredoc_body) @rust_injection - ((heredoc_end) @lang - (#match? @lang "RUST")) -) - -( -;; !diff - (heredoc_body) @diff_injection - ((heredoc_end) @lang - (#match? @lang "DIFF")) -) - -( -;; !embedded_template - (heredoc_body) @embedded_template_injection - ((heredoc_end) @lang - (#match? @lang "ERB")) -) - -( -;; !gdscript - (heredoc_body) @gdscript_injection - ((heredoc_end) @lang - (#match? @lang "GDSCRIPT")) -) - -( -;; !gitattributes - (heredoc_body) @gitattributes_injection - ((heredoc_end) @lang - (#match? @lang "GITATTRIBUTES")) -) - -( -;; !gitignore - (heredoc_body) @gitignore_injection - ((heredoc_end) @lang - (#match? @lang "GITIGNORE")) -) - -( -;; !gomod - (heredoc_body) @gomod_injection - ((heredoc_end) @lang - (#match? @lang "GOMOD")) -) - -( -;; !ini - (heredoc_body) @ini_injection - ((heredoc_end) @lang - (#match? @lang "INI")) -) - -( -;; !markdown - (heredoc_body) @markdown_injection - ((heredoc_end) @lang - (#match? @lang "MARKDOWN")) -) - -( -;; !nginx - (heredoc_body) @nginx_injection - ((heredoc_end) @lang - (#match? @lang "NGINX")) -) - -( -;; !php - (heredoc_body) @php_injection - ((heredoc_end) @lang - (#match? @lang "PHP")) -) - -( -;; !query - (heredoc_body) @query_injection - ((heredoc_end) @lang - (#match? @lang "QUERY")) -) - -( ;; !regex - (heredoc_body) @regex_injection - ((heredoc_end) @lang - (#match? @lang "REGEX")) -) +[ + (regex) + (extglob_pattern) +] @string.regexp + +;; !bash +((heredoc_body) @bash_injection + ((heredoc_end) @lang + (#match? @lang "BASH"))) + +;; !c +((heredoc_body) @c_injection + ((heredoc_end) @lang + (#match? @lang "C$"))) + +;; !cpp +((heredoc_body) @cpp_injection + ((heredoc_end) @lang + (#match? @lang "CPP"))) + +;; !css +((heredoc_body) @css_injection + ((heredoc_end) @lang + (#match? @lang "CSS"))) + +;; !fish +((heredoc_body) @fish_injection + ((heredoc_end) @lang + (#match? @lang "FISH"))) + +;; !go +((heredoc_body) @go_injection + ((heredoc_end) @lang + (#match? @lang "GO"))) + +;; !haskell +((heredoc_body) @haskell_injection + ((heredoc_end) @lang + (#match? @lang "HASKELL"))) + +;; !html +((heredoc_body) @html_injection + ((heredoc_end) @lang + (#match? @lang "HTML"))) + +;; !javascript +((heredoc_body) @javascript_injection + ((heredoc_end) @lang + (#match? @lang "JAVASCRIPT"))) + +;; !json +((heredoc_body) @json_injection + ((heredoc_end) @lang + (#match? @lang "JSON"))) + +;; !lua +((heredoc_body) @lua_injection + ((heredoc_end) @lang + (#match? @lang "LUA"))) + +;; !make +((heredoc_body) @make_injection + ((heredoc_end) @lang + (#match? @lang "MAKE"))) + +;; !python +((heredoc_body) @python_injection + ((heredoc_end) @lang + (#match? @lang "PYTHON"))) + +;; !ruby +((heredoc_body) @ruby_injection + ((heredoc_end) @lang + (#match? @lang "RUBY"))) + +;; !rust +((heredoc_body) @rust_injection + ((heredoc_end) @lang + (#match? @lang "RUST"))) + +;; !diff +((heredoc_body) @diff_injection + ((heredoc_end) @lang + (#match? @lang "DIFF"))) + +;; !embedded_template +((heredoc_body) @embedded_template_injection + ((heredoc_end) @lang + (#match? @lang "ERB"))) + +;; !gdscript +((heredoc_body) @gdscript_injection + ((heredoc_end) @lang + (#match? @lang "GDSCRIPT"))) + +;; !gitattributes +((heredoc_body) @gitattributes_injection + ((heredoc_end) @lang + (#match? @lang "GITATTRIBUTES"))) + +;; !gitignore +((heredoc_body) @gitignore_injection + ((heredoc_end) @lang + (#match? @lang "GITIGNORE"))) + +;; !gomod +((heredoc_body) @gomod_injection + ((heredoc_end) @lang + (#match? @lang "GOMOD"))) + +;; !ini +((heredoc_body) @ini_injection + ((heredoc_end) @lang + (#match? @lang "INI"))) + +;; !markdown +((heredoc_body) @markdown_injection + ((heredoc_end) @lang + (#match? @lang "MARKDOWN"))) + +;; !nginx +((heredoc_body) @nginx_injection + ((heredoc_end) @lang + (#match? @lang "NGINX"))) + +;; !php +((heredoc_body) @php_injection + ((heredoc_end) @lang + (#match? @lang "PHP"))) + +;; !query +((heredoc_body) @query_injection + ((heredoc_end) @lang + (#match? @lang "QUERY"))) + +;; !regex +((heredoc_body) @regex_injection + ((heredoc_end) @lang + (#match? @lang "REGEX"))) -( ;; !sql - (heredoc_body) @sql_injection +((heredoc_body) @sql_injection ((heredoc_end) @lang - (#match? @lang "SQL")) -) + (#match? @lang "SQL"))) -( ;; !toml - (heredoc_body) @toml_injection +((heredoc_body) @toml_injection ((heredoc_end) @lang - (#match? @lang "TOML")) -) + (#match? @lang "TOML"))) -( ;; !yaml - (heredoc_body) @yaml_injection +((heredoc_body) @yaml_injection ((heredoc_end) @lang - (#match? @lang "YAML")) -) + (#match? @lang "YAML"))) -( ;; !cabal - (heredoc_body) @cabal_injection +((heredoc_body) @cabal_injection ((heredoc_end) @lang - (#match? @lang "CABAL")) -) + (#match? @lang "CABAL"))) diff --git a/grammar/c.scm b/grammar/c.scm index 49df591..31215ae 100644 --- a/grammar/c.scm +++ b/grammar/c.scm @@ -1,11 +1,54 @@ -;; #ffffff #000000 0 0 0 1 -((identifier) @variable - (#set! priority 95)) +; ============================================================ +; Identifiers +; ============================================================ +;; #FFFFFF #000000 0 0 0 1 +((identifier) @variable) + +;; #FFB870 #000000 0 0 0 9 +(function_declarator + declarator: (identifier) @function) + +;; #C4B5FF #000000 0 0 0 2 +((identifier) @constant + (#match? @constant "^[A-Z][A-Z0-9_]+$")) + +;; #C4B5FF #000000 0 0 0 2 +(preproc_def + (preproc_arg) @constant + (#match? @constant "^[A-Z][A-Z0-9_]+$")) + +;; #F29CC3 #000000 0 0 0 2 +((identifier) @constant.builtin + (#match? @constant.builtin "^(stderr|stdin|stdout|__FILE__|__LINE__|__DATE__|__TIME__|__STDC__|__STDC_VERSION__|__STDC_HOSTED__|__cplusplus|__OBJC__|__ASSEMBLER__|__BASE_FILE__|__FILE_NAME__|__INCLUDE_LEVEL__|__TIMESTAMP__|__clang__|__clang_major__|__clang_minor__|__clang_patchlevel__|__clang_version__|__clang_literal_encoding__|__clang_wide_literal_encoding__|__FUNCTION__|__func__|__PRETTY_FUNCTION__|__VA_ARGS__|__VA_OPT__)$")) + +;; #F29CC3 #000000 0 0 0 2 +(preproc_def + (preproc_arg) @constant.builtin + (#match? @constant.builtin "^(stderr|stdin|stdout|__FILE__|__LINE__|__DATE__|__TIME__|__STDC__|__STDC_VERSION__|__STDC_HOSTED__|__cplusplus|__OBJC__|__ASSEMBLER__|__BASE_FILE__|__FILE_NAME__|__INCLUDE_LEVEL__|__TIMESTAMP__|__clang__|__clang_major__|__clang_minor__|__clang_patchlevel__|__clang_version__|__clang_literal_encoding__|__clang_wide_literal_encoding__|__FUNCTION__|__func__|__PRETTY_FUNCTION__|__VA_ARGS__|__VA_OPT__)$")) + +;; #8AD5FF #000000 0 0 0 2 (preproc_def (preproc_arg) @variable) -;; #FF8F40 #000000 0 0 0 1 +;; #8AD5FF #000000 0 0 0 2 +(statement_identifier) @label + +;; #8AD5FF #000000 0 0 0 2 +(declaration + type: (type_identifier) @_type + declarator: (identifier) @label + (#match? @_type "^__label__$")) + +;; #7CD5CF #000000 0 0 0 2 +((identifier) @variable.member + (#match? @variable.member "^m_.*$")) + +; ============================================================ +; Keywords +; ============================================================ + +;; #9AD4FF #000000 0 0 0 2 [ "default" "goto" @@ -13,6 +56,7 @@ "__asm__" ] @keyword +;; #9AD4FF #000000 0 0 0 2 [ "enum" "struct" @@ -20,19 +64,21 @@ "typedef" ] @keyword.type +;; #F29CC3 #000000 0 0 0 2 [ "sizeof" "offsetof" ] @keyword.operator +;; #F29CC3 #000000 0 0 0 2 (alignof_expression . _ @keyword.operator) -;; #FF8F40 #000000 0 0 0 1 +;; #FFB870 #000000 0 0 0 2 "return" @keyword.return -;; #FF8F40 #000000 0 0 0 1 +;; #9AD4FF #000000 0 0 0 2 [ "while" "for" @@ -41,7 +87,7 @@ "break" ] @keyword.repeat -;; #FF8F40 #000000 0 0 0 1 +;; #FFB870 #000000 0 0 0 2 [ "if" "else" @@ -49,7 +95,14 @@ "switch" ] @keyword.conditional -;; #FF8F40 #000000 0 0 0 1 +;; #9AD4FF #000000 0 0 0 2 +(conditional_expression + [ + "?" + ":" + ] @keyword.conditional.ternary) + +;; #8AD5FF #000000 0 0 0 2 [ "#if" "#ifdef" @@ -62,33 +115,285 @@ (preproc_directive) ] @keyword.directive -;; #FF8F40 #000000 0 0 0 1 +;; #8AD5FF #000000 0 0 0 2 "#define" @keyword.directive.define -;; #FF8F40 #000000 0 0 0 1 +;; #8AD5FF #000000 0 0 0 2 "#include" @keyword.import -;; #BFBDB6 #000000 0 0 0 1 +;; #9AD4FF #000000 0 0 0 2 [ - ";" - ":" - "," - "." - "::" -] @punctuation.delimiter + "try" + "catch" + "noexcept" + "throw" +] @keyword.exception -;; #BFBDB6 #000000 0 0 0 2 -"..." @punctuation.special - -;; #BFBDB6 #000000 0 0 0 1 +;; #9AD4FF #000000 0 0 0 2 [ - "(" - ")" - "[" - "]" - "{" - "}" -] @punctuation.bracket + "decltype" + "explicit" + "friend" + "override" + "using" + "requires" + "constexpr" +] @keyword + +;; #9AD4FF #000000 0 0 0 2 +[ + "class" + "namespace" + "template" + "typename" + "concept" +] @keyword.type + +;; #9AD4FF #000000 0 0 0 2 +[ + "co_await" + "co_yield" + "co_return" +] @keyword.coroutine + +;; #F29CC3 #000000 0 0 0 2 +[ + "public" + "private" + "protected" + "final" + "virtual" +] @keyword.modifier + +;; #F29CC3 #000000 0 0 0 2 +(storage_class_specifier) @keyword.modifier + +;; #F29CC3 #000000 0 0 0 2 +[ + (type_qualifier) + (gnu_asm_qualifier) + "__extension__" +] @keyword.modifier + +;; #F29CC3 #000000 0 0 0 2 +(linkage_specification + "extern" @keyword.modifier) + +;; #F29668 #000000 0 0 0 2 +[ + "new" + "delete" + "xor" + "bitand" + "bitor" + "compl" + "not" + "xor_eq" + "and_eq" + "or_eq" + "not_eq" + "and" + "or" +] @keyword.operator + +;; #F29668 #000000 0 1 0 2 +"<=>" @operator + +; ============================================================ +; Types & modules +; ============================================================ + +;; #C4B5FF #000000 0 0 0 2 +[ + (type_identifier) + (type_descriptor) +] @type + +;; #C4B5FF #000000 0 0 0 2 +(type_definition + declarator: (type_identifier) @type.definition) + +;; #C4B5FF #000000 0 0 0 2 +(primitive_type) @type.builtin + +;; #C4B5FF #000000 0 0 0 2 +(sized_type_specifier + _ @type.builtin + type: _?) + +;; #C4B5FF #000000 0 0 0 2 +(type_definition declarator: (type_identifier) @name) @definition.type + +;; #C4B5FF #000000 0 0 0 2 +(enum_specifier name: (type_identifier) @name) @definition.type + +;; #C4B5FF #000000 0 0 0 2 +(class_specifier name: (type_identifier) @name) @definition.class + +;; #C4B5FF #000000 0 0 0 2 +(struct_specifier name: (type_identifier) @name body:(_)) @definition.class + +;; #C4B5FF #000000 0 0 0 2 +(declaration type: (union_specifier name: (type_identifier) @name)) @definition.class + +;; #9AD4FF #000000 0 0 0 2 +(namespace_identifier) @module + +;; #9AD4FF #000000 0 0 0 2 +((namespace_identifier) @type + (#match? @type "^[A-Z]")) + +;; #9AD4FF #000000 0 0 0 2 +(using_declaration + . + "using" + . + "namespace" + . + [ + (qualified_identifier) + (identifier) + ] @module) + +; ============================================================ +; Functions & calls +; ============================================================ + +;; #FFB870 #000000 0 0 0 1 +(operator_name) @function + +;; #FFB870 #000000 0 0 0 3 +"operator" @function + +;; #78C2FF #000000 0 0 0 2 +(call_expression + function: (identifier) @function.call) + +;; #F29CC3 #000000 0 0 0 2 +((call_expression + function: (identifier) @function.builtin) + (#match? @function.builtin "^__builtin_")) + +;; #F29CC3 #000000 0 0 0 2 +((call_expression + function: (identifier) @function.builtin)) + +; ============================================================ +; Constructors & methods +; ============================================================ + +;; #59C2FF #000000 0 0 0 2 +((call_expression + function: (identifier) @constructor) + (#match? @constructor "^[A-Z]")) + +;; #59C2FF #000000 0 0 0 2 +((call_expression + function: (qualified_identifier + name: (identifier) @constructor)) + (#match? @constructor "^[A-Z]")) + +;; #59C2FF #000000 0 0 0 2 +((call_expression + function: (field_expression + field: (field_identifier) @constructor)) + (#match? @constructor "^[A-Z]")) + +;; #59C2FF #000000 0 0 0 2 +((field_initializer + (field_identifier) @constructor + (argument_list)) + (#match? @constructor "^[A-Z]")) + +;; #59C2FF #000000 0 0 0 4 +(destructor_name + (identifier) @function.method) + +; ============================================================ +; Properties & members +; ============================================================ + +;; #F29CC3 #000000 0 0 0 2 +((field_expression + (field_identifier) @property) @_parent) + +(field_designator) @property + +((field_identifier) @property) + +(field_initializer + (field_identifier) @property) + +;; #F29CC3 #000000 0 0 1 2 +(field_declaration + (field_identifier) @variable.member) + +; ============================================================ +; Parameters +; ============================================================ + +;; #7CD5CF #000000 0 0 0 2 +(parameter_declaration + declarator: (identifier) @variable.parameter) + +;; #7CD5CF #000000 0 0 0 2 +(parameter_declaration + declarator: (array_declarator) @variable.parameter) + +;; #7CD5CF #000000 0 0 0 2 +(parameter_declaration + declarator: (pointer_declarator) @variable.parameter) + +;; #7CD5CF #000000 0 0 0 2 +(preproc_params + (identifier) @variable.parameter) + +;; #7CD5CF #000000 0 0 0 2 +(parameter_declaration + declarator: (reference_declarator) @variable.parameter) + +;; #7CD5CF #000000 0 0 0 2 +(variadic_parameter_declaration + declarator: (variadic_declarator + (_) @variable.parameter)) + +;; #7CD5CF #000000 0 0 0 2 +(optional_parameter_declaration + declarator: (_) @variable.parameter) + +; ============================================================ +; Attributes & specifiers +; ============================================================ + +;; #7CD5CF #000000 0 0 0 2 +[ + "__attribute__" + "__declspec" + "__based" + "__cdecl" + "__clrcall" + "__stdcall" + "__fastcall" + "__thiscall" + "__vectorcall" + (ms_pointer_modifier) + (attribute_declaration) +] @attribute + +;; #7CD5CF #000000 0 0 0 2 +(attribute_specifier + (argument_list + (identifier) @variable.builtin)) + +;; #7CD5CF #000000 0 0 0 2 +(attribute_specifier + (argument_list + (call_expression + function: (identifier) @variable.builtin))) + +; ============================================================ +; Operators & punctuation +; ============================================================ ;; #F29668 #000000 0 1 0 1 [ @@ -128,236 +433,147 @@ "++" ] @operator -;; #F29668 #000000 0 0 0 1 +;; #F29668 #000000 0 1 0 1 (comma_expression "," @operator) -;; #D2A6FF #000000 0 0 0 1 +;; #B6BEC8 #000000 0 0 0 1 +[ + ";" + ":" + "," + "." + "::" +] @punctuation.delimiter + +;; #B6BEC8 #000000 0 0 0 1 +"::" @punctuation.delimiter + +;; #B6BEC8 #000000 0 0 0 1 +"..." @punctuation.special + +;; #B6BEC8 #000000 0 0 0 1 +[ + "(" + ")" + "[" + "]" + "{" + "}" +] @punctuation.bracket + +;; #B6BEC8 #000000 0 0 0 1 +(template_argument_list + [ + "<" + ">" + ] @punctuation.bracket) + +;; #B6BEC8 #000000 0 0 0 1 +(template_parameter_list + [ + "<" + ">" + ] @punctuation.bracket) + +; ============================================================ +; Literals +; ============================================================ + +;; #C2E8FF #000000 0 0 0 2 [ (true) (false) ] @boolean -;; #F29668 #000000 0 0 0 1 -(conditional_expression - [ - "?" - ":" - ] @keyword.conditional.ternary) +;; #C2E8FF #000000 0 0 0 2 +(true) @boolean_true -;; #aad84c #000000 0 0 0 1 +;; #C2E8FF #000000 0 0 0 2 +(false) @boolean_false + +;; #A6E3A1 #000000 0 0 0 2 (string_literal) @string +;; #A6E3A1 #000000 0 0 0 2 (system_lib_string) @string -;; #95E6CB #000000 0 0 0 2 +;; #A6E3A1 #000000 0 0 0 2 +(raw_string_literal) @string + +;; #A6E3A1 #000000 0 0 0 2 (escape_sequence) @string.escape -;; #D2A6FF #000000 0 0 0 1 -(null) @constant.builtin - -;; #D2A6FF #000000 0 0 0 1 +;; #B8E986 #000000 0 0 0 2 (number_literal) @number -;; #39BAE6 #000000 0 0 0 1 +;; #B8E986 #000000 0 0 0 2 (char_literal) @character -;; #FFB454 #000000 0 0 0 1 -(preproc_defined) @function.macro +;; #F29CC3 #000000 0 0 0 2 +(null) @constant.builtin -;; #F07178 #000000 0 0 0 1 -((field_expression - (field_identifier) @property) @_parent) +;; #F29CC3 #000000 0 0 0 2 +(null + "nullptr" @constant.builtin) -(field_designator) @property +; ============================================================ +; Macros & directives +; ============================================================ -((field_identifier) @property) - -;; #39BAE6 #000000 0 0 0 1 -(statement_identifier) @label - -(declaration - type: (type_identifier) @_type - declarator: (identifier) @label - (#match? @_type "^__label__$")) - -;; #59C2FF #000000 0 0 0 1 -[ - (type_identifier) - (type_descriptor) -] @type - -;; #FF8F40 #000000 0 0 0 1 -(storage_class_specifier) @keyword.modifier - -[ - (type_qualifier) - (gnu_asm_qualifier) - "__extension__" -] @keyword.modifier - -;; #FF8F40 #000000 0 0 0 1 -(linkage_specification - "extern" @keyword.modifier) - -;; #59C2FF #000000 0 0 0 1 -(type_definition - declarator: (type_identifier) @type.definition) - -;; #59C2FF #000000 0 0 0 1 -(primitive_type) @type.builtin - -(sized_type_specifier - _ @type.builtin - type: _?) - -;; #D2A6FF #000000 0 0 0 1 -((identifier) @constant - (#match? @constant "^[A-Z][A-Z0-9_]+$")) - -(preproc_def - (preproc_arg) @constant - (#match? @constant "^[A-Z][A-Z0-9_]+$")) - -(enumerator - name: (identifier) @constant) - -(case_statement - value: (identifier) @constant) - -;; #D2A6FF #000000 0 0 0 1 -((identifier) @constant.builtin - (#match? @constant.builtin "^(stderr|stdin|stdout|__FILE__|__LINE__|__DATE__|__TIME__|__STDC__|__STDC_VERSION__|__STDC_HOSTED__|__cplusplus|__OBJC__|__ASSEMBLER__|__BASE_FILE__|__FILE_NAME__|__INCLUDE_LEVEL__|__TIMESTAMP__|__clang__|__clang_major__|__clang_minor__|__clang_patchlevel__|__clang_version__|__clang_literal_encoding__|__clang_wide_literal_encoding__|__FUNCTION__|__func__|__PRETTY_FUNCTION__|__VA_ARGS__|__VA_OPT__)$")) - -(preproc_def - (preproc_arg) @constant.builtin - (#match? @constant.builtin "^(stderr|stdin|stdout|__FILE__|__LINE__|__DATE__|__TIME__|__STDC__|__STDC_VERSION__|__STDC_HOSTED__|__cplusplus|__OBJC__|__ASSEMBLER__|__BASE_FILE__|__FILE_NAME__|__INCLUDE_LEVEL__|__TIMESTAMP__|__clang__|__clang_major__|__clang_minor__|__clang_patchlevel__|__clang_version__|__clang_literal_encoding__|__clang_wide_literal_encoding__|__FUNCTION__|__func__|__PRETTY_FUNCTION__|__VA_ARGS__|__VA_OPT__)$")) - -;; #D2A6FF #000000 0 0 0 1 -(attribute_specifier - (argument_list - (identifier) @variable.builtin)) - -(attribute_specifier - (argument_list - (call_expression - function: (identifier) @variable.builtin))) - -;; #FFB454 #000000 0 0 0 1 -((call_expression - function: (identifier) @function.builtin) - (#match? @function.builtin "^__builtin_")) - -((call_expression - function: (identifier) @function.builtin)) - -;; #D2A6FF #000000 0 0 0 1 +;; #F29CC3 #000000 0 0 0 2 (preproc_def name: (_) @constant.macro) +;; #F29CC3 #000000 0 0 0 2 (preproc_call directive: (preproc_directive) @_u argument: (_) @constant.macro (#match? @_u "^#undef$")) +;; #F29CC3 #000000 0 0 0 2 (preproc_ifdef name: (identifier) @constant.macro) +;; #F29CC3 #000000 0 0 0 2 (preproc_elifdef name: (identifier) @constant.macro) +;; #F29CC3 #000000 0 0 0 2 (preproc_defined (identifier) @constant.macro) -;; #FFB454 #000000 0 0 0 3 -(call_expression - function: (identifier) @function.call) +;; #F29CC3 #000000 0 0 0 2 +(preproc_defined) @function.macro -(call_expression - function: (field_expression - field: (field_identifier) @function.call)) +; ============================================================ +; Builtins & special identifiers +; ============================================================ -;; #FFB454 #000000 0 0 0 3 -(function_declarator - declarator: (identifier) @function) +;; #F28FAD #000000 0 0 0 2 +(attribute_specifier + (argument_list + (identifier) @variable.builtin)) -(function_declarator - declarator: (parenthesized_declarator - (pointer_declarator - declarator: (field_identifier) @function))) +;; #F28FAD #000000 0 0 0 2 +(attribute_specifier + (argument_list + (call_expression + function: (identifier) @variable.builtin))) -;; #FFB454 #000000 0 0 0 3 -(preproc_function_def - name: (identifier) @function.macro) +;; #F28FAD #000000 0 0 0 2 +(this) @variable.builtin + +; ============================================================ +; Exceptions & control helpers +; ============================================================ + +;; #FFB870 #000000 0 0 0 2 +"static_assert" @function.builtin + +; ============================================================ +; Comments +; ============================================================ ;; #99ADBF #000000 0 1 0 1 (comment) @comment @spell - -;; #99ADBF #000000 0 1 0 1 -((comment) @comment.documentation - (#match? @comment.documentation "^/[*][*][^*].*[*]/$")) - -;; #D2A6FF #000000 0 0 0 1 -(parameter_declaration - declarator: (identifier) @variable.parameter) - -(parameter_declaration - declarator: (array_declarator) @variable.parameter) - -(parameter_declaration - declarator: (pointer_declarator) @variable.parameter) - -(preproc_params - (identifier) @variable.parameter) - -;; #FF8F40 #000000 0 0 0 1 -[ - "__attribute__" - "__declspec" - "__based" - "__cdecl" - "__clrcall" - "__stdcall" - "__fastcall" - "__thiscall" - "__vectorcall" - (ms_pointer_modifier) - (attribute_declaration) -] @attribute - -;; #F07178 #000000 0 0 0 1 -((identifier) @variable.member - (#match? @variable.member "^m_.*$")) - -(parameter_declaration - declarator: (reference_declarator) @variable.parameter) - -(variadic_parameter_declaration - declarator: (variadic_declarator - (_) @variable.parameter)) - -(optional_parameter_declaration - declarator: (_) @variable.parameter) - -;; #F07178 #000000 0 0 0 1 -((field_expression - (field_identifier) @function.method) @_parent) - -(field_declaration - (field_identifier) @variable.member) - -(field_initializer - (field_identifier) @property) - -(function_declarator - declarator: (field_identifier) @function.method) - -;; #59C2FF #000000 0 0 0 3 -(concept_definition - name: (identifier) @type.definition) - -(alias_declaration - name: (type_identifier) @type.definition) - -;; #59C2FF #000000 0 0 0 1 -(auto) @type.builtin diff --git a/grammar/cpp.scm b/grammar/cpp.scm index d6b8b26..31215ae 100644 --- a/grammar/cpp.scm +++ b/grammar/cpp.scm @@ -1,11 +1,54 @@ -;; #ffffff #000000 0 0 0 1 -((identifier) @variable - (#set! priority 95)) +; ============================================================ +; Identifiers +; ============================================================ +;; #FFFFFF #000000 0 0 0 1 +((identifier) @variable) + +;; #FFB870 #000000 0 0 0 9 +(function_declarator + declarator: (identifier) @function) + +;; #C4B5FF #000000 0 0 0 2 +((identifier) @constant + (#match? @constant "^[A-Z][A-Z0-9_]+$")) + +;; #C4B5FF #000000 0 0 0 2 +(preproc_def + (preproc_arg) @constant + (#match? @constant "^[A-Z][A-Z0-9_]+$")) + +;; #F29CC3 #000000 0 0 0 2 +((identifier) @constant.builtin + (#match? @constant.builtin "^(stderr|stdin|stdout|__FILE__|__LINE__|__DATE__|__TIME__|__STDC__|__STDC_VERSION__|__STDC_HOSTED__|__cplusplus|__OBJC__|__ASSEMBLER__|__BASE_FILE__|__FILE_NAME__|__INCLUDE_LEVEL__|__TIMESTAMP__|__clang__|__clang_major__|__clang_minor__|__clang_patchlevel__|__clang_version__|__clang_literal_encoding__|__clang_wide_literal_encoding__|__FUNCTION__|__func__|__PRETTY_FUNCTION__|__VA_ARGS__|__VA_OPT__)$")) + +;; #F29CC3 #000000 0 0 0 2 +(preproc_def + (preproc_arg) @constant.builtin + (#match? @constant.builtin "^(stderr|stdin|stdout|__FILE__|__LINE__|__DATE__|__TIME__|__STDC__|__STDC_VERSION__|__STDC_HOSTED__|__cplusplus|__OBJC__|__ASSEMBLER__|__BASE_FILE__|__FILE_NAME__|__INCLUDE_LEVEL__|__TIMESTAMP__|__clang__|__clang_major__|__clang_minor__|__clang_patchlevel__|__clang_version__|__clang_literal_encoding__|__clang_wide_literal_encoding__|__FUNCTION__|__func__|__PRETTY_FUNCTION__|__VA_ARGS__|__VA_OPT__)$")) + +;; #8AD5FF #000000 0 0 0 2 (preproc_def (preproc_arg) @variable) -;; #FF8F40 #000000 0 0 0 1 +;; #8AD5FF #000000 0 0 0 2 +(statement_identifier) @label + +;; #8AD5FF #000000 0 0 0 2 +(declaration + type: (type_identifier) @_type + declarator: (identifier) @label + (#match? @_type "^__label__$")) + +;; #7CD5CF #000000 0 0 0 2 +((identifier) @variable.member + (#match? @variable.member "^m_.*$")) + +; ============================================================ +; Keywords +; ============================================================ + +;; #9AD4FF #000000 0 0 0 2 [ "default" "goto" @@ -13,6 +56,7 @@ "__asm__" ] @keyword +;; #9AD4FF #000000 0 0 0 2 [ "enum" "struct" @@ -20,19 +64,21 @@ "typedef" ] @keyword.type +;; #F29CC3 #000000 0 0 0 2 [ "sizeof" "offsetof" ] @keyword.operator +;; #F29CC3 #000000 0 0 0 2 (alignof_expression . _ @keyword.operator) -;; #FF8F40 #000000 0 0 0 1 +;; #FFB870 #000000 0 0 0 2 "return" @keyword.return -;; #FF8F40 #000000 0 0 0 1 +;; #9AD4FF #000000 0 0 0 2 [ "while" "for" @@ -41,7 +87,7 @@ "break" ] @keyword.repeat -;; #FF8F40 #000000 0 0 0 1 +;; #FFB870 #000000 0 0 0 2 [ "if" "else" @@ -49,7 +95,14 @@ "switch" ] @keyword.conditional -;; #FF8F40 #000000 0 0 0 1 +;; #9AD4FF #000000 0 0 0 2 +(conditional_expression + [ + "?" + ":" + ] @keyword.conditional.ternary) + +;; #8AD5FF #000000 0 0 0 2 [ "#if" "#ifdef" @@ -62,33 +115,285 @@ (preproc_directive) ] @keyword.directive -;; #FF8F40 #000000 0 0 0 1 +;; #8AD5FF #000000 0 0 0 2 "#define" @keyword.directive.define -;; #FF8F40 #000000 0 0 0 1 +;; #8AD5FF #000000 0 0 0 2 "#include" @keyword.import -;; #BFBDB6 #000000 0 0 0 1 +;; #9AD4FF #000000 0 0 0 2 [ - ";" - ":" - "," - "." - "::" -] @punctuation.delimiter + "try" + "catch" + "noexcept" + "throw" +] @keyword.exception -;; #BFBDB6 #000000 0 0 0 2 -"..." @punctuation.special - -;; #BFBDB6 #000000 0 0 0 1 +;; #9AD4FF #000000 0 0 0 2 [ - "(" - ")" - "[" - "]" - "{" - "}" -] @punctuation.bracket + "decltype" + "explicit" + "friend" + "override" + "using" + "requires" + "constexpr" +] @keyword + +;; #9AD4FF #000000 0 0 0 2 +[ + "class" + "namespace" + "template" + "typename" + "concept" +] @keyword.type + +;; #9AD4FF #000000 0 0 0 2 +[ + "co_await" + "co_yield" + "co_return" +] @keyword.coroutine + +;; #F29CC3 #000000 0 0 0 2 +[ + "public" + "private" + "protected" + "final" + "virtual" +] @keyword.modifier + +;; #F29CC3 #000000 0 0 0 2 +(storage_class_specifier) @keyword.modifier + +;; #F29CC3 #000000 0 0 0 2 +[ + (type_qualifier) + (gnu_asm_qualifier) + "__extension__" +] @keyword.modifier + +;; #F29CC3 #000000 0 0 0 2 +(linkage_specification + "extern" @keyword.modifier) + +;; #F29668 #000000 0 0 0 2 +[ + "new" + "delete" + "xor" + "bitand" + "bitor" + "compl" + "not" + "xor_eq" + "and_eq" + "or_eq" + "not_eq" + "and" + "or" +] @keyword.operator + +;; #F29668 #000000 0 1 0 2 +"<=>" @operator + +; ============================================================ +; Types & modules +; ============================================================ + +;; #C4B5FF #000000 0 0 0 2 +[ + (type_identifier) + (type_descriptor) +] @type + +;; #C4B5FF #000000 0 0 0 2 +(type_definition + declarator: (type_identifier) @type.definition) + +;; #C4B5FF #000000 0 0 0 2 +(primitive_type) @type.builtin + +;; #C4B5FF #000000 0 0 0 2 +(sized_type_specifier + _ @type.builtin + type: _?) + +;; #C4B5FF #000000 0 0 0 2 +(type_definition declarator: (type_identifier) @name) @definition.type + +;; #C4B5FF #000000 0 0 0 2 +(enum_specifier name: (type_identifier) @name) @definition.type + +;; #C4B5FF #000000 0 0 0 2 +(class_specifier name: (type_identifier) @name) @definition.class + +;; #C4B5FF #000000 0 0 0 2 +(struct_specifier name: (type_identifier) @name body:(_)) @definition.class + +;; #C4B5FF #000000 0 0 0 2 +(declaration type: (union_specifier name: (type_identifier) @name)) @definition.class + +;; #9AD4FF #000000 0 0 0 2 +(namespace_identifier) @module + +;; #9AD4FF #000000 0 0 0 2 +((namespace_identifier) @type + (#match? @type "^[A-Z]")) + +;; #9AD4FF #000000 0 0 0 2 +(using_declaration + . + "using" + . + "namespace" + . + [ + (qualified_identifier) + (identifier) + ] @module) + +; ============================================================ +; Functions & calls +; ============================================================ + +;; #FFB870 #000000 0 0 0 1 +(operator_name) @function + +;; #FFB870 #000000 0 0 0 3 +"operator" @function + +;; #78C2FF #000000 0 0 0 2 +(call_expression + function: (identifier) @function.call) + +;; #F29CC3 #000000 0 0 0 2 +((call_expression + function: (identifier) @function.builtin) + (#match? @function.builtin "^__builtin_")) + +;; #F29CC3 #000000 0 0 0 2 +((call_expression + function: (identifier) @function.builtin)) + +; ============================================================ +; Constructors & methods +; ============================================================ + +;; #59C2FF #000000 0 0 0 2 +((call_expression + function: (identifier) @constructor) + (#match? @constructor "^[A-Z]")) + +;; #59C2FF #000000 0 0 0 2 +((call_expression + function: (qualified_identifier + name: (identifier) @constructor)) + (#match? @constructor "^[A-Z]")) + +;; #59C2FF #000000 0 0 0 2 +((call_expression + function: (field_expression + field: (field_identifier) @constructor)) + (#match? @constructor "^[A-Z]")) + +;; #59C2FF #000000 0 0 0 2 +((field_initializer + (field_identifier) @constructor + (argument_list)) + (#match? @constructor "^[A-Z]")) + +;; #59C2FF #000000 0 0 0 4 +(destructor_name + (identifier) @function.method) + +; ============================================================ +; Properties & members +; ============================================================ + +;; #F29CC3 #000000 0 0 0 2 +((field_expression + (field_identifier) @property) @_parent) + +(field_designator) @property + +((field_identifier) @property) + +(field_initializer + (field_identifier) @property) + +;; #F29CC3 #000000 0 0 1 2 +(field_declaration + (field_identifier) @variable.member) + +; ============================================================ +; Parameters +; ============================================================ + +;; #7CD5CF #000000 0 0 0 2 +(parameter_declaration + declarator: (identifier) @variable.parameter) + +;; #7CD5CF #000000 0 0 0 2 +(parameter_declaration + declarator: (array_declarator) @variable.parameter) + +;; #7CD5CF #000000 0 0 0 2 +(parameter_declaration + declarator: (pointer_declarator) @variable.parameter) + +;; #7CD5CF #000000 0 0 0 2 +(preproc_params + (identifier) @variable.parameter) + +;; #7CD5CF #000000 0 0 0 2 +(parameter_declaration + declarator: (reference_declarator) @variable.parameter) + +;; #7CD5CF #000000 0 0 0 2 +(variadic_parameter_declaration + declarator: (variadic_declarator + (_) @variable.parameter)) + +;; #7CD5CF #000000 0 0 0 2 +(optional_parameter_declaration + declarator: (_) @variable.parameter) + +; ============================================================ +; Attributes & specifiers +; ============================================================ + +;; #7CD5CF #000000 0 0 0 2 +[ + "__attribute__" + "__declspec" + "__based" + "__cdecl" + "__clrcall" + "__stdcall" + "__fastcall" + "__thiscall" + "__vectorcall" + (ms_pointer_modifier) + (attribute_declaration) +] @attribute + +;; #7CD5CF #000000 0 0 0 2 +(attribute_specifier + (argument_list + (identifier) @variable.builtin)) + +;; #7CD5CF #000000 0 0 0 2 +(attribute_specifier + (argument_list + (call_expression + function: (identifier) @variable.builtin))) + +; ============================================================ +; Operators & punctuation +; ============================================================ ;; #F29668 #000000 0 1 0 1 [ @@ -128,486 +433,147 @@ "++" ] @operator -;; #F29668 #000000 0 0 0 1 +;; #F29668 #000000 0 1 0 1 (comma_expression "," @operator) -;; #D2A6FF #000000 0 0 0 1 +;; #B6BEC8 #000000 0 0 0 1 [ - (true) - (false) -] @boolean - -;; #F29668 #000000 0 0 0 1 -(conditional_expression - [ - "?" - ":" - ] @keyword.conditional.ternary) - -;; #aad84c #000000 0 0 0 1 -(string_literal) @string - -(system_lib_string) @string - -;; #95E6CB #000000 0 0 0 2 -(escape_sequence) @string.escape - -;; #D2A6FF #000000 0 0 0 1 -(null) @constant.builtin - -;; #D2A6FF #000000 0 0 0 1 -(number_literal) @number - -;; #39BAE6 #000000 0 0 0 1 -(char_literal) @character - -;; #FFB454 #000000 0 0 0 1 -(preproc_defined) @function.macro - -;; #F07178 #000000 0 0 0 1 -((field_expression - (field_identifier) @property) @_parent) - -(field_designator) @property - -((field_identifier) @property) - -;; #39BAE6 #000000 0 0 0 1 -(statement_identifier) @label - -(declaration - type: (type_identifier) @_type - declarator: (identifier) @label - (#match? @_type "^__label__$")) - -;; #59C2FF #000000 0 0 0 1 -[ - (type_identifier) - (type_descriptor) -] @type - -;; #FF8F40 #000000 0 0 0 1 -(storage_class_specifier) @keyword.modifier - -[ - (type_qualifier) - (gnu_asm_qualifier) - "__extension__" -] @keyword.modifier - -;; #FF8F40 #000000 0 0 0 1 -(linkage_specification - "extern" @keyword.modifier) - -;; #59C2FF #000000 0 0 0 1 -(type_definition - declarator: (type_identifier) @type.definition) - -;; #59C2FF #000000 0 0 0 1 -(primitive_type) @type.builtin - -(sized_type_specifier - _ @type.builtin - type: _?) - -;; #D2A6FF #000000 0 0 0 1 -((identifier) @constant - (#match? @constant "^[A-Z][A-Z0-9_]+$")) - -(preproc_def - (preproc_arg) @constant - (#match? @constant "^[A-Z][A-Z0-9_]+$")) - -(enumerator - name: (identifier) @constant) - -(case_statement - value: (identifier) @constant) - -;; #D2A6FF #000000 0 0 0 1 -((identifier) @constant.builtin - (#match? @constant.builtin "^(stderr|stdin|stdout|__FILE__|__LINE__|__DATE__|__TIME__|__STDC__|__STDC_VERSION__|__STDC_HOSTED__|__cplusplus|__OBJC__|__ASSEMBLER__|__BASE_FILE__|__FILE_NAME__|__INCLUDE_LEVEL__|__TIMESTAMP__|__clang__|__clang_major__|__clang_minor__|__clang_patchlevel__|__clang_version__|__clang_literal_encoding__|__clang_wide_literal_encoding__|__FUNCTION__|__func__|__PRETTY_FUNCTION__|__VA_ARGS__|__VA_OPT__)$")) - -(preproc_def - (preproc_arg) @constant.builtin - (#match? @constant.builtin "^(stderr|stdin|stdout|__FILE__|__LINE__|__DATE__|__TIME__|__STDC__|__STDC_VERSION__|__STDC_HOSTED__|__cplusplus|__OBJC__|__ASSEMBLER__|__BASE_FILE__|__FILE_NAME__|__INCLUDE_LEVEL__|__TIMESTAMP__|__clang__|__clang_major__|__clang_minor__|__clang_patchlevel__|__clang_version__|__clang_literal_encoding__|__clang_wide_literal_encoding__|__FUNCTION__|__func__|__PRETTY_FUNCTION__|__VA_ARGS__|__VA_OPT__)$")) - -;; #D2A6FF #000000 0 0 0 1 -(attribute_specifier - (argument_list - (identifier) @variable.builtin)) - -(attribute_specifier - (argument_list - (call_expression - function: (identifier) @variable.builtin))) - -;; #FFB454 #000000 0 0 0 1 -((call_expression - function: (identifier) @function.builtin) - (#match? @function.builtin "^__builtin_")) - -((call_expression - function: (identifier) @function.builtin)) - -;; #D2A6FF #000000 0 0 0 1 -(preproc_def - name: (_) @constant.macro) - -(preproc_call - directive: (preproc_directive) @_u - argument: (_) @constant.macro - (#match? @_u "^#undef$")) - -(preproc_ifdef - name: (identifier) @constant.macro) - -(preproc_elifdef - name: (identifier) @constant.macro) - -(preproc_defined - (identifier) @constant.macro) - -;; #FFB454 #000000 0 0 0 3 -(call_expression - function: (identifier) @function.call) - -(call_expression - function: (field_expression - field: (field_identifier) @function.call)) - -;; #FFB454 #000000 0 0 0 3 -(function_declarator - declarator: (identifier) @function) - -(function_declarator - declarator: (parenthesized_declarator - (pointer_declarator - declarator: (field_identifier) @function))) - -;; #FFB454 #000000 0 0 0 3 -(preproc_function_def - name: (identifier) @function.macro) - -;; #99ADBF #000000 0 1 0 1 -(comment) @comment @spell - -;; #99ADBF #000000 0 1 0 1 -((comment) @comment.documentation - (#match? @comment.documentation "^/[*][*][^*].*[*]/$")) - -;; #D2A6FF #000000 0 0 0 1 -(parameter_declaration - declarator: (identifier) @variable.parameter) - -(parameter_declaration - declarator: (array_declarator) @variable.parameter) - -(parameter_declaration - declarator: (pointer_declarator) @variable.parameter) - -(preproc_params - (identifier) @variable.parameter) - -;; #FF8F40 #000000 0 0 0 1 -[ - "__attribute__" - "__declspec" - "__based" - "__cdecl" - "__clrcall" - "__stdcall" - "__fastcall" - "__thiscall" - "__vectorcall" - (ms_pointer_modifier) - (attribute_declaration) -] @attribute - -;; #F07178 #000000 0 0 0 1 -((identifier) @variable.member - (#match? @variable.member "^m_.*$")) - -(parameter_declaration - declarator: (reference_declarator) @variable.parameter) - -(variadic_parameter_declaration - declarator: (variadic_declarator - (_) @variable.parameter)) - -(optional_parameter_declaration - declarator: (_) @variable.parameter) - -;; #F07178 #000000 0 0 0 1 -((field_expression - (field_identifier) @function.method) @_parent) - -(field_declaration - (field_identifier) @variable.member) - -(field_initializer - (field_identifier) @property) - -(function_declarator - declarator: (field_identifier) @function.method) - -;; #59C2FF #000000 0 0 0 3 -(concept_definition - name: (identifier) @type.definition) - -(alias_declaration - name: (type_identifier) @type.definition) - -;; #59C2FF #000000 0 0 0 1 -(auto) @type.builtin - -;; #59C2FF #000000 0 0 0 1 -(namespace_identifier) @module - -;; #59C2FF #000000 0 0 0 1 -((namespace_identifier) @type - (#match? @type "^[A-Z]")) - -;; #D2A6FF #000000 0 0 0 1 -(case_statement - value: (qualified_identifier - (identifier) @constant)) - -;; #FF8F40 #000000 0 0 0 1 -(using_declaration - . - "using" - . - "namespace" - . - [ - (qualified_identifier) - (identifier) - ] @module) - -;; #FFB454 #000000 0 0 0 3 -(destructor_name - (identifier) @function.method) - -;; #FFB454 #000000 0 0 0 3 -(function_declarator - (qualified_identifier - (identifier) @function)) - -(function_declarator - (qualified_identifier - (qualified_identifier - (identifier) @function))) - -(function_declarator - (qualified_identifier - (qualified_identifier - (qualified_identifier - (identifier) @function)))) - -((qualified_identifier - (qualified_identifier - (qualified_identifier - (qualified_identifier - (identifier) @function)))) @_parent) - -(function_declarator - (template_function - (identifier) @function)) - -(operator_name) @function - -"operator" @function - -;; #FFB454 #000000 0 0 0 3 -"static_assert" @function.builtin - -;; #FFB454 #000000 0 0 0 3 -(call_expression - (qualified_identifier - (identifier) @function.call)) - -(call_expression - (qualified_identifier - (qualified_identifier - (identifier) @function.call))) - -(call_expression - (qualified_identifier - (qualified_identifier - (qualified_identifier - (identifier) @function.call)))) - -((qualified_identifier - (qualified_identifier - (qualified_identifier - (qualified_identifier - (identifier) @function.call)))) @_parent) - -(call_expression - (template_function - (identifier) @function.call)) - -(call_expression - (qualified_identifier - (template_function - (identifier) @function.call))) - -(call_expression - (qualified_identifier - (qualified_identifier - (template_function - (identifier) @function.call)))) - -(call_expression - (qualified_identifier - (qualified_identifier - (qualified_identifier - (template_function - (identifier) @function.call))))) - -((qualified_identifier - (qualified_identifier - (qualified_identifier - (qualified_identifier - (template_function - (identifier) @function.call))))) @_parent) - -(function_declarator - (template_method - (field_identifier) @function.method)) - -;; #FFB454 #000000 0 0 0 3 -(call_expression - (field_expression - (field_identifier) @function.method.call)) - -(call_expression - (field_expression - (template_method - (field_identifier) @function.method.call))) - -;; #FFB454 #000000 0 0 0 3 -((function_declarator - (qualified_identifier - (identifier) @constructor)) - (#match? @constructor "^[A-Z]")) - -((call_expression - function: (identifier) @constructor) - (#match? @constructor "^[A-Z]")) - -((call_expression - function: (qualified_identifier - name: (identifier) @constructor)) - (#match? @constructor "^[A-Z]")) - -((call_expression - function: (field_expression - field: (field_identifier) @constructor)) - (#match? @constructor "^[A-Z]")) - -((field_initializer - (field_identifier) @constructor - (argument_list)) - (#match? @constructor "^[A-Z]")) - -;; #F07178 #000000 0 0 0 1 -(this) @variable.builtin - -;; #D2A6FF #000000 0 0 0 1 -(null - "nullptr" @constant.builtin) - -;; #D2A6FF #000000 0 0 0 2 -(true) @boolean_true - -;; #D2A6FF #000000 0 0 0 2 -(false) @boolean_false - -;; #aad84c #000000 0 0 0 1 -(raw_string_literal) @string - -;; #FF8F40 #000000 0 0 0 1 -[ - "try" - "catch" - "noexcept" - "throw" -] @keyword.exception - -;; #FF8F40 #000000 0 0 0 1 -[ - "decltype" - "explicit" - "friend" - "override" - "using" - "requires" - "constexpr" -] @keyword - -;; #FF8F40 #000000 0 0 0 1 -[ - "class" - "namespace" - "template" - "typename" - "concept" -] @keyword.type - -;; #FF8F40 #000000 0 0 0 1 -[ - "co_await" - "co_yield" - "co_return" -] @keyword.coroutine - -;; #FF8F40 #000000 0 0 0 1 -[ - "public" - "private" - "protected" - "final" - "virtual" -] @keyword.modifier - -;; #FF8F40 #000000 0 0 0 1 -[ - "new" - "delete" - "xor" - "bitand" - "bitor" - "compl" - "not" - "xor_eq" - "and_eq" - "or_eq" - "not_eq" - "and" - "or" -] @keyword.operator - -;; #F29668 #000000 0 0 0 1 -"<=>" @operator - -;; #BFBDB6 #000000 0 0 0 1 + ";" + ":" + "," + "." + "::" +] @punctuation.delimiter + +;; #B6BEC8 #000000 0 0 0 1 "::" @punctuation.delimiter -;; #BFBDB6 #000000 0 0 0 1 +;; #B6BEC8 #000000 0 0 0 1 +"..." @punctuation.special + +;; #B6BEC8 #000000 0 0 0 1 +[ + "(" + ")" + "[" + "]" + "{" + "}" +] @punctuation.bracket + +;; #B6BEC8 #000000 0 0 0 1 (template_argument_list [ "<" ">" ] @punctuation.bracket) +;; #B6BEC8 #000000 0 0 0 1 (template_parameter_list [ "<" ">" ] @punctuation.bracket) -;; #FF8F40 #000000 0 0 0 1 -(literal_suffix) @operator +; ============================================================ +; Literals +; ============================================================ + +;; #C2E8FF #000000 0 0 0 2 +[ + (true) + (false) +] @boolean + +;; #C2E8FF #000000 0 0 0 2 +(true) @boolean_true + +;; #C2E8FF #000000 0 0 0 2 +(false) @boolean_false + +;; #A6E3A1 #000000 0 0 0 2 +(string_literal) @string + +;; #A6E3A1 #000000 0 0 0 2 +(system_lib_string) @string + +;; #A6E3A1 #000000 0 0 0 2 +(raw_string_literal) @string + +;; #A6E3A1 #000000 0 0 0 2 +(escape_sequence) @string.escape + +;; #B8E986 #000000 0 0 0 2 +(number_literal) @number + +;; #B8E986 #000000 0 0 0 2 +(char_literal) @character + +;; #F29CC3 #000000 0 0 0 2 +(null) @constant.builtin + +;; #F29CC3 #000000 0 0 0 2 +(null + "nullptr" @constant.builtin) + +; ============================================================ +; Macros & directives +; ============================================================ + +;; #F29CC3 #000000 0 0 0 2 +(preproc_def + name: (_) @constant.macro) + +;; #F29CC3 #000000 0 0 0 2 +(preproc_call + directive: (preproc_directive) @_u + argument: (_) @constant.macro + (#match? @_u "^#undef$")) + +;; #F29CC3 #000000 0 0 0 2 +(preproc_ifdef + name: (identifier) @constant.macro) + +;; #F29CC3 #000000 0 0 0 2 +(preproc_elifdef + name: (identifier) @constant.macro) + +;; #F29CC3 #000000 0 0 0 2 +(preproc_defined + (identifier) @constant.macro) + +;; #F29CC3 #000000 0 0 0 2 +(preproc_defined) @function.macro + +; ============================================================ +; Builtins & special identifiers +; ============================================================ + +;; #F28FAD #000000 0 0 0 2 +(attribute_specifier + (argument_list + (identifier) @variable.builtin)) + +;; #F28FAD #000000 0 0 0 2 +(attribute_specifier + (argument_list + (call_expression + function: (identifier) @variable.builtin))) + +;; #F28FAD #000000 0 0 0 2 +(this) @variable.builtin + +; ============================================================ +; Exceptions & control helpers +; ============================================================ + +;; #FFB870 #000000 0 0 0 2 +"static_assert" @function.builtin + +; ============================================================ +; Comments +; ============================================================ + +;; #99ADBF #000000 0 1 0 1 +(comment) @comment @spell diff --git a/grammar/css.scm b/grammar/css.scm new file mode 100644 index 0000000..81137e9 --- /dev/null +++ b/grammar/css.scm @@ -0,0 +1,95 @@ +;; #D2A6FF #000000 0 0 0 1 +(tag_name) @tag +(nesting_selector) @tag +(universal_selector) @tag + +;; #F29668 #000000 0 0 0 1 +"~" @operator +">" @operator +"+" @operator +"-" @operator +"*" @operator +"/" @operator +"=" @operator +"^=" @operator +"|=" @operator +"~=" @operator +"$=" @operator +"*=" @operator +"and" @operator +"or" @operator +"not" @operator +"only" @operator + +;; #AAD94C #000000 0 0 0 2 +(attribute_selector (plain_value) @string) +(string_value) @string + +;; #FFFFFF #000000 0 0 0 1 +((property_name) @variable + (#match? @variable "^--")) +((plain_value) @variable + (#match? @variable "^--")) + +;; #7dcfff #000000 0 0 0 2 +(class_name) @property +(id_name) @property +(namespace_name) @property +(property_name) @property +(feature_name) @property + +;; #F07178 #000000 0 0 0 1 +(pseudo_element_selector (tag_name) @attribute) +(pseudo_class_selector (class_name) @attribute) +(attribute_name) @attribute + +;; #F07178 #000000 0 0 0 1 +(function_name) @function + +;; #99ADBF #000000 0 1 0 1 +(comment) @comment + +;; #FFFFFF #000000 0 0 0 1 +(color_value) @string.special + +;; #FF8F40 #000000 0 0 0 1 +(integer_value) @number +(float_value) @number + +;; #FF8F40 #000000 0 0 0 1 +(unit) @type + +;; #AAD94C #000000 0 0 0 3 +[ + "#" + "," + "." + ":" + "::" + ";" +] @punctuation.delimiter + +;; #AAD94C #000000 0 0 0 3 +[ + "{" + "}" + ")" + "(" + "[" + "]" +] @punctuation.bracket + +;; #D2A6FF #000000 0 0 0 1 +(at_keyword) @keyword +(to) @keyword +(from) @keyword +(important) @keyword + +; This is put at the end as the regex parser will wrongly think @media is a capture name becouse of its @ +; TODO: This should be fixed by not selecting if it is in a string +"@media" @keyword +"@import" @keyword +"@charset" @keyword +"@namespace" @keyword +"@supports" @keyword +"@keyframes" @keyword diff --git a/grammar/diff.scm b/grammar/diff.scm new file mode 100644 index 0000000..bd2eee1 --- /dev/null +++ b/grammar/diff.scm @@ -0,0 +1,57 @@ +;; #99ADBF #000000 0 1 0 1 +(comment) @comment @spell + +;; #A6E3A1 #000000 0 0 0 2 +(addition) @diff.plus + +;; #F07178 #000000 0 0 0 2 +(deletion) @diff.minus + +;; #D2A6FF #000000 0 0 0 0 +[ + (new_file) + (old_file) +] @file + +;; #D2A6FF #000000 0 0 0 1 +(commit) @constant + +;; #7dcfff #000000 0 0 0 2 +(location) @attribute + +;; #D2A6FF #000000 0 0 0 1 +(command + "diff" @function + (argument) @variable.parameter) + +;; #7dcfff #000000 0 0 0 6 +(mode) @number + +;; #888888 #000000 0 0 0 3 +[ + ".." + "+" + "++" + "+++" + "++++" + "-" + "--" + "---" + "----" +] @punctuation.special + +;; #7dcfff #000000 0 0 0 2 +[ + (binary_change) + (similarity) + (file_change) +] @label + +;; #D2A6FF #000000 0 0 0 1 +(index + "index" @keyword) + +;; #FF8F40 #000000 0 0 0 1 +(similarity + (score) @number + "%" @number) diff --git a/grammar/embedded_template.scm b/grammar/embedded_template.scm new file mode 100644 index 0000000..d1c91cd --- /dev/null +++ b/grammar/embedded_template.scm @@ -0,0 +1,20 @@ +;; #99ADBF #000000 0 1 0 4 +(comment_directive) @comment + +;; #F29668 #000000 0 0 0 6 +[ + "<%#" + "<%" + "<%=" + "<%_" + "<%-" + "%>" + "-%>" + "_%>" +] @keyword + +;; !html +(content) @injection.html + +;; !ruby +(code) @injection.ruby diff --git a/grammar/fish.scm b/grammar/fish.scm new file mode 100644 index 0000000..afc08bf --- /dev/null +++ b/grammar/fish.scm @@ -0,0 +1,191 @@ +;; #F29668 #000000 0 1 0 1 +[ + "&&" + "||" + "|" + "&|" + "2>|" + "&" + ".." + "!" + (direction) + (stream_redirect) +] @operator + +(command + name: (word) @function.builtin + (#match? @function.builtin "^test$") +;; #FFFFFF #000000 0 0 0 3 + argument: (word) @word + (#match? @word "^(!?=|-[a-zA-Z]+)$")) + +(command + name: (word) @punctuation.bracket + (#match? @punctuation.bracket "^\\[$") + argument: (word) @word + (#match? @word "^(!?=|-[a-zA-Z]+)$")) + +;; #F29668 #000000 0 0 0 1 +[ + "not" + "and" + "or" +] @keyword.operator + +;; #FF8F40 #000000 0 0 0 1 +(if_statement + [ + "if" + "end" + ] @keyword.conditional) + +;; #FF8F40 #000000 0 0 0 1 +(switch_statement + [ + "switch" + "end" + ] @keyword.conditional) + +;; #FF8F40 #000000 0 0 0 1 +(case_clause + "case" @keyword.conditional) + +;; #FF8F40 #000000 0 0 0 1 +(else_clause + "else" @keyword.conditional) + +;; #FF8F40 #000000 0 0 0 1 +(else_if_clause + [ + "else" + "if" + ] @keyword.conditional) + +; Loops/Blocks +;; #FF8F40 #000000 0 0 0 1 +(while_statement + [ + "while" + "end" + ] @keyword.repeat) + +;; #FF8F40 #000000 0 0 0 1 +(for_statement + [ + "for" + "end" + ] @keyword.repeat) + +;; #FF8F40 #000000 0 0 0 1 +(begin_statement + [ + "begin" + "end" + ] @keyword.repeat) + +; Keywords +;; #FF8F40 #000000 0 0 0 1 +[ + "in" + (break) + (continue) +] @keyword + +;; #FF8F40 #000000 0 0 0 1 +"return" @keyword.return + +;; #BFBDB6 #000000 0 0 0 1 +[ + "[" + "]" + "{" + "}" + "(" + ")" +] @punctuation.bracket + +;; #BFBDB6 #000000 0 0 0 1 +"," @punctuation.delimiter + +;; #7dcfff #000000 0 0 0 2 +(command_substitution + "$" @punctuation.special) + +;; #FFB454 #000000 0 0 0 3 +(command + name: (word) @function.call) + +;; #FFB454 #000000 0 0 0 3 +(command + name: (word) @function.builtin + (#match? @function.builtin + "^(\\.|:|_|abbr|alias|argparse|bg|bind|block|breakpoint|builtin|cd|command|commandline|complete|contains|count|disown|echo|emit|eval|exec|exit|fg|functions|history|isatty|jobs|math|path|printf|pwd|random|read|realpath|set|set_color|source|status|string|test|time|type|ulimit|wait)$")) + +;; #FF8F40 #000000 0 0 0 1 +(function_definition + [ + "function" + "end" + ] @keyword.function) + +;; #FFB454 #000000 0 0 0 3 +(function_definition + name: [ + (word) + (concatenation) + ] @function) + +;; #FFFFFF #000000 0 0 0 1 +(function_definition + option: [ + (word) + (concatenation + (word)) + ] @variable.parameter + (#match? @variable.parameter "^[-]")) + +;; #AAD94C #000000 0 0 0 1 +[ + (double_quote_string) + (single_quote_string) +] @string + +;; #AAD94C #000000 0 0 0 1 +(escape_sequence) @string.escape + +;; #FFFFFF #000000 0 0 0 1 +(variable_name) @variable + +;; #D2A6FF #000000 0 0 0 1 +(variable_expansion) @constant + +;; #7dcfff #000000 0 0 0 2 +(variable_expansion + "$" @punctuation.special) @none + +;; #F07178 #000000 0 0 0 1 +((variable_name) @variable.builtin + (#match? @variable.builtin + "^(PATH|CDPATH|LANG|LC_ALL|LC_COLLATE|LC_CTYPE|LC_MESSAGES|LC_MONETARY|LC_NUMERIC|LC_TIME|fish_color_normal|fish_color_command|fish_color_keyword|fish_color_redirection|fish_color_end|fish_color_error|fish_color_param|fish_color_valid_path|fish_color_option|fish_color_comment|fish_color_selection|fish_color_operator|fish_color_escape|fish_color_autosuggestion|fish_color_cwd|fish_color_cwd_root|fish_color_user|fish_color_host|fish_color_host_remote|fish_color_status|fish_color_cancel|fish_color_search_match|fish_color_history_current|fish_pager_color_progress|fish_pager_color_background|fish_pager_color_prefix|fish_pager_color_completion|fish_pager_color_description|fish_pager_color_selected_background|fish_pager_color_selected_prefix|fish_pager_color_selected_completion|fish_pager_color_selected_description|fish_pager_color_secondary_background|fish_pager_color_secondary_prefix|fish_pager_color_secondary_completion|fish_pager_color_secondary_description|fish_term24bit|fish_term256|fish_ambiguous_width|fish_emoji_width|fish_autosuggestion_enabled|fish_handle_reflow|fish_key_bindings|fish_escape_delay_ms|fish_sequence_key_delay_ms|fish_complete_path|fish_cursor_selection_mode|fish_cursor_default|fish_cursor_insert|fish_cursor_replace|fish_cursor_replace_one|fish_cursor_visual|fish_cursor_external|fish_function_path|fish_greeting|fish_history|fish_trace|FISH_DEBUG|FISH_DEBUG_OUTPUT|fish_user_paths|umask|BROWSER|_|argv|CMD_DURATION|COLUMNS|LINES|fish_kill_signal|fish_killring|fish_read_limit|fish_pid|history|HOME|hostname|IFS|last_pid|PWD|pipestatus|SHLVL|status|status_generation|TERM|USER|EUID|version|FISH_VERSION)$")) + +;; #D2A6FF #000000 0 0 0 2 +[ + (integer) + (float) +] @number + +;; #99ADBF #000000 0 1 0 1 +(comment) @comment + +;; #99ADBF #000000 0 1 0 1 +(comment) @spell + +;; #D2A6FF #000000 0 0 0 1 +((word) @boolean + (#match? @boolean "^(true|false)$")) + +;; #AAD94C #000000 0 0 0 3 +((program + . + (comment) @keyword.directive @nospell) + (#match? @keyword.directive "^#!")) diff --git a/grammar/gdscript.scm b/grammar/gdscript.scm new file mode 100644 index 0000000..ceedc02 --- /dev/null +++ b/grammar/gdscript.scm @@ -0,0 +1,336 @@ +; ============================================================ +; Basic +; ============================================================ + +;; #FFFFFF #000000 0 0 0 0 +(identifier) @variable + +;; #FFFFFF #000000 0 0 0 0 +(name) @variable + +;; #D2A6FF #000000 0 0 0 2 +(type + (identifier) @type) + +;; #99ADBF #000000 0 1 0 1 +(comment) @comment @spell + +;; #AAD94C #000000 0 0 0 0 +(string_name) @string + +;; #AAD94C #000000 0 0 0 0 +(string) @string + +;; #F29668 #000000 0 0 0 1 +(float) @number.float + +;; #F29668 #000000 0 0 0 1 +(integer) @number + +;; #D2A6FF #000000 0 0 0 2 +(null) @constant + +;; #5CCFE6 #000000 0 0 0 2 +(setter) @function + +;; #FFB454 #000000 0 0 0 2 +(getter) @function + +;; #FFB454 #000000 0 0 0 2 +(set_body + "set" @keyword.function) + +;; #FFB454 #000000 0 0 0 2 +(get_body + "get" @keyword.function) + +;; #7DCFFF #000000 0 0 0 2 +(static_keyword) @keyword.modifier + +;; #F07178 #000000 0 0 0 1 +(breakpoint_statement) @keyword.debug + +;; #FF8F40 #000000 0 1 0 1 +(inferred_type) @operator + +;; #D2A6FF #000000 0 0 0 2 +[ + (true) + (false) +] @boolean + +;; #AAD94C #000000 0 0 0 0 +[ + (get_node) + (node_path) +] @string.special.url + +(class_name_statement + (name) @type) +;; #7DCFFF #000000 0 0 0 2 +@keyword2 + +;; #FFB454 #000000 0 0 0 2 +(const_statement + "const" @keyword.modifier + (name) @constant) + +;; #99ADBF #000000 0 1 0 1 +(expression_statement + (string) @comment @spell) + +; ============================================================ +; Functions +; ============================================================ + +;; #FFB454 #000000 0 0 0 2 +(constructor_definition + "_init" @constructor) + +;; #5CCFE6 #000000 0 0 0 4 +(function_definition + (name) @function) + +;; #D2A6FF #000000 0 0 0 1 +(parameters + (identifier) @variable.parameter) + +;; #D2A6FF #000000 0 0 0 1 +(typed_parameter + (identifier) @variable.parameter) + +;; #D2A6FF #000000 0 0 0 1 +(default_parameter + (identifier) @variable.parameter) + +;; #D2A6FF #000000 0 0 0 1 +(typed_default_parameter + (identifier) @variable.parameter) + +;; #5CCFE6 #000000 0 0 0 2 +(call + (identifier) @function.call) + +;; #FFB454 #000000 0 0 0 2 +(call + (identifier) @keyword.import + (#match? @keyword.import "^(preload|load)$")) + +; ============================================================ +; Properties and Methods +; ============================================================ + +;; #5CCFE6 #000000 0 0 0 2 +(attribute_call + (identifier) @function.method.call) + +;; #FFB454 #000000 0 0 0 2 +(attribute_subscript + (identifier) @property) + +;; #FFB454 #000000 0 0 0 2 +(attribute + (_) + (identifier) @property) + +; ============================================================ +; Identifier conventions +; ============================================================ + +;; #D2A6FF #000000 0 0 0 2 +((identifier) @type + (#match? @type "^[A-Z]")) + +;; #D2A6FF #000000 0 0 0 2 +((identifier) @constant + (#match? @constant "^[A-Z][A-Z_0-9]*$")) + +; ============================================================ +; Enums +; ============================================================ + +;; #D2A6FF #000000 0 0 0 2 +(enumerator + left: (identifier) @constant) + +; ============================================================ +; Builtins +; ============================================================ + +;; #D2A6FF #000000 0 0 0 2 +((identifier) @variable.builtin + (#match? @variable.builtin "^(self|super)$")) + +;; #FFB454 #000000 0 0 0 2 +(attribute_call + (identifier) @keyword.operator + (#match? @keyword.operator "^new$")) + +; ============================================================ +; Pattern helpers +; ============================================================ + +;; #7DCFFF #000000 0 0 0 2 +(pattern_open_ending) @character.special + +;; #7DCFFF #000000 0 0 0 2 +((identifier) @character.special + (#match? @character.special "^_$")) + +; ============================================================ +; Operators & punctuation +; ============================================================ + +;; #BFBDB6 #000000 0 0 0 1 +[ + "(" + ")" + "[" + "]" + "{" + "}" +] @punctuation.bracket + +;; #BFBDB6 #000000 0 0 0 1 +[ + "," + "." + ":" + ";" +] @punctuation.delimiter + +;; #FF8F40 #000000 0 0 0 1 +[ + "if" + "elif" + "else" + "match" +] @keyword.conditional + +;; #FF8F40 #000000 0 0 0 1 +(pattern_guard + "when" @keyword.conditional) + +;; #FF8F40 #000000 0 0 0 1 +[ + "for" + "while" + "break" + "continue" +] @keyword.repeat + +;; #FF8F40 #000000 0 1 0 1 +[ + "~" + "-" + "*" + "**" + "/" + "%" + "+" + "<<" + ">>" + "&" + "^" + "|" + "<" + ">" + "==" + "!=" + ">=" + "<=" + "!" + "&&" + "||" + "=" + "+=" + "-=" + "*=" + "**=" + "/=" + "%=" + "&=" + "|=" + "<<=" + ">>=" + "->" +] @operator + +;; #FF8F40 #000000 0 0 0 1 +[ + "and" + "as" + "in" + "is" + "not" + "or" +] @keyword.operator + +; ============================================================ +; Keywords +; ============================================================ + +;; #FF8F40 #000000 0 0 0 1 +[ + "pass" + "class_name" + "extends" + "signal" + "var" + "onready" + "setget" + "remote" + "master" + "puppet" + "remotesync" + "mastersync" + "puppetsync" +] @keyword + +;; #7DCFFF #000000 0 0 0 2 +"export" @keyword.import + +;; #7DCFFF #000000 0 0 0 2 +[ + "enum" + "class" +] @keyword.type + +;; #FFB454 #000000 0 0 0 2 +"func" @keyword.function + +;; #FF8F40 #000000 0 0 0 1 +"return" @keyword.return + +;; #FF8F40 #000000 0 0 0 1 +"await" @keyword.coroutine + +(call + (identifier) @keyword.coroutine + (#match? @keyword.coroutine "^yield$")) + +; ============================================================ +; Annotations +; ============================================================ + +;; #FFB454 #000000 0 0 0 2 +((annotation + "@" @attribute + (identifier) @attribute) + (#match? @attribute "^(abstract|export|export_category|export_color_no_alpha|export_custom|export_dir|export_enum|export_exp_easing|export_file|export_file_path|export_flags|export_flags_2d_navigation|export_flags_2d_physics|export_flags_3d_render|export_flags_3d_navigation|export_flags_3d_physics|export_flags_3d_render|export_flags_avoidance|export_global_dir|export_global_file|export_group|export_multiline|export_node_path|export_placeholder|export_range|export_storage|export_subgroup|export_tool_button|icon|onready|rpc|static_unload|tool|warning_ignore|warning_ignore_restore|warning_ignore_start)$")) + +;; #FF8F40 #000000 0 0 0 1 +; Builtin Types +((identifier) @type.builtin + (#match? @type.builtin "^(AABB|AESContext|AStar2D|AStar3D|AStarGrid2D|AcceptDialog|AimModifier3D|AnimatableBody2D|AnimatableBody3D|AnimatedSprite2D|AnimatedSprite3D|AnimatedTexture|Animation|AnimationLibrary|AnimationMixer|AnimationNode|AnimationNodeAdd2|AnimationNodeAdd3|AnimationNodeAnimation|AnimationNodeBlend2|AnimationNodeBlend3|AnimationNodeBlendSpace1D|AnimationNodeBlendSpace2D|AnimationNodeBlendTree|AnimationNodeExtension|AnimationNodeOneShot|AnimationNodeOutput|AnimationNodeStateMachine|AnimationNodeStateMachinePlayback|AnimationNodeStateMachineTransition|AnimationNodeSub2|AnimationNodeSync|AnimationNodeTimeScale|AnimationNodeTimeSeek|AnimationNodeTransition|AnimationPlayer|AnimationRootNode|AnimationTree|Area2D|Area3D|Array|ArrayMesh|ArrayOccluder3D|AspectRatioContainer|AtlasTexture|AudioBusLayout|AudioEffect|AudioEffectAmplify|AudioEffectBandLimitFilter|AudioEffectBandPassFilter|AudioEffectCapture|AudioEffectChorus|AudioEffectCompressor|AudioEffectDelay|AudioEffectDistortion|AudioEffectEQ|AudioEffectEQ10|AudioEffectEQ21|AudioEffectEQ6|AudioEffectFilter|AudioEffectHardLimiter|AudioEffectHighPassFilter|AudioEffectHighShelfFilter|AudioEffectInstance|AudioEffectLimiter|AudioEffectLowPassFilter|AudioEffectLowShelfFilter|AudioEffectNotchFilter|AudioEffectPanner|AudioEffectPhaser|AudioEffectPitchShift|AudioEffectRecord|AudioEffectReverb|AudioEffectSpectrumAnalyzer|AudioEffectSpectrumAnalyzerInstance|AudioEffectStereoEnhance|AudioListener2D|AudioListener3D|AudioSample|AudioSamplePlayback|AudioServer|AudioStream|AudioStreamGenerator|AudioStreamGeneratorPlayback|AudioStreamMicrophone|AudioStreamPlayback|AudioStreamPlaybackPolyphonic|AudioStreamPlaybackResampled|AudioStreamPlayer|AudioStreamPlayer2D|AudioStreamPlayer3D|AudioStreamPolyphonic|AudioStreamRandomizer|AudioStreamWAV|BackBufferCopy|BaseButton|BaseMaterial3D|Basis|BitMap|Bone2D|BoneAttachment3D|BoneConstraint3D|BoneMap|BoneTwistDisperser3D|BoxContainer|BoxMesh|BoxOccluder3D|BoxShape3D|Button|ButtonGroup|CCDIK3D|CPUParticles2D|CPUParticles3D|Callable|CallbackTweener|Camera2D|Camera3D|CameraAttributes|CameraAttributesPhysical|CameraAttributesPractical|CameraFeed|CameraServer|CameraTexture|CanvasGroup|CanvasItem|CanvasItemMaterial|CanvasLayer|CanvasModulate|CanvasTexture|CapsuleMesh|CapsuleShape2D|CapsuleShape3D|CenterContainer|ChainIK3D|CharFXTransform|CharacterBody2D|CharacterBody3D|CheckBox|CheckButton|CircleShape2D|ClassDB|CodeEdit|CodeHighlighter|CollisionObject2D|CollisionObject3D|CollisionPolygon2D|CollisionPolygon3D|CollisionShape2D|CollisionShape3D|Color|ColorPalette|ColorPicker|ColorPickerButton|ColorRect|Compositor|CompositorEffect|CompressedCubemap|CompressedCubemapArray|CompressedTexture2D|CompressedTexture2DArray|CompressedTexture3D|CompressedTextureLayered|ConcavePolygonShape2D|ConcavePolygonShape3D|ConeTwistJoint3D|ConfigFile|ConfirmationDialog|Container|Control|ConvertTransformModifier3D|ConvexPolygonShape2D|ConvexPolygonShape3D|CopyTransformModifier3D|Crypto|CryptoKey|Cubemap|CubemapArray|Curve|Curve2D|Curve3D|CurveTexture|CurveXYZTexture|CylinderMesh|CylinderShape3D|DPITexture|DTLSServer|DampedSpringJoint2D|Decal|Dictionary|DirAccess|DirectionalLight2D|DirectionalLight3D|DisplayServer|EditorCommandPalette|EditorContextMenuPlugin|EditorDebuggerPlugin|EditorDebuggerSession|EditorDock|EditorExportPlatform|EditorExportPlatformAppleEmbedded|EditorExportPlatformExtension|EditorExportPlatformPC|EditorExportPlugin|EditorExportPreset|EditorFeatureProfile|EditorFileDialog|EditorFileSystem|EditorFileSystemDirectory|EditorFileSystemImportFormatSupportQuery|EditorImportPlugin|EditorInspector|EditorInspectorPlugin|EditorInterface|EditorNode3DGizmo|EditorNode3DGizmoPlugin|EditorPaths|EditorPlugin|EditorProperty|EditorResourceConversionPlugin|EditorResourcePicker|EditorResourcePreview|EditorResourcePreviewGenerator|EditorResourceTooltipPlugin|EditorSceneFormatImporter|EditorScenePostImport|EditorScenePostImportPlugin|EditorScript|EditorScriptPicker|EditorSelection|EditorSettings|EditorSpinSlider|EditorSyntaxHighlighter|EditorToaster|EditorTranslationParserPlugin|EditorUndoRedoManager|EditorVCSInterface|EncodedObjectAsID|Engine|EngineDebugger|EngineProfiler|Environment|Expression|ExternalTexture|FABRIK3D|FileAccess|FileDialog|FileSystemDock|FlowContainer|FogMaterial|FogVolume|FoldableContainer|FoldableGroup|Font|FontFile|FontVariation|FramebufferCacheRD|GDExtension|GDExtensionManager|GPUParticles2D|GPUParticles3D|GPUParticlesAttractor3D|GPUParticlesAttractorBox3D|GPUParticlesAttractorSphere3D|GPUParticlesAttractorVectorField3D|GPUParticlesCollision3D|GPUParticlesCollisionBox3D|GPUParticlesCollisionHeightField3D|GPUParticlesCollisionSDF3D|GPUParticlesCollisionSphere3D|Generic6DOFJoint3D|Geometry2D|Geometry3D|GeometryInstance3D|GodotInstance|Gradient|GradientTexture1D|GradientTexture2D|GraphEdit|GraphElement|GraphFrame|GraphNode|GridContainer|GrooveJoint2D|HBoxContainer|HFlowContainer|HMACContext|HScrollBar|HSeparator|HSlider|HSplitContainer|HTTPClient|HTTPRequest|HashingContext|HeightMapShape3D|HingeJoint3D|IKModifier3D|IP|Image|ImageFormatLoader|ImageFormatLoaderExtension|ImageTexture|ImageTexture3D|ImageTextureLayered|ImmediateMesh|ImporterMesh|ImporterMeshInstance3D|Input|InputEvent|InputEventAction|InputEventFromWindow|InputEventGesture|InputEventJoypadButton|InputEventJoypadMotion|InputEventKey|InputEventMIDI|InputEventMagnifyGesture|InputEventMouse|InputEventMouseButton|InputEventMouseMotion|InputEventPanGesture|InputEventScreenDrag|InputEventScreenTouch|InputEventShortcut|InputEventWithModifiers|InputMap|InstancePlaceholder|IntervalTweener|ItemList|IterateIK3D|JNISingleton|JSON|JSONRPC|JacobianIK3D|JavaClass|JavaClassWrapper|JavaObject|JavaScriptBridge|JavaScriptObject|Joint2D|Joint3D|JointLimitation3D|JointLimitationCone3D|KinematicCollision2D|KinematicCollision3D|Label|Label3D|LabelSettings|Light2D|Light3D|LightOccluder2D|LightmapGI|LightmapGIData|LightmapProbe|Lightmapper|LightmapperRD|LimitAngularVelocityModifier3D|Line2D|LineEdit|LinkButton|Logger|LookAtModifier3D|MainLoop|MarginContainer|Marker2D|Marker3D|Marshalls|Material|MenuBar|MenuButton|Mesh|MeshConvexDecompositionSettings|MeshDataTool|MeshInstance2D|MeshInstance3D|MeshLibrary|MeshTexture|MethodTweener|MissingNode|MissingResource|ModifierBoneTarget3D|MovieWriter|MultiMesh|MultiMeshInstance2D|MultiMeshInstance3D|MultiplayerAPI|MultiplayerAPIExtension|MultiplayerPeer|MultiplayerPeerExtension|Mutex|NativeMenu|NavigationAgent2D|NavigationAgent3D|NavigationLink2D|NavigationLink3D|NavigationMesh|NavigationMeshGenerator|NavigationMeshSourceGeometryData2D|NavigationMeshSourceGeometryData3D|NavigationObstacle2D|NavigationObstacle3D|NavigationPathQueryParameters2D|NavigationPathQueryParameters3D|NavigationPathQueryResult2D|NavigationPathQueryResult3D|NavigationPolygon|NavigationRegion2D|NavigationRegion3D|NavigationServer2D|NavigationServer2DManager|NavigationServer3D|NavigationServer3DManager|NinePatchRect|Node|Node2D|Node3D|Node3DGizmo|NodePath|ORMMaterial3D|OS|Object|Occluder3D|OccluderInstance3D|OccluderPolygon2D|OmniLight3D|OptimizedTranslation|OptionButton|PCKPacker|PackedByteArray|PackedColorArray|PackedDataContainer|PackedDataContainerRef|PackedFloat32Array|PackedFloat64Array|PackedInt32Array|PackedInt64Array|PackedScene|PackedStringArray|PackedVector2Array|PackedVector3Array|PackedVector4Array|PacketPeer|PacketPeerDTLS|PacketPeerExtension|PacketPeerStream|PacketPeerUDP|Panel|PanelContainer|PanoramaSkyMaterial|Parallax2D|ParallaxBackground|ParallaxLayer|ParticleProcessMaterial|Path2D|Path3D|PathFollow2D|PathFollow3D|Performance|PhysicalBone2D|PhysicalBone3D|PhysicalBoneSimulator3D|PhysicalSkyMaterial|PhysicsBody2D|PhysicsBody3D|PhysicsDirectBodyState2D|PhysicsDirectBodyState2DExtension|PhysicsDirectBodyState3D|PhysicsDirectBodyState3DExtension|PhysicsDirectSpaceState2D|PhysicsDirectSpaceState2DExtension|PhysicsDirectSpaceState3D|PhysicsDirectSpaceState3DExtension|PhysicsMaterial|PhysicsPointQueryParameters2D|PhysicsPointQueryParameters3D|PhysicsRayQueryParameters2D|PhysicsRayQueryParameters3D|PhysicsServer2D|PhysicsServer2DExtension|PhysicsServer2DManager|PhysicsServer3D|PhysicsServer3DExtension|PhysicsServer3DManager|PhysicsServer3DRenderingServerHandler|PhysicsShapeQueryParameters2D|PhysicsShapeQueryParameters3D|PhysicsTestMotionParameters2D|PhysicsTestMotionParameters3D|PhysicsTestMotionResult2D|PhysicsTestMotionResult3D|PinJoint2D|PinJoint3D|PlaceholderCubemap|PlaceholderCubemapArray|PlaceholderMaterial|PlaceholderMesh|PlaceholderTexture2D|PlaceholderTexture2DArray|PlaceholderTexture3D|PlaceholderTextureLayered|Plane|PlaneMesh|PointLight2D|PointMesh|Polygon2D|PolygonOccluder3D|PolygonPathFinder|Popup|PopupMenu|PopupPanel|PortableCompressedTexture2D|PrimitiveMesh|PrismMesh|ProceduralSkyMaterial|ProgressBar|ProjectSettings|Projection|PropertyTweener|QuadMesh|QuadOccluder3D|Quaternion|RDAttachmentFormat|RDFramebufferPass|RDPipelineColorBlendState|RDPipelineColorBlendStateAttachment|RDPipelineDepthStencilState|RDPipelineMultisampleState|RDPipelineRasterizationState|RDPipelineSpecializationConstant|RDSamplerState|RDShaderFile|RDShaderSPIRV|RDShaderSource|RDTextureFormat|RDTextureView|RDUniform|RDVertexAttribute|RID|RandomNumberGenerator|Range|RayCast2D|RayCast3D|Rect2|Rect2i|RectangleShape2D|RefCounted|ReferenceRect|ReflectionProbe|RemoteTransform2D|RemoteTransform3D|RenderData|RenderDataExtension|RenderDataRD|RenderSceneBuffers|RenderSceneBuffersConfiguration|RenderSceneBuffersExtension|RenderSceneBuffersRD|RenderSceneData|RenderSceneDataExtension|RenderSceneDataRD|RenderingDevice|RenderingServer|Resource|ResourceFormatLoader|ResourceFormatSaver|ResourceImporter|ResourceImporterBMFont|ResourceImporterBitMap|ResourceImporterCSVTranslation|ResourceImporterDynamicFont|ResourceImporterImage|ResourceImporterImageFont|ResourceImporterLayeredTexture|ResourceImporterOBJ|ResourceImporterSVG|ResourceImporterScene|ResourceImporterShaderFile|ResourceImporterTexture|ResourceImporterTextureAtlas|ResourceImporterWAV|ResourceLoader|ResourcePreloader|ResourceSaver|ResourceUID|RetargetModifier3D|RibbonTrailMesh|RichTextEffect|RichTextLabel|RigidBody2D|RigidBody3D|RootMotionView|SceneState|SceneTree|SceneTreeTimer|Script|ScriptBacktrace|ScriptCreateDialog|ScriptEditor|ScriptEditorBase|ScriptExtension|ScriptLanguage|ScriptLanguageExtension|ScrollBar|ScrollContainer|SegmentShape2D|Semaphore|SeparationRayShape2D|SeparationRayShape3D|Separator|Shader|ShaderGlobalsOverride|ShaderInclude|ShaderIncludeDB|ShaderMaterial|Shape2D|Shape3D|ShapeCast2D|ShapeCast3D|Shortcut|Signal|Skeleton2D|Skeleton3D|SkeletonIK3D|SkeletonModification2D|SkeletonModification2DCCDIK|SkeletonModification2DFABRIK|SkeletonModification2DJiggle|SkeletonModification2DLookAt|SkeletonModification2DPhysicalBones|SkeletonModification2DStackHolder|SkeletonModification2DTwoBoneIK|SkeletonModificationStack2D|SkeletonModifier3D|SkeletonProfile|SkeletonProfileHumanoid|Skin|SkinReference|Sky|Slider|SliderJoint3D|SocketServer|SoftBody3D|SphereMesh|SphereOccluder3D|SphereShape3D|SpinBox|SplineIK3D|SplitContainer|SpotLight3D|SpringArm3D|SpringBoneCollision3D|SpringBoneCollisionCapsule3D|SpringBoneCollisionPlane3D|SpringBoneCollisionSphere3D|SpringBoneSimulator3D|Sprite2D|Sprite3D|SpriteBase3D|SpriteFrames|StandardMaterial3D|StaticBody2D|StaticBody3D|StatusIndicator|StreamPeer|StreamPeerBuffer|StreamPeerExtension|StreamPeerGZIP|StreamPeerSocket|StreamPeerTCP|StreamPeerTLS|StreamPeerUDS|String|StringName|StyleBox|StyleBoxEmpty|StyleBoxFlat|StyleBoxLine|StyleBoxTexture|SubViewport|SubViewportContainer|SubtweenTweener|SurfaceTool|SyntaxHighlighter|SystemFont|TCPServer|TLSOptions|TabBar|TabContainer|TextEdit|TextLine|TextMesh|TextParagraph|TextServer|TextServerDummy|TextServerExtension|TextServerManager|Texture|Texture2D|Texture2DArray|Texture2DArrayRD|Texture2DRD|Texture3D|Texture3DRD|TextureButton|TextureCubemapArrayRD|TextureCubemapRD|TextureLayered|TextureLayeredRD|TextureProgressBar|TextureRect|Theme|ThemeDB|Thread|TileData|TileMap|TileMapLayer|TileMapPattern|TileSet|TileSetAtlasSource|TileSetScenesCollectionSource|TileSetSource|Time|Timer|TorusMesh|TouchScreenButton|Transform2D|Transform3D|Translation|TranslationDomain|TranslationServer|Tree|TreeItem|TriangleMesh|TubeTrailMesh|Tween|Tweener|TwoBoneIK3D|UDPServer|UDSServer|UndoRedo|UniformSetCacheRD|VBoxContainer|VFlowContainer|VScrollBar|VSeparator|VSlider|VSplitContainer|Variant|Vector2|Vector2i|Vector3|Vector3i|Vector4|Vector4i|VehicleBody3D|VehicleWheel3D|VideoStream|VideoStreamPlayback|VideoStreamPlayer|Viewport|ViewportTexture|VisibleOnScreenEnabler2D|VisibleOnScreenEnabler3D|VisibleOnScreenNotifier2D|VisibleOnScreenNotifier3D|VisualInstance3D|VisualShader|VisualShaderNode|VisualShaderNodeBillboard|VisualShaderNodeBooleanConstant|VisualShaderNodeBooleanParameter|VisualShaderNodeClamp|VisualShaderNodeColorConstant|VisualShaderNodeColorFunc|VisualShaderNodeColorOp|VisualShaderNodeColorParameter|VisualShaderNodeComment|VisualShaderNodeCompare|VisualShaderNodeConstant|VisualShaderNodeCubemap|VisualShaderNodeCubemapParameter|VisualShaderNodeCurveTexture|VisualShaderNodeCurveXYZTexture|VisualShaderNodeCustom|VisualShaderNodeDerivativeFunc|VisualShaderNodeDeterminant|VisualShaderNodeDistanceFade|VisualShaderNodeDotProduct|VisualShaderNodeExpression|VisualShaderNodeFaceForward|VisualShaderNodeFloatConstant|VisualShaderNodeFloatFunc|VisualShaderNodeFloatOp|VisualShaderNodeFloatParameter|VisualShaderNodeFrame|VisualShaderNodeFresnel|VisualShaderNodeGlobalExpression|VisualShaderNodeGroupBase|VisualShaderNodeIf|VisualShaderNodeInput|VisualShaderNodeIntConstant|VisualShaderNodeIntFunc|VisualShaderNodeIntOp|VisualShaderNodeIntParameter|VisualShaderNodeIs|VisualShaderNodeLinearSceneDepth|VisualShaderNodeMix|VisualShaderNodeMultiplyAdd|VisualShaderNodeOuterProduct|VisualShaderNodeOutput|VisualShaderNodeParameter|VisualShaderNodeParameterRef|VisualShaderNodeParticleAccelerator|VisualShaderNodeParticleBoxEmitter|VisualShaderNodeParticleConeVelocity|VisualShaderNodeParticleEmit|VisualShaderNodeParticleEmitter|VisualShaderNodeParticleMeshEmitter|VisualShaderNodeParticleMultiplyByAxisAngle|VisualShaderNodeParticleOutput|VisualShaderNodeParticleRandomness|VisualShaderNodeParticleRingEmitter|VisualShaderNodeParticleSphereEmitter|VisualShaderNodeProximityFade|VisualShaderNodeRandomRange|VisualShaderNodeRemap|VisualShaderNodeReroute|VisualShaderNodeResizableBase|VisualShaderNodeRotationByAxis|VisualShaderNodeSDFRaymarch|VisualShaderNodeSDFToScreenUV|VisualShaderNodeSample3D|VisualShaderNodeScreenNormalWorldSpace|VisualShaderNodeScreenUVToSDF|VisualShaderNodeSmoothStep|VisualShaderNodeStep|VisualShaderNodeSwitch|VisualShaderNodeTexture|VisualShaderNodeTexture2DArray|VisualShaderNodeTexture2DArrayParameter|VisualShaderNodeTexture2DParameter|VisualShaderNodeTexture3D|VisualShaderNodeTexture3DParameter|VisualShaderNodeTextureParameter|VisualShaderNodeTextureParameterTriplanar|VisualShaderNodeTextureSDF|VisualShaderNodeTextureSDFNormal|VisualShaderNodeTransformCompose|VisualShaderNodeTransformConstant|VisualShaderNodeTransformDecompose|VisualShaderNodeTransformFunc|VisualShaderNodeTransformOp|VisualShaderNodeTransformParameter|VisualShaderNodeTransformVecMult|VisualShaderNodeUIntConstant|VisualShaderNodeUIntFunc|VisualShaderNodeUIntOp|VisualShaderNodeUIntParameter|VisualShaderNodeUVFunc|VisualShaderNodeUVPolarCoord|VisualShaderNodeVarying|VisualShaderNodeVaryingGetter|VisualShaderNodeVaryingSetter|VisualShaderNodeVec2Constant|VisualShaderNodeVec2Parameter|VisualShaderNodeVec3Constant|VisualShaderNodeVec3Parameter|VisualShaderNodeVec4Constant|VisualShaderNodeVec4Parameter|VisualShaderNodeVectorBase|VisualShaderNodeVectorCompose|VisualShaderNodeVectorDecompose|VisualShaderNodeVectorDistance|VisualShaderNodeVectorFunc|VisualShaderNodeVectorLen|VisualShaderNodeVectorOp|VisualShaderNodeVectorRefract|VisualShaderNodeWorldPositionFromDepth|VoxelGI|VoxelGIData|WeakRef|Window|WorkerThreadPool|World2D|World3D|WorldBoundaryShape2D|WorldBoundaryShape3D|WorldEnvironment|X509Certificate|XMLParser|XRAnchor3D|XRBodyModifier3D|XRBodyTracker|XRCamera3D|XRController3D|XRControllerTracker|XRFaceModifier3D|XRFaceTracker|XRHandModifier3D|XRHandTracker|XRInterface|XRInterfaceExtension|XRNode3D|XROrigin3D|XRPose|XRPositionalTracker|XRServer|XRTracker|XRVRS|bool|float|int|AudioServer|CameraServer|ClassDB|DisplayServer|EditorInterface|Engine|EngineDebugger|GDExtensionManager|Geometry2D|Geometry3D|GodotSharp|IP|Input|InputMap|JavaClassWrapper|JavaScriptBridge|Marshalls|NavigationMeshGenerator|NavigationServer2D|NavigationServer3D|OS|Performance|PhysicsServer2D|PhysicsServer2DManager|PhysicsServer3D|PhysicsServer3DManager|ProjectSettings|RenderingServer|ResourceLoader|ResourceSaver|ResourceUID|TextServerManager|ThemeDB|Time|TranslationServer|WorkerThreadPool|XRServer)$")) + +; Builtin Funcs +;; #D2A6FF #000000 0 0 0 2 +(call + (identifier) @function.builtin + (#match? @function.builtin "^(abs|absf|absi|acos|acosh|angle_difference|asin|asinh|atan|atan2|atanh|bezier_derivative|bezier_interpolate|bytes_to_var|bytes_to_var_with_objects|ceil|ceilf|ceili|clamp|clampf|clampi|cos|cosh|cubic_interpolate|cubic_interpolate_angle|cubic_interpolate_angle_in_time|cubic_interpolate_in_time|db_to_linear|deg_to_rad|ease|error_string|exp|floor|floorf|floori|fmod|fposmod|hash|instance_from_id|inverse_lerp|is_equal_approx|is_finite|is_inf|is_instance_id_valid|is_instance_valid|is_nan|is_same|is_zero_approx|lerp|lerp_angle|lerpf|linear_to_db|log|max|maxf|maxi|min|minf|mini|move_toward|nearest_po2|pingpong|posmod|pow|print|print_rich|print_verbose|printerr|printraw|prints|printt|push_error|push_warning|rad_to_deg|rand_from_seed|randf|randf_range|randfn|randi|randi_range|randomize|remap|rid_allocate_id|rid_from_int64|rotate_toward|round|roundf|roundi|seed|sign|signf|signi|sin|sinh|smoothstep|snapped|snappedf|snappedi|sqrt|step_decimals|str|str_to_var|tan|tanh|type_convert|type_string|typeof|var_to_bytes|var_to_bytes_with_objects|var_to_str|weakref|wrap|wrapf|wrapi|Color8|assert|char|convert|dict_to_inst|get_stack|inst_to_dict|is_instance_of|len|load|ord|preload|print_debug|print_stack|range|type_exists)$")) + +;; #7DCFFF #000000 0 0 0 2 +; Builtin Constants +((identifier) @constant.builtin + (#match? @constant.builtin "^(INF|NAN|PI|TAU|CLOCKWISE|CORNER_BOTTOM_LEFT|CORNER_BOTTOM_RIGHT|CORNER_TOP_LEFT|CORNER_TOP_RIGHT|COUNTERCLOCKWISE|ERR_ALREADY_EXISTS|ERR_ALREADY_IN_USE|ERR_BUG|ERR_BUSY|ERR_CANT_ACQUIRE_RESOURCE|ERR_CANT_CONNECT|ERR_CANT_CREATE|ERR_CANT_FORK|ERR_CANT_OPEN|ERR_CANT_RESOLVE|ERR_COMPILATION_FAILED|ERR_CONNECTION_ERROR|ERR_CYCLIC_LINK|ERR_DATABASE_CANT_READ|ERR_DATABASE_CANT_WRITE|ERR_DOES_NOT_EXIST|ERR_DUPLICATE_SYMBOL|ERR_FILE_ALREADY_IN_USE|ERR_FILE_BAD_DRIVE|ERR_FILE_BAD_PATH|ERR_FILE_CANT_OPEN|ERR_FILE_CANT_READ|ERR_FILE_CANT_WRITE|ERR_FILE_CORRUPT|ERR_FILE_EOF|ERR_FILE_MISSING_DEPENDENCIES|ERR_FILE_NO_PERMISSION|ERR_FILE_NOT_FOUND|ERR_FILE_UNRECOGNIZED|ERR_HELP|ERR_INVALID_DATA|ERR_INVALID_DECLARATION|ERR_INVALID_PARAMETER|ERR_LINK_FAILED|ERR_LOCKED|ERR_METHOD_NOT_FOUND|ERR_OUT_OF_MEMORY|ERR_PARAMETER_RANGE_ERROR|ERR_PARSE_ERROR|ERR_PRINTER_ON_FIRE|ERR_QUERY_FAILED|ERR_SCRIPT_FAILED|ERR_SKIP|ERR_TIMEOUT|ERR_UNAUTHORIZED|ERR_UNAVAILABLE|ERR_UNCONFIGURED|EULER_ORDER_XYZ|EULER_ORDER_XZY|EULER_ORDER_YXZ|EULER_ORDER_YZX|EULER_ORDER_ZXY|EULER_ORDER_ZYX|FAILED|HORIZONTAL|HORIZONTAL_ALIGNMENT_CENTER|HORIZONTAL_ALIGNMENT_FILL|HORIZONTAL_ALIGNMENT_LEFT|HORIZONTAL_ALIGNMENT_RIGHT|INLINE_ALIGNMENT_BASELINE_TO|INLINE_ALIGNMENT_BOTTOM|INLINE_ALIGNMENT_BOTTOM_TO|INLINE_ALIGNMENT_CENTER|INLINE_ALIGNMENT_CENTER_TO|INLINE_ALIGNMENT_IMAGE_MASK|INLINE_ALIGNMENT_TEXT_MASK|INLINE_ALIGNMENT_TO_BASELINE|INLINE_ALIGNMENT_TO_BOTTOM|INLINE_ALIGNMENT_TO_CENTER|INLINE_ALIGNMENT_TOP|INLINE_ALIGNMENT_TOP_TO|INLINE_ALIGNMENT_TO_TOP|JOY_AXIS_INVALID|JOY_AXIS_LEFT_X|JOY_AXIS_LEFT_Y|JOY_AXIS_MAX|JOY_AXIS_RIGHT_X|JOY_AXIS_RIGHT_Y|JOY_AXIS_SDL_MAX|JOY_AXIS_TRIGGER_LEFT|JOY_AXIS_TRIGGER_RIGHT|JOY_BUTTON_A|JOY_BUTTON_B|JOY_BUTTON_BACK|JOY_BUTTON_DPAD_DOWN|JOY_BUTTON_DPAD_LEFT|JOY_BUTTON_DPAD_RIGHT|JOY_BUTTON_DPAD_UP|JOY_BUTTON_GUIDE|JOY_BUTTON_INVALID|JOY_BUTTON_LEFT_SHOULDER|JOY_BUTTON_LEFT_STICK|JOY_BUTTON_MAX|JOY_BUTTON_MISC1|JOY_BUTTON_PADDLE1|JOY_BUTTON_PADDLE2|JOY_BUTTON_PADDLE3|JOY_BUTTON_PADDLE4|JOY_BUTTON_RIGHT_SHOULDER|JOY_BUTTON_RIGHT_STICK|JOY_BUTTON_SDL_MAX|JOY_BUTTON_START|JOY_BUTTON_TOUCHPAD|JOY_BUTTON_X|JOY_BUTTON_Y|KEY_0|KEY_1|KEY_2|KEY_3|KEY_4|KEY_5|KEY_6|KEY_7|KEY_8|KEY_9|KEY_A|KEY_ALT|KEY_AMPERSAND|KEY_APOSTROPHE|KEY_ASCIICIRCUM|KEY_ASCIITILDE|KEY_ASTERISK|KEY_AT|KEY_B|KEY_BACK|KEY_BACKSLASH|KEY_BACKSPACE|KEY_BACKTAB|KEY_BAR|KEY_BRACELEFT|KEY_BRACERIGHT|KEY_BRACKETLEFT|KEY_BRACKETRIGHT|KEY_C|KEY_CAPSLOCK|KEY_CLEAR|KEY_CODE_MASK|KEY_COLON|KEY_COMMA|KEY_CTRL|KEY_D|KEY_DELETE|KEY_DOLLAR|KEY_DOWN|KEY_E|KEY_END|KEY_ENTER|KEY_EQUAL|KEY_ESCAPE|KEY_EXCLAM|KEY_F|KEY_F1|KEY_F10|KEY_F11|KEY_F12|KEY_F13|KEY_F14|KEY_F15|KEY_F16|KEY_F17|KEY_F18|KEY_F19|KEY_F2|KEY_F20|KEY_F21|KEY_F22|KEY_F23|KEY_F24|KEY_F25|KEY_F26|KEY_F27|KEY_F28|KEY_F29|KEY_F3|KEY_F30|KEY_F31|KEY_F32|KEY_F33|KEY_F34|KEY_F35|KEY_F4|KEY_F5|KEY_F6|KEY_F7|KEY_F8|KEY_F9|KEY_FAVORITES|KEY_FORWARD|KEY_G|KEY_GLOBE|KEY_GREATER|KEY_H|KEY_HELP|KEY_HOME|KEY_HOMEPAGE|KEY_HYPER|KEY_I|KEY_INSERT|KEY_J|KEY_JIS_EISU|KEY_JIS_KANA|KEY_K|KEY_KEYBOARD|KEY_KP_0|KEY_KP_1|KEY_KP_2|KEY_KP_3|KEY_KP_4|KEY_KP_5|KEY_KP_6|KEY_KP_7|KEY_KP_8|KEY_KP_9|KEY_KP_ADD|KEY_KP_DIVIDE|KEY_KP_ENTER|KEY_KP_MULTIPLY|KEY_KP_PERIOD|KEY_KP_SUBTRACT|KEY_L|KEY_LAUNCH0|KEY_LAUNCH1|KEY_LAUNCH2|KEY_LAUNCH3|KEY_LAUNCH4|KEY_LAUNCH5|KEY_LAUNCH6|KEY_LAUNCH7|KEY_LAUNCH8|KEY_LAUNCH9|KEY_LAUNCHA|KEY_LAUNCHB|KEY_LAUNCHC|KEY_LAUNCHD|KEY_LAUNCHE|KEY_LAUNCHF|KEY_LAUNCHMAIL|KEY_LAUNCHMEDIA|KEY_LEFT|KEY_LESS|KEY_LOCATION_LEFT|KEY_LOCATION_RIGHT|KEY_LOCATION_UNSPECIFIED|KEY_M|KEY_MASK_ALT|KEY_MASK_CMD_OR_CTRL|KEY_MASK_CTRL|KEY_MASK_GROUP_SWITCH|KEY_MASK_KPAD|KEY_MASK_META|KEY_MASK_SHIFT|KEY_MEDIANEXT|KEY_MEDIAPLAY|KEY_MEDIAPREVIOUS|KEY_MEDIARECORD|KEY_MEDIASTOP|KEY_MENU|KEY_META|KEY_MINUS|KEY_MODIFIER_MASK|KEY_N|KEY_NONE|KEY_NUMBERSIGN|KEY_NUMLOCK|KEY_O|KEY_OPENURL|KEY_P|KEY_PAGEDOWN|KEY_PAGEUP|KEY_PARENLEFT|KEY_PARENRIGHT|KEY_PAUSE|KEY_PERCENT|KEY_PERIOD|KEY_PLUS|KEY_PRINT|KEY_Q|KEY_QUESTION|KEY_QUOTEDBL|KEY_QUOTELEFT|KEY_R|KEY_REFRESH|KEY_RIGHT|KEY_S|KEY_SCROLLLOCK|KEY_SEARCH|KEY_SECTION|KEY_SEMICOLON|KEY_SHIFT|KEY_SLASH|KEY_SPACE|KEY_SPECIAL|KEY_STANDBY|KEY_STOP|KEY_SYSREQ|KEY_T|KEY_TAB|KEY_U|KEY_UNDERSCORE|KEY_UNKNOWN|KEY_UP|KEY_V|KEY_VOLUMEDOWN|KEY_VOLUMEMUTE|KEY_VOLUMEUP|KEY_W|KEY_X|KEY_Y|KEY_YEN|KEY_Z|METHOD_FLAG_CONST|METHOD_FLAG_EDITOR|METHOD_FLAG_NORMAL|METHOD_FLAG_OBJECT_CORE|METHOD_FLAGS_DEFAULT|METHOD_FLAG_STATIC|METHOD_FLAG_VARARG|METHOD_FLAG_VIRTUAL|METHOD_FLAG_VIRTUAL_REQUIRED|MIDI_MESSAGE_ACTIVE_SENSING|MIDI_MESSAGE_AFTERTOUCH|MIDI_MESSAGE_CHANNEL_PRESSURE|MIDI_MESSAGE_CONTINUE|MIDI_MESSAGE_CONTROL_CHANGE|MIDI_MESSAGE_NONE|MIDI_MESSAGE_NOTE_OFF|MIDI_MESSAGE_NOTE_ON|MIDI_MESSAGE_PITCH_BEND|MIDI_MESSAGE_PROGRAM_CHANGE|MIDI_MESSAGE_QUARTER_FRAME|MIDI_MESSAGE_SONG_POSITION_POINTER|MIDI_MESSAGE_SONG_SELECT|MIDI_MESSAGE_START|MIDI_MESSAGE_STOP|MIDI_MESSAGE_SYSTEM_EXCLUSIVE|MIDI_MESSAGE_SYSTEM_RESET|MIDI_MESSAGE_TIMING_CLOCK|MIDI_MESSAGE_TUNE_REQUEST|MOUSE_BUTTON_LEFT|MOUSE_BUTTON_MASK_LEFT|MOUSE_BUTTON_MASK_MB_XBUTTON1|MOUSE_BUTTON_MASK_MB_XBUTTON2|MOUSE_BUTTON_MASK_MIDDLE|MOUSE_BUTTON_MASK_RIGHT|MOUSE_BUTTON_MIDDLE|MOUSE_BUTTON_NONE|MOUSE_BUTTON_RIGHT|MOUSE_BUTTON_WHEEL_DOWN|MOUSE_BUTTON_WHEEL_LEFT|MOUSE_BUTTON_WHEEL_RIGHT|MOUSE_BUTTON_WHEEL_UP|MOUSE_BUTTON_XBUTTON1|MOUSE_BUTTON_XBUTTON2|OK|OP_ADD|OP_AND|OP_BIT_AND|OP_BIT_NEGATE|OP_BIT_OR|OP_BIT_XOR|OP_DIVIDE|OP_EQUAL|OP_GREATER|OP_GREATER_EQUAL|OP_IN|OP_LESS|OP_LESS_EQUAL|OP_MAX|OP_MODULE|OP_MULTIPLY|OP_NEGATE|OP_NOT|OP_NOT_EQUAL|OP_OR|OP_POSITIVE|OP_POWER|OP_SHIFT_LEFT|OP_SHIFT_RIGHT|OP_SUBTRACT|OP_XOR|PROPERTY_HINT_ARRAY_TYPE|PROPERTY_HINT_COLOR_NO_ALPHA|PROPERTY_HINT_DICTIONARY_TYPE|PROPERTY_HINT_DIR|PROPERTY_HINT_ENUM|PROPERTY_HINT_ENUM_SUGGESTION|PROPERTY_HINT_EXP_EASING|PROPERTY_HINT_EXPRESSION|PROPERTY_HINT_FILE|PROPERTY_HINT_FILE_PATH|PROPERTY_HINT_FLAGS|PROPERTY_HINT_GLOBAL_DIR|PROPERTY_HINT_GLOBAL_FILE|PROPERTY_HINT_GLOBAL_SAVE_FILE|PROPERTY_HINT_GROUP_ENABLE|PROPERTY_HINT_HIDE_QUATERNION_EDIT|PROPERTY_HINT_INPUT_NAME|PROPERTY_HINT_INT_IS_OBJECTID|PROPERTY_HINT_INT_IS_POINTER|PROPERTY_HINT_LAYERS_2D_NAVIGATION|PROPERTY_HINT_LAYERS_2D_PHYSICS|PROPERTY_HINT_LAYERS_2D_RENDER|PROPERTY_HINT_LAYERS_3D_NAVIGATION|PROPERTY_HINT_LAYERS_3D_PHYSICS|PROPERTY_HINT_LAYERS_3D_RENDER|PROPERTY_HINT_LAYERS_AVOIDANCE|PROPERTY_HINT_LINK|PROPERTY_HINT_LOCALE_ID|PROPERTY_HINT_LOCALIZABLE_STRING|PROPERTY_HINT_MAX|PROPERTY_HINT_MULTILINE_TEXT|PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE|PROPERTY_HINT_NODE_PATH_VALID_TYPES|PROPERTY_HINT_NODE_TYPE|PROPERTY_HINT_NONE|PROPERTY_HINT_OBJECT_ID|PROPERTY_HINT_OBJECT_TOO_BIG|PROPERTY_HINT_ONESHOT|PROPERTY_HINT_PASSWORD|PROPERTY_HINT_PLACEHOLDER_TEXT|PROPERTY_HINT_RANGE|PROPERTY_HINT_RESOURCE_TYPE|PROPERTY_HINT_SAVE_FILE|PROPERTY_HINT_TOOL_BUTTON|PROPERTY_HINT_TYPE_STRING|PROPERTY_USAGE_ALWAYS_DUPLICATE|PROPERTY_USAGE_ARRAY|PROPERTY_USAGE_CATEGORY|PROPERTY_USAGE_CHECKABLE|PROPERTY_USAGE_CHECKED|PROPERTY_USAGE_CLASS_IS_BITFIELD|PROPERTY_USAGE_CLASS_IS_ENUM|PROPERTY_USAGE_DEFAULT|PROPERTY_USAGE_DEFERRED_SET_RESOURCE|PROPERTY_USAGE_EDITOR|PROPERTY_USAGE_EDITOR_BASIC_SETTING|PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT|PROPERTY_USAGE_GROUP|PROPERTY_USAGE_HIGH_END_GFX|PROPERTY_USAGE_INTERNAL|PROPERTY_USAGE_KEYING_INCREMENTS|PROPERTY_USAGE_NEVER_DUPLICATE|PROPERTY_USAGE_NIL_IS_VARIANT|PROPERTY_USAGE_NODE_PATH_FROM_SCENE_ROOT|PROPERTY_USAGE_NO_EDITOR|PROPERTY_USAGE_NO_INSTANCE_STATE|PROPERTY_USAGE_NONE|PROPERTY_USAGE_READ_ONLY|PROPERTY_USAGE_RESOURCE_NOT_PERSISTENT|PROPERTY_USAGE_RESTART_IF_CHANGED|PROPERTY_USAGE_SCRIPT_DEFAULT_VALUE|PROPERTY_USAGE_SCRIPT_VARIABLE|PROPERTY_USAGE_SECRET|PROPERTY_USAGE_STORAGE|PROPERTY_USAGE_STORE_IF_NULL|PROPERTY_USAGE_SUBGROUP|PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED|SIDE_BOTTOM|SIDE_LEFT|SIDE_RIGHT|SIDE_TOP|TYPE_AABB|TYPE_ARRAY|TYPE_BASIS|TYPE_BOOL|TYPE_CALLABLE|TYPE_COLOR|TYPE_DICTIONARY|TYPE_FLOAT|TYPE_INT|TYPE_MAX|TYPE_NIL|TYPE_NODE_PATH|TYPE_OBJECT|TYPE_PACKED_BYTE_ARRAY|TYPE_PACKED_COLOR_ARRAY|TYPE_PACKED_FLOAT32_ARRAY|TYPE_PACKED_FLOAT64_ARRAY|TYPE_PACKED_INT32_ARRAY|TYPE_PACKED_INT64_ARRAY|TYPE_PACKED_STRING_ARRAY|TYPE_PACKED_VECTOR2_ARRAY|TYPE_PACKED_VECTOR3_ARRAY|TYPE_PACKED_VECTOR4_ARRAY|TYPE_PLANE|TYPE_PROJECTION|TYPE_QUATERNION|TYPE_RECT2|TYPE_RECT2I|TYPE_RID|TYPE_SIGNAL|TYPE_STRING|TYPE_STRING_NAME|TYPE_TRANSFORM2D|TYPE_TRANSFORM3D|TYPE_VECTOR2|TYPE_VECTOR2I|TYPE_VECTOR3|TYPE_VECTOR3I|TYPE_VECTOR4|TYPE_VECTOR4I|VERTICAL|VERTICAL_ALIGNMENT_BOTTOM|VERTICAL_ALIGNMENT_CENTER|VERTICAL_ALIGNMENT_FILL|VERTICAL_ALIGNMENT_TOP)$")) diff --git a/grammar/gitattributes.scm b/grammar/gitattributes.scm new file mode 100644 index 0000000..46d3b99 --- /dev/null +++ b/grammar/gitattributes.scm @@ -0,0 +1,70 @@ +;; #AAD94C #000000 0 0 0 3 +(dir_sep) @punctuation.delimiter + +;; #AAD94C #000000 0 0 0 3 +(quoted_pattern + "\"" @punctuation.special) + +;; #AAD94C #000000 0 0 0 3 +(range_notation) @string.special + +;; #AAD94C #000000 0 0 0 3 +(range_notation + [ "[" "]" ] @punctuation.bracket) + +;; #F29668 #000000 0 0 0 1 +(wildcard) @string.regexp + +;; #F29668 #000000 0 0 0 1 +(range_negation) @operator + +;; #7dcfff #000000 0 0 0 2 +(character_class) @constant + +;; #F29668 #000000 0 0 0 1 +(class_range "-" @operator) + +;; #FF8F40 #000000 0 0 0 1 +[ + (ansi_c_escape) + (escaped_char) +] @escape + +;; #AAD94C #000000 0 0 0 3 +(attribute + (attr_name) @variable.parameter) + +;; #F07178 #000000 0 0 0 1 +(attribute + (builtin_attr) @variable.builtin) + +;; #F29668 #000000 0 0 0 1 +[ + (attr_reset) + (attr_unset) + (attr_set) +] @operator + +;; #F29668 #000000 0 0 0 1 +(boolean_value) @boolean + +;; #AAD94C #000000 0 0 0 2 +(string_value) @string + +;; #D2A6FF #000000 0 0 0 1 +(macro_tag) @keyword + +;; #7dcfff #000000 0 0 0 2 +(macro_def + macro_name: (_) @property) + +;; #F07178 #000000 0 0 0 1 +[ + (pattern_negation) + (redundant_escape) + (trailing_slash) + (ignored_value) +] @error + +;; #99ADBF #000000 0 1 0 1 +(comment) @comment diff --git a/grammar/gitignore.scm b/grammar/gitignore.scm new file mode 100644 index 0000000..93bb1bc --- /dev/null +++ b/grammar/gitignore.scm @@ -0,0 +1,46 @@ +;; #99ADBF #000000 0 1 0 1 +(comment) @comment @spell + +;; #7dcfff #000000 0 0 0 2 +(pattern_char) @string.special.path + +;; #AAD94C #000000 0 0 0 3 +[ + (directory_separator) + (directory_separator_escaped) +] @punctuation.delimiter + +;; #F29668 #000000 0 0 0 1 +[ + (wildcard_char_single) + (wildcard_chars) + (wildcard_chars_allow_slash) +] @character.special + +;; #FF8F40 #000000 0 0 0 1 +[ + (pattern_char_escaped) + (bracket_char_escaped) +] @string.escape + +;; #AAD94C #000000 0 0 0 3 +(negation) @punctuation.special + +;; #F07178 #000000 0 0 0 1 +(bracket_negation) @operator + +;; #AAD94C #000000 0 0 0 3 +[ + "[" + "]" +] @punctuation.bracket + +;; #7dcfff #000000 0 0 0 2 +(bracket_char) @constant + +;; #F29668 #000000 0 0 0 1 +(bracket_range + "-" @operator) + +;; #F07178 #000000 0 0 0 1 +(bracket_char_class) @constant.builtin diff --git a/grammar/go.scm b/grammar/go.scm new file mode 100644 index 0000000..fdc66a3 --- /dev/null +++ b/grammar/go.scm @@ -0,0 +1,286 @@ +;; #FFB454 #000000 0 0 0 3 +(type_identifier) @type + +;; #FFB454 #000000 0 0 0 3 +(type_spec + name: (type_identifier) @type.definition) + +;; #FFFFFF #000000 0 0 0 1 +(field_identifier) @property + +;; #FFFFFF #000000 0 0 0 1 +(identifier) @variable + +;; #FFFFFF #000000 0 0 0 1 +(package_identifier) @module + +;; #FFFFFF #000000 0 0 0 1 +(parameter_declaration + (identifier) @variable.parameter) + +;; #FFFFFF #000000 0 0 0 1 +(variadic_parameter_declaration + (identifier) @variable.parameter) + +;; #F07178 #000000 0 0 0 1 +(label_name) @label + +;; #D2A6FF #000000 0 0 0 1 +(const_spec + name: (identifier) @constant) + +;; #FFB454 #000000 0 0 0 3 +(call_expression + function: (identifier) @function.call) + +;; #FFB454 #000000 0 0 0 3 +(call_expression + function: (selector_expression + field: (field_identifier) @function.method.call)) + +;; #FFB454 #000000 0 0 0 3 +(function_declaration + name: (identifier) @function) + +;; #FFB454 #000000 0 0 0 3 +(method_declaration + name: (field_identifier) @function.method) + +;; #FFB454 #000000 0 0 0 3 +(method_elem + name: (field_identifier) @function.method) + +;; #FFB454 #000000 0 0 0 3 +((call_expression + (identifier) @constructor) + (#match? @constructor "^[nN]ew.+$")) + +;; #FFB454 #000000 0 0 0 3 +((call_expression + (identifier) @constructor) + (#match? @constructor "^[mM]ake.+$")) + +;; #F29668 #000000 0 1 0 1 +[ + "--" + "-" + "-=" + ":=" + "!" + "!=" + "..." + "*" + "*=" + "/" + "/=" + "&" + "&&" + "&=" + "&^" + "&^=" + "%" + "%=" + "^" + "^=" + "+" + "++" + "+=" + "<-" + "<" + "<<" + "<<=" + "<=" + "=" + "==" + ">" + ">=" + ">>" + ">>=" + "|" + "|=" + "||" + "~" +] @operator + +;; #FF8F40 #000000 0 0 0 1 +[ + "break" + "const" + "continue" + "default" + "defer" + "goto" + "range" + "select" + "var" + "fallthrough" +] @keyword + +;; #FF8F40 #000000 0 0 0 1 +[ + "type" + "struct" + "interface" +] @keyword.type + +;; #FF8F40 #000000 0 0 0 1 +"func" @keyword.function + +;; #FF8F40 #000000 0 0 0 1 +"return" @keyword.return + +;; #FF8F40 #000000 0 0 0 1 +"go" @keyword.coroutine + +;; #FF8F40 #000000 0 0 0 1 +"for" @keyword.repeat + +;; #FF8F40 #000000 0 0 0 1 +[ + "import" + "package" +] @keyword.import + +;; #FF8F40 #000000 0 0 0 1 +[ + "else" + "case" + "switch" + "if" +] @keyword.conditional + +;; #F07178 #000000 0 0 0 1 +[ + "chan" + "map" +] @type.builtin + +;; #F07178 #000000 0 0 0 1 +((type_identifier) @type.builtin + (#match? @type.builtin + "^(any|bool|byte|comparable|complex128|complex64|error|float32|float64|int|int16|int32|int64|int8|rune|string|uint|uint16|uint32|uint64|uint8|uintptr)$")) + +;; #FFB454 #000000 0 0 0 3 +((identifier) @function.builtin + (#match? @function.builtin + "^(append|cap|clear|close|complex|copy|delete|imag|len|make|max|min|new|panic|print|println|real|recover)$")) + +;; #BFBDB6 #000000 0 0 0 1 +"." @punctuation.delimiter + +;; #BFBDB6 #000000 0 0 0 1 +"," @punctuation.delimiter + +;; #BFBDB6 #000000 0 0 0 1 +":" @punctuation.delimiter + +;; #BFBDB6 #000000 0 0 0 1 +";" @punctuation.delimiter + +;; #BFBDB6 #000000 0 0 0 1 +"(" @punctuation.bracket + +;; #BFBDB6 #000000 0 0 0 1 +")" @punctuation.bracket + +;; #BFBDB6 #000000 0 0 0 1 +"{" @punctuation.bracket + +;; #BFBDB6 #000000 0 0 0 1 +"}" @punctuation.bracket + +;; #BFBDB6 #000000 0 0 0 1 +"[" @punctuation.bracket + +;; #BFBDB6 #000000 0 0 0 1 +"]" @punctuation.bracket + +;; #AAD94C #000000 0 0 0 1 +(interpreted_string_literal) @string + +;; #AAD94C #000000 0 0 0 1 +(raw_string_literal) @string + +;; #AAD94C #000000 0 0 0 1 +(rune_literal) @string + +;; #AAD94C #000000 0 0 0 1 +(escape_sequence) @string.escape + +;; #D2A6FF #000000 0 0 0 2 +(int_literal) @number + +;; #D2A6FF #000000 0 0 0 2 +(float_literal) @number.float + +;; #D2A6FF #000000 0 0 0 2 +(imaginary_literal) @number + +;; #D2A6FF #000000 0 0 0 1 +[ + (true) + (false) +] @boolean + +;; #D2A6FF #000000 0 0 0 1 +[ + (nil) + (iota) +] @constant.builtin + +;; #FFFFFF #000000 0 0 0 1 +(keyed_element + . + (literal_element + (identifier) @variable.member)) + +;; #FFFFFF #000000 0 0 0 1 +(field_declaration + name: (field_identifier) @variable.member) + +;; #99ADBF #000000 0 1 0 1 +(comment) @comment @spell + +;; #99ADBF #000000 0 1 0 1 +(source_file + . + (comment)+ @comment.documentation) + +;; #99ADBF #000000 0 1 0 1 +(source_file + (comment)+ @comment.documentation + . + (const_declaration)) + +;; #99ADBF #000000 0 1 0 1 +(source_file + (comment)+ @comment.documentation + . + (function_declaration)) + +;; #99ADBF #000000 0 1 0 1 +(source_file + (comment)+ @comment.documentation + . + (type_declaration)) + +;; #99ADBF #000000 0 1 0 1 +(source_file + (comment)+ @comment.documentation + . + (var_declaration)) + +;; #AAD94C #000000 0 0 0 1 +(call_expression + (selector_expression) @_function + (#match? @_function + "^(regexp\.Match|regexp\.MatchReader|regexp\.MatchString|regexp\.Compile|regexp\.CompilePOSIX|regexp\.MustCompile|regexp\.MustCompilePOSIX)$") + (argument_list + . + [ +;; !regex + (raw_string_literal + (raw_string_literal_content) @string.regexp) + (interpreted_string_literal + (interpreted_string_literal_content) @string.regexp) + ])) diff --git a/grammar/gomod.scm b/grammar/gomod.scm new file mode 100644 index 0000000..77be44e --- /dev/null +++ b/grammar/gomod.scm @@ -0,0 +1,46 @@ +;; #D2A6FF #000000 0 0 0 1 +[ + "require" + "replace" + "toolchain" + "exclude" + "retract" +] @keyword + +;; #F07178 #000000 0 0 0 1 +[ + "go" + "module" +] @keyword.directive + +;; #F29668 #000000 0 1 0 1 +"=>" @operator + +;; #99ADBF #000000 0 1 0 1 +(comment) @comment @spell + +;; #7dcfff #000000 0 0 0 1 +(module_path) @string.special.url + +;; #D2A6FF #000000 0 0 0 1 +(tool_directive) @keyword.directive + +(tool) @string.special.url + +;; #F29668 #000000 0 0 0 2 +[ + (version) + (go_version) + (toolchain_name) +] @string.special + +;; #888888 #000000 0 0 0 3 +[ + "(" + ")" + "[" + "]" +] @punctuation.bracket + +;; #888888 #000000 0 1 0 3 +"," @punctuation.delimiter diff --git a/grammar/h.scm b/grammar/h.scm index d6b8b26..31215ae 100644 --- a/grammar/h.scm +++ b/grammar/h.scm @@ -1,11 +1,54 @@ -;; #ffffff #000000 0 0 0 1 -((identifier) @variable - (#set! priority 95)) +; ============================================================ +; Identifiers +; ============================================================ +;; #FFFFFF #000000 0 0 0 1 +((identifier) @variable) + +;; #FFB870 #000000 0 0 0 9 +(function_declarator + declarator: (identifier) @function) + +;; #C4B5FF #000000 0 0 0 2 +((identifier) @constant + (#match? @constant "^[A-Z][A-Z0-9_]+$")) + +;; #C4B5FF #000000 0 0 0 2 +(preproc_def + (preproc_arg) @constant + (#match? @constant "^[A-Z][A-Z0-9_]+$")) + +;; #F29CC3 #000000 0 0 0 2 +((identifier) @constant.builtin + (#match? @constant.builtin "^(stderr|stdin|stdout|__FILE__|__LINE__|__DATE__|__TIME__|__STDC__|__STDC_VERSION__|__STDC_HOSTED__|__cplusplus|__OBJC__|__ASSEMBLER__|__BASE_FILE__|__FILE_NAME__|__INCLUDE_LEVEL__|__TIMESTAMP__|__clang__|__clang_major__|__clang_minor__|__clang_patchlevel__|__clang_version__|__clang_literal_encoding__|__clang_wide_literal_encoding__|__FUNCTION__|__func__|__PRETTY_FUNCTION__|__VA_ARGS__|__VA_OPT__)$")) + +;; #F29CC3 #000000 0 0 0 2 +(preproc_def + (preproc_arg) @constant.builtin + (#match? @constant.builtin "^(stderr|stdin|stdout|__FILE__|__LINE__|__DATE__|__TIME__|__STDC__|__STDC_VERSION__|__STDC_HOSTED__|__cplusplus|__OBJC__|__ASSEMBLER__|__BASE_FILE__|__FILE_NAME__|__INCLUDE_LEVEL__|__TIMESTAMP__|__clang__|__clang_major__|__clang_minor__|__clang_patchlevel__|__clang_version__|__clang_literal_encoding__|__clang_wide_literal_encoding__|__FUNCTION__|__func__|__PRETTY_FUNCTION__|__VA_ARGS__|__VA_OPT__)$")) + +;; #8AD5FF #000000 0 0 0 2 (preproc_def (preproc_arg) @variable) -;; #FF8F40 #000000 0 0 0 1 +;; #8AD5FF #000000 0 0 0 2 +(statement_identifier) @label + +;; #8AD5FF #000000 0 0 0 2 +(declaration + type: (type_identifier) @_type + declarator: (identifier) @label + (#match? @_type "^__label__$")) + +;; #7CD5CF #000000 0 0 0 2 +((identifier) @variable.member + (#match? @variable.member "^m_.*$")) + +; ============================================================ +; Keywords +; ============================================================ + +;; #9AD4FF #000000 0 0 0 2 [ "default" "goto" @@ -13,6 +56,7 @@ "__asm__" ] @keyword +;; #9AD4FF #000000 0 0 0 2 [ "enum" "struct" @@ -20,19 +64,21 @@ "typedef" ] @keyword.type +;; #F29CC3 #000000 0 0 0 2 [ "sizeof" "offsetof" ] @keyword.operator +;; #F29CC3 #000000 0 0 0 2 (alignof_expression . _ @keyword.operator) -;; #FF8F40 #000000 0 0 0 1 +;; #FFB870 #000000 0 0 0 2 "return" @keyword.return -;; #FF8F40 #000000 0 0 0 1 +;; #9AD4FF #000000 0 0 0 2 [ "while" "for" @@ -41,7 +87,7 @@ "break" ] @keyword.repeat -;; #FF8F40 #000000 0 0 0 1 +;; #FFB870 #000000 0 0 0 2 [ "if" "else" @@ -49,7 +95,14 @@ "switch" ] @keyword.conditional -;; #FF8F40 #000000 0 0 0 1 +;; #9AD4FF #000000 0 0 0 2 +(conditional_expression + [ + "?" + ":" + ] @keyword.conditional.ternary) + +;; #8AD5FF #000000 0 0 0 2 [ "#if" "#ifdef" @@ -62,33 +115,285 @@ (preproc_directive) ] @keyword.directive -;; #FF8F40 #000000 0 0 0 1 +;; #8AD5FF #000000 0 0 0 2 "#define" @keyword.directive.define -;; #FF8F40 #000000 0 0 0 1 +;; #8AD5FF #000000 0 0 0 2 "#include" @keyword.import -;; #BFBDB6 #000000 0 0 0 1 +;; #9AD4FF #000000 0 0 0 2 [ - ";" - ":" - "," - "." - "::" -] @punctuation.delimiter + "try" + "catch" + "noexcept" + "throw" +] @keyword.exception -;; #BFBDB6 #000000 0 0 0 2 -"..." @punctuation.special - -;; #BFBDB6 #000000 0 0 0 1 +;; #9AD4FF #000000 0 0 0 2 [ - "(" - ")" - "[" - "]" - "{" - "}" -] @punctuation.bracket + "decltype" + "explicit" + "friend" + "override" + "using" + "requires" + "constexpr" +] @keyword + +;; #9AD4FF #000000 0 0 0 2 +[ + "class" + "namespace" + "template" + "typename" + "concept" +] @keyword.type + +;; #9AD4FF #000000 0 0 0 2 +[ + "co_await" + "co_yield" + "co_return" +] @keyword.coroutine + +;; #F29CC3 #000000 0 0 0 2 +[ + "public" + "private" + "protected" + "final" + "virtual" +] @keyword.modifier + +;; #F29CC3 #000000 0 0 0 2 +(storage_class_specifier) @keyword.modifier + +;; #F29CC3 #000000 0 0 0 2 +[ + (type_qualifier) + (gnu_asm_qualifier) + "__extension__" +] @keyword.modifier + +;; #F29CC3 #000000 0 0 0 2 +(linkage_specification + "extern" @keyword.modifier) + +;; #F29668 #000000 0 0 0 2 +[ + "new" + "delete" + "xor" + "bitand" + "bitor" + "compl" + "not" + "xor_eq" + "and_eq" + "or_eq" + "not_eq" + "and" + "or" +] @keyword.operator + +;; #F29668 #000000 0 1 0 2 +"<=>" @operator + +; ============================================================ +; Types & modules +; ============================================================ + +;; #C4B5FF #000000 0 0 0 2 +[ + (type_identifier) + (type_descriptor) +] @type + +;; #C4B5FF #000000 0 0 0 2 +(type_definition + declarator: (type_identifier) @type.definition) + +;; #C4B5FF #000000 0 0 0 2 +(primitive_type) @type.builtin + +;; #C4B5FF #000000 0 0 0 2 +(sized_type_specifier + _ @type.builtin + type: _?) + +;; #C4B5FF #000000 0 0 0 2 +(type_definition declarator: (type_identifier) @name) @definition.type + +;; #C4B5FF #000000 0 0 0 2 +(enum_specifier name: (type_identifier) @name) @definition.type + +;; #C4B5FF #000000 0 0 0 2 +(class_specifier name: (type_identifier) @name) @definition.class + +;; #C4B5FF #000000 0 0 0 2 +(struct_specifier name: (type_identifier) @name body:(_)) @definition.class + +;; #C4B5FF #000000 0 0 0 2 +(declaration type: (union_specifier name: (type_identifier) @name)) @definition.class + +;; #9AD4FF #000000 0 0 0 2 +(namespace_identifier) @module + +;; #9AD4FF #000000 0 0 0 2 +((namespace_identifier) @type + (#match? @type "^[A-Z]")) + +;; #9AD4FF #000000 0 0 0 2 +(using_declaration + . + "using" + . + "namespace" + . + [ + (qualified_identifier) + (identifier) + ] @module) + +; ============================================================ +; Functions & calls +; ============================================================ + +;; #FFB870 #000000 0 0 0 1 +(operator_name) @function + +;; #FFB870 #000000 0 0 0 3 +"operator" @function + +;; #78C2FF #000000 0 0 0 2 +(call_expression + function: (identifier) @function.call) + +;; #F29CC3 #000000 0 0 0 2 +((call_expression + function: (identifier) @function.builtin) + (#match? @function.builtin "^__builtin_")) + +;; #F29CC3 #000000 0 0 0 2 +((call_expression + function: (identifier) @function.builtin)) + +; ============================================================ +; Constructors & methods +; ============================================================ + +;; #59C2FF #000000 0 0 0 2 +((call_expression + function: (identifier) @constructor) + (#match? @constructor "^[A-Z]")) + +;; #59C2FF #000000 0 0 0 2 +((call_expression + function: (qualified_identifier + name: (identifier) @constructor)) + (#match? @constructor "^[A-Z]")) + +;; #59C2FF #000000 0 0 0 2 +((call_expression + function: (field_expression + field: (field_identifier) @constructor)) + (#match? @constructor "^[A-Z]")) + +;; #59C2FF #000000 0 0 0 2 +((field_initializer + (field_identifier) @constructor + (argument_list)) + (#match? @constructor "^[A-Z]")) + +;; #59C2FF #000000 0 0 0 4 +(destructor_name + (identifier) @function.method) + +; ============================================================ +; Properties & members +; ============================================================ + +;; #F29CC3 #000000 0 0 0 2 +((field_expression + (field_identifier) @property) @_parent) + +(field_designator) @property + +((field_identifier) @property) + +(field_initializer + (field_identifier) @property) + +;; #F29CC3 #000000 0 0 1 2 +(field_declaration + (field_identifier) @variable.member) + +; ============================================================ +; Parameters +; ============================================================ + +;; #7CD5CF #000000 0 0 0 2 +(parameter_declaration + declarator: (identifier) @variable.parameter) + +;; #7CD5CF #000000 0 0 0 2 +(parameter_declaration + declarator: (array_declarator) @variable.parameter) + +;; #7CD5CF #000000 0 0 0 2 +(parameter_declaration + declarator: (pointer_declarator) @variable.parameter) + +;; #7CD5CF #000000 0 0 0 2 +(preproc_params + (identifier) @variable.parameter) + +;; #7CD5CF #000000 0 0 0 2 +(parameter_declaration + declarator: (reference_declarator) @variable.parameter) + +;; #7CD5CF #000000 0 0 0 2 +(variadic_parameter_declaration + declarator: (variadic_declarator + (_) @variable.parameter)) + +;; #7CD5CF #000000 0 0 0 2 +(optional_parameter_declaration + declarator: (_) @variable.parameter) + +; ============================================================ +; Attributes & specifiers +; ============================================================ + +;; #7CD5CF #000000 0 0 0 2 +[ + "__attribute__" + "__declspec" + "__based" + "__cdecl" + "__clrcall" + "__stdcall" + "__fastcall" + "__thiscall" + "__vectorcall" + (ms_pointer_modifier) + (attribute_declaration) +] @attribute + +;; #7CD5CF #000000 0 0 0 2 +(attribute_specifier + (argument_list + (identifier) @variable.builtin)) + +;; #7CD5CF #000000 0 0 0 2 +(attribute_specifier + (argument_list + (call_expression + function: (identifier) @variable.builtin))) + +; ============================================================ +; Operators & punctuation +; ============================================================ ;; #F29668 #000000 0 1 0 1 [ @@ -128,486 +433,147 @@ "++" ] @operator -;; #F29668 #000000 0 0 0 1 +;; #F29668 #000000 0 1 0 1 (comma_expression "," @operator) -;; #D2A6FF #000000 0 0 0 1 +;; #B6BEC8 #000000 0 0 0 1 [ - (true) - (false) -] @boolean - -;; #F29668 #000000 0 0 0 1 -(conditional_expression - [ - "?" - ":" - ] @keyword.conditional.ternary) - -;; #aad84c #000000 0 0 0 1 -(string_literal) @string - -(system_lib_string) @string - -;; #95E6CB #000000 0 0 0 2 -(escape_sequence) @string.escape - -;; #D2A6FF #000000 0 0 0 1 -(null) @constant.builtin - -;; #D2A6FF #000000 0 0 0 1 -(number_literal) @number - -;; #39BAE6 #000000 0 0 0 1 -(char_literal) @character - -;; #FFB454 #000000 0 0 0 1 -(preproc_defined) @function.macro - -;; #F07178 #000000 0 0 0 1 -((field_expression - (field_identifier) @property) @_parent) - -(field_designator) @property - -((field_identifier) @property) - -;; #39BAE6 #000000 0 0 0 1 -(statement_identifier) @label - -(declaration - type: (type_identifier) @_type - declarator: (identifier) @label - (#match? @_type "^__label__$")) - -;; #59C2FF #000000 0 0 0 1 -[ - (type_identifier) - (type_descriptor) -] @type - -;; #FF8F40 #000000 0 0 0 1 -(storage_class_specifier) @keyword.modifier - -[ - (type_qualifier) - (gnu_asm_qualifier) - "__extension__" -] @keyword.modifier - -;; #FF8F40 #000000 0 0 0 1 -(linkage_specification - "extern" @keyword.modifier) - -;; #59C2FF #000000 0 0 0 1 -(type_definition - declarator: (type_identifier) @type.definition) - -;; #59C2FF #000000 0 0 0 1 -(primitive_type) @type.builtin - -(sized_type_specifier - _ @type.builtin - type: _?) - -;; #D2A6FF #000000 0 0 0 1 -((identifier) @constant - (#match? @constant "^[A-Z][A-Z0-9_]+$")) - -(preproc_def - (preproc_arg) @constant - (#match? @constant "^[A-Z][A-Z0-9_]+$")) - -(enumerator - name: (identifier) @constant) - -(case_statement - value: (identifier) @constant) - -;; #D2A6FF #000000 0 0 0 1 -((identifier) @constant.builtin - (#match? @constant.builtin "^(stderr|stdin|stdout|__FILE__|__LINE__|__DATE__|__TIME__|__STDC__|__STDC_VERSION__|__STDC_HOSTED__|__cplusplus|__OBJC__|__ASSEMBLER__|__BASE_FILE__|__FILE_NAME__|__INCLUDE_LEVEL__|__TIMESTAMP__|__clang__|__clang_major__|__clang_minor__|__clang_patchlevel__|__clang_version__|__clang_literal_encoding__|__clang_wide_literal_encoding__|__FUNCTION__|__func__|__PRETTY_FUNCTION__|__VA_ARGS__|__VA_OPT__)$")) - -(preproc_def - (preproc_arg) @constant.builtin - (#match? @constant.builtin "^(stderr|stdin|stdout|__FILE__|__LINE__|__DATE__|__TIME__|__STDC__|__STDC_VERSION__|__STDC_HOSTED__|__cplusplus|__OBJC__|__ASSEMBLER__|__BASE_FILE__|__FILE_NAME__|__INCLUDE_LEVEL__|__TIMESTAMP__|__clang__|__clang_major__|__clang_minor__|__clang_patchlevel__|__clang_version__|__clang_literal_encoding__|__clang_wide_literal_encoding__|__FUNCTION__|__func__|__PRETTY_FUNCTION__|__VA_ARGS__|__VA_OPT__)$")) - -;; #D2A6FF #000000 0 0 0 1 -(attribute_specifier - (argument_list - (identifier) @variable.builtin)) - -(attribute_specifier - (argument_list - (call_expression - function: (identifier) @variable.builtin))) - -;; #FFB454 #000000 0 0 0 1 -((call_expression - function: (identifier) @function.builtin) - (#match? @function.builtin "^__builtin_")) - -((call_expression - function: (identifier) @function.builtin)) - -;; #D2A6FF #000000 0 0 0 1 -(preproc_def - name: (_) @constant.macro) - -(preproc_call - directive: (preproc_directive) @_u - argument: (_) @constant.macro - (#match? @_u "^#undef$")) - -(preproc_ifdef - name: (identifier) @constant.macro) - -(preproc_elifdef - name: (identifier) @constant.macro) - -(preproc_defined - (identifier) @constant.macro) - -;; #FFB454 #000000 0 0 0 3 -(call_expression - function: (identifier) @function.call) - -(call_expression - function: (field_expression - field: (field_identifier) @function.call)) - -;; #FFB454 #000000 0 0 0 3 -(function_declarator - declarator: (identifier) @function) - -(function_declarator - declarator: (parenthesized_declarator - (pointer_declarator - declarator: (field_identifier) @function))) - -;; #FFB454 #000000 0 0 0 3 -(preproc_function_def - name: (identifier) @function.macro) - -;; #99ADBF #000000 0 1 0 1 -(comment) @comment @spell - -;; #99ADBF #000000 0 1 0 1 -((comment) @comment.documentation - (#match? @comment.documentation "^/[*][*][^*].*[*]/$")) - -;; #D2A6FF #000000 0 0 0 1 -(parameter_declaration - declarator: (identifier) @variable.parameter) - -(parameter_declaration - declarator: (array_declarator) @variable.parameter) - -(parameter_declaration - declarator: (pointer_declarator) @variable.parameter) - -(preproc_params - (identifier) @variable.parameter) - -;; #FF8F40 #000000 0 0 0 1 -[ - "__attribute__" - "__declspec" - "__based" - "__cdecl" - "__clrcall" - "__stdcall" - "__fastcall" - "__thiscall" - "__vectorcall" - (ms_pointer_modifier) - (attribute_declaration) -] @attribute - -;; #F07178 #000000 0 0 0 1 -((identifier) @variable.member - (#match? @variable.member "^m_.*$")) - -(parameter_declaration - declarator: (reference_declarator) @variable.parameter) - -(variadic_parameter_declaration - declarator: (variadic_declarator - (_) @variable.parameter)) - -(optional_parameter_declaration - declarator: (_) @variable.parameter) - -;; #F07178 #000000 0 0 0 1 -((field_expression - (field_identifier) @function.method) @_parent) - -(field_declaration - (field_identifier) @variable.member) - -(field_initializer - (field_identifier) @property) - -(function_declarator - declarator: (field_identifier) @function.method) - -;; #59C2FF #000000 0 0 0 3 -(concept_definition - name: (identifier) @type.definition) - -(alias_declaration - name: (type_identifier) @type.definition) - -;; #59C2FF #000000 0 0 0 1 -(auto) @type.builtin - -;; #59C2FF #000000 0 0 0 1 -(namespace_identifier) @module - -;; #59C2FF #000000 0 0 0 1 -((namespace_identifier) @type - (#match? @type "^[A-Z]")) - -;; #D2A6FF #000000 0 0 0 1 -(case_statement - value: (qualified_identifier - (identifier) @constant)) - -;; #FF8F40 #000000 0 0 0 1 -(using_declaration - . - "using" - . - "namespace" - . - [ - (qualified_identifier) - (identifier) - ] @module) - -;; #FFB454 #000000 0 0 0 3 -(destructor_name - (identifier) @function.method) - -;; #FFB454 #000000 0 0 0 3 -(function_declarator - (qualified_identifier - (identifier) @function)) - -(function_declarator - (qualified_identifier - (qualified_identifier - (identifier) @function))) - -(function_declarator - (qualified_identifier - (qualified_identifier - (qualified_identifier - (identifier) @function)))) - -((qualified_identifier - (qualified_identifier - (qualified_identifier - (qualified_identifier - (identifier) @function)))) @_parent) - -(function_declarator - (template_function - (identifier) @function)) - -(operator_name) @function - -"operator" @function - -;; #FFB454 #000000 0 0 0 3 -"static_assert" @function.builtin - -;; #FFB454 #000000 0 0 0 3 -(call_expression - (qualified_identifier - (identifier) @function.call)) - -(call_expression - (qualified_identifier - (qualified_identifier - (identifier) @function.call))) - -(call_expression - (qualified_identifier - (qualified_identifier - (qualified_identifier - (identifier) @function.call)))) - -((qualified_identifier - (qualified_identifier - (qualified_identifier - (qualified_identifier - (identifier) @function.call)))) @_parent) - -(call_expression - (template_function - (identifier) @function.call)) - -(call_expression - (qualified_identifier - (template_function - (identifier) @function.call))) - -(call_expression - (qualified_identifier - (qualified_identifier - (template_function - (identifier) @function.call)))) - -(call_expression - (qualified_identifier - (qualified_identifier - (qualified_identifier - (template_function - (identifier) @function.call))))) - -((qualified_identifier - (qualified_identifier - (qualified_identifier - (qualified_identifier - (template_function - (identifier) @function.call))))) @_parent) - -(function_declarator - (template_method - (field_identifier) @function.method)) - -;; #FFB454 #000000 0 0 0 3 -(call_expression - (field_expression - (field_identifier) @function.method.call)) - -(call_expression - (field_expression - (template_method - (field_identifier) @function.method.call))) - -;; #FFB454 #000000 0 0 0 3 -((function_declarator - (qualified_identifier - (identifier) @constructor)) - (#match? @constructor "^[A-Z]")) - -((call_expression - function: (identifier) @constructor) - (#match? @constructor "^[A-Z]")) - -((call_expression - function: (qualified_identifier - name: (identifier) @constructor)) - (#match? @constructor "^[A-Z]")) - -((call_expression - function: (field_expression - field: (field_identifier) @constructor)) - (#match? @constructor "^[A-Z]")) - -((field_initializer - (field_identifier) @constructor - (argument_list)) - (#match? @constructor "^[A-Z]")) - -;; #F07178 #000000 0 0 0 1 -(this) @variable.builtin - -;; #D2A6FF #000000 0 0 0 1 -(null - "nullptr" @constant.builtin) - -;; #D2A6FF #000000 0 0 0 2 -(true) @boolean_true - -;; #D2A6FF #000000 0 0 0 2 -(false) @boolean_false - -;; #aad84c #000000 0 0 0 1 -(raw_string_literal) @string - -;; #FF8F40 #000000 0 0 0 1 -[ - "try" - "catch" - "noexcept" - "throw" -] @keyword.exception - -;; #FF8F40 #000000 0 0 0 1 -[ - "decltype" - "explicit" - "friend" - "override" - "using" - "requires" - "constexpr" -] @keyword - -;; #FF8F40 #000000 0 0 0 1 -[ - "class" - "namespace" - "template" - "typename" - "concept" -] @keyword.type - -;; #FF8F40 #000000 0 0 0 1 -[ - "co_await" - "co_yield" - "co_return" -] @keyword.coroutine - -;; #FF8F40 #000000 0 0 0 1 -[ - "public" - "private" - "protected" - "final" - "virtual" -] @keyword.modifier - -;; #FF8F40 #000000 0 0 0 1 -[ - "new" - "delete" - "xor" - "bitand" - "bitor" - "compl" - "not" - "xor_eq" - "and_eq" - "or_eq" - "not_eq" - "and" - "or" -] @keyword.operator - -;; #F29668 #000000 0 0 0 1 -"<=>" @operator - -;; #BFBDB6 #000000 0 0 0 1 + ";" + ":" + "," + "." + "::" +] @punctuation.delimiter + +;; #B6BEC8 #000000 0 0 0 1 "::" @punctuation.delimiter -;; #BFBDB6 #000000 0 0 0 1 +;; #B6BEC8 #000000 0 0 0 1 +"..." @punctuation.special + +;; #B6BEC8 #000000 0 0 0 1 +[ + "(" + ")" + "[" + "]" + "{" + "}" +] @punctuation.bracket + +;; #B6BEC8 #000000 0 0 0 1 (template_argument_list [ "<" ">" ] @punctuation.bracket) +;; #B6BEC8 #000000 0 0 0 1 (template_parameter_list [ "<" ">" ] @punctuation.bracket) -;; #FF8F40 #000000 0 0 0 1 -(literal_suffix) @operator +; ============================================================ +; Literals +; ============================================================ + +;; #C2E8FF #000000 0 0 0 2 +[ + (true) + (false) +] @boolean + +;; #C2E8FF #000000 0 0 0 2 +(true) @boolean_true + +;; #C2E8FF #000000 0 0 0 2 +(false) @boolean_false + +;; #A6E3A1 #000000 0 0 0 2 +(string_literal) @string + +;; #A6E3A1 #000000 0 0 0 2 +(system_lib_string) @string + +;; #A6E3A1 #000000 0 0 0 2 +(raw_string_literal) @string + +;; #A6E3A1 #000000 0 0 0 2 +(escape_sequence) @string.escape + +;; #B8E986 #000000 0 0 0 2 +(number_literal) @number + +;; #B8E986 #000000 0 0 0 2 +(char_literal) @character + +;; #F29CC3 #000000 0 0 0 2 +(null) @constant.builtin + +;; #F29CC3 #000000 0 0 0 2 +(null + "nullptr" @constant.builtin) + +; ============================================================ +; Macros & directives +; ============================================================ + +;; #F29CC3 #000000 0 0 0 2 +(preproc_def + name: (_) @constant.macro) + +;; #F29CC3 #000000 0 0 0 2 +(preproc_call + directive: (preproc_directive) @_u + argument: (_) @constant.macro + (#match? @_u "^#undef$")) + +;; #F29CC3 #000000 0 0 0 2 +(preproc_ifdef + name: (identifier) @constant.macro) + +;; #F29CC3 #000000 0 0 0 2 +(preproc_elifdef + name: (identifier) @constant.macro) + +;; #F29CC3 #000000 0 0 0 2 +(preproc_defined + (identifier) @constant.macro) + +;; #F29CC3 #000000 0 0 0 2 +(preproc_defined) @function.macro + +; ============================================================ +; Builtins & special identifiers +; ============================================================ + +;; #F28FAD #000000 0 0 0 2 +(attribute_specifier + (argument_list + (identifier) @variable.builtin)) + +;; #F28FAD #000000 0 0 0 2 +(attribute_specifier + (argument_list + (call_expression + function: (identifier) @variable.builtin))) + +;; #F28FAD #000000 0 0 0 2 +(this) @variable.builtin + +; ============================================================ +; Exceptions & control helpers +; ============================================================ + +;; #FFB870 #000000 0 0 0 2 +"static_assert" @function.builtin + +; ============================================================ +; Comments +; ============================================================ + +;; #99ADBF #000000 0 1 0 1 +(comment) @comment @spell diff --git a/grammar/haskell.scm b/grammar/haskell.scm new file mode 100644 index 0000000..521f451 --- /dev/null +++ b/grammar/haskell.scm @@ -0,0 +1,207 @@ +;; #FFFFFF #000000 0 0 0 1 +(variable) @variable + +;; Lambdas / patterns keep params white +;; #FFFFFF #000000 0 1 0 5 +(expression/lambda + (_)+ @variable.parameter + "->") +;; #FFFFFF #000000 0 0 0 1 +(decl/function + patterns: (patterns + (_) @variable.parameter)) +;; #FFFFFF #000000 0 0 0 1 +(decl/function + (infix + (pattern) @variable.parameter)) + +;; Types / builtins +;; #F07178 #000000 0 0 0 6 +((name) @type.builtin + (#match? @type.builtin "^(Int|Integer|Bool|Char|String|Float|Double|Word)$")) + +;; Strings / chars +;; #9ADE7A #000000 0 0 0 1 +(char) @literal.char +;; #9ADE7A #000000 0 0 0 1 +(string) @literal.string + +;; Comments +;; #99ADBF #000000 0 1 0 5 +(comment) @comment.general +;; #99ADBF #000000 0 1 0 5 +(haddock) @comment.documentation +;; #99ADBF #000000 0 1 0 1 +(comment) @spell + +;; Punctuation +;; #BFBDB6 #000000 0 0 0 1 +[ + "(" ")" "{" "}" "[" "]" +] @punctuation.bracket +;; #BFBDB6 #000000 0 0 0 1 +[ "," ";" ] @punctuation.delimiter + +;; Keywords (orange) +;; #FF8F40 #000000 0 0 0 1 +[ "forall" ] @keyword.quantifier +;; #FF8F40 #000000 0 0 0 1 +(pragma) @keyword.directive +;; #FF8F40 #000000 0 0 0 1 +[ + "if" "then" "else" "case" "of" +] @keyword.conditional +;; #FF8F40 #000000 0 0 0 1 +[ "import" "qualified" "module" ] @keyword.import +;; #FF8F40 #000000 0 0 0 1 +[ + "where" "let" "in" "class" "instance" "pattern" "data" + "newtype" "family" "type" "as" "hiding" "deriving" "via" + "stock" "anyclass" "do" "mdo" "rec" "infix" "infixl" "infixr" +] @keyword.definition +;; #FF8F40 #000000 0 0 0 1 +[ "forall" ] @keyword.repeat + +;; Operators (italic white, high priority) +;; #FFFFFF #000000 0 1 0 6 +[ + (operator) + (constructor_operator) + (all_names) + "." ".." "=" "|" "::" "=>" "->" "<-" "\\" "`" "@" +] @operator.general +;; #FFFFFF #000000 0 1 0 6 +(infix_id + [ + (variable) @operator.infix + (qualified (variable) @operator.infix) + ]) +;; #FFFFFF #000000 0 1 0 6 +[ + (operator) + (constructor_operator) + (all_names) + (wildcard) + "." ".." "=" "|" "::" "=>" "->" "<-" "\\" "`" "@" +] @operator + +;; Modules +;; #7dcfff #000000 0 0 0 1 +(module + (module_id) @module.name) +;; #7dcfff #000000 0 0 0 1 +(module + (module_id) @module) + +;; Functions / calls (leave blue for function identifiers, but vars stay white due to higher priority var rules) +;; #82AAFF #000000 0 0 0 3 +(decl/signature + [ + name: (variable) @function.name + names: (binding_list (variable) @function.name) + ]) +;; #82AAFF #000000 0 0 0 3 +(decl/function + [ + name: (variable) @function.name + names: (binding_list (variable) @function.name) + ]) +;; #82AAFF #000000 0 0 0 3 +(decl/bind + [ + name: (variable) @function.name + names: (binding_list (variable) @function.name) + ]) +;; #82AAFF #000000 0 0 0 2 +(decl + [ + name: (variable) @function + names: (binding_list (variable) @function) + ]) +;; #82AAFF #000000 0 0 0 3 +(decl/signature + name: (variable) @function.io + type: (type/apply + constructor: (name) @_io) + (#match? @_io "^IO$")) + +;; Function calls kept white via var priority; ensure explicit call rule stays neutral/white +;; #FFFFFF #000000 0 0 0 3 +(apply + [ + (expression/variable) @function.call + (expression/qualified (variable) @function.call) + ]) + +;; Types / constructors +;; #82AAFF #000000 0 0 0 3 +(name) @type +;; #82AAFF #000000 0 0 0 3 +(type/star) @type +;; #C6B5FF #000000 0 0 0 1 +(constructor) @constructor.general +;; #9ADE7A #000000 0 0 0 2 +((constructor) @boolean + (#match? @boolean "^(True|False)$")) +;; #9ADE7A #000000 0 0 0 1 +((variable) @boolean + (#match? @boolean "^otherwise$")) + +;; Quoters / quasiquotes +;; #82AAFF #000000 0 0 0 3 +(quoter) @function.call +;; #9ADE7A #000000 0 0 0 1 +(quasiquote + [ + (quoter) @_name + (_ + (variable) @_name) + ] + (#match? @_name "^qq$") + (quasiquote_body) @string) +;; #9ADE7A #000000 0 0 0 1 +(quasiquote + (_ + (variable) @_name) + (#match? @_name "^qq$") + (quasiquote_body) @string) +;; #82AAFF #000000 0 0 0 3 +(quasiquote + (_ + (module) @module + . + (variable) @function.call)) + +;; Exceptions / Debug +;; #F07178 #000000 0 0 0 1 +((variable) @keyword.exception + (#match? @keyword.exception "^(error|undefined|try|tryJust|tryAny|catch|catches|catchJust|handle|handleJust|throw|throwIO|throwTo|throwError|ioError|mask|mask_|uninterruptibleMask|uninterruptibleMask_|bracket|bracket_|bracketOnErrorSource|finally|fail|onException|expectationFailure)$")) +;; #F07178 #000000 0 0 0 1 +((variable) @keyword.debug + (#match? @keyword.debug "^(trace|traceId|traceShow|traceShowId|traceWith|traceShowWith|traceStack|traceIO|traceM|traceShowM|traceEvent|traceEventWith|traceEventIO|flushEventLog|traceMarker|traceMarkerIO)$")) + +;; Misc remaining structural +;; #C6B5FF #000000 0 0 0 1 +(wildcard) @literal.special +;; #BFBDB6 #000000 0 0 0 1 +[ "," ";" ] @punctuation.delimiter +;; #BFBDB6 #000000 0 0 0 1 +[ + "(" ")" "{" "}" "[" "]" +] @punctuation.bracket +;; #7dcfff #000000 0 0 0 1 +(type/unit) @type.unit +(type/list) @type.list +(type/star) @type.star +;; #FFFFFF #000000 0 0 0 1 +(field_name (variable) @variable.member) +(import_name (name) . (children (variable) @variable.member)) + +;; Numbers (bright yellow-green) +;; #DFFFA0 #000000 0 0 0 2 +(integer) @number.integer +;; #DFFFA0 #000000 0 0 0 2 +(negation) @number.integer +;; #DFFFA0 #000000 0 0 0 2 +(expression/literal + (float) @number.float) diff --git a/grammar/html.scm b/grammar/html.scm new file mode 100644 index 0000000..e0bea5f --- /dev/null +++ b/grammar/html.scm @@ -0,0 +1,146 @@ +;; #99ADBF #000000 0 1 0 5 +(comment) @comment @spell + +;; #9ADE7A #000000 0 0 0 1 +(attribute_name) @tag.attribute + +;; #FF8F40 #000000 0 0 0 0 +((attribute + (quoted_attribute_value) @string)) + +(attribute_value) @string + +[ + "'" + "\"" +] @string + +;; #82AAFF #000000 1 0 0 3 +((element + (start_tag + (tag_name) @_tag) + (text) @markup.heading) + (#match? @_tag "^title$")) + +;; #82AAFF #000000 1 0 1 3 +((element + (start_tag + (tag_name) @_tag) + (text) @markup.heading.1) + (#match? @_tag "^h[1-6]$")) + +;; #FFD700 #000000 1 0 0 2 +((element + (start_tag + (tag_name) @_tag) + (text) @markup.strong) + (#match? @_tag "^(strong|b)$")) + +;; #FF8F40 #000000 0 1 0 2 +((element + (start_tag + (tag_name) @_tag) + (text) @markup.italic) + (#match? @_tag "^(em|i)$")) + +;; #FF6347 #000000 0 0 1 2 +((element + (start_tag + (tag_name) @_tag) + (text) @markup.strikethrough) + (#match? @_tag "^(s|del)$")) + +;; #82AAFF #000000 0 0 1 2 +((element + (start_tag + (tag_name) @_tag) + (text) @markup.underline) + (#match? @_tag "^u$")) + +;; #9ADE7A #000000 0 0 0 2 +((element + (start_tag + (tag_name) @_tag) + (text) @markup.raw) + (#match? @_tag "^(code|kbd)$")) + +;; #7dcfff #000000 0 0 1 2 +((element + (start_tag + (tag_name) @_tag) + (text) @markup.link.label) + (#match? @_tag "^a$")) + +((attribute + (attribute_name) @_attr + (quoted_attribute_value +;; #7dcfff #000000 0 0 1 5 + (attribute_value) @string.special.url)) + (#match? @_attr "^(href|src)$")) + +;; Punctuation +;; #BFBDB6 #000000 0 0 0 1 +[ + "<" + ">" + "" +] @tag.delimiter + +;; #FFFFFF #000000 0 1 0 1 +"=" @operator + +;; #7dcfff #000000 0 0 0 1 +(tag_name) @tag + +;; #FF8F40 #000000 0 0 0 1 +(erroneous_end_tag_name) @tag.error + +;; #FFD700 #000000 0 0 0 1 +(doctype) @constant + +;; #9ADE7A #000000 0 0 0 1 +(attribute_name) @attribute + +; Injections + +((style_element + (start_tag) @_start_tag + ;; !css + (raw_text) @injection.css)) + +((attribute + (attribute_name) @_attr + (quoted_attribute_value + (attribute_value) @injection.css)) + (#match? @_attr "^style$")) + +((script_element + (start_tag) @_start + ;; !javascript + (raw_text) @injection.javascript) + (#match? @_start "^]*\\btype\\s*=\\s*\\\"(?!module|text/javascript)[^\\\"]*\\\")[^>]*>$")) + +((attribute + (attribute_name) @_name + (quoted_attribute_value + (attribute_value) @injection.javascript)) + (#match? @_name "^on[a-z]+$")) + +((attribute + (quoted_attribute_value + (attribute_value) @injection.javascript)) + (#match? @injection.javascript "\\$\\{")) + +((script_element + (start_tag) @_start + ;; !json + (raw_text) @injection.json) + (#match? @_start "^]*\\btype\\s*=\\s*\\\"(?!importmap)[^\\\"]*\\\")[^>]*>$")) + +((attribute + (attribute_name) @_name + (quoted_attribute_value + ;; !regex + (attribute_value) @injection.regex)) + (#match? @_name "^pattern$")) diff --git a/grammar/ini.scm b/grammar/ini.scm new file mode 100644 index 0000000..66c709e --- /dev/null +++ b/grammar/ini.scm @@ -0,0 +1,34 @@ +;; #7dcfff #000000 0 0 0 2 +(section_name + (text) @type) + +;; #99ADBF #000000 0 1 0 1 +(comment) @comment @spell + +;; #888888 #000000 0 0 0 3 +[ + "[" + "]" +] @punctuation.bracket + +;; #F29668 #000000 0 1 0 1 +"=" @operator + +;; #F0F8FF #000000 0 0 0 2 +(setting + (setting_name) @property) + +;; #F29668 #000000 0 0 0 2 +((setting_value) @boolean + (#match? @boolean "^\\s*(true|false|True|False|yes|no|Yes|No|on|off|On|Off|)\\s*$")) + +;; #FF8F40 #000000 0 0 0 2 +((setting_value) @number + (#match? @number "^\\s*[-+0-9]+\\s*$")) + +;; #A6E3A1 #000000 0 0 0 2 +((setting_value) @float + (#match? @float "^\\s*[-+0-9\\.]+\\s*$")) + +;; #AAD94C #000000 0 0 0 1 +(setting_value) @string diff --git a/grammar/javascript.scm b/grammar/javascript.scm new file mode 100644 index 0000000..1d81abf --- /dev/null +++ b/grammar/javascript.scm @@ -0,0 +1,318 @@ +; ============================================================ +; Identifiers +; ============================================================ + +;; #FFFFFF #000000 0 0 0 1 +(identifier) @variable + +;; #D2A6FF #000000 0 0 0 2 +((identifier) @constant + (#match? @constant "^[A-Z_][A-Z0-9_]*$")) + +;; #F07178 #000000 0 0 0 3 +((identifier) @variable.builtin + (#match? @variable.builtin + "^(arguments|console|window|document|globalThis|process|module|exports)$")) + +;; #59C2FF #000000 0 0 0 3 +((identifier) @constructor + (#match? @constructor "^[A-Z][a-zA-Z0-9]*$")) + +; ============================================================ +; Properties +; ============================================================ + +;; #F07178 #000000 0 0 0 1 +(property_identifier) @property + +; ============================================================ +; Functions +; ============================================================ + +;; #FFB454 #000000 0 0 0 3 +(function_declaration + name: (identifier) @function) + +(function_expression + name: (identifier) @function) + +;; #FFB454 #000000 0 0 0 2 +(method_definition + name: (property_identifier) @function.method) + +(variable_declarator + name: (identifier) @function + value: [(function_expression) (arrow_function)]) + +(assignment_expression + left: (identifier) @function + right: [(function_expression) (arrow_function)]) + +(pair + key: (property_identifier) @function.method + value: [(function_expression) (arrow_function)]) + +; ------------------------------------------------------------ +; Function calls +; ------------------------------------------------------------ + +;; #FFB454 #000000 0 0 0 2 +(call_expression + function: (identifier) @function.call) + +;; #FFB454 #000000 0 0 0 2 +(call_expression + function: (member_expression + property: (property_identifier) @function.method)) + +; ============================================================ +; Highlighted definitions & references +; ============================================================ + +;; #FFB454 #000000 0 0 0 3 +(assignment_expression + left: [ + (identifier) @name + (member_expression + property: (property_identifier) @name) + ] + right: [(arrow_function) (function_expression)] +) @definition.function + +;; #FFB454 #000000 0 0 0 3 +(pair + key: (property_identifier) @name + value: [(arrow_function) (function_expression)]) @definition.function + +;; #59C2FF #000000 0 0 0 2 +( + (call_expression + function: (identifier) @name) @reference.call + (#not-match? @name "^(require)$") +) + +;; #7dcfff #000000 0 0 0 2 +(new_expression + constructor: (_) @name) @reference.class + +;; #D2A6FF #000000 0 0 0 2 +(export_statement value: (assignment_expression left: (identifier) @name right: ([ + (number) + (string) + (identifier) + (undefined) + (null) + (new_expression) + (binary_expression) + (call_expression) +]))) @definition.constant + +; ============================================================ +; Parameters +; ============================================================ + +;; #D2A6FF #000000 0 0 0 1 +(formal_parameters + [ + (identifier) @variable.parameter + (array_pattern + (identifier) @variable.parameter) + (object_pattern + [ + (pair_pattern value: (identifier) @variable.parameter) + (shorthand_property_identifier_pattern) @variable.parameter + ]) + ]) + +; ============================================================ +; Keywords (split into semantic groups) +; ============================================================ + +;; #FF8F40 #000000 0 0 0 1 +; Declarations +[ + "var" + "let" + "const" + "function" + "class" +] @keyword.declaration + +;; #FF8F40 #000000 0 0 0 1 +; Control flow +[ + "if" + "else" + "switch" + "case" + "default" + "for" + "while" + "do" + "break" + "continue" + "return" + "throw" + "try" + "catch" + "finally" + "extends" +] @keyword.control + +;; #FF8F40 #000000 0 0 0 1 +; Imports / exports +[ + "import" + "export" + "from" + "as" +] @keyword.import + +;; #F29668 #000000 0 0 0 1 +; Operators-as-keywords +[ + "in" + "instanceof" + "new" + "delete" + "typeof" + "void" + "await" + "yield" +] @keyword.operator + +;; #FF8F40 #000000 0 0 0 1 +; Modifiers +[ + "async" + "static" + "get" + "set" +] @keyword.modifier + +; ============================================================ +; Literals +; ============================================================ + +;; #F07178 #000000 0 0 0 1 +(this) @variable.builtin +(super) @variable.builtin + +;; #D2A6FF #000000 0 0 0 4 +[ + (true) + (false) + (null) + (undefined) +] @constant.builtin + +;; #D2A6FF #000000 0 0 0 2 +(number) @number + +;; #D2A6FF #000000 0 1 0 2 +((string) @use_strict + (#match? @use_strict "^['\"]use strict['\"]$")) + +;; #AAD94C #000000 0 0 0 0 +(string) @string + +;; #AAD94C #000000 0 0 0 0 +(template_string) @string.special + +;; #99ADBF #000000 0 1 0 1 +(comment) @comment + +; ============================================================ +; Operators & punctuation +; ============================================================ + +;; #F29668 #000000 0 1 0 1 +[ + "+" + "-" + "*" + "/" + "%" + "**" + "++" + "--" + "==" + "!=" + "===" + "!==" + "<" + "<=" + ">" + ">=" + "&&" + "||" + "??" + "!" + "~" + "&" + "|" + "^" + "<<" + ">>" + ">>>" + "=" + "+=" + "-=" + "*=" + "/=" + "%=" + "<<=" + ">>=" + ">>>=" + "&=" + "|=" + "^=" + "&&=" + "||=" + "??=" + "=>" +] @operator + +;; #BFBDB6 #000000 0 0 0 1 +[ + "." + "," + ";" +] @punctuation.delimiter + +;; #BFBDB6 #000000 0 0 0 1 +[ + "(" + ")" + "[" + "]" + "{" + "}" +] @punctuation.bracket + +;; #7dcfff #000000 0 0 0 2 +(template_substitution + "${" @punctuation.special + "}" @punctuation.special) + +; ============================================================ +; JSX +; ============================================================ + +;; #59C2FF #000000 0 0 0 2 +(jsx_opening_element (identifier) @tag (#match? @tag "^[a-z][^.]*$")) +(jsx_closing_element (identifier) @tag (#match? @tag "^[a-z][^.]*$")) +(jsx_self_closing_element (identifier) @tag (#match? @tag "^[a-z][^.]*$")) + +;; #F07178 #000000 0 0 0 1 +(jsx_attribute (property_identifier) @attribute) + +;; #BFBDB6 #000000 0 0 0 1 +(jsx_opening_element (["<" ">"]) @punctuation.bracket) +(jsx_closing_element ([""]) @punctuation.bracket) +(jsx_self_closing_element (["<" "/>"]) @punctuation.bracket) + +; Injections + +;; !regex +(regex) @string.regex diff --git a/grammar/json.scm b/grammar/json.scm new file mode 100644 index 0000000..0eaf81d --- /dev/null +++ b/grammar/json.scm @@ -0,0 +1,22 @@ +;; #D2A6FF #000000 0 0 0 2 +(pair + key: (_) @string.special.key) + +;; #AAD94C #000000 0 0 0 1 +(string) @string + +;; #7dcfff #000000 0 0 0 2 +(number) @number + +;; #F07178 #000000 0 0 0 1 +[ + (null) + (true) + (false) +] @constant.builtin + +;; #7dcfff #000000 0 0 0 2 +(escape_sequence) @escape + +;; #99ADBF #000000 0 1 0 1 +(comment) @comment diff --git a/grammar/lua.scm b/grammar/lua.scm new file mode 100644 index 0000000..56ddcaf --- /dev/null +++ b/grammar/lua.scm @@ -0,0 +1,312 @@ +; ============================================================ +; Identifiers +; ============================================================ + +;; #FFFFFF #000000 0 0 0 1 +(identifier) @variable + +;; #C9B4FF #000000 0 0 0 2 +((identifier) @constant + (#match? @constant "^[A-Z][A-Z_0-9]*$")) + +;; #F28FAD #000000 0 0 0 3 +((identifier) @variable.builtin + (#match? @variable.builtin "^self$")) + +; Attributes (generic parameters) +;; #7CD5CF #000000 0 0 0 2 +(variable_list + (attribute + "<" @punctuation.bracket + (identifier) @attribute + ">" @punctuation.bracket)) + +; ============================================================ +; Control flow & keywords +; ============================================================ + +;; #9AD4FF #000000 0 0 0 2 +"return" @keyword.return + +;; #FF9E64 #000000 0 0 0 2 +[ + "goto" + "in" + "local" +] @keyword + +;; #9AD4FF #000000 0 0 0 2 +(label_statement) @label + +;; #FF9E64 #000000 0 0 0 2 +(break_statement) @keyword + +;; #9AD4FF #000000 0 0 0 2 +(do_statement +[ + "do" + "end" +] @keyword) + +;; #9AD4FF #000000 0 0 0 2 +(while_statement +[ + "while" + "do" + "end" +] @repeat) + +;; #9AD4FF #000000 0 0 0 2 +(repeat_statement +[ + "repeat" + "until" +] @repeat) + +;; #FFB870 #000000 0 0 0 2 +(if_statement +[ + "if" + "elseif" + "else" + "then" + "end" +] @conditional) + +;; #9AD4FF #000000 0 0 0 2 +(elseif_statement +[ + "elseif" + "then" + "end" +] @conditional) + +;; #9AD4FF #000000 0 0 0 2 +(else_statement +[ + "else" + "end" +] @conditional) + +;; #9AD4FF #000000 0 0 0 2 +(for_statement +[ + "for" + "do" + "end" +] @repeat) + +;; #FFB870 #000000 0 0 0 2 +(function_declaration +[ + "function" + "end" +] @keyword.function) + +;; #FFB870 #000000 0 0 0 2 +(function_definition +[ + "function" + "end" +] @keyword.function) + +; ============================================================ +; Operators +; ============================================================ + +;; #6BD9DF #000000 0 1 0 1 +(binary_expression operator: _ @operator) + +;; #6BD9DF #000000 0 1 0 1 +(unary_expression operator: _ @operator) + +;; #F29CC3 #000000 0 0 0 1 +[ + "and" + "not" + "or" +] @keyword.operator + +; ============================================================ +; Punctuation +; ============================================================ + +;; #B6BEC8 #000000 0 0 0 1 +[ + ";" + ":" + "," + "." +] @punctuation.delimiter + +; Brackets +;; #B6BEC8 #000000 0 0 0 1 +[ + "(" + ")" + "[" + "]" + "{" + "}" +] @punctuation.bracket + +; ============================================================ +; Tables & fields +; ============================================================ + +;; #9AD4FF #000000 0 0 0 1 +(field name: (identifier) @field) + +;; #9AD4FF #000000 0 0 0 1 +(dot_index_expression field: (identifier) @field) + +;; #7CD5CF #000000 0 0 0 1 +(table_constructor +[ + "{" + "}" +] @constructor) + +; ============================================================ +; Functions +; ============================================================ + +;; #FFC877 #000000 0 0 0 3 +(parameters (identifier) @parameter) + +;; #FFC877 #000000 0 0 0 3 +(function_declaration + name: [ + (identifier) @function + (dot_index_expression + field: (identifier) @function) + ]) + +;; #FFC877 #000000 0 0 0 3 +(function_declaration + name: (method_index_expression + method: (identifier) @method)) + +;; #FFC877 #000000 0 0 0 3 +(assignment_statement + (variable_list . + name: [ + (identifier) @function + (dot_index_expression + field: (identifier) @function) + ]) + (expression_list . + value: (function_definition))) + +;; #FFC877 #000000 0 0 0 3 +(table_constructor + (field + name: (identifier) @function + value: (function_definition))) + +; Function calls +;; #78C2FF #000000 0 0 0 2 +(function_call + name: [ + (identifier) @function.call + (dot_index_expression + field: (identifier) @function.call) + (method_index_expression + method: (identifier) @method.call) + ]) + +; Highlighted definitions & references +;; #FFC877 #000000 0 0 0 3 +(function_declaration + name: [ + (identifier) @name + (dot_index_expression + field: (identifier) @name) + ]) @definition.function + +;; #FFC877 #000000 0 0 0 3 +(function_declaration + name: (method_index_expression + method: (identifier) @name)) @definition.method + +;; #FFC877 #000000 0 0 0 3 +(assignment_statement + (variable_list . + name: [ + (identifier) @name + (dot_index_expression + field: (identifier) @name) + ]) + (expression_list . + value: (function_definition))) @definition.function + +;; #FFC877 #000000 0 0 0 3 +(table_constructor + (field + name: (identifier) @name + value: (function_definition))) @definition.function + +;; #78C2FF #000000 0 0 0 2 +(function_call + name: [ + (identifier) @name + (dot_index_expression + field: (identifier) @name) + (method_index_expression + method: (identifier) @name) + ]) @reference.call + +; Builtins +;; #F28FAD #000000 0 0 0 2 +(function_call + (identifier) @function.builtin + (#match? @function.builtin "^(assert|collectgarbage|dofile|error|getfenv|getmetatable|ipairs|load|loadfile|loadstring|module|next|pairs|pcall|print|rawequal|rawget|rawset|required|select|setfenv|setmetatable|tonumber|tostring|type|unpack|xpcall)$")) + +; ============================================================ +; Literals & constants +; ============================================================ + +;; #B8E986 #000000 0 0 0 5 +(number) @number + +;; #A6E3A1 #000000 0 0 0 5 +(string) @string + +;; #A6E3A1 #000000 0 0 0 6 +(escape_sequence) @string.escape + +;; #C9B4FF #000000 0 0 0 2 +(vararg_expression) @constant + +;; #C9B4FF #000000 0 0 0 2 +(nil) @constant.builtin + +;; #C2E8FF #000000 0 0 0 2 +[ + (false) + (true) +] @boolean + +; ============================================================ +; Comments & directives +; ============================================================ + +;; #99ADBF #000000 0 1 0 1 +(comment) @comment + +;; #7CD5CF #000000 0 0 0 1 +(hash_bang_line) @preproc + +; ============================================================ +; Injections +; ============================================================ + +;; #7CD5CF #000000 0 1 0 2 +((function_call + name: [ + (identifier) @_cdef_identifier + (_ _ (identifier) @_cdef_identifier) + ] + ;; !c + arguments: (arguments (string content: _ @injection.c))) + (#match? @_cdef_identifier "^cdef$")) diff --git a/grammar/make.scm b/grammar/make.scm new file mode 100644 index 0000000..1ccaa55 --- /dev/null +++ b/grammar/make.scm @@ -0,0 +1,191 @@ +;; #9CDCFE #000000 0 0 0 3 +[ + "(" + ")" + "{" + "}" +] @punctuation.bracket + +;; #C2E8FF #000000 0 1 0 2 +[ + ":" + "&:" + "::" + "|" + ";" + "\"" + "'" + "," +] @punctuation.delimiter + +;; #FFD700 #000000 0 0 0 2 +[ + "$" + "$$" +] @punctuation.special + +;; #FF8F40 #000000 0 0 0 2 +(automatic_variable + [ "@" "%" "<" "?" "^" "+" "/" "*" "D" "F"] @punctuation.special) + +;; #FF6347 #000000 0 0 0 2 +(automatic_variable + "/" @error . ["D" "F"]) + +;; #F29668 #000000 0 1 0 2 +[ + "=" + ":=" + "::=" + "?=" + "+=" + "!=" + "@" + "-" + "+" +] @operator + +;; #FFFFFF #000000 0 0 0 1 +[ + (text) + (string) + (raw_text) +] @string + +;; #9AD4FF #000000 0 0 0 2 +(variable_assignment (word) @string) + +;; #7AA2F7 #000000 0 0 0 1 +[ + "ifeq" + "ifneq" + "ifdef" + "ifndef" + "else" + "endif" + "if" + "or" ; boolean functions are conditional in make grammar + "and" +] @conditional + +;; #9ADE7A #000000 0 0 0 2 +"foreach" @repeat + +;; #D2A6FF #000000 0 0 0 1 +[ + "define" + "endef" + "vpath" + "undefine" + "export" + "unexport" + "override" + "private" +; "load" +] @keyword + +;; #C6B5FF #000000 0 0 0 2 +[ + "include" + "sinclude" + "-include" +] @include + +;; #82AAFF #000000 0 0 0 2 +[ + "subst" + "patsubst" + "strip" + "findstring" + "filter" + "filter-out" + "sort" + "word" + "words" + "wordlist" + "firstword" + "lastword" + "dir" + "notdir" + "suffix" + "basename" + "addsuffix" + "addprefix" + "join" + "wildcard" + "realpath" + "abspath" + "call" + "eval" + "file" + "value" + "shell" +] @keyword.function + +;; #FF9D5C #000000 0 0 0 2 +[ + "error" + "warning" + "info" +] @exception + +;; #B8E986 #000000 0 0 0 2 +(variable_assignment + name: (word) @constant) + +;; #B8E986 #000000 0 0 0 2 +(variable_reference + (word) @constant) + +;; #99ADBF #000000 0 1 0 1 +(comment) @comment + +;; #F28FAD #000000 0 0 0 2 +((word) @clean @string.regex + (#match? @clean "[%\*\?]")) + +;; #F07178 #000000 0 0 0 2 +(function_call + function: "error" + (arguments (text) @text.danger)) + +;; #FFC877 #000000 0 0 0 2 +(function_call + function: "warning" + (arguments (text) @text.warning)) + +;; #61AFEF #000000 0 0 0 2 +(function_call + function: "info" + (arguments (text) @text.note)) + +;; #95E6CB #000000 0 0 0 2 +[ + "VPATH" + ".RECIPEPREFIX" +] @constant.builtin + +;; #95E6CB #000000 0 0 0 2 +(variable_assignment + name: (word) @clean @constant.builtin + (#match? @clean "^(AR|AS|CC|CXX|CPP|FC|M2C|PC|CO|GET|LEX|YACC|LINT|MAKEINFO|TEX|TEXI2DVI|WEAVE|CWEAVE|TANGLE|CTANGLE|RM|ARFLAGS|ASFLAGS|CFLAGS|CXXFLAGS|COFLAGS|CPPFLAGS|FFLAGS|GFLAGS|LDFLAGS|LDLIBS|LFLAGS|YFLAGS|PFLAGS|RFLAGS|LINTFLAGS|PRE_INSTALL|POST_INSTALL|NORMAL_INSTALL|PRE_UNINSTALL|POST_UNINSTALL|NORMAL_UNINSTALL|MAKEFILE_LIST|MAKE_RESTARTS|MAKE_TERMOUT|MAKE_TERMERR|\\.DEFAULT_GOAL|\\.RECIPEPREFIX|\\.EXTRA_PREREQS)$")) + +;; #95E6CB #000000 0 0 0 2 +(variable_reference + (word) @clean @constant.builtin + (#match? @clean "^(AR|AS|CC|CXX|CPP|FC|M2C|PC|CO|GET|LEX|YACC|LINT|MAKEINFO|TEX|TEXI2DVI|WEAVE|CWEAVE|TANGLE|CTANGLE|RM|ARFLAGS|ASFLAGS|CFLAGS|CXXFLAGS|COFLAGS|CPPFLAGS|FFLAGS|GFLAGS|LDFLAGS|LDLIBS|LFLAGS|YFLAGS|PFLAGS|RFLAGS|LINTFLAGS|PRE_INSTALL|POST_INSTALL|NORMAL_INSTALL|PRE_UNINSTALL|POST_UNINSTALL|NORMAL_UNINSTALL|MAKEFILE_LIST|MAKE_RESTARTS|MAKE_TERMOUT|MAKE_TERMERR|\\.DEFAULT_GOAL|\\.RECIPEPREFIX|\\.EXTRA_PREREQS\\.VARIABLES|\\.FEATURES|\\.INCLUDE_DIRS|\\.LOADED)$")) + +;; #C792EA #000000 0 0 0 2 +(targets + (word) @constant.macro + (#match? @constant.macro "^(all|install|install-html|install-dvi|install-pdf|install-ps|uninstall|install-strip|clean|distclean|mostlyclean|maintainer-clean|TAGS|info|dvi|html|pdf|ps|dist|check|installcheck|installdirs)$")) + +;; #C792EA #000000 0 0 0 2 +(targets + (word) @constant.macro + (#match? @constant.macro "^(all|install|install-html|install-dvi|install-pdf|install-ps|uninstall|install-strip|clean|distclean|mostlyclean|maintainer-clean|TAGS|info|dvi|html|pdf|ps|dist|check|installcheck|installdirs)$")) + +;; #C792EA #000000 0 0 0 2 +(targets + (word) @constant.macro + (#match? @constant.macro "^\\.(PHONY|SUFFIXES|DEFAULT|PRECIOUS|INTERMEDIATE|SECONDARY|SECONDEXPANSION|DELETE_ON_ERROR|IGNORE|LOW_RESOLUTION_TIME|SILENT|EXPORT_ALL_VARIABLES|NOTPARALLEL|ONESHELL|POSIX)$")) diff --git a/grammar/markdown.scm b/grammar/markdown.scm new file mode 100644 index 0000000..7f04b7b --- /dev/null +++ b/grammar/markdown.scm @@ -0,0 +1,321 @@ +;; #82AAFF #000000 1 0 1 4 +(setext_heading + (paragraph) @markup.heading.1 + (setext_h1_underline) @markup.heading.1) + +;; #82AAFF #000000 1 0 1 4 +(setext_heading + (paragraph) @markup.heading.2 + (setext_h2_underline) @markup.heading.2) + +(atx_heading + (atx_h1_marker)) @markup.heading.1 + +(atx_heading + (atx_h2_marker)) @markup.heading.2 + +;; #82AAFF #000000 1 0 0 4 +(atx_heading + (atx_h3_marker)) @markup.heading.3 + +;; #82AAFF #000000 1 0 0 4 +(atx_heading + (atx_h4_marker)) @markup.heading.4 + +;; #82AAFF #000000 1 0 0 4 +(atx_heading + (atx_h5_marker)) @markup.heading.5 + +;; #82AAFF #000000 1 0 0 4 +(atx_heading + (atx_h6_marker)) @markup.heading.6 + +;; #82AAFF #000000 0 0 0 4 +(info_string) @label + +;; #FF6347 #000000 0 0 0 4 +(pipe_table_header + (pipe_table_cell) @markup.heading) + +;; #FF8F40 #000000 0 0 0 4 +(pipe_table_header + "|" @punctuation.special) + +(pipe_table_row + "|" @punctuation.special) + +(pipe_table_delimiter_row + "|" @punctuation.special) + +(pipe_table_delimiter_cell) @punctuation.special + +;; #AAD94C #000000 0 0 0 2 +(indented_code_block) @markup.raw.block + +(fenced_code_block) @markup.raw.block + +(fenced_code_block + (fenced_code_block_delimiter) @markup.raw.block) + +(fenced_code_block + (info_string + (language) @label)) + +;; #7dcfff #000000 0 0 1 6 +(link_destination) @markup.link.url + +;; #7dcfff #000000 0 0 1 6 +[ + (link_title) + (link_label) +] @markup.link.label + +;; #FF8F40 #000000 0 0 0 4 +((link_label) + . + ":" @punctuation.delimiter) + +;; #9ADE7A #000000 0 0 0 4 +[ + (list_marker_plus) + (list_marker_minus) + (list_marker_star) + (list_marker_dot) + (list_marker_parenthesis) +] @markup.list + +(thematic_break) @punctuation.special + +;; #FF8F40 #000000 0 0 0 4 +(task_list_marker_unchecked) @markup.list.unchecked + +;; #AAD94C #000000 0 0 0 4 +(task_list_marker_checked) @markup.list.checked + +[ + (plus_metadata) + (minus_metadata) +] @keyword.directive + +[ + (block_continuation) + (block_quote_marker) +] @punctuation.special + +;; #AAD94C #000000 0 0 0 6 +(backslash_escape) @string.escape + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^ruby$")) +;; !ruby + (code_fence_content) @injection.ruby) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^bash$")) +;; !bash + (code_fence_content) @injection.bash) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^cpp$")) +;; !cpp + (code_fence_content) @injection.cpp) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^h$")) +;; !h + (code_fence_content) @injection.h) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^c$")) +;; !c + (code_fence_content) @injection.h) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^css$")) +;; !css + (code_fence_content) @injection.css) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^fish$")) +;; !fish + (code_fence_content) @injection.fish) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^go$")) +;; !go + (code_fence_content) @injection.go) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^haskell$")) +;; !haskell + (code_fence_content) @injection.haskell) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^html$")) +;; !html + (code_fence_content) @injection.html) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^javascript$")) +;; !javascript + (code_fence_content) @injection.javascript) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^json$")) +;; !json + (code_fence_content) @injection.json) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^lua$")) +;; !lua + (code_fence_content) @injection.lua) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^regex$")) +;; !regex + (code_fence_content) @injection.regex) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^query$")) +;; !query + (code_fence_content) @injection.query) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^markdown$")) +;; !markdown + (code_fence_content) @injection.markdown) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^markdown_inline$")) +;; !markdown_inline + (code_fence_content) @injection.markdown_inline) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^erb$")) +;; !embedded_template + (code_fence_content) @injection.embedded_template) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^python$")) +;; !python + (code_fence_content) @injection.python) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^php$")) +;; !php + (code_fence_content) @injection.php) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^rust$")) +;; !rust + (code_fence_content) @injection.rust) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^sql$")) +;; !sql + (code_fence_content) @injection.sql) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^gitattributes$")) +;; !gitattributes + (code_fence_content) @injection.gitattributes) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^gitignore$")) +;; !gitignore + (code_fence_content) @injection.gitignore) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^gdscript$")) +;; !gdscript + (code_fence_content) @injection.gdscript) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^make$")) +;; !make + (code_fence_content) @injection.make) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^diff$")) +;; !diff + (code_fence_content) @injection.diff) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^ini$")) +;; !ini + (code_fence_content) @injection.ini) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^nginx$")) +;; !nginx + (code_fence_content) @injection.nginx) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^toml$")) +;; !toml + (code_fence_content) @injection.toml) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^yaml$")) +;; !yaml + (code_fence_content) @injection.yaml) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^gomod$")) +;; !gomod + (code_fence_content) @injection.gomod) + +(fenced_code_block + (info_string + (language) @injection.language (#match? @injection.language "^cabal$")) +;; !cabal + (code_fence_content) @injection.cabal) + +;; !html +(html_block) @injection.html + +;; !yaml +(minus_metadata) @injection.yaml + +;; !toml +(plus_metadata) @injection.toml + +;; !markdown_inline +(paragraph) @inline + +(pipe_table_row + (pipe_table_cell) @inline) + +(block_quote ((paragraph) @inline)) diff --git a/grammar/markdown_inline.scm b/grammar/markdown_inline.scm new file mode 100644 index 0000000..0096aec --- /dev/null +++ b/grammar/markdown_inline.scm @@ -0,0 +1,90 @@ +;; #AAD94C #000000 0 0 0 0 +(code_span) @markup.raw + +;; #FF8F40 #000000 0 1 0 1 +(emphasis) @markup.italic + +;; #FFD700 #000000 1 0 0 1 +(strong_emphasis) @markup.strong + +;; #FF6347 #000000 0 0 1 1 +(strikethrough) @markup.strikethrough + +;; #7dcfff #000000 0 0 0 1 +[ + (backslash_escape) + (hard_line_break) +] @string.escape + +;; #7dcfff #000000 0 0 1 1 +(inline_link + [ + "[" + "]" + "(" + (link_destination) + ")" + ] @markup.link) + +;; #7dcfff #000000 0 0 1 1 +[ + (link_label) + (link_text) + (link_title) + (image_description) +] @markup.link.label + +;; #7dcfff #000000 0 0 1 1 +((inline_link + (link_destination) @_url) @_label) + +;; #7dcfff #000000 0 0 1 1 +((image + (link_destination) @_url) @_label) + +;; #7dcfff #000000 0 0 1 1 +(image + [ + "!" + "[" + "]" + "(" + (link_destination) + ")" + ] @markup.link) + +;; #7dcfff #000000 0 0 1 1 +(full_reference_link + [ + "[" + "]" + (link_label) + ] @markup.link) + +;; #7dcfff #000000 0 0 1 1 +(collapsed_reference_link + [ + "[" + "]" + ] @markup.link) + +;; #7dcfff #000000 0 0 1 1 +(shortcut_link + [ + "[" + "]" + ] @markup.link) + +;; #7dcfff #000000 0 0 1 1 +[ + (link_destination) + (uri_autolink) + (email_autolink) +] @markup.link.url @nospell + +;; #7dcfff #000000 0 0 1 1 +(uri_autolink) @_url + +;; #FF8F40 #000000 0 0 0 0 +;; !html +(html_tag) @injection.html diff --git a/grammar/nginx.scm b/grammar/nginx.scm new file mode 100644 index 0000000..2e7d24b --- /dev/null +++ b/grammar/nginx.scm @@ -0,0 +1,54 @@ +;; #99ADBF #000000 0 1 0 1 +(comment) @comment + +;; #7dcfff #000000 0 0 0 2 +(number) @number +(metric) @number + +;; !regex +(regex) @regex + +;; #FFFFFF #000000 0 0 0 1 +(variable) @variable + +;; #F29668 #000000 0 0 0 1 +(modifier) @operator + +;; #D2A6FF #000000 0 0 0 1 +(simple_directive + name: (directive) @function) + +;; #D2A6FF #000000 0 0 0 1 +(block_directive + name: (directive) @function) + +;; #D2A6FF #000000 0 0 0 1 +(lua_block_directive + "access_by_lua_block" @function) + +;; #F07178 #000000 0 0 0 1 +((generic) @constant.builtin + (#match? @constant.builtin "^(off|on)$")) + +;; #AAD94C #000000 0 0 0 2 +(generic) @string +(string) @string + +;; #FFFFFF #000000 0 0 0 1 +(scheme) @string +(ipv4) @number + +;; #888888 #000000 0 1 0 3 +[ + ";" +] @delimiter + +;; #888888 #000000 0 0 0 3 +[ + "{" + "}" + "(" + ")" + "[" + "]" +] @punctuation.bracket diff --git a/grammar/php.scm b/grammar/php.scm new file mode 100644 index 0000000..39238be --- /dev/null +++ b/grammar/php.scm @@ -0,0 +1,453 @@ +;; ========================================================= +;; PHP SYNTAX HIGHLIGHTING +;; Cool–warm balanced palette (blue / teal / purple / orange) +;; ========================================================= + +;; #FF9D5C #000000 0 0 0 1 +;; Keywords (logic / flow) +[ + "and" + "as" + "instanceof" + "or" + "xor" +] @keyword.operator + +;; #FF9D5C #000000 0 0 0 1 +[ + "fn" + "function" +] @keyword.function + +;; #FF9D5C #000000 0 0 0 1 +[ + "clone" + "declare" + "default" + "echo" + "enddeclare" + "extends" + "global" + "goto" + "implements" + "insteadof" + "print" + "new" + "unset" +] @keyword + +;; #6FB3FF #000000 0 0 0 1 +[ + "enum" + "class" + "interface" + "namespace" + "trait" +] @keyword.type + +;; #FF9D5C #000000 0 0 0 1 +[ + "abstract" + "const" + "final" + "private" + "protected" + "public" + "readonly" + "static" +] @keyword.modifier + +;; #FF9D5C #000000 0 0 0 1 +[ + "return" + "exit" + "yield" + "yield from" +] @keyword.return + +;; #FF9D5C #000000 0 0 0 1 +[ + "case" + "else" + "elseif" + "endif" + "endswitch" + "if" + "switch" + "match" + "??" +] @keyword.conditional + +;; #FF9D5C #000000 0 0 0 1 +[ + "break" + "continue" + "do" + "endfor" + "endforeach" + "endwhile" + "for" + "foreach" + "while" +] @keyword.repeat + +;; #FF9D5C #000000 0 0 0 1 +[ + "catch" + "finally" + "throw" + "try" +] @keyword.exception + +;; #8BD5CA #000000 0 0 0 1 +[ + "include_once" + "include" + "require_once" + "require" + "use" +] @keyword.import + +;; #B0BEC5 #000000 0 0 0 1 +[ + "," + ";" + ":" + "\\" +] @punctuation.delimiter + +;; #B0BEC5 #000000 0 0 0 1 +[ + (php_tag) + (php_end_tag) + "(" + ")" + "[" + "]" + "{" + "}" + "#[" +] @punctuation.bracket + +;; #F29668 #000000 0 1 0 1 +[ + "=" + "." + "-" + "*" + "/" + "+" + "%" + "**" + "~" + "|" + "^" + "&" + "<<" + ">>" + "<<<" + "->" + "?->" + "=>" + "<" + "<=" + ">=" + ">" + "<>" + "<=>" + "==" + "!=" + "===" + "!==" + "!" + "&&" + "||" + ".=" + "-=" + "+=" + "*=" + "/=" + "%=" + "**=" + "&=" + "|=" + "^=" + "<<=" + ">>=" + "??=" + "--" + "++" + "@" + "::" +] @operator + +;; #7DCFFF #000000 0 0 0 1 +(variable_name) @variable + +;; #C792EA #000000 0 0 0 1 +((name) @constant + (#lua-match? @constant "^_?[A-Z][A-Z%d_]*$")) + +;; #C792EA #000000 0 0 0 1 +((name) @constant.builtin + (#lua-match? @constant.builtin "^__[A-Z][A-Z%d_]+__$")) + +;; #6FB3FF #000000 0 0 0 1 +(const_declaration + (const_element + (name) @constant)) + +;; #82AAFF #000000 0 0 0 1 +[ + (primitive_type) + (cast_type) + (bottom_type) +] @type.builtin + +;; #82AAFF #000000 0 0 0 1 +(named_type + [ + (name) @type + (qualified_name (name) @type) + (relative_name (name) @type) + ]) + +;; #82AAFF #000000 0 0 0 1 +(named_type + (name) @type.builtin + (#any-of? @type.builtin "static" "self")) + +;; #82AAFF #000000 0 0 0 1 +(class_declaration + name: (name) @type) + +;; #82AAFF #000000 0 0 0 1 +(enum_declaration + name: (name) @type) + +;; #82AAFF #000000 0 0 0 1 +(interface_declaration + name: (name) @type) + +;; #7DCFFF #000000 0 0 0 1 +(namespace_use_clause + [ + (name) @type + (qualified_name (name) @type) + alias: (name) @type.definition + ]) + +;; #7DCFFF #000000 0 0 0 1 +(namespace_use_clause + type: "function" + [ + (name) @function + (qualified_name (name) @function) + alias: (name) @function + ]) + +;; #7DCFFF #000000 0 0 0 1 +(namespace_use_clause + type: "const" + [ + (name) @constant + (qualified_name (name) @constant) + alias: (name) @constant + ]) + +;; #7DCFFF #000000 0 0 0 1 +(scoped_call_expression + scope: [ + (name) @type + (qualified_name (name) @type) + (relative_name (name) @type) + ]) + +;; #7DCFFF #000000 0 0 0 1 +(class_constant_access_expression + . + [ + (name) @type + (qualified_name (name) @type) + (relative_name (name) @type) + ] + (name) @constant) + +;; #A6E3A1 #000000 0 0 0 1 +(scoped_property_access_expression + name: (variable_name) @variable.member) + +;; #A6E3A1 #000000 0 0 0 1 +(trait_declaration + name: (name) @type) + +;; #A6E3A1 #000000 0 0 0 1 +(use_declaration + (name) @type) + +;; #FF9D5C #000000 0 0 0 1 +(binary_expression + operator: "instanceof" + right: [ + (name) @type + (qualified_name (name) @type) + (relative_name (name) @type) + ]) + +;; #FFD580 #000000 0 0 0 1 +(array_creation_expression + "array" @function.builtin) + +;; #FFD580 #000000 0 0 0 1 +(list_literal + "list" @function.builtin) + +;; #FFD580 #000000 0 0 0 1 +(exit_statement + "exit" @function.builtin + "(") + +;; #89DDFF #000000 0 0 0 1 +(method_declaration + name: (name) @function.method) + +;; #89DDFF #000000 0 0 0 1 +(function_call_expression + function: [ + (name) @function.call + (qualified_name (name) @function.call) + (relative_name (name) @function.call) + ]) + +;; #89DDFF #000000 0 0 0 1 +(scoped_call_expression + name: (name) @function.call) + +;; #89DDFF #000000 0 0 0 1 +(member_call_expression + name: (name) @function.method) + +;; #89DDFF #000000 0 0 0 1 +(nullsafe_member_call_expression + name: (name) @function.method) + +;; #FFD580 #000000 0 0 0 1 +(method_declaration + name: (name) @constructor + (#eq? @constructor "__construct")) + +;; #FFD580 #000000 0 0 0 1 +(object_creation_expression + [ + (name) @constructor + (qualified_name (name) @constructor) + (relative_name (name) @constructor) + ]) + +;; #9CDCFE #000000 0 0 0 1 +(variadic_parameter + "..." @operator + name: (variable_name) @variable.parameter) + +;; #9CDCFE #000000 0 0 0 1 +(simple_parameter + name: (variable_name) @variable.parameter) + +;; #9CDCFE #000000 0 0 0 1 +(argument + (name) @variable.parameter) + +;; #9CDCFE #000000 0 0 0 1 +(property_element + (variable_name) @property) + +;; #9CDCFE #000000 0 0 0 1 +(member_access_expression + name: (variable_name (name)) @variable.member) + +;; #9CDCFE #000000 0 0 0 1 +(relative_scope) @variable.builtin + +;; #7AA2F7 #000000 0 0 0 1 +((variable_name) @variable.builtin + (#eq? @variable.builtin "$this")) + +;; #C792EA #000000 0 0 0 1 +(namespace_definition + name: (namespace_name (name) @module)) + +;; #C792EA #000000 0 0 0 1 +(namespace_name + (name) @module) + +;; #7AA2F7 #000000 0 0 0 1 +(relative_name + "namespace" @module.builtin) + +;; #89DDFF #000000 0 0 0 1 +(attribute_list) @attribute + +;; #FF9D5C #000000 0 0 0 1 +(conditional_expression + "?" @keyword.conditional.ternary + ":" @keyword.conditional.ternary) + +;; #9CDCFE #000000 0 0 0 1 +(declare_directive + [ + "strict_types" + "ticks" + "encoding" + ] @variable.parameter) + +;; #A6E3A1 #000000 0 0 0 1 +[ + (string) + (encapsed_string) + (heredoc_body) + (nowdoc_body) + (shell_command_expression) +] @string + +;; #A6E3A1 #000000 0 0 0 1 +(escape_sequence) @string.escape + +;; #A6E3A1 #000000 0 0 0 1 +[ + (heredoc_start) + (heredoc_end) +] @label + +;; #DDB6F2 #000000 0 0 0 1 +(nowdoc + "'" @label) + +;; #F38BA8 #000000 0 0 0 1 +(boolean) @boolean + +;; #F38BA8 #000000 0 0 0 1 +(null) @constant.builtin + +;; #F38BA8 #000000 0 0 0 1 +(integer) @number + +;; #F38BA8 #000000 0 0 0 1 +(float) @number.float + +;; #99ADBF #000000 0 1 0 1 +(comment) @comment @spell + +;; #A6E3A1 #000000 0 0 0 1 +(named_label_statement) @label + +;; #7AA2F7 #000000 0 0 0 1 +(property_hook + (name) @label) + +;; #7AA2F7 #000000 0 0 0 1 +(visibility_modifier + (operation) @label) + +;; #89DDFF #000000 0 0 0 1 +;; !html +(text) @injection.html diff --git a/grammar/python.scm b/grammar/python.scm new file mode 100644 index 0000000..e63ed8a --- /dev/null +++ b/grammar/python.scm @@ -0,0 +1,412 @@ +; ============================================================ +; Identifiers +; ============================================================ + +;; #FFFFFF #000000 0 0 0 1 +(identifier) @variable + +;; #D2A6FF #000000 0 0 0 2 +((identifier) @type + (#match? @type "^[A-Z].*[a-z]")) + +;; #D2A6FF #000000 0 0 0 2 +((identifier) @constant + (#match? @constant "^[A-Z][A-Z_0-9]*$")) + +;; #D2A6FF #000000 0 0 0 2 +((identifier) @constant.builtin + (#match? @constant.builtin "^__[a-zA-Z0-9_]*__$")) + +;; #D2A6FF #000000 0 0 0 2 +((identifier) @constant.builtin + (#match? @constant.builtin "^(NotImplemented|Ellipsis|quit|exit|copyright|credits|license)$")) + +;; #FFB454 #000000 0 0 0 3 +((assignment + left: (identifier) @type.definition + (type + (identifier) @_annotation)) + (#match? @_annotation "^TypeAlias$")) + +;; #FFB454 #000000 0 0 0 3 +((assignment + left: (identifier) @type.definition + right: (call + function: (identifier) @_func)) + (#match? @_func "^(TypeVar|NewType)$")) + +; ============================================================ +; Function definitions +; ============================================================ + +;; #FFB454 #000000 0 0 0 3 +(function_definition + name: (identifier) @function) + +;; #FFB454 #000000 0 0 0 2 +(type + (identifier) @type) + +;; #FFB454 #000000 0 0 0 2 +(type + (subscript + (identifier) @type)) + +;; #FFB454 #000000 0 0 0 2 +((call + function: (identifier) @_isinstance + arguments: (argument_list + (_) + (identifier) @type)) + (#match? @_isinstance "^isinstance$")) + +; ============================================================ +; Literals +; ============================================================ + +;; #D2A6FF #000000 0 0 0 2 +(none) @constant.builtin + +;; #D2A6FF #000000 0 0 0 2 +[ + (true) + (false) +] @boolean + +;; #D2A6FF #000000 0 0 0 2 +(integer) @number + +;; #D2A6FF #000000 0 0 0 2 +(float) @number.float + +;; #99ADBF #000000 0 1 0 1 +(comment) @comment @spell + +;; #F29668 #000000 0 0 0 1 +((module + . + (comment) @keyword.directive @nospell) + (#match? @keyword.directive "^#!/")) + +;; #AAD94C #000000 0 0 0 0 +(string) @string + +;; #AAD94C #000000 0 0 0 0 +[ + (escape_sequence) + (escape_interpolation) +] @string.escape + +;; #AAD94C #000000 0 0 0 0 +(expression_statement + (string + (string_content) @spell) @string.documentation) + +; ============================================================ +; Operators +; ============================================================ + +;; #FF8F40 #000000 0 0 0 1 +[ "if" "elif" "else" "for" "while" "break" "continue" ] @keyword.control_flow_loops + +;; #FF8F40 #000000 0 0 0 1 +[ "def" "return" "lambda" "yield" "async" "await" ] @keyword.functions_coroutines + +;; #7dcfff #000000 0 0 0 2 +[ "class" ] @keyword.class + +;; #F07178 #000000 0 0 0 1 +[ "try" "except" "finally" "raise" ] @keyword.exceptions + +;; #D2A6FF #000000 0 0 0 2 +[ "with" ] @keyword.context_management + +;; #7dcfff #000000 0 0 0 2 +[ "import" "from" "exec" ] @keyword.imports_execution + +;; #D2A6FF #000000 0 0 0 2 +[ "match" "case" ] @keyword.pattern_matching + +;; #F07178 #000000 0 0 0 1 +[ "global" "nonlocal" ] @keyword.scope_bindings + +;; #FF8F40 #000000 0 0 0 1 +[ "del" ] @keyword.deletion + +;; #FF8F40 #000000 0 0 0 1 +[ "pass" "assert" "as" "print" ] @keyword.utility + +;; #F29668 #000000 0 1 0 1 +[ + "-" + "-=" + "!=" + "*" + "**" + "**=" + "*=" + "/" + "//" + "//=" + "/=" + "&" + "&=" + "%" + "%=" + "^" + "^=" + "+" + "->" + "+=" + "<" + "<<" + "<<=" + "<=" + "<>" + "=" + ":=" + "==" + ">" + ">=" + ">>" + ">>=" + "|" + "|=" + "~" + "@=" + "and" + "in" + "is" + "not" + "or" + "is not" + "not in" +] @operatoroperator + +;; #BFBDB6 #000000 0 0 0 1 +[ + "," + "." + ":" + ";" + (ellipsis) +] @punctuation.delimiter + +;; #BFBDB6 #000000 0 0 0 1 +[ + "(" + ")" + "[" + "]" + "{" + "}" +] @punctuation.bracket + +;; #7dcfff #000000 0 0 0 2 +(interpolation + "{" @punctuation.special + "}" @punctuation.special) + +;; #7dcfff #000000 0 0 0 2 +(format_expression + "{" @punctuation.special + "}" @punctuation.special) + +;; #7dcfff #000000 0 0 0 2 +(line_continuation) @punctuation.special + +;; #FFB454 #000000 0 0 0 2 +(type_conversion) @function.macro + +; ============================================================ +; Builtins / Exception types +; ============================================================ + +;; #D2A6FF #000000 0 0 0 2 +((identifier) @type.builtin + (#match? @type.builtin + "^(BaseException|Exception|ArithmeticError|BufferError|LookupError|AssertionError|AttributeError|EOFError|FloatingPointError|GeneratorExit|ImportError|ModuleNotFoundError|IndexError|KeyError|KeyboardInterrupt|MemoryError|NameError|NotImplementedError|OSError|OverflowError|RecursionError|ReferenceError|RuntimeError|StopIteration|StopAsyncIteration|SyntaxError|IndentationError|TabError|SystemError|SystemExit|TypeError|UnboundLocalError|UnicodeError|UnicodeEncodeError|UnicodeDecodeError|UnicodeTranslateError|ValueError|ZeroDivisionError|EnvironmentError|IOError|WindowsError|BlockingIOError|ChildProcessError|ConnectionError|BrokenPipeError|ConnectionAbortedError|ConnectionRefusedError|ConnectionResetError|FileExistsError|FileNotFoundError|InterruptedError|IsADirectoryError|NotADirectoryError|PermissionError|ProcessLookupError|TimeoutError|Warning|UserWarning|DeprecationWarning|PendingDeprecationWarning|SyntaxWarning|RuntimeWarning|FutureWarning|ImportWarning|UnicodeWarning|BytesWarning|ResourceWarning)$")) + +; ============================================================ +; Function / Lambda parameters +; ============================================================ + +;; #D2A6FF #000000 0 0 0 1 +(parameters + (identifier) @variable.parameter) + +;; #D2A6FF #000000 0 0 0 1 +(lambda_parameters + (identifier) @variable.parameter) + +;; #D2A6FF #000000 0 0 0 1 +(lambda_parameters + (tuple_pattern + (identifier) @variable.parameter)) + +;; #D2A6FF #000000 0 0 0 1 +(keyword_argument + name: (identifier) @variable.parameter) + +;; #D2A6FF #000000 0 0 0 1 +(default_parameter + name: (identifier) @variable.parameter) + +;; #D2A6FF #000000 0 0 0 1 +(typed_parameter + (identifier) @variable.parameter) + +;; #D2A6FF #000000 0 0 0 1 +(typed_default_parameter + name: (identifier) @variable.parameter) + +;; #D2A6FF #000000 0 0 0 1 +(parameters + (list_splat_pattern + (identifier) @variable.parameter)) + +;; #D2A6FF #000000 0 0 0 1 +(parameters + (dictionary_splat_pattern + (identifier) @variable.parameter)) + +;; #D2A6FF #000000 0 0 0 1 +(lambda_parameters + (list_splat_pattern + (identifier) @variable.parameter)) + +;; #D2A6FF #000000 0 0 0 1 +(lambda_parameters + (dictionary_splat_pattern + (identifier) @variable.parameter)) + +;; #FFB454 #000000 0 0 0 2 +((identifier) @variable.builtin + (#match? @variable.builtin "^(self|cls)$")) + +; ============================================================ +; Attributes / Class members +; ============================================================ + +;; #FFB454 #000000 0 0 0 2 +((attribute + attribute: (identifier) @variable.member) + (#match? @variable.member "^[%l_].*$")) + +; ============================================================ +; Class definitions +; ============================================================ + +;; #59C2FF #000000 0 0 0 2 +(class_definition + name: (identifier) @type) + +;; #FFB454 #000000 0 0 0 2 +(class_definition + body: (block + (function_definition + name: (identifier) @function.method))) + +;; #D2A6FF #000000 0 0 0 2 +(class_definition + superclasses: (argument_list + (identifier) @type)) + +;; #FFB454 #000000 0 0 0 2 +((class_definition + body: (block + (expression_statement + (assignment + left: (identifier) @variable.member)))) + (#match? @variable.member "^[%l_].*$")) + +;; #FFB454 #000000 0 0 0 2 +((class_definition + body: (block + (expression_statement + (assignment + left: (_ + (identifier) @variable.member))))) + (#match? @variable.member "^[%l_].*$")) + +;; #FFB454 #000000 0 0 0 2 +((class_definition + (block + (function_definition + name: (identifier) @constructor))) + (#match? @constructor "^(__new__|__init__)$")) + +; ============================================================ +; Function calls +; ============================================================ + +;; #FFB454 #000000 0 0 0 2 +(call + function: (identifier) @function.call) + +;; #FFB454 #000000 0 0 0 2 +(call + function: (attribute + attribute: (identifier) @function.method.call)) + +;; #59C2FF #000000 0 0 0 3 +((call + function: (identifier) @constructor) + (#match? @constructor "^[A-Z]")) + +;; #59C2FF #000000 0 0 0 3 +((call + function: (attribute + attribute: (identifier) @constructor)) + (#match? @constructor "^[A-Z]")) + +;; #FFB454 #000000 0 0 0 2 +((call + function: (identifier) @function.builtin) + (#match? @function.builtin + "^(abs|all|any|ascii|bin|bool|breakpoint|bytearray|bytes|callable|chr|classmethod|compile|complex|delattr|dict|dir|divmod|enumerate|eval|exec|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|isinstance|issubclass|iter|len|list|locals|map|max|memoryview|min|next|object|oct|open|ord|pow|print|property|range|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|vars|zip|__import__)$")) + +; ============================================================ +; Regex call +; ============================================================ + +(call + function: (identifier) @_re + arguments: (argument_list +;; !regex + (string) @string.regexp + ) + (#match? @_re "re")) + +; ============================================================ +; Decorators +; ============================================================ + +;; #FFB454 #000000 0 0 0 2 +(decorator + "@" @attribute) + +;; #FFB454 #000000 0 0 0 2 +(decorator + (identifier) @attribute) + +;; #FFB454 #000000 0 0 0 2 +(decorator + (attribute + attribute: (identifier) @attribute)) + +;; #FFB454 #000000 0 0 0 2 +(decorator + (call + (identifier) @attribute)) + +;; #FFB454 #000000 0 0 0 2 +(decorator + (call + (attribute + attribute: (identifier) @attribute))) + +;; #59C2FF #000000 0 0 0 3 +((decorator + (identifier) @attribute.builtin) + (#match? @attribute.builtin "^(classmethod|property|staticmethod)$")) diff --git a/grammar/query.scm b/grammar/query.scm new file mode 100644 index 0000000..916df72 --- /dev/null +++ b/grammar/query.scm @@ -0,0 +1,122 @@ +;; ============================================================ +;; Strings & escapes +;; ============================================================ + +;; #AAD94C #000000 0 0 0 2 +(string) @string + +;; #95E6CB #000000 0 0 0 2 +(escape_sequence) @string.escape + +;; ============================================================ +;; Identifiers +;; ============================================================ + +;; #C4B5FF #000000 0 0 0 2 +(capture + (identifier) @type) + +;; #FFB454 #000000 0 0 0 2 +(predicate + name: (identifier) @function.call) + +;; #F29CC3 #000000 0 0 0 2 +(named_node + name: (identifier) @variable) + +;; #F29CC3 #000000 0 0 0 2 +(missing_node + name: (identifier) @variable) + +;; #F07178 #000000 0 0 0 2 +(field_definition + name: (identifier) @variable.member) + +;; #F29CC3 #000000 0 0 0 2 +(negated_field + "!" @operator + (identifier) @property) + +;; ============================================================ +;; Comments +;; ============================================================ + +;; #99ADBF #000000 0 1 0 2 +(comment) @comment @spell + +;; ============================================================ +;; Operators & punctuation +;; ============================================================ + +;; #F29668 #000000 0 0 0 2 +(quantifier) @operator + +;; #BFBDB6 #000000 0 0 0 2 +(predicate_type) @punctuation.special + +;; #F29668 #000000 0 0 0 2 +"." @operator + +;; #BFBDB6 #000000 0 0 0 2 +[ + "[" + "]" + "(" + ")" +] @punctuation.bracket + +;; #BFBDB6 #000000 0 0 0 2 +[ + ":" + "/" +] @punctuation.delimiter + +;; #BFBDB6 #000000 0 0 0 2 +[ + "@" + "#" +] @punctuation.special + +;; #BFBDB6 #000000 0 0 0 2 +(predicate + "." @punctuation.special) + +;; #D2A6FF #000000 0 0 0 2 +"_" @character.special + +;; #FF8F40 #000000 0 0 0 2 +"MISSING" @keyword + +;; ============================================================ +;; Numbers +;; ============================================================ + +;; #B8E986 #000000 0 0 0 2 +((parameters + (identifier) @number) + (#match? @number "^[-+]?[0-9]+(.[0-9]+)?$")) + +;; ============================================================ +;; Predicate parameters +;; ============================================================ + +;; #F29CC3 #000000 0 0 0 2 +((predicate + name: (identifier) @_name + parameters: (parameters + . + (capture)? + . + (identifier) @property)) + (#match? @_name "^set$")) + +;; #AAD94C #000000 0 0 0 2 +((predicate + name: (identifier) @_name + parameters: (parameters + (string + "\"" @string + "\"" @string) +;; !regex + @string.regexp)) + (#match? @_name "^(match|not-match)$")) diff --git a/grammar/regex.scm b/grammar/regex.scm new file mode 100644 index 0000000..b97a14e --- /dev/null +++ b/grammar/regex.scm @@ -0,0 +1,77 @@ +;; ============================================================ +;; Punctuation / brackets +;; ============================================================ + +;; #B6BEC8 #000000 0 0 0 1 +[ + "(" + ")" + "(?" + "(?:" + "(?<" + "(?P<" + "(?P=" + ">" + "[" + "]" + "{" + "}" + "[:" + ":]" +] @punctuation.bracket + +;; #F29CC3 #000000 0 0 0 2 +(group_name) @property + +;; #F29668 #000000 0 0 0 1 +[ + "*" + "+" + "?" + "|" + "=" + "!" +] @operator + +;; #B8E986 #000000 0 0 0 2 +(count_quantifier + [ + (decimal_digits) @number + "," @punctuation.delimiter + ]) + +;; #F29668 #000000 0 0 0 2 +(inline_flags_group + "-"? @operator + ":"? @punctuation.delimiter) + +;; #F29CC3 #000000 0 0 0 2 +(flags) @character.special + +;; #C2E8FF #000000 0 0 0 2 +(character_class + [ + "^" @operator + (class_range "-" @operator) + ]) + +;; #D2A6FF #000000 0 0 0 2 +[ + (class_character) + (posix_class_name) +] @constant.character + +;; #D2A6FF #000000 0 0 0 2 +(pattern_character) @string + +;; #95E6CB #000000 0 0 0 2 +[ + (identity_escape) + (control_letter_escape) + (character_class_escape) + (control_escape) + (start_assertion) + (end_assertion) + (boundary_assertion) + (non_boundary_assertion) +] @escape diff --git a/grammar/ruby.scm b/grammar/ruby.scm index a834766..625666a 100644 --- a/grammar/ruby.scm +++ b/grammar/ruby.scm @@ -119,7 +119,7 @@ (superclass (constant) @type) -;; #F07178 #000000 0 0 0 1 +;; #F07178 #000000 0 0 0 2 [ (class_variable) (instance_variable) @@ -208,10 +208,6 @@ (hash_key_symbol) ] @string.special.symbol -;; #95E6CB #000000 0 0 0 2 -(regex - (string_content) @string.regexp) - ;; #95E6CB #000000 0 0 0 2 (escape_sequence) @string.escape @@ -322,219 +318,192 @@ ; Injections +;; !regex +(regex + (string_content) @string.regexp) + (heredoc_body ;; !bash (heredoc_content) @bash_injection ((heredoc_end) @lang - (#match? @lang "BASH")) -) + (#match? @lang "BASH"))) (heredoc_body ;; !c (heredoc_content) @c_injection ((heredoc_end) @lang - (#match? @lang "C$")) -) + (#match? @lang "C$"))) (heredoc_body ;; !cpp (heredoc_content) @cpp_injection ((heredoc_end) @lang - (#match? @lang "CPP")) -) + (#match? @lang "CPP"))) (heredoc_body ;; !css (heredoc_content) @css_injection ((heredoc_end) @lang - (#match? @lang "CSS")) -) + (#match? @lang "CSS"))) (heredoc_body ;; !fish (heredoc_content) @fish_injection ((heredoc_end) @lang - (#match? @lang "FISH")) -) + (#match? @lang "FISH"))) (heredoc_body ;; !go (heredoc_content) @go_injection ((heredoc_end) @lang - (#match? @lang "GO")) -) + (#match? @lang "GO"))) (heredoc_body ;; !haskell (heredoc_content) @haskell_injection ((heredoc_end) @lang - (#match? @lang "HASKELL")) -) + (#match? @lang "HASKELL"))) (heredoc_body ;; !html (heredoc_content) @html_injection ((heredoc_end) @lang - (#match? @lang "HTML")) -) + (#match? @lang "HTML"))) (heredoc_body ;; !javascript (heredoc_content) @javascript_injection ((heredoc_end) @lang - (#match? @lang "JAVASCRIPT")) -) + (#match? @lang "JAVASCRIPT"))) (heredoc_body ;; !json (heredoc_content) @json_injection ((heredoc_end) @lang - (#match? @lang "JSON")) -) + (#match? @lang "JSON"))) (heredoc_body ;; !lua (heredoc_content) @lua_injection ((heredoc_end) @lang - (#match? @lang "LUA")) -) + (#match? @lang "LUA"))) (heredoc_body ;; !make (heredoc_content) @make_injection ((heredoc_end) @lang - (#match? @lang "MAKE")) -) + (#match? @lang "MAKE"))) (heredoc_body ;; !python (heredoc_content) @python_injection ((heredoc_end) @lang - (#match? @lang "PYTHON")) -) + (#match? @lang "PYTHON"))) (heredoc_body ;; !ruby (heredoc_content) @ruby_injection ((heredoc_end) @lang - (#match? @lang "RUBY")) -) + (#match? @lang "RUBY"))) (heredoc_body ;; !rust (heredoc_content) @rust_injection ((heredoc_end) @lang - (#match? @lang "RUST")) -) + (#match? @lang "RUST"))) (heredoc_body ;; !diff (heredoc_content) @diff_injection ((heredoc_end) @lang - (#match? @lang "DIFF")) -) + (#match? @lang "DIFF"))) (heredoc_body ;; !embedded_template (heredoc_content) @embedded_template_injection ((heredoc_end) @lang - (#match? @lang "ERB")) -) + (#match? @lang "ERB"))) (heredoc_body ;; !gdscript (heredoc_content) @gdscript_injection ((heredoc_end) @lang - (#match? @lang "GDSCRIPT")) -) + (#match? @lang "GDSCRIPT"))) (heredoc_body ;; !gitattributes (heredoc_content) @gitattributes_injection ((heredoc_end) @lang - (#match? @lang "GITATTRIBUTES")) -) + (#match? @lang "GITATTRIBUTES"))) (heredoc_body ;; !gitignore (heredoc_content) @gitignore_injection ((heredoc_end) @lang - (#match? @lang "GITIGNORE")) -) + (#match? @lang "GITIGNORE"))) (heredoc_body ;; !gomod (heredoc_content) @gomod_injection ((heredoc_end) @lang - (#match? @lang "GOMOD")) -) + (#match? @lang "GOMOD"))) (heredoc_body ;; !ini (heredoc_content) @ini_injection ((heredoc_end) @lang - (#match? @lang "INI")) -) + (#match? @lang "INI"))) (heredoc_body ;; !markdown (heredoc_content) @markdown_injection ((heredoc_end) @lang - (#match? @lang "MARKDOWN")) -) + (#match? @lang "MARKDOWN"))) (heredoc_body ;; !nginx (heredoc_content) @nginx_injection ((heredoc_end) @lang - (#match? @lang "NGINX")) -) + (#match? @lang "NGINX"))) (heredoc_body ;; !php (heredoc_content) @php_injection ((heredoc_end) @lang - (#match? @lang "PHP")) -) + (#match? @lang "PHP"))) (heredoc_body ;; !query (heredoc_content) @query_injection ((heredoc_end) @lang - (#match? @lang "QUERY")) -) + (#match? @lang "QUERY"))) (heredoc_body ;; !regex (heredoc_content) @regex_injection ((heredoc_end) @lang - (#match? @lang "REGEX")) -) + (#match? @lang "REGEX"))) (heredoc_body ;; !sql (heredoc_content) @sql_injection ((heredoc_end) @lang - (#match? @lang "SQL")) -) + (#match? @lang "SQL"))) (heredoc_body ;; !toml (heredoc_content) @toml_injection ((heredoc_end) @lang - (#match? @lang "TOML")) -) + (#match? @lang "TOML"))) (heredoc_body ;; !yaml (heredoc_content) @yaml_injection ((heredoc_end) @lang - (#match? @lang "YAML")) -) + (#match? @lang "YAML"))) (heredoc_body ;; !cabal (heredoc_content) @cabal_injection ((heredoc_end) @lang - (#match? @lang "CABAL")) -) + (#match? @lang "CABAL"))) diff --git a/grammar/rust.scm b/grammar/rust.scm new file mode 100644 index 0000000..57c544b --- /dev/null +++ b/grammar/rust.scm @@ -0,0 +1,663 @@ +; ============================================================ +; Identifiers & Modules +; ============================================================ + +;; #82AAFF #000000 0 0 0 1 +(shebang) @keyword.directive1 + +;; #E5C07B #000000 0 0 0 1 +(identifier) @variable1 + +;; #A6E22E #000000 0 0 0 2 +((identifier) @type1 + (#match? @type1 "^[A-Z]")) + +;; #FFD700 #000000 0 0 0 2 +(const_item + name: (identifier) @constant1) + +;; #FF9E64 #000000 0 0 0 3 +((identifier) @constant2 + (#match? @constant2 "^[A-Z][A-Z%d_]*$")) + +;; #7DCFFF #000000 0 0 0 4 +(type_identifier) @type2 + +;; #7DCFFF #000000 0 0 0 2 +(primitive_type) @type.builtin1 + +;; #C678DD #000000 0 0 0 2 +(field_identifier) @variable.member1 + +;; #C678DD #000000 0 0 0 2 +(shorthand_field_identifier) @variable.member2 + +;; #C678DD #000000 0 0 0 2 +(shorthand_field_initializer + (identifier) @variable.member3) + +;; #61AFEF #000000 0 0 0 2 +(mod_item + name: (identifier) @module1) + +;; #D19A66 #000000 0 0 0 2 +(self) @variable.builtin1 + +;; #5C6370 #000000 0 0 0 1 +"_" @character.special1 + +;; #61AFEF #000000 0 0 1 2 +(label + [ + "'" + (identifier) + ] @label1) + +; ============================================================ +; Functions & Parameters +; ============================================================ + +;; #FFB454 #000000 0 0 0 3 +(function_item + (identifier) @function1) + +;; #FFB454 #000000 0 0 0 3 +(function_signature_item + (identifier) @function2) + +;; #D2A6FF #000000 0 0 0 1 +(parameter + [ + (identifier) + "_" + ] @variable.parameter1) + +;; #D2A6FF #000000 0 0 0 1 +(parameter + (ref_pattern + [ + (mut_pattern + (identifier) @variable.parameter2) + (identifier) @variable.parameter3 + ])) + +;; #D2A6FF #000000 0 0 0 1 +(closure_parameters + (_) @variable.parameter4) + +; ============================================================ +; Function Calls & Constructors +; ============================================================ + +;; #FFB454 #000000 0 0 0 2 +(call_expression + function: (identifier) @function.call1) + +;; #FFB454 #000000 0 0 0 2 +(call_expression + function: (scoped_identifier + (identifier) @function.call2 .)) + +;; #FFB454 #000000 0 0 0 2 +(call_expression + function: (field_expression + field: (field_identifier) @function.call3)) + +;; #FFB454 #000000 0 0 0 2 +(generic_function + function: (identifier) @function.call4) + +;; #FFB454 #000000 0 0 0 2 +(generic_function + function: (scoped_identifier + name: (identifier) @function.call5)) + +;; #FFB454 #000000 0 0 0 2 +(generic_function + function: (field_expression + field: (field_identifier) @function.call6)) + +;; #9ADE7A #000000 0 0 0 32 +((field_identifier) @constant3 + (#match? @constant3 "^[A-Z]")) + +;; #9ADE7A #000000 0 0 0 32 +(enum_variant + name: (identifier) @constant4) + +; ============================================================ +; Scoped Identifiers & Paths +; ============================================================ + +;; #82AAFF #000000 0 0 0 9 +(scoped_identifier + path: (identifier) @module2) + +;; #82AAFF #000000 0 0 0 9 +(scoped_identifier + (scoped_identifier + name: (identifier) @module3)) + +;; #7DCFFF #000000 0 0 0 9 +(scoped_type_identifier + path: (identifier) @module4) + +;; #7DCFFF #000000 0 0 0 9 +(scoped_type_identifier + path: (identifier) @type3 + (#match? @type3 "^[A-Z]")) + +;; #7DCFFF #000000 0 0 0 9 +(scoped_type_identifier + (scoped_identifier + name: (identifier) @module5)) + +;; #7DCFFF #000000 0 0 0 9 +((scoped_identifier + path: (identifier) @type4) + (#match? @type4 "^[A-Z]")) + +;; #7DCFFF #000000 0 0 0 9 +((scoped_identifier + name: (identifier) @type5) + (#match? @type5 "^[A-Z]")) + +;; #FFD700 #000000 0 0 0 7 +((scoped_identifier + name: (identifier) @constant5) + (#match? @constant5 "^[A-Z][A-Z%d_]*$")) + +;; #FFD700 #000000 0 0 0 7 +((scoped_identifier + path: (identifier) @type6 + name: (identifier) @constant6) + (#match? @type6 "^[A-Z]") + (#match? @constant6 "^[A-Z]")) + +;; #FFD700 #000000 0 0 0 7 +((scoped_type_identifier + path: (identifier) @type7 + name: (type_identifier) @constant7) + (#match? @type7 "^[A-Z]") + (#match? @constant7 "^[A-Z]")) + +;; #61AFEF #000000 0 0 0 0 +[ + (crate) + (super) +] @module6 + +;; #61AFEF #000000 0 0 0 0 +(scoped_use_list + path: (identifier) @module7) + +;; #61AFEF #000000 0 0 0 0 +(scoped_use_list + path: (scoped_identifier + (identifier) @module8)) + +;; #7DCFFF #000000 0 0 0 0 +(use_list + (scoped_identifier + (identifier) @module9 + . + (_))) + +;; #7DCFFF #000000 0 0 0 0 +(use_list + (identifier) @type8 + (#match? @type8 "^[A-Z]")) + +;; #7DCFFF #000000 0 0 0 0 +(use_as_clause + alias: (identifier) @type9 + (#match? @type9 "^[A-Z]")) + +; ============================================================ +; Enum Constructors & Match Arms +; ============================================================ + +;; #9ADE7A #000000 0 0 0 9 +; Correct enum constructors +(call_expression + function: (scoped_identifier + "::" + name: (identifier) @constant8) + (#match? @constant8 "^[A-Z]")) + +;; #FFD700 #000000 0 0 0 2 +; Assume uppercase names in a match arm are constants. +((match_arm + pattern: (match_pattern + (identifier) @constant9)) + (#match? @constant9 "^[A-Z]")) + +;; #FFD700 #000000 0 0 0 2 +((match_arm + pattern: (match_pattern + (scoped_identifier + name: (identifier) @constant10))) + (#match? @constant10 "^[A-Z]")) + +;; #D2A6FF #000000 0 0 0 3 +((identifier) @constant.builtin1 + (#match? @constant.builtin1 "^(Some|None|Ok|Err)$")) + +; ============================================================ +; Macros +; ============================================================ + +;; #FF8F40 #000000 0 0 0 2 +"$" @function.macro1 + +;; #FF8F40 #000000 0 0 0 2 +(metavariable) @function.macro2 + +;; #FF8F40 #000000 0 0 0 2 +(macro_definition + "macro_rules!" @function.macro3) + +;; #FF8F40 #000000 0 0 0 2 +(attribute_item + (attribute + (identifier) @function.macro4)) + +;; #FF8F40 #000000 0 0 0 2 +(inner_attribute_item + (attribute + (identifier) @function.macro5)) + +;; #FF8F40 #000000 0 0 0 2 +(attribute + (scoped_identifier + (identifier) @function.macro6 .)) + +;; #FF8F40 #000000 0 0 0 2 +(macro_invocation + macro: (identifier) @function.macro7) + +;; #FF8F40 #000000 0 0 0 2 +(macro_invocation + macro: (scoped_identifier + (identifier) @function.macro8 .)) + +; ============================================================ +; Literals +; ============================================================ + +;; #D2A6FF #000000 0 0 0 1 +(boolean_literal) @boolean1 + +;; #D2A6FF #000000 0 0 0 1 +(integer_literal) @number1 + +;; #D2A6FF #000000 0 0 0 1 +(float_literal) @number.float1 + +;; #AAD94C #000000 0 0 0 0 +[ + (raw_string_literal) + (string_literal) +] @string1 + +;; #AAD94C #000000 0 0 0 0 +(escape_sequence) @string.escape1 + +;; #F07178 #000000 0 0 0 1 +(char_literal) @character1 + +; ============================================================ +; Keywords +; ============================================================ + +;; #FF8F40 #000000 0 0 0 1 +[ + "use" + "mod" +] @keyword.import1 + +;; #FF8F40 #000000 0 0 0 1 +(use_as_clause + "as" @keyword.import2) + +;; #FF8F40 #000000 0 0 0 1 +[ + "default" + "impl" + "let" + "move" + "unsafe" + "where" +] @keyword1 + +;; #FF8F40 #000000 0 0 0 1 +[ + "enum" + "struct" + "union" + "trait" + "type" +] @keyword.type1 + +;; #82AAFF #000000 0 0 0 1 +[ + "async" + "await" + "gen" +] @keyword.coroutine1 + +;; #FF6347 #000000 0 0 0 1 +"try" @keyword.exception1 + +;; #FF8F40 #000000 0 0 0 1 +[ + "ref" + "pub" + "raw" + (mutable_specifier) + "const" + "static" + "dyn" + "extern" +] @keyword.modifier1 + +;; #FF8F40 #000000 0 0 0 1 +(lifetime + "'" @keyword.modifier2) + +;; #9ADE7A #000000 0 0 0 5 +(lifetime + (identifier) @attribute1) + +;; #9ADE7A #000000 0 0 0 5 +(lifetime + (identifier) @attribute.builtin1 + (#match? @attribute.builtin1 "^(static|_)$")) + +;; #FF8F40 #000000 0 0 0 1 +"fn" @keyword.function1 + +;; #FF8F40 #000000 0 0 0 1 +[ + "return" + "yield" +] @keyword.return1 + +;; #F29668 #000000 0 0 0 1 +(type_cast_expression + "as" @keyword.operator1) + +;; #F29668 #000000 0 0 0 1 +(qualified_type + "as" @keyword.operator2) + +;; #61AFEF #000000 0 0 0 9 +(use_list + (self) @module10) + +;; #61AFEF #000000 0 0 0 9 +(scoped_use_list + (self) @module11) + +;; #61AFEF #000000 0 0 0 9 +(scoped_identifier + [ + (crate) + (super) + (self) + ] @module12) + +;; #61AFEF #000000 0 0 0 9 +(visibility_modifier + [ + (crate) + (super) + (self) + ] @module13) + +;; #FF8F40 #000000 0 0 0 1 +[ + "if" + "else" + "match" +] @keyword.conditional1 + +;; #FF8F40 #000000 0 0 0 1 +[ + "break" + "continue" + "in" + "loop" + "while" +] @keyword.repeat1 + +;; #FF8F40 #000000 0 0 0 1 +"for" @keyword2 + +;; #FF8F40 #000000 0 0 0 1 +(for_expression + "for" @keyword.repeat2) + +; ============================================================ +; Operators +; ============================================================ + +;; #F29668 #000000 0 1 0 1 +[ + "!" + "!=" + "%" + "%=" + "&" + "&&" + "&=" + "*" + "*=" + "+" + "+=" + "-" + "-=" + ".." + "..=" + "..." + "/" + "/=" + "<" + "<<" + "<<=" + "<=" + "=" + "==" + ">" + ">=" + ">>" + ">>=" + "?" + "@" + "^" + "^=" + "|" + "|=" + "||" +] @operator1 + +;; #BFBDB6 #000000 0 0 0 1 +(use_wildcard + "*" @character.special2) + +;; #BFBDB6 #000000 0 0 0 1 +(remaining_field_pattern + ".." @character.special3) + +;; #BFBDB6 #000000 0 0 0 1 +(range_pattern + [ + ".." + "..=" + "..." + ] @character.special4) + +; ============================================================ +; Punctuation +; ============================================================ + +;; #BFBDB6 #000000 0 0 0 1 +[ + "(" + ")" + "[" + "]" + "{" + "}" +] @punctuation.bracket1 + +;; #BFBDB6 #000000 0 0 0 1 +(closure_parameters + "|" @punctuation.bracket2) + +;; #BFBDB6 #000000 0 0 0 1 +(type_arguments + [ + "<" + ">" + ] @punctuation.bracket3) + +;; #BFBDB6 #000000 0 0 0 1 +(type_parameters + [ + "<" + ">" + ] @punctuation.bracket4) + +;; #BFBDB6 #000000 0 0 0 1 +(bracketed_type + [ + "<" + ">" + ] @punctuation.bracket5) + +;; #BFBDB6 #000000 0 0 0 1 +(for_lifetimes + [ + "<" + ">" + ] @punctuation.bracket6) + +;; #BFBDB6 #000000 0 1 0 1 +[ + "," + "." + ":" + "::" + ";" + "->" + "=>" +] @punctuation.delimiter1 + +;; #BFBDB6 #000000 0 0 0 1 +(attribute_item + "#" @punctuation.special1) + +;; #BFBDB6 #000000 0 0 0 1 +(inner_attribute_item + [ + "!" + "#" + ] @punctuation.special2) + +;; #FF8F40 #000000 0 0 0 2 +(macro_invocation + "!" @function.macro9) + +;; #7DCFFF #000000 0 0 0 1 +(never_type + "!" @type.builtin2) + +; ============================================================ +; Panic / Assert / Debug Macros +; ============================================================ + +;; #FF6347 #000000 0 0 0 2 +(macro_invocation + macro: (identifier) @_identifier1 @keyword.exception2 + "!" @keyword.exception2 + (#match? @_identifier1 "^panic$")) + +;; #FF8F40 #000000 0 0 0 2 +(macro_invocation + macro: (identifier) @_identifier2 @keyword.exception3 + "!" @keyword.exception3 + (#match? @_identifier2 "assert")) + +;; #7DCFFF #000000 0 0 0 2 +(macro_invocation + macro: (identifier) @_identifier3 @keyword.debug1 + "!" @keyword.debug1 + (#match? @_identifier3 "^dbg$")) + +; ============================================================ +; Comments +; ============================================================ + +;; #99ADBF #000000 0 1 0 1 +[ + (line_comment) + (block_comment) + (outer_doc_comment_marker) + (inner_doc_comment_marker) +] @comment1 + +(line_comment + (doc_comment)) @comment2 + +(block_comment + (doc_comment)) @comment3 + +; ============================================================ +; Regex Strings (highlighted) +; ============================================================ + +(call_expression + function: (scoped_identifier + path: (identifier) @_regex1 + (#match? @_regex1 "Regex") + name: (identifier) @_new1 + (#match? @_new1 "^new$")) + arguments: (arguments + (raw_string_literal +;; !regex + (string_content) @string.regexp))) + +(call_expression + function: (scoped_identifier + path: (scoped_identifier + (identifier) @_regex2 + (#match? @_regex2 "Regex") .) + name: (identifier) @_new2 + (#match? @_new2 "^new$")) + arguments: (arguments + (raw_string_literal + (string_content) @string.regexp))) + +(call_expression + function: (scoped_identifier + path: (identifier) @_regex3 + (#match? @_regex3 "Regex") + name: (identifier) @_new3 + (#match? @_new3 "^new$")) + arguments: (arguments + (array_expression + (raw_string_literal + (string_content) @string.regexp)))) + +(call_expression + function: (scoped_identifier + path: (scoped_identifier + (identifier) @_regex4 + (#match? @_regex4 "Regex") .) + name: (identifier) @_new4 + (#match? @_new4 "^new$")) + arguments: (arguments + (array_expression + (raw_string_literal + (string_content) @string.regexp)))) diff --git a/grammar/sql.scm b/grammar/sql.scm new file mode 100644 index 0000000..9b3e6bc --- /dev/null +++ b/grammar/sql.scm @@ -0,0 +1,469 @@ +;; #D2A6FF #000000 0 0 0 1 +(object_reference + name: (identifier) @type) + +;; #7dcfff #000000 0 0 0 2 +(invocation + (object_reference + name: (identifier) @function.call)) + +((term + value: (cast + name: (keyword_cast) @function.call + parameter: [(literal)]?))) + +[ + (keyword_gist) + (keyword_btree) + (keyword_hash) + (keyword_spgist) + (keyword_gin) + (keyword_brin) + (keyword_array) + (keyword_object_id) +] @function.call + +;; #D2A6FF #000000 0 0 0 1 +(relation + alias: (identifier) @variable) + +(term + alias: (identifier) @variable) + +;; #7dcfff #000000 0 0 0 2 +(field + name: (identifier) @field) + +;; #FF8F40 #000000 0 0 0 2 +((literal) @number + (#match? @number "^[-+0-9]+$")) + +;; #F29668 #000000 0 0 0 2 +((literal) @float + (#match? @float "^[-+0-9]+\\.[0-9]+$")) + +;; #AAD94C #000000 0 0 0 0 +(literal) @string + +;; #99ADBF #000000 0 1 0 1 +(comment) @comment @spell +(marginalia) @comment + +(parameter) @parameter + +;; #F29668 #000000 0 0 0 1 +[ + (keyword_true) + (keyword_false) +] @boolean + +;; #F07178 #000000 0 0 0 1 +[ + (keyword_asc) + (keyword_desc) + (keyword_terminated) + (keyword_escaped) + (keyword_unsigned) + (keyword_nulls) + (keyword_last) + (keyword_delimited) + (keyword_replication) + (keyword_auto_increment) + (keyword_default) + (keyword_collate) + (keyword_concurrently) + (keyword_engine) + (keyword_always) + (keyword_generated) + (keyword_preceding) + (keyword_following) + (keyword_first) + (keyword_current_timestamp) + (keyword_immutable) + (keyword_atomic) + (keyword_parallel) + (keyword_leakproof) + (keyword_safe) + (keyword_cost) + (keyword_strict) +] @attribute + +;; #7dcfff #000000 0 0 0 2 +[ + (keyword_materialized) + (keyword_recursive) + (keyword_temp) + (keyword_temporary) + (keyword_unlogged) + (keyword_external) + (keyword_parquet) + (keyword_csv) + (keyword_rcfile) + (keyword_textfile) + (keyword_orc) + (keyword_avro) + (keyword_jsonfile) + (keyword_sequencefile) + (keyword_volatile) +] @storageclass + +;; #F29668 #000000 0 0 0 1 +[ + (keyword_case) + (keyword_when) + (keyword_then) + (keyword_else) +] @conditional + +;; #D2A6FF #000000 0 0 0 1 +[ + (keyword_select) + (keyword_from) + (keyword_where) + (keyword_index) + (keyword_join) + (keyword_primary) + (keyword_delete) + (keyword_create) + (keyword_show) + (keyword_unload) + (keyword_insert) + (keyword_merge) + (keyword_distinct) + (keyword_replace) + (keyword_update) + (keyword_into) + (keyword_overwrite) + (keyword_matched) + (keyword_values) + (keyword_value) + (keyword_attribute) + (keyword_set) + (keyword_left) + (keyword_right) + (keyword_outer) + (keyword_inner) + (keyword_full) + (keyword_order) + (keyword_partition) + (keyword_group) + (keyword_with) + (keyword_without) + (keyword_as) + (keyword_having) + (keyword_limit) + (keyword_offset) + (keyword_table) + (keyword_tables) + (keyword_key) + (keyword_references) + (keyword_foreign) + (keyword_constraint) + (keyword_force) + (keyword_use) + (keyword_include) + (keyword_for) + (keyword_if) + (keyword_exists) + (keyword_column) + (keyword_columns) + (keyword_cross) + (keyword_lateral) + (keyword_natural) + (keyword_alter) + (keyword_drop) + (keyword_add) + (keyword_view) + (keyword_end) + (keyword_is) + (keyword_using) + (keyword_between) + (keyword_window) + (keyword_no) + (keyword_data) + (keyword_type) + (keyword_rename) + (keyword_to) + (keyword_schema) + (keyword_owner) + (keyword_authorization) + (keyword_all) + (keyword_any) + (keyword_some) + (keyword_returning) + (keyword_begin) + (keyword_commit) + (keyword_rollback) + (keyword_transaction) + (keyword_only) + (keyword_like) + (keyword_similar) + (keyword_over) + (keyword_change) + (keyword_modify) + (keyword_after) + (keyword_before) + (keyword_range) + (keyword_rows) + (keyword_groups) + (keyword_exclude) + (keyword_current) + (keyword_ties) + (keyword_others) + (keyword_zerofill) + (keyword_format) + (keyword_fields) + (keyword_row) + (keyword_sort) + (keyword_compute) + (keyword_comment) + (keyword_location) + (keyword_cached) + (keyword_uncached) + (keyword_lines) + (keyword_stored) + (keyword_virtual) + (keyword_partitioned) + (keyword_analyze) + (keyword_explain) + (keyword_verbose) + (keyword_truncate) + (keyword_rewrite) + (keyword_optimize) + (keyword_vacuum) + (keyword_cache) + (keyword_language) + (keyword_called) + (keyword_conflict) + (keyword_declare) + (keyword_filter) + (keyword_function) + (keyword_input) + (keyword_name) + (keyword_oid) + (keyword_oids) + (keyword_precision) + (keyword_regclass) + (keyword_regnamespace) + (keyword_regproc) + (keyword_regtype) + (keyword_restricted) + (keyword_return) + (keyword_returns) + (keyword_separator) + (keyword_setof) + (keyword_stable) + (keyword_support) + (keyword_tblproperties) + (keyword_trigger) + (keyword_unsafe) + (keyword_admin) + (keyword_connection) + (keyword_cycle) + (keyword_database) + (keyword_encrypted) + (keyword_increment) + (keyword_logged) + (keyword_none) + (keyword_owned) + (keyword_password) + (keyword_reset) + (keyword_role) + (keyword_sequence) + (keyword_start) + (keyword_restart) + (keyword_tablespace) + (keyword_split) + (keyword_tablets) + (keyword_until) + (keyword_user) + (keyword_valid) + (keyword_action) + (keyword_definer) + (keyword_invoker) + (keyword_security) + (keyword_extension) + (keyword_version) + (keyword_out) + (keyword_inout) + (keyword_variadic) + (keyword_ordinality) + (keyword_session) + (keyword_isolation) + (keyword_level) + (keyword_serializable) + (keyword_repeatable) + (keyword_read) + (keyword_write) + (keyword_committed) + (keyword_uncommitted) + (keyword_deferrable) + (keyword_names) + (keyword_zone) + (keyword_immediate) + (keyword_deferred) + (keyword_constraints) + (keyword_snapshot) + (keyword_characteristics) + (keyword_off) + (keyword_follows) + (keyword_precedes) + (keyword_each) + (keyword_instead) + (keyword_of) + (keyword_initially) + (keyword_old) + (keyword_new) + (keyword_referencing) + (keyword_statement) + (keyword_execute) + (keyword_procedure) + (keyword_copy) + (keyword_delimiter) + (keyword_encoding) + (keyword_escape) + (keyword_force_not_null) + (keyword_force_null) + (keyword_force_quote) + (keyword_freeze) + (keyword_header) + (keyword_match) + (keyword_program) + (keyword_quote) + (keyword_stdin) + (keyword_extended) + (keyword_main) + (keyword_plain) + (keyword_storage) + (keyword_compression) + (keyword_duplicate) + (keyword_while) +] @keyword + +;; #F07178 #000000 0 0 0 1 +[ + (keyword_restrict) + (keyword_unbounded) + (keyword_unique) + (keyword_cascade) + (keyword_delayed) + (keyword_high_priority) + (keyword_low_priority) + (keyword_ignore) + (keyword_nothing) + (keyword_check) + (keyword_option) + (keyword_local) + (keyword_cascaded) + (keyword_wait) + (keyword_nowait) + (keyword_metadata) + (keyword_incremental) + (keyword_bin_pack) + (keyword_noscan) + (keyword_stats) + (keyword_statistics) + (keyword_maxvalue) + (keyword_minvalue) +] @type.qualifier + +;; #7dcfff #000000 0 0 0 2 +[ + (keyword_int) + (keyword_null) + (keyword_boolean) + (keyword_binary) + (keyword_varbinary) + (keyword_image) + (keyword_bit) + (keyword_inet) + (keyword_character) + (keyword_smallserial) + (keyword_serial) + (keyword_bigserial) + (keyword_smallint) + (keyword_mediumint) + (keyword_bigint) + (keyword_tinyint) + (keyword_decimal) + (keyword_float) + (keyword_double) + (keyword_numeric) + (keyword_real) + (double) + (keyword_money) + (keyword_smallmoney) + (keyword_char) + (keyword_nchar) + (keyword_varchar) + (keyword_nvarchar) + (keyword_varying) + (keyword_text) + (keyword_string) + (keyword_uuid) + (keyword_json) + (keyword_jsonb) + (keyword_xml) + (keyword_bytea) + (keyword_enum) + (keyword_date) + (keyword_datetime) + (keyword_time) + (keyword_datetime2) + (keyword_datetimeoffset) + (keyword_smalldatetime) + (keyword_timestamp) + (keyword_timestamptz) + (keyword_geometry) + (keyword_geography) + (keyword_box2d) + (keyword_box3d) + (keyword_interval) +] @type.builtin + +;; #F29668 #000000 0 0 0 1 +[ + (keyword_in) + (keyword_and) + (keyword_or) + (keyword_not) + (keyword_by) + (keyword_on) + (keyword_do) + (keyword_union) + (keyword_except) + (keyword_intersect) +] @keyword.operator + +;; #F29668 #000000 0 1 0 1 +[ + "+" + "-" + "*" + "/" + "%" + "^" + ":=" + "=" + "<" + "<=" + "!=" + ">=" + ">" + "<>" + (op_other) + (op_unary_other) +] @operator + +;; #888888 #000000 0 0 0 1 +[ + "(" + ")" +] @punctuation.bracket + +;; #888888 #000000 0 1 0 1 +[ + ";" + "," + "." +] @punctuation.delimiter diff --git a/grammar/toml.scm b/grammar/toml.scm new file mode 100644 index 0000000..f5eb52a --- /dev/null +++ b/grammar/toml.scm @@ -0,0 +1,56 @@ +;; #F0F8FF #000000 0 0 0 2 +(bare_key) @type + +;; #FFFFFF #000000 0 0 0 1 +(quoted_key) @string.quoted + +;; #D2A6FF #000000 0 0 0 0 +(pair + (bare_key)) @property + +;; #D2A6FF #000000 0 0 0 0 +(pair + (dotted_key + (bare_key) @property)) + +;; #F29668 #000000 0 0 0 1 +(boolean) @boolean + +;; #99ADBF #000000 0 1 0 1 +(comment) @comment + +;; #AAD94C #000000 0 0 0 1 +(string) @string + +;; #7dcfff #000000 0 0 0 2 +[ + (integer) + (float) +] @number + +;; #FFFFFF #000000 0 0 0 1 +[ + (offset_date_time) + (local_date_time) + (local_date) + (local_time) +] @string.special + +;; #888888 #000000 0 1 0 3 +[ + "." + "," +] @punctuation.delimiter + +;; #F29668 #000000 0 0 0 1 +"=" @operator + +;; #888888 #000000 0 0 0 3 +[ + "[" + "]" + "[[" + "]]" + "{" + "}" +] @punctuation.bracket diff --git a/grammar/yaml.scm b/grammar/yaml.scm new file mode 100644 index 0000000..c7b02e5 --- /dev/null +++ b/grammar/yaml.scm @@ -0,0 +1,98 @@ +;; #F29668 #000000 0 0 0 1 +(boolean_scalar) @boolean + +;; #F07178 #000000 0 0 0 1 +(null_scalar) @constant.builtin + +;; #AAD94C #000000 0 0 0 0 +[ + (double_quote_scalar) + (single_quote_scalar) +] @string + +;; #FFFFFF #000000 0 0 0 0 +[ + (block_scalar) + (string_scalar) +] @string.abs + +;; #7dcfff #000000 0 0 0 2 +[ + (integer_scalar) + (float_scalar) +] @number + +;; #99ADBF #000000 0 1 0 1 +(comment) @comment + +;; #D2A6FF #000000 0 0 0 1 +[ + (anchor_name) + (alias_name) +] @label + +;; #7dcfff #000000 0 0 0 2 +(tag) @type + +;; #F07178 #000000 0 0 0 1 +[ + (yaml_directive) + (tag_directive) + (reserved_directive) +] @attribute + +;; #D2A6FF #000000 0 0 0 1 +(block_mapping_pair + key: (flow_node + [ + (double_quote_scalar) + (single_quote_scalar) + ] @property)) + +;; #D2A6FF #000000 0 0 0 1 +(block_mapping_pair + key: (flow_node + (plain_scalar + (string_scalar) @property))) + +;; #D2A6FF #000000 0 0 0 1 +(flow_mapping + (_ + key: (flow_node + [ + (double_quote_scalar) + (single_quote_scalar) + ] @property))) + +;; #D2A6FF #000000 0 0 0 1 +(flow_mapping + (_ + key: (flow_node + (plain_scalar + (string_scalar) @property)))) + +;; #F38BA8 #000000 0 1 0 3 +[ + "," + "-" + ":" + ">" + "?" + "|" +] @punctuation.delimiter + +;; #888888 #000000 0 0 0 3 +[ + "[" + "]" + "{" + "}" +] @punctuation.bracket + +;; #AAD94C #000000 0 1 0 3 +[ + "*" + "&" + "---" + "..." +] @punctuation.special diff --git a/include/maps.h b/include/maps.h index c8f55e0..8b3674f 100644 --- a/include/maps.h +++ b/include/maps.h @@ -37,6 +37,7 @@ static const std::unordered_map kLanguages = { {"make", {"make", LANG(make)}}, {"python", {"python", LANG(python)}}, {"ruby", {"ruby", LANG(ruby)}}, + {"rust", {"rust", LANG(rust)}}, {"diff", {"diff", LANG(diff)}}, {"embedded_template", {"embedded_template", LANG(embedded_template)}}, {"gdscript", {"gdscript", LANG(gdscript)}}, @@ -45,6 +46,7 @@ static const std::unordered_map kLanguages = { {"gomod", {"gomod", LANG(gomod)}}, {"ini", {"ini", LANG(ini)}}, {"markdown", {"markdown", LANG(markdown)}}, + {"markdown_inline", {"markdown_inline", LANG(markdown_inline)}}, {"nginx", {"nginx", LANG(nginx)}}, {"php", {"php", LANG(php)}}, {"query", {"query", LANG(query)}}, @@ -52,7 +54,6 @@ static const std::unordered_map kLanguages = { {"sql", {"sql", LANG(sql)}}, {"toml", {"toml", LANG(toml)}}, {"yaml", {"yaml", LANG(yaml)}}, - {"cabal", {"cabal", LANG(cabal)}}, }; static const std::unordered_map kExtToLang = { @@ -73,13 +74,17 @@ static const std::unordered_map kExtToLang = { {"html", "html"}, {"htm", "html"}, {"js", "javascript"}, + {"jsx", "javascript"}, {"json", "json"}, + {"jsonc", "json"}, {"lua", "lua"}, {"mk", "make"}, {"makefile", "make"}, {"py", "python"}, {"rb", "ruby"}, + {"rs", "rust"}, {"diff", "diff"}, + {"patch", "diff"}, {"erb", "embedded_template"}, {"etlua", "embedded_template"}, {"gd", "gdscript"}, @@ -87,6 +92,7 @@ static const std::unordered_map kExtToLang = { {"gitignore", "gitignore"}, {"mod", "gomod"}, {"ini", "ini"}, + {"gitmodules", "ini"}, {"md", "markdown"}, {"markdown", "markdown"}, {"conf", "nginx"}, @@ -97,7 +103,6 @@ static const std::unordered_map kExtToLang = { {"toml", "toml"}, {"yaml", "yaml"}, {"yml", "yaml"}, - {"cabal", "cabal"}, }; static const std::unordered_map kMimeToLang = { @@ -112,6 +117,7 @@ static const std::unordered_map kMimeToLang = { {"text/x-ruby", "ruby"}, {"text/x-go", "go"}, {"text/x-haskell", "haskell"}, + {"text/x-rust", "rust"}, {"text/x-lua", "lua"}, {"text/x-diff", "diff"}, {"text/x-embedded-template", "embedded_template"}, @@ -128,7 +134,6 @@ static const std::unordered_map kMimeToLang = { {"text/x-sql", "sql"}, {"text/x-toml", "toml"}, {"text/x-yaml", "yaml"}, - {"text/x-cabal", "cabal"}, }; #endif diff --git a/include/ts_def.h b/include/ts_def.h index e6a9cdc..05103a1 100644 --- a/include/ts_def.h +++ b/include/ts_def.h @@ -12,6 +12,7 @@ struct Language { uint8_t lsp_id = 0; }; +TS_DEF(ruby); TS_DEF(bash); TS_DEF(cpp); TS_DEF(css); @@ -22,25 +23,24 @@ TS_DEF(html); TS_DEF(javascript); TS_DEF(json); TS_DEF(lua); -TS_DEF(make); -TS_DEF(python); -TS_DEF(ruby); -TS_DEF(rust); -TS_DEF(diff); +TS_DEF(regex); +TS_DEF(query); +TS_DEF(markdown); +TS_DEF(markdown_inline); TS_DEF(embedded_template); -TS_DEF(gdscript); +TS_DEF(php); +TS_DEF(python); +TS_DEF(rust); +TS_DEF(sql); TS_DEF(gitattributes); TS_DEF(gitignore); TS_DEF(gomod); -TS_DEF(ini); -TS_DEF(markdown); TS_DEF(nginx); -TS_DEF(php); -TS_DEF(query); -TS_DEF(regex); -TS_DEF(sql); TS_DEF(toml); TS_DEF(yaml); -TS_DEF(cabal); +TS_DEF(ini); +TS_DEF(diff); +TS_DEF(make); +TS_DEF(gdscript); #endif diff --git a/libs/tree-sitter-cabal b/libs/tree-sitter-cabal deleted file mode 160000 index d1105d9..0000000 --- a/libs/tree-sitter-cabal +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d1105d9ed6156e4329e0dd92fddf1ea0adc933c6 diff --git a/samples/Makefile b/samples/Makefile new file mode 100644 index 0000000..d371a86 --- /dev/null +++ b/samples/Makefile @@ -0,0 +1,119 @@ +SRC_DIR := src +BIN_DIR := bin +OBJ_DIR := build +INCLUDE_DIR := include + +TARGET_DEBUG := $(BIN_DIR)/crib-dbg +TARGET_RELEASE := $(BIN_DIR)/crib + +PCH_DEBUG := $(OBJ_DIR)/debug/pch.h.gch +PCH_RELEASE := $(OBJ_DIR)/release/pch.h.gch + +CCACHE := ccache +CXX_DEBUG := $(CCACHE) g++ +CXX_RELEASE := $(CCACHE) clang++ + +CFLAGS_DEBUG := -std=c++20 -Wall -Wextra -O0 -fno-inline -gsplit-dwarf -g -fsanitize=address -fno-omit-frame-pointer +CFLAGS_RELEASE := -std=c++20 -O3 -march=native -flto=thin \ + -fno-exceptions -fno-rtti -fstrict-aliasing \ + -ffast-math -funroll-loops \ + -fvisibility=hidden \ + -fomit-frame-pointer -DNDEBUG -s \ + -mllvm -vectorize-loops \ + -fno-unwind-tables -fno-asynchronous-unwind-tables + +PCH_CFLAGS_DEBUG := $(CFLAGS_DEBUG) -x c++-header +PCH_CFLAGS_RELEASE := $(CFLAGS_RELEASE) -x c++-header + +UNICODE_SRC := $(wildcard libs/unicode_width/*.c) + +UNICODE_OBJ_DEBUG := $(patsubst libs/unicode_width/%.c,$(OBJ_DIR)/debug/unicode_width/%.o,$(UNICODE_SRC)) +UNICODE_OBJ_RELEASE := $(patsubst libs/unicode_width/%.c,$(OBJ_DIR)/release/unicode_width/%.o,$(UNICODE_SRC)) + +TREE_SITTER_LIBS := $(wildcard libs/tree-sitter-*/libtree-sitter*.a) + +PHP_LIB := libs/tree-sitter-php/php/libtree-sitter-php.a + +NGINX_OBJ_PARSER := libs/tree-sitter-nginx/build/Release/obj.target/tree_sitter_nginx_binding/src/parser.o + +GITIGNORE_OBJ_PARSER := libs/tree-sitter-gitignore/build/Release/obj.target/tree_sitter_ignore_binding/src/parser.o + +FISH_OBJ_PARSER := libs/tree-sitter-fish/build/Release/obj.target/tree_sitter_fish_binding/src/parser.o +FISH_OBJ_SCANNER := libs/tree-sitter-fish/build/Release/obj.target/tree_sitter_fish_binding/src/scanner.o + +MD_OBJ_PARSER := libs/tree-sitter-markdown/build/Release/obj.target/tree_sitter_markdown_binding/tree-sitter-markdown/src/parser.o +MD_OBJ_SCANNER := libs/tree-sitter-markdown/build/Release/obj.target/tree_sitter_markdown_binding/tree-sitter-markdown/src/scanner.o + +MD_I_OBJ_PARSER := libs/tree-sitter-markdown/build/Release/obj.target/tree_sitter_markdown_binding/tree-sitter-markdown-inline/src/parser.o +MD_I_OBJ_SCANNER := libs/tree-sitter-markdown/build/Release/obj.target/tree_sitter_markdown_binding/tree-sitter-markdown-inline/src/scanner.o + +LIBS := \ + libs/libgrapheme/libgrapheme.a \ + libs/tree-sitter/libtree-sitter.a \ + $(TREE_SITTER_LIBS) \ + $(PHP_LIB) \ + $(NGINX_OBJ_PARSER) \ + $(GITIGNORE_OBJ_PARSER) \ + $(FISH_OBJ_PARSER) \ + $(FISH_OBJ_SCANNER) \ + $(MD_OBJ_PARSER) \ + $(MD_OBJ_SCANNER) \ + $(MD_I_OBJ_PARSER) \ + $(MD_I_OBJ_SCANNER) \ + -lpcre2-8 -lmagic + +SRC := $(wildcard $(SRC_DIR)/*.cc) +OBJ_DEBUG := $(patsubst $(SRC_DIR)/%.cc,$(OBJ_DIR)/debug/%.o,$(SRC)) +OBJ_RELEASE := $(patsubst $(SRC_DIR)/%.cc,$(OBJ_DIR)/release/%.o,$(SRC)) + +DEP_DEBUG := $(OBJ_DEBUG:.o=.d) +DEP_RELEASE := $(OBJ_RELEASE:.o=.d) + +.PHONY: all test release clean + +all: debug + +test: $(TARGET_DEBUG) + +release: $(TARGET_RELEASE) + +$(PCH_DEBUG): $(INCLUDE_DIR)/pch.h + mkdir -p $(dir $@) + $(CXX_DEBUG) $(PCH_CFLAGS_DEBUG) -o $@ $< + +$(PCH_RELEASE): $(INCLUDE_DIR)/pch.h + mkdir -p $(dir $@) + $(CXX_RELEASE) $(PCH_CFLAGS_RELEASE) -o $@ $< + +$(TARGET_DEBUG): $(PCH_DEBUG) $(OBJ_DEBUG) $(UNICODE_OBJ_DEBUG) + mkdir -p $(BIN_DIR) + $(CXX_DEBUG) $(CFLAGS_DEBUG) -o $@ $(OBJ_DEBUG) $(UNICODE_OBJ_DEBUG) $(LIBS) + +$(TARGET_RELEASE): $(PCH_RELEASE) $(OBJ_RELEASE) $(UNICODE_OBJ_RELEASE) + mkdir -p $(BIN_DIR) + $(CXX_RELEASE) $(CFLAGS_RELEASE) -o $@ $(OBJ_RELEASE) $(UNICODE_OBJ_RELEASE) $(LIBS) + +$(OBJ_DIR)/debug/%.o: $(SRC_DIR)/%.cc $(PCH_DEBUG) + mkdir -p $(dir $@) + $(CXX_DEBUG) $(CFLAGS_DEBUG) -include $(INCLUDE_DIR)/pch.h -MMD -MP -c $< -o $@ + +$(OBJ_DIR)/release/%.o: $(SRC_DIR)/%.cc $(PCH_RELEASE) + mkdir -p $(dir $@) + $(CXX_RELEASE) $(CFLAGS_RELEASE) -include $(INCLUDE_DIR)/pch.h -MMD -MP -c $< -o $@ + +$(OBJ_DIR)/debug/unicode_width/%.o: libs/unicode_width/%.c + mkdir -p $(dir $@) + $(CXX_DEBUG) $(CFLAGS_DEBUG) -MMD -MP -c $< -o $@ + +$(OBJ_DIR)/release/unicode_width/%.o: libs/unicode_width/%.c + mkdir -p $(dir $@) + $(CXX_RELEASE) $(CFLAGS_RELEASE) -MMD -MP -c $< -o $@ + +DEP_DEBUG += $(UNICODE_OBJ_DEBUG:.o=.d) +DEP_RELEASE += $(UNICODE_OBJ_RELEASE:.o=.d) + +-include $(DEP_DEBUG) +-include $(DEP_RELEASE) + +clean: + rm -rf $(OBJ_DIR) $(BIN_DIR) diff --git a/samples/css.css b/samples/css.css new file mode 100644 index 0000000..2b46c65 --- /dev/null +++ b/samples/css.css @@ -0,0 +1,70 @@ +/* === Basic selectors === */ +body { + margin: 0; + font-family: system-ui, sans-serif; + background: #121212; + color: #eee; +} + +/* Class + ID + attribute */ +#main.container[data-theme="dark"] { + padding: 1rem; + border: 1px solid rgba(255, 255, 255, 0.2); +} + +/* Pseudo-classes & elements */ +a:hover, +a:focus-visible { + color: hsl(210, 80%, 60%); + text-decoration: underline; +} + +input::placeholder { + color: #999; +} + +/* CSS variables */ +:root { + --accent: #4fc3f7; + --spacing: 1rem; +} + +.button { + background: var(--accent); + padding: calc(var(--spacing) * 1.5); +} + +/* Media query */ +@media (max-width: 768px) { + .container { + padding: 0.5rem; + } +} + +/* Keyframes */ +@keyframes fade-in { + from { + opacity: 0; + transform: translateY(10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* Animation usage */ +.modal { + animation: fade-in 250ms ease-out; +} + +/* Complex selector */ +ul > li:not(:last-child)::after { + content: "•"; + margin-left: 0.5em; +} + +/* Edge cases */ +[data-value^="test"]::before { + content: attr(data-value); +} diff --git a/samples/diff.patch b/samples/diff.patch new file mode 100644 index 0000000..7adfaf0 --- /dev/null +++ b/samples/diff.patch @@ -0,0 +1,102 @@ +--- ./samples/toml.toml 2025-12-26 19:02:50.480936043 +0000 ++++ ./samples/yaml.yml 2025-12-26 19:03:27.879765974 +0000 +@@ -2,52 +2,65 @@ + # Basic types + # ============================================================ + +-title = "Example TOML Configuration" +-enabled = true +-count = 42 +-pi = 3.14159 +-empty = "" ++title: "Example YAML Configuration" ++enabled: true ++count: 42 ++pi: 3.14159 ++empty: "" + + # ============================================================ +-# Arrays ++# Arrays / Lists + # ============================================================ +-fruits = ["apple", "banana", "cherry"] +-numbers = [1, 2, 3, 4, 5] ++fruits: ++ - apple ++ - banana ++ - cherry + +-# Nested array +-matrix = [[1, 2], [3, 4]] ++numbers: ++ - 1 ++ - 2 ++ - 3 ++ - 4 ++ - 5 ++ ++matrix: ++ - [1, 2] ++ - [3, 4] + + # ============================================================ +-# Tables ++# Nested objects / maps + # ============================================================ +-[owner] +-name = "Alice" +-dob = 1979-05-27T07:32:00Z +- +-[database] +-server = "192.168.1.1" +-ports = [ 8001, 8001, 8002 ] +-connection_max = 5000 +-enabled = true ++owner: ++ name: Alice ++ dob: 1979-05-27T07:32:00Z + +-[servers.alpha] +-ip = "10.0.0.1" +-dc = "east" ++database: ++ server: 192.168.1.1 ++ ports: ++ - 8001 ++ - 8001 ++ - 8002 ++ connection_max: 5000 ++ enabled: true + +-[servers.beta] +-ip = "10.0.0.2" +-dc = "west" ++servers: ++ alpha: ++ ip: 10.0.0.1 ++ dc: east ++ beta: ++ ip: 10.0.0.2 ++ dc: west + + # ============================================================ +-# Inline tables ++# Multiline string + # ============================================================ +-clients = { name = "Bob", age = 30, active = true } ++description: | ++ This is a YAML file ++ used for testing syntax highlighting. ++ It supports multiple lines. + + # ============================================================ +-# Multiline strings ++# Special characters + # ============================================================ +-description = """ +-This is a TOML file +-used for testing syntax highlighting. +-It supports multiple lines. +-""" ++regex_pattern: "^[A-Za-z0-9_]+$" ++path: "C:\\Users\\Alice\\Documents" diff --git a/samples/embedded_template.erb b/samples/embedded_template.erb new file mode 100644 index 0000000..dec57d1 --- /dev/null +++ b/samples/embedded_template.erb @@ -0,0 +1,71 @@ +<%# app/views/users/show.html.erb %> + + + + + + <%= @user.name %> — Profile + + <%# Inline Ruby expression %> + + + <% if @dark_mode %> + + <% end %> + + + + +
+

Welcome, <%= @user.name %>

+

+ Member since <%= @user.created_at.strftime("%Y") %> +

+
+ + <% if @user.admin? %> +
+

Admin Tools

+
    + <% @tools.each do |tool| %> +
  • <%= tool.title %>
  • + <% end %> +
+
+ <% else %> +

You do not have admin privileges.

+ <% end %> + +
+ <% @posts.each do |post| %> +
+

<%= post.title %>

+

<%= truncate(post.body, length: 140) %>

+ + <%# Conditional rendering %> + <% if post.published? %> + Published + <% else %> + Draft + <% end %> +
+ <% end %> +
+ +
+

© <%= Time.now.year %> Example Corp

+ <%= link_to "Privacy Policy", "/privacy" %> +
+ + + + diff --git a/samples/fish.fish b/samples/fish.fish new file mode 100644 index 0000000..720e527 --- /dev/null +++ b/samples/fish.fish @@ -0,0 +1,92 @@ +#!/usr/bin/env fish +# Fish highlighting torture test 🐟 + +# === Variables === +set normal_var "hello" +set -l local_var 123 +set -gx GLOBAL_VAR "world" +set PATH $PATH /usr/local/bin +set --erase OLD_VAR + +# Builtin variables +echo $HOME $PWD $USER $FISH_VERSION + +# === Strings === +set single 'single quoted string' +set double "double quoted $normal_var" +set escaped "newline\n tab\t dollar\$" + +# === Conditionals === +if test $normal_var = "hello" + echo "equal" +else if test $normal_var != "world" + echo "not equal" +end + +# === Logical operators === +true and echo "yes" +false or echo "fallback" +not false + +# === Arithmetic === +set x 10 +set y 20 +math "$x + $y" +if test (math "$x * 2") -gt 15 + echo "math works" +end + +# === Loops === +for i in 1 2 3 + echo "loop $i" +end + +while test $x -gt 0 + set x (math "$x - 1") +end + +# === Functions === +function greet --argument name + echo "Hello $name" +end + +greet "world" + +# === Command substitution === +set files (ls | grep ".fish") + +# === Redirections === +echo "output" > /tmp/fish_test.txt +cat < /tmp/fish_test.txt >> /tmp/fish_log.txt + +# === Process substitution === +diff (ls /bin) (ls /usr/bin) + +# === Case statement === +switch $argv[1] + case start + echo "Starting" + case stop + echo "Stopping" + case '*' + echo "Unknown" +end + +# === Subshell === +begin + echo "inside begin/end" +end + +# === Comments & operators === +# && || | & ! should all highlight +true && echo "ok" || echo "fail" + +# === Regex === +string match -r '^[a-z]+$' "hello" + +# === Test builtin === +test -f /etc/passwd +test ! -d /does/not/exist + +# === Exit === +exit 0 diff --git a/samples/gdscript.gd b/samples/gdscript.gd new file mode 100644 index 0000000..9af20b6 --- /dev/null +++ b/samples/gdscript.gd @@ -0,0 +1,81 @@ +# Sample GDScript for syntax highlighting + +extends Node2D + +# ============================================================ +# Constants +# ============================================================ +const MAX_HEALTH = 100 +const PLAYER_SPEED = 200 +const PI_APPROX = 3.14159 + +# ============================================================ +# Exported variables +# ============================================================ +@export var player_name: String = "Hero" +@export var is_alive: bool = true + +# ============================================================ +# Signals +# ============================================================ +signal health_changed(new_health) + +# ============================================================ +# Member variables +# ============================================================ +var health: int = MAX_HEALTH +var velocity: Vector2 = Vector2.ZERO +var inventory: Array = [] + +# ============================================================ +# Functions +# ============================================================ +func _ready() -> void: + print("Player ready:", player_name) + _initialize_inventory() + set_process(true) + +func _process(delta: float) -> void: + if is_alive: + _handle_input(delta) + _check_health() + +# Private functions +func _initialize_inventory() -> void: + inventory.append("Sword") + inventory.append("Shield") + +func _handle_input(delta: float) -> void: + var direction: Vector2 = Vector2.ZERO + if Input.is_action_pressed("ui_right"): + direction.x += 1 + if Input.is_action_pressed("ui_left"): + direction.x -= 1 + if Input.is_action_pressed("ui_down"): + direction.y += 1 + if Input.is_action_pressed("ui_up"): + direction.y -= 1 + + velocity = direction.normalized() * PLAYER_SPEED + position += velocity * delta + +func _check_health() -> void: + if health <= 0: + is_alive = false + print("Player is dead!") + else: + emit_signal("health_changed", health) + +# ============================================================ +# Example of class definition inside another script +# ============================================================ +class Weapon: + var name: String + var damage: int + + func _init(name: String, damage: int): + self.name = name + self.damage = damage + + func attack(): + print(name, "attacks for", damage, "damage") diff --git a/samples/go.go b/samples/go.go new file mode 100644 index 0000000..61067ce --- /dev/null +++ b/samples/go.go @@ -0,0 +1,95 @@ +// file: go.go +package example_test + +import ( + "context" + "fmt" + "math" + "sync" + "testing" + "time" +) + +// Simple interface +type Adder interface { + Add(a, b int) int +} + +// Concrete implementation +type Calculator struct{} + +func (Calculator) Add(a, b int) int { + return a + b +} + +// Generic helper +func Max[T ~int | ~float64](a, b T) T { + if a > b { + return a + } + return b +} + +// Table-driven test +func TestAdd(t *testing.T) { + tests := []struct { + name string + a, b int + expected int + }{ + {"positive", 2, 3, 5}, + {"negative", -2, -3, -5}, + {"mixed", -2, 5, 3}, + } + + var calc Adder = Calculator{} + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := calc.Add(tt.a, tt.b); got != tt.expected { + t.Fatalf("Add(%d, %d) = %d; want %d", + tt.a, tt.b, got, tt.expected) + } + }) + } +} + +// Concurrency + context test +func TestWorker(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) + defer cancel() + + ch := make(chan int) + var wg sync.WaitGroup + + wg.Add(1) + go func() { + defer wg.Done() + select { + case ch <- 42: + case <-ctx.Done(): + } + }() + + select { + case v := <-ch: + if v != 42 { + t.Errorf("unexpected value: %d", v) + } + case <-ctx.Done(): + t.Fatal("timed out") + } + + wg.Wait() +} + +// Raw string + math edge case +func TestRawString(t *testing.T) { + raw := `line 1 +line 2 +\t not escaped +` + if len(raw) == 0 || math.IsNaN(float64(len(raw))) { + t.Fatal("impossible condition reached") + } +} diff --git a/samples/go.mod b/samples/go.mod new file mode 100644 index 0000000..dbde0aa --- /dev/null +++ b/samples/go.mod @@ -0,0 +1,32 @@ +module github.com/example/project + +go 1.21 + +// ============================== +// Direct dependencies +// ============================== +require ( + github.com/sirupsen/logrus v1.10.0 + golang.org/x/net v0.10.0 + github.com/pkg/errors v0.9.2 // indirect +) + +// ============================== +// Replace dependencies +// ============================== +replace ( + github.com/old/dependency v1.2.3 => github.com/new/dependency v1.2.4 + golang.org/x/oldnet => golang.org/x/net v0.11.0 +) + +// ============================== +// Exclude dependencies +// ============================== +exclude github.com/bad/dependency v1.0.0 + +// ============================== +// Indirect dependencies +// ============================== +require ( + github.com/another/pkg v1.3.0 // indirect +) diff --git a/samples/haskell.hs b/samples/haskell.hs new file mode 100644 index 0000000..819d5fa --- /dev/null +++ b/samples/haskell.hs @@ -0,0 +1,59 @@ +-- File: haskell.hs +{-# LANGUAGE GADTs, TypeFamilies #-} + +module SyntaxTest where + +import Data.List (sort) +import qualified Data.Map as Map + +-- Simple data type +data Person = Person + { name :: String + , age :: Int + } deriving (Show, Eq) + +-- GADT +data Expr a where + I :: Int -> Expr Int + B :: Bool -> Expr Bool + Add :: Expr Int -> Expr Int -> Expr Int + Eq :: Expr Int -> Expr Int -> Expr Bool + +-- Type class +class Describable a where + describe :: a -> String + +instance Describable Person where + describe (Person n a) = n ++ " is " ++ show a ++ " years old." + +-- Function with pattern matching +sumList :: [Int] -> Int +sumList [] = 0 +sumList (x:xs) = x + sumList xs + +-- Lambda and higher-order functions +applyTwice :: (a -> a) -> a -> a +applyTwice f x = f (f x) + +-- Infix operator +infixl 6 +++ +(+++) :: Int -> Int -> Int +a +++ b = a + b + +-- IO function +main :: IO () +main = do + let people = [Person "Alice" 30, Person "Bob" 25] + mapM_ (putStrLn . describe) people + print $ sumList [1..10] + print $ applyTwice (+1) 5 + print $ 3 +++ 4 + print $ Eq (I 2) (Add (I 1) (I 1)) + +-- Quasi-quote example +someExpr :: Expr Int +someExpr = [| Add (I 5) (I 7) |] + +-- Comments and Haddocks +-- | This is a Haddock comment +-- explaining the module and functions diff --git a/samples/html.html b/samples/html.html new file mode 100644 index 0000000..0ed74b7 --- /dev/null +++ b/samples/html.html @@ -0,0 +1,87 @@ + + + + + Injection Test + + + + + + + + + + + + + + + + + + + + + + + +

Main Heading

+

Subheading H2

+ +

+ This paragraph has an inline style +

+ +

+ This is strong text, bold also, + italic text, emphasized, underlined, + strikethrough, deleted text, inline code, + keyboard input. +

+ + + + + + + + + + + + + + + diff --git a/samples/ini.ini b/samples/ini.ini new file mode 100644 index 0000000..b906bef --- /dev/null +++ b/samples/ini.ini @@ -0,0 +1,41 @@ +; ===================================================== +; Sample INI Configuration +; ===================================================== + +[general] +app_name = MyApp +version = 1.2.3 +debug = true +max_users = 100 + +[database] +host = localhost +port = 5432 +user = admin +password = secret +timeout = 30 + +[paths] +log_dir = /var/log/myapp +data_dir = ./data +cache_dir = ./cache + +[features] +enable_feature_x = true +enable_feature_y = false +feature_list = item1, item2, item3 + +[servers] +server1 = 192.168.1.10 +server2 = 192.168.1.11 +server3 = 192.168.1.12 + +; Nested sections (some parsers support this) +[servers.backup] +server1 = 192.168.2.10 +server2 = 192.168.2.11 + +; Comments and special characters +; This is a comment line +; Values can also contain special characters like !@#$%^&*() +special_value = !@#$%^&*()_+|~= diff --git a/samples/javascript.js b/samples/javascript.js new file mode 100644 index 0000000..5575dca --- /dev/null +++ b/samples/javascript.js @@ -0,0 +1,147 @@ +/* =============================== + * JavaScript Syntax Torture Test + * =============================== */ + +'use strict'; + +// === Imports === +import fs, { readFileSync as rfs } from "fs"; +import * as path from "path"; +import defaultExport, { named as alias } from "./module.js"; + +// === Constants === +const PI = 3.141592653589793; +const HEX = 0xff; +const BIN = 0b101010; +const OCT = 0o755; +const BIG = 123_456_789n; + +// === Variables === +let x = null; +var y = undefined; +let z = NaN; + +// === Strings === +const s1 = "double quotes"; +const s2 = 'single quotes'; +const s3 = `template literal ${1 + 2}`; +const s4 = `multi +line +template`; +const s5 = String.raw`raw \n string`; + +// === Escapes === +const esc = "\n\t\r\b\f\\\"\'\u00A9\x41"; + +// === Arrays & Objects === +const arr = [1, , 3, ...[4, 5], { a: 1, b: { c: 2 } }]; +const obj = { + key: "value", + "weird-key": 123, + ['dyn' + 'amic']: true, + method() {}, + async asyncMethod() {}, + *generator() { yield 1; }, +}; + +// === Destructuring === +const { a, b: renamed, ...rest } = obj; +const [x1, , x3 = 42] = arr; + +// === Functions === +function normal(a, b = 1, ...rest) { + return a + b + rest.length; +} + +const arrow = (x = 0) => x * x; +const asyncArrow = async () => await Promise.resolve(42); + +// === Classes === +class Example extends Array { + static staticField = 123; + #privateField = "secret"; + + constructor(...args) { + super(...args); + } + + get value() { + return this.#privateField; + } + + set value(v) { + this.#privateField = v; + } +} + +// === Control Flow === +if (true && !false || null ?? true) { + console.log("truthy"); +} else if (false) { + console.warn("nope"); +} else { + console.error("never"); +} + +for (let i = 0; i < 3; i++) { + continue; +} + +for (const k in obj) {} +for (const v of arr) {} + +while (false) {} +do {} while (false); + +switch (Math.random()) { + case 0: + break; + default: + break; +} + +// === Try / Catch === +try { + throw new Error("boom"); +} catch (e) { + console.error(e?.message ?? "unknown"); +} finally { + // cleanup +} + +// === Regex === +const regex1 = /foo|bar/i; +const regex2 = /^]*\btype\s*=\s*"(?!module|text\/javascript)[^"]*")[^>]*>$/; + +// === Tagged template === +function tag(strings, ...values) { + return strings.raw.join("|") + values.join(","); +} +tag`hello ${42} world`; + +// === Optional chaining / nullish === +const deep = obj?.a?.b ?? "fallback"; + +// === Bitwise === +const mask = (1 << 4) | (1 << 8); + +// === JSON === +const json = JSON.stringify({ a: 1, b: [true, false] }, null, 2); + +// === Top-level await (if supported) === +await Promise.resolve("done"); + +// === JSX-like (should still highlight interestingly) === +const jsx = ( + + + +); + +// === End === +export default { + PI, + arr, + obj, + Example, +}; diff --git a/samples/json.jsonc b/samples/json.jsonc new file mode 100644 index 0000000..164515f --- /dev/null +++ b/samples/json.jsonc @@ -0,0 +1,51 @@ +/* Example configuration file (JSONC) +// Used to test syntax highlighting and comment support +mutiline comment +*/ + +{ + // Application metadata + "name": "example-app", + "version": "1.2.3", + "debug": true, + + // Paths and environment + "paths": { + "root": "/usr/local/example", + "cache": "/tmp/example-cache + asa + multiline string", + "logs": null, // optional + }, + + // Feature flags + "features": { + "experimental": false, + "hotReload": true, + "themes": [ + "dark", + "light", + // "solarized" // not ready yet + ], + }, + + // Network configuration + "server": { + "host": "127.0.0.1", + "port": 8080, + "ssl": { + "enabled": false, + "cert": "", + "key": "", + } + }, + + // Mixed value types + "timeouts": [100, 250, 500, null], + "retryCount": 3, + + // Escapes and strings + "banner": "Welcome!\nThis supports \"escaped quotes\" and unicode → ✓", + + // Trailing comma allowed in JSONC +} diff --git a/samples/lua.lua b/samples/lua.lua new file mode 100644 index 0000000..e5088ba --- /dev/null +++ b/samples/lua.lua @@ -0,0 +1,119 @@ +#!/usr/bin/env lua +-- Lua syntax highlighting test file + +-- Constants +PI = 3.14159 +MAX_COUNT = 100 + +-- Variables +local counter = 0 +local name = "Lua" + +-- Built-in variable +print(self) + +-- Functions +function greet(user) + print("Hello, " .. user) +end + +local function add(a, b) + return a + b +end + +-- Method definitions +local obj = {} +function obj:sayHi() + print("Hi from method!") +end + +obj.sayHello = function() + print("Hello from field function!") +end + +-- Arrow-style anonymous function (LuaJIT/CFFI style) +local arrow = function(x) + return x * 2 +end + +-- Table constructors +local t = { + foo = 123, + bar = function() + return "bar" + end, + nested = { + a = 1, + b = 2, + }, +} + +-- Loops +for i = 1, MAX_COUNT do + counter = counter + i +end + +while counter > 0 do + counter = counter - 1 +end + +repeat + counter = counter + 1 +until counter == 10 + +-- Conditionals +if counter > 5 then + print("Big number") +elseif counter == 5 then + print("Exactly five") +else + print("Small number") +end + +-- Operators +local x, y = 10, 20 +local z = x + y * 2 - (x / y) ^ 2 +local ok = x == y or x ~= y and not false + +-- Function calls +greet("World") +obj:sayHi() +obj.sayHello() +add(5, 10) + +-- Built-in function calls +assert(x > 0) +pcall(function() + print("safe") +end) +tonumber("123") + +-- CFFI injection example +local ffi = require("ffi") +ffi.cdef([[ + int printf(const char *fmt, ...); + typedef struct { int x; int y; } point; +]]) + +-- Boolean and nil +local flag = true +local nothing = nil + +-- Comments +-- Single line +--[[ + Multi-line + comment +]] + +-- Strings +local s1 = "Hello\nWorld" +local s2 = [[Long +multi-line +string]] + +-- Template strings (LuaJIT-style) +local tpl = `Value: ${counter}` + +-- Regex-like string (for testing injection highlighting) +local re = "/^%a+$/" diff --git a/samples/markdown.md b/samples/markdown.md new file mode 100644 index 0000000..839d847 --- /dev/null +++ b/samples/markdown.md @@ -0,0 +1,41 @@ +# Heading 1 + +## Heading 2 + +### Heading 3 + +This is a paragraph with **bold text**, *italic text*, ~~strikethrough~~, and `inline code`. + +> This is a blockquote. +> +> - Nested list item 1 +> - Nested list item 2 +> - Sub-item + +- Task list: + - [ ] Unchecked task + - [x] Checked task + +1. Numbered list item +2. Another item + +--- + +| Name | Age | City | +|------------|-----|---------------| +| Alice | 25 | London | +| Bob | 30 | New York | +| Charlie | 22 | San Francisco | + +[Link to OpenAI](https://openai.com) + +`Inline code` example and a fenced code block: + +```python +def hello_world(): + print("Hello, world!") +``` + +![Image](https://example.com/image.jpg) + +> "This is a quote with a link to [OpenAI](https://openai.com)." diff --git a/samples/nginx.conf b/samples/nginx.conf new file mode 100644 index 0000000..0df27da --- /dev/null +++ b/samples/nginx.conf @@ -0,0 +1,87 @@ +# ============================================================ +# Global Settings +# ============================================================ + +user www-data; +worker_processes auto; +pid /run/nginx.pid; +include /etc/nginx/modules-enabled/*.conf; + +# ============================================================ +# Events Block +# ============================================================ +events { + worker_connections 1024; + use epoll; + multi_accept on; +} + +# ============================================================ +# HTTP Block +# ============================================================ +http { + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 65; + types_hash_max_size 2048; + + include /etc/nginx/mime.types; + default_type application/octet-stream; + + # Logging + access_log /var/log/nginx/access.log; + error_log /var/log/nginx/error.log warn; + + # Gzip Settings + gzip on; + gzip_disable "msie6"; + + # ======================================================== + # Upstream Backend Servers + # ======================================================== + upstream backend { + server 127.0.0.1:8080 weight=5; + server 127.0.0.1:8081; + keepalive 32; + } + + # ======================================================== + # Server Block + # ======================================================== + server { + listen 80 default_server; + listen [::]:80 default_server; + + server_name example.com www.example.com; + + root /var/www/html; + index index.html index.htm; + + # ==================================================== + # Location Blocks + # ==================================================== + location / { + try_files $uri $uri/ =404; + } + + location /api/ { + proxy_pass http://backend; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + location ~* \.(gif|jpg|jpeg|png|css|js|ico|svg)$ { + expires 30d; + add_header Cache-Control "public, no-transform"; + } + + error_page 404 /404.html; + error_page 500 502 503 504 /50x.html; + + location = /50x.html { + root /var/www/html; + } + } +} diff --git a/samples/php.php b/samples/php.php new file mode 100644 index 0000000..de79654 --- /dev/null +++ b/samples/php.php @@ -0,0 +1,130 @@ + + + + + PHP Syntax Stress Test + + + + + + + + + 1, + "two" => 2 +]; + +// Function +function add(int $a, int $b): int { + return $a + $b; +} + +// Class + methods +class User { + private string $name; + public static int $count = 0; + + public function __construct(string $name) { + $this->name = $name; + self::$count++; + } + + public function greet(): string { + return "Hello {$this->name}"; + } +} + +// Object usage +$user = new User("Alice"); +echo $user->greet(); + +// Control flow +if ($number > 10) { + echo "Big number"; +} elseif ($number === 10) { + echo "Exactly ten"; +} else { + echo "Small number"; +} + +// Loop +foreach ($list as $item) { + echo $item; +} + +// Match expression +$result = match ($number) { + 1 => "one", + 2 => "two", + default => "many" +}; + +// Try / catch +try { + throw new Exception("Test exception"); +} catch (Exception $e) { + echo $e->getMessage(); +} + +// Anonymous function +$double = fn($x) => $x * 2; + +// Nullsafe operator +$len = $user?->name ? strlen($user->name) : 0; + +// Ternary +$status = $truth ? "yes" : "no"; + +// Include / require +require_once "config.php"; + +// Output +echo "
"; +echo htmlspecialchars($text); +echo "
"; +?> + + + + + diff --git a/samples/python.py b/samples/python.py new file mode 100644 index 0000000..85648e3 --- /dev/null +++ b/samples/python.py @@ -0,0 +1,163 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""Test file for Python Tree-sitter highlighting.""" + +# ============================== +# Constants / Builtins +# ============================== +PI = 3.14159 +MAX_SIZE = 100 +NotImplemented +Ellipsis +__name__ # builtin constant + +# ============================== +# Imports +# ============================== +import os +import sys as system +from re import compile as re_compile +from __future__ import annotations +from math import * + +# ============================== +# Functions +# ============================== +def add(a: int, b: int = 5) -> int: + """Simple add function""" + return a + b + +def variadic(*args, **kwargs): + print(args, kwargs) + +lambda_func = lambda x, y=2: x * y + +def type_var_example(T: type): + pass + +# ============================== +# Classes +# ============================== +class Base: + class_var = 10 + + def __init__(self, name: str): + self.name = name + self._private = 42 + + @classmethod + def cls_method(cls): + return cls.class_var + + @staticmethod + def static_method(): + return "static" + + @property + def prop(self): + return self.name + +class Derived(Base): + def __init__(self, name, extra): + super().__init__(name) + self.extra = extra + +# ============================== +# Variables +# ============================== +normal_var = 1 +_local_var = 2 +GLOBAL_VAR = 3 + +# Builtin variable references +self = "something" +cls = "class" + +# ============================== +# Control flow +# ============================== +if True: + x = 10 +elif False: + x = 20 +else: + x = 0 + +for i in range(3): + print(i) +while x > 0: + x -= 1 + if x == 1: + break + else: + continue + +try: + 1 / 0 +except ZeroDivisionError as e: + raise +finally: + pass + +# ============================== +# Operators +# ============================== +a, b = 5, 10 +c = a + b * 2 // 3 % 4 ** 2 +d = (a << 2) & b | c ^ ~a +e = not a or b and c + +# ============================== +# f-strings / interpolation +# ============================== +name = "Alice" +greeting = f"Hello {name.upper()}!" +formatted = f"{a + b} is sum" + +# ============================== +# Regex +# ============================== +pattern1 = re_compile(r"\d+") +pattern2 = re_compile(r"\w{2,}") + +# ============================== +# Decorators usage +# ============================== +@staticmethod +def static_func(): + return True + +@classmethod +def cls_func(cls): + return cls + +@custom_decorator +def decorated_func(): + return None + +# ============================== +# Misc / Type conversions / literals +# ============================== +flag: bool = True +nothing: None = None +num: float = float("3.14") +text: str = str(123) +lst = [1, 2, 3] +tpl = (4, 5) +dct = {"a": 1, "b": 2} + +# ============================== +# Type hints / TypeVar / TypeAlias +# ============================== +from typing import TypeVar, NewType +T = TypeVar("T") +UserId = NewType("UserId", int) +TypeAliasExample: type = int + +# ============================== +# Function calls / constructors +# ============================== +result = add(1, 2) +obj = Derived("Alice", "extra") +variadic(1, 2, 3, key="value") +instance_check = isinstance(obj, Base) diff --git a/samples/regex.regex b/samples/regex.regex new file mode 100644 index 0000000..ef014b6 --- /dev/null +++ b/samples/regex.regex @@ -0,0 +1,18 @@ +# Match email addresses with optional names +(?P[a-zA-Z0-9._%+-]+)?\s*<(?P[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})> + +# Match dates in YYYY-MM-DD or DD/MM/YYYY +(\d{4}-\d{2}-\d{2})|(\d{2}/\d{2}/\d{4}) + +# Match hexadecimal colors +# e.g., #FFF, #FFFFFF +# Optional leading # +# Case-insensitive +# Flags inline +(?i)#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}) + +# Match words starting with vowels +\b[aeiouAEIOU]\w*\b + +# Match simple URL +https?://(?:www\.)?\w+\.\w+(?:/\S*)? diff --git a/samples/rust.rs b/samples/rust.rs new file mode 100644 index 0000000..7146df0 --- /dev/null +++ b/samples/rust.rs @@ -0,0 +1,406 @@ +#![allow(dead_code)] + +use std::collections::{BTreeMap, HashMap}; +use std::fmt; +use std::time::Duration; + +//! Examples to exercise the Rust regex injection queries in the highlights.scm. +//! These cover Regex::new, regex::Regex::new, regex::bytes::Regex::new, +//! RegexSet::new, regex::RegexSet::new, RegexSetBuilder::new, and byte variants. +//! +//! Injection patterns in the query file trigger on: +//! - call to (Regex|ByteRegexBuilder)::new with a raw string literal +//! - call to (RegexSet|RegexSetBuilder)::new with an array of raw string literals + +use regex::{Regex, RegexSet, RegexSetBuilder}; +use regex::bytes::Regex as ByteRegex; +use regex::bytes::RegexSet as ByteRegexSet; +use regex::bytes::RegexSetBuilder as ByteRegexSetBuilder; + +fn main() { + // --- Should inject (Regex::new with raw string) --- + let _simple = Regex::new(r"^\d{4}-\d{2}-\d{2}$").unwrap(); + + // --- Should inject (fully qualified regex::Regex::new with raw string) --- + let _fq = regex::Regex::new(r"(?m)^\w+\s*=\s*.+$").unwrap(); + + // --- Should inject (bytes::Regex::new with raw string) --- + let _bytes = ByteRegex::new(r"(?-u)\xFF[\x00-\x7F]+").unwrap(); + + // --- Should inject (RegexSet::new with array of raw strings) --- + let _set = RegexSet::new([ + r"^INFO:", + r"^WARN:", + r"^ERROR:", + ]).unwrap(); + + // --- Should inject (regex::RegexSet::new fully qualified) --- + let _set_fq = regex::RegexSet::new([ + r"foo\d+", + r"bar\d+", + ]).unwrap(); + + // --- Should inject (RegexSetBuilder::new with array of raw strings) --- + let _set_builder = RegexSetBuilder::new([ + r"\bcat\b", + r"\bdog\b", + ]) + .case_insensitive(true) + .build() + .unwrap(); + + // --- Should inject (bytes set builder) --- + let _byte_set_builder = ByteRegexSetBuilder::new([ + r"(?-u)\x01\x02", + r"(?-u)\xFF.+", + ]) + .build() + .unwrap(); + + // --- Should inject (bytes set) --- + let _byte_set = ByteRegexSet::new([ + r"(?-u)\x00+\xFF", + r"(?-u)[\x10-\x20]+", + ]).unwrap(); + + // --- NEGATIVE examples (should NOT inject) --- + + // Not raw string literal (plain string): the query expects raw_string_literal. + let _no_inject_plain = Regex::new("plain-string-no-raw").unwrap(); + + // Function name is not `new`, so should not inject. + let _builder = Regex::new(r"\d+").map(|re| re.replace("123", "x")); + + // Different type name, should not inject. + let _other = Some(r"not a regex call"); + + // Raw string but different function, should not inject. + let _format = format!(r"literal: {}", 42); +} + +// Keep a simple test to ensure this compiles and runs. +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn smoke() { + let re = Regex::new(r"^\d+$").unwrap(); + assert!(re.is_match("12345")); + let set = RegexSet::new([r"cat", r"dog"]).unwrap(); + assert!(set.is_match("hotdog")); + } +} + +/// A simple data type to exercise traits, pattern matching, and methods. +#[derive(Debug, Clone, PartialEq)] +pub struct Point { + pub x: i64, + pub y: i64, +} + +impl Point { + pub fn manhattan(&self) -> i64 { + self.x.abs() + self.y.abs() + } + + pub fn translate(&self, dx: i64, dy: i64) -> Self { + Self { + x: self.x + dx, + y: self.y + dy, + } + } +} + +impl fmt::Display for Point { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "({}, {})", self.x, self.y) + } +} + +#[derive(Debug, PartialEq, Eq)] +pub enum ParseError { + Empty, + InvalidDigit, + TooLarge, +} + +pub fn parse_u8(input: &str) -> Result { + if input.trim().is_empty() { + return Err(ParseError::Empty); + } + let mut value: u16 = 0; + for ch in input.bytes() { + if !(b'0'..=b'9').contains(&ch) { + return Err(ParseError::InvalidDigit); + } + value = value * 10 + u16::from(ch - b'0'); + if value > u8::MAX as u16 { + return Err(ParseError::TooLarge); + } + } + Ok(value as u8) +} + +pub fn sum_iter>(iter: I) -> i64 { + iter.into_iter().fold(0, |acc, n| acc + n) +} + +pub fn split_once<'a>(input: &'a str, needle: char) -> Option<(&'a str, &'a str)> { + let idx = input.find(needle)?; + Some((&input[..idx], &input[idx + needle.len_utf8()..])) +} + +pub fn join_with>(iter: I, sep: &str) -> String { + let mut it = iter.into_iter().peekable(); + let mut out = String::new(); + while let Some(item) = it.next() { + out.push_str(&item); + if it.peek().is_some() { + out.push_str(sep); + } + } + out +} + +#[cfg(test)] +mod tests { + use super::*; + use std::cell::RefCell; + use std::sync::mpsc; + use std::thread; + + macro_rules! assert_contains { + ($haystack:expr, $needle:expr) => { + if !$haystack.contains($needle) { + panic!("expected {:?} to contain {:?}", $haystack, $needle); + } + }; + } + + #[test] + fn point_manhattan_and_display() { + let p = Point { x: -3, y: 4 }; + assert_eq!(p.manhattan(), 7); + assert_eq!(p.to_string(), "(-3, 4)"); + } + + #[test] + fn point_translate_is_pure() { + let p = Point { x: 1, y: 2 }; + let q = p.translate(3, -1); + assert_eq!(p, Point { x: 1, y: 2 }); + assert_eq!(q, Point { x: 4, y: 1 }); + } + + #[test] + fn parse_u8_success_and_errors() { + assert_eq!(parse_u8("0"), Ok(0)); + assert_eq!(parse_u8("255"), Ok(255)); + assert_eq!(parse_u8(" 17 "), Ok(17)); // leading/trailing spaces are rejected as Empty? we trimmed only emptiness, digits still parsed. + assert_eq!(parse_u8(""), Err(ParseError::Empty)); + assert_eq!(parse_u8(" "), Err(ParseError::Empty)); + assert_eq!(parse_u8("12a"), Err(ParseError::InvalidDigit)); + assert_eq!(parse_u8("256"), Err(ParseError::TooLarge)); + } + + #[test] + fn sum_iter_works_for_various_iterators() { + let v = vec![1, 2, 3, 4, -5]; + assert_eq!(sum_iter(&v), 5); + let arr = [10i64; 4]; + assert_eq!(sum_iter(arr), 40); + assert_eq!(sum_iter(0..5), 10); + } + + #[test] + fn split_once_basic_and_unicode() { + assert_eq!(split_once("a,b,c", ','), Some(("a", "b,c"))); + assert_eq!(split_once("no-sep", '/'), None); + // UTF-8 needle + let s = "fooλbar"; + assert_eq!(split_once(s, 'λ'), Some(("foo", "bar"))); + } + + #[test] + fn join_with_various_lengths() { + let empty: Vec = vec![]; + assert_eq!(join_with(empty, ", "), ""); + assert_eq!(join_with(vec!["a".into()], ", "), "a"); + assert_eq!( + join_with(vec!["a".into(), "b".into(), "c".into()], "|"), + "a|b|c" + ); + } + + #[test] + fn hash_map_grouping_example() { + let words = ["ant", "bat", "apple", "boat"]; + let mut by_initial: HashMap> = HashMap::new(); + for w in &words { + let key = w.chars().next().unwrap(); + by_initial.entry(key).or_default().push(*w); + } + assert_eq!(by_initial.get(&'a').unwrap(), &vec!["ant", "apple"]); + assert_eq!(by_initial.get(&'b').unwrap(), &vec!["bat", "boat"]); + } + + #[test] + fn btree_map_sorted_iteration() { + let mut map = BTreeMap::new(); + map.insert("c", 3); + map.insert("a", 1); + map.insert("b", 2); + let keys: Vec<_> = map.keys().copied().collect(); + assert_eq!(keys, vec!["a", "b", "c"]); + } + + #[test] + fn channels_and_threads() { + let (tx, rx) = mpsc::channel(); + thread::spawn(move || { + for i in 0..5 { + tx.send(i * i).unwrap(); + } + }); + let received: Vec<_> = (0..5).map(|_| rx.recv().unwrap()).collect(); + assert_eq!(received, vec![0, 1, 4, 9, 16]); + } + + #[test] + fn interior_mutability_with_refcell() { + #[derive(Debug)] + struct Counter { + inner: RefCell, + } + impl Counter { + fn inc(&self) { + *self.inner.borrow_mut() += 1; + } + fn get(&self) -> u32 { + *self.inner.borrow() + } + } + + let c = Counter { + inner: RefCell::new(0), + }; + c.inc(); + c.inc(); + assert_eq!(c.get(), 2); + } + + #[test] + fn should_panic_on_too_large_parse() { + #[should_panic(expected = "TooLarge")] + fn check() { + parse_u8("999").unwrap(); + } + check(); + } + + #[test] + fn result_based_test() -> Result<(), String> { + let p = Point { x: 2, y: 3 }; + if p.manhattan() == 5 { + Ok(()) + } else { + Err("manhattan distance mismatch".into()) + } + } + + #[test] + fn iterator_combinators_cover_common_paths() { + let data = vec![Some(1), None, Some(3), Some(4)]; + let sum: i32 = data.iter().flatten().sum(); + assert_eq!(sum, 8); + + let doubled: Vec<_> = (1..=5).map(|n| n * 2).filter(|n| n % 4 == 0).collect(); + assert_eq!(doubled, vec![4, 8]); + } + + #[test] + fn pattern_matching_with_guards() { + let numbers = [-2, -1, 0, 1, 2]; + let labels: Vec<_> = numbers + .iter() + .map(|n| match n { + n if *n < 0 => "neg", + 0 => "zero", + n if *n % 2 == 0 => "even-pos", + _ => "odd-pos", + }) + .collect(); + assert_eq!(labels, vec!["neg", "neg", "zero", "odd-pos", "even-pos"]); + } + + #[test] + fn custom_macro_assert_contains() { + assert_contains!("hello world", "world"); + } + + #[test] + fn ownership_and_borrowing_examples() { + fn takes_and_gives_back(mut v: Vec) -> Vec { + v.push(42); + v + } + let v = vec![1, 2, 3]; + let v = takes_and_gives_back(v); + assert_eq!(v, vec![1, 2, 3, 42]); + + let s = String::from("hi"); + let len = length_of_str(&s); + assert_eq!(len, 2); + } + + fn length_of_str(s: &str) -> usize { + s.len() + } + + #[test] + fn lifetimes_and_slices() { + fn first<'a>(xs: &'a [i32]) -> Option<&'a i32> { + xs.first() + } + let data = [10, 20, 30]; + assert_eq!(first(&data), Some(&10)); + } + + #[test] + fn const_generics_array_sum() { + fn sum_array(arr: [i32; N]) -> i32 { + arr.iter().sum() + } + assert_eq!(sum_array::<3>([1, 2, 3]), 6); + assert_eq!(sum_array([0; 5]), 0); + } + + #[test] + fn duration_and_instant_arithmetic() { + use std::time::Instant; + let start = Instant::now(); + std::thread::sleep(Duration::from_millis(5)); + let elapsed = start.elapsed(); + assert!(elapsed >= Duration::from_millis(5)); + } + + #[test] + fn string_builder_patterns() { + let parts = ["a", "b", "c"]; + let mut s = String::with_capacity(3); + for p in parts { + s.push_str(p); + } + assert_eq!(s, "abc"); + assert!(s.capacity() >= 3); + } + + #[test] + fn equality_and_ordering_on_point() { + let p1 = Point { x: 1, y: 2 }; + let p2 = Point { x: 1, y: 2 }; + assert_eq!(p1, p2); + assert!(p1.manhattan() <= p2.manhattan()); + } +} diff --git a/samples/sample.gitattributes b/samples/sample.gitattributes new file mode 100644 index 0000000..5f59f25 --- /dev/null +++ b/samples/sample.gitattributes @@ -0,0 +1,5 @@ +# Sample .gitattributes file for syntax highlighting tests + +*.c syntax=c +*.h syntax=c +*.py syntax=python diff --git a/samples/sample.gitignore b/samples/sample.gitignore new file mode 100644 index 0000000..063326f --- /dev/null +++ b/samples/sample.gitignore @@ -0,0 +1,12 @@ +# Test gitignore file (to check syntax) + +* +./! + +*.log + +!.gitignore[2] + +**/*.lo[s]g + +### Comment diff --git a/samples/sql.sql b/samples/sql.sql new file mode 100644 index 0000000..60f1a69 --- /dev/null +++ b/samples/sql.sql @@ -0,0 +1,83 @@ +-- Sample SQL to exercise the highlight rules + +-- DDL +CREATE TEMPORARY TABLE IF NOT EXISTS public.users ( + user_id BIGSERIAL PRIMARY KEY, + email VARCHAR(255) UNIQUE NOT NULL, + profile JSONB, + balance DECIMAL(12,2) DEFAULT 0.00, + created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMPTZ, + CONSTRAINT email_chk CHECK (email LIKE '%@%') +); + +-- Indexes +CREATE INDEX CONCURRENTLY IF NOT EXISTS users_email_idx ON public.users USING btree (email); +CREATE INDEX IF NOT EXISTS users_profile_gin_idx ON public.users USING gin (profile); + +-- Insert & returning +INSERT INTO public.users (email, profile, balance) +VALUES + ('alice@example.com', '{"plan":"pro","tags":["a","b"]}'::jsonb, 25.50), + ('bob@example.com', '{"plan":"free","tags":["c"]}'::jsonb, 0.00) +RETURNING user_id, email, profile; + +-- Update with CASE and CAST +UPDATE public.users u +SET balance = balance + CAST(5 AS DECIMAL), + updated_at = CURRENT_TIMESTAMP, + profile = jsonb_set(profile, '{last_seen}', to_jsonb(CURRENT_TIMESTAMP)), + email = CASE + WHEN email LIKE '%@example.com' THEN replace(email, '@example.com', '@example.org') + ELSE email + END +WHERE u.balance >= 0 +RETURNING user_id, email, balance; + +-- Delete with USING +DELETE FROM public.users AS u +USING public.users AS t +WHERE u.user_id = t.user_id + AND u.email LIKE 'bob@%'; + +-- Window, CTE, aggregates +WITH recent AS ( + SELECT * + FROM public.users + WHERE created_at > NOW() - INTERVAL '30 days' +) +SELECT + user_id, + email, + balance, + SUM(balance) OVER (PARTITION BY 1 ORDER BY created_at ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_total, + ROW_NUMBER() OVER (ORDER BY created_at DESC) AS rn +FROM recent +ORDER BY created_at DESC +LIMIT 50 OFFSET 0; + +-- Joins and JSON +CREATE TEMP TABLE events ( + event_id BIGSERIAL PRIMARY KEY, + user_id BIGINT REFERENCES public.users(user_id), + payload JSONB, + created_at TIMESTAMPTZ DEFAULT NOW() +); + +INSERT INTO events (user_id, payload) VALUES + (1, '{"type":"login","ip":"127.0.0.1"}'), + (1, '{"type":"purchase","amount":9.99,"items":[{"sku":"A1","qty":1}]}' ), + (2, '{"type":"login","ip":"10.0.0.2"}'); + +SELECT u.email, e.payload->>'type' AS event_type, e.payload +FROM public.users u +LEFT JOIN events e ON e.user_id = u.user_id +WHERE e.payload ? 'type' +ORDER BY e.created_at DESC; + +-- Transaction control +BEGIN; + UPDATE public.users SET balance = balance - 5 WHERE email LIKE 'alice%'; + INSERT INTO events (user_id, payload) + SELECT user_id, jsonb_build_object('type','adjust','delta',-5) FROM public.users WHERE email LIKE 'alice%'; +COMMIT; diff --git a/samples/toml.toml b/samples/toml.toml new file mode 100644 index 0000000..407788b --- /dev/null +++ b/samples/toml.toml @@ -0,0 +1,53 @@ +# ============================================================ +# Basic types +# ============================================================ + +title = "Example TOML Configuration" +enabled = true +count = 42 +pi = 3.14159 +empty = "" + +# ============================================================ +# Arrays +# ============================================================ +fruits = ["apple", "banana", "cherry"] +numbers = [1, 2, 3, 4, 5] + +# Nested array +matrix = [[1, 2], [3, 4]] + +# ============================================================ +# Tables +# ============================================================ +[owner] +name = "Alice" +dob = 1979-05-27T07:32:00Z + +[database] +server = "192.168.1.1" +ports = [ 8001, 8001, 8002 ] +connection_max = 5000 +enabled = true + +[servers.alpha] +ip = "10.0.0.1" +dc = "east" + +[servers.beta] +ip = "10.0.0.2" +dc = "west" + +# ============================================================ +# Inline tables +# ============================================================ +clients = { name = "Bob", age = 30, active = true } + +# ============================================================ +# Multiline strings +# ============================================================ +description = """ +This is a TOML file +used for testing syntax highlighting. +It supports multiple lines. +""" diff --git a/src/ts.cc b/src/ts.cc index dff79ea..77f62c3 100644 --- a/src/ts.cc +++ b/src/ts.cc @@ -90,6 +90,8 @@ TSQuery *load_query(const char *query_path, TSSetBase *set) { auto it = kLanguages.find(mct.substr(4)); if (it != kLanguages.end()) c_lang = it->second; + else + c_lang = {"unknown", nullptr, 0}; } offset = ovector[1]; } @@ -102,6 +104,9 @@ TSQuery *load_query(const char *query_path, TSSetBase *set) { TSQuery *q = ts_query_new(lang, highlight_query.c_str(), (uint32_t)highlight_query.length(), &error_offset, &error_type); + if (!q) + log("Failed to create TSQuery at offset %u, error type %d", error_offset, + (int)error_type); return q; } @@ -228,103 +233,103 @@ void ts_collect_spans(Editor *editor) { ts_tree_delete(editor->ts.tree); editor->ts.tree = tree; copy = ts_tree_copy(tree); - TSQueryCursor *cursor = ts_query_cursor_new(); - ts_query_cursor_exec(cursor, editor->ts.query, ts_tree_root_node(copy)); std::vector new_spans; new_spans.reserve(4096); struct PendingRanges { std::vector ranges; TSSet *tsset = nullptr; }; - std::unordered_map pending_injections; - TSQueryMatch match; - while (ts_query_cursor_next_match(cursor, &match)) { - if (!ts_predicate(editor->ts.query, match, editor->root)) - continue; - for (uint32_t i = 0; i < match.capture_count; i++) { - TSQueryCapture cap = match.captures[i]; - uint32_t start = ts_node_start_byte(cap.node); - uint32_t end = ts_node_end_byte(cap.node); - if (Highlight *hl = safe_get(editor->ts.query_map, cap.index)) - new_spans.push_back({start, end, hl}); - if (!injections_enabled) - continue; - if (Language *inj_lang = safe_get(editor->ts.injection_map, cap.index)) { - auto &pending = pending_injections[inj_lang->name]; - TSSet &tsset = - editor->ts.injections.try_emplace(inj_lang->name).first->second; - if (!tsset.parser) { - tsset.lang = inj_lang->name; - tsset.parser = ts_parser_new(); - ts_parser_set_language(tsset.parser, inj_lang->fn()); - tsset.language = inj_lang->fn(); - tsset.query_file = - get_exe_dir() + "/../grammar/" + inj_lang->name + ".scm"; - tsset.query = load_query(tsset.query_file.c_str(), &tsset); - } - pending.tsset = &tsset; - pending.ranges.push_back(TSRange{ - ts_node_start_point(cap.node), - ts_node_end_point(cap.node), - start, - end, - }); - } - } - } + struct WorkItem { + TSSetBase *tsset; + TSTree *tree; + int depth; + TSSet *as_injection; + }; + const int kMaxInjectionDepth = 4; + std::vector work; + work.push_back( + {reinterpret_cast(&editor->ts), copy, 0, nullptr}); auto overlaps = [](const Span &s, const TSRange &r) { return !(s.end <= r.start_byte || s.start >= r.end_byte); }; - if (injections_enabled) { - for (auto &[lang_name, pending] : pending_injections) { - TSSet *tsset = pending.tsset; - if (!tsset) - continue; - tsset->ranges = std::move(pending.ranges); - if (tsset->ranges.size() > 0) - new_spans.erase(std::remove_if(new_spans.begin(), new_spans.end(), - [&](const Span &sp) { - return std::any_of( - tsset->ranges.begin(), - tsset->ranges.end(), - [&](const TSRange &r) { - return overlaps(sp, r); - }); - }), - new_spans.end()); + auto remove_overlapping_spans = [&](const std::vector &ranges) { + if (ranges.empty()) + return; + new_spans.erase( + std::remove_if(new_spans.begin(), new_spans.end(), + [&](const Span &sp) { + return std::any_of( + ranges.begin(), ranges.end(), + [&](const TSRange &r) { return overlaps(sp, r); }); + }), + new_spans.end()); + }; + while (!work.empty()) { + WorkItem item = work.back(); + work.pop_back(); + TSQuery *q = item.tsset->query; + if (!q) { + ts_tree_delete(item.tree); + continue; } - for (auto &kv : editor->ts.injections) { - auto &inj = kv.second; - if (!inj.parser || !inj.query || inj.ranges.size() == 0) + TSQueryCursor *cursor = ts_query_cursor_new(); + ts_query_cursor_exec(cursor, q, ts_tree_root_node(item.tree)); + std::unordered_map pending_injections; + TSQueryMatch match; + while (ts_query_cursor_next_match(cursor, &match)) { + if (!ts_predicate(q, match, editor->root)) continue; - ts_parser_set_included_ranges(inj.parser, inj.ranges.data(), - inj.ranges.size()); - knot_mtx.lock(); - std::pair span_edit; - while (editor->spans.edits.pop(span_edit)) - apply_edit(new_spans, span_edit.first, span_edit.second); - TSTree *inj_tree = ts_parser_parse(inj.parser, nullptr, tsinput); - knot_mtx.unlock(); - TSQueryCursor *inj_cursor = ts_query_cursor_new(); - ts_query_cursor_exec(inj_cursor, inj.query, ts_tree_root_node(inj_tree)); - TSQueryMatch inj_match; - while (ts_query_cursor_next_match(inj_cursor, &inj_match)) { - if (!ts_predicate(inj.query, inj_match, editor->root)) + for (uint32_t i = 0; i < match.capture_count; i++) { + TSQueryCapture cap = match.captures[i]; + uint32_t start = ts_node_start_byte(cap.node); + uint32_t end = ts_node_end_byte(cap.node); + if (Highlight *hl = safe_get(item.tsset->query_map, cap.index)) + new_spans.push_back({start, end, hl}); + if (!injections_enabled) continue; - for (uint32_t i = 0; i < inj_match.capture_count; i++) { - TSQueryCapture cap = inj_match.captures[i]; - uint32_t start = ts_node_start_byte(cap.node); - uint32_t end = ts_node_end_byte(cap.node); - if (Highlight *hl = safe_get(inj.query_map, cap.index)) - new_spans.push_back({start, end, hl}); + if (Language *inj_lang = + safe_get(item.tsset->injection_map, cap.index)) { + auto &pending = pending_injections[inj_lang->name]; + TSSet &tsset = + editor->ts.injections.try_emplace(inj_lang->name).first->second; + if (!tsset.parser) { + tsset.lang = inj_lang->name; + tsset.parser = ts_parser_new(); + ts_parser_set_language(tsset.parser, inj_lang->fn()); + tsset.language = inj_lang->fn(); + tsset.query_file = + get_exe_dir() + "/../grammar/" + inj_lang->name + ".scm"; + tsset.query = load_query(tsset.query_file.c_str(), &tsset); + } + pending.tsset = &tsset; + pending.ranges.push_back(TSRange{ + ts_node_start_point(cap.node), + ts_node_end_point(cap.node), + start, + end, + }); } } - ts_query_cursor_delete(inj_cursor); - ts_tree_delete(inj_tree); } + ts_query_cursor_delete(cursor); + if (injections_enabled && item.depth < kMaxInjectionDepth) { + for (auto &[lang_name, pending] : pending_injections) { + TSSet *tsset = pending.tsset; + if (!tsset || pending.ranges.empty() || !tsset->parser || !tsset->query) + continue; + tsset->ranges = std::move(pending.ranges); + remove_overlapping_spans(tsset->ranges); + ts_parser_set_included_ranges(tsset->parser, tsset->ranges.data(), + tsset->ranges.size()); + lock.lock(); + TSTree *inj_tree = ts_parser_parse(tsset->parser, nullptr, tsinput); + lock.unlock(); + work.push_back({reinterpret_cast(tsset), inj_tree, + item.depth + 1, tsset}); + } + } + ts_tree_delete(item.tree); } - ts_query_cursor_delete(cursor); - ts_tree_delete(copy); std::pair span_edit; while (editor->spans.edits.pop(span_edit)) apply_edit(new_spans, span_edit.first, span_edit.second); diff --git a/src/utils.cc b/src/utils.cc index 82bf929..d5fd518 100644 --- a/src/utils.cc +++ b/src/utils.cc @@ -220,8 +220,13 @@ char *load_file(const char *path, uint32_t *out_len) { static std::string file_extension(const char *filename) { std::string name(filename); auto pos = name.find_last_of('.'); - if (pos == std::string::npos) - return ""; + if (pos == std::string::npos) { + auto pos2 = name.find_last_of('/'); + if (pos2 != std::string::npos) + pos = pos2; + else + return ""; + } std::string ext = name.substr(pos + 1); std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower); return ext; @@ -245,6 +250,25 @@ char *detect_file_type(const char *filename) { return result; } +Language language_for_file(const char *filename) { + std::string ext = file_extension(filename); + std::string lang_name; + if (!ext.empty()) { + auto it = kExtToLang.find(ext); + if (it != kExtToLang.end()) + return kLanguages.find(it->second)->second; + } + char *mime = detect_file_type(filename); + if (mime) { + std::string mime_type(mime); + free(mime); + auto it = kMimeToLang.find(mime_type); + if (it != kMimeToLang.end()) + return kLanguages.find(it->second)->second; + } + return {"unknown", nullptr}; +} + int utf8_byte_offset_to_utf16(const char *s, size_t byte_pos) { int utf16_units = 0; size_t i = 0; @@ -266,22 +290,3 @@ int utf8_byte_offset_to_utf16(const char *s, size_t byte_pos) { } return utf16_units; } - -Language language_for_file(const char *filename) { - std::string ext = file_extension(filename); - std::string lang_name; - if (!ext.empty()) { - auto it = kExtToLang.find(ext); - if (it != kExtToLang.end()) - return kLanguages.find(it->second)->second; - } - char *mime = detect_file_type(filename); - if (mime) { - std::string mime_type(mime); - free(mime); - auto it = kMimeToLang.find(mime_type); - if (it != kMimeToLang.end()) - return kLanguages.find(it->second)->second; - } - return {"unknown", nullptr}; -}