aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Toohey2024-03-18 12:14:10 +0000
committerGitHub2024-03-18 12:14:10 +0000
commit2e4653ea312dcb69d2453eccaa7c0f873cce6aa5 (patch)
treed5346475ed6f5c01e5daa8f834743b4c51a90c1f
parent94d210c9bf78af1d170534bc3398b334f289be33 (diff)
add koka language support (#8727)
Co-authored-by: Pascal Kuthe <pascal.kuthe@semimod.de>
-rw-r--r--book/src/generated/lang-support.md1
-rw-r--r--languages.toml12
-rw-r--r--runtime/queries/koka/highlights.scm272
-rw-r--r--runtime/queries/koka/indents.scm39
-rw-r--r--runtime/queries/koka/injections.scm2
-rw-r--r--runtime/queries/koka/locals.scm30
6 files changed, 356 insertions, 0 deletions
diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md
index fdec0270..25b22a32 100644
--- a/book/src/generated/lang-support.md
+++ b/book/src/generated/lang-support.md
@@ -95,6 +95,7 @@
| julia | ✓ | ✓ | ✓ | `julia` |
| just | ✓ | ✓ | ✓ | |
| kdl | ✓ | ✓ | ✓ | |
+| koka | ✓ | | ✓ | |
| kotlin | ✓ | | | `kotlin-language-server` |
| latex | ✓ | ✓ | | `texlab` |
| ld | ✓ | | ✓ | |
diff --git a/languages.toml b/languages.toml
index f0d6771f..85d619b8 100644
--- a/languages.toml
+++ b/languages.toml
@@ -3231,6 +3231,18 @@ name = "hocon"
source = { git = "https://github.com/antosha417/tree-sitter-hocon", rev = "c390f10519ae69fdb03b3e5764f5592fb6924bcc" }
[[language]]
+name = "koka"
+scope = "source.koka"
+injection-regex = "koka"
+file-types = ["kk"]
+comment-token = "//"
+indent = { tab-width = 8, unit = " " }
+
+[[grammar]]
+name = "koka"
+source = { git = "https://github.com/mtoohey31/tree-sitter-koka", rev = "2527e152d4b6a79fd50aebd8d0b4b4336c94a034" }
+
+[[language]]
name = "tact"
scope = "source.tact"
injection-regex = "tact"
diff --git a/runtime/queries/koka/highlights.scm b/runtime/queries/koka/highlights.scm
new file mode 100644
index 00000000..fead9838
--- /dev/null
+++ b/runtime/queries/koka/highlights.scm
@@ -0,0 +1,272 @@
+; Function calls
+
+(appexpr
+ function: (appexpr
+ (atom
+ (qidentifier
+ [
+ (qvarid) @function
+ (qidop) @function
+ (identifier
+ [(varid) (idop)] @function)
+ ])))
+ ["(" (block) (fnexpr)])
+
+(ntlappexpr
+ function: (ntlappexpr
+ (atom
+ (qidentifier
+ [
+ (qvarid) @function
+ (qidop) @function
+ (identifier
+ [(varid) (idop)] @function)
+ ])))
+ ["(" (block) (fnexpr)])
+
+(appexpr
+ field: (atom
+ (qidentifier
+ [
+ (qvarid) @function
+ (qidop) @function
+ (identifier
+ [(varid) (idop)] @function)
+ ])))
+
+(appexpr
+ (appexpr
+ field: (atom
+ (qidentifier
+ [
+ (qvarid) @variable
+ (qidop) @variable
+ (identifier
+ [(varid) (idop)] @variable)
+ ])))
+ "[")
+
+(ntlappexpr
+ field: (atom
+ (qidentifier
+ [
+ (qvarid) @function
+ (qidop) @function
+ (identifier
+ [(varid) (idop)] @function)
+ ])))
+
+(ntlappexpr
+ (ntlappexpr
+ field: (atom
+ (qidentifier
+ [
+ (qvarid) @variable
+ (qidop) @variable
+ (identifier
+ [(varid) (idop)] @variable)
+ ])))
+ "[")
+
+[
+ "initially"
+ "finally"
+] @function.special
+
+; Function definitions
+
+(puredecl
+ (funid
+ (identifier
+ [(varid) (idop)] @function)))
+
+(fundecl
+ (funid
+ (identifier
+ [(varid) (idop)] @function)))
+
+(operation
+ (identifier
+ [(varid) (idop)] @function))
+
+; Identifiers
+
+(puredecl
+ (binder
+ (identifier
+ [(varid) (idop)] @constant)))
+
+; TODO: Highlight vars differently once helix has an appropriate highlight query
+; for that purpose.
+
+(pparameter
+ (pattern
+ (identifier
+ (varid) @variable.parameter)))
+
+(paramid
+ (identifier
+ (varid) @variable.parameter))
+
+(typedecl
+ "effect"
+ (varid) @type)
+
+(typeid
+ (varid) @type)
+
+(tbinder
+ (varid) @type)
+
+(typecon
+ (varid) @type)
+
+(qvarid
+ (qid) @namespace)
+
+(modulepath (varid) @namespace)
+
+(qconid) @namespace
+
+(qidop) @namespace
+
+(varid) @variable
+
+(conid) @constructor
+
+; Operators
+
+[
+ "!"
+ "~"
+ "="
+ ":="
+ (idop)
+ (op)
+ (qidop)
+] @operator
+
+; Keywords
+
+[
+ "as"
+ "behind"
+ (externtarget)
+ "forall"
+ "handle"
+ "handler"
+ "in"
+ "infix"
+ "infixl"
+ "infixr"
+ "inject"
+ "mask"
+ "other"
+ "pub"
+ "public"
+ "some"
+] @keyword
+
+[
+ "con"
+ "control"
+ "ctl"
+ "fn"
+ "fun"
+ "rawctl"
+ "rcontrol"
+] @keyword.function
+
+"with" @keyword.control
+
+[
+ "elif"
+ "else"
+ "if"
+ "match"
+ "then"
+] @keyword.control.conditional
+
+[
+ "import"
+ "include"
+ "module"
+] @keyword.control.import
+
+[
+ "alias"
+ "effect"
+ "struct"
+ "type"
+ "val"
+ "var"
+] @keyword.storage.type
+
+[
+ "abstract"
+ "co"
+ "extend"
+ "extern"
+ "fbip"
+ "final"
+ "fip"
+ "inline"
+ "linear"
+ "named"
+ "noinline"
+ "open"
+ "override"
+ "raw"
+ "rec"
+ "ref"
+ "reference"
+ "scoped"
+ "tail"
+ "value"
+] @keyword.storage.modifier
+
+"return" @keyword.control.return
+
+; Delimiters
+
+(matchrule "|" @punctuation.delimiter)
+
+[
+ ","
+ "->"
+ "."
+ ":"
+ "::"
+ "<-"
+ ";"
+] @punctuation.delimiter
+
+[
+ "<"
+ ">"
+ "("
+ ")"
+ "["
+ "]"
+ "{"
+ "}"
+] @punctuation.bracket
+
+; Literals
+
+[
+ (string)
+ (char)
+] @string
+
+(escape) @constant.character.escape
+
+(float) @constant.numeric.float
+(int) @constant.numeric.integer
+
+; Comment
+
+[
+ (linecomment)
+ (blockcomment)
+] @comment
diff --git a/runtime/queries/koka/indents.scm b/runtime/queries/koka/indents.scm
new file mode 100644
index 00000000..0a47bcbb
--- /dev/null
+++ b/runtime/queries/koka/indents.scm
@@ -0,0 +1,39 @@
+[
+ (appexpr ["[" "("]) ; Applications.
+ (ntlappexpr ["[" "("])
+ (atom ["[" "("]) ; Lists and tuples.
+ (program (moduledecl "{")) ; Braced module declarations.
+ (funbody)
+ (block)
+ (handlerexpr)
+ (opclausex)
+] @indent
+
+[
+ (typedecl
+ [(typeid) (opdecls)]) ; Avoid matching single-operation effects.
+ (externdecl)
+ (matchexpr)
+ (matchrule)
+
+ ; For ifexprs, branches (once they exist) will contain blocks if they're
+ ; indented so we just need to make sure the initial indent happens when we're
+ ; creating them.
+ "then"
+ "else"
+] @indent @extend
+
+(matchrule "->" @indent @extend)
+
+; Handling for error recovery.
+(ERROR "fun") @indent @extend
+(ERROR "match") @indent @extend
+(ERROR "->" @indent.always @extend)
+
+; Don't outdent on function parameter declarations.
+(atom ")" @outdent @extend.prevent-once)
+
+[
+ "]"
+ "}"
+] @outdent @extend.prevent-once
diff --git a/runtime/queries/koka/injections.scm b/runtime/queries/koka/injections.scm
new file mode 100644
index 00000000..1d5b8e33
--- /dev/null
+++ b/runtime/queries/koka/injections.scm
@@ -0,0 +1,2 @@
+([(linecomment) (blockcomment)] @injection.content
+ (#set! injection.language "comment"))
diff --git a/runtime/queries/koka/locals.scm b/runtime/queries/koka/locals.scm
new file mode 100644
index 00000000..f8a83e0c
--- /dev/null
+++ b/runtime/queries/koka/locals.scm
@@ -0,0 +1,30 @@
+(modulebody) @local.scope
+
+(block) @local.scope
+
+(pattern
+ (identifier
+ (varid) @local.definition))
+
+(decl
+ (apattern
+ (pattern
+ (identifier
+ (varid) @local.definition))))
+
+(puredecl
+ (funid
+ (identifier
+ (varid) @local.definition)))
+
+(puredecl
+ (binder
+ (identifier
+ (varid) @local.definition)))
+
+(decl
+ (binder
+ (identifier
+ (varid) @local.definition)))
+
+(identifier (varid) @local.reference)