Extending an abstract class **without** overriding an abstract property crashes with ambiguous message
Given:
abstract class Bird {
abstract name: String
function greet(bird: Bird): String = "Hello, \(bird.name)!"
}
class Pigeon extends Bird {
// Here, I forgot to overried `name`
}
pigeon: Pigeon = new {}
Leads to:
pkl failed with error Error: Command failed: /var/task/node_modules/@pkl-community/pkl-linux-x64/bin/pkl eval - --no-project --format json --allowed-modules pkl:,repl: --allowed-modules package: --cache-dir /tmp/pkl
An unexpected error has occurred. Would you mind filing a bug report?
Cmd+Double-click the link below to open an issue.
Please copy and paste the entire error output into the issue's description, provided you can share it.
https://github.com/apple/pkl/issues/newjava.lang.IllegalArgumentException%3A%20Cannot%20convert%20VM%20value%20with%20unexpected%20type%3A%20null
–– Pkl Error ––
Cannot convert VM value with unexpected type: null
394 | external function renderDocument(value: Any): String
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
at pkl.base#JsonRenderer.renderDocument (https://github.com/apple/pkl/blob/0.25.1/stdlib/base.pkl#L394)
106 | text = renderer.renderDocument(value)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
at pkl.base#Module.output.text (https://github.com/apple/pkl/blob/0.25.1/stdlib/base.pkl#L106)
Pkl 0.25.1 (Linux 5.15.0-1050-aws, native)
java.lang.IllegalArgumentException: Cannot convert VM value with unexpected type: null
at org.pkl.core.runtime.VmValueConverter.convert(VmValueConverter.java:100)
at org.pkl.core.stdlib.AbstractRenderer.doVisitProperty(AbstractRenderer.java:193)
at org.pkl.core.stdlib.AbstractRenderer.lambda$visitTyped$0(AbstractRenderer.java:256)
at org.pkl.core.runtime.VmObject.lambda$iterateAlreadyForcedMemberValues$1(VmObject.java:132)
at org.pkl.core.runtime.VmObject.iterateMembers(VmObject.java:148)
at org.pkl.core.runtime.VmObject.iterateMembers(VmObject.java:141)
at org.pkl.core.runtime.VmObject.iterateAlreadyForcedMemberValues(VmObject.java:124)
at org.pkl.core.runtime.VmObject.forceAndIterateMemberValues(VmObject.java:117)
at org.pkl.core.stdlib.AbstractRenderer.visitTyped(AbstractRenderer.java:252)
at org.pkl.core.runtime.VmTyped.accept(VmTyped.java:168)
at org.pkl.core.runtime.VmValueVisitor.visit(VmValueVisitor.java:65)
at org.pkl.core.stdlib.AbstractRenderer.visit(AbstractRenderer.java:126)
at org.pkl.core.stdlib.base.JsonRendererNodes$JsonRenderer.visitProperty(JsonRendererNodes.java:230)
at org.pkl.core.stdlib.AbstractRenderer.doVisitProperty(AbstractRenderer.java:195)
at org.pkl.core.stdlib.AbstractRenderer.lambda$visitTyped$0(AbstractRenderer.java:256)
at org.pkl.core.runtime.VmObject.lambda$iterateAlreadyForcedMemberValues$1(VmObject.java:132)
at org.pkl.core.runtime.VmObject.iterateMembers(VmObject.java:148)
at org.pkl.core.runtime.VmObject.iterateAlreadyForcedMemberValues(VmObject.java:124)
at org.pkl.core.runtime.VmObject.forceAndIterateMemberValues(VmObject.java:117)
at org.pkl.core.stdlib.AbstractRenderer.visitTyped(AbstractRenderer.java:252)
at org.pkl.core.runtime.VmTyped.accept(VmTyped.java:168)
at org.pkl.core.runtime.VmValueVisitor.visit(VmValueVisitor.java:65)
at org.pkl.core.stdlib.AbstractRenderer.visit(AbstractRenderer.java:126)
at org.pkl.core.stdlib.base.JsonRendererNodes$JsonRenderer.visitDocument(JsonRendererNodes.java:73)
at org.pkl.core.stdlib.AbstractRenderer.renderDocument(AbstractRenderer.java:101)
at org.pkl.core.stdlib.base.JsonRendererNodes$renderDocument.eval(JsonRendererNodes.java:37)
at org.pkl.core.stdlib.base.JsonRendererNodesFactory$renderDocumentNodeGen.executeAndSpecialize(JsonRendererNodesFactory.java:65)
at org.pkl.core.stdlib.base.JsonRendererNodesFactory$renderDocumentNodeGen.executeGeneric(JsonRendererNodesFactory.java:57)
at org.pkl.core.ast.member.FunctionNode.execute(FunctionNode.java:119)
at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.executeRootNode(OptimizedCallTarget.java:709)
at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.profiledPERoot(OptimizedCallTarget.java:632)
at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.callBoundary(OptimizedCallTarget.java:565)
at com.oracle.svm.truffle.api.SubstrateOptimizedCallTarget.invokeCallBoundary(SubstrateOptimizedCallTarget.java:115)
at com.oracle.svm.truffle.api.SubstrateOptimizedCallTargetInstalledCode.doInvoke(SubstrateOptimizedCallTargetInstalledCode.java:194)
at com.oracle.svm.truffle.api.SubstrateOptimizedCallTarget.doInvoke(SubstrateOptimizedCallTarget.java:97)
at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.callDirect(OptimizedCallTarget.java:495)
at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedDirectCallNode.call(OptimizedDirectCallNode.java:68)
at org.pkl.core.ast.expression.member.InvokeMethodVirtualNode.evalCached(InvokeMethodVirtualNode.java:136)
at org.pkl.core.ast.expression.member.InvokeMethodVirtualNodeGen.executeAndSpecialize(InvokeMethodVirtualNodeGen.java:214)
at org.pkl.core.ast.expression.member.InvokeMethodVirtualNodeGen.executeGeneric(InvokeMethodVirtualNodeGen.java:131)
at org.pkl.core.ast.PklRootNode.executeBody(PklRootNode.java:41)
at org.pkl.core.ast.MemberNode.executeBody(MemberNode.java:71)
at org.pkl.core.ast.member.TypeCheckedPropertyNode.evalTypedObjectCached(TypeCheckedPropertyNode.java:55)
at org.pkl.core.ast.member.TypeCheckedPropertyNodeGen.executeAndSpecialize(TypeCheckedPropertyNodeGen.java:100)
at org.pkl.core.ast.member.TypeCheckedPropertyNodeGen.execute(TypeCheckedPropertyNodeGen.java:61)
at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.executeRootNode(OptimizedCallTarget.java:709)
at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.profiledPERoot(OptimizedCallTarget.java:632)
at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.callBoundary(OptimizedCallTarget.java:565)
at com.oracle.svm.truffle.api.SubstrateOptimizedCallTarget.invokeCallBoundary(SubstrateOptimizedCallTarget.java:115)
at com.oracle.svm.truffle.api.SubstrateOptimizedCallTargetInstalledCode.doInvoke(SubstrateOptimizedCallTargetInstalledCode.java:194)
at com.oracle.svm.truffle.api.SubstrateOptimizedCallTarget.doInvoke(SubstrateOptimizedCallTarget.java:97)
at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.callIndirect(OptimizedCallTarget.java:477)
at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.call(OptimizedCallTarget.java:458)
at org.graalvm.truffle/com.oracle.truffle.api.nodes.IndirectCallNode$1.call(IndirectCallNode.java:91)
at org.pkl.core.runtime.VmUtils.doReadMember(VmUtils.java:297)
at org.pkl.core.runtime.VmUtils.readMemberOrNull(VmUtils.java:237)
at org.pkl.core.runtime.VmUtils.readMemberOrNull(VmUtils.java:200)
at org.pkl.core.runtime.VmUtils.readMember(VmUtils.java:180)
at org.pkl.core.runtime.VmUtils.readTextProperty(VmUtils.java:170)
at org.pkl.core.EvaluatorImpl.lambda$evaluateOutputText$3(EvaluatorImpl.java:137)
at org.pkl.core.EvaluatorImpl.lambda$doEvaluate$13(EvaluatorImpl.java:352)
at org.pkl.core.EvaluatorImpl.doEvaluate(EvaluatorImpl.java:300)
at org.pkl.core.EvaluatorImpl.doEvaluate(EvaluatorImpl.java:348)
at org.pkl.core.EvaluatorImpl.evaluateOutputText(EvaluatorImpl.java:133)
at org.pkl.core.EvaluatorImpl.evaluateExpressionString(EvaluatorImpl.java:209)
at org.pkl.cli.CliEvaluator.writeOutput(CliEvaluator.kt:179)
at org.pkl.cli.CliEvaluator.doRun(CliEvaluator.kt:99)
at org.pkl.commons.cli.CliCommand.run(CliCommand.kt:45)
at org.pkl.cli.commands.EvalCommand.run(EvalCommand.kt:86)
at com.github.ajalt.clikt.parsers.Parser.parse(Parser.kt:198)
at com.github.ajalt.clikt.parsers.Parser.parse(Parser.kt:211)
at com.github.ajalt.clikt.parsers.Parser.parse(Parser.kt:18)
at com.github.ajalt.clikt.core.CliktCommand.parse(CliktCommand.kt:400)
at com.github.ajalt.clikt.core.CliktCommand.parse$default(CliktCommand.kt:397)
at com.github.ajalt.clikt.core.CliktCommand.main(CliktCommand.kt:415)
at com.github.ajalt.clikt.core.CliktCommand.main(CliktCommand.kt:440)
at org.pkl.cli.Main$main$1.invoke$lambda-0(Main.kt:45)
at [email protected]/java.lang.Thread.run(Thread.java:829)
at com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:775)
at com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:203)
and stderr:
An unexpected error has occurred. Would you mind filing a bug report?
Cmd+Double-click the link below to open an issue.
Please copy and paste the entire error output into the issue's description, provided you can share it.
https://github.com/apple/pkl/issues/newjava.lang.IllegalArgumentException%3A%20Cannot%20convert%20VM%20value%20with%20unexpected%20type%3A%20null
–– Pkl Error ––
Cannot convert VM value with unexpected type: null
394 | external function renderDocument(value: Any): String
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
at pkl.base#JsonRenderer.renderDocument (https://github.com/apple/pkl/blob/0.25.1/stdlib/base.pkl#L394)
106 | text = renderer.renderDocument(value)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
at pkl.base#Module.output.text (https://github.com/apple/pkl/blob/0.25.1/stdlib/base.pkl#L106)
Pkl 0.25.1 (Linux 5.15.0-1050-aws, native)
java.lang.IllegalArgumentException: Cannot convert VM value with unexpected type: null
at org.pkl.core.runtime.VmValueConverter.convert(VmValueConverter.java:100)
at org.pkl.core.stdlib.AbstractRenderer.doVisitProperty(AbstractRenderer.java:193)
at org.pkl.core.stdlib.AbstractRenderer.lambda$visitTyped$0(AbstractRenderer.java:256)
at org.pkl.core.runtime.VmObject.lambda$iterateAlreadyForcedMemberValues$1(VmObject.java:132)
at org.pkl.core.runtime.VmObject.iterateMembers(VmObject.java:148)
at org.pkl.core.runtime.VmObject.iterateMembers(VmObject.java:141)
at org.pkl.core.runtime.VmObject.iterateAlreadyForcedMemberValues(VmObject.java:124)
at org.pkl.core.runtime.VmObject.forceAndIterateMemberValues(VmObject.java:117)
at org.pkl.core.stdlib.AbstractRenderer.visitTyped(AbstractRenderer.java:252)
at org.pkl.core.runtime.VmTyped.accept(VmTyped.java:168)
at org.pkl.core.runtime.VmValueVisitor.visit(VmValueVisitor.java:65)
at org.pkl.core.stdlib.AbstractRenderer.visit(AbstractRenderer.java:126)
at org.pkl.core.stdlib.base.JsonRendererNodes$JsonRenderer.visitProperty(JsonRendererNodes.java:230)
at org.pkl.core.stdlib.AbstractRenderer.doVisitProperty(AbstractRenderer.java:195)
at org.pkl.core.stdlib.AbstractRenderer.lambda$visitTyped$0(AbstractRenderer.java:256)
at org.pkl.core.runtime.VmObject.lambda$iterateAlreadyForcedMemberValues$1(VmObject.java:132)
at org.pkl.core.runtime.VmObject.iterateMembers(VmObject.java:148)
at org.pkl.core.runtime.VmObject.iterateAlreadyForcedMemberValues(VmObject.java:124)
at org.pkl.core.runtime.VmObject.forceAndIterateMemberValues(VmObject.java:117)
at org.pkl.core.stdlib.AbstractRenderer.visitTyped(AbstractRenderer.java:252)
at org.pkl.core.runtime.VmTyped.accept(VmTyped.java:168)
at org.pkl.core.runtime.VmValueVisitor.visit(VmValueVisitor.java:65)
at org.pkl.core.stdlib.AbstractRenderer.visit(AbstractRenderer.java:126)
at org.pkl.core.stdlib.base.JsonRendererNodes$JsonRenderer.visitDocument(JsonRendererNodes.java:73)
at org.pkl.core.stdlib.AbstractRenderer.renderDocument(AbstractRenderer.java:101)
at org.pkl.core.stdlib.base.JsonRendererNodes$renderDocument.eval(JsonRendererNodes.java:37)
at org.pkl.core.stdlib.base.JsonRendererNodesFactory$renderDocumentNodeGen.executeAndSpecialize(JsonRendererNodesFactory.java:65)
at org.pkl.core.stdlib.base.JsonRendererNodesFactory$renderDocumentNodeGen.executeGeneric(JsonRendererNodesFactory.java:57)
at org.pkl.core.ast.member.FunctionNode.execute(FunctionNode.java:119)
at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.executeRootNode(OptimizedCallTarget.java:709)
at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.profiledPERoot(OptimizedCallTarget.java:632)
at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.callBoundary(OptimizedCallTarget.java:565)
at com.oracle.svm.truffle.api.SubstrateOptimizedCallTarget.invokeCallBoundary(SubstrateOptimizedCallTarget.java:115)
at com.oracle.svm.truffle.api.SubstrateOptimizedCallTargetInstalledCode.doInvoke(SubstrateOptimizedCallTargetInstalledCode.java:194)
at com.oracle.svm.truffle.api.SubstrateOptimizedCallTarget.doInvoke(SubstrateOptimizedCallTarget.java:97)
at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.callDirect(OptimizedCallTarget.java:495)
at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedDirectCallNode.call(OptimizedDirectCallNode.java:68)
at org.pkl.core.ast.expression.member.InvokeMethodVirtualNode.evalCached(InvokeMethodVirtualNode.java:136)
at org.pkl.core.ast.expression.member.InvokeMethodVirtualNodeGen.executeAndSpecialize(InvokeMethodVirtualNodeGen.java:214)
at org.pkl.core.ast.expression.member.InvokeMethodVirtualNodeGen.executeGeneric(InvokeMethodVirtualNodeGen.java:131)
at org.pkl.core.ast.PklRootNode.executeBody(PklRootNode.java:41)
at org.pkl.core.ast.MemberNode.executeBody(MemberNode.java:71)
at org.pkl.core.ast.member.TypeCheckedPropertyNode.evalTypedObjectCached(TypeCheckedPropertyNode.java:55)
at org.pkl.core.ast.member.TypeCheckedPropertyNodeGen.executeAndSpecialize(TypeCheckedPropertyNodeGen.java:100)
at org.pkl.core.ast.member.TypeCheckedPropertyNodeGen.execute(TypeCheckedPropertyNodeGen.java:61)
at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.executeRootNode(OptimizedCallTarget.java:709)
at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.profiledPERoot(OptimizedCallTarget.java:632)
at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.callBoundary(OptimizedCallTarget.java:565)
at com.oracle.svm.truffle.api.SubstrateOptimizedCallTarget.invokeCallBoundary(SubstrateOptimizedCallTarget.java:115)
at com.oracle.svm.truffle.api.SubstrateOptimizedCallTargetInstalledCode.doInvoke(SubstrateOptimizedCallTargetInstalledCode.java:194)
at com.oracle.svm.truffle.api.SubstrateOptimizedCallTarget.doInvoke(SubstrateOptimizedCallTarget.java:97)
at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.callIndirect(OptimizedCallTarget.java:477)
at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.call(OptimizedCallTarget.java:458)
at org.graalvm.truffle/com.oracle.truffle.api.nodes.IndirectCallNode$1.call(IndirectCallNode.java:91)
at org.pkl.core.runtime.VmUtils.doReadMember(VmUtils.java:297)
at org.pkl.core.runtime.VmUtils.readMemberOrNull(VmUtils.java:237)
at org.pkl.core.runtime.VmUtils.readMemberOrNull(VmUtils.java:200)
at org.pkl.core.runtime.VmUtils.readMember(VmUtils.java:180)
at org.pkl.core.runtime.VmUtils.readTextProperty(VmUtils.java:170)
at org.pkl.core.EvaluatorImpl.lambda$evaluateOutputText$3(EvaluatorImpl.java:137)
at org.pkl.core.EvaluatorImpl.lambda$doEvaluate$13(EvaluatorImpl.java:352)
at org.pkl.core.EvaluatorImpl.doEvaluate(EvaluatorImpl.java:300)
at org.pkl.core.EvaluatorImpl.doEvaluate(EvaluatorImpl.java:348)
at org.pkl.core.EvaluatorImpl.evaluateOutputText(EvaluatorImpl.java:133)
at org.pkl.core.EvaluatorImpl.evaluateExpressionString(EvaluatorImpl.java:209)
at org.pkl.cli.CliEvaluator.writeOutput(CliEvaluator.kt:179)
at org.pkl.cli.CliEvaluator.doRun(CliEvaluator.kt:99)
at org.pkl.commons.cli.CliCommand.run(CliCommand.kt:45)
at org.pkl.cli.commands.EvalCommand.run(EvalCommand.kt:86)
at com.github.ajalt.clikt.parsers.Parser.parse(Parser.kt:198)
at com.github.ajalt.clikt.parsers.Parser.parse(Parser.kt:211)
at com.github.ajalt.clikt.parsers.Parser.parse(Parser.kt:18)
at com.github.ajalt.clikt.core.CliktCommand.parse(CliktCommand.kt:400)
at com.github.ajalt.clikt.core.CliktCommand.parse$default(CliktCommand.kt:397)
at com.github.ajalt.clikt.core.CliktCommand.main(CliktCommand.kt:415)
at com.github.ajalt.clikt.core.CliktCommand.main(CliktCommand.kt:440)
at org.pkl.cli.Main$main$1.invoke$lambda-0(Main.kt:45)
at [email protected]/java.lang.Thread.run(Thread.java:829)
at com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:775)
at com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:203)
See also: https://pkl-playground.vercel.app/?share=bad-tone-whispered
I've the same issue locally with the latest 0.29.1 version:
Pkl 0.29.1 (macOS 26.0, native)
If I go with abstract hidden name: String, it works perfectly fine.
Even wihtout overriding it in the child-class.
Seems also wrong to me 👀
abstract class Bird {
abstract hidden name: String
function greet(bird: Bird): String = "Hello, \(bird.name)!"
}
class Pigeon extends Bird {
// Here, I forgot to overried `name`
}
pigeon: Pigeon = new {}
☝️ Works without any issues
https://pkl-playground.vercel.app/?share=transportation-announced-explanation
The second one is definitely expected behavior: hidden properties are not rendered, and because Pkl evaluation is lazy the entire property is not evaluated, so the error never occurs.
Thanks for the report!