{"record":{"id":"d06e56c3c6c6bc09","repo":"apple/pkl","slug":"unexpectedendoffile-d06e56","errorCode":"unexpectedEndOfFile","errorMessage":"Unexpected end of file.","messagePattern":"Unexpected end of file\\.","errorType":"exception","errorClass":"GenericParserError","httpStatus":null,"severity":"error","filePath":"pkl-parser/src/main/java/org/pkl/parser/GenericParserImpl.java","lineNumber":201,"sourceCode":"      ff(children);\n    }\n    var modifiers = new ArrayList<Node>();\n    while (lookahead.isModifier()) {\n      modifiers.add(make(NodeType.MODIFIER, next().span));\n      hasModifier = true;\n      ff(children);\n    }\n    if (hasModifier) children.add(new Node(NodeType.MODIFIER_LIST, modifiers));\n    return new HeaderResult(hasDocComment, hasAnnotation, hasModifier);\n  }\n\n  private Node parseModuleMember(List<Node> preChildren) {\n    return switch (lookahead) {\n      case IDENTIFIER -> parseClassProperty(preChildren);\n      case TYPE_ALIAS -> parseTypeAlias(preChildren);\n      case CLASS -> parseClass(preChildren);\n      case FUNCTION -> parseClassMethod(preChildren);\n      case EOF -> throw parserError(\"unexpectedEndOfFile\");\n      default -> {\n        if (lookahead.isKeyword()) {\n          throw parserError(\"keywordNotAllowedHere\", lookahead.text());\n        }\n        if (lookahead == Token.DOC_COMMENT) {\n          throw parserError(\"danglingDocComment\");\n        }\n        throw parserError(\"invalidTopLevelToken\");\n      }\n    };\n  }\n\n  private Node parseTypeAlias(List<Node> preChildren) {\n    var headerParts = getHeaderParts(preChildren);\n    var children = new ArrayList<>(headerParts.preffixes);\n    var headers = new ArrayList<Node>();\n    if (headerParts.modifierList != null) {\n      headers.add(headerParts.modifierList);","sourceCodeStart":183,"sourceCodeEnd":219,"githubUrl":"https://github.com/apple/pkl/blob/f3efcbfc9b60d30053b0536d664948d7aa1b8673/pkl-parser/src/main/java/org/pkl/parser/GenericParserImpl.java#L183-L219","documentation":"The module parser throws \"Unexpected end of file.\" (code unexpectedEndOfFile) when it reaches EOF at a position where a module member (class property, type alias, class, or method) must appear. parseModuleMember sees Token.EOF instead of any valid member start, so the module body is empty/truncated after its headers.","triggerScenarios":"A .pkl file that ends right after `module ...` / `amends ...` / `extends ...` headers with no following member; a file truncated during save/transfer; a file whose last member's body was accidentally deleted.","commonSituations":"Creating a new module and saving it before writing any content (note: only when members are syntactically required in that context); truncated file sync or incomplete commit; an editor or script that cut the file short.","solutions":["Add at least one module member after the headers (e.g. a property `x = 1` or a class).","Check whether the file was truncated; restore it from version control or regenerate it.","If the module is intentionally just a header (pure amends with no members), verify that your Pkl version allows an empty body in that position, or add a placeholder member."],"exampleFix":"// before (truncated file)\nmodule my.mod\namends \"base.pkl\"\n// after\nmodule my.mod\namends \"base.pkl\"\n\nx = 1","handlingStrategy":"validation","validationCode":"// a non-empty module body is expected after headers\nconst trimmed = pklSource.trim();\nif (trimmed.endsWith(\"amends \\\"...\\\"\") || /\\b(amends|extends)\\s+\"[^\"]+\"\\s*$/.test(trimmed)) {\n  throw new Error(\"Module has headers but no members\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Verify file completeness (size, last line) after generation or transfer.","When creating modules, write a placeholder member until real content exists.","Check git diffs for accidental deletion of the entire module body."],"tags":["pkl","parser","syntax","eof"],"backgroundTag":"unexpected-eof","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"}