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

  1. Add at least one module member after the headers (e.g. a property `x = 1` or a class).
  2. Check whether the file was truncated; restore it from version control or regenerate it.
  3. 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

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.