apple / pkl

A configuration as code language with rich validation and tooling.
https://pkl-lang.org
Apache License 2.0
10.11k stars 265 forks source link

🐛`fixed` properties not respected by `toTyped()` #573

Open thomaspurchas opened 2 months ago

thomaspurchas commented 2 months ago

The toTyped API doesn't respect fixed properties on classes, resulting in the following unexpected outcome:

class Bird {
  fixed type = "Parrot"
  name = "Polly"
}

untypedBird {
  type = "Cocker spaniel"
  name = "Morris"
}

result = untypedBird.toTyped(Bird)

produces

untypedBird {
  type = "Cocker spaniel"
  name = "Morris"
}
result {
  type = "Cocker spaniel"
  name = "Morris"
}
hmonfleur commented 1 month ago

I don't think It's particular to fixed properties. I have the same kind of problem but with "normal" properties :

class A{
  x:Int
  y = x + 1
}

a = Map("x", 1).toTyped(A)

produces the following error :

Tried to read property `x` but its value is undefined.

Which is understandable since :

class A{
  x:Int = 0
  y = x + 1
}

a = Map("x", 1).toTyped(A)

produces :

{
  "a": {
    "x": 1,
    "y": 1
  }
}

If I'm missing something or if there is a way around it I'm interested :)

holzensp commented 1 month ago

The point @thomaspurchas is making - I believe - is that he expected type to be "Parrot". What isn't being respected here, is that toTyped ignores the fixed-ness of the property.

hmonfleur commented 1 month ago

Ok, maybe I wrongly made a link between my problem and the one that @thomaspurchas raised. Still there's a behavior that is not the one I would have expected when using toTyped , i.e., it does not produce the same object as normal instantiation would have. I have found some partial workaround using let to force evaluation at some points (I mean I think that's what it does) but it does not entirely solve the problem (in my case for instanciation of objects contained in attributes and produced by the instanciation of an object that are not instanciated when using toTyped resulting in empty attributes). Maybe I can sum that up and open a new issue about it.