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" + } +}