bonescript-compiler 0.2.1 → 0.3.0
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/LICENSE +21 -21
- package/dist/algorithm_catalog.js +166 -166
- package/dist/cli.d.ts +2 -1
- package/dist/cli.js +75 -543
- package/dist/cli.js.map +1 -1
- package/dist/commands/check.d.ts +5 -0
- package/dist/commands/check.js +34 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/compile.d.ts +5 -0
- package/dist/commands/compile.js +183 -0
- package/dist/commands/compile.js.map +1 -0
- package/dist/commands/debug.d.ts +5 -0
- package/dist/commands/debug.js +59 -0
- package/dist/commands/debug.js.map +1 -0
- package/dist/commands/diff.d.ts +5 -0
- package/dist/commands/diff.js +125 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/fmt.d.ts +5 -0
- package/dist/commands/fmt.js +49 -0
- package/dist/commands/fmt.js.map +1 -0
- package/dist/commands/init.d.ts +5 -0
- package/dist/commands/init.js +69 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/ir.d.ts +5 -0
- package/dist/commands/ir.js +27 -0
- package/dist/commands/ir.js.map +1 -0
- package/dist/commands/lex.d.ts +5 -0
- package/dist/commands/lex.js +21 -0
- package/dist/commands/lex.js.map +1 -0
- package/dist/commands/parse.d.ts +5 -0
- package/dist/commands/parse.js +30 -0
- package/dist/commands/parse.js.map +1 -0
- package/dist/commands/test.d.ts +5 -0
- package/dist/commands/test.js +61 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/commands/verify_determinism.d.ts +5 -0
- package/dist/commands/verify_determinism.js +64 -0
- package/dist/commands/verify_determinism.js.map +1 -0
- package/dist/commands/watch.d.ts +5 -0
- package/dist/commands/watch.js +50 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/emit_auth.d.ts +6 -0
- package/dist/emit_auth.js +69 -0
- package/dist/emit_auth.js.map +1 -0
- package/dist/emit_capability.d.ts +13 -0
- package/dist/emit_capability.js +235 -125
- package/dist/emit_capability.js.map +1 -1
- package/dist/emit_database.d.ts +7 -0
- package/dist/emit_database.js +74 -0
- package/dist/emit_database.js.map +1 -0
- package/dist/emit_deploy.js +162 -162
- package/dist/emit_events.js +274 -274
- package/dist/emit_full.js +102 -95
- package/dist/emit_full.js.map +1 -1
- package/dist/emit_index.d.ts +6 -0
- package/dist/emit_index.js +157 -0
- package/dist/emit_index.js.map +1 -0
- package/dist/emit_maintenance.js +249 -249
- package/dist/emit_package.d.ts +7 -0
- package/dist/emit_package.js +70 -0
- package/dist/emit_package.js.map +1 -0
- package/dist/emit_router.d.ts +12 -0
- package/dist/emit_router.js +375 -0
- package/dist/emit_router.js.map +1 -0
- package/dist/emit_runtime.d.ts +17 -11
- package/dist/emit_runtime.js +29 -686
- package/dist/emit_runtime.js.map +1 -1
- package/dist/emit_sourcemap.js +66 -66
- package/dist/extension_manager.d.ts +2 -2
- package/dist/extension_manager.js +6 -3
- package/dist/extension_manager.js.map +1 -1
- package/dist/lowering.d.ts +5 -14
- package/dist/lowering.js +32 -417
- package/dist/lowering.js.map +1 -1
- package/dist/lowering_channels.d.ts +11 -0
- package/dist/lowering_channels.js +102 -0
- package/dist/lowering_channels.js.map +1 -0
- package/dist/lowering_entities.d.ts +11 -0
- package/dist/lowering_entities.js +222 -0
- package/dist/lowering_entities.js.map +1 -0
- package/dist/lowering_helpers.d.ts +13 -0
- package/dist/lowering_helpers.js +76 -0
- package/dist/lowering_helpers.js.map +1 -0
- package/dist/module_loader.d.ts +2 -2
- package/dist/module_loader.js +20 -23
- package/dist/module_loader.js.map +1 -1
- package/dist/scaffold.d.ts +2 -2
- package/dist/scaffold.js +316 -319
- package/dist/scaffold.js.map +1 -1
- package/package.json +62 -52
- package/src/algorithm_catalog.ts +345 -345
- package/src/ast.ts +334 -334
- package/src/cli.ts +98 -624
- package/src/commands/check.ts +33 -0
- package/src/commands/compile.ts +160 -0
- package/src/commands/debug.ts +33 -0
- package/src/commands/diff.ts +108 -0
- package/src/commands/fmt.ts +22 -0
- package/src/commands/init.ts +46 -0
- package/src/commands/ir.ts +23 -0
- package/src/commands/lex.ts +17 -0
- package/src/commands/parse.ts +24 -0
- package/src/commands/test.ts +36 -0
- package/src/commands/verify_determinism.ts +66 -0
- package/src/commands/watch.ts +25 -0
- package/src/emit_auth.ts +67 -0
- package/src/emit_batch.ts +140 -140
- package/src/emit_capability.ts +562 -436
- package/src/emit_composition.ts +196 -196
- package/src/emit_database.ts +75 -0
- package/src/emit_deploy.ts +190 -190
- package/src/emit_events.ts +307 -307
- package/src/emit_extras.ts +240 -240
- package/src/emit_full.ts +316 -309
- package/src/emit_index.ts +161 -0
- package/src/emit_maintenance.ts +459 -459
- package/src/emit_package.ts +69 -0
- package/src/emit_router.ts +395 -0
- package/src/emit_runtime.ts +17 -728
- package/src/emit_sourcemap.ts +140 -140
- package/src/emit_tests.ts +205 -205
- package/src/emit_websocket.ts +229 -229
- package/src/emitter.ts +566 -566
- package/src/extension_manager.ts +189 -187
- package/src/formatter.ts +297 -297
- package/src/index.ts +88 -88
- package/src/ir.ts +215 -215
- package/src/lexer.ts +630 -630
- package/src/lowering.ts +124 -556
- package/src/lowering_channels.ts +107 -0
- package/src/lowering_entities.ts +248 -0
- package/src/lowering_helpers.ts +75 -0
- package/src/module_loader.ts +112 -114
- package/src/optimizer.ts +196 -196
- package/src/parse_decls.ts +409 -409
- package/src/parse_decls2.ts +244 -244
- package/src/parse_expr.ts +197 -197
- package/src/parse_types.ts +54 -54
- package/src/parser.ts +1 -1
- package/src/parser_base.ts +57 -57
- package/src/parser_recovery.ts +153 -153
- package/src/scaffold.ts +372 -375
- package/src/solver.ts +330 -330
- package/src/typechecker.ts +591 -591
- package/src/types.ts +122 -122
- package/src/verifier.ts +348 -348
package/src/types.ts
CHANGED
|
@@ -1,122 +1,122 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* BoneScript Type System — Internal type representations.
|
|
3
|
-
* Implements spec/04_TYPE_SYSTEM.md.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
export type CVType =
|
|
7
|
-
| PrimitiveType
|
|
8
|
-
| GenericType
|
|
9
|
-
| RecordType
|
|
10
|
-
| UnionType
|
|
11
|
-
| TupleType
|
|
12
|
-
| BottomType;
|
|
13
|
-
|
|
14
|
-
export interface PrimitiveType {
|
|
15
|
-
tag: "primitive";
|
|
16
|
-
name: "string" | "uint" | "int" | "float" | "bool" | "timestamp" | "uuid" | "bytes" | "json";
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface GenericType {
|
|
20
|
-
tag: "generic";
|
|
21
|
-
name: "list" | "set" | "map" | "optional" | "result";
|
|
22
|
-
args: CVType[];
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export interface RecordType {
|
|
26
|
-
tag: "record";
|
|
27
|
-
name: string; // entity name
|
|
28
|
-
fields: Map<string, CVType>;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export interface UnionType {
|
|
32
|
-
tag: "union";
|
|
33
|
-
members: CVType[];
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export interface TupleType {
|
|
37
|
-
tag: "tuple";
|
|
38
|
-
elements: CVType[];
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export interface BottomType {
|
|
42
|
-
tag: "bottom"; // unifies with any optional<T>
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// ─── Constructors ────────────────────────────────────────────────────────────
|
|
46
|
-
|
|
47
|
-
export function prim(name: PrimitiveType["name"]): PrimitiveType {
|
|
48
|
-
return { tag: "primitive", name };
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export function generic(name: GenericType["name"], ...args: CVType[]): GenericType {
|
|
52
|
-
return { tag: "generic", name, args };
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export function record(name: string, fields: Map<string, CVType>): RecordType {
|
|
56
|
-
return { tag: "record", name, fields };
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export const BOTTOM: BottomType = { tag: "bottom" };
|
|
60
|
-
|
|
61
|
-
// ─── Type Equality ───────────────────────────────────────────────────────────
|
|
62
|
-
|
|
63
|
-
export function typeEquals(a: CVType, b: CVType): boolean {
|
|
64
|
-
if (a.tag !== b.tag) {
|
|
65
|
-
// optional<T> accepts T (implicit wrapping)
|
|
66
|
-
if (a.tag === "generic" && a.name === "optional" && typeEquals(a.args[0], b)) return true;
|
|
67
|
-
if (b.tag === "generic" && b.name === "optional" && typeEquals(b.args[0], a)) return true;
|
|
68
|
-
// bottom unifies with any optional
|
|
69
|
-
if (a.tag === "bottom" && b.tag === "generic" && b.name === "optional") return true;
|
|
70
|
-
if (b.tag === "bottom" && a.tag === "generic" && a.name === "optional") return true;
|
|
71
|
-
return false;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
switch (a.tag) {
|
|
75
|
-
case "primitive":
|
|
76
|
-
return a.name === (b as PrimitiveType).name;
|
|
77
|
-
case "generic": {
|
|
78
|
-
const bg = b as GenericType;
|
|
79
|
-
return a.name === bg.name && a.args.length === bg.args.length &&
|
|
80
|
-
a.args.every((arg, i) => typeEquals(arg, bg.args[i]));
|
|
81
|
-
}
|
|
82
|
-
case "record": {
|
|
83
|
-
const br = b as RecordType;
|
|
84
|
-
return a.name === br.name; // nominal for records (entity names)
|
|
85
|
-
}
|
|
86
|
-
case "union": {
|
|
87
|
-
const bu = b as UnionType;
|
|
88
|
-
return a.members.length === bu.members.length &&
|
|
89
|
-
a.members.every((m, i) => typeEquals(m, bu.members[i]));
|
|
90
|
-
}
|
|
91
|
-
case "tuple": {
|
|
92
|
-
const bt = b as TupleType;
|
|
93
|
-
return a.elements.length === bt.elements.length &&
|
|
94
|
-
a.elements.every((e, i) => typeEquals(e, bt.elements[i]));
|
|
95
|
-
}
|
|
96
|
-
case "bottom":
|
|
97
|
-
return true;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// ─── Type Display ────────────────────────────────────────────────────────────
|
|
102
|
-
|
|
103
|
-
export function typeToString(t: CVType): string {
|
|
104
|
-
switch (t.tag) {
|
|
105
|
-
case "primitive": return t.name;
|
|
106
|
-
case "generic": return `${t.name}<${t.args.map(typeToString).join(", ")}>`;
|
|
107
|
-
case "record": return t.name;
|
|
108
|
-
case "union": return t.members.map(typeToString).join(" | ");
|
|
109
|
-
case "tuple": return `(${t.elements.map(typeToString).join(", ")})`;
|
|
110
|
-
case "bottom": return "bottom";
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// ─── Numeric Type Check ──────────────────────────────────────────────────────
|
|
115
|
-
|
|
116
|
-
export function isNumeric(t: CVType): boolean {
|
|
117
|
-
return t.tag === "primitive" && (t.name === "uint" || t.name === "int" || t.name === "float");
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
export function isComparable(t: CVType): boolean {
|
|
121
|
-
return isNumeric(t) || (t.tag === "primitive" && (t.name === "string" || t.name === "timestamp"));
|
|
122
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* BoneScript Type System — Internal type representations.
|
|
3
|
+
* Implements spec/04_TYPE_SYSTEM.md.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export type CVType =
|
|
7
|
+
| PrimitiveType
|
|
8
|
+
| GenericType
|
|
9
|
+
| RecordType
|
|
10
|
+
| UnionType
|
|
11
|
+
| TupleType
|
|
12
|
+
| BottomType;
|
|
13
|
+
|
|
14
|
+
export interface PrimitiveType {
|
|
15
|
+
tag: "primitive";
|
|
16
|
+
name: "string" | "uint" | "int" | "float" | "bool" | "timestamp" | "uuid" | "bytes" | "json";
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface GenericType {
|
|
20
|
+
tag: "generic";
|
|
21
|
+
name: "list" | "set" | "map" | "optional" | "result";
|
|
22
|
+
args: CVType[];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface RecordType {
|
|
26
|
+
tag: "record";
|
|
27
|
+
name: string; // entity name
|
|
28
|
+
fields: Map<string, CVType>;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface UnionType {
|
|
32
|
+
tag: "union";
|
|
33
|
+
members: CVType[];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface TupleType {
|
|
37
|
+
tag: "tuple";
|
|
38
|
+
elements: CVType[];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface BottomType {
|
|
42
|
+
tag: "bottom"; // unifies with any optional<T>
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ─── Constructors ────────────────────────────────────────────────────────────
|
|
46
|
+
|
|
47
|
+
export function prim(name: PrimitiveType["name"]): PrimitiveType {
|
|
48
|
+
return { tag: "primitive", name };
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function generic(name: GenericType["name"], ...args: CVType[]): GenericType {
|
|
52
|
+
return { tag: "generic", name, args };
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function record(name: string, fields: Map<string, CVType>): RecordType {
|
|
56
|
+
return { tag: "record", name, fields };
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export const BOTTOM: BottomType = { tag: "bottom" };
|
|
60
|
+
|
|
61
|
+
// ─── Type Equality ───────────────────────────────────────────────────────────
|
|
62
|
+
|
|
63
|
+
export function typeEquals(a: CVType, b: CVType): boolean {
|
|
64
|
+
if (a.tag !== b.tag) {
|
|
65
|
+
// optional<T> accepts T (implicit wrapping)
|
|
66
|
+
if (a.tag === "generic" && a.name === "optional" && typeEquals(a.args[0], b)) return true;
|
|
67
|
+
if (b.tag === "generic" && b.name === "optional" && typeEquals(b.args[0], a)) return true;
|
|
68
|
+
// bottom unifies with any optional
|
|
69
|
+
if (a.tag === "bottom" && b.tag === "generic" && b.name === "optional") return true;
|
|
70
|
+
if (b.tag === "bottom" && a.tag === "generic" && a.name === "optional") return true;
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
switch (a.tag) {
|
|
75
|
+
case "primitive":
|
|
76
|
+
return a.name === (b as PrimitiveType).name;
|
|
77
|
+
case "generic": {
|
|
78
|
+
const bg = b as GenericType;
|
|
79
|
+
return a.name === bg.name && a.args.length === bg.args.length &&
|
|
80
|
+
a.args.every((arg, i) => typeEquals(arg, bg.args[i]));
|
|
81
|
+
}
|
|
82
|
+
case "record": {
|
|
83
|
+
const br = b as RecordType;
|
|
84
|
+
return a.name === br.name; // nominal for records (entity names)
|
|
85
|
+
}
|
|
86
|
+
case "union": {
|
|
87
|
+
const bu = b as UnionType;
|
|
88
|
+
return a.members.length === bu.members.length &&
|
|
89
|
+
a.members.every((m, i) => typeEquals(m, bu.members[i]));
|
|
90
|
+
}
|
|
91
|
+
case "tuple": {
|
|
92
|
+
const bt = b as TupleType;
|
|
93
|
+
return a.elements.length === bt.elements.length &&
|
|
94
|
+
a.elements.every((e, i) => typeEquals(e, bt.elements[i]));
|
|
95
|
+
}
|
|
96
|
+
case "bottom":
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// ─── Type Display ────────────────────────────────────────────────────────────
|
|
102
|
+
|
|
103
|
+
export function typeToString(t: CVType): string {
|
|
104
|
+
switch (t.tag) {
|
|
105
|
+
case "primitive": return t.name;
|
|
106
|
+
case "generic": return `${t.name}<${t.args.map(typeToString).join(", ")}>`;
|
|
107
|
+
case "record": return t.name;
|
|
108
|
+
case "union": return t.members.map(typeToString).join(" | ");
|
|
109
|
+
case "tuple": return `(${t.elements.map(typeToString).join(", ")})`;
|
|
110
|
+
case "bottom": return "bottom";
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// ─── Numeric Type Check ──────────────────────────────────────────────────────
|
|
115
|
+
|
|
116
|
+
export function isNumeric(t: CVType): boolean {
|
|
117
|
+
return t.tag === "primitive" && (t.name === "uint" || t.name === "int" || t.name === "float");
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export function isComparable(t: CVType): boolean {
|
|
121
|
+
return isNumeric(t) || (t.tag === "primitive" && (t.name === "string" || t.name === "timestamp"));
|
|
122
|
+
}
|