gofront 1.6.1 → 1.8.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 (132) hide show
  1. package/README.md +45 -49
  2. package/package.json +12 -8
  3. package/src/backend/js/expressions.js +1627 -148
  4. package/src/backend/js/fmt-runtime.js +573 -0
  5. package/src/backend/js/index.js +508 -102
  6. package/src/backend/js/runtime.js +1997 -106
  7. package/src/backend/js/statements.js +931 -87
  8. package/src/backend/js/stdlib/bits.js +87 -14
  9. package/src/backend/js/stdlib/builder.js +41 -6
  10. package/src/backend/js/stdlib/bytes.js +253 -7
  11. package/src/backend/js/stdlib/errors.js +7 -1
  12. package/src/backend/js/stdlib/fmt.js +349 -10
  13. package/src/backend/js/stdlib/index.js +19 -2
  14. package/src/backend/js/stdlib/json.js +1167 -0
  15. package/src/backend/js/stdlib/maps.js +0 -8
  16. package/src/backend/js/stdlib/math.js +17 -1
  17. package/src/backend/js/stdlib/simd.js +34 -0
  18. package/src/backend/js/stdlib/slices.js +36 -6
  19. package/src/backend/js/stdlib/strconv.js +10 -5
  20. package/src/backend/js/stdlib/strings.js +83 -4
  21. package/src/backend/js/stdlib/testing.js +7 -0
  22. package/src/backend/js/stdlib/time.js +79 -55
  23. package/src/backend/js/stdlib/unicode.js +1 -1
  24. package/src/backend/js/stdlib/utf8.js +1 -1
  25. package/src/backend/js/templ.js +38 -76
  26. package/src/backend/js/type-info.js +272 -0
  27. package/src/backend/shared/fmt-types.js +188 -0
  28. package/src/backend/wasm/boundary.js +446 -72
  29. package/src/backend/wasm/emit-builtins.js +320 -13
  30. package/src/backend/wasm/emit-exprs.js +1404 -199
  31. package/src/backend/wasm/emit-maps.js +61 -13
  32. package/src/backend/wasm/emit-stmts.js +1359 -164
  33. package/src/backend/wasm/emit.js +518 -74
  34. package/src/backend/wasm/encode.js +128 -13
  35. package/src/backend/wasm/globals.js +452 -0
  36. package/src/backend/wasm/index.js +194 -2489
  37. package/src/backend/wasm/method-expr.js +381 -0
  38. package/src/backend/wasm/module-emitter.js +2240 -0
  39. package/src/backend/wasm/monomorph.js +62 -4
  40. package/src/backend/wasm/optimize.js +4 -2
  41. package/src/backend/wasm/prescan.js +397 -0
  42. package/src/backend/wasm/stdlib/bytes.js +1804 -127
  43. package/src/backend/wasm/stdlib/core.js +1574 -199
  44. package/src/backend/wasm/stdlib/index.js +3 -5
  45. package/src/backend/wasm/stdlib/io.js +1567 -150
  46. package/src/backend/wasm/stdlib/packages.js +2 -0
  47. package/src/backend/wasm/stdlib/simd.js +499 -0
  48. package/src/backend/wasm/stdlib/time.js +1041 -12
  49. package/src/backend/wasm/types.js +221 -15
  50. package/src/backend/wasm/variadic.js +93 -0
  51. package/src/backend/wasm/wat.js +84 -20
  52. package/src/{cli-core.js → cli/cli-core.js} +236 -10
  53. package/src/{test-runner.js → cli/test-runner.js} +332 -39
  54. package/src/{vendor.js → cli/vendor.js} +89 -15
  55. package/src/compiler.js +107 -269
  56. package/src/dts-parser.js +71 -14
  57. package/src/index.js +15 -169
  58. package/src/{lexer.js → lexer/lexer.js} +102 -55
  59. package/src/{tokens.js → lexer/tokens.js} +1 -0
  60. package/src/link/sourcemap.js +97 -0
  61. package/src/link/stdlib.js +515 -0
  62. package/src/link/wasm.js +294 -0
  63. package/src/lower/bounds.js +394 -0
  64. package/src/lower/boxing.js +1 -6
  65. package/src/lower/captures.js +176 -32
  66. package/src/lower/embedding.js +2 -1
  67. package/src/lower/index.js +26 -18
  68. package/src/lower/json-codecs.js +1398 -0
  69. package/src/lower/ownership.js +22 -1
  70. package/src/lower/range.js +86 -1
  71. package/src/lower/reachability.js +132 -0
  72. package/src/parser/declarations.js +58 -13
  73. package/src/parser/expressions.js +29 -7
  74. package/src/parser/index.js +2 -1
  75. package/src/parser/statements.js +37 -22
  76. package/src/parser/struct-tag.js +144 -0
  77. package/src/{templ-parser.js → parser/templ.js} +138 -15
  78. package/src/parser/types.js +130 -13
  79. package/src/resolver.js +22 -1
  80. package/src/typechecker/assignability.js +215 -11
  81. package/src/typechecker/const-fold.js +356 -0
  82. package/src/typechecker/constants.js +256 -0
  83. package/src/typechecker/expressions.js +960 -99
  84. package/src/typechecker/index.js +491 -72
  85. package/src/typechecker/init-order.js +330 -0
  86. package/src/typechecker/resolve.js +596 -52
  87. package/src/typechecker/statements.js +157 -17
  88. package/src/typechecker/stdlib/core.js +333 -55
  89. package/src/typechecker/stdlib/excluded.js +898 -0
  90. package/src/typechecker/stdlib/extended.js +359 -26
  91. package/src/typechecker/{stdlib.js → stdlib/index.js} +6 -4
  92. package/src/typechecker/stdlib/simd.js +123 -0
  93. package/src/typechecker/termination.js +1 -1
  94. package/src/typechecker/types.js +165 -26
  95. package/stdlib/bytes/iter.go +192 -0
  96. package/stdlib/bytes/search.go +240 -0
  97. package/stdlib/bytes/split.go +218 -0
  98. package/stdlib/cmp/cmp.go +65 -0
  99. package/stdlib/encoding/json/errors.go +31 -0
  100. package/stdlib/encoding/json/indent.go +71 -0
  101. package/stdlib/encoding/json/number.go +12 -0
  102. package/stdlib/encoding/json/stream.go +173 -0
  103. package/stdlib/errors/overlay.go +12 -0
  104. package/stdlib/hash/hash.go +53 -0
  105. package/stdlib/internal/jsonrt/dec.go +738 -0
  106. package/stdlib/internal/jsonrt/enc.go +366 -0
  107. package/stdlib/internal/jsonrt/indent.go +135 -0
  108. package/stdlib/internal/jsonrt/number.go +27 -0
  109. package/stdlib/internal/jsonrt/reader.go +73 -0
  110. package/stdlib/internal/jsonrt/scanner.go +649 -0
  111. package/stdlib/io/io.go +346 -0
  112. package/stdlib/iter/iter.go +18 -0
  113. package/stdlib/maps/iter.go +65 -0
  114. package/stdlib/math/extra.go +270 -0
  115. package/stdlib/slices/extra.go +73 -0
  116. package/stdlib/slices/iter.go +113 -0
  117. package/stdlib/sort/sort.go +561 -0
  118. package/stdlib/strconv/quote.go +341 -0
  119. package/stdlib/strings/extra.go +35 -0
  120. package/stdlib/strings/iter.go +122 -0
  121. package/stdlib/sync/extra.go +105 -0
  122. package/stdlib/unicode/unicode.go +112 -0
  123. package/stdlib/unicode/utf8/bytes.go +239 -0
  124. package/src/backend/wasm/const-fold.js +0 -205
  125. package/src/backend/wasm/emit-stdlib.js +0 -13
  126. /package/src/{asset-manager.js → cli/asset-manager.js} +0 -0
  127. /package/src/{colors.js → cli/colors.js} +0 -0
  128. /package/src/{dev-server.js → cli/dev-server.js} +0 -0
  129. /package/src/{minifier.js → cli/minifier.js} +0 -0
  130. /package/src/{project-config.js → cli/project-config.js} +0 -0
  131. /package/src/{pwa.js → cli/pwa.js} +0 -0
  132. /package/src/{templ-lexer.js → lexer/templ-lexer.js} +0 -0
@@ -4,6 +4,8 @@
4
4
 
5
5
  import {
6
6
  isArrayType,
7
+ isComplex,
8
+ isComplex64,
7
9
  isInterfaceType,
8
10
  isPointerToStruct,
9
11
  isSigned,
@@ -11,6 +13,27 @@ import {
11
13
  toWasmType,
12
14
  } from "./types.js";
13
15
 
16
+ function _complexTypeFor(mod, t) {
17
+ if (!isComplex(t)) return null;
18
+ const is64 = isComplex64(t);
19
+ return mod.getComplexType(is64 ? "complex64" : "complex128");
20
+ }
21
+
22
+ function _resolveStructType(mod, goType) {
23
+ let t = goType;
24
+ while (t && (t.kind === "TypeName" || t.kind === "Ident")) {
25
+ const info = mod.getStructType(t.name);
26
+ if (info) return info;
27
+ const resolved = mod.checker?.types?.get(t.name);
28
+ if (!resolved || resolved === t) break;
29
+ t = resolved;
30
+ }
31
+ if (t?.kind === "named") return mod.getStructType(t.name) ?? null;
32
+ if ((t?.kind === "struct" || t?.kind === "StructType") && t.name)
33
+ return mod.getStructType(t.name) ?? null;
34
+ return null;
35
+ }
36
+
14
37
  export class MapsEmitter {
15
38
  emitMapHelper(fn) {
16
39
  const kind = fn._mapHelperKind;
@@ -49,20 +72,11 @@ export class MapsEmitter {
49
72
  }
50
73
  }
51
74
 
52
- // Struct info for a Go type used as a map key (named struct or alias).
75
+ // Struct info for a Go type used as a map key (named struct, alias, or complex).
53
76
  _structInfoForGoType(goType) {
54
- let t = goType;
55
- while (t && (t.kind === "TypeName" || t.kind === "Ident")) {
56
- const info = this.mod.getStructType(t.name);
57
- if (info) return info;
58
- const resolved = this.mod.checker?.types?.get(t.name);
59
- if (!resolved || resolved === t) break;
60
- t = resolved;
61
- }
62
- if (t?.kind === "named") return this.mod.getStructType(t.name) ?? null;
63
- if ((t?.kind === "struct" || t?.kind === "StructType") && t.name)
64
- return this.mod.getStructType(t.name) ?? null;
65
- return null;
77
+ return (
78
+ _complexTypeFor(this.mod, goType) ?? _resolveStructType(this.mod, goType)
79
+ );
66
80
  }
67
81
 
68
82
  _unsupportedMapKey(_keyGoType) {
@@ -166,6 +180,34 @@ export class MapsEmitter {
166
180
  this.pushInstruction("i32.mul");
167
181
  return;
168
182
  }
183
+ if (wType === "v128") {
184
+ // Lane-wise like a [4]float32 key: h = 17; h = h*31 + hash(lane).
185
+ const isMask = this._isSimdMaskType(keyGoType);
186
+ const laneType = {
187
+ kind: "basic",
188
+ name: isMask ? "int32" : "float32",
189
+ };
190
+ const h = this.allocLocal(null, "i32");
191
+ this.pushInstruction({ op: "i32.const", value: 17 });
192
+ this.pushInstruction({ op: "local.set", index: h });
193
+ for (let lane = 0; lane < 4; lane++) {
194
+ const lt = this.allocLocal(null, isMask ? "i32" : "f32");
195
+ this.pushInstruction({ op: "local.get", index: keyLocal });
196
+ this.pushInstruction({
197
+ op: isMask ? "i32x4.extract_lane" : "f32x4.extract_lane",
198
+ lane,
199
+ });
200
+ this.pushInstruction({ op: "local.set", index: lt });
201
+ this.pushInstruction({ op: "local.get", index: h });
202
+ this.pushInstruction({ op: "i32.const", value: 31 });
203
+ this.pushInstruction("i32.mul");
204
+ this.emitKeyHash(lt, laneType);
205
+ this.pushInstruction("i32.add");
206
+ this.pushInstruction({ op: "local.set", index: h });
207
+ }
208
+ this.pushInstruction({ op: "local.get", index: h });
209
+ return;
210
+ }
169
211
  // Floats: `x + 0.0` folds -0 onto +0 (they are equal keys in Go) and
170
212
  // NaN elements never match (f32.eq/f64.eq returns false in key comparison).
171
213
  if (wType === "f32") {
@@ -336,6 +378,12 @@ export class MapsEmitter {
336
378
  this.pushInstruction("f64.eq");
337
379
  return;
338
380
  }
381
+ if (wType === "v128") {
382
+ this.pushInstruction({ op: "local.get", index: k1Local });
383
+ this.pushInstruction({ op: "local.get", index: k2Local });
384
+ this._emitSimdEq(keyGoType);
385
+ return;
386
+ }
339
387
  const structInfo = this._structInfoForGoType(keyGoType);
340
388
  if (
341
389
  structInfo &&