{"record":{"id":"190e133e86f60835","repo":"apple/pkl","slug":"wrongheaders","errorCode":"wrongHeaders","errorMessage":"ErrorMessages.create(\"wrongHeaders\", messageArg)","messagePattern":"ErrorMessages\\.create\\(\"wrongHeaders\", messageArg\\)","errorType":"exception","errorClass":"ParserError","httpStatus":null,"severity":"error","filePath":"pkl-parser/src/main/java/org/pkl/parser/ParserImpl.java","lineNumber":1871,"sourceCode":"    }\n    return new FullToken(tk, lexer.span(), lexer.getNewLinesBetween());\n  }\n\n  /**\n   * Backtrack to the previous token.\n   *\n   * <p>Can only backtrack one token.\n   */\n  private void backtrack() {\n    assert !backtracking;\n    lookahead = prev.token;\n    spanLookahead = prev.span;\n    backtracking = true;\n  }\n\n  private void ensureEmptyHeaders(MemberHeader header, String messageArg) {\n    if (header.isNotEmpty()) {\n      throw new ParserError(\n          ErrorMessages.create(\"wrongHeaders\", messageArg), header.span(spanLookahead));\n    }\n  }\n\n  private record FullToken(Token token, Span span, int newLinesBetween) {\n    String text(Lexer lexer) {\n      return lexer.textFor(span.charIndex(), span.length());\n    }\n  }\n}\n","sourceCodeStart":1853,"sourceCodeEnd":1882,"githubUrl":"https://github.com/apple/pkl/blob/f3efcbfc9b60d30053b0536d664948d7aa1b8673/pkl-parser/src/main/java/org/pkl/parser/ParserImpl.java#L1853-L1882","documentation":"The Pkl parser throws ParserError with the \"wrongHeaders\" message when it encounters a declaration whose member modifiers/annotations (header) are not allowed to be present for that kind of member. ensureEmptyHeaders is called at grammar positions where a member must carry no modifiers (e.g. certain object members or entries), and any non-empty header there is a syntax error.","triggerScenarios":"Parsing a .pkl module that places modifiers or annotations on a grammar position that requires an empty member header — e.g. adding `hidden`, `fixed`, `abstract`, or an annotation to a member kind that forbids them (object entries, amends bodies, etc.).","commonSituations":"Hand-editing a Pkl config file and adding a modifier in the wrong place; copy-pasting modifiers between member kinds; typos that make the parser read a token as a modifier instead of part of the value.","solutions":["Open the file at the span reported in the error and remove the modifiers/annotations from the offending member.","Check the Pkl language spec for which member kinds accept which modifiers (e.g. `hidden` only on properties, not entries).","If the error appeared after a Pkl version upgrade, check release notes for stricter grammar rules.","Run the file through `pkl format` or an editor with Pkl LSP to spot misplaced modifiers."],"exampleFix":"// before\n\"key\" hidden = 1 // entry cannot have `hidden` header\n// after\n\"key\" = 1","handlingStrategy":"validation","validationCode":"// Validate with the parser before use\ntry {\n  new Parser().parseModule(pklSource);\n} catch (ParserError e) {\n  // surface e.getMessage() + span to the author\n}","typeGuard":null,"tryCatchPattern":"try {\n  parse(pklSource);\n} catch (ParserError e) {\n  logger.error(\"Pkl syntax error at \" + e.getSpan() + \": \" + e.getMessage());\n}","preventionTips":["Use the Pkl language server / IDE plugin for inline syntax validation.","Never add modifiers to member kinds that require empty headers (entries, amends bodies).","Run `pkl format` in CI to catch malformed declarations early."],"tags":["parser","pkl","syntax-error"],"backgroundTag":"invalid-argument-format","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"}