{"record":{"id":"5bbe92b05f280d78","repo":"apple/pkl","slug":"noouterscope","errorCode":"noOuterScope","errorMessage":"Top-level scope does not have an outer scope.","messagePattern":"Top-level scope does not have an outer scope\\.","errorType":"error_code","errorClass":"VmException","httpStatus":null,"severity":"error","filePath":"pkl-core/src/main/java/org/pkl/core/ast/expression/primary/OuterNode.java","lineNumber":39,"sourceCode":"import com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmUtils;\n\n// TODO: should `outer.x` work like `super.x`? (start search in enclosing scope)\n// TODO: if enclosing scope is lambda scope, can't use `lambda.x` to access lambda param `x`\n@NodeInfo(shortName = \"outer\")\npublic final class OuterNode extends ExpressionNode {\n\n  public OuterNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    var outer = VmUtils.getOwner(frame).getEnclosingReceiver();\n    if (outer == null) {\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder().evalError(\"noOuterScope\").build();\n    }\n    return outer;\n  }\n}\n","sourceCodeStart":21,"sourceCodeEnd":44,"githubUrl":"https://github.com/apple/pkl/blob/f3efcbfc9b60d30053b0536d664948d7aa1b8673/pkl-core/src/main/java/org/pkl/core/ast/expression/primary/OuterNode.java#L21-L44","documentation":"Pkl's `outer` expression refers to the receiver of the lexically enclosing object. When evaluated in a context whose owner chain has no enclosing receiver — i.e. the current scope is top-level — OuterNode throws noOuterScope because there is no outer scope to reference.","triggerScenarios":"Using the `outer` keyword at the top level of a module (module body), or inside a top-level function/class member whose owner has getEnclosingReceiver() == null, i.e. any place where VmUtils.getOwner(frame).getEnclosingReceiver() returns null.","commonSituations":"Writing `outer.x` in a module-level property; pasting an object-member snippet that uses `outer` into the top level of a .pkl file; using `outer` inside a class definition where there is no enclosing object literal.","solutions":["Remove the `outer` reference at top level and address the value directly (top-level properties are already module scope)","Move the code that uses `outer` inside an actual object member so an enclosing receiver exists","Replace `outer.foo` with a direct reference to the module property `foo`","If inside a class, reference the intended property without `outer` or pass the value as a parameter"],"exampleFix":"// before (module level)\nx = 1\ny = outer.x + 1 // ERROR: no outer scope\n// after\nx = 1\ny = x + 1","handlingStrategy":"type-guard","validationCode":"// only use `outer` inside object members, never at module top level\n// bad:  y = outer.x   (module level)\n// good: inside an object member: y = outer.x","typeGuard":"null","tryCatchPattern":"null","preventionTips":["Never place `outer` in module body or class definitions","Reference module-level properties directly instead of via `outer`","Lint snippets moved between objects and top-level for leftover `outer` usage"],"tags":["pkl","scope","outer"],"backgroundTag":"resource-not-found","analyzedSha":"f3efcbfc9b60d30053b0536d664948d7aa1b8673","analyzedAt":"2026-09-08T13:10:45.570Z","contentChangedAt":"2026-09-08T13:10:45.570Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}