diff options
author | Matthias Wahl | 2023-01-11 01:54:19 +0000 |
---|---|---|
committer | GitHub | 2023-01-11 01:54:19 +0000 |
commit | e65f28d41af0b095eb7ff340f20c7d0d4193e287 (patch) | |
tree | ed0878fa67a7202980b168bda8ba070ae419a9df /runtime/queries | |
parent | 3ca42f7787085ca1c435147da2fcc696a87f6e21 (diff) |
Add language support for ponylang (#5416)
See https://www.ponylang.io
Diffstat (limited to 'runtime/queries')
-rw-r--r-- | runtime/queries/ponylang/highlights.scm | 176 | ||||
-rw-r--r-- | runtime/queries/ponylang/indents.scm | 32 | ||||
-rw-r--r-- | runtime/queries/ponylang/locals.scm | 37 | ||||
-rw-r--r-- | runtime/queries/ponylang/textobjects.scm | 64 |
4 files changed, 309 insertions, 0 deletions
diff --git a/runtime/queries/ponylang/highlights.scm b/runtime/queries/ponylang/highlights.scm new file mode 100644 index 00000000..2d0594a7 --- /dev/null +++ b/runtime/queries/ponylang/highlights.scm @@ -0,0 +1,176 @@ +[ + (line_comment) + (block_comment) +] @comment + +(bool) @constant.builtin.boolean +(integer) @constant.numeric.integer +(float) @constant.numeric.float +(character) @constant.character + +;; strings and docstring +(source_file docstring: (string) @string.special) +(entity docstring: (string) @string.special) +(method docstring: (string) @string.special) ; docstring for methods without body +(behavior docstring: (string) @string.special) ; docstring for methods without body +(constructor docstring: (string) @string.special) ; docstring for methods without body +(method body: (block . (string) @string.special)) ; docstring for methods with body +(behavior body: (block . (string) @string.special)) +(constructor body: (block . (string) @string.special)) +(field docstring: (string) @string.special) +(string) @string + +;; Punctuation +[ + "(" + ")" + "{" + "}" + "[" + "]" +] @punctuation.bracket +[ + ";" + "." + "," +] @punctuation.delimiter + +(this) @variable.builtin + +(field name: (identifier) @variable.other.member) + +"use" @keyword.control.import +[ + "for" + "in" + "while" + "do" + "repeat" + "until" +] @keyword.control.repeat +[ + "if" + "ifdef" + "iftype" + "then" + "elseif" + "else" + "match" +] @keyword.control.conditional +[ + "break" + "continue" + "return" + "error" + "compile_error" + "compile_intrinsic" +] @keyword.control.return +[ + "recover" + "consume" + "end" + "try" + "with" +] @keyword.control + +[ + "as" + "is" + "isnt" + "not" + "and" + "or" + "xor" + "digestof" + "addressof" + (location) +] @keyword.operator + +(entity_type) @keyword.storage.type + +[ + "var" + "let" + "embed" +] @keyword.storage + +[ + "fun" + "be" + "new" +] @keyword.function + +[ + (cap) + (gencap) + "where" +] @keyword + +[ + (partial) + "=>" + "~" + ".>" + "+" + "-" + "*" + "/" + "%" + "%%" + "+~" + "-~" + "/~" + "*~" + "%~" + "%%~" + + ">>" + "<<" + ">>~" + "<<~" + + "==" + "!=" + ">" + "<" + ">=" + "<=" +] @operator + +;; Types +(entity name: (identifier) @type) +(nominal_type name: (identifier) @type) +(typeparams (typeparam name: (identifier) @type)) + +;; constructors / methods / behaviors +(constructor name: (identifier) @constructor) +(method name: (identifier) @function.method) +(behavior name: (identifier) @function.method) + +;; method calls +; TODO: be more specific about what is the actual function reference +(call callee: (field_access field: (identifier) @function.method)) +(call callee: (_) @function.method) +(ffi_call name: (_) @function) +(partial_application function: (identifier) @function.method) +(chain function: (identifier) @function.method) + +;; fields and params +(field name: (identifier) @variable.other.member) +(param (identifier) @variable.parameter) +(lambdaparam (identifier) @variable.parameter) + +;; this.field is considered a member access +(field_access base: (this) field: (identifier) @variable.other.member) + +;; annotations +(annotations (identifier) @attribute) + +;; variables +;; references to upper case things are considered constructors +( + (identifier) @constructor + (#match @constructor "^[A-Z]") +) +(identifier) @variable + diff --git a/runtime/queries/ponylang/indents.scm b/runtime/queries/ponylang/indents.scm new file mode 100644 index 00000000..ef9c8203 --- /dev/null +++ b/runtime/queries/ponylang/indents.scm @@ -0,0 +1,32 @@ +; queries for helix to do automatic indentation upon hitting enter +; TODO: needs more work, cover more cases +[ + (entity) + (method) + (behavior) + (constructor) + (block) + (tuple) + (grouped) +] @indent +(match_case body: (block) @indent) +; ffi_call and call +(_ arguments: (_) @indent) +(assignment right: (_) @indent + (#set! "scope" "all") +) + +[ + (params) + (object) + ("if") +] @extend +(lambda params: (_) @extend) + +[ + "end" + "}" + "]" + ")" + "|" +] @outdent diff --git a/runtime/queries/ponylang/locals.scm b/runtime/queries/ponylang/locals.scm new file mode 100644 index 00000000..e9efd69e --- /dev/null +++ b/runtime/queries/ponylang/locals.scm @@ -0,0 +1,37 @@ +[ + (entity) + (method) + (behavior) + (constructor) + ("if") + (elseif) + (ifdef) + (elseifdef) + (iftype) + (elseiftype) + (match) + (match_case) + ("while") + ("repeat") + ("for") + (lambda) + (try_block) + (with) +] @local.scope +(match else_block: (block) @local.scope) +(try_block else_block: (block) @local.scope) +(try_block then_block: (block) @local.scope) +(with else_block: (block) @local.scope) + +(field name: (identifier) @local.definition) +(local name: (identifier) @local.definition) +(param name: (identifier) @local.definition) +(lambdaparam name: (identifier) @local.definition) +("for" element: (idseq (identifier) @local.definition)) +(withelem name: (idseq (identifier) @local.definition)) + +; only lower case identifiers are references +( + (identifier) @local.reference + (#match? @local.reference "^[a-z_][a-zA-Z_]*") +) diff --git a/runtime/queries/ponylang/textobjects.scm b/runtime/queries/ponylang/textobjects.scm new file mode 100644 index 00000000..0f24583d --- /dev/null +++ b/runtime/queries/ponylang/textobjects.scm @@ -0,0 +1,64 @@ +;; Queries for helix to select textobjects: https://docs.helix-editor.com/usage.html#textobjects +;; function.inside +;; function.around +;; class.inside +;; class.around +;; test.inside +;; test.around +;; parameter.inside +;; comment.inside +;; comment.around + +;; Queries for navigating using textobjects + +[ + (line_comment) + (block_comment) +] @comment.inside + +(line_comment)+ @comment.around +(block_comment) @comment.around + +(entity members: (members)? @class.inside) @class.around +(object members: (members)? @class.inside) @class.around + +(method + body: (block)? @function.inside +) @function.around +(behavior + body: (block)? @function.inside +) @function.around +(constructor + body: (block)? @function.inside +) @function.around +(lambda + body: (block)? @function.inside +) @function.outside + +(params + ((_) @parameter.inside . ","? @parameter.around) @parameter.around +) +(lambda + params: ((_) @parameter.inside . ","? @parameter.around) @parameter.around +) +(typeargs + ((_) @parameter.inside . ","? @parameter.around) @parameter.around +) +(typeparams + ((_) @parameter.inside . ","? @parameter.around) @parameter.around +) +(arguments + positional: (positional_args + ((_) @parameter.inside . ","? @parameter.around)? @parameter.around) + ; TODO: get named args right + named: (named_args ((_) @parameter.inside . ","? @parameter.around)? @parameter.around) +) + +( + (entity + provides: (type (nominal_type name: (identifier) @_provides)) + members: (members) @test.inside + ) @test.outside + (#eq? @_provides "UnitTest") +) + |