diff --git a/pkl-core/src/main/java/org/pkl/core/runtime/CommandSpecParser.java b/pkl-core/src/main/java/org/pkl/core/runtime/CommandSpecParser.java index b80c934a..12399fc2 100644 --- a/pkl-core/src/main/java/org/pkl/core/runtime/CommandSpecParser.java +++ b/pkl-core/src/main/java/org/pkl/core/runtime/CommandSpecParser.java @@ -407,7 +407,6 @@ public final class CommandSpecParser { } else if (typeNode instanceof TypeNode.TypeAliasTypeNode typeAliasTypeNode) { if (typeAliasTypeNode.getVmTypeAlias() == BaseModule.getCharTypeAlias()) break; typeNode = typeAliasTypeNode.getAliasedTypeNode(); - break; } else { break; } diff --git a/pkl-core/src/test/kotlin/org/pkl/core/runtime/CommandSpecParserTest.kt b/pkl-core/src/test/kotlin/org/pkl/core/runtime/CommandSpecParserTest.kt index 05aaa1d1..ecf9179b 100644 --- a/pkl-core/src/test/kotlin/org/pkl/core/runtime/CommandSpecParserTest.kt +++ b/pkl-core/src/test/kotlin/org/pkl/core/runtime/CommandSpecParserTest.kt @@ -814,4 +814,28 @@ class CommandSpecParserTest { assertThat(apply.message).contains("invalid choice") assertThat(apply.message).contains("xml") } + + @Test + fun `typealias of nullable is resolved as optional`() { + val moduleUri = + writePklFile( + "cmd.pkl", + renderOptions + + """ + typealias OptionalString = String? + class Options { + foo: OptionalString + } + """ + .trimIndent(), + ) + + val spec = parse(moduleUri) + + assertThat(spec.options.toList()[0]).isInstanceOf(CommandSpec.Flag::class.java) + (spec.options.toList()[0] as CommandSpec.Flag).apply { + assertThat(this.name).isEqualTo("foo") + assertThat(this.showAsRequired).isFalse() + } + } }