; Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
;
; Licensed under the Apache License, Version 2.0 (the "License");
; you may not use this file except in compliance with the License.
; You may obtain a copy of the License at
;
;     https://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.

; this definition is imprecise in that 
; * any qualified or unqualified call to a method named "Regex" is considered a regex
; * string delimiters are considered part of the regex

; Operators

[
  "??"
  "@"
  "="
  "<"
  ">"
  "!"
  "=="
  "!="
  "<="
  ">="
  "&&"
  "||"
  "+"
  "-"
  "**"
  "*"
  "/"
  "~/"
  "%"
  "|>"
] @keyword.operator

[
  "?"
  "|"
  "->"
] @operator.type

[
  ","
  ":"
  "."
  "?."
] @punctuation.delimiter

[
  "("
  ")"
  "]"
  "{"
  "}"
  ; "[" @punctuation.bracket TODO: FIGURE OUT HOW TO REFER TO CUSTOM TOKENS
] @punctuation.bracket

; Keywords

[
  "abstract"
  "amends"
  "as"
  "class"
  "extends"
  "external"
  "function"
  "hidden"
  "import"
  "import*"
  "in"
  "let"
  "local"
  "module"
  "new"
  "open"
  "out"
  "typealias"
  "when"
] @keyword

[
  "if"
  "is"
  "else"
] @keyword.control.conditional

[
  "for"
] @keyword.control.repeat

(importExpr "import" @keyword.control.import)
(importGlobExpr "import*" @keyword.control.import)

"read" @function.builtin
"read?" @function.builtin
"read*" @function.builtin
"throw" @function.builtin
"trace" @function.builtin

(moduleExpr "module" @type.builtin)
"nothing" @type.builtin
"unknown" @type.builtin

(outerExpr) @variable.builtin
"super" @variable.builtin
(thisExpr) @variable.builtin

[
  (falseLiteral)
  (nullLiteral)
  (trueLiteral)
] @constant.builtin

; Literals

(stringConstant) @string
(slStringLiteral) @string
(mlStringLiteral) @string

(escapeSequence) @constent.character.escape

(intLiteral) @constant.numeric.integer
(floatLiteral) @constant.numeric.float

(interpolationExpr
  "\\(" @punctuation.special
  ")" @punctuation.special) @embedded

(interpolationExpr
 "\\#(" @punctuation.special
 ")" @punctuation.special) @embedded

(interpolationExpr
  "\\##(" @punctuation.special
  ")" @punctuation.special) @embedded

(lineComment) @comment
(blockComment) @comment
(docComment) @comment

; Identifiers

(classProperty (identifier) @variable.other.member)
(objectProperty (identifier) @variable.other.member)

(parameterList (typedIdentifier (identifier) @variable.parameter))
(objectBodyParameters (typedIdentifier (identifier) @variable.parameter))

(identifier) @variable

; Method definitions

(classMethod (methodHeader (identifier)) @function.method)
(objectMethod (methodHeader (identifier)) @function.method)

; Method calls

(methodCallExpr
  (identifier) @function.method)

; Types

(clazz (identifier) @type)
(typeAlias (identifier) @type)
((identifier) @type
 (#match? @type "^[A-Z]"))

(typeArgumentList
  "<" @punctuation.bracket
  ">" @punctuation.bracket)