From 2242cc9c8202132631bd4d845cc3ce17a764363c Mon Sep 17 00:00:00 2001 From: Daniel Chao Date: Wed, 22 Jul 2026 13:04:36 -0700 Subject: [PATCH] Fix variable resolution of object body params (#1788) Fixes a regression introduced in Pkl 0.32. --- .../main/java/org/pkl/core/ast/builder/SymbolTable.java | 7 +++++++ .../input/generators/forGeneratorObjectBodyParam.pkl | 9 +++++++++ .../input/generators/whenGeneratorObjectBodyParam.pkl | 8 ++++++++ .../output/generators/forGeneratorObjectBodyParam.pcf | 7 +++++++ .../output/generators/whenGeneratorObjectBodyParam.pcf | 5 +++++ 5 files changed, 36 insertions(+) create mode 100644 pkl-core/src/test/files/LanguageSnippetTests/input/generators/forGeneratorObjectBodyParam.pkl create mode 100644 pkl-core/src/test/files/LanguageSnippetTests/input/generators/whenGeneratorObjectBodyParam.pkl create mode 100644 pkl-core/src/test/files/LanguageSnippetTests/output/generators/forGeneratorObjectBodyParam.pcf create mode 100644 pkl-core/src/test/files/LanguageSnippetTests/output/generators/whenGeneratorObjectBodyParam.pcf diff --git a/pkl-core/src/main/java/org/pkl/core/ast/builder/SymbolTable.java b/pkl-core/src/main/java/org/pkl/core/ast/builder/SymbolTable.java index 6dccb304b..fe39738fe 100644 --- a/pkl-core/src/main/java/org/pkl/core/ast/builder/SymbolTable.java +++ b/pkl-core/src/main/java/org/pkl/core/ast/builder/SymbolTable.java @@ -523,6 +523,13 @@ public final class SymbolTable { if (scope instanceof LexicalScope lex) { if (shouldSkip && !(scope instanceof ForGeneratorScope)) { if (scope instanceof ObjectScope objectScope && objectScope.hasParams()) { + // skipping the object scope should now see the object body params, because the params + // are one level higher than the body itself. + var result = fun.apply(objectScope, levelsUp); + if (result instanceof Parameter parameter) { + //noinspection unchecked + return (R) new Parameter(parameter.slot(), parameter.levelsUp() - 1); + } levelsUp++; } // An EagerGeneratorScope (for `when` predicates) skipped an ObjectScope. diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/generators/forGeneratorObjectBodyParam.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/generators/forGeneratorObjectBodyParam.pkl new file mode 100644 index 000000000..bf50f60bd --- /dev/null +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/generators/forGeneratorObjectBodyParam.pkl @@ -0,0 +1,9 @@ +foo = new Mapping { + default { key -> + for (idx, char in key.split("")) { + ["\(char)_\(idx)"] = "hi" + } + } + ["zzz"] {} +} + diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/generators/whenGeneratorObjectBodyParam.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/generators/whenGeneratorObjectBodyParam.pkl new file mode 100644 index 000000000..c015d29c9 --- /dev/null +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/generators/whenGeneratorObjectBodyParam.pkl @@ -0,0 +1,8 @@ +foo = new Mapping { + default { key -> + when (key is String) { + bar = key + } + } + ["x"] {} +} diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/generators/forGeneratorObjectBodyParam.pcf b/pkl-core/src/test/files/LanguageSnippetTests/output/generators/forGeneratorObjectBodyParam.pcf new file mode 100644 index 000000000..d3a6a695d --- /dev/null +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/generators/forGeneratorObjectBodyParam.pcf @@ -0,0 +1,7 @@ +foo { + ["zzz"] { + ["z_0"] = "hi" + ["z_1"] = "hi" + ["z_2"] = "hi" + } +} diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/generators/whenGeneratorObjectBodyParam.pcf b/pkl-core/src/test/files/LanguageSnippetTests/output/generators/whenGeneratorObjectBodyParam.pcf new file mode 100644 index 000000000..8e4aa6bfb --- /dev/null +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/generators/whenGeneratorObjectBodyParam.pcf @@ -0,0 +1,5 @@ +foo { + ["x"] { + bar = "x" + } +}