diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md index 246e946d..b8595b32 100644 --- a/book/src/generated/lang-support.md +++ b/book/src/generated/lang-support.md @@ -209,6 +209,7 @@ | pest | ✓ | ✓ | ✓ | | | `pest-language-server` | | php | ✓ | ✓ | ✓ | ✓ | ✓ | `intelephense` | | php-only | ✓ | | | ✓ | | | +| picat | ✓ | ✓ | ✓ | ✓ | ✓ | | | pip-requirements | ✓ | | | | | | | pkgbuild | ✓ | ✓ | ✓ | | | `termux-language-server`, `bash-language-server` | | pkl | ✓ | | ✓ | | | `pkl-lsp` | diff --git a/languages.toml b/languages.toml index d1ac4c6e..69fd19b8 100644 --- a/languages.toml +++ b/languages.toml @@ -1740,6 +1740,21 @@ args = { console = "internalConsole", attachCommands = [ "platform select remote name = "zig" source = { git = "https://github.com/tree-sitter-grammars/tree-sitter-zig", rev = "6479aa13f32f701c383083d8b28360ebd682fb7d" } +[[grammar]] +name = "picat" +source = { git = "https://github.com/dlr-ft/tree-sitter-picat", rev = "ecb6b07d280f2cef8214bc4b999ad83ac1d9205c" } + +[[language]] +name = "picat" +scope = "source.picat" +injection-regex = "(pi|picat)" +language-id = "picat" +file-types = ["pi", "picat"] +shebangs = ["picat"] +comment-token = "%" +block-comment-tokens = { start = "/*", end = "*/" } +indent = { tab-width = 4, unit = " " } + [[language]] name = "prolog" scope = "source.prolog" diff --git a/runtime/queries/picat/highlights.scm b/runtime/queries/picat/highlights.scm new file mode 100644 index 00000000..3caf4b1c --- /dev/null +++ b/runtime/queries/picat/highlights.scm @@ -0,0 +1,123 @@ +; hightlights.scm + +[ + "." + "@" + "**" + "+" + "-" + "~" + "*" + "/" + "//" + "/<" + "/>" + "div" + "mod" + "rem" + ">>" + "<<" + "/\\" + "^" + "\\/" + ".." + "++" + "=" + "!=" + ":=" + "==" + "!==" + "=:=" + "<" + "=<" + "<=" + ">" + ">=" + "::" + "in" + "notin" + "=.." + "#=" + "#!=" + "#<" + "#=<" + "#<=" + "#>" + "#>=" + "@<" + "@=<" + "@<=" + "@>" + "@>=" + "#~" + "#/\\" + "#^" + "#\\/" + "#=>" + "#<=>" + "not" + "once" + "\\+" + "&&" + ";" + "||" +] @operator + +[ + "(" + ")" + "[" + "]" + "{" + "}" +] @punctuation.bracket + + +[ + "do" + "else" + "end" + "foreach" + "if" + "import" + "in" + "index" + "module" + "private" + "table" + "then" + "while" + "throw" + "true" + "false" + "fail" +] @keyword + +(predicate_definition (predicate_rule name: (atom) @function)) +(predicate_definition (predicate_fact name: (atom) @function)) +(function_definition (function_rule name: (atom) @function)) +(function_definition (function_fact name: (atom) @function)) +(actor_definition (action_rule name: (atom) @function)) +(actor_definition (nonbacktrackable_predicate_rule name: (atom) @function)) + +(integer) @constant.numeric.integer +(real) @constant.numeric.float +(string) @string +(comment) @comment + +[ + "=>" + "->" + "$" +] @punctuation.special + + +(parameters + [(variable) @variable.parameter + (atom) @variable.parameter + (array_expression [(variable) @variable.parameter (atom) @variable.parameter]) + (list_expression [(variable) @variable.parameter (atom) @variable.parameter]) + (as_pattern_expression left: [(variable) @variable.parameter (atom) @variable.parameter])]) + +(function_call function: (atom) @function) +(dot_expression right: (atom) @function) diff --git a/runtime/queries/picat/indents.scm b/runtime/queries/picat/indents.scm new file mode 100644 index 00000000..6a11d4cc --- /dev/null +++ b/runtime/queries/picat/indents.scm @@ -0,0 +1,30 @@ +[ + (array_expression) + (list_expression) + (braced_goal) + (arguments) + (parameters) + + (predicate_rule) + (predicate_fact) + (function_rule) + (function_fact) + (action_rule) + (nonbacktrackable_predicate_rule) + + (if_statement) + (while_statement) + (foreach_statement) + (do_statement) +] @indent + +[ + ")" + "}" + "]" +] @outdent + +(if_statement "elseif" (_) @outdent) +(if_statement "else" (_) @outdent) +(while_statement "do" (_) @outdent) +(do_statement "while" (_) @outdent) diff --git a/runtime/queries/picat/locals.scm b/runtime/queries/picat/locals.scm new file mode 100644 index 00000000..c1a83698 --- /dev/null +++ b/runtime/queries/picat/locals.scm @@ -0,0 +1,25 @@ +; locals + +[ + (predicate_definition) + (function_definition) + (actor_definition) + (actor_definition) +] @local.scope + +(import_declaration (_) @local.definition.namespace) + +(module_declaration (_) @local.definition.namespace) + +(binary_relational_expression left: (atom) @local.definition.variable) + +(parameters + [(variable) @local.definition.variable.parameter + (atom) @local.definition.variable.parameter + (array_expression [(variable) (atom)] @local.definition.variable.parameter) + (list_expression [(variable) (atom)] @local.definition.variable.parameter) + (as_pattern_expression left: [(variable) (atom)] @local.definition.variable.parameter)]) + +(arguments (argument [(variable) @local.reference (atom) @local.reference])) + +[(variable) (atom)] @local.reference diff --git a/runtime/queries/picat/rainbows.scm b/runtime/queries/picat/rainbows.scm new file mode 100644 index 00000000..7bd2816b --- /dev/null +++ b/runtime/queries/picat/rainbows.scm @@ -0,0 +1,9 @@ +["(" ")" "[" "]" "{" "}"] @rainbow.bracket + +[ + (array_expression) + (list_expression) + (parameters) + (arguments) + (braced_goal) +] @rainbow.scope diff --git a/runtime/queries/picat/tags.scm b/runtime/queries/picat/tags.scm new file mode 100644 index 00000000..0f72e206 --- /dev/null +++ b/runtime/queries/picat/tags.scm @@ -0,0 +1,27 @@ +; tags.scm + +( + (comment)* @doc + . + [ + (function_definition + [(function_rule name: (_) @name) @definition.function + (function_fact name: (_) @name) @definition.function]) + (predicate_definition + [(predicate_rule name: (_) @name) @definition.function + (predicate_fact name: (_) @name) @definition.function]) + (actor_definition + [(action_rule name: (_) @name) @definition.function + (nonbacktrackable_predicate_rule name: (_) @name) @definition.function]) + ] + (#strip! @doc "^%\\s*") + (#select-adjacent! @doc @definition.function) +) + +(function_call function: (_) @name @reference.call) + +(dot_expression right: (_) @reference.call) + +(import_declaration (_) @name) @reference.module + +(module_declaration (_) @name) @definition.module diff --git a/runtime/queries/picat/textobjects.scm b/runtime/queries/picat/textobjects.scm new file mode 100644 index 00000000..265e2fc9 --- /dev/null +++ b/runtime/queries/picat/textobjects.scm @@ -0,0 +1,26 @@ +[ + (function_definition + [(function_rule) (function_fact)] @function.inside) + (predicate_definition + [(predicate_rule) (predicate_fact)] @function.inside) + (actor_definition + [(action_rule) (nonbacktrackable_predicate_rule)] @function.inside) +] @function.around + +(import_declaration + (atom) @function.around) + +(parameters + ((_) @parameter.inside . ","? @parameter.around) @parameter.around) + +(arguments + ((_) @parameter.inside . ","? @parameter.around) @parameter.around) + +(comment) @comment.inside +(comment)+ @comment.around + +(array_expression + (_) @entry.around) + +(list_expression + (_) @entry.around)