gofront 1.5.1 → 1.6.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.
Files changed (60) hide show
  1. package/README.md +174 -466
  2. package/package.json +16 -20
  3. package/src/backend/js/expressions.js +50 -19
  4. package/src/backend/js/index.js +100 -55
  5. package/src/backend/js/runtime.js +102 -0
  6. package/src/backend/js/source-map.js +32 -0
  7. package/src/backend/js/statements.js +96 -16
  8. package/src/backend/js/stdlib/errors.js +2 -2
  9. package/src/backend/js/stdlib/fmt.js +26 -8
  10. package/src/backend/js/stdlib/index.js +3 -0
  11. package/src/backend/js/stdlib/maps.js +1 -1
  12. package/src/backend/js/stdlib/path.js +2 -2
  13. package/src/backend/js/stdlib/shared.js +17 -0
  14. package/src/backend/js/stdlib/slices.js +1 -1
  15. package/src/backend/js/stdlib/sort.js +1 -1
  16. package/src/backend/js/stdlib/strconv.js +34 -9
  17. package/src/backend/js/stdlib/strings.js +4 -1
  18. package/src/backend/js/stdlib/testing.js +2 -2
  19. package/src/backend/js/stdlib/time.js +3 -3
  20. package/src/backend/js/templ.js +1 -1
  21. package/src/backend/wasm/boundary.js +486 -33
  22. package/src/backend/wasm/emit-builtins.js +1103 -0
  23. package/src/backend/wasm/emit-exprs.js +1908 -0
  24. package/src/backend/wasm/emit-maps.js +1863 -0
  25. package/src/backend/wasm/emit-shared.js +519 -0
  26. package/src/backend/wasm/emit-stdlib.js +3006 -0
  27. package/src/backend/wasm/emit-stmts.js +2472 -0
  28. package/src/backend/wasm/emit.js +606 -5009
  29. package/src/backend/wasm/encode.js +212 -64
  30. package/src/backend/wasm/glue.js +19 -5
  31. package/src/backend/wasm/index.js +1426 -49
  32. package/src/backend/wasm/monomorph.js +711 -0
  33. package/src/backend/wasm/optimize.js +227 -0
  34. package/src/backend/wasm/types.js +159 -35
  35. package/src/backend/wasm/wat.js +49 -2
  36. package/src/cli-core.js +275 -72
  37. package/src/compiler.js +144 -21
  38. package/src/index.js +86 -115
  39. package/src/lower/boxing.js +3 -4
  40. package/src/lower/captures.js +10 -17
  41. package/src/lower/escape.js +4 -9
  42. package/src/lower/functions.js +277 -5
  43. package/src/lower/globals.js +7 -15
  44. package/src/lower/index.js +5 -2
  45. package/src/lower/ownership.js +5 -10
  46. package/src/lower/range.js +2 -5
  47. package/src/lower/walk.js +25 -0
  48. package/src/resolver.js +2 -1
  49. package/src/test-runner.js +20 -0
  50. package/src/typechecker/assignability.js +42 -1
  51. package/src/typechecker/expressions.js +142 -2
  52. package/src/typechecker/index.js +27 -1
  53. package/src/typechecker/resolve.js +35 -6
  54. package/src/typechecker/statements.js +0 -7
  55. package/src/typechecker/stdlib/core.js +17 -19
  56. package/src/typechecker/stdlib/extended.js +18 -3
  57. package/src/typechecker/stdlib/shared.js +53 -0
  58. package/src/typechecker/stdlib.js +2 -0
  59. package/src/typechecker/types.js +206 -7
  60. package/src/vendor.js +2 -2
@@ -85,9 +85,206 @@ export const BROWSER_GLOBALS = new Set([
85
85
  "sessionStorage",
86
86
  ]);
87
87
 
88
- // Stdlib packages the WASM backend can emit. Extend as src/backend/wasm/emit.js gains support;
89
- // anything not listed is rejected at import with "not yet available in wasm packages".
90
- export const WASM_SUPPORTED_STDLIB = new Set(["math", "math/bits", "testing"]);
88
+ // Stdlib packages the WASM backend can emit. Extend as src/backend/wasm/emit-stdlib.js
89
+ // gains support; anything not listed is rejected at import with "not yet available in
90
+ // wasm packages".
91
+ export const WASM_SUPPORTED_STDLIB = new Set([
92
+ "math",
93
+ "math/bits",
94
+ "errors",
95
+ "fmt",
96
+ "strings",
97
+ "strconv",
98
+ "unicode/utf8",
99
+ "slices",
100
+ "maps",
101
+ "sort",
102
+ "testing",
103
+ "gofront/shared",
104
+ ]);
105
+
106
+ // Per-namespace member subset the WASM backend implements. `null` means every
107
+ // member the checker knows about. Members outside the set are rejected in
108
+ // wasm/both packages with "'strings.Split' is not yet available in wasm packages".
109
+ export const WASM_STDLIB_MEMBERS = new Map([
110
+ [
111
+ "math",
112
+ new Set([
113
+ "Sqrt",
114
+ "Floor",
115
+ "Ceil",
116
+ "Trunc",
117
+ "Abs",
118
+ "Min",
119
+ "Max",
120
+ "Copysign",
121
+ "Dim",
122
+ "Inf",
123
+ "NaN",
124
+ "IsNaN",
125
+ "IsInf",
126
+ "Signbit",
127
+ "Sin",
128
+ "Cos",
129
+ "Tan",
130
+ "Asin",
131
+ "Acos",
132
+ "Atan",
133
+ "Atan2",
134
+ "Pow",
135
+ "Mod",
136
+ "Hypot",
137
+ "Cbrt",
138
+ "Exp",
139
+ "Exp2",
140
+ "Log",
141
+ "Log2",
142
+ "Log10",
143
+ "Round",
144
+ // constants
145
+ "E",
146
+ "Pi",
147
+ "Phi",
148
+ "Sqrt2",
149
+ "SqrtE",
150
+ "SqrtPi",
151
+ "SqrtPhi",
152
+ "Ln2",
153
+ "Log2E",
154
+ "Ln10",
155
+ "Log10E",
156
+ "MaxFloat32",
157
+ "SmallestNonzeroFloat32",
158
+ "MaxFloat64",
159
+ "SmallestNonzeroFloat64",
160
+ "MaxInt",
161
+ "MinInt",
162
+ "MaxInt8",
163
+ "MinInt8",
164
+ "MaxInt16",
165
+ "MinInt16",
166
+ "MaxInt32",
167
+ "MinInt32",
168
+ "MaxInt64",
169
+ "MinInt64",
170
+ "MaxUint8",
171
+ "MaxUint16",
172
+ "MaxUint32",
173
+ "MaxUint",
174
+ "MaxUint64",
175
+ ]),
176
+ ],
177
+ [
178
+ "bits",
179
+ new Set([
180
+ "LeadingZeros32",
181
+ "LeadingZeros64",
182
+ "TrailingZeros32",
183
+ "TrailingZeros64",
184
+ "OnesCount32",
185
+ "OnesCount64",
186
+ "RotateLeft32",
187
+ "RotateLeft64",
188
+ ]),
189
+ ],
190
+ ["errors", new Set(["New", "Is", "Unwrap"])],
191
+ [
192
+ "utf8",
193
+ new Set([
194
+ "RuneCountInString",
195
+ "RuneLen",
196
+ "ValidString",
197
+ "ValidRune",
198
+ "DecodeRuneInString",
199
+ "DecodeLastRuneInString",
200
+ "FullRuneInString",
201
+ "RuneError",
202
+ "MaxRune",
203
+ "UTFMax",
204
+ ]),
205
+ ],
206
+ [
207
+ "sort",
208
+ new Set([
209
+ "Ints",
210
+ "Float64s",
211
+ "Strings",
212
+ "Slice",
213
+ "SliceStable",
214
+ "SliceIsSorted",
215
+ "Search",
216
+ "IntsAreSorted",
217
+ "Float64sAreSorted",
218
+ "StringsAreSorted",
219
+ ]),
220
+ ],
221
+ ["fmt", new Set(["Sprintf", "Errorf", "Printf", "Println", "Print"])],
222
+ [
223
+ "strings",
224
+ new Set([
225
+ "Contains",
226
+ "ContainsAny",
227
+ "ContainsRune",
228
+ "HasPrefix",
229
+ "HasSuffix",
230
+ "Index",
231
+ "IndexAny",
232
+ "IndexByte",
233
+ "IndexRune",
234
+ "LastIndex",
235
+ "LastIndexByte",
236
+ "Count",
237
+ "Repeat",
238
+ "Replace",
239
+ "ReplaceAll",
240
+ "ToUpper",
241
+ "ToLower",
242
+ "Title",
243
+ "ToTitle",
244
+ "TrimSpace",
245
+ "Trim",
246
+ "TrimLeft",
247
+ "TrimRight",
248
+ "TrimPrefix",
249
+ "TrimSuffix",
250
+ "EqualFold",
251
+ "Split",
252
+ "Fields",
253
+ "Join",
254
+ ]),
255
+ ],
256
+ [
257
+ "strconv",
258
+ new Set([
259
+ "Itoa",
260
+ "Atoi",
261
+ "FormatInt",
262
+ "FormatFloat",
263
+ "FormatBool",
264
+ "ParseInt",
265
+ "ParseFloat",
266
+ "ParseBool",
267
+ "Quote",
268
+ ]),
269
+ ],
270
+ [
271
+ "slices",
272
+ new Set(["Sort", "Reverse", "Contains", "Index", "Equal", "Clone"]),
273
+ ],
274
+ [
275
+ "maps",
276
+ new Set([
277
+ "Keys",
278
+ "Values",
279
+ "Clone",
280
+ "Copy",
281
+ "Equal",
282
+ "EqualFunc",
283
+ "Delete",
284
+ "DeleteFunc",
285
+ ]),
286
+ ],
287
+ ]);
91
288
 
92
289
  export const VALID_TARGETS = new Set(["js", "wasm", "both"]);
93
290
 
@@ -101,14 +298,14 @@ export const INT = { kind: "basic", name: "int" };
101
298
  export const INT8 = { kind: "basic", name: "int8" };
102
299
  export const INT16 = { kind: "basic", name: "int16" };
103
300
  export const INT32 = { kind: "basic", name: "int32" };
104
- export const INT64 = { kind: "basic", name: "int64" };
301
+ const INT64 = { kind: "basic", name: "int64" };
105
302
  export const UINT = { kind: "basic", name: "uint" };
106
303
  export const UINT8 = { kind: "basic", name: "uint8" };
107
304
  export const BYTE = UINT8;
108
305
  export const UINT16 = { kind: "basic", name: "uint16" };
109
306
  export const UINT32 = { kind: "basic", name: "uint32" };
110
307
  export const UINT64 = { kind: "basic", name: "uint64" };
111
- export const UINTPTR = { kind: "basic", name: "uintptr" };
308
+ const UINTPTR = { kind: "basic", name: "uintptr" };
112
309
  export const RUNE = INT32;
113
310
  export const FLOAT32 = { kind: "basic", name: "float32" };
114
311
  export const FLOAT64 = { kind: "basic", name: "float64" };
@@ -135,7 +332,7 @@ export const UNTYPED_BOOL = { kind: "untyped", base: "bool" };
135
332
 
136
333
  // ── Complex types ────────────────────────────────────────────
137
334
  export const COMPLEX128 = { kind: "basic", name: "complex128" };
138
- export const COMPLEX64 = { kind: "basic", name: "complex64" };
335
+ const COMPLEX64 = { kind: "basic", name: "complex64" };
139
336
  export const UNTYPED_COMPLEX = { kind: "untyped", base: "complex128" };
140
337
 
141
338
  export const BASIC_TYPES = {
@@ -204,7 +401,7 @@ export const isBool = makeBasicPredicate("bool");
204
401
 
205
402
  // ── TypedArray mappings ──────────────────────────────────────
206
403
  // []float64 deliberately stays a plain Array for JSON / JS-library interop.
207
- export const TYPED_ARRAY_CONSTRUCTORS = {
404
+ const TYPED_ARRAY_CONSTRUCTORS = {
208
405
  float32: "Float32Array",
209
406
  uint8: "Uint8Array",
210
407
  byte: "Uint8Array",
@@ -294,6 +491,8 @@ export function typeStr(t) {
294
491
  return `untyped ${t.base}`;
295
492
  case "slice":
296
493
  return `[]${typeStr(t.elem)}`;
494
+ case "shared":
495
+ return `shared.${t.shared}`;
297
496
  case "array":
298
497
  return `[${t.size ?? "..."}]${typeStr(t.elem)}`;
299
498
  case "map":
package/src/vendor.js CHANGED
@@ -59,7 +59,7 @@ ${exports.join(",\n")}
59
59
  `;
60
60
  }
61
61
 
62
- export function findBundler(projectDir) {
62
+ function findBundler(projectDir) {
63
63
  const root = resolve(projectDir);
64
64
  const pkgPath = join(root, "package.json");
65
65
  let req;
@@ -136,7 +136,7 @@ export function loadVendorConfig(projectDir) {
136
136
  return { dest, packages, minify, globals };
137
137
  }
138
138
 
139
- export function resolveDestinationPaths(projectRoot, dest) {
139
+ function resolveDestinationPaths(projectRoot, dest) {
140
140
  const destList = Array.isArray(dest) ? dest : [dest];
141
141
  if (destList.length === 0) {
142
142
  throw new Error(