Creating a `Dynamic` with property `default` set produces a broken object
- Dominant language
- Java
- Stars
- 11.5k
- Forks
- 402
- Avg merge
- 1d 15h
- Merged PRs (30d)
- 20
Description
The behavior as-is is very surprising! Check this out:
```pkl
import "pkl:json"
hidden jsonString = """
{
"hello": "world",
"default": "greeting"
}
"""
asDynamic = new json.Parser {}.parse(jsonString)
asMapping = new json.Parser { useMapping = true }.parse(jsonString)
```
Result:
```pkl
asDynamic {
hello = "world"
}
asMapping {
["hello"] = "world"
["default"] = "greeting"
}
```
I think throwing an error (or at least some kind of warning) here instead of returning unexpected results is desirable. Something like "encountered object key `default` when parsing JSON, resulting `Dynamic` will be incomplete or invalid" might make sense.
N.B.: Attempting to access the default yields further surprises:
```pkl
asDynamicDefault = asDynamic.default
```
Result:
```
❯ pkl eval test.pkl
–– Pkl Error ––
Expected value of type `Function1`, but got type `String`.
Value: "greeting"
1741 | hidden default: (unknown) -> Any = (_) -> new Dynamic {}
^^^^^^^^^^^^^^^^
at pkl.base#Dynamic.default (https://github.com/apple/pkl/blob/0.26.0/stdlib/base.pkl#L1741)
1 |
^
at generated (source:unavailable)
11 | asDynamicDefault = asDynamic.default
^^^^^^^^^^^^^^^^^
at test#asDynamicDefault (file:///.../test.pkl, line 11)
106 | text = renderer.renderDocument(value)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
at pkl.base#Module.output.text (https://github.com/apple/pkl/blob/0.26.0/stdlib/base.pkl#L106)
```
This similarly affects `yaml.Parser.parse()` and `Map.toDynamic()`.
Contributor guide
Research direction
Start by tracing json.Parser.parse(), yaml.Parser.parse(), and Map.toDynamic() where objects become Dynamic values, then compare them with the mapping result shown in the report. Check how Dynamic.default is resolved and how the existing parser diagnostics work. Done should mean the `default` key is handled consistently and the incomplete or invalid Dynamic behavior is replaced by an explicit, tested outcome.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 52/100