apple / apple/pkl

Creating a `Dynamic` with property `default` set produces a broken object

Open
#561 4 comments 1 reaction 0 assignees View on GitHub
bug
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.