apple/pkl · error · GenericParserError
unexpectedEndOfFile
unexpectedEndOfFile
Error message
Unexpected end of file.
What it means
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.
Source
Thrown at pkl-parser/src/main/java/org/pkl/parser/GenericParserImpl.java:201
ff(children);
}
var modifiers = new ArrayList<Node>();
while (lookahead.isModifier()) {
modifiers.add(make(NodeType.MODIFIER, next().span));
hasModifier = true;
ff(children);
}
if (hasModifier) children.add(new Node(NodeType.MODIFIER_LIST, modifiers));
return new HeaderResult(hasDocComment, hasAnnotation, hasModifier);
}
private Node parseModuleMember(List<Node> preChildren) {
return switch (lookahead) {
case IDENTIFIER -> parseClassProperty(preChildren);
case TYPE_ALIAS -> parseTypeAlias(preChildren);
case CLASS -> parseClass(preChildren);
case FUNCTION -> parseClassMethod(preChildren);
case EOF -> throw parserError("unexpectedEndOfFile");
default -> {
if (lookahead.isKeyword()) {
throw parserError("keywordNotAllowedHere", lookahead.text());
}
if (lookahead == Token.DOC_COMMENT) {
throw parserError("danglingDocComment");
}
throw parserError("invalidTopLevelToken");
}
};
}
private Node parseTypeAlias(List<Node> preChildren) {
var headerParts = getHeaderParts(preChildren);
var children = new ArrayList<>(headerParts.preffixes);
var headers = new ArrayList<Node>();
if (headerParts.modifierList != null) {
headers.add(headerParts.modifierList);View on GitHub (pinned to f3efcbfc9b)
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.
Example fix
// before (truncated file) module my.mod amends "base.pkl" // after module my.mod amends "base.pkl" x = 1
Defensive patterns
Strategy: validation
Validate before calling
// a non-empty module body is expected after headers
const trimmed = pklSource.trim();
if (trimmed.endsWith("amends \"...\"") || /\b(amends|extends)\s+"[^"]+"\s*$/.test(trimmed)) {
throw new Error("Module has headers but no members");
} Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Related errors
AI-assisted analysis of apple/pkl@f3efcbfc9b (2026-09-08).
Data as JSON: /api/errors/d06e56c3c6c6bc09.
Report an issue: GitHub.