{"record":{"id":"e7b4932dbf84e355","repo":"apple/pkl","slug":"forwhenbodycannothaveparameters","errorCode":"forWhenBodyCannotHaveParameters","errorMessage":"forWhenBodyCannotHaveParameters","messagePattern":"forWhenBodyCannotHaveParameters","errorType":"error_code","errorClass":"VmException","httpStatus":null,"severity":"error","filePath":"pkl-core/src/main/java/org/pkl/core/ast/builder/AstBuilder.java","lineNumber":1548,"sourceCode":"\n  @Override\n  public GeneratorMemberNode visitWhenGenerator(WhenGenerator member) {\n    var sourceSection = createSourceSection(member);\n    var thenNodes = doVisitForWhenBody(member.getThenClause());\n    var elseNodes =\n        member.getElseClause() == null\n            ? new GeneratorMemberNode[0]\n            : doVisitForWhenBody(member.getElseClause());\n\n    // when predicates cannot see their direct scope\n    var predicateNode =\n        symbolTable.enterEagerGenerator((scope) -> visitExpr(member.getPredicate()));\n    return new GeneratorWhenNode(sourceSection, predicateNode, thenNodes, elseNodes);\n  }\n\n  private GeneratorMemberNode[] doVisitForWhenBody(ObjectBody body) {\n    if (!body.getParameters().isEmpty()) {\n      throw exceptionBuilder()\n          .evalError(\"forWhenBodyCannotHaveParameters\")\n          .withSourceSection(createSourceSection(body.getParameters().get(0)))\n          .build();\n    }\n    return doVisitGeneratorMemberNodes(body.getMembers());\n  }\n\n  private @Nullable FrameSlotVariable makeBinding(\n      org.pkl.parser.syntax.@Nullable Parameter parameter) {\n    if (!(parameter instanceof TypedIdentifier typedIdentifier)) {\n      return null;\n    }\n    var name = typedIdentifier.getIdentifier().getValue();\n    return symbolTable\n        .getCurrentScope()\n        .frameDescriptorBuilder\n        .addSlot(FrameSlotKind.Illegal, toIdentifier(name), null);\n  }","sourceCodeStart":1530,"sourceCodeEnd":1566,"githubUrl":"https://github.com/apple/pkl/blob/f3efcbfc9b60d30053b0536d664948d7aa1b8673/pkl-core/src/main/java/org/pkl/core/ast/builder/AstBuilder.java#L1530-L1566","documentation":"In `for`/`when` generator expressions, the body object cannot declare parameters — the iteration variables are already bound by the `for` clause. If the body's parameter list is non-empty, doVisitForWhenBody throws forWhenBodyCannotHaveParameters, pointing at the first parameter.","triggerScenarios":"Writing `for (x in xs) when (cond) (y) { ... }` — supplying a parameter list on the body of a when-branch within a for-generator member.","commonSituations":"Confusing generator `when` bodies with class or function bodies that take parameters, or leftover syntax from refactoring a regular member into a generator.","solutions":["Remove the parameter list from the when body object.","Access needed values through the for-bound variables or captures instead of parameters.","If parameterization is required, use a plain function or a different construct than for/when generators."],"exampleFix":"// before\nfor (x in xs) when (x > 0) (y) { emit(x) }\n// after\nfor (x in xs) when (x > 0) { emit(x) }","handlingStrategy":"validation","validationCode":"// Ensure generator when-bodies have no parameter list before rendering:\nif (body.params && body.params.length > 0) throw new Error('for/when bodies cannot take parameters');","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never attach a parameter list to for/when generator bodies; use the for-bound variables.","Keep generator body syntax distinct from class/function body syntax."],"tags":["pkl","generator","syntax"],"backgroundTag":"unsupported-config-value","analyzedSha":"f3efcbfc9b60d30053b0536d664948d7aa1b8673","analyzedAt":"2026-09-08T13:10:45.570Z","contentChangedAt":"2026-09-08T13:10:45.570Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}