{"record":{"id":"c1420655ab9d65e1","repo":"apple/pkl","slug":"values-of-type-class-cannot-be-rendered-as-yaml","errorCode":null,"errorMessage":"Values of type `Class` cannot be rendered as YAML. Value: %s","messagePattern":"Values of type `Class` cannot be rendered as YAML\\. Value: (.+?)","errorType":"exception","errorClass":"RendererException","httpStatus":null,"severity":"error","filePath":"pkl-core/src/main/java/org/pkl/core/YamlRenderer.java","lineNumber":202,"sourceCode":"\n      @SuppressWarnings(\"unchecked\")\n      var mapValue = (Map<String, ?>) value;\n      doVisitProperties(mapValue);\n    }\n\n    @Override\n    public void visitObject(PObject value) {\n      doVisitProperties(value.getProperties());\n    }\n\n    @Override\n    public void visitModule(PModule value) {\n      doVisitProperties(value.getProperties());\n    }\n\n    @Override\n    public void visitClass(PClass value) {\n      throw new RendererException(\n          String.format(\n              \"Values of type `Class` cannot be rendered as YAML. Value: %s\",\n              value.getSimpleName()));\n    }\n\n    @Override\n    public void visitTypeAlias(TypeAlias value) {\n      throw new RendererException(\n          String.format(\n              \"Values of type `TypeAlias` cannot be rendered as YAML. Value: %s\",\n              value.getSimpleName()));\n    }\n\n    @Override\n    public void visitNull() {\n      emitter.emit(YamlUtils.plainScalar(\"null\", Tag.NULL));\n    }\n","sourceCodeStart":184,"sourceCodeEnd":220,"githubUrl":"https://github.com/apple/pkl/blob/f3efcbfc9b60d30053b0536d664948d7aa1b8673/pkl-core/src/main/java/org/pkl/core/YamlRenderer.java#L184-L220","documentation":"Classes are type declarations, not data, so YamlRenderer.visitClass throws RendererException rather than emitting a class value. Only the class's simple name is included in the message. Modules render fine, but class references must be removed or converted before YAML output.","triggerScenarios":"renderDocument on a value tree that contains a PClass reference, e.g. a property holding `Foo` (a class) or output containing default-bearing class references, reaching visitClass.","commonSituations":"Pkl modules whose output accidentally exposes a class (e.g. `output { value { myClass = Foo } }`); reflective/generic pipelines that walk all properties including type references.","solutions":["Remove class references from the rendered value; render instances or a descriptive string (e.g. `Foo.getSimpleName()`) instead.","Restructure the Pkl module so `output.value` contains only data (amendments/objects), not type declarations.","Filter out non-data values before handing the tree to the renderer."],"exampleFix":"// before\nrenderer.renderDocument(Map(\"type\", SomeClass)); // throws\n// after\nrenderer.renderDocument(Map(\"type\", SomeClass.getSimpleName()));","handlingStrategy":"type-guard","validationCode":"void requireNoClasses(Object v) {\n  if (v instanceof PClass) throw new IllegalArgumentException(\"class value not renderable: \" + ((PClass) v).getSimpleName());\n}","typeGuard":"boolean isDataValue(Object v) { return !(v instanceof PClass); }","tryCatchPattern":"try {\n  renderer.renderDocument(value);\n} catch (RendererException e) {\n  if (e.getMessage().startsWith(\"Values of type `Class` cannot be rendered as YAML\")) {\n    renderer.renderDocument(stripClassRefs(value));\n  } else throw e;\n}","preventionTips":["Keep output.value data-only: never assign raw class references in rendered documents.","Render class names via getSimpleName() when a type tag is needed.","Walk the value tree pre-render and drop or stringify non-data values."],"tags":["yaml","rendering","class","pkl","unsupported"],"backgroundTag":"unsupported-operation","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"}