diff --git a/README.md b/README.md index 7b5d2f175..26cd4f8cb 100644 --- a/README.md +++ b/README.md @@ -377,6 +377,7 @@ We are looking for maintainers to add more parsers and to write query files for - [x] [solidity](https://github.com/JoranHonig/tree-sitter-solidity) (maintained by @amaanq) - [x] [soql](https://github.com/aheber/tree-sitter-sfapex) (maintained by @aheber) - [x] [sosl](https://github.com/aheber/tree-sitter-sfapex) (maintained by @aheber) +- [x] [sourcepawn](https://github.com/nilshelmig/tree-sitter-sourcepawn) (maintained by @Sarrus1) - [x] [sparql](https://github.com/BonaBeavis/tree-sitter-sparql) (maintained by @BonaBeavis) - [x] [sql](https://github.com/derekstride/tree-sitter-sql) (maintained by @derekstride) - [x] [squirrel](https://github.com/amaanq/tree-sitter-squirrel) (maintained by @amaanq) diff --git a/lockfile.json b/lockfile.json index 315f81b81..79fde83f6 100644 --- a/lockfile.json +++ b/lockfile.json @@ -611,6 +611,9 @@ "sosl": { "revision": "857077f9e6bb04df0f769c18d32bfe036911adc8" }, + "sourcepawn": { + "revision": "846ec647109a1f3dfab17c025c80ecdf6fd56581" + }, "sparql": { "revision": "05f949d3c1c15e3261473a244d3ce87777374dec" }, diff --git a/lua/nvim-treesitter/parsers.lua b/lua/nvim-treesitter/parsers.lua index b1907d255..2fb93ec8b 100644 --- a/lua/nvim-treesitter/parsers.lua +++ b/lua/nvim-treesitter/parsers.lua @@ -1791,6 +1791,15 @@ list.sosl = { maintainers = { "@aheber" }, } +list.sourcepawn = { + install_info = { + url = "https://github.com/nilshelmig/tree-sitter-sourcepawn", + files = { "src/parser.c", "src/scanner.c" }, + }, + maintainers = { "@Sarrus1" }, + tier = 3, +} + list.sparql = { install_info = { url = "https://github.com/BonaBeavis/tree-sitter-sparql", diff --git a/queries/sourcepawn/highlights.scm b/queries/sourcepawn/highlights.scm new file mode 100644 index 000000000..bbe37e061 --- /dev/null +++ b/queries/sourcepawn/highlights.scm @@ -0,0 +1,302 @@ +(identifier) @variable + +; Assume all-caps names are constants +((identifier) @constant + (#lua-match? @constant "^[A-Z][A-Z0-9_]+$")) + +; Function definitions/declarations +(function_definition + name: (identifier) @function) + +(function_declaration + name: (identifier) @function) + +(parameter_declaration + name: (identifier) @variable.parameter) + +; Methods / Properties +(field_access + field: (identifier) @variable.member) + +; Function calls +(call_expression + function: (identifier) @function) + +(call_expression + function: + (field_access + field: (identifier) @function.method.call)) + +; Types +[ + (builtin_type) + (any_type) +] @type.builtin + +(type + (identifier) @type) + +; Variables +(variable_declaration + name: (identifier) @variable) + +(old_variable_declaration + name: (identifier) @variable) + +[ + (system_lib_string) + (string_literal) +] @string + +; Preprocessor +[ + "#include" + "#tryinclude" +] @keyword.import + +[ + (preproc_assert) + (preproc_pragma) + (preproc_if) + (preproc_else) + (preproc_elseif) + (preproc_endinput) + (preproc_endif) + (preproc_error) + (preproc_warning) +] @keyword.directive + +[ + "#define" + "#undef" +] @keyword.directive.define + +(macro_param) @variable.parameter + +(preproc_define + name: (identifier) @constant) + +(preproc_macro + name: (identifier) @function.macro) + +(preproc_undefine + name: (identifier) @constant) + +; Expressions +(view_as) @function.builtin + +(sizeof_expression) @function.macro + +[ + (this) + ; https://github.com/alliedmodders/sourcemod/blob/5c0ae11a4619e9cba93478683c7737253ea93ba6/plugins/include/handles.inc#L78 + (hardcoded_symbol) +] @variable.builtin + +; Comments +(comment) @comment @spell + +; General +(parameter_declaration + defaultValue: (identifier) @constant) + +[ + (fixed_dimension) + (dimension) +] @punctuation.bracket + +(escape_sequence) @string.escape + +; Constructors +(new_expression + class: (identifier) @type + arguments: (call_arguments) @constructor) + +; Methodmaps +(methodmap + name: (identifier) @type) + +(methodmap + inherits: (identifier) @type) + +(methodmap_method_constructor + name: (identifier) @constructor) + +(methodmap_method + name: (identifier) @function.method) + +(methodmap_native + name: (identifier) @function.method) + +(methodmap_property + name: (identifier) @property) + +[ + (methodmap_property_getter) + (methodmap_property_setter) +] @function.method + +; Enum structs +(enum_struct + name: (identifier) @type) + +(enum_struct_field + name: (identifier) @variable.member) + +(enum_struct_method + name: (identifier) @function.method) + +; Non-type Keywords +(variable_storage_class) @keyword.storage + +(visibility) @type.qualifier + +(assertion) @function.builtin + +(function_declaration_kind) @keyword.function + +[ + "new" + "delete" +] @keyword.operator + +[ + "." + "," +] @punctuation.delimiter + +; Operators +[ + "+" + "-" + "*" + "/" + "%" + "++" + "--" + "=" + "+=" + "-=" + "*=" + "/=" + "==" + "!=" + "<" + ">" + ">=" + "<=" + "!" + "&&" + "||" + "&" + "|" + "~" + "^" + "<<" + ">>" + ">>>" + "|=" + "&=" + "^=" + "~=" + "<<=" + ">>=" + (ignore_argument) + (scope_access) + (rest_operator) +] @operator + +; public Plugin myinfo +(struct_declaration + name: (identifier) @variable.builtin) + +; Typedef/Typedef +(typedef + name: (identifier) @type) + +(functag + name: (identifier) @type) + +(funcenum + name: (identifier) @type) + +(typeset + name: (identifier) @type) + +(typedef_expression) @keyword.function ; function void(int x) + +; Enums +(enum + name: (identifier) @type) + +(enum_entry + name: (identifier) @constant) + +(enum_entry + value: (_) @constant) + +; Literals +(int_literal) @number + +(char_literal) @character + +(float_literal) @number.float + +(string_literal) @string + +(array_literal) @punctuation.bracket + +(concatenated_string) @punctuation.delimiter + +(bool_literal) @boolean + +(null) @constant.builtin + +((identifier) @constant.builtin + (#eq? @constant.builtin "INVALID_HANDLE")) + +; Keywords +"return" @keyword.return + +[ + "if" + "else" + "case" + "default" + "switch" +] @keyword.conditional + +[ + "do" + "while" + "for" + "continue" + "break" +] @keyword.repeat + +[ + "__nullable__" + "defined" + "delete" + "enum" + "funcenum" + "functag" + "get" + "methodmap" + "new" + "property" + "public" + "set" + "struct" + "typedef" + "typeset" + "void" +] @keyword + +[ + "const" + "native" + "static" + "stock" + "forward" +] @type.qualifier diff --git a/queries/sourcepawn/injections.scm b/queries/sourcepawn/injections.scm new file mode 100644 index 000000000..c579ffad8 --- /dev/null +++ b/queries/sourcepawn/injections.scm @@ -0,0 +1,3 @@ +; Parse JSDoc annotations in comments +((comment) @injection.content + (#set! injection.language "jsdoc")) diff --git a/queries/sourcepawn/locals.scm b/queries/sourcepawn/locals.scm new file mode 100644 index 000000000..39d6fb516 --- /dev/null +++ b/queries/sourcepawn/locals.scm @@ -0,0 +1,19 @@ +[ + (function_definition) + (alias_declaration) + (enum_struct_method) + (methodmap_method) + (methodmap_method_constructor) + (methodmap_method_destructor) + (methodmap_property_method) +] @local.scope + +; Definitions +(variable_declaration + name: (identifier) @local.definition) + +(old_variable_declaration + name: (identifier) @local.definition) + +; References +(identifier) @local.reference