gofront 0.0.9 → 1.0.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 (53) hide show
  1. package/README.md +5 -5
  2. package/package.json +7 -4
  3. package/src/cli-core.js +65 -0
  4. package/src/codegen/expressions.js +523 -1717
  5. package/src/codegen/index.js +576 -0
  6. package/src/codegen/runtime.js +151 -0
  7. package/src/codegen/statements.js +308 -296
  8. package/src/codegen/stdlib/builder.js +39 -0
  9. package/src/codegen/stdlib/bytes.js +65 -0
  10. package/src/codegen/stdlib/errors.js +20 -0
  11. package/src/codegen/stdlib/fmt.js +104 -0
  12. package/src/codegen/stdlib/gom.js +155 -0
  13. package/src/codegen/stdlib/html.js +20 -0
  14. package/src/codegen/stdlib/index.js +98 -0
  15. package/src/codegen/stdlib/io.js +36 -0
  16. package/src/codegen/stdlib/maps.js +45 -0
  17. package/src/codegen/stdlib/math.js +56 -0
  18. package/src/codegen/stdlib/os.js +13 -0
  19. package/src/codegen/stdlib/path.js +34 -0
  20. package/src/codegen/stdlib/rand.js +27 -0
  21. package/src/codegen/stdlib/regexp.js +54 -0
  22. package/src/codegen/stdlib/slices.js +51 -0
  23. package/src/codegen/stdlib/sort.js +31 -0
  24. package/src/codegen/stdlib/strconv.js +33 -0
  25. package/src/codegen/stdlib/strings.js +86 -0
  26. package/src/codegen/stdlib/time.js +57 -0
  27. package/src/codegen/stdlib/unicode.js +25 -0
  28. package/src/codegen/stdlib/utf8.js +26 -0
  29. package/src/codegen/templ.js +284 -0
  30. package/src/compiler.js +142 -77
  31. package/src/dts-parser.js +355 -371
  32. package/src/index.js +32 -162
  33. package/src/lexer.js +186 -272
  34. package/src/minifier.js +305 -318
  35. package/src/{parser.js → parser/declarations.js} +18 -175
  36. package/src/parser/expressions.js +51 -34
  37. package/src/parser/index.js +161 -0
  38. package/src/parser/statements.js +24 -34
  39. package/src/parser/types.js +31 -29
  40. package/src/templ-parser.js +2 -2
  41. package/src/tokens.js +109 -0
  42. package/src/typechecker/assignability.js +261 -0
  43. package/src/typechecker/expressions.js +568 -549
  44. package/src/typechecker/index.js +556 -0
  45. package/src/typechecker/resolve.js +428 -0
  46. package/src/typechecker/statements.js +270 -280
  47. package/src/typechecker/stdlib/core.js +592 -0
  48. package/src/typechecker/stdlib/extended.js +332 -0
  49. package/src/typechecker/stdlib.js +9 -1060
  50. package/src/typechecker/termination.js +86 -0
  51. package/src/typechecker/types.js +1 -0
  52. package/src/codegen.js +0 -882
  53. package/src/typechecker.js +0 -1299
@@ -0,0 +1,592 @@
1
+ // Core standard library type definitions — browser globals, fmt, strings, bytes,
2
+ // strconv, sort, math, errors, time, unicode, os, slices, html, io.
3
+
4
+ import { ANY, BOOL, ERROR, FLOAT64, INT, STRING, VOID } from "../types.js";
5
+
6
+ const TIME_T = { kind: "named", name: "time.Time", underlying: ANY };
7
+
8
+ export function setupCoreGlobals(globals, types) {
9
+ const browserGlobals = [
10
+ "console",
11
+ "document",
12
+ "window",
13
+ "navigator",
14
+ "location",
15
+ "history",
16
+ "screen",
17
+ "performance",
18
+ "crypto",
19
+ "indexedDB",
20
+ "fetch",
21
+ "setTimeout",
22
+ "setInterval",
23
+ "clearTimeout",
24
+ "clearInterval",
25
+ "requestAnimationFrame",
26
+ "cancelAnimationFrame",
27
+ "Math",
28
+ "JSON",
29
+ "Date",
30
+ "RegExp",
31
+ "Promise",
32
+ "Error",
33
+ "Symbol",
34
+ "String",
35
+ "Number",
36
+ "Boolean",
37
+ "Array",
38
+ "Object",
39
+ "parseInt",
40
+ "parseFloat",
41
+ "isNaN",
42
+ "isFinite",
43
+ "encodeURIComponent",
44
+ "decodeURIComponent",
45
+ "atob",
46
+ "btoa",
47
+ "alert",
48
+ "confirm",
49
+ "prompt",
50
+ "localStorage",
51
+ "sessionStorage",
52
+ "WebSocket",
53
+ "Worker",
54
+ "HTMLElement",
55
+ "Element",
56
+ "Event",
57
+ "CustomEvent",
58
+ "URL",
59
+ "URLSearchParams",
60
+ "FormData",
61
+ "Headers",
62
+ "Request",
63
+ "Response",
64
+ "Blob",
65
+ "File",
66
+ "FileReader",
67
+ "ArrayBuffer",
68
+ "Uint8Array",
69
+ "TextEncoder",
70
+ "TextDecoder",
71
+ "WebGLRenderingContext",
72
+ "WebGL2RenderingContext",
73
+ "GPUDevice",
74
+ "GPUAdapter",
75
+ ];
76
+ for (const g of browserGlobals) globals.define(g, ANY);
77
+
78
+ const fmtVariadic = (ret) => ({
79
+ kind: "func",
80
+ params: [STRING, ANY],
81
+ returns: [ret],
82
+ variadic: true,
83
+ });
84
+ globals.define("fmt", {
85
+ kind: "namespace",
86
+ name: "fmt",
87
+ members: {
88
+ Sprintf: fmtVariadic(STRING),
89
+ Errorf: fmtVariadic(ERROR),
90
+ Printf: fmtVariadic(VOID),
91
+ Println: fmtVariadic(VOID),
92
+ Print: fmtVariadic(VOID),
93
+ Fprintf: {
94
+ kind: "func",
95
+ params: [ANY, STRING],
96
+ returns: [INT, ERROR],
97
+ variadic: true,
98
+ },
99
+ Fprintln: {
100
+ kind: "func",
101
+ params: [ANY],
102
+ returns: [INT, ERROR],
103
+ variadic: true,
104
+ },
105
+ Fprint: {
106
+ kind: "func",
107
+ params: [ANY],
108
+ returns: [INT, ERROR],
109
+ variadic: true,
110
+ },
111
+ Sscan: {
112
+ kind: "func",
113
+ params: [STRING, ANY],
114
+ returns: [INT, ERROR],
115
+ variadic: true,
116
+ },
117
+ Sscanln: {
118
+ kind: "func",
119
+ params: [STRING, ANY],
120
+ returns: [INT, ERROR],
121
+ variadic: true,
122
+ },
123
+ Sscanf: {
124
+ kind: "func",
125
+ params: [STRING, STRING, ANY],
126
+ returns: [INT, ERROR],
127
+ variadic: true,
128
+ },
129
+ },
130
+ });
131
+
132
+ const strFn1 = (ret) => ({ kind: "func", params: [STRING], returns: [ret] });
133
+ const strFn2 = (p2, ret) => ({
134
+ kind: "func",
135
+ params: [STRING, p2],
136
+ returns: [ret],
137
+ });
138
+ const strFn3 = (p2, p3, ret) => ({
139
+ kind: "func",
140
+ params: [STRING, p2, p3],
141
+ returns: [ret],
142
+ });
143
+ globals.define("strings", {
144
+ kind: "namespace",
145
+ name: "strings",
146
+ members: {
147
+ Contains: strFn2(STRING, BOOL),
148
+ HasPrefix: strFn2(STRING, BOOL),
149
+ HasSuffix: strFn2(STRING, BOOL),
150
+ Index: strFn2(STRING, INT),
151
+ LastIndex: strFn2(STRING, INT),
152
+ Count: strFn2(STRING, INT),
153
+ Repeat: strFn2(INT, STRING),
154
+ Replace: {
155
+ kind: "func",
156
+ params: [STRING, STRING, STRING, INT],
157
+ returns: [STRING],
158
+ },
159
+ ReplaceAll: strFn3(STRING, STRING, STRING),
160
+ ToUpper: strFn1(STRING),
161
+ ToLower: strFn1(STRING),
162
+ TrimSpace: strFn1(STRING),
163
+ Trim: strFn2(STRING, STRING),
164
+ TrimPrefix: strFn2(STRING, STRING),
165
+ TrimSuffix: strFn2(STRING, STRING),
166
+ TrimLeft: strFn2(STRING, STRING),
167
+ TrimRight: strFn2(STRING, STRING),
168
+ Split: strFn2(STRING, { kind: "slice", elem: STRING }),
169
+ Join: {
170
+ kind: "func",
171
+ params: [{ kind: "slice", elem: STRING }, STRING],
172
+ returns: [STRING],
173
+ },
174
+ EqualFold: strFn2(STRING, BOOL),
175
+ Fields: strFn1({ kind: "slice", elem: STRING }),
176
+ Cut: {
177
+ kind: "func",
178
+ params: [STRING, STRING],
179
+ returns: [STRING, STRING, BOOL],
180
+ },
181
+ CutPrefix: {
182
+ kind: "func",
183
+ params: [STRING, STRING],
184
+ returns: [STRING, BOOL],
185
+ },
186
+ CutSuffix: {
187
+ kind: "func",
188
+ params: [STRING, STRING],
189
+ returns: [STRING, BOOL],
190
+ },
191
+ SplitN: strFn3(STRING, INT, { kind: "slice", elem: STRING }),
192
+ SplitAfter: strFn2(STRING, { kind: "slice", elem: STRING }),
193
+ SplitAfterN: strFn3(STRING, INT, { kind: "slice", elem: STRING }),
194
+ IndexAny: strFn2(STRING, INT),
195
+ LastIndexAny: strFn2(STRING, INT),
196
+ ContainsAny: strFn2(STRING, BOOL),
197
+ ContainsRune: strFn2(INT, BOOL),
198
+ IndexRune: strFn2(INT, INT),
199
+ IndexByte: strFn2(INT, INT),
200
+ LastIndexByte: strFn2(INT, INT),
201
+ Map: {
202
+ kind: "func",
203
+ params: [ANY, STRING],
204
+ returns: [STRING],
205
+ },
206
+ Title: strFn1(STRING),
207
+ ToTitle: strFn1(STRING),
208
+ TrimFunc: { kind: "func", params: [STRING, ANY], returns: [STRING] },
209
+ TrimLeftFunc: { kind: "func", params: [STRING, ANY], returns: [STRING] },
210
+ TrimRightFunc: { kind: "func", params: [STRING, ANY], returns: [STRING] },
211
+ IndexFunc: { kind: "func", params: [STRING, ANY], returns: [INT] },
212
+ LastIndexFunc: { kind: "func", params: [STRING, ANY], returns: [INT] },
213
+ NewReplacer: {
214
+ kind: "func",
215
+ params: [STRING],
216
+ returns: [ANY],
217
+ variadic: true,
218
+ },
219
+ NewReader: { kind: "func", params: [STRING], returns: [ANY] },
220
+ },
221
+ });
222
+
223
+ const BYTE_SLICE = { kind: "slice", elem: INT };
224
+ const byFn1 = (ret) => ({
225
+ kind: "func",
226
+ params: [BYTE_SLICE],
227
+ returns: [ret],
228
+ });
229
+ const byFn2 = (p2, ret) => ({
230
+ kind: "func",
231
+ params: [BYTE_SLICE, p2],
232
+ returns: [ret],
233
+ });
234
+ globals.define("bytes", {
235
+ kind: "namespace",
236
+ name: "bytes",
237
+ members: {
238
+ Contains: byFn2(BYTE_SLICE, BOOL),
239
+ HasPrefix: byFn2(BYTE_SLICE, BOOL),
240
+ HasSuffix: byFn2(BYTE_SLICE, BOOL),
241
+ Index: byFn2(BYTE_SLICE, INT),
242
+ Count: byFn2(BYTE_SLICE, INT),
243
+ Repeat: byFn2(INT, BYTE_SLICE),
244
+ Replace: {
245
+ kind: "func",
246
+ params: [BYTE_SLICE, BYTE_SLICE, BYTE_SLICE, INT],
247
+ returns: [BYTE_SLICE],
248
+ },
249
+ ToUpper: byFn1(BYTE_SLICE),
250
+ ToLower: byFn1(BYTE_SLICE),
251
+ TrimSpace: byFn1(BYTE_SLICE),
252
+ Trim: byFn2(STRING, BYTE_SLICE),
253
+ Equal: byFn2(BYTE_SLICE, BOOL),
254
+ Split: byFn2(BYTE_SLICE, { kind: "slice", elem: BYTE_SLICE }),
255
+ Join: {
256
+ kind: "func",
257
+ params: [{ kind: "slice", elem: BYTE_SLICE }, BYTE_SLICE],
258
+ returns: [BYTE_SLICE],
259
+ },
260
+ ReplaceAll: {
261
+ kind: "func",
262
+ params: [BYTE_SLICE, BYTE_SLICE, BYTE_SLICE],
263
+ returns: [BYTE_SLICE],
264
+ },
265
+ TrimPrefix: byFn2(BYTE_SLICE, BYTE_SLICE),
266
+ TrimSuffix: byFn2(BYTE_SLICE, BYTE_SLICE),
267
+ TrimLeft: byFn2(STRING, BYTE_SLICE),
268
+ TrimRight: byFn2(STRING, BYTE_SLICE),
269
+ TrimFunc: {
270
+ kind: "func",
271
+ params: [BYTE_SLICE, ANY],
272
+ returns: [BYTE_SLICE],
273
+ },
274
+ IndexByte: byFn2(INT, INT),
275
+ LastIndex: byFn2(BYTE_SLICE, INT),
276
+ LastIndexByte: byFn2(INT, INT),
277
+ Fields: byFn1({ kind: "slice", elem: BYTE_SLICE }),
278
+ Cut: {
279
+ kind: "func",
280
+ params: [BYTE_SLICE, BYTE_SLICE],
281
+ returns: [BYTE_SLICE, BYTE_SLICE, BOOL],
282
+ },
283
+ ContainsAny: byFn2(STRING, BOOL),
284
+ ContainsRune: byFn2(INT, BOOL),
285
+ Map: { kind: "func", params: [ANY, BYTE_SLICE], returns: [BYTE_SLICE] },
286
+ SplitN: {
287
+ kind: "func",
288
+ params: [BYTE_SLICE, BYTE_SLICE, INT],
289
+ returns: [{ kind: "slice", elem: BYTE_SLICE }],
290
+ },
291
+ NewReader: { kind: "func", params: [BYTE_SLICE], returns: [ANY] },
292
+ },
293
+ });
294
+
295
+ globals.define("strconv", {
296
+ kind: "namespace",
297
+ name: "strconv",
298
+ members: {
299
+ Itoa: { kind: "func", params: [INT], returns: [STRING] },
300
+ Atoi: { kind: "func", params: [STRING], returns: [INT, ERROR] },
301
+ FormatFloat: {
302
+ kind: "func",
303
+ params: [FLOAT64, INT, INT, INT],
304
+ returns: [STRING],
305
+ },
306
+ FormatBool: { kind: "func", params: [BOOL], returns: [STRING] },
307
+ FormatInt: { kind: "func", params: [INT, INT], returns: [STRING] },
308
+ ParseFloat: {
309
+ kind: "func",
310
+ params: [STRING, INT],
311
+ returns: [FLOAT64, ERROR],
312
+ },
313
+ ParseInt: {
314
+ kind: "func",
315
+ params: [STRING, INT, INT],
316
+ returns: [INT, ERROR],
317
+ },
318
+ ParseBool: { kind: "func", params: [STRING], returns: [BOOL, ERROR] },
319
+ Quote: { kind: "func", params: [STRING], returns: [STRING] },
320
+ Unquote: { kind: "func", params: [STRING], returns: [STRING, ERROR] },
321
+ AppendInt: {
322
+ kind: "func",
323
+ params: [{ kind: "slice", elem: INT }, INT, INT],
324
+ returns: [{ kind: "slice", elem: INT }],
325
+ },
326
+ AppendFloat: {
327
+ kind: "func",
328
+ params: [{ kind: "slice", elem: INT }, FLOAT64, INT, INT, INT],
329
+ returns: [{ kind: "slice", elem: INT }],
330
+ },
331
+ },
332
+ });
333
+
334
+ globals.define("sort", {
335
+ kind: "namespace",
336
+ name: "sort",
337
+ members: {
338
+ Ints: {
339
+ kind: "func",
340
+ params: [{ kind: "slice", elem: INT }],
341
+ returns: [VOID],
342
+ },
343
+ Float64s: {
344
+ kind: "func",
345
+ params: [{ kind: "slice", elem: FLOAT64 }],
346
+ returns: [VOID],
347
+ },
348
+ Strings: {
349
+ kind: "func",
350
+ params: [{ kind: "slice", elem: STRING }],
351
+ returns: [VOID],
352
+ },
353
+ Slice: { kind: "func", params: [ANY, ANY], returns: [VOID] },
354
+ SliceStable: { kind: "func", params: [ANY, ANY], returns: [VOID] },
355
+ SliceIsSorted: { kind: "func", params: [ANY, ANY], returns: [BOOL] },
356
+ Search: { kind: "func", params: [INT, ANY], returns: [INT] },
357
+ IntsAreSorted: {
358
+ kind: "func",
359
+ params: [{ kind: "slice", elem: INT }],
360
+ returns: [BOOL],
361
+ },
362
+ Float64sAreSorted: {
363
+ kind: "func",
364
+ params: [{ kind: "slice", elem: FLOAT64 }],
365
+ returns: [BOOL],
366
+ },
367
+ StringsAreSorted: {
368
+ kind: "func",
369
+ params: [{ kind: "slice", elem: STRING }],
370
+ returns: [BOOL],
371
+ },
372
+ },
373
+ });
374
+
375
+ globals.define("math", {
376
+ kind: "namespace",
377
+ name: "math",
378
+ members: {
379
+ Abs: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
380
+ Floor: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
381
+ Ceil: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
382
+ Round: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
383
+ Sqrt: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
384
+ Cbrt: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
385
+ Pow: { kind: "func", params: [FLOAT64, FLOAT64], returns: [FLOAT64] },
386
+ Log: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
387
+ Log2: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
388
+ Log10: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
389
+ Sin: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
390
+ Cos: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
391
+ Tan: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
392
+ Min: { kind: "func", params: [FLOAT64, FLOAT64], returns: [FLOAT64] },
393
+ Max: { kind: "func", params: [FLOAT64, FLOAT64], returns: [FLOAT64] },
394
+ Mod: { kind: "func", params: [FLOAT64, FLOAT64], returns: [FLOAT64] },
395
+ Inf: { kind: "func", params: [INT], returns: [FLOAT64] },
396
+ IsNaN: { kind: "func", params: [FLOAT64], returns: [BOOL] },
397
+ IsInf: { kind: "func", params: [FLOAT64, INT], returns: [BOOL] },
398
+ NaN: { kind: "func", params: [], returns: [FLOAT64] },
399
+ Atan: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
400
+ Atan2: { kind: "func", params: [FLOAT64, FLOAT64], returns: [FLOAT64] },
401
+ Asin: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
402
+ Acos: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
403
+ Exp: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
404
+ Exp2: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
405
+ Trunc: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
406
+ Hypot: { kind: "func", params: [FLOAT64, FLOAT64], returns: [FLOAT64] },
407
+ Signbit: { kind: "func", params: [FLOAT64], returns: [BOOL] },
408
+ Copysign: {
409
+ kind: "func",
410
+ params: [FLOAT64, FLOAT64],
411
+ returns: [FLOAT64],
412
+ },
413
+ Dim: { kind: "func", params: [FLOAT64, FLOAT64], returns: [FLOAT64] },
414
+ Remainder: {
415
+ kind: "func",
416
+ params: [FLOAT64, FLOAT64],
417
+ returns: [FLOAT64],
418
+ },
419
+ Pi: FLOAT64,
420
+ E: FLOAT64,
421
+ MaxFloat64: FLOAT64,
422
+ SmallestNonzeroFloat64: FLOAT64,
423
+ MaxInt: INT,
424
+ MinInt: INT,
425
+ },
426
+ });
427
+
428
+ globals.define("errors", {
429
+ kind: "namespace",
430
+ name: "errors",
431
+ members: {
432
+ New: { kind: "func", params: [STRING], returns: [ERROR] },
433
+ Is: { kind: "func", params: [ERROR, ERROR], returns: [BOOL] },
434
+ Unwrap: { kind: "func", params: [ERROR], returns: [ERROR] },
435
+ },
436
+ });
437
+
438
+ globals.define("time", {
439
+ kind: "namespace",
440
+ name: "time",
441
+ members: {
442
+ Now: { kind: "func", params: [], returns: [TIME_T] },
443
+ Since: { kind: "func", params: [TIME_T], returns: [INT] },
444
+ Sleep: { kind: "func", params: [ANY], returns: [VOID], async: true },
445
+ Parse: {
446
+ kind: "func",
447
+ params: [STRING, STRING],
448
+ returns: [TIME_T, ERROR],
449
+ },
450
+ Unix: { kind: "func", params: [INT, INT], returns: [TIME_T] },
451
+ Date: {
452
+ kind: "func",
453
+ params: [INT, INT, INT, INT, INT, INT, INT, ANY],
454
+ returns: [TIME_T],
455
+ },
456
+ Millisecond: INT,
457
+ Second: INT,
458
+ Minute: INT,
459
+ Hour: INT,
460
+ RFC3339: STRING,
461
+ RFC3339Nano: STRING,
462
+ DateOnly: STRING,
463
+ TimeOnly: STRING,
464
+ DateTime: STRING,
465
+ UTC: ANY,
466
+ Local: ANY,
467
+ January: INT,
468
+ February: INT,
469
+ March: INT,
470
+ April: INT,
471
+ May: INT,
472
+ June: INT,
473
+ July: INT,
474
+ August: INT,
475
+ September: INT,
476
+ October: INT,
477
+ November: INT,
478
+ December: INT,
479
+ Sunday: INT,
480
+ Monday: INT,
481
+ Tuesday: INT,
482
+ Wednesday: INT,
483
+ Thursday: INT,
484
+ Friday: INT,
485
+ Saturday: INT,
486
+ },
487
+ });
488
+ types.set("time.Time", TIME_T);
489
+
490
+ const runeToStr = { kind: "func", params: [INT], returns: [BOOL] };
491
+ const runeTrans = { kind: "func", params: [INT], returns: [INT] };
492
+ globals.define("unicode", {
493
+ kind: "namespace",
494
+ name: "unicode",
495
+ members: {
496
+ IsLetter: runeToStr,
497
+ IsDigit: runeToStr,
498
+ IsSpace: runeToStr,
499
+ IsUpper: runeToStr,
500
+ IsLower: runeToStr,
501
+ IsPunct: runeToStr,
502
+ IsControl: runeToStr,
503
+ IsPrint: runeToStr,
504
+ IsGraphic: runeToStr,
505
+ ToUpper: runeTrans,
506
+ ToLower: runeTrans,
507
+ },
508
+ });
509
+
510
+ globals.define("os", {
511
+ kind: "namespace",
512
+ name: "os",
513
+ members: {
514
+ Exit: { kind: "func", params: [INT], returns: [VOID] },
515
+ Args: { kind: "slice", elem: STRING },
516
+ Getenv: { kind: "func", params: [STRING], returns: [STRING] },
517
+ Stdout: ANY,
518
+ Stderr: ANY,
519
+ Stdin: ANY,
520
+ },
521
+ });
522
+
523
+ globals.define("slices", {
524
+ kind: "namespace",
525
+ name: "slices",
526
+ members: {
527
+ Contains: { kind: "func", params: [ANY, ANY], returns: [BOOL] },
528
+ Index: { kind: "func", params: [ANY, ANY], returns: [INT] },
529
+ Equal: { kind: "func", params: [ANY, ANY], returns: [BOOL] },
530
+ Compare: { kind: "func", params: [ANY, ANY], returns: [INT] },
531
+ Sort: { kind: "func", params: [ANY], returns: [VOID] },
532
+ SortFunc: { kind: "func", params: [ANY, ANY], returns: [VOID] },
533
+ SortStableFunc: { kind: "func", params: [ANY, ANY], returns: [VOID] },
534
+ IsSorted: { kind: "func", params: [ANY], returns: [BOOL] },
535
+ IsSortedFunc: { kind: "func", params: [ANY, ANY], returns: [BOOL] },
536
+ Reverse: { kind: "func", params: [ANY], returns: [VOID] },
537
+ Max: { kind: "func", params: [ANY], returns: [ANY] },
538
+ Min: { kind: "func", params: [ANY], returns: [ANY] },
539
+ MaxFunc: { kind: "func", params: [ANY, ANY], returns: [ANY] },
540
+ MinFunc: { kind: "func", params: [ANY, ANY], returns: [ANY] },
541
+ Clone: { kind: "func", params: [ANY], returns: [ANY] },
542
+ Compact: { kind: "func", params: [ANY], returns: [ANY] },
543
+ CompactFunc: { kind: "func", params: [ANY, ANY], returns: [ANY] },
544
+ Concat: { kind: "func", params: [ANY], returns: [ANY], variadic: true },
545
+ Delete: { kind: "func", params: [ANY, INT, INT], returns: [ANY] },
546
+ DeleteFunc: { kind: "func", params: [ANY, ANY], returns: [ANY] },
547
+ Insert: {
548
+ kind: "func",
549
+ params: [ANY, INT, ANY],
550
+ returns: [ANY],
551
+ variadic: true,
552
+ },
553
+ Replace: {
554
+ kind: "func",
555
+ params: [ANY, INT, INT, ANY],
556
+ returns: [ANY],
557
+ variadic: true,
558
+ },
559
+ Grow: { kind: "func", params: [ANY, INT], returns: [ANY] },
560
+ Clip: { kind: "func", params: [ANY], returns: [ANY] },
561
+ },
562
+ });
563
+
564
+ globals.define("html", {
565
+ kind: "namespace",
566
+ name: "html",
567
+ members: {
568
+ EscapeString: { kind: "func", params: [STRING], returns: [STRING] },
569
+ UnescapeString: { kind: "func", params: [STRING], returns: [STRING] },
570
+ },
571
+ });
572
+
573
+ const BYTE_SLICE_IO = { kind: "slice", elem: INT };
574
+ globals.define("io", {
575
+ kind: "namespace",
576
+ name: "io",
577
+ members: {
578
+ Writer: ANY,
579
+ Reader: ANY,
580
+ EOF: ERROR,
581
+ WriteString: {
582
+ kind: "func",
583
+ params: [ANY, STRING],
584
+ returns: [INT, ERROR],
585
+ },
586
+ ReadAll: { kind: "func", params: [ANY], returns: [BYTE_SLICE_IO, ERROR] },
587
+ Discard: ANY,
588
+ },
589
+ });
590
+ types.set("io.Writer", ANY);
591
+ types.set("io.Reader", ANY);
592
+ }