@ball-lang/compiler 1.71.0 → 1.71.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -180,10 +180,13 @@ export declare class BallCompiler {
180
180
  * 0`), `this.`-formals (`Box.of(this.value)`), a plain body
181
181
  * (`Bar.named(int x) { print(x); }`), or any combination. The instance comes
182
182
  * from `Object.create(C.prototype)` so no user constructor runs, which means
183
- * the class's inline field initializers do not run either: every declared
184
- * field is seeded with its own default FIRST (Dart's ordering inline field
185
- * initializers, then the initializer list, then the body), and only then do
186
- * the constructor-specific writes land on top (#564).
183
+ * neither the class's inline field initializers nor the real `super()` that
184
+ * would run the SUPERCLASS's inline initializers execute either: every
185
+ * declared field reachable from this class inherited ones first, then the
186
+ * class's own is seeded with its default FIRST (Dart's ordering — inline
187
+ * field initializers, then the initializer list, then the body), and only
188
+ * then do the constructor-specific writes land on top (#564, #581). The
189
+ * caller (`emitClass`) supplies that whole-chain `classProperties` list.
187
190
  *
188
191
  * A `factory` named constructor is the one exception: by definition it
189
192
  * returns some other object, so its body runs as the static method's own
@@ -1 +1 @@
1
- {"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../src/compiler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../src/compiler.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAMV,MAAM,EACN,OAAO,EAIR,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,uDAAuD;AACvD,MAAM,WAAW,qBAAqB;IACpC,2EAA2E;IAC3E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAQD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAElC,+CAA+C;IAC/C,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,KAAK,CAAK;IAElB,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAE/C,sEAAsE;IACtE,OAAO,CAAC,YAAY,CAA0B;IAE9C,mEAAmE;IACnE,OAAO,CAAC,kBAAkB,CAA0B;IAEpD,mEAAmE;IACnE,OAAO,CAAC,mBAAmB,CAA0B;IAErD,0EAA0E;IAC1E,OAAO,CAAC,uBAAuB,CAA0B;IAEzD;0EACsE;IACtE,OAAO,CAAC,uBAAuB,CAA0B;IAEzD;;;;OAIG;IACH,OAAO,CAAC,uBAAuB,CAA0B;IAEzD,8EAA8E;IAC9E,OAAO,CAAC,gBAAgB,CAAqB;IAE7C,8EAA8E;IAC9E,OAAO,CAAC,sBAAsB,CAA0B;IAExD,yEAAyE;IACzE,OAAO,CAAC,gBAAgB,CAA0B;IAElD,4DAA4D;IAC5D,OAAO,CAAC,aAAa,CAA0C;IAE/D;;;OAGG;IACH,OAAO,CAAC,iBAAiB,CAA0B;IAEnD;;;;;OAKG;IACH,OAAO,CAAC,WAAW,CAA6B;IAEhD;;;;;;;;;;OAUG;IACH,OAAO,CAAC,gBAAgB,CAAgB;IAExC;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,gBAAgB,CAKhB;IAER;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAK;IAErB,6EAA6E;IAC7E,OAAO,CAAC,SAAS,CAAK;gBAEV,OAAO,EAAE,OAAO;IAI5B,4BAA4B;IAC5B,OAAO,CAAC,OAAO,GAAE,cAAmB,GAAG,MAAM;IAggE7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;IACH,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,MAAM;IAiB3D;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,gBAAgB;IAwKxB,OAAO,CAAC,gBAAgB;IAoDxB;;;;OAIG;IACH,OAAO,CAAC,QAAQ;IAUhB,wEAAwE;IACxE,OAAO,CAAC,iBAAiB;IAoBzB;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,SAAS;IAmRjB,OAAO,CAAC,SAAS;IAuHjB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IA0BtB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,cAAc;IAsHtB,OAAO,CAAC,WAAW;IA0BnB,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,iBAAiB;IAmBzB,OAAO,CAAC,yBAAyB;IAoBjC,OAAO,CAAC,SAAS;IAmCjB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAStB;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IAiB9B,OAAO,CAAC,aAAa;IAsErB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,wBAAwB;IA8IhC;;;;;;;;OAQG;IACH,OAAO,CAAC,gBAAgB;IAuGxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,OAAO,CAAC,kBAAkB;IA8D1B;;iCAE6B;IAC7B,OAAO,CAAC,iBAAiB;IAOzB;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,WAAW;IAmDnB,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,aAAa;IAYrB;;;;;;;;;OASG;IACH,OAAO,CAAC,aAAa;IAkBrB,sEAAsE;IACtE,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,WAAW;IAyGnB,OAAO,CAAC,cAAc;IAyBtB;;;;OAIG;IACH,OAAO,CAAC,0BAA0B;IAsBlC;;;;;;;;OAQG;IACH,OAAO,CAAC,UAAU;IAuBlB,OAAO,CAAC,mBAAmB;IA6B3B;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,IAAI;IAmEZ,OAAO,CAAC,cAAc;IAqCtB,OAAO,CAAC,0BAA0B;IAWlC,2DAA2D;IAC3D,OAAO,CAAC,mBAAmB;IAU3B,0DAA0D;IAC1D,OAAO,CAAC,kBAAkB;IAU1B;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IAmB1B,2EAA2E;IAC3E,OAAO,CAAC,YAAY;IAUpB;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAkF7B;;;;;;;OAOG;IACH,OAAO,CAAC,aAAa;IAsBrB,OAAO,CAAC,kBAAkB;IA6C1B,OAAO,CAAC,sBAAsB;IAqI9B,OAAO,CAAC,yBAAyB;IAqBjC,OAAO,CAAC,sBAAsB;IAI9B;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,sBAAsB;IAe9B,OAAO,CAAC,aAAa;IA6BrB,OAAO,CAAC,WAAW;IAsHnB,OAAO,CAAC,cAAc;IAyhCtB,OAAO,CAAC,iBAAiB;IAoJzB,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,WAAW;IA2CnB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,iBAAiB;IA6HzB;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,iBAAiB;IA2BzB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,YAAY;CAgDrB;AA+9BD,+CAA+C;AAC/C,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,MAAM,CAE1E;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,MAAM,CAER;AAMD,MAAM,WAAW,oBAAoB;IACnC,2EAA2E;IAC3E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,MAAM,CA+HpF"}
package/dist/compiler.js CHANGED
@@ -2181,7 +2181,17 @@ function __isUnknownFnError(e: any): boolean {
2181
2181
  // Include inherited fields from the superclass chain so that
2182
2182
  // references to inherited fields inside methods emit `this.name`
2183
2183
  // instead of bare `name` (which would be undefined in JS).
2184
+ //
2185
+ // The walk also collects each ancestor level's own field SPECS (type +
2186
+ // inline initializer), not just the names: a named constructor builds its
2187
+ // instance with `Object.create`, which runs no constructor at all — so it
2188
+ // never runs the real `super()` that would otherwise execute the
2189
+ // superclass's inline field initializers as its own prologue. The seeding
2190
+ // loop in `buildNamedCtor` therefore has to reproduce the whole chain in
2191
+ // one flat pass, the way the Dart reference engine's constructor frame
2192
+ // recurses through `_invokeSuperConstructor` (#581).
2184
2193
  const superclass = typeof meta["superclass"] === "string" ? meta["superclass"] : undefined;
2194
+ const inheritedLevels = [];
2185
2195
  if (superclass) {
2186
2196
  const entryMod = this.program.modules.find(m => m.name === this.program.entryModule);
2187
2197
  let sup = superclass;
@@ -2191,17 +2201,41 @@ function __isUnknownFnError(e: any): boolean {
2191
2201
  break;
2192
2202
  const supMeta = supTd.metadata ?? {};
2193
2203
  const supFields = Array.isArray(supMeta["fields"]) ? supMeta["fields"] : [];
2204
+ const level = [];
2194
2205
  for (const sf of supFields) {
2195
- if (sf?.name)
2196
- fieldNames.add(sf.name);
2206
+ if (!sf?.name)
2207
+ continue;
2208
+ fieldNames.add(sf.name);
2209
+ // Statics live as module-level consts, never on the instance.
2210
+ if (sf.is_static === true)
2211
+ continue;
2212
+ level.push({
2213
+ name: sf.name,
2214
+ type: typeof sf.type === "string" ? this.dartTypeToTs(sf.type) : "any",
2215
+ rawDartType: typeof sf.type === "string" ? sf.type : "",
2216
+ dartInitializer: typeof sf.initializer === "string" ? sf.initializer : undefined,
2217
+ });
2197
2218
  }
2198
2219
  if (supTd.descriptor?.field) {
2199
2220
  for (const f of supTd.descriptor.field)
2200
2221
  fieldNames.add(f.name);
2201
2222
  }
2223
+ // Descriptor fallback mirrors the own-class path above: only when the
2224
+ // ancestor carries no richer `metadata.fields` at all. A bare
2225
+ // descriptor field has no initializer, so it seeds nothing — it is
2226
+ // collected purely so the level list matches the name set.
2227
+ if (level.length === 0 && supTd.descriptor?.field) {
2228
+ for (const f of supTd.descriptor.field) {
2229
+ level.push({ name: f.name, type: "any", rawDartType: "" });
2230
+ }
2231
+ }
2232
+ inheritedLevels.push(level);
2202
2233
  sup = typeof supMeta["superclass"] === "string" ? supMeta["superclass"] : undefined;
2203
2234
  }
2204
2235
  }
2236
+ // Root ancestor first, matching Dart's superclass-initializes-before-
2237
+ // subclass ordering, so a subclass field that shadows an ancestor's wins.
2238
+ const inheritedProperties = inheritedLevels.slice().reverse().flat();
2205
2239
  // Method-name set for `this.foo()` routing inside bodies.
2206
2240
  // Exclude static fields — they're emitted as module-level consts
2207
2241
  // and referenced WITHOUT `this.`.
@@ -2259,11 +2293,12 @@ function __isUnknownFnError(e: any): boolean {
2259
2293
  }
2260
2294
  else {
2261
2295
  // Named constructors are static factory methods that return a new
2262
- // instance. The class's own (non-static) field declarations go with
2263
- // them: the instance is built with `Object.create`, which runs no
2264
- // field initializer, so the builder has to seed each default itself
2265
- // (#564).
2266
- methods.push(this.buildNamedCtor(fn, mMeta, fieldNames, tsName, properties.filter((p) => !p.isStatic)));
2296
+ // instance. Every (non-static) field declaration reachable from this
2297
+ // class goes with them inherited ones first, then the class's own:
2298
+ // the instance is built with `Object.create`, which runs no field
2299
+ // initializer AND no real `super()`, so the builder has to seed each
2300
+ // default along the whole superclass chain itself (#564, #581).
2301
+ methods.push(this.buildNamedCtor(fn, mMeta, fieldNames, tsName, [...inheritedProperties, ...properties.filter((p) => !p.isStatic)]));
2267
2302
  }
2268
2303
  }
2269
2304
  else if (mMeta["is_getter"] === true) {
@@ -2485,10 +2520,13 @@ function __isUnknownFnError(e: any): boolean {
2485
2520
  * 0`), `this.`-formals (`Box.of(this.value)`), a plain body
2486
2521
  * (`Bar.named(int x) { print(x); }`), or any combination. The instance comes
2487
2522
  * from `Object.create(C.prototype)` so no user constructor runs, which means
2488
- * the class's inline field initializers do not run either: every declared
2489
- * field is seeded with its own default FIRST (Dart's ordering inline field
2490
- * initializers, then the initializer list, then the body), and only then do
2491
- * the constructor-specific writes land on top (#564).
2523
+ * neither the class's inline field initializers nor the real `super()` that
2524
+ * would run the SUPERCLASS's inline initializers execute either: every
2525
+ * declared field reachable from this class inherited ones first, then the
2526
+ * class's own is seeded with its default FIRST (Dart's ordering — inline
2527
+ * field initializers, then the initializer list, then the body), and only
2528
+ * then do the constructor-specific writes land on top (#564, #581). The
2529
+ * caller (`emitClass`) supplies that whole-chain `classProperties` list.
2492
2530
  *
2493
2531
  * A `factory` named constructor is the one exception: by definition it
2494
2532
  * returns some other object, so its body runs as the static method's own
@@ -2502,13 +2540,14 @@ function __isUnknownFnError(e: any): boolean {
2502
2540
  const bodyParts = [];
2503
2541
  // Does the ctor have any field write of its own? Only WHETHER matters
2504
2542
  // here; each value is resolved where the assignment is emitted, by
2505
- // `resolveInitializerValue`. (A `this.`-formal counts only when there is
2506
- // no initializer list at all, preserving the historical branch selection
2507
- // for the `Foo.named(this.x) : super(...)` shape, which still falls
2508
- // through to `return new Foo()`.)
2543
+ // `resolveInitializerValue`. A `this.`-formal ALWAYS counts, whatever else
2544
+ // the initializer list holds: this used to also require
2545
+ // `initializers.length === 0`, so `Foo.named(this.x) : super(1)` a
2546
+ // non-empty list with no `field` entry — took neither construct branch and
2547
+ // fell through to `return new Foo()`, silently dropping the formal (#582).
2509
2548
  const thisParams = ctorParams.filter(p => p.isThis);
2510
2549
  const hasFieldInitializers = initializers.some((i) => i?.kind === "field" && typeof i.name === "string");
2511
- const hasCtorFieldWrites = hasFieldInitializers || (initializers.length === 0 && thisParams.length > 0);
2550
+ const hasCtorFieldWrites = hasFieldInitializers || thisParams.length > 0;
2512
2551
  // A Dart `factory` returns some other object, so it is the ONE named
2513
2552
  // constructor that must not synthesize an instance of its own class.
2514
2553
  const isFactory = meta["is_factory"] === true;
@@ -2531,12 +2570,15 @@ function __isUnknownFnError(e: any): boolean {
2531
2570
  const allAssignments = [...assignments, ...thisAssignments];
2532
2571
  bodyParts.push(`const __inst = Object.create(${className}.prototype);`);
2533
2572
  // `Object.create` deliberately runs no constructor — which also means it
2534
- // runs none of the class's inline field initializers. Seed every
2535
- // declared field with the SAME default the class declaration emits,
2536
- // before any constructor-specific write, exactly as Dart orders them
2537
- // (inline initializers, then the initializer list, then the body).
2573
+ // runs none of the class's inline field initializers, and none of the
2574
+ // SUPERCLASS's either (a real `super()` would have). `classProperties`
2575
+ // is therefore the whole superclass chain root-first, then this class's
2576
+ // own fields. Seed each with the SAME default its class declaration
2577
+ // emits, before any constructor-specific write, exactly as Dart orders
2578
+ // them (inline initializers, then the initializer list, then the body).
2538
2579
  // Without this a field the named constructor never mentions stayed
2539
- // `undefined` forever (#564: `Init.viaList`'s `w`, `Baz.bare`'s `v`).
2580
+ // `undefined` forever (#564: `Init.viaList`'s `w`, `Baz.bare`'s `v`;
2581
+ // #581: every field declared by an ancestor).
2540
2582
  for (const p of classProperties) {
2541
2583
  const def = dartInitializerToTs(p.dartInitializer, p.type, p.rawDartType);
2542
2584
  if (def !== undefined)