@ball-lang/compiler 1.5.3 → 1.5.5

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.
@@ -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":"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"}
package/dist/compiler.js CHANGED
@@ -3834,10 +3834,13 @@ function __isUnknownFnError(e: any): boolean {
3834
3834
  return `!__ball_eq(${this.expr(l)}, ${this.expr(r)})`;
3835
3835
  return `!__ball_eq(${this.expr(fg("left", "value", "arg0"))}, ${this.expr(fg("right", "other", "arg1"))})`;
3836
3836
  }
3837
- case "less_than": return bin("<");
3838
- case "greater_than": return bin(">");
3839
- case "lte": return bin("<=");
3840
- case "gte": return bin(">=");
3837
+ // Relational comparisons route through __ball_lt/__ball_gt/__ball_le/__ball_ge
3838
+ // so operator-overloaded types (e.g. a class defining `<`) dispatch to
3839
+ // their `__op_lt__`-style method instead of raw JS comparison (#205).
3840
+ case "less_than": return `__ball_lt(${this.expr(fg("left", "value", "arg0"))}, ${this.expr(fg("right", "other", "arg1"))})`;
3841
+ case "greater_than": return `__ball_gt(${this.expr(fg("left", "value", "arg0"))}, ${this.expr(fg("right", "other", "arg1"))})`;
3842
+ case "lte": return `__ball_le(${this.expr(fg("left", "value", "arg0"))}, ${this.expr(fg("right", "other", "arg1"))})`;
3843
+ case "gte": return `__ball_ge(${this.expr(fg("left", "value", "arg0"))}, ${this.expr(fg("right", "other", "arg1"))})`;
3841
3844
  // Logical
3842
3845
  case "and": return bin("&&");
3843
3846
  case "or": return bin("||");
@@ -5516,6 +5519,12 @@ const KNOWN_PATTERN_KINDS = new Set([
5516
5519
  "ConstPattern", "VarPattern", "var", "WildcardPattern", "wildcard", "_",
5517
5520
  "ListPattern", "RestPattern", "rest", "record", "RecordPattern",
5518
5521
  "LogicalOrPattern", "CastPattern", "NullCheckPattern", "NullAssertPattern",
5522
+ // MapPattern/LogicalAndPattern/ObjectPattern/RelationalPattern were missing
5523
+ // (#206, #207) — every pattern kind the encoder can emit (see
5524
+ // dart/encoder/lib/encoder.dart's `_encodePattern`) must be listed here, or
5525
+ // it falls to the legacy cosmetic-text parser, which cannot round-trip
5526
+ // `final`-bound entries and other structured shapes.
5527
+ "MapPattern", "LogicalAndPattern", "ObjectPattern", "RelationalPattern",
5519
5528
  ]);
5520
5529
  /** Generate a JS type-check condition for a Dart type name against `subject`.
5521
5530
  * Shared by the VarPattern and WildcardPattern arms so a typed binder
@@ -5605,6 +5614,110 @@ function compileStructuredPattern(patternExpr, subject, exprFn) {
5605
5614
  }
5606
5615
  return undefined;
5607
5616
  }
5617
+ case "LogicalAndPattern": {
5618
+ // `p1 && p2` matches only if BOTH alternatives match against the SAME
5619
+ // subject (Dart's guard-combinator syntax, e.g. `int n && > 0`). Mirrors
5620
+ // LogicalOrPattern but ANDs the conditions instead of ORing them; bindings
5621
+ // from both sides are unioned (in practice the right operand of a
5622
+ // relational combinator binds nothing). Falls through (undefined) if
5623
+ // either operand isn't structured.
5624
+ const left = fields.get("left");
5625
+ const right = fields.get("right");
5626
+ if (left && right) {
5627
+ const lr = compileStructuredPattern(left, subject, exprFn);
5628
+ const rr = compileStructuredPattern(right, subject, exprFn);
5629
+ if (lr && rr) {
5630
+ return {
5631
+ condition: `(${lr.condition} && ${rr.condition})`,
5632
+ bindings: [...lr.bindings, ...rr.bindings],
5633
+ };
5634
+ }
5635
+ }
5636
+ return undefined;
5637
+ }
5638
+ case "RelationalPattern": {
5639
+ // `== x` / `!= x` / `> x` / `< x` / `>= x` / `<= x` as a standalone
5640
+ // (or LogicalAndPattern-combined) pattern. Numeric comparisons require
5641
+ // BOTH the subject and operand to be `num` (mirrors engine_std.dart's
5642
+ // `_matchRelationalPattern`) — a non-numeric subject simply fails to
5643
+ // match rather than throwing.
5644
+ const op = fields.get("operator")?.literal?.stringValue;
5645
+ const operandExpr = fields.get("operand");
5646
+ if (!op || !operandExpr)
5647
+ return { condition: "true", bindings: [] };
5648
+ const operandStr = exprFn(operandExpr);
5649
+ if (op === "==")
5650
+ return { condition: `__ball_eq(${subject}, ${operandStr})`, bindings: [] };
5651
+ if (op === "!=")
5652
+ return { condition: `(!__ball_eq(${subject}, ${operandStr}))`, bindings: [] };
5653
+ const isNum = (v) => `(typeof (${v}) === 'number' || (${v}) instanceof BallDouble)`;
5654
+ const numVal = (v) => `((${v}) instanceof BallDouble ? (${v}).value : (${v}))`;
5655
+ return {
5656
+ condition: `(${isNum(subject)} && ${isNum(operandStr)} && (${numVal(subject)} ${op} ${numVal(operandStr)}))`,
5657
+ bindings: [],
5658
+ };
5659
+ }
5660
+ case "MapPattern": {
5661
+ // `{'key': subpattern, ...}`. Ball maps compile to a plain JS object for
5662
+ // the common `map_create` path (bracket access, e.g. `{'k': 7}`) but to a
5663
+ // native `Map` for the `typed_map` path (`<K,V>{}` / `Map()`) — both
5664
+ // representations must match. A Ball Set compiles to a native `Set`
5665
+ // (set_create), which IS `typeof 'object'` and not an array, so it must
5666
+ // be explicitly excluded (issue #178's "MapPattern must exclude Set").
5667
+ // Extra keys beyond the ones listed are fine (unlike RecordPattern's
5668
+ // exact-arity rule) — mirrors engine_std.dart's 'map' case.
5669
+ const entries = fields.get("entries")?.literal?.listValue?.elements ?? [];
5670
+ const conds = [
5671
+ `(typeof ${subject} === 'object' && ${subject} !== null && !Array.isArray(${subject}) && !(${subject} instanceof Set))`,
5672
+ ];
5673
+ const binds = [];
5674
+ for (const entry of entries) {
5675
+ const ef = mcFields(entry);
5676
+ const keyExpr = ef.get("key");
5677
+ const valuePattern = ef.get("value");
5678
+ if (!keyExpr)
5679
+ continue;
5680
+ const keyStr = exprFn(keyExpr);
5681
+ conds.push(`(${subject} instanceof Map ? ${subject}.has(${keyStr}) : (${keyStr} in ${subject}))`);
5682
+ if (valuePattern) {
5683
+ const valueExpr = `(${subject} instanceof Map ? ${subject}.get(${keyStr}) : ${subject}[${keyStr}])`;
5684
+ const sub = compileStructuredPattern(valuePattern, valueExpr, exprFn);
5685
+ if (sub) {
5686
+ if (sub.condition !== "true")
5687
+ conds.push(sub.condition);
5688
+ binds.push(...sub.bindings);
5689
+ }
5690
+ }
5691
+ }
5692
+ return { condition: conds.join(" && "), bindings: binds };
5693
+ }
5694
+ case "ObjectPattern": {
5695
+ // `Type(field: subpattern, ...)` matches by TYPE (reusing the same
5696
+ // instanceof/`__type__` gate CastPattern relies on via typeCheckCondition)
5697
+ // plus each named field's GETTER against its sub-pattern — field access,
5698
+ // not positional arity (mirrors engine_std.dart's 'object' case, which
5699
+ // reads `objMap[fieldName]` rather than requiring an exact key set).
5700
+ const typeName = fields.get("type")?.literal?.stringValue;
5701
+ const objFields = fields.get("fields")?.literal?.listValue?.elements ?? [];
5702
+ const conds = [];
5703
+ if (typeName)
5704
+ conds.push(typeCheckCondition(typeName, subject));
5705
+ const binds = [];
5706
+ for (const of_ of objFields) {
5707
+ const ofFields = mcFields(of_);
5708
+ const fieldName = ofFields.get("name")?.literal?.stringValue;
5709
+ const fieldPattern = ofFields.get("pattern");
5710
+ if (!fieldName || !fieldPattern)
5711
+ continue;
5712
+ const sub = compileStructuredPattern(fieldPattern, `${subject}.${fieldName}`, exprFn);
5713
+ if (sub) {
5714
+ if (sub.condition !== "true")
5715
+ conds.push(sub.condition);
5716
+ binds.push(...sub.bindings);
5717
+ }
5718
+ }
5719
+ return { condition: conds.length > 0 ? conds.join(" && ") : "true", bindings: binds };
5720
+ }
5608
5721
  case "CastPattern": {
5609
5722
  // A cast pattern (subpat as T) ASSERTS the runtime type — it matches
5610
5723
  // structurally (like its sub-pattern) but THROWS on a mismatch (Dart