aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatouš Dzivjak2024-02-09 10:44:46 +0000
committerGitHub2024-02-09 10:44:46 +0000
commitd137a08231515b0a1694a3841081331e529ce953 (patch)
tree211b0b0266f6830f2522ed52967a22b59edc9ad8
parentf8e2d822ba3716aa986acee003f3093268344160 (diff)
feat(languages): pkl (#9515)
* feat(languages): pkl Add [pkl](https://github.com/apple/pkl) language. Official documentation: https://pkl-lang.org/ * remove branch indent
-rw-r--r--book/src/generated/lang-support.md1
-rw-r--r--languages.toml11
-rw-r--r--runtime/queries/pkl/highlights.scm179
-rw-r--r--runtime/queries/pkl/indents.scm23
-rw-r--r--runtime/queries/pkl/injections.scm30
5 files changed, 244 insertions, 0 deletions
diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md
index 279acc4f..c91b9ae1 100644
--- a/book/src/generated/lang-support.md
+++ b/book/src/generated/lang-support.md
@@ -123,6 +123,7 @@
| pem | ✓ | | | |
| perl | ✓ | ✓ | ✓ | `perlnavigator` |
| php | ✓ | ✓ | ✓ | `intelephense` |
+| pkl | ✓ | | ✓ | |
| po | ✓ | ✓ | | |
| pod | ✓ | | | |
| ponylang | ✓ | ✓ | ✓ | |
diff --git a/languages.toml b/languages.toml
index bad22129..30b41157 100644
--- a/languages.toml
+++ b/languages.toml
@@ -3061,3 +3061,14 @@ indent = { tab-width = 4, unit = " " }
name = "tact"
source = { git = "https://github.com/tact-lang/tree-sitter-tact", rev = "ec57ab29c86d632639726631fb2bb178d23e1c91" }
+[[language]]
+name = "pkl"
+scope = "source.pkl"
+injection-regex = "pkl"
+file-types = ["pkl", "pcf"]
+comment-token = "//"
+indent = { tab-width = 2, unit = " " }
+
+[[grammar]]
+name = "pkl"
+source = { git = "https://github.com/apple/tree-sitter-pkl", rev = "c03f04a313b712f8ab00a2d862c10b37318699ae" }
diff --git a/runtime/queries/pkl/highlights.scm b/runtime/queries/pkl/highlights.scm
new file mode 100644
index 00000000..501c9485
--- /dev/null
+++ b/runtime/queries/pkl/highlights.scm
@@ -0,0 +1,179 @@
+; 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)
diff --git a/runtime/queries/pkl/indents.scm b/runtime/queries/pkl/indents.scm
new file mode 100644
index 00000000..d2a9be1a
--- /dev/null
+++ b/runtime/queries/pkl/indents.scm
@@ -0,0 +1,23 @@
+; 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
+[
+ (objectBody)
+ (classBody)
+ (ifExpr)
+ (mlStringLiteral) ; This isn't perfect; newlines are too indented but it's better than if omitted.
+] @indent
diff --git a/runtime/queries/pkl/injections.scm b/runtime/queries/pkl/injections.scm
new file mode 100644
index 00000000..15867f35
--- /dev/null
+++ b/runtime/queries/pkl/injections.scm
@@ -0,0 +1,30 @@
+; 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
+(
+ ((methodCallExpr (identifier) @methodName (argumentList (slStringLiteral) @injection.content))
+ (#set! injection.language "regex"))
+ (eq? @methodName "Regex"))
+
+((lineComment) @injection.content
+ (#set! injection.language "comment"))
+
+((blockComment) @injection.content
+ (#set! injection.language "comment"))
+
+((docComment) @injection.content
+ (#set! injection.language "markdown"))