apple / pkl

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

Implement nested types #563

Open HT154 opened 4 months ago

HT154 commented 4 months ago

I'd like to be able to do something like this:

class MyA {
  properties: Properties

  class Properties {
    prop1: String
  }
}

class MyB {
  properties: Properties

  class Properties {
    prop2: String
  }
}

aProps: MyA.Properties

Currently, this requires disambiguating classes with only naming, which can lead to very long class names with more deeply nested structures. This code today must look like this:

class MyA {
  properties: MyAProperties
}

class MyAProperties {
  prop1: String
}

class MyB {
  properties: MyBProperties
}

class MyBProperties {
  prop2: String
}

aProps: MyAProperties
bioball commented 4 months ago

I'm kind of bearish on this idea--this feature is a request to use classes as namespaces, and I don't know if that is a suitable use of classes.

Today, I'd suggest doing what you're doing (disambiguate the plain class name), or, alternatively, put them in different modules.

HT154 commented 2 weeks ago

My motivation for opening this is actually described exactly in https://github.com/apple/pkl-pantry/issues/40

This is definitely something I'd discourage in normal use of Pkl, but when used as a tool for disambiguating identically named types without manual name mangling—particularly in conjunction with Pkl code generation—I think this stands to be really valuable.

Also, I think could play a role in a potential non-trivial user generics implementation that may need to consider associated types (like Swift), which would motivate allowing typealias in these same contexts.