@ball-lang/compiler 1.5.4 → 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.
- package/dist/compiler.d.ts.map +1 -1
- package/dist/compiler.js +117 -4
- package/dist/compiler.js.map +1 -1
- package/dist/preamble.d.ts.map +1 -1
- package/dist/preamble.js +43 -4
- package/dist/preamble.js.map +1 -1
- package/package.json +1 -1
- package/src/compiler.ts +109 -4
- package/src/preamble.ts +43 -4
package/dist/compiler.d.ts.map
CHANGED
|
@@ -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
|
-
|
|
3838
|
-
|
|
3839
|
-
|
|
3840
|
-
case "
|
|
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
|