gofront 1.7.0 → 1.9.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 (194) hide show
  1. package/README.md +14 -14
  2. package/package.json +10 -38
  3. package/src/backend/js/expressions.js +2060 -389
  4. package/src/backend/js/index.js +586 -174
  5. package/src/backend/js/natives.js +383 -0
  6. package/src/backend/js/runtime.js +936 -1644
  7. package/src/backend/js/statements.js +1349 -132
  8. package/src/backend/js/stdlib/index.js +51 -94
  9. package/src/backend/js/templ.js +67 -118
  10. package/src/backend/js/type-info.js +436 -0
  11. package/src/backend/shared/fixed-float.js +20 -0
  12. package/src/backend/shared/fmt-types.js +80 -0
  13. package/src/backend/shared/host-unicode.js +36 -0
  14. package/src/backend/wasm/boundary.js +753 -872
  15. package/src/backend/wasm/emit-builtins.js +914 -237
  16. package/src/backend/wasm/emit-exprs.js +1456 -195
  17. package/src/backend/wasm/emit-maps.js +78 -380
  18. package/src/backend/wasm/emit-stmts.js +1659 -214
  19. package/src/backend/wasm/emit.js +614 -88
  20. package/src/backend/wasm/encode.js +43 -13
  21. package/src/backend/wasm/globals.js +491 -0
  22. package/src/backend/wasm/glue.js +2 -4
  23. package/src/backend/wasm/index.js +406 -3195
  24. package/src/backend/wasm/method-expr.js +392 -0
  25. package/src/backend/wasm/module-emitter.js +1615 -0
  26. package/src/backend/wasm/monomorph.js +164 -9
  27. package/src/backend/wasm/natives.js +596 -0
  28. package/src/backend/wasm/prescan.js +249 -0
  29. package/src/backend/wasm/prune-funcs.js +89 -0
  30. package/src/backend/wasm/stdlib/index.js +2 -37
  31. package/src/backend/wasm/stdlib/simd.js +293 -28
  32. package/src/backend/wasm/types.js +260 -27
  33. package/src/backend/wasm/variadic.js +93 -0
  34. package/src/backend/wasm/wat.js +47 -20
  35. package/src/{cli-core.js → cli/cli-core.js} +241 -11
  36. package/src/{test-runner.js → cli/test-runner.js} +188 -122
  37. package/src/{vendor.js → cli/vendor.js} +3 -4
  38. package/src/compiler.js +202 -386
  39. package/src/index.js +15 -169
  40. package/src/{lexer.js → lexer/lexer.js} +203 -62
  41. package/src/{templ-lexer.js → lexer/templ-lexer.js} +61 -18
  42. package/src/{tokens.js → lexer/tokens.js} +2 -0
  43. package/src/link/sourcemap.js +97 -0
  44. package/src/link/stdlib.js +737 -0
  45. package/src/link/type-names.js +148 -0
  46. package/src/link/wasm.js +318 -0
  47. package/src/lower/bounds.js +547 -0
  48. package/src/lower/boxing.js +1 -1
  49. package/src/lower/captures.js +267 -64
  50. package/src/lower/embedding.js +32 -3
  51. package/src/lower/errors-as.js +196 -0
  52. package/src/lower/fmt-formatters.js +905 -0
  53. package/src/lower/functions.js +2 -0
  54. package/src/lower/gen-types.js +274 -0
  55. package/src/lower/index.js +33 -19
  56. package/src/lower/json-codecs.js +1379 -0
  57. package/src/lower/ownership.js +47 -8
  58. package/src/lower/range.js +86 -1
  59. package/src/lower/reachability.js +150 -0
  60. package/src/lower/walk.js +12 -0
  61. package/src/parser/declarations.js +83 -15
  62. package/src/parser/expressions.js +110 -18
  63. package/src/parser/index.js +2 -1
  64. package/src/parser/statements.js +38 -22
  65. package/src/{templ-parser.js → parser/templ.js} +179 -17
  66. package/src/parser/types.js +70 -9
  67. package/src/resolver.js +21 -1
  68. package/src/typechecker/assignability.js +291 -19
  69. package/src/typechecker/const-fold.js +399 -0
  70. package/src/typechecker/constants.js +282 -0
  71. package/src/typechecker/expressions.js +1220 -183
  72. package/src/typechecker/index.js +659 -92
  73. package/src/typechecker/init-order.js +426 -0
  74. package/src/typechecker/operand-text.js +40 -0
  75. package/src/typechecker/resolve.js +613 -62
  76. package/src/typechecker/statements.js +212 -20
  77. package/src/typechecker/stdlib/excluded.js +902 -0
  78. package/src/typechecker/stdlib/index.js +38 -0
  79. package/src/typechecker/stdlib/simd.js +65 -15
  80. package/src/typechecker/termination.js +11 -2
  81. package/src/typechecker/types.js +268 -514
  82. package/stdlib/bytes/buffer.go +479 -0
  83. package/stdlib/bytes/bytes.go +1010 -0
  84. package/stdlib/bytes/reader.go +161 -0
  85. package/stdlib/cmp/cmp.go +65 -0
  86. package/stdlib/context/context.go +115 -0
  87. package/stdlib/crypto/rand/rand.go +34 -0
  88. package/stdlib/crypto/sha256/sha256.go +249 -0
  89. package/stdlib/encoding/base64/base64.go +331 -0
  90. package/stdlib/encoding/binary/binary.go +332 -0
  91. package/stdlib/encoding/hex/hex.go +140 -0
  92. package/stdlib/encoding/json/errors.go +31 -0
  93. package/stdlib/encoding/json/indent.go +71 -0
  94. package/stdlib/encoding/json/json.go +62 -0
  95. package/stdlib/encoding/json/number.go +12 -0
  96. package/stdlib/encoding/json/stream.go +173 -0
  97. package/stdlib/errors/errors.go +174 -0
  98. package/stdlib/fmt/errors.go +110 -0
  99. package/stdlib/fmt/format.go +732 -0
  100. package/stdlib/fmt/print.go +1232 -0
  101. package/stdlib/gom/gom.go +293 -0
  102. package/stdlib/hash/hash.go +53 -0
  103. package/stdlib/html/html.go +251 -0
  104. package/stdlib/internal/fmtrt/fmtrt.go +163 -0
  105. package/stdlib/internal/jsonrt/dec.go +871 -0
  106. package/stdlib/internal/jsonrt/enc.go +516 -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 +658 -0
  111. package/stdlib/io/io.go +502 -0
  112. package/stdlib/iter/iter.go +18 -0
  113. package/stdlib/maps/maps.go +131 -0
  114. package/stdlib/math/bits/bits.go +507 -0
  115. package/stdlib/math/extra.go +272 -0
  116. package/stdlib/math/math.go +439 -0
  117. package/stdlib/math/rand/rand.go +297 -0
  118. package/stdlib/os/os.go +93 -0
  119. package/stdlib/path/filepath/filepath.go +47 -0
  120. package/stdlib/path/path.go +394 -0
  121. package/stdlib/regexp/regexp.go +231 -0
  122. package/stdlib/slices/slices.go +526 -0
  123. package/stdlib/slices/sort.go +209 -0
  124. package/stdlib/slices/zsort_cmp.go +480 -0
  125. package/stdlib/slices/zsort_ordered.go +482 -0
  126. package/stdlib/sort/sort.go +500 -0
  127. package/stdlib/sort/zsort_func.go +480 -0
  128. package/stdlib/sort/zsort_iface.go +480 -0
  129. package/stdlib/strconv/float.go +1699 -0
  130. package/stdlib/strconv/isprint.go +752 -0
  131. package/stdlib/strconv/quote.go +526 -0
  132. package/stdlib/strconv/strconv.go +616 -0
  133. package/stdlib/strings/builder.go +95 -0
  134. package/stdlib/strings/reader.go +163 -0
  135. package/stdlib/strings/replacer.go +102 -0
  136. package/stdlib/strings/strings.go +807 -0
  137. package/stdlib/sync/sync.go +268 -0
  138. package/stdlib/testing/async_js.go +61 -0
  139. package/stdlib/testing/benchmark.go +297 -0
  140. package/stdlib/testing/testing.go +523 -0
  141. package/stdlib/time/duration.go +233 -0
  142. package/stdlib/time/format.go +745 -0
  143. package/stdlib/time/parse.go +790 -0
  144. package/stdlib/time/sleep_js.go +63 -0
  145. package/stdlib/time/time.go +834 -0
  146. package/stdlib/unicode/unicode.go +250 -0
  147. package/stdlib/unicode/utf8/utf8.go +464 -0
  148. package/src/backend/js/stdlib/base64.js +0 -12
  149. package/src/backend/js/stdlib/binary.js +0 -102
  150. package/src/backend/js/stdlib/bits.js +0 -46
  151. package/src/backend/js/stdlib/builder.js +0 -63
  152. package/src/backend/js/stdlib/bytes.js +0 -122
  153. package/src/backend/js/stdlib/errors.js +0 -44
  154. package/src/backend/js/stdlib/fmt.js +0 -178
  155. package/src/backend/js/stdlib/gom.js +0 -155
  156. package/src/backend/js/stdlib/hex.js +0 -17
  157. package/src/backend/js/stdlib/html.js +0 -20
  158. package/src/backend/js/stdlib/io.js +0 -137
  159. package/src/backend/js/stdlib/json.js +0 -972
  160. package/src/backend/js/stdlib/maps.js +0 -45
  161. package/src/backend/js/stdlib/math.js +0 -69
  162. package/src/backend/js/stdlib/os.js +0 -13
  163. package/src/backend/js/stdlib/path.js +0 -48
  164. package/src/backend/js/stdlib/rand.js +0 -32
  165. package/src/backend/js/stdlib/regexp.js +0 -54
  166. package/src/backend/js/stdlib/sha256.js +0 -12
  167. package/src/backend/js/stdlib/shared.js +0 -17
  168. package/src/backend/js/stdlib/simd.js +0 -24
  169. package/src/backend/js/stdlib/slices.js +0 -77
  170. package/src/backend/js/stdlib/sort.js +0 -30
  171. package/src/backend/js/stdlib/strconv.js +0 -74
  172. package/src/backend/js/stdlib/strings.js +0 -222
  173. package/src/backend/js/stdlib/sync.js +0 -13
  174. package/src/backend/js/stdlib/testing.js +0 -34
  175. package/src/backend/js/stdlib/time.js +0 -128
  176. package/src/backend/js/stdlib/unicode.js +0 -25
  177. package/src/backend/js/stdlib/utf8.js +0 -26
  178. package/src/backend/wasm/const-fold.js +0 -205
  179. package/src/backend/wasm/emit-stdlib.js +0 -13
  180. package/src/backend/wasm/stdlib/bytes.js +0 -5039
  181. package/src/backend/wasm/stdlib/core.js +0 -8903
  182. package/src/backend/wasm/stdlib/io.js +0 -2161
  183. package/src/backend/wasm/stdlib/packages.js +0 -2400
  184. package/src/backend/wasm/stdlib/pure.js +0 -720
  185. package/src/backend/wasm/stdlib/time.js +0 -1200
  186. package/src/typechecker/stdlib/core.js +0 -801
  187. package/src/typechecker/stdlib/extended.js +0 -914
  188. package/src/typechecker/stdlib.js +0 -22
  189. /package/src/{asset-manager.js → cli/asset-manager.js} +0 -0
  190. /package/src/{colors.js → cli/colors.js} +0 -0
  191. /package/src/{dev-server.js → cli/dev-server.js} +0 -0
  192. /package/src/{minifier.js → cli/minifier.js} +0 -0
  193. /package/src/{project-config.js → cli/project-config.js} +0 -0
  194. /package/src/{pwa.js → cli/pwa.js} +0 -0
@@ -1,914 +0,0 @@
1
- // Extended standard library type definitions — gom, maps, regexp, rand, utf8,
2
- // path, strings.Builder / bytes.Buffer types, and built-in functions.
3
-
4
- import {
5
- ANY,
6
- BOOL,
7
- ERROR,
8
- FLOAT32,
9
- FLOAT64,
10
- INT,
11
- INT32,
12
- INT64,
13
- STRING,
14
- UINT8,
15
- UINT16,
16
- UINT32,
17
- UINT64,
18
- VOID,
19
- } from "../types.js";
20
-
21
- export function setupExtendedGlobals(globals, types) {
22
- const GOM_NODE_T = {
23
- kind: "interface",
24
- methods: new Map([
25
- ["Mount", { kind: "func", params: [ANY], returns: [VOID] }],
26
- ]),
27
- };
28
- const GOM_NODE_FUNC_T = {
29
- kind: "named",
30
- name: "gom.NodeFunc",
31
- underlying: { kind: "func", params: [ANY], returns: [VOID] },
32
- };
33
- const GOM_GROUP_T = {
34
- kind: "named",
35
- name: "gom.Group",
36
- underlying: { kind: "slice", elem: GOM_NODE_T },
37
- };
38
- const gomEl = {
39
- kind: "func",
40
- params: [GOM_NODE_T],
41
- returns: [GOM_NODE_T],
42
- variadic: true,
43
- };
44
- const gomAttr1 = { kind: "func", params: [STRING], returns: [GOM_NODE_T] };
45
- const gomBoolAttr = { kind: "func", params: [], returns: [GOM_NODE_T] };
46
- const gomMembers = {
47
- Node: GOM_NODE_T,
48
- NodeFunc: GOM_NODE_FUNC_T,
49
- Group: GOM_GROUP_T,
50
- El: {
51
- kind: "func",
52
- params: [STRING, GOM_NODE_T],
53
- returns: [GOM_NODE_T],
54
- variadic: true,
55
- },
56
- Text: { kind: "func", params: [STRING], returns: [GOM_NODE_T] },
57
- Attr: { kind: "func", params: [STRING, STRING], returns: [GOM_NODE_T] },
58
- DataAttr: { kind: "func", params: [STRING, STRING], returns: [GOM_NODE_T] },
59
- If: { kind: "func", params: [BOOL, GOM_NODE_T], returns: [GOM_NODE_T] },
60
- Map: { kind: "func", params: [ANY, ANY], returns: [GOM_NODE_T] },
61
- Mount: {
62
- kind: "func",
63
- params: [STRING, GOM_NODE_T, ANY],
64
- variadic: true,
65
- returns: [VOID],
66
- },
67
- MountTo: {
68
- kind: "func",
69
- params: [STRING, GOM_NODE_T, ANY],
70
- variadic: true,
71
- returns: [VOID],
72
- },
73
- };
74
- for (const name of [
75
- "Div",
76
- "Section",
77
- "Article",
78
- "Aside",
79
- "Header",
80
- "Footer",
81
- "Main",
82
- "Nav",
83
- "Figure",
84
- "H1",
85
- "H2",
86
- "H3",
87
- "H4",
88
- "H5",
89
- "H6",
90
- "Span",
91
- "A",
92
- "Strong",
93
- "Em",
94
- "Code",
95
- "Pre",
96
- "Small",
97
- "Mark",
98
- "P",
99
- "Br",
100
- "Hr",
101
- "Ul",
102
- "Ol",
103
- "Li",
104
- "Dl",
105
- "Dt",
106
- "Dd",
107
- "Form",
108
- "Input",
109
- "Button",
110
- "Textarea",
111
- "Select",
112
- "Option",
113
- "Label",
114
- "Fieldset",
115
- "Legend",
116
- "Img",
117
- "Video",
118
- "Audio",
119
- "Canvas",
120
- "Table",
121
- "Thead",
122
- "Tbody",
123
- "Tfoot",
124
- "Tr",
125
- "Th",
126
- "Td",
127
- ])
128
- gomMembers[name] = gomEl;
129
- for (const name of [
130
- "Class",
131
- "Type",
132
- "Href",
133
- "Src",
134
- "Placeholder",
135
- "Style",
136
- "For",
137
- "Name",
138
- "Value",
139
- "Target",
140
- "Rel",
141
- "Alt",
142
- "Title",
143
- "Lang",
144
- "Action",
145
- "Method",
146
- "AutoComplete",
147
- "Draggable",
148
- "Role",
149
- "AriaLabel",
150
- "StyleAttr",
151
- ])
152
- gomMembers[name] = gomAttr1;
153
- for (const name of ["Disabled", "Checked", "Selected", "Readonly"])
154
- gomMembers[name] = gomBoolAttr;
155
- globals.define("gom", {
156
- kind: "namespace",
157
- name: "gom",
158
- members: gomMembers,
159
- });
160
- types.set("gom.Node", GOM_NODE_T);
161
- types.set("gom.NodeFunc", GOM_NODE_FUNC_T);
162
- types.set("gom.Group", GOM_GROUP_T);
163
-
164
- globals.define("maps", {
165
- kind: "namespace",
166
- name: "maps",
167
- members: {
168
- Keys: {
169
- kind: "func",
170
- params: [ANY],
171
- returns: [ANY],
172
- _derivedReturn: "keysOfArg0",
173
- },
174
- Values: {
175
- kind: "func",
176
- params: [ANY],
177
- returns: [ANY],
178
- _derivedReturn: "valuesOfArg0",
179
- },
180
- Clone: {
181
- kind: "func",
182
- params: [ANY],
183
- returns: [ANY],
184
- _derivedReturn: "arg0",
185
- },
186
- Copy: { kind: "func", params: [ANY, ANY], returns: [VOID] },
187
- Equal: { kind: "func", params: [ANY, ANY], returns: [BOOL] },
188
- EqualFunc: { kind: "func", params: [ANY, ANY, ANY], returns: [BOOL] },
189
- Delete: { kind: "func", params: [ANY, ANY], returns: [VOID] },
190
- DeleteFunc: { kind: "func", params: [ANY, ANY], returns: [VOID] },
191
- },
192
- });
193
-
194
- const REGEXP_T = {
195
- kind: "named",
196
- name: "regexp.Regexp",
197
- underlying: { kind: "struct", fields: new Map(), methods: new Map() },
198
- };
199
- const REGEXP_PTR = { kind: "pointer", base: REGEXP_T };
200
- const STR_SLICE = { kind: "slice", elem: STRING };
201
- const INT_SLICE = { kind: "slice", elem: INT };
202
- REGEXP_T.underlying.methods = new Map([
203
- ["MatchString", { kind: "func", params: [STRING], returns: [BOOL] }],
204
- ["FindString", { kind: "func", params: [STRING], returns: [STRING] }],
205
- [
206
- "FindStringIndex",
207
- { kind: "func", params: [STRING], returns: [INT_SLICE] },
208
- ],
209
- [
210
- "FindAllString",
211
- { kind: "func", params: [STRING, INT], returns: [STR_SLICE] },
212
- ],
213
- [
214
- "FindStringSubmatch",
215
- { kind: "func", params: [STRING], returns: [STR_SLICE] },
216
- ],
217
- [
218
- "FindAllStringSubmatch",
219
- {
220
- kind: "func",
221
- params: [STRING, INT],
222
- returns: [{ kind: "slice", elem: STR_SLICE }],
223
- },
224
- ],
225
- [
226
- "ReplaceAllString",
227
- { kind: "func", params: [STRING, STRING], returns: [STRING] },
228
- ],
229
- [
230
- "ReplaceAllLiteralString",
231
- { kind: "func", params: [STRING, STRING], returns: [STRING] },
232
- ],
233
- ["Split", { kind: "func", params: [STRING, INT], returns: [STR_SLICE] }],
234
- ["String", { kind: "func", params: [], returns: [STRING] }],
235
- ]);
236
- types.set("regexp.Regexp", REGEXP_T);
237
- globals.define("regexp", {
238
- kind: "namespace",
239
- name: "regexp",
240
- members: {
241
- MustCompile: { kind: "func", params: [STRING], returns: [REGEXP_PTR] },
242
- Compile: { kind: "func", params: [STRING], returns: [REGEXP_PTR, ERROR] },
243
- MatchString: {
244
- kind: "func",
245
- params: [STRING, STRING],
246
- returns: [BOOL, ERROR],
247
- },
248
- QuoteMeta: { kind: "func", params: [STRING], returns: [STRING] },
249
- },
250
- });
251
-
252
- const BYTE_SLICE_T = { kind: "slice", elem: UINT8 };
253
- const _builderBase = [
254
- ["WriteString", { kind: "func", params: [STRING], returns: [INT, ERROR] }],
255
- ["WriteByte", { kind: "func", params: [INT], returns: [ERROR] }],
256
- ["Write", { kind: "func", params: [BYTE_SLICE_T], returns: [INT, ERROR] }],
257
- ["String", { kind: "func", params: [], returns: [STRING] }],
258
- ["Len", { kind: "func", params: [], returns: [INT] }],
259
- ["Cap", { kind: "func", params: [], returns: [INT] }],
260
- ["Reset", { kind: "func", params: [], returns: [VOID] }],
261
- ["Grow", { kind: "func", params: [INT], returns: [VOID] }],
262
- ];
263
- const STR_SLICE_T = { kind: "slice", elem: STRING };
264
- const _makeBuilderType = (name, extra = []) => ({
265
- kind: "named",
266
- name,
267
- underlying: {
268
- kind: "struct",
269
- fields: new Map(
270
- name === "strings.Builder"
271
- ? [
272
- ["_buf", STR_SLICE_T],
273
- ["_len", INT],
274
- ["_self", ANY],
275
- ]
276
- : name === "bytes.Buffer"
277
- ? [["_buf", BYTE_SLICE_T]]
278
- : [],
279
- ),
280
- methods: new Map([..._builderBase, ...extra]),
281
- },
282
- });
283
- types.set(
284
- "strings.Builder",
285
- _makeBuilderType("strings.Builder", [
286
- ["WriteRune", { kind: "func", params: [INT], returns: [INT, ERROR] }],
287
- ]),
288
- );
289
- types.set(
290
- "bytes.Buffer",
291
- _makeBuilderType("bytes.Buffer", [
292
- ["WriteRune", { kind: "func", params: [INT], returns: [INT, ERROR] }],
293
- ["Bytes", { kind: "func", params: [], returns: [BYTE_SLICE_T] }],
294
- ["Read", { kind: "func", params: [BYTE_SLICE_T], returns: [INT, ERROR] }],
295
- ]),
296
- );
297
- types.set("strings.Replacer", {
298
- kind: "named",
299
- name: "strings.Replacer",
300
- underlying: {
301
- kind: "struct",
302
- fields: new Map([["_pairs", STR_SLICE_T]]),
303
- methods: new Map([
304
- ["Replace", { kind: "func", params: [STRING], returns: [STRING] }],
305
- ]),
306
- },
307
- });
308
- const _makeReaderType = (name, srcType, resetArgType = srcType) => ({
309
- kind: "named",
310
- name,
311
- underlying: {
312
- kind: "struct",
313
- fields: new Map([
314
- ["_src", srcType],
315
- ["_pos", INT],
316
- ]),
317
- methods: new Map([
318
- [
319
- "Read",
320
- { kind: "func", params: [BYTE_SLICE_T], returns: [INT, ERROR] },
321
- ],
322
- ["Len", { kind: "func", params: [], returns: [INT] }],
323
- ["Reset", { kind: "func", params: [resetArgType], returns: [VOID] }],
324
- ]),
325
- },
326
- });
327
- types.set(
328
- "strings.Reader",
329
- _makeReaderType("strings.Reader", BYTE_SLICE_T, STRING),
330
- );
331
- types.set("bytes.Reader", _makeReaderType("bytes.Reader", BYTE_SLICE_T));
332
- types.set("io.discard", {
333
- kind: "named",
334
- name: "io.discard",
335
- underlying: {
336
- kind: "struct",
337
- fields: new Map(),
338
- methods: new Map([
339
- [
340
- "Write",
341
- { kind: "func", params: [BYTE_SLICE_T], returns: [INT, ERROR] },
342
- ],
343
- [
344
- "WriteString",
345
- { kind: "func", params: [STRING], returns: [INT, ERROR] },
346
- ],
347
- ]),
348
- },
349
- });
350
- const ioPkg = globals.lookup("io");
351
- const IO_READER = ioPkg?.members?.Reader ?? {
352
- kind: "interface",
353
- name: "io.Reader",
354
- };
355
- types.set("io.LimitedReader", {
356
- kind: "named",
357
- name: "io.LimitedReader",
358
- underlying: {
359
- kind: "struct",
360
- fields: new Map([
361
- ["R", IO_READER],
362
- ["N", INT64],
363
- ]),
364
- methods: new Map([
365
- [
366
- "Read",
367
- { kind: "func", params: [BYTE_SLICE_T], returns: [INT, ERROR] },
368
- ],
369
- ]),
370
- },
371
- });
372
- if (ioPkg?.members) {
373
- ioPkg.members.LimitedReader = types.get("io.LimitedReader");
374
- }
375
- const stringsPkg = globals.lookup("strings");
376
- if (stringsPkg?.members) {
377
- stringsPkg.members.NewReader = {
378
- kind: "func",
379
- params: [STRING],
380
- returns: [{ kind: "pointer", base: types.get("strings.Reader") }],
381
- };
382
- stringsPkg.members.Reader = types.get("strings.Reader");
383
- }
384
- const bytesPkg = globals.lookup("bytes");
385
- if (bytesPkg?.members) {
386
- bytesPkg.members.NewReader = {
387
- kind: "func",
388
- params: [BYTE_SLICE_T],
389
- returns: [{ kind: "pointer", base: types.get("bytes.Reader") }],
390
- };
391
- bytesPkg.members.Reader = types.get("bytes.Reader");
392
- }
393
-
394
- globals.define("rand", {
395
- kind: "namespace",
396
- name: "rand",
397
- members: {
398
- Intn: { kind: "func", params: [INT], returns: [INT] },
399
- Float64: { kind: "func", params: [], returns: [FLOAT64] },
400
- Float32: { kind: "func", params: [], returns: [FLOAT32] },
401
- Int: { kind: "func", params: [], returns: [INT] },
402
- Int63: { kind: "func", params: [], returns: [INT] },
403
- Int63n: { kind: "func", params: [INT], returns: [INT] },
404
- Int31: { kind: "func", params: [], returns: [INT] },
405
- Int31n: { kind: "func", params: [INT], returns: [INT] },
406
- Seed: { kind: "func", params: [INT], returns: [VOID] },
407
- Shuffle: { kind: "func", params: [INT, ANY], returns: [VOID] },
408
- Perm: {
409
- kind: "func",
410
- params: [INT],
411
- returns: [{ kind: "slice", elem: INT }],
412
- },
413
- Read: {
414
- kind: "func",
415
- params: [{ kind: "slice", elem: UINT8 }],
416
- returns: [INT, ERROR],
417
- },
418
- Reader: {
419
- kind: "interface",
420
- name: "io.Reader",
421
- methods: new Map([
422
- [
423
- "Read",
424
- {
425
- kind: "func",
426
- params: [{ kind: "slice", elem: UINT8 }],
427
- returns: [INT, ERROR],
428
- },
429
- ],
430
- ]),
431
- },
432
- },
433
- });
434
-
435
- globals.define("utf8", {
436
- kind: "namespace",
437
- name: "utf8",
438
- members: {
439
- RuneCountInString: { kind: "func", params: [STRING], returns: [INT] },
440
- RuneLen: { kind: "func", params: [INT], returns: [INT] },
441
- ValidString: { kind: "func", params: [STRING], returns: [BOOL] },
442
- ValidRune: { kind: "func", params: [INT], returns: [BOOL] },
443
- DecodeRuneInString: {
444
- kind: "func",
445
- params: [STRING],
446
- returns: [INT, INT],
447
- },
448
- DecodeLastRuneInString: {
449
- kind: "func",
450
- params: [STRING],
451
- returns: [INT, INT],
452
- },
453
- FullRuneInString: { kind: "func", params: [STRING], returns: [BOOL] },
454
- RuneError: INT,
455
- MaxRune: INT,
456
- UTFMax: INT,
457
- },
458
- });
459
-
460
- globals.define("path", {
461
- kind: "namespace",
462
- name: "path",
463
- members: {
464
- Base: { kind: "func", params: [STRING], returns: [STRING] },
465
- Dir: { kind: "func", params: [STRING], returns: [STRING] },
466
- Ext: { kind: "func", params: [STRING], returns: [STRING] },
467
- Join: {
468
- kind: "func",
469
- params: [STRING],
470
- returns: [STRING],
471
- variadic: true,
472
- },
473
- Clean: { kind: "func", params: [STRING], returns: [STRING] },
474
- IsAbs: { kind: "func", params: [STRING], returns: [BOOL] },
475
- Split: { kind: "func", params: [STRING], returns: [STRING, STRING] },
476
- Match: { kind: "func", params: [STRING, STRING], returns: [BOOL, ERROR] },
477
- ErrBadPattern: ERROR,
478
- },
479
- });
480
-
481
- globals.define("filepath", {
482
- kind: "namespace",
483
- name: "filepath",
484
- members: globals.lookup("path").members,
485
- });
486
-
487
- const TESTING_T = {
488
- kind: "named",
489
- name: "testing.T",
490
- underlying: { kind: "struct", fields: new Map(), methods: new Map() },
491
- };
492
- const TESTING_PTR = { kind: "pointer", base: TESTING_T };
493
-
494
- TESTING_T.underlying.methods = new Map([
495
- ["Error", { kind: "func", params: [ANY], returns: [VOID], variadic: true }],
496
- [
497
- "Errorf",
498
- { kind: "func", params: [STRING, ANY], returns: [VOID], variadic: true },
499
- ],
500
- ["Fatal", { kind: "func", params: [ANY], returns: [VOID], variadic: true }],
501
- [
502
- "Fatalf",
503
- { kind: "func", params: [STRING, ANY], returns: [VOID], variadic: true },
504
- ],
505
- ["Fail", { kind: "func", params: [], returns: [VOID] }],
506
- ["Failed", { kind: "func", params: [], returns: [BOOL] }],
507
- ["FailNow", { kind: "func", params: [], returns: [VOID] }],
508
- ["Log", { kind: "func", params: [ANY], returns: [VOID], variadic: true }],
509
- [
510
- "Logf",
511
- { kind: "func", params: [STRING, ANY], returns: [VOID], variadic: true },
512
- ],
513
- ["Skip", { kind: "func", params: [ANY], returns: [VOID], variadic: true }],
514
- [
515
- "Skipf",
516
- { kind: "func", params: [STRING, ANY], returns: [VOID], variadic: true },
517
- ],
518
- ["Skipped", { kind: "func", params: [], returns: [BOOL] }],
519
- ["Helper", { kind: "func", params: [], returns: [VOID] }],
520
- [
521
- "Run",
522
- {
523
- kind: "func",
524
- params: [
525
- STRING,
526
- { kind: "func", params: [TESTING_PTR], returns: [VOID] },
527
- ],
528
- returns: [BOOL],
529
- },
530
- ],
531
- ["Name", { kind: "func", params: [], returns: [STRING] }],
532
- ]);
533
-
534
- globals.define("testing", {
535
- kind: "namespace",
536
- name: "testing",
537
- members: {
538
- T: TESTING_T,
539
- Short: { kind: "func", params: [], returns: [BOOL] },
540
- Verbose: { kind: "func", params: [], returns: [BOOL] },
541
- },
542
- });
543
- types.set("testing.T", TESTING_T);
544
-
545
- // ── sync ──────────────────────────────────────────────────────
546
- const MUTEX_T = {
547
- kind: "named",
548
- name: "sync.Mutex",
549
- underlying: { kind: "struct", fields: new Map([["state", INT32]]) },
550
- methods: new Map([
551
- ["Lock", { kind: "func", params: [], returns: [VOID] }],
552
- ["Unlock", { kind: "func", params: [], returns: [VOID] }],
553
- ["TryLock", { kind: "func", params: [], returns: [BOOL] }],
554
- ]),
555
- };
556
- const RWMUTEX_T = {
557
- kind: "named",
558
- name: "sync.RWMutex",
559
- underlying: { kind: "struct", fields: new Map([["state", INT32]]) },
560
- methods: new Map([
561
- ["Lock", { kind: "func", params: [], returns: [VOID] }],
562
- ["Unlock", { kind: "func", params: [], returns: [VOID] }],
563
- ["RLock", { kind: "func", params: [], returns: [VOID] }],
564
- ["RUnlock", { kind: "func", params: [], returns: [VOID] }],
565
- ["TryLock", { kind: "func", params: [], returns: [BOOL] }],
566
- ["TryRLock", { kind: "func", params: [], returns: [BOOL] }],
567
- ]),
568
- };
569
- const ONCE_T = {
570
- kind: "named",
571
- name: "sync.Once",
572
- underlying: { kind: "struct", fields: new Map([["done", UINT32]]) },
573
- methods: new Map([
574
- [
575
- "Do",
576
- {
577
- kind: "func",
578
- params: [{ kind: "func", params: [], returns: [VOID] }],
579
- returns: [VOID],
580
- },
581
- ],
582
- ]),
583
- };
584
- const WAITGROUP_T = {
585
- kind: "named",
586
- name: "sync.WaitGroup",
587
- underlying: { kind: "struct", fields: new Map([["counter", INT]]) },
588
- methods: new Map([
589
- ["Add", { kind: "func", params: [INT], returns: [VOID] }],
590
- ["Done", { kind: "func", params: [], returns: [VOID] }],
591
- ["Wait", { kind: "func", params: [], returns: [VOID] }],
592
- ]),
593
- };
594
- const LOCKER_T = {
595
- kind: "interface",
596
- name: "sync.Locker",
597
- methods: new Map([
598
- ["Lock", { kind: "func", params: [], returns: [VOID] }],
599
- ["Unlock", { kind: "func", params: [], returns: [VOID] }],
600
- ]),
601
- };
602
- globals.define("sync", {
603
- kind: "namespace",
604
- name: "sync",
605
- members: {
606
- Mutex: MUTEX_T,
607
- RWMutex: RWMUTEX_T,
608
- Once: ONCE_T,
609
- WaitGroup: WAITGROUP_T,
610
- Locker: LOCKER_T,
611
- },
612
- });
613
- types.set("sync.Mutex", MUTEX_T);
614
- types.set("sync.RWMutex", RWMUTEX_T);
615
- types.set("sync.Once", ONCE_T);
616
- types.set("sync.WaitGroup", WAITGROUP_T);
617
- types.set("sync.Locker", LOCKER_T);
618
-
619
- // ── crypto/sha256 ─────────────────────────────────────────────
620
- const BYTE_SLICE = { kind: "slice", elem: UINT8 };
621
- const HASH_T = {
622
- kind: "interface",
623
- methods: new Map([
624
- ["Write", { kind: "func", params: [BYTE_SLICE], returns: [INT, ERROR] }],
625
- ["Sum", { kind: "func", params: [BYTE_SLICE], returns: [BYTE_SLICE] }],
626
- ["Reset", { kind: "func", params: [], returns: [VOID] }],
627
- ["Size", { kind: "func", params: [], returns: [INT] }],
628
- ["BlockSize", { kind: "func", params: [], returns: [INT] }],
629
- ]),
630
- };
631
- const SHA256_DIGEST_T = {
632
- kind: "named",
633
- name: "sha256.digest",
634
- underlying: { kind: "struct", fields: new Map([["buf", BYTE_SLICE]]) },
635
- methods: new Map([
636
- ["Write", { kind: "func", params: [BYTE_SLICE], returns: [INT, ERROR] }],
637
- ["Sum", { kind: "func", params: [BYTE_SLICE], returns: [BYTE_SLICE] }],
638
- ["Reset", { kind: "func", params: [], returns: [VOID] }],
639
- ["Size", { kind: "func", params: [], returns: [INT] }],
640
- ["BlockSize", { kind: "func", params: [], returns: [INT] }],
641
- ]),
642
- };
643
- globals.define("sha256", {
644
- kind: "namespace",
645
- name: "sha256",
646
- members: {
647
- Size: INT,
648
- BlockSize: INT,
649
- Sum256: {
650
- kind: "func",
651
- params: [BYTE_SLICE],
652
- returns: [{ kind: "array", size: 32, elem: UINT8 }],
653
- },
654
- New: { kind: "func", params: [], returns: [HASH_T] },
655
- },
656
- });
657
- types.set("hash.Hash", HASH_T);
658
- types.set("sha256.digest", SHA256_DIGEST_T);
659
- types.set("crypto/sha256.digest", SHA256_DIGEST_T);
660
-
661
- // ── encoding/binary ───────────────────────────────────────────
662
- const BYTE_ORDER_METHODS = [
663
- ["Uint16", { kind: "func", params: [BYTE_SLICE], returns: [UINT16] }],
664
- ["Uint32", { kind: "func", params: [BYTE_SLICE], returns: [UINT32] }],
665
- ["Uint64", { kind: "func", params: [BYTE_SLICE], returns: [UINT64] }],
666
- [
667
- "PutUint16",
668
- { kind: "func", params: [BYTE_SLICE, UINT16], returns: [VOID] },
669
- ],
670
- [
671
- "PutUint32",
672
- { kind: "func", params: [BYTE_SLICE, UINT32], returns: [VOID] },
673
- ],
674
- [
675
- "PutUint64",
676
- { kind: "func", params: [BYTE_SLICE, UINT64], returns: [VOID] },
677
- ],
678
- ["String", { kind: "func", params: [], returns: [STRING] }],
679
- ];
680
- const BYTE_ORDER_T = {
681
- kind: "interface",
682
- methods: new Map(BYTE_ORDER_METHODS),
683
- };
684
- const LITTLE_ENDIAN_METHODS = new Map([
685
- ...BYTE_ORDER_METHODS,
686
- [
687
- "AppendUint16",
688
- { kind: "func", params: [BYTE_SLICE, UINT16], returns: [BYTE_SLICE] },
689
- ],
690
- [
691
- "AppendUint32",
692
- { kind: "func", params: [BYTE_SLICE, UINT32], returns: [BYTE_SLICE] },
693
- ],
694
- [
695
- "AppendUint64",
696
- { kind: "func", params: [BYTE_SLICE, UINT64], returns: [BYTE_SLICE] },
697
- ],
698
- ]);
699
- const LITTLE_ENDIAN_T = {
700
- kind: "named",
701
- name: "binary.LittleEndian",
702
- underlying: {
703
- kind: "struct",
704
- fields: new Map([["order", INT32]]),
705
- methods: LITTLE_ENDIAN_METHODS,
706
- },
707
- methods: LITTLE_ENDIAN_METHODS,
708
- };
709
- const BIG_ENDIAN_METHODS = new Map([
710
- ...BYTE_ORDER_METHODS,
711
- [
712
- "AppendUint16",
713
- { kind: "func", params: [BYTE_SLICE, UINT16], returns: [BYTE_SLICE] },
714
- ],
715
- [
716
- "AppendUint32",
717
- { kind: "func", params: [BYTE_SLICE, UINT32], returns: [BYTE_SLICE] },
718
- ],
719
- [
720
- "AppendUint64",
721
- { kind: "func", params: [BYTE_SLICE, UINT64], returns: [BYTE_SLICE] },
722
- ],
723
- ]);
724
- const BIG_ENDIAN_T = {
725
- kind: "named",
726
- name: "binary.BigEndian",
727
- underlying: {
728
- kind: "struct",
729
- fields: new Map([["order", INT32]]),
730
- methods: BIG_ENDIAN_METHODS,
731
- },
732
- methods: BIG_ENDIAN_METHODS,
733
- };
734
- globals.define("binary", {
735
- kind: "namespace",
736
- name: "binary",
737
- members: {
738
- ByteOrder: BYTE_ORDER_T,
739
- LittleEndian: LITTLE_ENDIAN_T,
740
- BigEndian: BIG_ENDIAN_T,
741
- Read: {
742
- kind: "func",
743
- params: [ANY, BYTE_ORDER_T, ANY],
744
- returns: [ERROR],
745
- },
746
- Write: {
747
- kind: "func",
748
- params: [ANY, BYTE_ORDER_T, ANY],
749
- returns: [ERROR],
750
- },
751
- Size: { kind: "func", params: [ANY], returns: [INT] },
752
- AppendUint16: {
753
- kind: "func",
754
- params: [BYTE_SLICE, UINT16],
755
- returns: [BYTE_SLICE],
756
- },
757
- AppendUint32: {
758
- kind: "func",
759
- params: [BYTE_SLICE, UINT32],
760
- returns: [BYTE_SLICE],
761
- },
762
- AppendUint64: {
763
- kind: "func",
764
- params: [BYTE_SLICE, UINT64],
765
- returns: [BYTE_SLICE],
766
- },
767
- },
768
- });
769
- types.set("encoding/binary.ByteOrder", BYTE_ORDER_T);
770
- types.set("binary.ByteOrder", BYTE_ORDER_T);
771
- types.set("encoding/binary.LittleEndian", LITTLE_ENDIAN_T);
772
- types.set("binary.LittleEndian", LITTLE_ENDIAN_T);
773
- types.set("encoding/binary.BigEndian", BIG_ENDIAN_T);
774
- types.set("binary.BigEndian", BIG_ENDIAN_T);
775
-
776
- // ── encoding/hex ──────────────────────────────────────────────
777
- globals.define("hex", {
778
- kind: "namespace",
779
- name: "hex",
780
- members: {
781
- EncodeToString: { kind: "func", params: [BYTE_SLICE], returns: [STRING] },
782
- DecodeString: {
783
- kind: "func",
784
- params: [STRING],
785
- returns: [BYTE_SLICE, ERROR],
786
- },
787
- Encode: {
788
- kind: "func",
789
- params: [BYTE_SLICE, BYTE_SLICE],
790
- returns: [INT],
791
- },
792
- Decode: {
793
- kind: "func",
794
- params: [BYTE_SLICE, BYTE_SLICE],
795
- returns: [INT, ERROR],
796
- },
797
- EncodedLen: { kind: "func", params: [INT], returns: [INT] },
798
- DecodedLen: { kind: "func", params: [INT], returns: [INT] },
799
- ErrLength: ERROR,
800
- },
801
- });
802
-
803
- // ── encoding/base64 ───────────────────────────────────────────
804
- const BASE64_ENCODING_METHODS = new Map([
805
- [
806
- "EncodeToString",
807
- { kind: "func", params: [BYTE_SLICE], returns: [STRING] },
808
- ],
809
- [
810
- "DecodeString",
811
- { kind: "func", params: [STRING], returns: [BYTE_SLICE, ERROR] },
812
- ],
813
- [
814
- "Encode",
815
- { kind: "func", params: [BYTE_SLICE, BYTE_SLICE], returns: [VOID] },
816
- ],
817
- [
818
- "Decode",
819
- { kind: "func", params: [BYTE_SLICE, BYTE_SLICE], returns: [INT, ERROR] },
820
- ],
821
- ["EncodedLen", { kind: "func", params: [INT], returns: [INT] }],
822
- ["DecodedLen", { kind: "func", params: [INT], returns: [INT] }],
823
- ["WithPadding", { kind: "func", params: [INT], returns: [ANY] }],
824
- ]);
825
- const BASE64_ENCODING_T = {
826
- kind: "named",
827
- name: "base64.Encoding",
828
- underlying: {
829
- kind: "struct",
830
- fields: new Map([["mode", INT32]]),
831
- methods: BASE64_ENCODING_METHODS,
832
- },
833
- methods: BASE64_ENCODING_METHODS,
834
- };
835
- globals.define("base64", {
836
- kind: "namespace",
837
- name: "base64",
838
- members: {
839
- Encoding: BASE64_ENCODING_T,
840
- StdEncoding: BASE64_ENCODING_T,
841
- URLEncoding: BASE64_ENCODING_T,
842
- RawStdEncoding: BASE64_ENCODING_T,
843
- RawURLEncoding: BASE64_ENCODING_T,
844
- NewEncoding: {
845
- kind: "func",
846
- params: [STRING],
847
- returns: [BASE64_ENCODING_T],
848
- },
849
- StdPadding: INT,
850
- NoPadding: INT,
851
- },
852
- });
853
- types.set("encoding/base64.Encoding", BASE64_ENCODING_T);
854
- types.set("base64.Encoding", BASE64_ENCODING_T);
855
-
856
- // ── encoding/json ─────────────────────────────────────────────
857
- const RAW_MESSAGE_T = {
858
- kind: "named",
859
- name: "json.RawMessage",
860
- underlying: BYTE_SLICE,
861
- methods: new Map(),
862
- };
863
- globals.define("json", {
864
- kind: "namespace",
865
- name: "json",
866
- members: {
867
- Marshal: {
868
- kind: "func",
869
- params: [ANY],
870
- returns: [BYTE_SLICE, ERROR],
871
- },
872
- MarshalIndent: {
873
- kind: "func",
874
- params: [ANY, STRING, STRING],
875
- returns: [BYTE_SLICE, ERROR],
876
- },
877
- Unmarshal: {
878
- kind: "func",
879
- params: [BYTE_SLICE, ANY],
880
- returns: [ERROR],
881
- },
882
- Valid: {
883
- kind: "func",
884
- params: [BYTE_SLICE],
885
- returns: [BOOL],
886
- },
887
- RawMessage: RAW_MESSAGE_T,
888
- },
889
- });
890
- types.set("encoding/json.RawMessage", RAW_MESSAGE_T);
891
- types.set("json.RawMessage", RAW_MESSAGE_T);
892
-
893
- for (const name of [
894
- "append",
895
- "len",
896
- "cap",
897
- "make",
898
- "delete",
899
- "print",
900
- "println",
901
- "panic",
902
- "recover",
903
- "new",
904
- "copy",
905
- "error",
906
- "min",
907
- "max",
908
- "clear",
909
- "complex",
910
- "real",
911
- "imag",
912
- ])
913
- globals.define(name, { kind: "builtin", name });
914
- }