diff --git a/pkl-core/src/main/java/org/pkl/core/stdlib/json/ParserNodes.java b/pkl-core/src/main/java/org/pkl/core/stdlib/json/ParserNodes.java index 15557d344..7480a2554 100644 --- a/pkl-core/src/main/java/org/pkl/core/stdlib/json/ParserNodes.java +++ b/pkl-core/src/main/java/org/pkl/core/stdlib/json/ParserNodes.java @@ -172,6 +172,11 @@ public void endObject(@Nullable EconomicMap members) { @Override public void startObjectValue(@Nullable EconomicMap members, String name) { + if (!useMapping && "default".equals(name)) { + // https://github.com/apple/pkl/issues/561 + throw new ParseException( + "Cannot parse object key `default` into a `Dynamic` value", getLocation()); + } currPath.push(Identifier.get(name)); } diff --git a/pkl-core/src/main/java/org/pkl/core/stdlib/yaml/ParserNodes.java b/pkl-core/src/main/java/org/pkl/core/stdlib/yaml/ParserNodes.java index 2dfcdfe9d..6fde717b8 100644 --- a/pkl-core/src/main/java/org/pkl/core/stdlib/yaml/ParserNodes.java +++ b/pkl-core/src/main/java/org/pkl/core/stdlib/yaml/ParserNodes.java @@ -469,6 +469,12 @@ private void addMembers(MappingNode node, VmObject object) { var memberName = convertedKey instanceof String string && !useMapping ? Identifier.get(string) : null; + // https://github.com/apple/pkl/issues/561 + if (memberName != null && "default".equals(convertedKey)) { + throw new YamlEngineException( + "Cannot parse object key `default` into a Dynamic value. Node: " + node); + } + var member = new ObjectMember( sourceSection, diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonParser1.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonParser1.pkl index b4c7fabfd..dbdb40863 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonParser1.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonParser1.pkl @@ -66,3 +66,11 @@ res16 = parser.parse(""" // invalid syntax res17 = test.catch(() -> parser.parse("!@#$%")) + +res18 = test.catch(() -> parser.parse(""" + {"default": null} + """)) + +res19 = (parser) { useMapping = true }.parse(""" + {"default": null} + """) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlParser2.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlParser2.pkl index 043784188..fcf2bcf13 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlParser2.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlParser2.pkl @@ -91,3 +91,11 @@ res15 = parser.parseAll(""" hobby: surfing ... """) + +res16 = test.catch(() -> parser.parse(""" + {"default": null} + """)) + +res17 = (parser) { useMapping = true }.parse(""" + default: null + """) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonParser1.pcf b/pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonParser1.pcf index b51ba3d1c..0ac6d7813 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonParser1.pcf +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonParser1.pcf @@ -48,3 +48,7 @@ res16 { } } res17 = "Error parsing JSON document." +res18 = "Error parsing JSON document." +res19 { + ["default"] = null +} diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlParser2.pcf b/pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlParser2.pcf index 66336fde7..933efb6cd 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlParser2.pcf +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlParser2.pcf @@ -47,3 +47,7 @@ res15 = List(new { }, new { hobby = "surfing" }) +res16 = "Error parsing YAML document." +res17 { + ["default"] = null +}