diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md index 79716d17c..776febdfc 100644 --- a/book/src/generated/lang-support.md +++ b/book/src/generated/lang-support.md @@ -16,6 +16,7 @@ | erb | ✓ | | | | | erlang | ✓ | | | `erlang_ls` | | fish | ✓ | ✓ | ✓ | | +| gdscript | ✓ | | ✓ | | | git-commit | ✓ | | | | | git-config | ✓ | | | | | git-diff | ✓ | | | | diff --git a/languages.toml b/languages.toml index d3a21c2d0..d5409eaaf 100644 --- a/languages.toml +++ b/languages.toml @@ -1150,3 +1150,18 @@ injection-regex = "sql" [[grammar]] name = "sql" source = { git = "https://github.com/DerekStride/tree-sitter-sql", rev = "0caa7fa2ee00e0b770493a79d4efacc1fc376cc5" } + +[[language]] +name = "gdscript" +scope = "source.gdscript" +injection-regex = "gdscript" +file-types = ["gd"] +shebangs = [] +roots = ["project.godot"] +auto-format = true +comment-token = "#" +indent = { tab-width = 4, unit = " " } + +[[grammar]] +name = "gdscript" +source = { git = "https://github.com/PrestonKnopp/tree-sitter-gdscript", rev = "2a6abdaa47fcb91397e09a97c7433fd995ea46c6" } diff --git a/runtime/queries/gdscript/highlights.scm b/runtime/queries/gdscript/highlights.scm new file mode 100644 index 000000000..0849eedb0 --- /dev/null +++ b/runtime/queries/gdscript/highlights.scm @@ -0,0 +1,93 @@ +; Identifier naming conventions + +((identifier) @constant + (#match? @constant "^[A-Z][A-Z_]*$")) + +; Function calls + +(attribute_call (identifier) @function) + +(base_call (identifier) @function) + +(call (identifier) @function) + +; Function definitions + +(function_definition (name) @function) + +(constructor_definition "_init" @function) + +;; Literals +(integer) @constant.numeric.integer +(float) @constant.numeric.float +(comment) @comment +(string) @string +(escape_sequence) @constant.character.escape +(identifier) @variable +(type) @type + +;; Literals +[ + (true) + (false) + (null) +] @constant.builtin + +[ + "+" + "-" + "*" + "/" + "%" + "==" + "!=" + ">" + "<" + ">=" + "<=" + "=" + "+=" + "-=" + "*=" + "/=" + "%=" + "&" + "|" + "^" + "~" + "<<" + ">>" + "and" + "or" + "not" +] @operator + +[ + (static_keyword) + (remote_keyword) + (tool_statement) + "var" + "func" + "setget" + "in" + "is" + "as" + "if" + "else" + "elif" + "while" + "for" + "return" + "break" + "continue" + "pass" + "match" + "class" + "class_name" + "enum" + "signal" + "onready" + "export" + "extends" + "const" +] @keyword diff --git a/runtime/queries/gdscript/indents.scm b/runtime/queries/gdscript/indents.scm new file mode 100644 index 000000000..01439e1c6 --- /dev/null +++ b/runtime/queries/gdscript/indents.scm @@ -0,0 +1,26 @@ +[ + (_compound_statement) + (match_statement) + (parenthesized_expression) + + (pattern_array) + (pattern_dictionary) + (argument_list) + (binary_operator) + + (parameters) + (body) + (enumerator_list) + + (function_definition) + (constructor_definition) + (class_definition) +] @indent + +[ + ")", + "]", + "}", + (return_statement) + (pass_statement) +] @outdent diff --git a/runtime/queries/gdscript/tags.scm b/runtime/queries/gdscript/tags.scm new file mode 100644 index 000000000..05796fdf2 --- /dev/null +++ b/runtime/queries/gdscript/tags.scm @@ -0,0 +1,5 @@ +(class_definition (name) @name) @definition.class + +(function_definition (name) @name) @definition.function + +(call (name) @name) @reference.call \ No newline at end of file