{"record":{"id":"074a3b8f4a2ca625","repo":"apple/pkl","slug":"unseparatedobjectmembers","errorCode":"unseparatedObjectMembers","errorMessage":"unseparatedObjectMembers","messagePattern":"unseparatedObjectMembers","errorType":"error_code","errorClass":"VmException","httpStatus":null,"severity":"error","filePath":"pkl-core/src/main/java/org/pkl/core/ast/builder/AstBuilder.java","lineNumber":2587,"sourceCode":"              currentScope.getQualifiedName(),\n              currentScope.isCustomThisScope(),\n              parametersDescriptor,\n              parameterTypes,\n              members,\n              parentNode);\n        });\n  }\n\n  private void checkSpaceSeparatedObjectMembers(ObjectBody objectBody) {\n    var members = objectBody.getMembers();\n    if (members.size() < 2) {\n      return;\n    }\n    var previous = members.get(0).span();\n    for (var i = 1; i < members.size(); i++) {\n      var member = members.get(i);\n      if (previous.adjacent(member.span())) {\n        throw exceptionBuilder()\n            .evalError(\"unseparatedObjectMembers\")\n            .withSourceSection(createSourceSection(member.span()))\n            .build();\n      }\n      previous = member.span();\n    }\n  }\n\n  private ObjectMember doVisitObjectProperty(ObjectProperty prop) {\n    var modifierNodes = prop.getModifiers();\n    var propertyName = prop.getIdentifier();\n    var modifiers =\n        doVisitModifiers(\n            modifierNodes, VmModifier.VALID_OBJECT_MEMBER_MODIFIERS, \"invalidObjectMemberModifier\");\n    if (VmModifier.isConst(modifiers) && !VmModifier.isLocal(modifiers)) {\n      @SuppressWarnings(\"OptionalGetWithoutIsPresent\")\n      var constModifierCtx =\n          modifierNodes.stream()","sourceCodeStart":2569,"sourceCodeEnd":2605,"githubUrl":"https://github.com/apple/pkl/blob/f3efcbfc9b60d30053b0536d664948d7aa1b8673/pkl-core/src/main/java/org/pkl/core/ast/builder/AstBuilder.java#L2569-L2605","documentation":"Object members (properties, entries, elements) in a Pkl object must be separated by whitespace/newlines or commas where required. The builder checks the source spans of consecutive members; if one span is directly adjacent to the next (no separator between them), it rejects the object body.","triggerScenarios":"Two object members written with no separating whitespace or newline, e.g. `{foo = 1bar = 2}` or adjacent entries `{[\"a\"] = 1[\"b\"] = 2}`; the check uses `previous.adjacent(member.span())` over the collected member spans.","commonSituations":"Minifying/generated config output that strips whitespace; line-join accidents when pasting or when an editor collapses lines; template-generated object literals without newline separators.","solutions":["Insert a newline or space between the two adjacent members.","If generating config programmatically, always emit a separator (e.g. `\\n`) between members.","Check for an unclosed value immediately before the member that swallowed the separator."],"exampleFix":"// before\nfoo = 1bar = 2\n// after\nfoo = 1\nbar = 2","handlingStrategy":"validation","validationCode":"// when generating object bodies, always join members with a separator\nconst body = members.join('\\n');\nif (/(\\S)([\\[\\\"a-zA-Z])/.test(body.replace(/=.*/g, ''))) reviewSeparators();","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always put each object member on its own line.","In generators/templates, emit `\\n` between members; never minify Pkl config by stripping whitespace.","Check pasted blocks for line-joins that removed separators."],"tags":["pkl","object-literal","syntax","whitespace"],"backgroundTag":"unseparated-object-members","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"}