gofront 1.6.0 → 1.6.1

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 (68) hide show
  1. package/package.json +1 -1
  2. package/src/backend/js/expressions.js +238 -109
  3. package/src/backend/js/index.js +38 -1
  4. package/src/backend/js/runtime.js +953 -53
  5. package/src/backend/js/statements.js +55 -67
  6. package/src/backend/js/stdlib/base64.js +12 -0
  7. package/src/backend/js/stdlib/binary.js +102 -0
  8. package/src/backend/js/stdlib/bits.js +15 -1
  9. package/src/backend/js/stdlib/builder.js +28 -9
  10. package/src/backend/js/stdlib/bytes.js +75 -18
  11. package/src/backend/js/stdlib/errors.js +20 -1
  12. package/src/backend/js/stdlib/fmt.js +70 -13
  13. package/src/backend/js/stdlib/hex.js +17 -0
  14. package/src/backend/js/stdlib/html.js +1 -1
  15. package/src/backend/js/stdlib/index.js +16 -0
  16. package/src/backend/js/stdlib/io.js +105 -3
  17. package/src/backend/js/stdlib/math.js +13 -1
  18. package/src/backend/js/stdlib/path.js +18 -4
  19. package/src/backend/js/stdlib/rand.js +10 -5
  20. package/src/backend/js/stdlib/sha256.js +12 -0
  21. package/src/backend/js/stdlib/slices.js +52 -26
  22. package/src/backend/js/stdlib/strconv.js +21 -5
  23. package/src/backend/js/stdlib/strings.js +148 -15
  24. package/src/backend/js/stdlib/sync.js +13 -0
  25. package/src/backend/js/stdlib/time.js +90 -19
  26. package/src/backend/js/stdlib/unicode.js +2 -2
  27. package/src/backend/wasm/boundary.js +1207 -41
  28. package/src/backend/wasm/const-fold.js +205 -0
  29. package/src/backend/wasm/emit-builtins.js +203 -76
  30. package/src/backend/wasm/emit-exprs.js +464 -276
  31. package/src/backend/wasm/emit-maps.js +144 -8
  32. package/src/backend/wasm/emit-stdlib.js +12 -3005
  33. package/src/backend/wasm/emit-stmts.js +264 -270
  34. package/src/backend/wasm/emit.js +115 -87
  35. package/src/backend/wasm/encode.js +55 -29
  36. package/src/backend/wasm/index.js +1001 -32
  37. package/src/backend/wasm/optimize.js +13 -4
  38. package/src/backend/wasm/stdlib/bytes.js +5039 -0
  39. package/src/backend/wasm/stdlib/core.js +8903 -0
  40. package/src/backend/wasm/stdlib/index.js +40 -0
  41. package/src/backend/wasm/stdlib/io.js +2161 -0
  42. package/src/backend/wasm/stdlib/packages.js +2400 -0
  43. package/src/backend/wasm/stdlib/pure.js +720 -0
  44. package/src/backend/wasm/stdlib/time.js +1200 -0
  45. package/src/backend/wasm/types.js +153 -1
  46. package/src/cli-core.js +1 -1
  47. package/src/compiler.js +18 -4
  48. package/src/dts-parser.js +79 -126
  49. package/src/index.js +2 -6
  50. package/src/lexer.js +80 -29
  51. package/src/lower/boxing.js +1 -2
  52. package/src/lower/captures.js +2 -6
  53. package/src/lower/ownership.js +30 -9
  54. package/src/minifier.js +20 -68
  55. package/src/parser/declarations.js +3 -6
  56. package/src/parser/expressions.js +3 -8
  57. package/src/parser/index.js +18 -3
  58. package/src/parser/statements.js +25 -38
  59. package/src/parser/types.js +1 -2
  60. package/src/resolver.js +2 -27
  61. package/src/templ-lexer.js +29 -63
  62. package/src/templ-parser.js +22 -45
  63. package/src/typechecker/assignability.js +81 -13
  64. package/src/typechecker/expressions.js +102 -2
  65. package/src/typechecker/resolve.js +36 -6
  66. package/src/typechecker/stdlib/core.js +280 -89
  67. package/src/typechecker/stdlib/extended.js +453 -1
  68. package/src/typechecker/types.js +344 -6
@@ -4,81 +4,91 @@
4
4
  import {
5
5
  ANY,
6
6
  BOOL,
7
+ BROWSER_GLOBALS,
7
8
  ERROR,
9
+ FLOAT32,
8
10
  FLOAT64,
9
11
  INT,
12
+ INT8,
13
+ INT16,
14
+ INT32,
15
+ INT64,
10
16
  STRING,
17
+ UINT,
11
18
  UINT8,
19
+ UINT16,
12
20
  UINT32,
13
21
  UINT64,
14
22
  VOID,
15
23
  } from "../types.js";
16
24
 
17
- const TIME_T = { kind: "named", name: "time.Time", underlying: ANY };
25
+ const DURATION_T = {
26
+ kind: "named",
27
+ name: "time.Duration",
28
+ underlying: INT64,
29
+ methods: new Map([
30
+ ["Nanoseconds", { kind: "func", params: [], returns: [INT64] }],
31
+ ["Microseconds", { kind: "func", params: [], returns: [INT64] }],
32
+ ["Milliseconds", { kind: "func", params: [], returns: [INT64] }],
33
+ ["Seconds", { kind: "func", params: [], returns: [FLOAT64] }],
34
+ ["Minutes", { kind: "func", params: [], returns: [FLOAT64] }],
35
+ ["Hours", { kind: "func", params: [], returns: [FLOAT64] }],
36
+ ["String", { kind: "func", params: [], returns: [STRING] }],
37
+ ]),
38
+ };
39
+ const TIME_T = {
40
+ kind: "named",
41
+ name: "time.Time",
42
+ underlying: {
43
+ kind: "struct",
44
+ fields: new Map(),
45
+ methods: new Map(),
46
+ },
47
+ };
48
+ TIME_T.underlying.fields.set("_unixNano", INT64);
49
+ TIME_T.underlying.fields.set("_offset", INT32);
50
+ TIME_T.underlying.methods = new Map([
51
+ ["Format", { kind: "func", params: [STRING], returns: [STRING] }],
52
+ ["String", { kind: "func", params: [], returns: [STRING] }],
53
+ ["Year", { kind: "func", params: [], returns: [INT] }],
54
+ ["Month", { kind: "func", params: [], returns: [INT] }],
55
+ ["Day", { kind: "func", params: [], returns: [INT] }],
56
+ ["Hour", { kind: "func", params: [], returns: [INT] }],
57
+ ["Minute", { kind: "func", params: [], returns: [INT] }],
58
+ ["Second", { kind: "func", params: [], returns: [INT] }],
59
+ ["Weekday", { kind: "func", params: [], returns: [INT] }],
60
+ ["Unix", { kind: "func", params: [], returns: [INT64] }],
61
+ ["UnixMilli", { kind: "func", params: [], returns: [INT64] }],
62
+ ["UnixNano", { kind: "func", params: [], returns: [INT64] }],
63
+ ["Nanosecond", { kind: "func", params: [], returns: [INT] }],
64
+ ["IsZero", { kind: "func", params: [], returns: [BOOL] }],
65
+ ["UTC", { kind: "func", params: [], returns: [TIME_T] }],
66
+ ["Local", { kind: "func", params: [], returns: [TIME_T] }],
67
+ ["Add", { kind: "func", params: [DURATION_T], returns: [TIME_T] }],
68
+ ["Sub", { kind: "func", params: [TIME_T], returns: [DURATION_T] }],
69
+ ["Before", { kind: "func", params: [TIME_T], returns: [BOOL] }],
70
+ ["After", { kind: "func", params: [TIME_T], returns: [BOOL] }],
71
+ ["Equal", { kind: "func", params: [TIME_T], returns: [BOOL] }],
72
+ ["AddDate", { kind: "func", params: [INT, INT, INT], returns: [TIME_T] }],
73
+ ["Truncate", { kind: "func", params: [DURATION_T], returns: [TIME_T] }],
74
+ ["Round", { kind: "func", params: [DURATION_T], returns: [TIME_T] }],
75
+ ["Date", { kind: "func", params: [], returns: [INT, INT, INT] }],
76
+ ["Clock", { kind: "func", params: [], returns: [INT, INT, INT] }],
77
+ ["YearDay", { kind: "func", params: [], returns: [INT] }],
78
+ ["ISOWeek", { kind: "func", params: [], returns: [INT, INT] }],
79
+ ["Compare", { kind: "func", params: [TIME_T], returns: [INT] }],
80
+ ["In", { kind: "func", params: [ANY], returns: [TIME_T] }],
81
+ ["Location", { kind: "func", params: [], returns: [ANY] }],
82
+ ["Zone", { kind: "func", params: [], returns: [STRING, INT] }],
83
+ ]);
84
+ TIME_T.methods = TIME_T.underlying.methods;
85
+ const REPLACER_T = {
86
+ kind: "pointer",
87
+ base: { kind: "named", name: "strings.Replacer" },
88
+ };
18
89
 
19
90
  export function setupCoreGlobals(globals, types) {
20
- const browserGlobals = [
21
- "console",
22
- "document",
23
- "window",
24
- "navigator",
25
- "location",
26
- "history",
27
- "screen",
28
- "performance",
29
- "crypto",
30
- "indexedDB",
31
- "fetch",
32
- "setTimeout",
33
- "setInterval",
34
- "clearTimeout",
35
- "clearInterval",
36
- "requestAnimationFrame",
37
- "cancelAnimationFrame",
38
- "Math",
39
- "JSON",
40
- "Date",
41
- "RegExp",
42
- "Promise",
43
- "Error",
44
- "Symbol",
45
- "String",
46
- "Number",
47
- "Boolean",
48
- "Array",
49
- "Object",
50
- "parseInt",
51
- "parseFloat",
52
- "isNaN",
53
- "isFinite",
54
- "encodeURIComponent",
55
- "decodeURIComponent",
56
- "atob",
57
- "btoa",
58
- "alert",
59
- "confirm",
60
- "prompt",
61
- "localStorage",
62
- "sessionStorage",
63
- "WebSocket",
64
- "Worker",
65
- "HTMLElement",
66
- "Element",
67
- "Event",
68
- "CustomEvent",
69
- "URL",
70
- "URLSearchParams",
71
- "FormData",
72
- "Headers",
73
- "Request",
74
- "Response",
75
- "Blob",
76
- "File",
77
- "FileReader",
78
- "TextEncoder",
79
- "TextDecoder",
80
- ];
81
- for (const g of browserGlobals) globals.define(g, ANY);
91
+ for (const g of BROWSER_GLOBALS) globals.define(g, ANY);
82
92
 
83
93
  const fmtVariadic = (ret) => ({
84
94
  kind: "func",
@@ -86,6 +96,12 @@ export function setupCoreGlobals(globals, types) {
86
96
  returns: [ret],
87
97
  variadic: true,
88
98
  });
99
+ const fmtPrintVariadic = (ret) => ({
100
+ kind: "func",
101
+ params: [ANY],
102
+ returns: [ret],
103
+ variadic: true,
104
+ });
89
105
  globals.define("fmt", {
90
106
  kind: "namespace",
91
107
  name: "fmt",
@@ -93,23 +109,23 @@ export function setupCoreGlobals(globals, types) {
93
109
  Sprintf: fmtVariadic(STRING),
94
110
  Errorf: fmtVariadic(ERROR),
95
111
  Printf: fmtVariadic(VOID),
96
- Println: fmtVariadic(VOID),
97
- Print: fmtVariadic(VOID),
112
+ Println: fmtPrintVariadic(VOID),
113
+ Print: fmtPrintVariadic(VOID),
98
114
  Fprintf: {
99
115
  kind: "func",
100
- params: [ANY, STRING],
116
+ params: [ANY, STRING, ANY],
101
117
  returns: [INT, ERROR],
102
118
  variadic: true,
103
119
  },
104
120
  Fprintln: {
105
121
  kind: "func",
106
- params: [ANY],
122
+ params: [ANY, ANY],
107
123
  returns: [INT, ERROR],
108
124
  variadic: true,
109
125
  },
110
126
  Fprint: {
111
127
  kind: "func",
112
- params: [ANY],
128
+ params: [ANY, ANY],
113
129
  returns: [INT, ERROR],
114
130
  variadic: true,
115
131
  },
@@ -178,6 +194,7 @@ export function setupCoreGlobals(globals, types) {
178
194
  },
179
195
  EqualFold: strFn2(STRING, BOOL),
180
196
  Fields: strFn1({ kind: "slice", elem: STRING }),
197
+ FieldsFunc: strFn2(ANY, { kind: "slice", elem: STRING }),
181
198
  Cut: {
182
199
  kind: "func",
183
200
  params: [STRING, STRING],
@@ -218,10 +235,11 @@ export function setupCoreGlobals(globals, types) {
218
235
  NewReplacer: {
219
236
  kind: "func",
220
237
  params: [STRING],
221
- returns: [ANY],
238
+ returns: [REPLACER_T],
222
239
  variadic: true,
223
240
  },
224
241
  NewReader: { kind: "func", params: [STRING], returns: [ANY] },
242
+ Builder: ANY,
225
243
  },
226
244
  });
227
245
 
@@ -253,6 +271,7 @@ export function setupCoreGlobals(globals, types) {
253
271
  },
254
272
  ToUpper: byFn1(BYTE_SLICE),
255
273
  ToLower: byFn1(BYTE_SLICE),
274
+ ToTitle: byFn1(BYTE_SLICE),
256
275
  TrimSpace: byFn1(BYTE_SLICE),
257
276
  Trim: byFn2(STRING, BYTE_SLICE),
258
277
  Equal: byFn2(BYTE_SLICE, BOOL),
@@ -280,6 +299,8 @@ export function setupCoreGlobals(globals, types) {
280
299
  LastIndex: byFn2(BYTE_SLICE, INT),
281
300
  LastIndexByte: byFn2(INT, INT),
282
301
  Fields: byFn1({ kind: "slice", elem: BYTE_SLICE }),
302
+ FieldsFunc: byFn2(ANY, { kind: "slice", elem: BYTE_SLICE }),
303
+ Clone: byFn1(BYTE_SLICE),
283
304
  Cut: {
284
305
  kind: "func",
285
306
  params: [BYTE_SLICE, BYTE_SLICE],
@@ -294,6 +315,7 @@ export function setupCoreGlobals(globals, types) {
294
315
  returns: [{ kind: "slice", elem: BYTE_SLICE }],
295
316
  },
296
317
  NewReader: { kind: "func", params: [BYTE_SLICE], returns: [ANY] },
318
+ Buffer: ANY,
297
319
  },
298
320
  });
299
321
 
@@ -309,7 +331,8 @@ export function setupCoreGlobals(globals, types) {
309
331
  returns: [STRING],
310
332
  },
311
333
  FormatBool: { kind: "func", params: [BOOL], returns: [STRING] },
312
- FormatInt: { kind: "func", params: [INT, INT], returns: [STRING] },
334
+ FormatInt: { kind: "func", params: [INT64, INT], returns: [STRING] },
335
+ FormatUint: { kind: "func", params: [UINT64, INT], returns: [STRING] },
313
336
  ParseFloat: {
314
337
  kind: "func",
315
338
  params: [STRING, INT],
@@ -320,12 +343,22 @@ export function setupCoreGlobals(globals, types) {
320
343
  params: [STRING, INT, INT],
321
344
  returns: [INT, ERROR],
322
345
  },
346
+ ParseUint: {
347
+ kind: "func",
348
+ params: [STRING, INT, INT],
349
+ returns: [UINT64, ERROR],
350
+ },
323
351
  ParseBool: { kind: "func", params: [STRING], returns: [BOOL, ERROR] },
324
352
  Quote: { kind: "func", params: [STRING], returns: [STRING] },
325
353
  Unquote: { kind: "func", params: [STRING], returns: [STRING, ERROR] },
326
354
  AppendInt: {
327
355
  kind: "func",
328
- params: [BYTE_SLICE, INT, INT],
356
+ params: [BYTE_SLICE, INT64, INT],
357
+ returns: [BYTE_SLICE],
358
+ },
359
+ AppendUint: {
360
+ kind: "func",
361
+ params: [BYTE_SLICE, UINT64, INT],
329
362
  returns: [BYTE_SLICE],
330
363
  },
331
364
  AppendFloat: {
@@ -333,6 +366,13 @@ export function setupCoreGlobals(globals, types) {
333
366
  params: [BYTE_SLICE, FLOAT64, INT, INT, INT],
334
367
  returns: [BYTE_SLICE],
335
368
  },
369
+ AppendBool: {
370
+ kind: "func",
371
+ params: [BYTE_SLICE, BOOL],
372
+ returns: [BYTE_SLICE],
373
+ },
374
+ ErrSyntax: ERROR,
375
+ ErrRange: ERROR,
336
376
  },
337
377
  });
338
378
 
@@ -421,12 +461,43 @@ export function setupCoreGlobals(globals, types) {
421
461
  params: [FLOAT64, FLOAT64],
422
462
  returns: [FLOAT64],
423
463
  },
464
+ Float64bits: { kind: "func", params: [FLOAT64], returns: [UINT64] },
465
+ Float64frombits: { kind: "func", params: [UINT64], returns: [FLOAT64] },
466
+ Float32bits: { kind: "func", params: [FLOAT32], returns: [UINT32] },
467
+ Float32frombits: { kind: "func", params: [UINT32], returns: [FLOAT32] },
468
+ Sinh: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
469
+ Cosh: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
470
+ Tanh: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
424
471
  Pi: FLOAT64,
425
472
  E: FLOAT64,
473
+ Phi: FLOAT64,
474
+ Sqrt2: FLOAT64,
475
+ SqrtE: FLOAT64,
476
+ SqrtPi: FLOAT64,
477
+ SqrtPhi: FLOAT64,
478
+ Ln2: FLOAT64,
479
+ Log2E: FLOAT64,
480
+ Ln10: FLOAT64,
481
+ Log10E: FLOAT64,
482
+ MaxFloat32: FLOAT32,
483
+ SmallestNonzeroFloat32: FLOAT32,
426
484
  MaxFloat64: FLOAT64,
427
485
  SmallestNonzeroFloat64: FLOAT64,
428
486
  MaxInt: INT,
429
487
  MinInt: INT,
488
+ MaxInt8: INT8,
489
+ MinInt8: INT8,
490
+ MaxInt16: INT16,
491
+ MinInt16: INT16,
492
+ MaxInt32: INT32,
493
+ MinInt32: INT32,
494
+ MaxInt64: INT64,
495
+ MinInt64: INT64,
496
+ MaxUint8: UINT8,
497
+ MaxUint16: UINT16,
498
+ MaxUint32: UINT32,
499
+ MaxUint: UINT,
500
+ MaxUint64: UINT64,
430
501
  },
431
502
  });
432
503
 
@@ -442,6 +513,13 @@ export function setupCoreGlobals(globals, types) {
442
513
  TrailingZeros64: { kind: "func", params: [UINT64], returns: [INT] },
443
514
  OnesCount64: { kind: "func", params: [UINT64], returns: [INT] },
444
515
  RotateLeft64: { kind: "func", params: [UINT64, INT], returns: [UINT64] },
516
+ ReverseBytes16: { kind: "func", params: [UINT16], returns: [UINT16] },
517
+ ReverseBytes32: { kind: "func", params: [UINT32], returns: [UINT32] },
518
+ ReverseBytes64: { kind: "func", params: [UINT64], returns: [UINT64] },
519
+ Len32: { kind: "func", params: [UINT32], returns: [INT] },
520
+ Len64: { kind: "func", params: [UINT64], returns: [INT] },
521
+ Reverse32: { kind: "func", params: [UINT32], returns: [UINT32] },
522
+ Reverse64: { kind: "func", params: [UINT64], returns: [UINT64] },
445
523
  },
446
524
  });
447
525
 
@@ -452,6 +530,13 @@ export function setupCoreGlobals(globals, types) {
452
530
  New: { kind: "func", params: [STRING], returns: [ERROR] },
453
531
  Is: { kind: "func", params: [ERROR, ERROR], returns: [BOOL] },
454
532
  Unwrap: { kind: "func", params: [ERROR], returns: [ERROR] },
533
+ As: { kind: "func", params: [ERROR, ANY], returns: [BOOL] },
534
+ Join: {
535
+ kind: "func",
536
+ params: [ERROR],
537
+ returns: [ERROR],
538
+ variadic: true,
539
+ },
455
540
  },
456
541
  });
457
542
 
@@ -460,23 +545,29 @@ export function setupCoreGlobals(globals, types) {
460
545
  name: "time",
461
546
  members: {
462
547
  Now: { kind: "func", params: [], returns: [TIME_T] },
463
- Since: { kind: "func", params: [TIME_T], returns: [INT] },
548
+ Since: { kind: "func", params: [TIME_T], returns: [DURATION_T] },
464
549
  Sleep: { kind: "func", params: [ANY], returns: [VOID], async: true },
465
550
  Parse: {
466
551
  kind: "func",
467
552
  params: [STRING, STRING],
468
553
  returns: [TIME_T, ERROR],
469
554
  },
470
- Unix: { kind: "func", params: [INT, INT], returns: [TIME_T] },
555
+ Unix: { kind: "func", params: [INT64, INT64], returns: [TIME_T] },
556
+ UnixMicro: { kind: "func", params: [INT64], returns: [TIME_T] },
557
+ UnixMilli: { kind: "func", params: [INT64], returns: [TIME_T] },
471
558
  Date: {
472
559
  kind: "func",
473
560
  params: [INT, INT, INT, INT, INT, INT, INT, ANY],
474
561
  returns: [TIME_T],
475
562
  },
476
- Millisecond: INT,
477
- Second: INT,
478
- Minute: INT,
479
- Hour: INT,
563
+ Duration: DURATION_T,
564
+ Nanosecond: DURATION_T,
565
+ Microsecond: DURATION_T,
566
+ Millisecond: DURATION_T,
567
+ Second: DURATION_T,
568
+ Minute: DURATION_T,
569
+ Hour: DURATION_T,
570
+ Time: TIME_T,
480
571
  RFC3339: STRING,
481
572
  RFC3339Nano: STRING,
482
573
  DateOnly: STRING,
@@ -505,6 +596,7 @@ export function setupCoreGlobals(globals, types) {
505
596
  Saturday: INT,
506
597
  },
507
598
  });
599
+ types.set("time.Duration", DURATION_T);
508
600
  types.set("time.Time", TIME_T);
509
601
 
510
602
  const runeToStr = { kind: "func", params: [INT], returns: [BOOL] };
@@ -553,7 +645,15 @@ export function setupCoreGlobals(globals, types) {
553
645
  name: "slices",
554
646
  members: {
555
647
  Contains: { kind: "func", params: [ANY, ANY], returns: [BOOL] },
648
+ ContainsFunc: { kind: "func", params: [ANY, ANY], returns: [BOOL] },
556
649
  Index: { kind: "func", params: [ANY, ANY], returns: [INT] },
650
+ IndexFunc: { kind: "func", params: [ANY, ANY], returns: [INT] },
651
+ BinarySearch: { kind: "func", params: [ANY, ANY], returns: [INT, BOOL] },
652
+ BinarySearchFunc: {
653
+ kind: "func",
654
+ params: [ANY, ANY, ANY],
655
+ returns: [INT, BOOL],
656
+ },
557
657
  Equal: { kind: "func", params: [ANY, ANY], returns: [BOOL] },
558
658
  Compare: { kind: "func", params: [ANY, ANY], returns: [INT] },
559
659
  Sort: { kind: "func", params: [ANY], returns: [VOID] },
@@ -562,14 +662,34 @@ export function setupCoreGlobals(globals, types) {
562
662
  IsSorted: { kind: "func", params: [ANY], returns: [BOOL] },
563
663
  IsSortedFunc: { kind: "func", params: [ANY, ANY], returns: [BOOL] },
564
664
  Reverse: { kind: "func", params: [ANY], returns: [VOID] },
565
- Max: { kind: "func", params: [ANY], returns: [ANY] },
566
- Min: { kind: "func", params: [ANY], returns: [ANY] },
567
- MaxFunc: { kind: "func", params: [ANY, ANY], returns: [ANY] },
568
- MinFunc: { kind: "func", params: [ANY, ANY], returns: [ANY] },
665
+ Max: {
666
+ kind: "func",
667
+ params: [ANY],
668
+ returns: [ANY],
669
+ _derivedReturn: "elemOfArg0",
670
+ },
671
+ Min: {
672
+ kind: "func",
673
+ params: [ANY],
674
+ returns: [ANY],
675
+ _derivedReturn: "elemOfArg0",
676
+ },
677
+ MaxFunc: {
678
+ kind: "func",
679
+ params: [ANY, ANY],
680
+ returns: [ANY],
681
+ _derivedReturn: "elemOfArg0",
682
+ },
683
+ MinFunc: {
684
+ kind: "func",
685
+ params: [ANY, ANY],
686
+ returns: [ANY],
687
+ _derivedReturn: "elemOfArg0",
688
+ },
569
689
  Clone: sameSlice([ANY]),
570
690
  Compact: sameSlice([ANY]),
571
691
  CompactFunc: sameSlice([ANY, ANY]),
572
- Concat: { kind: "func", params: [ANY], returns: [ANY], variadic: true },
692
+ Concat: sameSlice([ANY], { variadic: true }),
573
693
  Delete: sameSlice([ANY, INT, INT]),
574
694
  DeleteFunc: sameSlice([ANY, ANY]),
575
695
  Insert: sameSlice([ANY, INT, ANY], { variadic: true }),
@@ -589,22 +709,93 @@ export function setupCoreGlobals(globals, types) {
589
709
  });
590
710
 
591
711
  const BYTE_SLICE_IO = { kind: "slice", elem: UINT8 };
712
+ const IO_WRITER = {
713
+ kind: "interface",
714
+ name: "io.Writer",
715
+ methods: new Map([
716
+ [
717
+ "Write",
718
+ { kind: "func", params: [BYTE_SLICE_IO], returns: [INT, ERROR] },
719
+ ],
720
+ ]),
721
+ };
722
+ const IO_READER = {
723
+ kind: "interface",
724
+ name: "io.Reader",
725
+ methods: new Map([
726
+ [
727
+ "Read",
728
+ { kind: "func", params: [BYTE_SLICE_IO], returns: [INT, ERROR] },
729
+ ],
730
+ ]),
731
+ };
732
+ const IO_CLOSER = {
733
+ kind: "interface",
734
+ name: "io.Closer",
735
+ methods: new Map([
736
+ ["Close", { kind: "func", params: [], returns: [ERROR] }],
737
+ ]),
738
+ };
739
+ const IO_READWRITER = {
740
+ kind: "interface",
741
+ name: "io.ReadWriter",
742
+ methods: new Map([
743
+ [
744
+ "Read",
745
+ { kind: "func", params: [BYTE_SLICE_IO], returns: [INT, ERROR] },
746
+ ],
747
+ [
748
+ "Write",
749
+ { kind: "func", params: [BYTE_SLICE_IO], returns: [INT, ERROR] },
750
+ ],
751
+ ]),
752
+ };
592
753
  globals.define("io", {
593
754
  kind: "namespace",
594
755
  name: "io",
595
756
  members: {
596
- Writer: ANY,
597
- Reader: ANY,
757
+ Writer: IO_WRITER,
758
+ Reader: IO_READER,
759
+ Closer: IO_CLOSER,
760
+ ReadWriter: IO_READWRITER,
598
761
  EOF: ERROR,
762
+ ErrUnexpectedEOF: ERROR,
763
+ ErrShortWrite: ERROR,
599
764
  WriteString: {
600
765
  kind: "func",
601
- params: [ANY, STRING],
766
+ params: [IO_WRITER, STRING],
767
+ returns: [INT, ERROR],
768
+ },
769
+ ReadFull: {
770
+ kind: "func",
771
+ params: [IO_READER, BYTE_SLICE_IO],
602
772
  returns: [INT, ERROR],
603
773
  },
604
- ReadAll: { kind: "func", params: [ANY], returns: [BYTE_SLICE_IO, ERROR] },
605
- Discard: ANY,
774
+ ReadAll: {
775
+ kind: "func",
776
+ params: [IO_READER],
777
+ returns: [BYTE_SLICE_IO, ERROR],
778
+ },
779
+ LimitReader: {
780
+ kind: "func",
781
+ params: [IO_READER, INT64],
782
+ returns: [IO_READER],
783
+ },
784
+ Copy: {
785
+ kind: "func",
786
+ params: [IO_WRITER, IO_READER],
787
+ returns: [INT64, ERROR],
788
+ },
789
+ CopyN: {
790
+ kind: "func",
791
+ params: [IO_WRITER, IO_READER, INT64],
792
+ returns: [INT64, ERROR],
793
+ },
794
+ Discard: IO_WRITER,
606
795
  },
607
796
  });
608
- types.set("io.Writer", ANY);
609
- types.set("io.Reader", ANY);
797
+ types.set("io.Writer", IO_WRITER);
798
+ types.set("io.Reader", IO_READER);
799
+ types.set("io.Closer", IO_CLOSER);
800
+ types.set("io.ReadWriter", IO_READWRITER);
610
801
  }