Compare commits

..

28 Commits

Author SHA1 Message Date
Dan Chao 91820100f7 Prepare 0.25.3 release 2024-03-26 08:49:05 -07:00
Daniel Chao 4ae98b4bf6 Add release notes for 0.25.3 (#363) 2024-03-26 08:37:43 -07:00
Philip K.F. Hölzenspies 4006c087d9 Avoid resolving paths on fragments (#357)
Fixes an issue where modules with fragment paths are resolved against the URI path.
2024-03-26 08:28:40 -07:00
Daniel Chao 87d91b1950 Fix source links in pkldoc (#362)
Fixes an issue where source links are incorrectly URI encoded; i.e. `https%3A//github.com` instead of `https://github.com`.

This was causing the browser to resolve these as relative to the enclosing page.
2024-03-26 07:54:42 -07:00
Malix 29cb8ea4f2 Add TOML to comparison page (#337)
Puts TOML next to JSON, XML, YAML
2024-03-20 11:48:05 -07:00
Zihlu Wang a490e9d811 Update pkl-config-java.adoc (#340)
Remove unpaired back curly bracket.
2024-03-20 11:48:01 -07:00
Kushal Pisavadia c8786f61e3 Persist jpkl to the workspace for releases (#314)
This is something that was published to Maven but not as a GitHub release.
 Persist it so that it can go out with a release.
2024-03-20 11:47:39 -07:00
Islon Scherer f3a93cdd78 fix bug with for generator variables in mixin (#297) 2024-03-20 11:47:18 -07:00
Daniel Chao e5a81b6803 Fix amending module with abstract class (#319)
This fixes an assertion error that gets thrown if:
1. A module declares a class as abstract
2. An amending module does not use that abstract class as a type

Underneath the hood, the modifiers of the class/typelias object member
is considered different from the modifiers on the VmClass/VmTypeAlias
values.

The object model skips forcing any explicitly members that are explicitly
declared hidden, abstract, or local.
However, it _should_ evaluate any abstract classes found in a module.
So, it's incorrect to apply the same modifiers on the class to the object member.
2024-03-20 11:45:50 -07:00
Daniel Chao 441bc5861a Use smaller compute resource for patch test (#315)
Change resource size to "small".
2024-03-20 11:45:39 -07:00
Daniel Chao de4f0e995b Docs fix: Container is not a type, add more types (#282)
Adjusts documentation to remove legacy `Container` type,
and add the rest of the generic types in the stdlib.
2024-03-20 11:45:02 -07:00
Daniel Chao 346880f9cf Docs fix: Java 8 is not supported (#283)
Java 11 is the minimum version, rather than 8.
2024-03-20 11:44:58 -07:00
Daniel Chao 906111d327 Fix: add missing "const" and "fixed" modifiers to reflect API (#265)
This fixes an issue where the reflect API does not show fixed or const modifiers on a property.
2024-03-20 11:44:29 -07:00
Daniel Chao 08be512fe1 Add approval for release/x.x branch (#338)
Temporary workaround for now because our CI policy requires it.
2024-03-20 11:44:07 -07:00
Daniel Chao 6b04e1d606 Add CI to release/x.x branch (#333)
Adds logic to build (but not deploy) commits on the release branch.

This is so we have CI coverage for new patch releases of older versions.
2024-03-20 11:44:01 -07:00
Daniel Chao 1452dc5af3 Improve CircleCI builds (#294)
* Prevent build_artifacts.txt files from being published as
  GitHub releases
* Bump version to 1.0.2; make PRBs not depend on flakey pr-approval job
2024-03-20 11:43:52 -07:00
Daniel Chao 3421a97478 Add CI check to test patch file (#253)
This tests that the patch file can apply in CI.
2024-03-20 11:43:41 -07:00
d4wae89d498 0829ac486c Fix missing closing quotes in Local dependencies #298 (#299)
Fix missing closing quotes in 'Local Dependencies' section of index.adoc to ensure syntax correctness.
2024-03-07 11:45:10 -08:00
Daniel Chao 8209ea78bd Add homebrew instructions to docs (#270) 2024-02-29 11:07:01 -08:00
Daniel Chao d9f8b8efa9 Add specification for language binding API (#257)
This adds documentation for how the language bindings works, for those that wish to create their own bindings.
2024-02-28 09:33:13 -08:00
Miroslav Shakhmaykin a210bfd6a3 Fix doc navigation 2024-02-28 09:31:58 -08:00
grant-abbott f26195509f Addressing documentation discrepancies from pkl examples. 2024-02-22 19:48:57 -08:00
GrantA 49556737c6 Fix incorrect filename in tutorial
The referenced filename should be `ispklTutorialPart3.pkl`, not `pklTutorial.pkl`.

Also, changes dates from 2023 to 2024

Co-authored-by: grant-abbott <gaabbott@apple.com>
2024-02-22 15:10:51 -08:00
Islon Scherer 2ccebd3aed fix typo in doc for Listing default (#224)
(cherry picked from commit c652bbe5cd)
2024-02-22 10:29:53 +01:00
Zack McCauley 504c4a3213 Fix multiple output example code (#205) 2024-02-20 15:03:24 +01:00
r1ft1 f7921f0c6f Typo: Update use-cases.adoc (#143)
corrected typo maintian -> maintain
2024-02-14 16:08:24 -08:00
Daniel Chao 56d88c9efc Fix docs pointing to wrong maven repo (#106) 2024-02-12 21:29:22 -08:00
Dan Chao f260c8553c Remove line from changelog
This change got reverted prior to the release.
2024-02-08 17:30:08 -08:00
117 changed files with 1510 additions and 303 deletions
+65 -8
View File
@@ -14,14 +14,16 @@
// limitations under the License.
//===----------------------------------------------------------------------===//
// File gets rendered to .circleci/config.yml via git hook.
amends "package://pkg.pkl-lang.org/pkl-project-commons/pkl.impl.circleci@1.0.1#/PklCI.pkl"
amends "package://pkg.pkl-lang.org/pkl-project-commons/pkl.impl.circleci@1.1.0#/PklCI.pkl"
import "jobs/BuildNativeJob.pkl"
import "jobs/GradleCheckJob.pkl"
import "jobs/DeployJob.pkl"
import "jobs/SimpleGradleJob.pkl"
local prbJobs: Listing<String> = gradleCheckJobs.keys.toListing()
local prbJobs: Listing<String> = (gradleCheckJobs.keys.toListing()) {
"check-patch-file"
}
local buildAndTestJobs = (prbJobs) {
"bench"
@@ -51,6 +53,44 @@ main {
}
}
// TODO: remove me once policy allows these jobs without approval
circleCi {
workflows {
["release-branch"] {
jobs = new Listing<*Mapping<String, WorkflowJob>|String> {
new {
["hold"] {
type = "approval"
}
}
new {
["pr-approval/authenticate"] {
context = "pkl-pr-approval"
}
}
for (job in super.jobs) {
job |> requireApproval
}
}
}
}
}
// TODO: remove me once policy allows these jobs without approval
local requireApproval = (it: String|Mapping<String, WorkflowJob>) ->
if (it is String)
new Mapping<String, WorkflowJob> {
[it] {
requires { "hold" }
}
}
else
(it) {
[it.keys.first] {
requires { "hold" }
}
}
release {
jobs {
...releaseJobs
@@ -71,6 +111,10 @@ release {
}
}
releaseBranch {
jobs = releaseJobs
}
triggerDocsBuild = "both"
triggerPackageDocsBuild = "release"
@@ -122,24 +166,22 @@ jobs {
:pkl-gradle:compatibilityTestCandidate
"""#
}.job
["deploy-snapshot"] = new DeployJob {
command = "publishToSonatype"
}.job
["deploy-snapshot"] = new DeployJob { command = "publishToSonatype" }.job
["deploy-release"] = new DeployJob {
isRelease = true
command = "publishToSonatype closeAndReleaseSonatypeStagingRepository"
}.job
["github-release"] {
docker {
new {
image = "maniator/gh:v2.40.1"
}
new { image = "maniator/gh:v2.40.1" }
}
steps {
new AttachWorkspaceStep { at = "." }
new RunStep {
name = "Publish release on GitHub"
command = #"""
# exclude build_artifacts.txt from publish
rm pkl-cli/build/executable/*.build_artifacts.txt
gh release create "${CIRCLE_TAG}" \
--title "${CIRCLE_TAG}" \
--target "${CIRCLE_SHA1}" \
@@ -151,4 +193,19 @@ jobs {
}
}
}
["check-patch-file"] {
docker {
new { image = "cimg/base:current" }
}
steps {
"checkout"
new RunStep {
// language=bash
command = #"""
git apply --reject patches/graalVm23.patch
"""#
}
}
resource_class = "small"
}
}
+67 -2
View File
@@ -661,6 +661,10 @@ jobs:
at: '.'
- run:
command: ./gradlew --info --stacktrace publishToSonatype
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- run:
command: |-
mkdir ~/test-results/
@@ -680,6 +684,10 @@ jobs:
at: '.'
- run:
command: ./gradlew --info --stacktrace -DreleaseBuild=true publishToSonatype closeAndReleaseSonatypeStagingRepository
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- run:
command: |-
mkdir ~/test-results/
@@ -698,6 +706,8 @@ jobs:
at: '.'
- run:
command: |-
# exclude build_artifacts.txt from publish
rm pkl-cli/build/executable/*.build_artifacts.txt
gh release create "${CIRCLE_TAG}" \
--title "${CIRCLE_TAG}" \
--target "${CIRCLE_SHA1}" \
@@ -708,6 +718,14 @@ jobs:
name: Publish release on GitHub
docker:
- image: maniator/gh:v2.40.1
check-patch-file:
steps:
- checkout
- run:
command: git apply --reject patches/graalVm23.patch
resource_class: small
docker:
- image: cimg/base:current
trigger-docsite-build:
steps:
- run:
@@ -744,11 +762,12 @@ workflows:
- gradle-check-jdk11:
requires:
- hold
- pr-approval/authenticate
- gradle-check-jdk17:
requires:
- hold
- pr-approval/authenticate
- check-patch-file:
requires:
- hold
when:
matches:
value: << pipeline.git.branch >>
@@ -757,6 +776,7 @@ workflows:
jobs:
- gradle-check-jdk11
- gradle-check-jdk17
- check-patch-file
- bench
- pkl-cli-macOS-amd64-snapshot
- pkl-cli-linux-amd64-snapshot
@@ -767,6 +787,7 @@ workflows:
requires:
- gradle-check-jdk11
- gradle-check-jdk17
- check-patch-file
- bench
- pkl-cli-macOS-amd64-snapshot
- pkl-cli-linux-amd64-snapshot
@@ -797,6 +818,12 @@ workflows:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
- check-patch-file:
filters:
branches:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
- bench:
filters:
branches:
@@ -837,6 +864,7 @@ workflows:
requires:
- gradle-check-jdk11
- gradle-check-jdk17
- check-patch-file
- bench
- pkl-cli-macOS-amd64-release
- pkl-cli-linux-amd64-release
@@ -868,3 +896,40 @@ workflows:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
release-branch:
jobs:
- hold:
type: approval
- pr-approval/authenticate:
context: pkl-pr-approval
- gradle-check-jdk11:
requires:
- hold
- gradle-check-jdk17:
requires:
- hold
- check-patch-file:
requires:
- hold
- bench:
requires:
- hold
- pkl-cli-macOS-amd64-release:
requires:
- hold
- pkl-cli-linux-amd64-release:
requires:
- hold
- pkl-cli-macOS-aarch64-release:
requires:
- hold
- pkl-cli-linux-aarch64-release:
requires:
- hold
- pkl-cli-linux-alpine-amd64-release:
requires:
- hold
when:
matches:
value: << pipeline.git.branch >>
pattern: ^release/\d+\.\d+$
+1 -1
View File
@@ -16,7 +16,7 @@
/// Builds the native `pkl` CLI
extends "GradleJob.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.0.0#/Config.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.1.0#/Config.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/pkl.experimental.uri@1.0.0#/URI.pkl"
/// The OS to run on
+8 -1
View File
@@ -15,7 +15,7 @@
//===----------------------------------------------------------------------===//
extends "GradleJob.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.0.0#/Config.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.1.0#/Config.pkl"
local self = this
@@ -32,4 +32,11 @@ steps {
new Config.RunStep {
command = "./gradlew \(self.gradleArgs) \(module.command)"
}
// add jpkl to workspace so it gets published as a GitHub release
new Config.PersistToWorkspaceStep {
root = "."
paths {
"pkl-cli/build/executable/"
}
}
}
+1 -1
View File
@@ -15,7 +15,7 @@
//===----------------------------------------------------------------------===//
extends "GradleJob.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.0.0#/Config.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.1.0#/Config.pkl"
javaVersion: "11.0"|"17.0"
+1 -1
View File
@@ -15,7 +15,7 @@
//===----------------------------------------------------------------------===//
abstract module GradleJob
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.0.0#/Config.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.1.0#/Config.pkl"
/// Whether this is a release build or not.
isRelease: Boolean = false
+1 -1
View File
@@ -15,7 +15,7 @@
//===----------------------------------------------------------------------===//
extends "GradleJob.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.0.0#/Config.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.1.0#/Config.pkl"
name: String = command
+1 -1
View File
@@ -1,6 +1,6 @@
name: main
title: Main Project
version: 0.25.2
version: 0.25.3
prerelease: false
nav:
- nav.adoc
@@ -4,3 +4,6 @@
* xref:kotlin-binding:index.adoc[Kotlin]
* xref:swift:ROOT:index.adoc[Swift]
* xref:go:ROOT:index.adoc[Go]
* xref:bindings-specification:index.adoc[Specification]
** xref:bindings-specification:message-passing-api.adoc[Message Passing API]
** xref:bindings-specification:binary-encoding.adoc[Pkl Binary Encoding]
@@ -3,7 +3,7 @@
// the following attributes must be updated immediately before a release
// pkl version corresponding to current git commit without -dev suffix or git hash
:pkl-version-no-suffix: 0.25.2
:pkl-version-no-suffix: 0.25.3
// tells whether pkl version corresponding to current git commit
// is a release version (:is-release-version: '') or dev version (:!is-release-version:)
:is-release-version: ''
@@ -66,3 +66,76 @@ endif::[]
:uri-config-java-example: {uri-pkl-examples-tree}/config-java
:uri-config-kotlin-example: {uri-pkl-examples-tree}/config-kotlin
:uri-pkldoc-example: {uri-pkl-examples-tree}/pkldoc
:uri-stdlib-baseModule: {uri-pkl-stdlib-docs}/base
:uri-stdlib-jsonnetModule: {uri-pkl-stdlib-docs}/jsonnet
:uri-stdlib-reflectModule: {uri-pkl-stdlib-docs}/reflect
:uri-stdlib-xmlModule: {uri-pkl-stdlib-docs}/xml
:uri-stdlib-protobufModule: {uri-pkl-stdlib-docs}/protobuf
:uri-stdlib-Boolean: {uri-stdlib-baseModule}/Boolean
:uri-stdlib-xor: {uri-stdlib-baseModule}/Boolean#xor()
:uri-stdlib-implies: {uri-stdlib-baseModule}/Boolean#implies()
:uri-stdlib-Any: {uri-stdlib-baseModule}/Any
:uri-stdlib-String: {uri-stdlib-baseModule}/String
:uri-stdlib-Int: {uri-stdlib-baseModule}/Int
:uri-stdlib-Float: {uri-stdlib-baseModule}/Float
:uri-stdlib-Number: {uri-stdlib-baseModule}/Number
:uri-stdlib-NaN: {uri-stdlib-baseModule}/#NaN
:uri-stdlib-Infinity: {uri-stdlib-baseModule}/#Infinity
:uri-stdlib-isBetween: {uri-stdlib-baseModule}/Number#isBetween
:uri-stdlib-isFinite: {uri-stdlib-baseModule}/Number#isFinite
:uri-stdlib-Int8: {uri-stdlib-baseModule}/#Int8
:uri-stdlib-Int16: {uri-stdlib-baseModule}/#Int16
:uri-stdlib-Int32: {uri-stdlib-baseModule}/#Int32
:uri-stdlib-UInt8: {uri-stdlib-baseModule}/#UInt8
:uri-stdlib-UInt16: {uri-stdlib-baseModule}/#UInt16
:uri-stdlib-UInt32: {uri-stdlib-baseModule}/#UInt32
:uri-stdlib-UInt: {uri-stdlib-baseModule}/#UInt
:uri-stdlib-Uri: {uri-stdlib-baseModule}/#Uri
:uri-stdlib-matches: {uri-stdlib-baseModule}/String#matches()
:uri-stdlib-Null: {uri-stdlib-baseModule}/Null
:uri-stdlib-ifNonNull: {uri-stdlib-baseModule}/Null#ifNonNull()
:uri-stdlib-List: {uri-stdlib-baseModule}/List
:uri-stdlib-Set: {uri-stdlib-baseModule}/Set
:uri-stdlib-Map: {uri-stdlib-baseModule}/Map
:uri-stdlib-Listing: {uri-stdlib-baseModule}/Listing
:uri-stdlib-Listing-default: {uri-stdlib-baseModule}/Listing#default
:uri-stdlib-Listing-isDistinct: {uri-stdlib-baseModule}/Listing#isDistinct
:uri-stdlib-Listing-isDistinctBy: {uri-stdlib-baseModule}/Listing#isDistinctBy()
:uri-stdlib-Mapping: {uri-stdlib-baseModule}/Mapping
:uri-stdlib-Mapping-default: {uri-stdlib-baseModule}/Mapping#default
:uri-stdlib-Duration: {uri-stdlib-baseModule}/Duration
:uri-stdlib-Duration-value: {uri-stdlib-baseModule}/Duration#value
:uri-stdlib-Duration-unit: {uri-stdlib-baseModule}/Duration#unit
:uri-stdlib-DurationUnit: {uri-stdlib-baseModule}/#DurationUnit
:uri-stdlib-DataSize: {uri-stdlib-baseModule}/DataSize
:uri-stdlib-DataSize-value: {uri-stdlib-baseModule}/DataSize#value
:uri-stdlib-DataSize-unit: {uri-stdlib-baseModule}/DataSize#unit
:uri-stdlib-DataSizeUnit: {uri-stdlib-baseModule}/#DataSizeUnit
:uri-stdlib-Dynamic: {uri-stdlib-baseModule}/Dynamic
:uri-stdlib-Dynamic-toTyped: {uri-stdlib-baseModule}/Dynamic#toTyped()
:uri-stdlib-Typed: {uri-stdlib-baseModule}/Typed
:uri-stdlib-Regex: {uri-stdlib-baseModule}/Regex
:uri-stdlib-Regex-method: {uri-stdlib-baseModule}/#Regex()
:uri-stdlib-Regex-match: {uri-stdlib-baseModule}/Regex#match
:uri-stdlib-RegexMatch: {uri-stdlib-baseModule}/RegexMatch
:uri-stdlib-Pair: {uri-stdlib-baseModule}/Pair
:uri-stdlib-IntSeq: {uri-stdlib-baseModule}/IntSeq
:uri-stdlib-Class: {uri-stdlib-baseModule}/Class
:uri-stdlib-TypeAlias: {uri-stdlib-baseModule}/TypeAlias
:uri-stdlib-Deprecated: {uri-stdlib-baseModule}/Deprecated
:uri-stdlib-ValueRenderer: {uri-stdlib-baseModule}/ValueRenderer
:uri-stdlib-PcfRenderer-converters: {uri-stdlib-baseModule}/PcfRenderer#converters
:uri-stdlib-Function: {uri-stdlib-baseModule}/Function
:uri-stdlib-Function0: {uri-stdlib-baseModule}/Function0
:uri-stdlib-Function1: {uri-stdlib-baseModule}/Function1
:uri-stdlib-Function1-apply: {uri-stdlib-baseModule}/Function1#apply()
:uri-stdlib-Function2: {uri-stdlib-baseModule}/Function2
:uri-stdlib-Function3: {uri-stdlib-baseModule}/Function3
:uri-stdlib-Function4: {uri-stdlib-baseModule}/Function4
:uri-stdlib-Function5: {uri-stdlib-baseModule}/Function5
:uri-stdlib-Resource: {uri-stdlib-baseModule}/Resource
:uri-stdlib-outputFiles: {uri-stdlib-baseModule}/ModuleOutput#files
:uri-messagepack: https://msgpack.org/index.html
:uri-messagepack-spec: https://github.com/msgpack/msgpack/blob/master/spec.md
@@ -0,0 +1,197 @@
= Pkl Binary Encoding
include::ROOT:partial$component-attributes.adoc[]
include::partial$component-attributes.adoc[]
Pkl values can be encoded into a binary format.
This format is used for Pkl's non-JVM language bindings, for example, for its Go and Swift bindings.
The binary format is uses link:{uri-messagepack}[MessagePack] encoding.
== Primitives
All Pkl primitives turn into their respective MessagePack primitive.
|===
|Pkl Type|MessagePack format
|link:{uri-stdlib-Int}[Int]
|link:{uri-messagepack-int}[int]
|link:{uri-stdlib-Float}[Float]
|link:{uri-messagepack-float}[float]
|link:{uri-stdlib-String}[String]
|link:{uri-messagepack-str}[string]
|link:{uri-stdlib-Boolean}[Boolean]
|link:{uri-messagepack-bool}[bool]
|link:{uri-stdlib-Null}[Null]
|link:{uri-messagepack-nil}[nil]
|===
NOTE: Pkl integers are encoded into the smallest int type that the number will fit into.
For example, value `8` gets encoded as MessagePack `int8` format.
== Non-primitives
All non-primitive values are encoded as MessagePack arrays.
The first slot of the array designates the value's type. The remaining slots have fixed meanings depending on the type.
The array's length is the number of slots that are filled. For example, xref:{uri-stdlib-List}[List] is encoded as an MessagePack array with two elements.
|===
|Pkl type |Slot 1 2+|Slot 2 2+|Slot 3 2+|Slot 4
||code |type |description |type |description |type |description
|link:{uri-stdlib-Typed}[Typed], link:{uri-stdlib-Dynamic}[Dynamic]
|`0x1`
|link:{uri-messagepack-str}[str]
|Fully qualified class name
|link:{uri-messagepack-str}[str]
|Enclosing module URI
|link:{uri-messagepack-array}[array]
|Array of <<object-members,object members>>
|link:{uri-stdlib-Map}[Map]
|`0x2`
|link:{uri-messagepack-map}[map]
|Map of `<value>` to `<value>`
|
|
|
|
|link:{uri-stdlib-Mapping}[Mapping]
|`0x3`
|link:{uri-messagepack-map}[map]
|Map of `<value>` to `<value>`
|
|
|
|
|link:{uri-stdlib-List}[List]
|`0x4`
|link:{uri-messagepack-array}[array]
|Array of `<value>`
|
|
|
|
|link:{uri-stdlib-Listing}[Listing]
|`0x5`
|link:{uri-messagepack-array}[array]
|Array of `<value>`
|
|
|
|
|link:{uri-stdlib-Set}[Set]
|`0x6`
|link:{uri-messagepack-array}[array]
|Array of `<value>`
|
|
|
|
|link:{uri-stdlib-Duration}[Duration]
|`0x7`
|{uri-messagepack-float}[float64]
|Duration value
|link:{uri-messagepack-str}[str]
|link:{uri-stdlib-DurationUnit}[Duration unit] (`"ns"`, `"ms"`, etc.)
|
|
|link:{uri-stdlib-DataSize}[DataSize]
|`0x8`
|link:{uri-messagepack-float}[float64]
|Value (float64)
|link:{uri-messagepack-str}[str]
|link:{uri-stdlib-DataSizeUnit}[DataSize unit] (`"b"`, `"kb"`, etc.)
|
|
|link:{uri-stdlib-Pair}[Pair]
|`0x9`
|`<value>`
|First value
|`<value>`
|Second value
|
|
|link:{uri-stdlib-IntSeq}[IntSeq]
|`0xA`
|link:{uri-messagepack-int}[int]
|Start
|link:{uri-messagepack-int}[int]
|End
|link:{uri-messagepack-int}[int]
|Step
|link:{uri-stdlib-Regex}[Regex]
|`0xB`
|link:{uri-messagepack-str}[str]
|Regex string representation
|
|
|
|
|link:{uri-stdlib-Class}[Class]
|`0xC`
|
|
|
|
|
|
|link:{uri-stdlib-TypeAlias}[TypeAlias]
|`0xD`
|
|
|
|
|
|
|===
[[object-members]]
== Object Members
Like non-primitive values, object members are encoded as MessagePack arrays, where the first slot designates the value's type.
|===
|Member type |Slot 1 2+|Slot 2 2+|Slot 3
| |code |type |description |type |description
|Property
|`0x10`
|link:{uri-messagepack-str}[str]
|key
|`<value>`
|property value
|Entry
|`0x11`
|`<value>`
|entry key
|`<value>`
|entry value
|Element
|`0x12`
|link:{uri-messagepack-int}[int]
|index
|`<value>`
|element value
|===
@@ -0,0 +1,173 @@
= Language Binding Specification
:uri-pkl-go-github: https://github.com/apple/pkl-go
:uri-pkl-swift-github: https://github.com/apple/pkl-swift
Pkl can be embedded within any host application.
The host application has access to low level controls.
It is able to manage the lifecycle of evaluators, as well as provide custom modules and resources to Pkl.
Currently, Pkl must be embedded as a child process, by shelling out to the CLI using the xref:pkl-cli:index.adoc#command-server[`pkl server`] command. In the future, a C library will also be provided.
When embedded, communication between a host application and Pkl happens via message passing.
The message passing specification can be found in xref:message-passing-api.adoc[].
For examples of language bindings in practice, review the xref:{uri-pkl-go-github}[pkl-go], or the xref:{uri-pkl-swift-github}[pkl-swift] codebases.
NOTE: Pkl's Java and Kotlin libraries binds to Pkl directly, and do not use message passing.
== Features of a language binding
A language binding for Pkl should generally have the following components:
. A client that spawns `pkl server`, and talks to it using message passing.
. A deserializer that turns xref:binary-encoding.adoc[pkl binary encoding] into a structure in the host language.
. A code generator that transforms Pkl schemas into schemas written in the host language.
The code generator is mostly written in Pkl, with a lightweight executable that acts as the glue layer.
For examples of code generators, consult link:{uri-pkl-go-github}/tree/main/codegen[pkl-go] and link:{uri-pkl-swift-github}/tree/main/codegen[pkl-swift].
== Sample flow
Here is a sample flow for evaluating a module with the following contents:
.\file:///path/to/myModule.pkl
[source,{pkl}]
----
module MyModule
theModules = import*("customfs:/*.pkl")
----
. Client sends xref:message-passing-api.adoc#create-evaluator-request[Create Evaluator Request], including `customfs` as a custom module reader.
+
[source,json]
----
[
0x20,
{
"requestId": 135,
"allowedModules": ["pkl:", "repl:", "file:", "customfs:"],
"clientModuleReaders": [
{
"scheme": "customfs",
"hasHierarchicalUris": true,
"isGlobbable": true,
"isLocal": true
}
]
}
]
----
. Server sends xref:message-passing-api.adoc#create-evaluator-response[Create Evaluator Response], with an evaluator id.
+
[source,json]
----
[
0x21,
{
"requestId": 135,
"evaluatorId": -135901
}
]
----
. Client sends xref:message-passing-api.adoc#evaluate-request[Evaluate Request], providing the module's URI.
+
[source,json]
----
[
0x23,
{
"requestId": 9805131,
"evaluatorId": -13901,
"moduleUri": "file:///path/to/myModule.pkl"
}
]
----
. During evaluation, server evaluates `import*("customfs:/*.pkl")`, and sends xref:message-passing-api.adoc#list-modules-request[List Modules Request].
+
[source,json]
----
[
0x2c,
{
"requestId": -6478924,
"evaluatorId": -13901,
"uri": "customfs:/"
}
]
----
. Client responds with xref:message-passing-api.adoc#list-modules-response[List Modules Response].
In our pretend scenario, there is only one file; `foo.pkl`.
+
[source,json]
----
[
0x2d,
{
"requestId": -6478924,
"evaluatorId": -13901,
"pathElements": [
{
"name": "foo.pkl",
"isDirectory": false
}
]
}
]
----
. Server sends xref:message-passing-api.adoc#read-module-request[Read Module Request] to read `foo.pkl`.
+
[source,json]
----
[
0x28,
{
"requestId": 36408291,
"evaluatorId": -13901,
"uri": "customfs:/foo.pkl"
}
]
----
. Client responds with the module's contents
+
[source,json]
----
[
0x29,
{
"requestId": 36408291,
"evaluatorId": -13901,
"contents": "foo = 1"
}
]
----
. Server finishes evaluation, and responds with the xref:message-passing-api.adoc#evaluate-response[Evaluate Response].
+
[source,json]
----
[
0x24,
{
"requestId": 9805131,
"evaluatorId": -13901,
"result": <pkl binary value>
}
]
----
. Client sends xref:message-passing-api.adoc#close-evaluator[Close Evaluator].
+
[source,json]
----
[
0x22,
{
"evaluatorId": -13901
}
]
----
== Debug logs
Set the env var `PKL_DEBUG=1` to enable more verbose logging from Pkl.
It is recommended that clients also use this environment variable to enable debug logs of their own.
@@ -0,0 +1,531 @@
= Message Passing API
include::ROOT:partial$component-attributes.adoc[]
include::partial$component-attributes.adoc[]
All messages are encoded in link:{uri-messagepack}[MessagePack], as an array with two elements.
The first element of the array is a code that designates the message's type, encoded as an int.
The second element of the array is the message body, encoded as a map.
Messages are passed between the _client_ and the _server_.
The _client_ is the host language (for example, the Swift application when using pkl-swift).
The _server_ is the entity that provides controls for interacting with Pkl.
For example, in JSON representation:
[source,json]
----
[
1, // <1>
{ "someKey": "someValue" } // <2>
]
----
<1> Code indicating message type
<2> Message body
== Message types
[[client-message]]
=== Client Message
A message passed from the client to the server.
[[server-message]]
=== Server Message
A message passed from the server to the client.
[[request-message]]
=== Request Message
A message sent with a `requestId` value.
The `requestId` should be a unique number at the time of message send.
The other side is expected to respond with a <<response-message>> with the same `requestId`.
[[response-message]]
=== Response Message
A message that is the response to a <<request-message>>.
It contains the same `requestId` of the request message.
[[one-way-message]]
=== One Way Message
A fire-and-forget message where no response is expected.
== Messages
All messages have their schema described in Pkl.
A nullable type means that the property should be omitted (as opposed to the property's value being `nil`).
[[create-evaluator-request]]
=== Create Evaluator Request
Code: `0x20` +
Type: <<client-message,Client>> <<request-message,Request>>
Create an evaluator with the provided evaluator settings.
Upon creating the evaluator, the server sends back a <<create-evaluator-response>> message.
Schema:
[source,pkl]
----
/// A number identifying this request
requestId: Int
/// Regex patterns to determine which modules are allowed for import.
///
/// API version of the CLI's `--allowed-modules` flag
allowedModules: Listing<String>?
/// Regex patterns to dettermine which resources are allowed to be read.
///
/// API version of the CLI's `--allowed-resources` flag
allowedResources: Listing<String>?
/// Register client-side module readers.
clientModuleReaders: Listing<ClientModuleReader>?
/// Register client-side resource readers.
clientResourceReaders: Listing<ClientResourceReader>?
/// Directories, ZIP archives, or JAR archives
/// to search when resolving `modulepath:` URIs.
///
/// API version of the CLI's `--module-path` flag.
modulePaths: Listing<String>?
/// Environment variable to set.
///
/// API version of the CLI's `--env-var` flag.
env: Mapping<String, String>?
/// External properties to set.
///
/// API version of the CLI's `--properties` flag.
properties: Mapping<String, String>?
/// Duration, in seconds, after which evaluation of a source module will be timed out.
///
/// API version of the CLI's `--timeout` flag.
timeoutSeconds: Int?
/// Restricts access to file-based modules and resources to those located under the root directory.
rootDir: String?
/// The cache directory for storing packages.
cacheDir: String?
/// The format to generate.
///
/// This sets the `pkl.outputFormat` external property.
outputFormat: String?
/// The project dependency settings.
project: Project?
class ClientResourceReader {
/// The URI scheme this reader is responsible for reading.
scheme: String
/// Tells whether the path part of ths URI has a
/// [hier-part](https://datatracker.ietf.org/doc/html/rfc3986#section-3).
///
/// An example of a hierarchical URI is `file:///path/to/my/file`, where
/// `/path/to/my/file` designates a nested path through the `/` character.
///
/// An example of a non-hierarchical URI is `pkl.base`, where the `base` does not denote
/// any form of hierarchy.
hasHierarchicalUris: Boolean
/// Tells whether this reader supports globbing.
isGlobbable: Boolean
}
class ClientModuleReader {
/// The URI scheme this reader is responsible for reading.
scheme: String
/// Tells whether the path part of ths URI has a
/// [hier-part](https://datatracker.ietf.org/doc/html/rfc3986#section-3).
///
/// An example of a hierarchical URI is `file:///path/to/my/file`, where
/// `/path/to/my/file` designates a nested path through the `/` character.
///
/// An example of a non-hierarchical URI is `pkl.base`, where the `base` does not denote
/// any form of hierarchy.
hasHierarchicalUris: Boolean
/// Tells whether this reader supports globbing.
isGlobbable: Boolean
/// Tells whether the module is local to the system.
///
/// A local resource that [hasHierarchicalUris] supports triple-dot imports.
isLocal: Boolean
}
class Project {
type: "local"
/// The canonical URI of this project's package
packageUri: String?
/// The URI pointing to the location of the project file.
projectFileUri: String
/// The dependencies of this project.
dependencies: Mapping<String, Project|RemoteDependency>
}
class RemoteDependency {
type: "remote"
/// The canonical URI of this dependency
packageUri: String?
/// The checksums of this remote dependency
checksums: Checksums?
}
class Checksums {
/// The sha-256 checksum of this dependency's metadata.
sha256: String
}
----
Example:
[source,json5]
----
[
0x20,
{
"requestId": 193501,
"allowedModules": ["pkl:", "repl:"],
"allowedResources": ["file:", "package:", "projectpackage:"]
}
]
----
[[create-evaluator-response]]
=== Create Evaluator Response
Code: `0x21` +
Type: <<server-message,Server>> <<response-message,Response>>
The response for a <<create-evaluator-request>>.
If the evaluator was created successfully, `evaluatorId` is set. Otherwise, `error` is set to the resulting error.
[source,pkl]
----
/// A number identifying this request
requestId: Int
/// A number identifying the created evaluator.
evaluatorId: Int?
/// A message detailing why the evaluator was not created.
error: String?
----
[[close-evaluator]]
=== Close Evaluator
Code: `0x22` +
Type: <<client-message,Client>> <<one-way-message,One Way>>
Tells the Pkl server to close an evaluator, releasing any resources it may be holding.
[source,pkl]
----
/// A number identifying this evaluator.
evaluatorId: Int
----
[[evaluate-request]]
=== Evaluate Request
Code: `0x23` +
Type: <<client-message,Client>> <<request-message,Request>>
Evaluate a module.
[source,pkl]
----
/// A number identifying this request
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The absolute URI of the module to be evaluated.
moduleUri: String
/// The module's contents.
///
/// If [null], Pkl will load the module at runtime.
moduleText: String?
/// The Pkl expression to be evaluated within the module.
///
/// If [null], evaluates the whole module.
expr: String?
----
[[evaluate-response]]
=== Evaluate Response
Code: `0x24` +
Type: <<server-message,Server>> <<response-message,Response>>
The server's response to <<evaluate-request>>.
If the evaluation is successful, the response is the Pkl value encoded in xref:binary-encoding.adoc[binary encoding].
[source,pkl]
----
/// The requestId of the Evaluate request
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The evaluation contents, if successful.
result: Binary? // <1>
/// A message detailing why evaluation failed.
error: String?
typealias Binary = Any // <1>
----
<1> xref:binary-encoding.adoc[Pkl Binary Encoding] in link:{uri-messagepack-bin}[bin format] (not expressable in Pkl)
[[log]]
=== Log
Code: `0x25` +
Type: <<server-message,Server>> <<one-way-message,One Way>>
Tells the client to emit a log message, during the execution of a Pkl program.
A log can occur through a xref:language-reference:index.adoc#debugging[trace()] expression, or through a warning (for example, when encountering a link:{uri-stdlib-Deprecated}[Deprecated] value.)
[source,pkl]
----
/// A number identifying this evaluator.
evaluatorId: Int
/// A number identifying the log level.
///
/// - 0: trace
/// - 1: warn
level: Int(this == 0 || this == 1)
/// The message to be logged
message: String
/// A string representing the source location within Pkl code producing this log output.
frameUri: String
----
[[read-resource-request]]
=== Read Resource Request
Code: `0x26` +
Type: <<server-message,Server>> <<request-message,Request>>
Read a resource at the given URI.
This message occurs when a read expression (`read`/`read?`/`read*`) is encountered within a program, and its scheme matches a client resource reader.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The URI of the resource.
uri: String
----
[[read-resource-response]]
=== Read Resource Response
Code: `0x27` +
Type: <<client-message,Client>> <<response-message,Response>>
The response to <<read-resource-request>>.
If successful, `contents` is set.
Otherwise, `error` is set.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The contents of the resource.
contents: Binary? // <1>
/// The description of the error that occured when reading this resource.
error: String?
typealias Binary = Any // <1>
----
<1> MessagePack's link:https://github.com/msgpack/msgpack/blob/master/spec.md#bin-format-family[bin format family] (not expressable in Pkl)
[[read-module-request]]
=== Read Module Request
Code: `0x28` +
Type: <<server-message,Server>> <<request-message,Request>>
Read a module at the given URI.
This message occurs during the evaluation of an import statement or expression (`import`/`import*`), when a scheme matches a client module reader.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The URI of the module.
uri: String
----
[[read-module-response]]
=== Read Module Response
Code: `0x29` +
Type: <<client-message,Client>> <<response-message,Response>>
The response to <<read-module-request>>.
If successful, `contents` is set.
Otherwise, `error` is set.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The string contents of the module.
contents: String?
/// The description of the error that occured when reading this resource.
error: String?
----
[[list-resources-request]]
=== List Resources Request
Code: `0x2a` +
Type: <<server-message,Server>> <<request-message,Request>>
List resources at the specified base path.
This message occurs during the evaluation of a xref:language-reference:index.adoc#globbed-reads[globbed read], when a scheme matches a client resource reader's scheme.
If the resource reader does not have hierarchical URIs, `dummy` is used as the path, and the response is expected to contain all resource elements for that scheme.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The base URI to list resources.
uri: String
----
[[list-resources-response]]
=== List Resources Response
Code: `0x2b` +
Type: <<client-message,Client>> <<response-message,Response>>
The response to <<list-resources-request>>.
If successful, `pathElements` is set.
Otherwise, `error` is set.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The elements at the provided base path.
pathElements: Listing<PathElement>?
/// The description of the error that occured when listing elements.
error: String?
class PathElement {
/// The name of the element at this path
name: String
/// Tells whether the element is a directory.
isDirectory: Boolean
}
----
[[list-modules-request]]
=== List Modules Request
Code: `0x2c` +
Type: <<server-message,Server>> <<request-message,Request>>
List modules at the specified base path.
This message occurs during the evaluation of a xref:language-reference:index.adoc#globbed-imports[globbed import], when a scheme matches a client resource reader's scheme.
If the module reader does not have hierarchical URIs, `dummy` is used as the path, and the response is expected to contain all module elements for that scheme.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The base URI to list modules.
uri: String
----
[[list-modules-response]]
=== List Modules Response
Code: `0x2d` +
Type: <<client-message,Client>> <<response-message,Response>>
The response to <<list-modules-request>>.
If successful, `pathElements` is set.
Otherwise, `error` is set.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The elements at the provided base path.
pathElements: Listing<PathElement>?
/// The description of the error that occured when listing elements.
error: String?
class PathElement {
/// The name of the element at this path
name: String
/// Tells whether the element is a directory.
isDirectory: Boolean
}
----
@@ -0,0 +1,9 @@
:uri-github-binary-encoding-snippet-tests: {uri-github-tree}/pkl-server/src/test/files/SnippetTests
:uri-messagepack-bool: {uri-messagepack-spec}#bool-format-family
:uri-messagepack-int: {uri-messagepack-spec}#int-format-family
:uri-messagepack-float: {uri-messagepack-spec}#float-format-family
:uri-messagepack-str: {uri-messagepack-spec}#str-format-family
:uri-messagepack-bin: {uri-messagepack-spec}#bin-format-family
:uri-messagepack-array: {uri-messagepack-spec}#array-format-family
:uri-messagepack-map: {uri-messagepack-spec}#map-format-family
:uri-messagepack-nil: {uri-messagepack-spec}#nil-format
@@ -13,14 +13,14 @@ Also, Pkl's strong and weak points in comparison to other configuration language
[[static-config-formats]]
== Pkl vs. Static Config Formats
Static configuration formats such as JSON, YAML, and XML work reasonably well for simple configuration needs.
Static configuration formats such as JSON, YAML, TOML, and XML work reasonably well for simple configuration needs.
However, they do have some shortcomings, including:
. They are not very human-friendly to read and write. (JSON, XML)
. They do not provide a way to split a large file into multiple smaller ones. (JSON, YAML)
. They offer no way or very limited ways to abstract over repetitive configuration. (JSON, YAML, XML)
. They do not offer standardized or widely available schema validators. (JSON, YAML)
. They offer little or no schema-aware tooling. (JSON, YAML)
. They do not provide a way to split a large file into multiple smaller ones. (JSON, YAML, TOML)
. They offer no way or very limited ways to abstract over repetitive configuration. (JSON, YAML, TOML, XML)
. They do not offer standardized or widely available schema validators. (JSON, YAML, TOML)
. They offer little or no schema-aware tooling. (JSON, YAML, TOML)
Pkl addresses these shortcomings as follows:
@@ -22,7 +22,7 @@ At the same time, anyone configuring your application -- whether that's your use
+
At the time of writing, Pkl offers configuration libraries for the JVM runtime, Swift, and also for Golang.
+
We maintian the following libraries:
We maintain the following libraries:
+
* xref:java-binding:pkl-config-java.adoc[pkl-config-java] for Java compatible languages
* xref:kotlin-binding:pkl-config-kotlin.adoc[pkl-config-kotlin] for the {uri-kotlin-homepage}[Kotlin] language.
+13 -7
View File
@@ -45,11 +45,14 @@ dependencies {
compile "org.pkl-lang:pkl-codegen-java:{pkl-artifact-version}"
}
ifndef::is-release-build[]
repositories {
maven { url "{uri-sonatype}" }
}
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven { url "{uri-sonatype}" }
endif::[]
}
----
Kotlin::
@@ -61,11 +64,14 @@ dependencies {
compile("org.pkl-lang:pkl-codegen-java:{pkl-artifact-version}")
}
ifndef::is-release-build[]
repositories {
maven { url = uri("{uri-sonatype}") }
}
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven { url = uri("{uri-sonatype}") }
endif::[]
}
----
====
@@ -82,7 +88,7 @@ To use the library in a Maven project, declare the following dependency:
<artifactId>pkl-codegen-java</artifactId>
<version>{pkl-artifact-version}</version>
</dependency>
ifndef::is-release-build[]
ifndef::is-release-version[]
<repositories>
<repository>
<id>sonatype-s01</id>
@@ -40,7 +40,12 @@ dependencies {
compile "org.pkl-lang:pkl-config-java:{pkl-artifact-version}"
}
ifndef::is-release-build[]
ifdef::is-release-version[]
repositories {
mavenCentral()
}
endif::[]
ifndef::is-release-version[]
repositories {
maven { url "{uri-sonatype}" }
}
@@ -56,11 +61,14 @@ dependencies {
compile("org.pkl-lang:pkl-config-java:{pkl-artifact-version}")
}
ifndef::is-release-build[]
repositories {
maven { url = uri("{uri-sonatype}") }
}
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven { url = uri("{uri-sonatype}") }
endif::[]
}
----
====
@@ -79,7 +87,7 @@ To use the library in a Maven project, declare the following dependency:
<artifactId>pkl-config-java</artifactId>
<version>{pkl-artifact-version}</version>
</dependency>
ifndef::is-release-build[]
ifndef::is-release-version[]
<repositories>
<repository>
<id>sonatype-s01</id>
+13 -7
View File
@@ -19,7 +19,7 @@ See xref:pkl-gradle:index.adoc#installation[Installation] in the Gradle plugin c
=== Java Library
The `pkl-codegen-kotlin` library is available {uri-pkl-codegen-kotlin-maven-module}[from Maven Central].
It requires Java 8 or higher and Kotlin 1.3 or higher.
It requires Java 11 or higher and Kotlin 1.3 or higher.
==== Gradle
@@ -36,11 +36,14 @@ dependencies {
compile "org.pkl-lang:pkl-codegen-kotlin:{pkl-artifact-version}"
}
ifndef::is-release-build[]
repositories {
maven { url "{uri-sonatype}" }
}
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven { url "{uri-sonatype}" }
endif::[]
}
----
Kotlin::
@@ -52,11 +55,14 @@ dependencies {
compile("org.pkl-lang:pkl-codegen-kotlin:{pkl-artifact-version}")
}
ifndef::is-release-build[]
repositories {
maven { url = uri("{uri-sonatype}") }
}
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven { url = uri("{uri-sonatype}") }
endif::[]
}
----
====
@@ -29,11 +29,14 @@ dependencies {
compile "org.pkl-lang:pkl-config-kotlin:{pkl-artifact-version}"
}
ifndef::is-release-build[]
repositories {
maven { url "{uri-sonatype}" }
}
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven { url "{uri-sonatype}" }
endif::[]
}
----
Kotlin::
@@ -45,11 +48,14 @@ dependencies {
compile("org.pkl-lang:pkl-config-kotlin:{pkl-artifact-version}")
}
ifndef::is-release-build[]
repositories {
maven { url = uri("{uri-sonatype}") }
}
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven { url = uri("{uri-sonatype}") }
endif::[]
}
----
====
@@ -66,7 +72,7 @@ To use the library in a Maven project, declare the following dependency:
<artifactId>pkl-config-kotlin</artifactId>
<version>{pkl-artifact-version}</version>
</dependency>
ifndef::is-release-build[]
ifndef::is-release-version[]
<repositories>
<repository>
<id>sonatype-s01</id>
@@ -9,70 +9,6 @@ include::ROOT:partial$component-attributes.adoc[]
:uri-javadoc-Pattern: https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html
:uri-github-PklLexer: {uri-github-tree}/pkl-core/src/main/antlr/PklLexer.g4
:uri-github-PklParser: {uri-github-tree}/pkl-core/src/main/antlr/PklParser.g4
:uri-stdlib-baseModule: {uri-pkl-stdlib-docs}/base
:uri-stdlib-jsonnetModule: {uri-pkl-stdlib-docs}/jsonnet
:uri-stdlib-reflectModule: {uri-pkl-stdlib-docs}/reflect
:uri-stdlib-xmlModule: {uri-pkl-stdlib-docs}/xml
:uri-stdlib-protobufModule: {uri-pkl-stdlib-docs}/protobuf
:uri-stdlib-Boolean: {uri-stdlib-baseModule}/Boolean
:uri-stdlib-xor: {uri-stdlib-baseModule}/Boolean#xor()
:uri-stdlib-implies: {uri-stdlib-baseModule}/Boolean#implies()
:uri-stdlib-Any: {uri-stdlib-baseModule}/Any
:uri-stdlib-String: {uri-stdlib-baseModule}/String
:uri-stdlib-Int: {uri-stdlib-baseModule}/Int
:uri-stdlib-Float: {uri-stdlib-baseModule}/Float
:uri-stdlib-Number: {uri-stdlib-baseModule}/Number
:uri-stdlib-NaN: {uri-stdlib-baseModule}/#NaN
:uri-stdlib-Infinity: {uri-stdlib-baseModule}/#Infinity
:uri-stdlib-isBetween: {uri-stdlib-baseModule}/Number#isBetween
:uri-stdlib-isFinite: {uri-stdlib-baseModule}/Number#isFinite
:uri-stdlib-Int8: {uri-stdlib-baseModule}/#Int8
:uri-stdlib-Int16: {uri-stdlib-baseModule}/#Int16
:uri-stdlib-Int32: {uri-stdlib-baseModule}/#Int32
:uri-stdlib-UInt8: {uri-stdlib-baseModule}/#UInt8
:uri-stdlib-UInt16: {uri-stdlib-baseModule}/#UInt16
:uri-stdlib-UInt32: {uri-stdlib-baseModule}/#UInt32
:uri-stdlib-UInt: {uri-stdlib-baseModule}/#UInt
:uri-stdlib-Uri: {uri-stdlib-baseModule}/#Uri
:uri-stdlib-matches: {uri-stdlib-baseModule}/String#matches()
:uri-stdlib-Null: {uri-stdlib-baseModule}/Null
:uri-stdlib-ifNonNull: {uri-stdlib-baseModule}/Null#ifNonNull()
:uri-stdlib-List: {uri-stdlib-baseModule}/List
:uri-stdlib-Set: {uri-stdlib-baseModule}/Set
:uri-stdlib-Map: {uri-stdlib-baseModule}/Map
:uri-stdlib-Listing: {uri-stdlib-baseModule}/Listing
:uri-stdlib-Listing-default: {uri-stdlib-baseModule}/Listing#default
:uri-stdlib-Listing-isDistinct: {uri-stdlib-baseModule}/Listing#isDistinct
:uri-stdlib-Listing-isDistinctBy: {uri-stdlib-baseModule}/Listing#isDistinctBy()
:uri-stdlib-Mapping: {uri-stdlib-baseModule}/Mapping
:uri-stdlib-Mapping-default: {uri-stdlib-baseModule}/Mapping#default
:uri-stdlib-Duration: {uri-stdlib-baseModule}/Duration
:uri-stdlib-Duration-value: {uri-stdlib-baseModule}/Duration#value
:uri-stdlib-Duration-unit: {uri-stdlib-baseModule}/Duration#unit
:uri-stdlib-DurationUnit: {uri-stdlib-baseModule}/#DurationUnit
:uri-stdlib-DataSize: {uri-stdlib-baseModule}/DataSize
:uri-stdlib-DataSize-value: {uri-stdlib-baseModule}/DataSize#value
:uri-stdlib-DataSize-unit: {uri-stdlib-baseModule}/DataSize#unit
:uri-stdlib-DataSizeUnit: {uri-stdlib-baseModule}/#DataSizeUnit
:uri-stdlib-Dynamic: {uri-stdlib-baseModule}/Dynamic
:uri-stdlib-Dynamic-toTyped: {uri-stdlib-baseModule}/Dynamic#toTyped()
:uri-stdlib-Typed: {uri-stdlib-baseModule}/Typed
:uri-stdlib-Regex: {uri-stdlib-baseModule}/Regex
:uri-stdlib-Regex-method: {uri-stdlib-baseModule}/#Regex()
:uri-stdlib-Regex-match: {uri-stdlib-baseModule}/Regex#match
:uri-stdlib-RegexMatch: {uri-stdlib-baseModule}/RegexMatch
:uri-stdlib-ValueRenderer: {uri-stdlib-baseModule}/ValueRenderer
:uri-stdlib-PcfRenderer-converters: {uri-stdlib-baseModule}/PcfRenderer#converters
:uri-stdlib-Function: {uri-stdlib-baseModule}/Function
:uri-stdlib-Function0: {uri-stdlib-baseModule}/Function0
:uri-stdlib-Function1: {uri-stdlib-baseModule}/Function1
:uri-stdlib-Function1-apply: {uri-stdlib-baseModule}/Function1#apply()
:uri-stdlib-Function2: {uri-stdlib-baseModule}/Function2
:uri-stdlib-Function3: {uri-stdlib-baseModule}/Function3
:uri-stdlib-Function4: {uri-stdlib-baseModule}/Function4
:uri-stdlib-Function5: {uri-stdlib-baseModule}/Function5
:uri-stdlib-Resource: {uri-stdlib-baseModule}/Resource
:uri-stdlib-outputFiles: {uri-stdlib-baseModule}/ModuleOutput#files
:uri-pkl-core-ModuleSchema: {uri-pkl-core-main-sources}/ModuleSchema.java
:uri-pkl-core-SecurityManager: {uri-pkl-core-main-sources}/SecurityManager.java
:uri-pkl-core-ResourceReader: {uri-pkl-core-main-sources}/resource/ResourceReader.java
@@ -2813,7 +2749,7 @@ output {
}
----
Running `pkl eval -m output/ pigeon.pkl` produces the following output files:
Running `pkl eval -m output/ birds.pkl` produces the following output files:
.output/birds/pigeon.json
[source,json]
@@ -3777,10 +3713,18 @@ The following class types are _generic types_:
* `Pair`
* `Collection`
* `Listing`
* `List`
* `Mapping`
* `Set`
* `Map`
* `Container`
* `Function0`
* `Function1`
* `Function2`
* `Function3`
* `Function4`
* `Function5`
* `Class`
A generic type has constituent types written in angle brackets (`<>`):
@@ -3791,7 +3735,7 @@ coll: Collection<Bird> // <2>
list: List<Bird> // <3>
set: Set<Bird> // <4>
map: Map<String, Bird> // <5>
cont: Mapping<String, Bird> // <6>
mapping: Mapping<String, Bird> // <6>
----
<1> a pair with first element of type `String` and second element of type `Bird`
@@ -3799,7 +3743,7 @@ cont: Mapping<String, Bird> // <6>
<3> a list of `Bird` elements
<4> a set of `Bird` elements
<5> a map with `String` keys and `Bird` values
<6> a container of `Bird` elements
<6> a mapping of `String` keys and `Bird` values
Omitting the constituent types is equivalent to declaring them as `unknown`:
@@ -3810,7 +3754,7 @@ coll: Collection // equivalent to `Collection<unknown>`
list: List // equivalent to `List<unknown>`
set: Set // equivalent to `Set<unknown>`
map: Map // equivalent to `Map<unknown, unknown>`
cont: Mapping // equivalent to `Mapping<unknown, unknown>`
mapping: Mapping // equivalent to `Mapping<unknown, unknown>`
----
The `unknown` type is both a top and a bottom type.
@@ -3946,7 +3890,7 @@ nullish: Null // = null <11>
<2> Properties of type `List` default to the empty list.
<3> Properties of type `Set` default to the empty set.
<4> Properties of type `Map` default to the empty map.
<5> Properties of type `Listing<X>` default to an empty listing whose default element is the default for `Y`.
<5> Properties of type `Listing<X>` default to an empty listing whose default element is the default for `X`.
<6> Properties of type `Mapping<X, Y>` default to an empty mapping whose default value is the default for `Y`.
<7> Properties of non-external class type `X` default to `new X {}`.
<8> Properties of type `X?` default to `Null(x)` where `x` is the default for `X`.
@@ -5301,7 +5245,7 @@ package {
name = "birds"
baseUri = "package://example.com/birds"
version = "1.8.3"
packageZipUrl = "https://example.com/birds@\(version).zip
packageZipUrl = "https://example.com/birds@\(version).zip"
}
----
<1> Specify relative project `../fruit` as a dependency.
@@ -5315,7 +5259,7 @@ package {
name = "fruit"
baseUri = "package://example.com/fruit"
version = "1.5.0"
packageZipUrl = "https://example.com/fruit@\(version).zip
packageZipUrl = "https://example.com/fruit@\(version).zip"
}
----
@@ -39,7 +39,7 @@ When you run this, Pkl expands everything fully.
[source,{pkl}]
----
bird {
name = "Common wood pigeon"
name = "Pigeon"
diet = "Seeds"
taxonomy {
kingdom = "Animalia"
@@ -225,7 +225,7 @@ parrot = (pigeon) {
}
}
----
<1> Importing `foo.pkl` creates the object `foo`, so you can refer to `pigeon` in this code, like you did before.
<1> Importing `pigeon.pkl` creates the object `pigeon`, so you can refer to `pigeon` in this code, like you did before.
If you run Pkl on both, you will see that it works.
Looking at the result, however, you see a (possibly) unexpected difference.
@@ -372,11 +372,11 @@ pipelines {
<1> There is no pipeline object to amend. The `new` keyword gives you an object to amend.
So far, you've defined objects the same way you amended them.
When the name `foo` didn't occur before, `foo { ... }` _creates_ a property called `foo` and assigns to it the object specified on the `...`.
If `foo` is an existing object, this notation is an _amend expression_; resulting in a new _object_ (value), but _not_ a new (named) property.
When the `name` didn't occur before, `new { ... }` _creates_ a property called `name` and assigns to it the object specified on the `Listing`.
If `name` is an existing object, this notation is an _amend expression_; resulting in a new _object_ (value), but _not_ a new (named) property.
Since `pipelines` is a listing, you can _add_ elements by writing expressions in an amend expression.
In this case, though, there is no object to amend. Writing `myNewPipeline { ... }` defines a _property_, but listings may only include _elements_.
In this case, though, there is no object to amend. Writing `pipelines { ... }` defines a _property_, but listings may only include _elements_.
This is where you can use the keyword `new`.
`new` gives you an object to amend.
@@ -167,7 +167,7 @@ pklTutorialPart3 {
----
Sadly, `pklTutorialParts.pkl` is a _rewrite_ of `pklTutorial.pkl`.
Sadly, `pklTutorialParts.pkl` is a _rewrite_ of `pklTutorialPart3.pkl`.
It creates a separate `class TutorialPart` and instantiates three properties with it (`pklTutorialPart1`, `pklTutorialPart2` and `pklTutorialPart3`).
In doing so, it implicitly moves everything "down" one level (`pklTutorialPart3` is now a property in the module `pklTutorialParts`, whereas above, in `pklTutorialPart3.pkl` it was its own module).
This is not very DRY.
@@ -262,7 +262,7 @@ Suppose you want to define what a live workshop for this tutorial looks like.
Consider this example:
[source,{pkl}]
.workshop2023.pkl
.workshop2024.pkl
----
title = "Pkl: Configure your Systems in New Ways"
interactive = true
@@ -278,7 +278,7 @@ duration = 1.5.h
event {
name = "Migrating Birds between hemispheres"
year = 2023
year = 2024
}
instructors {
@@ -288,11 +288,11 @@ instructors {
sessions {
new {
date = "8/14/2023"
date = "2/1/2024"
time = 30.min
}
new {
date = "8/15/2023"
date = "2/1/2024"
time = 30.min
}
}
+29 -30
View File
@@ -32,10 +32,10 @@ For interactive development, the CLI includes a Read-Eval-Print Loop (REPL).
The CLI comes in multiple flavors:
* Native macOS executable for amd64 (tested on macOS 10.15)
* Native Linux executable for amd64 (tested on Oracle Linux 8)
* Native Linux executable for aarch64 (tested on Oracle Linux 8)
* Native Linux executable for amd64
* Native Linux executable for aarch64
* Native Alpine Linux executable for amd64 (cross-compiled and tested on Oracle Linux 8)
* Java executable (tested with Java 8/11/14 on macOS and Oracle Linux)
* Java executable (tested with Java 11/17 on macOS and Oracle Linux)
On macOS and Linux, we recommend using the native executables.
They are self-contained, start up instantly, and run complex Pkl code much faster than the Java executable.
@@ -48,38 +48,37 @@ whereas, the Alpine Linux executable is statically linked against _musl libc_ an
====
The Java executable works on multiple platforms and has a smaller binary size than the native executables.
However, it requires a Java 8 (or higher) runtime on the system path, has a noticeable startup delay,
However, it requires a Java 11 (or higher) runtime on the system path, has a noticeable startup delay,
and runs complex Pkl code slower than the native executables.
All flavors are built from the same codebase and undergo the same automated testing.
Except where noted otherwise, the rest of this page discusses the native executables.
//TODO uncomment this after brew formula is merged and available
// [[homebrew]]
// === Homebrew
//
// Release versions can be installed with {uri-homebrew}[Homebrew].
//
// ifdef::is-release-version[]
// To install Pkl, run:
//
// [source,shell]
// ----
// brew install pkl
// ----
//
// To update Pkl, run:
//
// [source,shell]
// ----
// brew update
// brew upgrade pkl # or just `brew upgrade`
// ----
// endif::[]
//
// ifndef::is-release-version[]
// For instructions, switch to a release version of this page.
// endif::[]
[[homebrew]]
=== Homebrew
Release versions can be installed with {uri-homebrew}[Homebrew].
ifdef::is-release-version[]
To install Pkl, run:
[source,shell]
----
brew install pkl
----
To update Pkl, run:
[source,shell]
----
brew update
brew upgrade pkl # or just `brew upgrade`
----
endif::[]
ifndef::is-release-version[]
For instructions, switch to a release version of this page.
endif::[]
[[download]]
=== Download
+13 -7
View File
@@ -39,11 +39,14 @@ dependencies {
compile "org.pkl-lang:pkl-core:{pkl-artifact-version}"
}
ifndef::is-release-build[]
repositories {
maven { url "{uri-sonatype}" }
}
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven { url "{uri-sonatype}" }
endif::[]
}
----
Kotlin::
@@ -55,11 +58,14 @@ dependencies {
compile("org.pkl-lang:pkl-core:{pkl-artifact-version}")
}
ifndef::is-release-build[]
repositories {
maven { url = uri("{uri-sonatype}") }
}
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven { url = uri("{uri-sonatype}") }
endif::[]
}
----
====
@@ -76,7 +82,7 @@ To use the library in a Maven project, declare the following dependency:
<artifactId>pkl-core</artifactId>
<version>{pkl-artifact-version}</version>
</dependency>
ifndef::is-release-build[]
ifndef::is-release-version[]
<repositories>
<repository>
<id>sonatype-s01</id>
+13 -7
View File
@@ -95,11 +95,14 @@ dependencies {
compile "org.pkl-lang:pkl-doc:{pkl-artifact-version}"
}
ifndef::is-release-build[]
repositories {
maven { url "{uri-sonatype}" }
}
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven { url "{uri-sonatype}" }
endif::[]
}
----
Kotlin::
@@ -111,11 +114,14 @@ dependencies {
compile("org.pkl-lang:pkl-doc:{pkl-artifact-version}")
}
ifndef::is-release-build[]
repositories {
maven { url = uri("{uri-sonatype}") }
}
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven { url = uri("{uri-sonatype}") }
endif::[]
}
----
====
@@ -132,7 +138,7 @@ To use the library in a Maven project, declare the following dependency:
<artifactId>pkl-doc</artifactId>
<version>{pkl-artifact-version}</version>
</dependency>
ifndef::is-release-build[]
ifndef::is-release-version[]
<repositories>
<repository>
<id>sonatype-s01</id>
+4 -4
View File
@@ -47,10 +47,10 @@ plugins {
----
pluginManagement {
repositories {
ifdef::is-release-build[]
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-build[]
ifndef::is-release-version[]
maven { url "{uri-sonatype}" }
endif::[]
}
@@ -72,10 +72,10 @@ plugins {
----
pluginManagement {
repositories {
ifdef::is-release-build[]
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-build[]
ifndef::is-release-version[]
maven { url = uri("{uri-sonatype}") }
endif::[]
}
+1 -1
View File
@@ -1,6 +1,6 @@
= Pkl 0.25 Release Notes
:version: 0.25
:version-minor: 0.25.2
:version-minor: 0.25.3
:release-date: February 1st, 2024
Pkl {version} was released on {release-date}. +
@@ -1,6 +1,38 @@
= Changelog
include::ROOT:partial$component-attributes.adoc[]
[[release-0.25.3]]
== 0.25.3 (2024-03-26)
=== Fixes
* Fixes some issues with generated pkldoc websites (link:https://github.com/apple/pkl/pull/357[#357], link:https://github.com/apple/pkl/pull/362[#362])
* Fixes a bug where amending a module that defines an abstract class might cause a Java `AssertionError` (link:https://github.com/apple/pkl/pull/319[#319])
* Fixes a bug where a for/when generator within a lambda declared with `new {}` syntax might not resolve variables correctly (link:https://github.com/apple/pkl/pull/297[#297])
* Fixes a bug where `const` and `local` modifiers are not exported when obtaining a class's mirror in `pkl:reflect` (link:https://github.com/apple/pkl/pull/265[#265]).
=== Miscellaneous
* Documentation improvements (link:https://github.com/apple/pkl/pull/93[#93], link:https://github.com/apple/pkl/pull/106[#106], link:https://github.com/apple/pkl/pull/143[#143], link:https://github.com/apple/pkl/pull/205[#205], link:https://github.com/apple/pkl/pull/214[#214], link:https://github.com/apple/pkl/pull/224[#224], link:https://github.com/apple/pkl/pull/257[#257], link:https://github.com/apple/pkl/pull/270[#270], link:https://github.com/apple/pkl/pull/282[#282], link:https://github.com/apple/pkl/pull/283[#283], link:https://github.com/apple/pkl/pull/299[#299], link:https://github.com/apple/pkl/pull/337[#337], link:https://github.com/apple/pkl/pull/340[#340])
* Build script improvements (link:https://github.com/apple/pkl/pull/253[#253], link:https://github.com/apple/pkl/pull/314[#314], link:https://github.com/apple/pkl/pull/333[#333], link:https://github.com/apple/pkl/pull/338[#338])
=== Changes
* Add `jpkl` to the set of artifacts released to GitHub (link:https://github.com/apple/pkl/pull/314[#314])
=== Contributors ❤️
Thank you to all the contributors for this release!
* link:https://github.com/r1ft1[@r1ft1]
* link:https://github.com/WardsParadox[@WardsParadox]
* link:https://github.com/grantabbott[@grantabbott]
* link:https://github.com/mshakhmaykin[@mshakhmaykin]
* link:https://github.com/d4wae89d498[@d4wae89d498]
* link:https://github.com/KushalP[@KushalP]
* link:https://github.com/zihluwang[@zihluwang]
* link:https://github.com/Malix-off[@Malix-off]
[[release-0.25.2]]
== 0.25.2 (2024-02-08)
@@ -8,7 +40,6 @@ include::ROOT:partial$component-attributes.adoc[]
* Fixes some issues with generated pkldoc websites (link:https://github.com/apple/pkl/pull/70[#70],
link:https://github.com/apple/pkl/pull/81[#81], link:https://github.com/apple/pkl/pull/96[#96])
* Removes errorneously published artifact called "pkl-cli" (link:https://github.com/apple/pkl/pull/98[#98])
* Fixes an issue where a PklBugException produces an incorrect URL to file issues (link:https://github.com/apple/pkl/pull/73[#73])
=== Miscellaneous
+21 -21
View File
@@ -1,19 +1,31 @@
* xref:pkl-cli:index.adoc#installation[Installation]
* xref:language-tutorial:index.adoc[Tutorial]
** xref:language-tutorial:01_basic_config.adoc[Basic Configuration]
** xref:language-tutorial:02_filling_out_a_template.adoc[Filling out a Template]
** xref:language-tutorial:03_writing_a_template.adoc[Writing a Template]
* xref:language-reference:index.adoc[Language Reference]
* xref:introduction:index.adoc[Introduction]
** xref:introduction:use-cases.adoc[Use Cases]
** xref:introduction:concepts.adoc[Concepts]
** xref:introduction:comparison.adoc[Comparison]
* xref:pkl-cli:index.adoc#installation[Installation]
* xref:language-tutorial:index.adoc[Tutorial]
** xref:language-tutorial:01_basic_config.adoc[Basic Configuration]
** xref:language-tutorial:02_filling_out_a_template.adoc[Filling out a Template]
** xref:language-tutorial:03_writing_a_template.adoc[Writing a Template]
* xref:ROOT:language.adoc[Language]
** xref:language-tutorial:index.adoc[Tutorial]
** xref:language-reference:index.adoc[Language Reference]
** xref:ROOT:standard-library.adoc[Standard Library]
** xref:ROOT:language-bindings.adoc[Language Bindings]
*** xref:java-binding:index.adoc[Java]
**** xref:java-binding:codegen.adoc[Code Generator]
**** xref:pkl-core:index.adoc[pkl-core Library]
**** xref:java-binding:pkl-config-java.adoc[pkl-config-java Library]
*** xref:kotlin-binding:index.adoc[Kotlin]
**** xref:kotlin-binding:codegen.adoc[Code Generator]
**** xref:kotlin-binding:pkl-config-kotlin.adoc[pkl-config-kotlin Library]
*** xref:swift:ROOT:index.adoc[Swift]
*** xref:go:ROOT:index.adoc[Go]
*** xref:bindings-specification:index.adoc[Specification]
**** xref:bindings-specification:message-passing-api.adoc[Message Passing API]
**** xref:bindings-specification:binary-encoding.adoc[Pkl Binary Encoding]
* xref:ROOT:tools.adoc[Tools]
** xref:pkl-cli:index.adoc[CLI]
@@ -24,21 +36,9 @@
*** xref:vscode:ROOT:index.adoc[VSCode]
*** xref:neovim:ROOT:index.adoc[Neovim]
* xref:ROOT:language-bindings.adoc[Language Bindings]
** xref:java-binding:index.adoc[Java]
*** xref:java-binding:codegen.adoc[Code Generator]
*** xref:pkl-core:index.adoc[pkl-core Library]
*** xref:java-binding:pkl-config-java.adoc[pkl-config-java Library]
** xref:kotlin-binding:index.adoc[Kotlin]
*** xref:kotlin-binding:codegen.adoc[Code Generator]
*** xref:kotlin-binding:pkl-config-kotlin.adoc[pkl-config-kotlin Library]
** xref:swift:ROOT:index.adoc[Swift]
** xref:go:ROOT:index.adoc[Go]
* xref:ROOT:examples.adoc[Examples]
* xref:release-notes:index.adoc[Release Notes]
** xref:release-notes:0.25.adoc[0.25 Release Notes]
** xref:release-notes:changelog.adoc[Changelog]
+1 -1
View File
@@ -1,7 +1,7 @@
# suppress inspection "UnusedProperty" for whole file
group=org.pkl-lang
version=0.25.2
version=0.25.3
# google-java-format requires jdk.compiler exports
org.gradle.jvmargs= \
@@ -72,6 +72,14 @@ public final class VmModifier {
public static final int VALID_OBJECT_MEMBER_MODIFIERS = LOCAL;
public static final int TYPEALIAS_OBJECT_MEMBER = TYPE_ALIAS | CONST;
public static final int LOCAL_TYPEALIAS_OBJECT_MEMBER = LOCAL | TYPEALIAS_OBJECT_MEMBER;
public static final int CLASS_OBJECT_MEMBER = CLASS | CONST;
public static final int LOCAL_CLASS_OBJECT_MEMBER = LOCAL | CLASS_OBJECT_MEMBER;
public static boolean isLocal(int modifiers) {
return (modifiers & LOCAL) != 0;
}
@@ -164,6 +172,10 @@ public final class VmModifier {
return "hidden";
case EXTERNAL:
return "external";
case FIXED:
return "fixed";
case CONST:
return "const";
default:
throw new VmExceptionBuilder()
.bug("Cannot convert internal modifier `%s` to a string.", toString(modifier))
@@ -179,6 +191,8 @@ public final class VmModifier {
if (isHidden(modifiers)) builder.add(toString(HIDDEN));
// `external` modifier is part of class contract but not part of property/method contract
if (isExternal(modifiers) && isClass) builder.add(toString(EXTERNAL));
if (isFixed(modifiers)) builder.add(toString(FIXED));
if (isConst(modifiers)) builder.add(toString(CONST));
return builder.build();
}
@@ -305,11 +305,13 @@ public final class AstBuilder extends AbstractAstBuilder<Object> {
doVisitClassProperties(propertyCtxs, propertyNames),
doVisitMethodDefs(methodCtxs));
var isLocal = VmModifier.isLocal(modifiers);
var result =
new ObjectMember(
sourceSection,
headerSection,
modifiers | VmModifier.CONST,
isLocal ? VmModifier.LOCAL_CLASS_OBJECT_MEMBER : VmModifier.CLASS_OBJECT_MEMBER,
scope.getName(),
scope.getQualifiedName());
@@ -360,7 +362,9 @@ public final class AstBuilder extends AbstractAstBuilder<Object> {
new ObjectMember(
sourceSection,
headerSection,
modifiers | VmModifier.CONST,
isLocal
? VmModifier.LOCAL_TYPEALIAS_OBJECT_MEMBER
: VmModifier.TYPEALIAS_OBJECT_MEMBER,
scopeName,
scope.getQualifiedName());
@@ -61,6 +61,7 @@ public final class AmendFunctionNode extends PklNode {
} else {
parameterSlots = new int[0];
}
var hasForGenVars = false;
for (var i = 0; i < hostFrameDesecriptor.getNumberOfSlots(); i++) {
var slotInfo = hostFrameDesecriptor.getSlotInfo(i);
// Copy for-generator variables from the outer frame descriptor into inner lambda.
@@ -74,10 +75,22 @@ public final class AmendFunctionNode extends PklNode {
// frame (e.g. with `new Mixin { ... }` syntax), so it injects for-generator vars into the
// wrong frame.
//
// As a remedy, we simply copy outer for-generator variables into this frame.
// As a remedy, we simply copy outer variables into this frame if there are any for generator
// variables.
//
// We need to preserve the frame slot index, so we insert dummy identifiers
// for other slots that aren't for generator variables.
if (slotInfo != null && slotInfo.equals(SymbolTable.FOR_GENERATOR_VARIABLE)) {
if (!hasForGenVars) {
hasForGenVars = true;
for (var j = 0; j < i; j++) {
builder.addSlot(FrameSlotKind.Illegal, Identifier.DUMMY, null);
}
}
builder.addSlot(
hostFrameDesecriptor.getSlotKind(i), hostFrameDesecriptor.getSlotName(i), null);
} else if (hasForGenVars) {
builder.addSlot(FrameSlotKind.Illegal, Identifier.DUMMY, null);
}
}
var objectToAmendSlot = builder.addSlot(FrameSlotKind.Object, new Object(), null);
@@ -152,6 +152,9 @@ public final class Identifier implements Comparable<Identifier> {
// common in lambdas etc
public static final Identifier IT = get("it");
// dummy, unrepresentable identifier
public static final Identifier DUMMY = get("`#_");
private final String name;
private Identifier(String name) {
@@ -35,7 +35,7 @@ import org.pkl.core.util.Nullable;
@TruffleLanguage.Registration(
id = "pkl",
name = "Pkl",
version = "0.25.2",
version = "0.25.3",
characterMimeTypes = VmLanguage.MIME_TYPE,
contextPolicy = ContextPolicy.SHARED)
public final class VmLanguage extends TruffleLanguage<VmContext> {
@@ -49,6 +49,10 @@ stringLiteral: "yes"
constrained: String(length.isBetween(3, 10))
aliased: MyMap<Person>
hidden hiddenProp: String
const constProp: String = "the const prop"
fixed fixedProp: String = "the fixed prop"
/// class doc comment
@MyAnn { text = "class annotation" }
open class Person {
@@ -0,0 +1,12 @@
module Birds
abstract class Bird {
name: String
}
class Pigeon extends Bird {
name = "Pigeon"
passenger: Boolean
}
pidgy: Pigeon?
@@ -152,6 +152,9 @@ examples {
personClassProperties.keys
testHelpers.property(personClassProperties["name"], reflect.stringType)
testHelpers.property(personClassProperties["age"], reflect.intType)
modClassProps["hiddenProp"].modifiers
modClassProps["constProp"].modifiers
modClassProps["fixedProp"].modifiers
}
["Reflected class methods metadata"] {
@@ -38,3 +38,13 @@ function mapEnvLiteral(_env: Dynamic) = (it) -> (it) {
}
}
}
function addElements(keys: List<String>): Mixin<Mapping<String, String>> = new {
for (key in keys) {
[key] = key
}
}
res = new Mapping<String, String> {
["base"] = "alreadyThere"
} |> addElements(List("newElement"))
@@ -0,0 +1 @@
amends ".../input-helper/modules/Birds.pkl"
@@ -67,7 +67,7 @@ facts {
}
examples {
["Reflected module properties of unknown type metadata"] {
Set("int", "float", "string", "boolean", "duration", "dataSize", "pair", "list", "set", "map", "listing", "mapping", "dynamic", "typed", "int2", "float2", "string2", "boolean2", "duration2", "dataSize2", "pair2", "list2", "set2", "map2", "listing2", "mapping2", "dynamic2", "typed2", "any", "noth", "unkn", "union", "nullable", "stringLiteral", "constrained", "aliased")
Set("int", "float", "string", "boolean", "duration", "dataSize", "pair", "list", "set", "map", "listing", "mapping", "dynamic", "typed", "int2", "float2", "string2", "boolean2", "duration2", "dataSize2", "pair2", "list2", "set2", "map2", "listing2", "mapping2", "dynamic2", "typed2", "any", "noth", "unkn", "union", "nullable", "stringLiteral", "constrained", "aliased", "hiddenProp", "constProp", "fixedProp")
new {
hasExpectedLocation = true
docComment = "module property doc comment"
@@ -373,6 +373,9 @@ examples {
defaultValue = 42
hasExpectedType = true
}
Set("hidden")
Set("const")
Set("fixed")
}
["Reflected class methods metadata"] {
Set("sing")
@@ -36,3 +36,7 @@ foo {
}
}
}
res {
["base"] = "alreadyThere"
["newElement"] = "newElement"
}
@@ -0,0 +1 @@
pidgy = null
@@ -179,7 +179,7 @@ internal class DocPackage(val docPackageInfo: DocPackageInfo, val modules: List<
mod,
docPackageInfo.version,
docPackageInfo.getModuleImportUri(mod.moduleName),
docPackageInfo.getModuleSourceCode(mod.moduleName)?.toEncodedUri(),
docPackageInfo.getModuleSourceCode(mod.moduleName),
exampleModulesBySubject[mod.moduleName] ?: listOf()
)
}
@@ -160,19 +160,15 @@ data class DocPackageInfo(
when (importUri) {
"pkl:/" -> "pkl:${moduleName.substring(4)}".toUri()
else -> {
val path =
getModulePath(moduleName, moduleNamePrefix)
.split("/")
.map { it.uriEncoded }
.joinToString("/") { it } + ".pkl"
URI(importUri).resolve(path)
val path = getModulePath(moduleName, moduleNamePrefix).uriEncoded + ".pkl"
URI(importUri + path)
}
}
internal fun getModuleSourceCode(moduleName: String): String? {
val path = "/" + getModulePath(moduleName, moduleNamePrefix) + ".pkl"
internal fun getModuleSourceCode(moduleName: String): URI? {
val path = "/" + getModulePath(moduleName, moduleNamePrefix).uriEncoded + ".pkl"
// assumption: the fragment is only used for line numbers
return sourceCodeUrlScheme?.replace("%{path}", path)?.substringBefore('#')
return sourceCodeUrlScheme?.replace("%{path}", path)?.substringBefore('#')?.let(URI::create)
}
/** Information about a depended-on package. */
@@ -253,7 +253,7 @@ internal class PackageScope(
private val moduleScopes: Map<String, ModuleScope> by lazy {
modules.associate { module ->
val docUrl =
url.resolve(getModulePath(module.moduleName, modulePrefix).uriEncodedPath + "/index.html")
url.resolve(getModulePath(module.moduleName, modulePrefix).uriEncoded + "/index.html")
module.moduleName to ModuleScope(module, docUrl, this)
}
}
@@ -326,7 +326,7 @@ internal class ModuleScope(
get() = module.moduleName
val path: String by lazy {
getModulePath(module.moduleName, parent!!.docPackageInfo.moduleNamePrefix).uriEncodedPath
getModulePath(module.moduleName, parent!!.docPackageInfo.moduleNamePrefix).uriEncoded
}
override val dataUrl: URI by lazy { parent!!.dataUrl.resolve("./$path/index.js") }
@@ -386,11 +386,12 @@ internal class ClassScope(
) : PageScope() {
override val url: URI by lazy {
// `isModuleClass` distinction is relevant when this scope is a link target
if (clazz.isModuleClass) parentUrl else parentUrl.resolve("${clazz.simpleName.uriEncoded}.html")
if (clazz.isModuleClass) parentUrl
else parentUrl.resolve("${clazz.simpleName.uriEncodedComponent}.html")
}
override val dataUrl: URI by lazy {
parent!!.dataUrl.resolve("${clazz.simpleName.uriEncoded}.js")
parent!!.dataUrl.resolve("${clazz.simpleName.uriEncodedComponent}.js")
}
override fun getMethod(name: String): MethodScope? =
@@ -426,7 +426,7 @@ internal abstract class PageGenerator<out S>(
// anchors, and requires no JS
protected fun HtmlBlockTag.renderAnchor(anchorId: String, cssClass: String = "anchor") {
div {
id = anchorId.uriEncoded
id = anchorId.uriEncodedComponent
classes = setOf(cssClass)
+" " // needs some content to be considered a valid anchor by browsers
}
@@ -457,7 +457,7 @@ internal abstract class PageGenerator<out S>(
protected fun HtmlBlockTag.renderSelfLink(memberName: String) {
a {
classes = setOf("member-selflink", "material-icons")
href = "#${memberName.uriEncoded}"
href = "#${memberName.uriEncodedComponent}"
+"link"
}
}
@@ -600,7 +600,8 @@ internal abstract class PageGenerator<out S>(
for (example in examples) {
if (first) first = false else +", "
a {
href = docModule.parent.docPackageInfo.getModuleSourceCode(example.moduleName)!!
href =
docModule.parent.docPackageInfo.getModuleSourceCode(example.moduleName)!!.toString()
+example.shortModuleName
}
}
+14 -4
View File
@@ -119,7 +119,12 @@ internal fun String.replaceSourceCodePlaceholders(
.replace("%{endLine}", sourceLocation.endLine.toString())
}
internal val String.uriEncoded
/**
* Encodes a URI string, encoding characters that are part of URI syntax.
*
* Follows `encodeURIComponent` from ECMAScript.
*/
internal val String.uriEncodedComponent
get(): String {
val ret = URLEncoder.encode(this, StandardCharsets.UTF_8)
// Replace `+` with `%20` to be safe
@@ -128,13 +133,18 @@ internal val String.uriEncoded
return ret.replace("+", "%20")
}
internal val String.uriEncodedPath
get(): String = split("/").map { it.uriEncoded }.joinToString("/") { it }
/**
* Encodes a URI string, preserving characters that are part of URI syntax.
*
* Follows `encodeURI` from ECMAScript.
*/
internal val String.uriEncoded
get(): String = replace(Regex("([^;/?:@&=+\$,#]+)")) { it.value.uriEncodedComponent }
fun getModulePath(moduleName: String, packagePrefix: String): String =
moduleName.substring(packagePrefix.length).replace('.', '/')
internal fun String.toEncodedUri(): URI = URI(uriEncodedPath)
internal fun String.toEncodedUri(): URI = URI(uriEncoded)
/**
* Turns `"foo.bar.baz-biz"` into ``"foo.bar.`baz-biz`"``.
@@ -31,7 +31,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/Module%20Containing%20Spaces.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/Module%20Containing%20Spaces.pkl">Module Containing Spaces.pkl</a></dd>
<dd><a href="https://example.com/package1/Module%20Containing%20Spaces.pkl">Module Containing Spaces.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -31,7 +31,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/baseModule.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/baseModule.pkl">baseModule.pkl</a></dd>
<dd><a href="https://example.com/package1/baseModule.pkl">baseModule.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -31,7 +31,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/classAnnotations.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/classAnnotations.pkl">classAnnotations.pkl</a></dd>
<dd><a href="https://example.com/package1/classAnnotations.pkl">classAnnotations.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -33,7 +33,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/classComments.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/classComments.pkl">classComments.pkl</a></dd>
<dd><a href="https://example.com/package1/classComments.pkl">classComments.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -32,7 +32,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/classInheritance.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/classInheritance.pkl">classInheritance.pkl</a></dd>
<dd><a href="https://example.com/package1/classInheritance.pkl">classInheritance.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -32,7 +32,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/classMethodComments.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/classMethodComments.pkl">classMethodComments.pkl</a></dd>
<dd><a href="https://example.com/package1/classMethodComments.pkl">classMethodComments.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -32,7 +32,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/classMethodModifiers.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/classMethodModifiers.pkl">classMethodModifiers.pkl</a></dd>
<dd><a href="https://example.com/package1/classMethodModifiers.pkl">classMethodModifiers.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -32,7 +32,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/classMethodTypeAnnotations.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/classMethodTypeAnnotations.pkl">classMethodTypeAnnotations.pkl</a></dd>
<dd><a href="https://example.com/package1/classMethodTypeAnnotations.pkl">classMethodTypeAnnotations.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -33,7 +33,7 @@ the same module, a different module, and external modules.</p></div>
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/classMethodTypeReferences.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/classMethodTypeReferences.pkl">classMethodTypeReferences.pkl</a></dd>
<dd><a href="https://example.com/package1/classMethodTypeReferences.pkl">classMethodTypeReferences.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -31,7 +31,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/classPropertyAnnotations.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/classPropertyAnnotations.pkl">classPropertyAnnotations.pkl</a></dd>
<dd><a href="https://example.com/package1/classPropertyAnnotations.pkl">classPropertyAnnotations.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -32,7 +32,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/classPropertyComments.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/classPropertyComments.pkl">classPropertyComments.pkl</a></dd>
<dd><a href="https://example.com/package1/classPropertyComments.pkl">classPropertyComments.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -32,7 +32,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/classPropertyModifiers.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/classPropertyModifiers.pkl">classPropertyModifiers.pkl</a></dd>
<dd><a href="https://example.com/package1/classPropertyModifiers.pkl">classPropertyModifiers.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -32,7 +32,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/classPropertyTypeAnnotations.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/classPropertyTypeAnnotations.pkl">classPropertyTypeAnnotations.pkl</a></dd>
<dd><a href="https://example.com/package1/classPropertyTypeAnnotations.pkl">classPropertyTypeAnnotations.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -33,7 +33,7 @@ the same module, a different module, and external modules.</p></div>
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/classPropertyTypeReferences.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/classPropertyTypeReferences.pkl">classPropertyTypeReferences.pkl</a></dd>
<dd><a href="https://example.com/package1/classPropertyTypeReferences.pkl">classPropertyTypeReferences.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -31,7 +31,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/classTypeConstraints.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/classTypeConstraints.pkl">classTypeConstraints.pkl</a></dd>
<dd><a href="https://example.com/package1/classTypeConstraints.pkl">classTypeConstraints.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -30,7 +30,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/docExampleSubject1.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/docExampleSubject1.pkl">docExampleSubject1.pkl</a></dd>
<dd><a href="https://example.com/package1/docExampleSubject1.pkl">docExampleSubject1.pkl</a></dd>
<dt class="">Examples:</dt>
<dd><a href="https://example.com/package1/docExample.pkl">docExample</a>, <a href="https://example.com/package1/docExample2.pkl">docExample2</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
@@ -30,7 +30,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/docExampleSubject2.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/docExampleSubject2.pkl">docExampleSubject2.pkl</a></dd>
<dd><a href="https://example.com/package1/docExampleSubject2.pkl">docExampleSubject2.pkl</a></dd>
<dt class="">Examples:</dt>
<dd><a href="https://example.com/package1/docExample.pkl">docExample</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
@@ -41,7 +41,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/docLinks.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/docLinks.pkl">docLinks.pkl</a></dd>
<dd><a href="https://example.com/package1/docLinks.pkl">docLinks.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -30,7 +30,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/methodAnnotations.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/methodAnnotations.pkl">methodAnnotations.pkl</a></dd>
<dd><a href="https://example.com/package1/methodAnnotations.pkl">methodAnnotations.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -32,7 +32,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/moduleComments.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/moduleComments.pkl">moduleComments.pkl</a></dd>
<dd><a href="https://example.com/package1/moduleComments.pkl">moduleComments.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -31,7 +31,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/moduleExtend.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/moduleExtend.pkl">moduleExtend.pkl</a></dd>
<dd><a href="https://example.com/package1/moduleExtend.pkl">moduleExtend.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -32,7 +32,7 @@
<dt class="">Pkl version:</dt>
<dd>0.10.0 or higher</dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/moduleInfoAnnotation.pkl">moduleInfoAnnotation.pkl</a></dd>
<dd><a href="https://example.com/package1/moduleInfoAnnotation.pkl">moduleInfoAnnotation.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -30,7 +30,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/moduleMethodCommentInheritance.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/moduleMethodCommentInheritance.pkl">moduleMethodCommentInheritance.pkl</a></dd>
<dd><a href="https://example.com/package1/moduleMethodCommentInheritance.pkl">moduleMethodCommentInheritance.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -31,7 +31,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/moduleMethodComments.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/moduleMethodComments.pkl">moduleMethodComments.pkl</a></dd>
<dd><a href="https://example.com/package1/moduleMethodComments.pkl">moduleMethodComments.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -31,7 +31,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/moduleMethodModifiers.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/moduleMethodModifiers.pkl">moduleMethodModifiers.pkl</a></dd>
<dd><a href="https://example.com/package1/moduleMethodModifiers.pkl">moduleMethodModifiers.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -31,7 +31,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/moduleMethodTypeAnnotations.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/moduleMethodTypeAnnotations.pkl">moduleMethodTypeAnnotations.pkl</a></dd>
<dd><a href="https://example.com/package1/moduleMethodTypeAnnotations.pkl">moduleMethodTypeAnnotations.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -33,7 +33,7 @@ the same module, a different module, and external modules.</p></div>
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/moduleMethodTypeReferences.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/moduleMethodTypeReferences.pkl">moduleMethodTypeReferences.pkl</a></dd>
<dd><a href="https://example.com/package1/moduleMethodTypeReferences.pkl">moduleMethodTypeReferences.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -31,7 +31,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/modulePropertyAnnotations.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/modulePropertyAnnotations.pkl">modulePropertyAnnotations.pkl</a></dd>
<dd><a href="https://example.com/package1/modulePropertyAnnotations.pkl">modulePropertyAnnotations.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -30,7 +30,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/modulePropertyCommentInheritance.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/modulePropertyCommentInheritance.pkl">modulePropertyCommentInheritance.pkl</a></dd>
<dd><a href="https://example.com/package1/modulePropertyCommentInheritance.pkl">modulePropertyCommentInheritance.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -31,7 +31,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/modulePropertyComments.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/modulePropertyComments.pkl">modulePropertyComments.pkl</a></dd>
<dd><a href="https://example.com/package1/modulePropertyComments.pkl">modulePropertyComments.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -31,7 +31,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/modulePropertyModifiers.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/modulePropertyModifiers.pkl">modulePropertyModifiers.pkl</a></dd>
<dd><a href="https://example.com/package1/modulePropertyModifiers.pkl">modulePropertyModifiers.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -31,7 +31,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/modulePropertyTypeAnnotations.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/modulePropertyTypeAnnotations.pkl">modulePropertyTypeAnnotations.pkl</a></dd>
<dd><a href="https://example.com/package1/modulePropertyTypeAnnotations.pkl">modulePropertyTypeAnnotations.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -33,7 +33,7 @@ the same module, a different module, and external modules.</p></div>
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/modulePropertyTypeReferences.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/modulePropertyTypeReferences.pkl">modulePropertyTypeReferences.pkl</a></dd>
<dd><a href="https://example.com/package1/modulePropertyTypeReferences.pkl">modulePropertyTypeReferences.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -30,7 +30,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/moduleTypes1.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/moduleTypes1.pkl">moduleTypes1.pkl</a></dd>
<dd><a href="https://example.com/package1/moduleTypes1.pkl">moduleTypes1.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -31,7 +31,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/moduleTypes2.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/moduleTypes2.pkl">moduleTypes2.pkl</a></dd>
<dd><a href="https://example.com/package1/moduleTypes2.pkl">moduleTypes2.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -31,7 +31,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/nested/nested2/nestedModule.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/nested/nested2/nestedModule.pkl">nestedModule.pkl</a></dd>
<dd><a href="https://example.com/package1/nested/nested2/nestedModule.pkl">nestedModule.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -31,7 +31,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/shared.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/shared.pkl">shared.pkl</a></dd>
<dd><a href="https://example.com/package1/shared.pkl">shared.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -30,7 +30,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/ternalPackage.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/ternalPackage.pkl">ternalPackage.pkl</a></dd>
<dd><a href="https://example.com/package1/ternalPackage.pkl">ternalPackage.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -32,7 +32,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/typeAliasInheritance.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/typeAliasInheritance.pkl">typeAliasInheritance.pkl</a></dd>
<dd><a href="https://example.com/package1/typeAliasInheritance.pkl">typeAliasInheritance.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -32,7 +32,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/typealiases.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/typealiases.pkl">typealiases.pkl</a></dd>
<dd><a href="https://example.com/package1/typealiases.pkl">typealiases.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -32,7 +32,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/typealiases2.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/typealiases2.pkl">typealiases2.pkl</a></dd>
<dd><a href="https://example.com/package1/typealiases2.pkl">typealiases2.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -30,7 +30,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/unionTypes.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/unionTypes.pkl">unionTypes.pkl</a></dd>
<dd><a href="https://example.com/package1/unionTypes.pkl">unionTypes.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -30,7 +30,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/unlistedClass.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/unlistedClass.pkl">unlistedClass.pkl</a></dd>
<dd><a href="https://example.com/package1/unlistedClass.pkl">unlistedClass.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -31,7 +31,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/unlistedMethod.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/unlistedMethod.pkl">unlistedMethod.pkl</a></dd>
<dd><a href="https://example.com/package1/unlistedMethod.pkl">unlistedMethod.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -31,7 +31,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">https://example.com/unlistedProperty.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/package1/unlistedProperty.pkl">unlistedProperty.pkl</a></dd>
<dd><a href="https://example.com/package1/unlistedProperty.pkl">unlistedProperty.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -31,7 +31,7 @@
<dt class="">Module URI:</dt>
<dd><span class="import-uri">modulepath:/com/package2/Module3.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/blob/4.5.6/Module3.pkl">Module3.pkl</a></dd>
<dd><a href="https://example.com/blob/4.5.6/Module3.pkl">Module3.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -28,9 +28,9 @@
<div class="member-signature">open module <span class="name-decl">birds.Bird</span></div>
<dl class="member-info">
<dt class="">Module URI:</dt>
<dd><span class="import-uri">package://localhost:12110/Bird.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dd><span class="import-uri">package://localhost:12110/birds@0.5.0#/Bird.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/birds/v0.5.0/blob/Bird.pkl">Bird.pkl</a></dd>
<dd><a href="https://example.com/birds/v0.5.0/blob/Bird.pkl">Bird.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -28,9 +28,9 @@
<div class="member-signature">module <span class="name-decl">birds.allFruit</span></div>
<dl class="member-info">
<dt class="">Module URI:</dt>
<dd><span class="import-uri">package://localhost:12110/allFruit.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dd><span class="import-uri">package://localhost:12110/birds@0.5.0#/allFruit.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/birds/v0.5.0/blob/allFruit.pkl">allFruit.pkl</a></dd>
<dd><a href="https://example.com/birds/v0.5.0/blob/allFruit.pkl">allFruit.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -28,9 +28,9 @@
<div class="member-signature">module <span class="name-decl">birds.catalog</span></div>
<dl class="member-info">
<dt class="">Module URI:</dt>
<dd><span class="import-uri">package://localhost:12110/catalog.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dd><span class="import-uri">package://localhost:12110/birds@0.5.0#/catalog.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="">Source code:</dt>
<dd><a href="https%3A//example.com/birds/v0.5.0/blob/catalog.pkl">catalog.pkl</a></dd>
<dd><a href="https://example.com/birds/v0.5.0/blob/catalog.pkl">catalog.pkl</a></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
@@ -28,7 +28,7 @@
<div class="member-signature">module <span class="name-decl">fruit.Fruit</span></div>
<dl class="member-info">
<dt class="">Module URI:</dt>
<dd><span class="import-uri">package://localhost:12110/Fruit.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dd><span class="import-uri">package://localhost:12110/fruit@1.1.0#/Fruit.pkl</span><i class="copy-uri-button material-icons">content_copy</i></dd>
<dt class="runtime-data hidden">Known subtypes:</dt>
<dd id="known-subtypes" class="runtime-data hidden"></dd>
<dt class="runtime-data hidden">Known usages:</dt>
+1 -1
View File
@@ -36,7 +36,7 @@
///
/// Warning: Although this module is ready for initial use,
/// benchmark results may be inaccurate or inconsistent.
@ModuleInfo { minPklVersion = "0.25.2" }
@ModuleInfo { minPklVersion = "0.25.3" }
module pkl.Benchmark
import "pkl:platform" as _platform

Some files were not shown because too many files have changed in this diff Show More