Skip to content

Commit

Permalink
feat(languages): pkl (helix-editor#9515)
Browse files Browse the repository at this point in the history
* feat(languages): pkl

Add [pkl](https://github.com/apple/pkl) language.
Official documentation: https://pkl-lang.org/

* remove branch indent
  • Loading branch information
matoous authored and Schuyler Mortimer committed Jul 10, 2024
1 parent 624194b commit 1328202
Show file tree
Hide file tree
Showing 5 changed files with 244 additions and 0 deletions.
1 change: 1 addition & 0 deletions book/src/generated/lang-support.md
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@
| pem || | | |
| perl |||| `perlnavigator` |
| php |||| `intelephense` |
| pkl || || |
| po ||| | |
| pod || | | |
| ponylang |||| |
Expand Down
11 changes: 11 additions & 0 deletions languages.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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" }
179 changes: 179 additions & 0 deletions runtime/queries/pkl/highlights.scm
Original file line number Diff line number Diff line change
@@ -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)
23 changes: 23 additions & 0 deletions runtime/queries/pkl/indents.scm
Original file line number Diff line number Diff line change
@@ -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
30 changes: 30 additions & 0 deletions runtime/queries/pkl/injections.scm
Original file line number Diff line number Diff line change
@@ -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"))

0 comments on commit 1328202

Please sign in to comment.