Calling trace(...) upon a complex Pkl data structure results in a compact, single-line evaluation of that structure, which is non-ideal when debugging complex rendering scenarios.
Solution
Adds a new evaluator setting, traceMode, which supports the following values:
"hidden": No trace() calls will be emitted to stderr
"default": All structures passed to trace(...) will be emitted to stderr in compact, single-line form.
"pretty": All structures passed to trace(...) will be emitted to stderr in indented, multi-line form.
As this mechanism needs to be evaluated within the TraceNode visitor, this setting is ultimately plumbed into the VmContext to be accessible from an executeGeneric()->doTrace() call. This approach seemed to be the most idiomatic, but there may ultimately be more straightforward options for exposing this value at the doTrace() level.
Testing
Added Pkl, Java and Kotlin tests across all applicable areas to ensure correct parsing of traceMode value alongside expected behavior. Ensured that all spotless formatting checks ran cleanly.
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.
## 📋 Pull Request Information
**Original PR:** https://github.com/apple/pkl/pull/1100
**Author:** [@ssalevan](https://github.com/ssalevan)
**Created:** 6/16/2025
**Status:** ✅ Merged
**Merged:** 10/7/2025
**Merged by:** [@HT154](https://github.com/HT154)
**Base:** `main` ← **Head:** `ssalevan/pretty-traces`
---
### 📝 Commits (5)
- [`c639d08`](https://github.com/apple/pkl/commit/c639d0881d4ca5d44723eeeb691023ea22698d14) Adds prettyTrace evaluator setting to support indented, multi-line trace() output
- [`1257e5d`](https://github.com/apple/pkl/commit/1257e5dcadd67b331f238ccd57d2f6afe1a94d1e) Converts prettyTraces to TraceMode, loops into pkl-server
- [`30193d6`](https://github.com/apple/pkl/commit/30193d6a26bfc2dc3a04028bf2cbb2519f2a06cc) Adds traceMode option to CLI arguments
- [`a12dceb`](https://github.com/apple/pkl/commit/a12dceb923aa736e6cc7050b0ccd416f2bef6bec) Correct missing TraceMode specification
- [`8139288`](https://github.com/apple/pkl/commit/81392887be0754e550f8734d94e079f3ebf1c7f4) Bumps version to 0.30.0
### 📊 Changes
**43 files changed** (+383 additions, -27 deletions)
<details>
<summary>View changed files</summary>
📝 `bench/src/jmh/java/org/pkl/core/ListSort.java` (+3 -2)
📝 `docs/src/test/kotlin/DocSnippetTests.kt` (+1 -0)
📝 `pkl-cli/src/main/kotlin/org/pkl/cli/CliRepl.kt` (+1 -0)
📝 `pkl-cli/src/test/kotlin/org/pkl/cli/repl/ReplMessagesTest.kt` (+1 -0)
📝 `pkl-commons-cli/src/main/kotlin/org/pkl/commons/cli/CliBaseOptions.kt` (+4 -0)
📝 `pkl-commons-cli/src/main/kotlin/org/pkl/commons/cli/commands/BaseOptions.kt` (+13 -0)
📝 `pkl-core/src/main/java/org/pkl/core/Analyzer.java` (+7 -2)
📝 `pkl-core/src/main/java/org/pkl/core/EvaluatorBuilder.java` (+22 -1)
📝 `pkl-core/src/main/java/org/pkl/core/EvaluatorImpl.java` (+5 -2)
📝 `pkl-core/src/main/java/org/pkl/core/ast/expression/unary/TraceNode.java` (+17 -3)
📝 `pkl-core/src/main/java/org/pkl/core/evaluatorSettings/PklEvaluatorSettings.java` (+16 -4)
➕ `pkl-core/src/main/java/org/pkl/core/evaluatorSettings/TraceMode.java` (+26 -0)
📝 `pkl-core/src/main/java/org/pkl/core/messaging/AbstractMessagePackEncoder.java` (+4 -2)
📝 `pkl-core/src/main/java/org/pkl/core/project/Project.java` (+10 -4)
📝 `pkl-core/src/main/java/org/pkl/core/repl/ReplServer.java` (+5 -2)
📝 `pkl-core/src/main/java/org/pkl/core/runtime/StdLibModule.java` (+2 -1)
📝 `pkl-core/src/main/java/org/pkl/core/runtime/VmContext.java` (+10 -2)
➕ `pkl-core/src/test/files/LanguageSnippetTests/input/projects/defaultTraceMode/PklProject` (+5 -0)
➕ `pkl-core/src/test/files/LanguageSnippetTests/input/projects/defaultTraceMode/defaultTraceMode.pkl` (+18 -0)
➕ `pkl-core/src/test/files/LanguageSnippetTests/input/projects/evaluatorSettings/nullTraceMode.pkl` (+18 -0)
_...and 23 more files_
</details>
### 📄 Description
Problem
-------
Calling `trace(...)` upon a complex Pkl data structure results in a compact, single-line evaluation of that structure, which is non-ideal when debugging complex rendering scenarios.
Solution
--------
Adds a new evaluator setting, `traceMode`, which supports the following values:
* `"hidden"`: No trace() calls will be emitted to stderr
* `"default"`: All structures passed to `trace(...)` will be emitted to stderr in compact, single-line form.
* `"pretty"`: All structures passed to `trace(...)` will be emitted to stderr in indented, multi-line form.
As this mechanism needs to be evaluated within the `TraceNode` visitor, this setting is ultimately plumbed into the `VmContext` to be accessible from an `executeGeneric()->doTrace()` call. This approach seemed to be the most idiomatic, but there may ultimately be more straightforward options for exposing this value at the `doTrace()` level.
Testing
-------
Added Pkl, Java and Kotlin tests across all applicable areas to ensure correct parsing of `traceMode` value alongside expected behavior. Ensured that all spotless formatting checks ran cleanly.
---
<sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
📋 Pull Request Information
Original PR: https://github.com/apple/pkl/pull/1100
Author: @ssalevan
Created: 6/16/2025
Status: ✅ Merged
Merged: 10/7/2025
Merged by: @HT154
Base:
main← Head:ssalevan/pretty-traces📝 Commits (5)
c639d08Adds prettyTrace evaluator setting to support indented, multi-line trace() output1257e5dConverts prettyTraces to TraceMode, loops into pkl-server30193d6Adds traceMode option to CLI argumentsa12dcebCorrect missing TraceMode specification8139288Bumps version to 0.30.0📊 Changes
43 files changed (+383 additions, -27 deletions)
View changed files
📝
bench/src/jmh/java/org/pkl/core/ListSort.java(+3 -2)📝
docs/src/test/kotlin/DocSnippetTests.kt(+1 -0)📝
pkl-cli/src/main/kotlin/org/pkl/cli/CliRepl.kt(+1 -0)📝
pkl-cli/src/test/kotlin/org/pkl/cli/repl/ReplMessagesTest.kt(+1 -0)📝
pkl-commons-cli/src/main/kotlin/org/pkl/commons/cli/CliBaseOptions.kt(+4 -0)📝
pkl-commons-cli/src/main/kotlin/org/pkl/commons/cli/commands/BaseOptions.kt(+13 -0)📝
pkl-core/src/main/java/org/pkl/core/Analyzer.java(+7 -2)📝
pkl-core/src/main/java/org/pkl/core/EvaluatorBuilder.java(+22 -1)📝
pkl-core/src/main/java/org/pkl/core/EvaluatorImpl.java(+5 -2)📝
pkl-core/src/main/java/org/pkl/core/ast/expression/unary/TraceNode.java(+17 -3)📝
pkl-core/src/main/java/org/pkl/core/evaluatorSettings/PklEvaluatorSettings.java(+16 -4)➕
pkl-core/src/main/java/org/pkl/core/evaluatorSettings/TraceMode.java(+26 -0)📝
pkl-core/src/main/java/org/pkl/core/messaging/AbstractMessagePackEncoder.java(+4 -2)📝
pkl-core/src/main/java/org/pkl/core/project/Project.java(+10 -4)📝
pkl-core/src/main/java/org/pkl/core/repl/ReplServer.java(+5 -2)📝
pkl-core/src/main/java/org/pkl/core/runtime/StdLibModule.java(+2 -1)📝
pkl-core/src/main/java/org/pkl/core/runtime/VmContext.java(+10 -2)➕
pkl-core/src/test/files/LanguageSnippetTests/input/projects/defaultTraceMode/PklProject(+5 -0)➕
pkl-core/src/test/files/LanguageSnippetTests/input/projects/defaultTraceMode/defaultTraceMode.pkl(+18 -0)➕
pkl-core/src/test/files/LanguageSnippetTests/input/projects/evaluatorSettings/nullTraceMode.pkl(+18 -0)...and 23 more files
📄 Description
Problem
Calling
trace(...)upon a complex Pkl data structure results in a compact, single-line evaluation of that structure, which is non-ideal when debugging complex rendering scenarios.Solution
Adds a new evaluator setting,
traceMode, which supports the following values:"hidden": No trace() calls will be emitted to stderr"default": All structures passed totrace(...)will be emitted to stderr in compact, single-line form."pretty": All structures passed totrace(...)will be emitted to stderr in indented, multi-line form.As this mechanism needs to be evaluated within the
TraceNodevisitor, this setting is ultimately plumbed into theVmContextto be accessible from anexecuteGeneric()->doTrace()call. This approach seemed to be the most idiomatic, but there may ultimately be more straightforward options for exposing this value at thedoTrace()level.Testing
Added Pkl, Java and Kotlin tests across all applicable areas to ensure correct parsing of
traceModevalue alongside expected behavior. Ensured that all spotless formatting checks ran cleanly.🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.