gofront 0.0.5 → 0.0.7

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.
@@ -0,0 +1,764 @@
1
+ // stdlib.js — built-in namespace and browser-global registration for the GoFront type
2
+ // checker. Called once from TypeChecker._setupGlobals() during construction.
3
+ //
4
+ // Exports a single function:
5
+ // setupGlobals(globals, types)
6
+ // globals — the root Scope instance (TypeChecker.globals)
7
+ // types — the named-type Map (TypeChecker.types)
8
+
9
+ import { ANY, BOOL, ERROR, FLOAT64, INT, STRING, VOID } from "./types.js";
10
+
11
+ export function setupGlobals(globals, types) {
12
+ // Browser globals — typed as 'any' so any access/call is permitted
13
+ const browserGlobals = [
14
+ "console",
15
+ "document",
16
+ "window",
17
+ "navigator",
18
+ "location",
19
+ "history",
20
+ "screen",
21
+ "performance",
22
+ "crypto",
23
+ "indexedDB",
24
+ "fetch",
25
+ "setTimeout",
26
+ "setInterval",
27
+ "clearTimeout",
28
+ "clearInterval",
29
+ "requestAnimationFrame",
30
+ "cancelAnimationFrame",
31
+ "Math",
32
+ "JSON",
33
+ "Date",
34
+ "RegExp",
35
+ "Promise",
36
+ "Error",
37
+ "Symbol",
38
+ "String",
39
+ "Number",
40
+ "Boolean",
41
+ "Array",
42
+ "Object",
43
+ "parseInt",
44
+ "parseFloat",
45
+ "isNaN",
46
+ "isFinite",
47
+ "encodeURIComponent",
48
+ "decodeURIComponent",
49
+ "atob",
50
+ "btoa",
51
+ "alert",
52
+ "confirm",
53
+ "prompt",
54
+ "localStorage",
55
+ "sessionStorage",
56
+ "WebSocket",
57
+ "Worker",
58
+ "HTMLElement",
59
+ "Element",
60
+ "Event",
61
+ "CustomEvent",
62
+ "URL",
63
+ "URLSearchParams",
64
+ "FormData",
65
+ "Headers",
66
+ "Request",
67
+ "Response",
68
+ "Blob",
69
+ "File",
70
+ "FileReader",
71
+ "ArrayBuffer",
72
+ "Uint8Array",
73
+ "TextEncoder",
74
+ "TextDecoder",
75
+ "WebGLRenderingContext",
76
+ "WebGL2RenderingContext",
77
+ "GPUDevice",
78
+ "GPUAdapter",
79
+ ];
80
+ for (const g of browserGlobals) globals.define(g, ANY);
81
+
82
+ // fmt package — string formatting (variadic: format string + any args)
83
+ const fmtVariadic = (ret) => ({
84
+ kind: "func",
85
+ params: [STRING, ANY],
86
+ returns: [ret],
87
+ variadic: true,
88
+ });
89
+ globals.define("fmt", {
90
+ kind: "namespace",
91
+ name: "fmt",
92
+ members: {
93
+ Sprintf: fmtVariadic(STRING),
94
+ Errorf: fmtVariadic(ERROR),
95
+ Printf: fmtVariadic(VOID),
96
+ Println: fmtVariadic(VOID),
97
+ Print: fmtVariadic(VOID),
98
+ Fprintf: {
99
+ kind: "func",
100
+ params: [ANY, STRING],
101
+ returns: [INT, ERROR],
102
+ variadic: true,
103
+ },
104
+ Fprintln: {
105
+ kind: "func",
106
+ params: [ANY],
107
+ returns: [INT, ERROR],
108
+ variadic: true,
109
+ },
110
+ Fprint: {
111
+ kind: "func",
112
+ params: [ANY],
113
+ returns: [INT, ERROR],
114
+ variadic: true,
115
+ },
116
+ },
117
+ });
118
+
119
+ // strings package
120
+ const strFn1 = (ret) => ({
121
+ kind: "func",
122
+ params: [STRING],
123
+ returns: [ret],
124
+ });
125
+ const strFn2 = (p2, ret) => ({
126
+ kind: "func",
127
+ params: [STRING, p2],
128
+ returns: [ret],
129
+ });
130
+ const strFn3 = (p2, p3, ret) => ({
131
+ kind: "func",
132
+ params: [STRING, p2, p3],
133
+ returns: [ret],
134
+ });
135
+ globals.define("strings", {
136
+ kind: "namespace",
137
+ name: "strings",
138
+ members: {
139
+ Contains: strFn2(STRING, BOOL),
140
+ HasPrefix: strFn2(STRING, BOOL),
141
+ HasSuffix: strFn2(STRING, BOOL),
142
+ Index: strFn2(STRING, INT),
143
+ LastIndex: strFn2(STRING, INT),
144
+ Count: strFn2(STRING, INT),
145
+ Repeat: strFn2(INT, STRING),
146
+ Replace: {
147
+ kind: "func",
148
+ params: [STRING, STRING, STRING, INT],
149
+ returns: [STRING],
150
+ },
151
+ ReplaceAll: strFn3(STRING, STRING, STRING),
152
+ ToUpper: strFn1(STRING),
153
+ ToLower: strFn1(STRING),
154
+ TrimSpace: strFn1(STRING),
155
+ Trim: strFn2(STRING, STRING),
156
+ TrimPrefix: strFn2(STRING, STRING),
157
+ TrimSuffix: strFn2(STRING, STRING),
158
+ TrimLeft: strFn2(STRING, STRING),
159
+ TrimRight: strFn2(STRING, STRING),
160
+ Split: strFn2(STRING, { kind: "slice", elem: STRING }),
161
+ Join: {
162
+ kind: "func",
163
+ params: [{ kind: "slice", elem: STRING }, STRING],
164
+ returns: [STRING],
165
+ },
166
+ EqualFold: strFn2(STRING, BOOL),
167
+ },
168
+ });
169
+
170
+ // bytes package — operates on []byte (JS arrays of numbers)
171
+ const BYTE_SLICE = { kind: "slice", elem: INT };
172
+ const byFn1 = (ret) => ({
173
+ kind: "func",
174
+ params: [BYTE_SLICE],
175
+ returns: [ret],
176
+ });
177
+ const byFn2 = (p2, ret) => ({
178
+ kind: "func",
179
+ params: [BYTE_SLICE, p2],
180
+ returns: [ret],
181
+ });
182
+ globals.define("bytes", {
183
+ kind: "namespace",
184
+ name: "bytes",
185
+ members: {
186
+ Contains: byFn2(BYTE_SLICE, BOOL),
187
+ HasPrefix: byFn2(BYTE_SLICE, BOOL),
188
+ HasSuffix: byFn2(BYTE_SLICE, BOOL),
189
+ Index: byFn2(BYTE_SLICE, INT),
190
+ Count: byFn2(BYTE_SLICE, INT),
191
+ Repeat: byFn2(INT, BYTE_SLICE),
192
+ Replace: {
193
+ kind: "func",
194
+ params: [BYTE_SLICE, BYTE_SLICE, BYTE_SLICE, INT],
195
+ returns: [BYTE_SLICE],
196
+ },
197
+ ToUpper: byFn1(BYTE_SLICE),
198
+ ToLower: byFn1(BYTE_SLICE),
199
+ TrimSpace: byFn1(BYTE_SLICE),
200
+ Trim: byFn2(STRING, BYTE_SLICE),
201
+ Equal: byFn2(BYTE_SLICE, BOOL),
202
+ Split: byFn2(BYTE_SLICE, { kind: "slice", elem: BYTE_SLICE }),
203
+ Join: {
204
+ kind: "func",
205
+ params: [{ kind: "slice", elem: BYTE_SLICE }, BYTE_SLICE],
206
+ returns: [BYTE_SLICE],
207
+ },
208
+ },
209
+ });
210
+
211
+ // strconv package
212
+ globals.define("strconv", {
213
+ kind: "namespace",
214
+ name: "strconv",
215
+ members: {
216
+ Itoa: { kind: "func", params: [INT], returns: [STRING] },
217
+ Atoi: {
218
+ kind: "func",
219
+ params: [STRING],
220
+ returns: [INT, ERROR],
221
+ },
222
+ FormatFloat: {
223
+ kind: "func",
224
+ params: [FLOAT64, INT, INT, INT],
225
+ returns: [STRING],
226
+ },
227
+ FormatBool: { kind: "func", params: [BOOL], returns: [STRING] },
228
+ FormatInt: { kind: "func", params: [INT, INT], returns: [STRING] },
229
+ ParseFloat: {
230
+ kind: "func",
231
+ params: [STRING, INT],
232
+ returns: [FLOAT64, ERROR],
233
+ },
234
+ ParseInt: {
235
+ kind: "func",
236
+ params: [STRING, INT, INT],
237
+ returns: [INT, ERROR],
238
+ },
239
+ ParseBool: {
240
+ kind: "func",
241
+ params: [STRING],
242
+ returns: [BOOL, ERROR],
243
+ },
244
+ },
245
+ });
246
+
247
+ // sort package
248
+ globals.define("sort", {
249
+ kind: "namespace",
250
+ name: "sort",
251
+ members: {
252
+ Ints: {
253
+ kind: "func",
254
+ params: [{ kind: "slice", elem: INT }],
255
+ returns: [VOID],
256
+ },
257
+ Float64s: {
258
+ kind: "func",
259
+ params: [{ kind: "slice", elem: FLOAT64 }],
260
+ returns: [VOID],
261
+ },
262
+ Strings: {
263
+ kind: "func",
264
+ params: [{ kind: "slice", elem: STRING }],
265
+ returns: [VOID],
266
+ },
267
+ Slice: {
268
+ kind: "func",
269
+ params: [ANY, ANY],
270
+ returns: [VOID],
271
+ },
272
+ SliceStable: {
273
+ kind: "func",
274
+ params: [ANY, ANY],
275
+ returns: [VOID],
276
+ },
277
+ SliceIsSorted: {
278
+ kind: "func",
279
+ params: [ANY, ANY],
280
+ returns: [BOOL],
281
+ },
282
+ },
283
+ });
284
+
285
+ // math package
286
+ globals.define("math", {
287
+ kind: "namespace",
288
+ name: "math",
289
+ members: {
290
+ Abs: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
291
+ Floor: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
292
+ Ceil: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
293
+ Round: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
294
+ Sqrt: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
295
+ Cbrt: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
296
+ Pow: {
297
+ kind: "func",
298
+ params: [FLOAT64, FLOAT64],
299
+ returns: [FLOAT64],
300
+ },
301
+ Log: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
302
+ Log2: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
303
+ Log10: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
304
+ Sin: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
305
+ Cos: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
306
+ Tan: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
307
+ Min: {
308
+ kind: "func",
309
+ params: [FLOAT64, FLOAT64],
310
+ returns: [FLOAT64],
311
+ },
312
+ Max: {
313
+ kind: "func",
314
+ params: [FLOAT64, FLOAT64],
315
+ returns: [FLOAT64],
316
+ },
317
+ Mod: {
318
+ kind: "func",
319
+ params: [FLOAT64, FLOAT64],
320
+ returns: [FLOAT64],
321
+ },
322
+ Inf: { kind: "func", params: [INT], returns: [FLOAT64] },
323
+ IsNaN: { kind: "func", params: [FLOAT64], returns: [BOOL] },
324
+ IsInf: {
325
+ kind: "func",
326
+ params: [FLOAT64, INT],
327
+ returns: [BOOL],
328
+ },
329
+ NaN: { kind: "func", params: [], returns: [FLOAT64] },
330
+ // Constants
331
+ Pi: FLOAT64,
332
+ E: FLOAT64,
333
+ MaxFloat64: FLOAT64,
334
+ SmallestNonzeroFloat64: FLOAT64,
335
+ MaxInt: INT,
336
+ MinInt: INT,
337
+ },
338
+ });
339
+
340
+ // errors package
341
+ globals.define("errors", {
342
+ kind: "namespace",
343
+ name: "errors",
344
+ members: {
345
+ New: { kind: "func", params: [STRING], returns: [ERROR] },
346
+ Is: { kind: "func", params: [ERROR, ERROR], returns: [BOOL] },
347
+ Unwrap: { kind: "func", params: [ERROR], returns: [ERROR] },
348
+ },
349
+ });
350
+
351
+ // time package (partial — JS-friendly subset)
352
+ globals.define("time", {
353
+ kind: "namespace",
354
+ name: "time",
355
+ members: {
356
+ Now: { kind: "func", params: [], returns: [ANY] },
357
+ Since: { kind: "func", params: [ANY], returns: [ANY] },
358
+ Sleep: { kind: "func", params: [ANY], returns: [VOID], async: true },
359
+ Millisecond: INT,
360
+ Second: INT,
361
+ Minute: INT,
362
+ Hour: INT,
363
+ },
364
+ });
365
+
366
+ // unicode package
367
+ const runeToStr = { kind: "func", params: [INT], returns: [BOOL] };
368
+ const runeTrans = { kind: "func", params: [INT], returns: [INT] };
369
+ globals.define("unicode", {
370
+ kind: "namespace",
371
+ name: "unicode",
372
+ members: {
373
+ IsLetter: runeToStr,
374
+ IsDigit: runeToStr,
375
+ IsSpace: runeToStr,
376
+ IsUpper: runeToStr,
377
+ IsLower: runeToStr,
378
+ IsPunct: runeToStr,
379
+ IsControl: runeToStr,
380
+ IsPrint: runeToStr,
381
+ IsGraphic: runeToStr,
382
+ ToUpper: runeTrans,
383
+ ToLower: runeTrans,
384
+ },
385
+ });
386
+
387
+ // os package (JS-friendly subset)
388
+ globals.define("os", {
389
+ kind: "namespace",
390
+ name: "os",
391
+ members: {
392
+ Exit: { kind: "func", params: [INT], returns: [VOID] },
393
+ Args: { kind: "slice", elem: STRING },
394
+ Getenv: { kind: "func", params: [STRING], returns: [STRING] },
395
+ Stdout: ANY,
396
+ Stderr: ANY,
397
+ Stdin: ANY,
398
+ },
399
+ });
400
+
401
+ // slices package (Go 1.21)
402
+ // Functions are generic — use ANY for slice params so any concrete slice type
403
+ // is accepted without an assignability error (same pattern as sort.Slice).
404
+ globals.define("slices", {
405
+ kind: "namespace",
406
+ name: "slices",
407
+ members: {
408
+ Contains: { kind: "func", params: [ANY, ANY], returns: [BOOL] },
409
+ Index: { kind: "func", params: [ANY, ANY], returns: [INT] },
410
+ Equal: { kind: "func", params: [ANY, ANY], returns: [BOOL] },
411
+ Compare: { kind: "func", params: [ANY, ANY], returns: [INT] },
412
+ Sort: { kind: "func", params: [ANY], returns: [VOID] },
413
+ SortFunc: { kind: "func", params: [ANY, ANY], returns: [VOID] },
414
+ SortStableFunc: { kind: "func", params: [ANY, ANY], returns: [VOID] },
415
+ IsSorted: { kind: "func", params: [ANY], returns: [BOOL] },
416
+ IsSortedFunc: { kind: "func", params: [ANY, ANY], returns: [BOOL] },
417
+ Reverse: { kind: "func", params: [ANY], returns: [VOID] },
418
+ Max: { kind: "func", params: [ANY], returns: [ANY] },
419
+ Min: { kind: "func", params: [ANY], returns: [ANY] },
420
+ MaxFunc: { kind: "func", params: [ANY, ANY], returns: [ANY] },
421
+ MinFunc: { kind: "func", params: [ANY, ANY], returns: [ANY] },
422
+ Clone: { kind: "func", params: [ANY], returns: [ANY] },
423
+ Compact: { kind: "func", params: [ANY], returns: [ANY] },
424
+ CompactFunc: { kind: "func", params: [ANY, ANY], returns: [ANY] },
425
+ Concat: { kind: "func", params: [ANY], returns: [ANY], variadic: true },
426
+ Delete: { kind: "func", params: [ANY, INT, INT], returns: [ANY] },
427
+ DeleteFunc: { kind: "func", params: [ANY, ANY], returns: [ANY] },
428
+ Insert: {
429
+ kind: "func",
430
+ params: [ANY, INT, ANY],
431
+ returns: [ANY],
432
+ variadic: true,
433
+ },
434
+ Replace: {
435
+ kind: "func",
436
+ params: [ANY, INT, INT, ANY],
437
+ returns: [ANY],
438
+ variadic: true,
439
+ },
440
+ Grow: { kind: "func", params: [ANY, INT], returns: [ANY] },
441
+ Clip: { kind: "func", params: [ANY], returns: [ANY] },
442
+ },
443
+ });
444
+
445
+ // html package
446
+ globals.define("html", {
447
+ kind: "namespace",
448
+ name: "html",
449
+ members: {
450
+ EscapeString: { kind: "func", params: [STRING], returns: [STRING] },
451
+ UnescapeString: { kind: "func", params: [STRING], returns: [STRING] },
452
+ },
453
+ });
454
+
455
+ // io package — Writer interface + WriteString
456
+ // io.Writer is typed as ANY so GoFront's built-in writer types (strings.Builder,
457
+ // bytes.Buffer) are accepted without explicit interface-satisfaction registration.
458
+ globals.define("io", {
459
+ kind: "namespace",
460
+ name: "io",
461
+ members: {
462
+ Writer: ANY,
463
+ EOF: ERROR,
464
+ WriteString: {
465
+ kind: "func",
466
+ params: [ANY, STRING],
467
+ returns: [INT, ERROR],
468
+ },
469
+ Discard: ANY,
470
+ },
471
+ });
472
+ // Register io.Writer as a type alias so it resolves in parameter/field annotations.
473
+ types.set("io.Writer", ANY);
474
+
475
+ // gom package — browser-native component built-in
476
+ const GOM_NODE_T = {
477
+ kind: "interface",
478
+ methods: new Map([
479
+ ["Mount", { kind: "func", params: [ANY], returns: [VOID] }],
480
+ ]),
481
+ };
482
+ const GOM_NODE_FUNC_T = {
483
+ kind: "named",
484
+ name: "gom.NodeFunc",
485
+ underlying: { kind: "func", params: [ANY], returns: [VOID] },
486
+ };
487
+ const GOM_GROUP_T = {
488
+ kind: "named",
489
+ name: "gom.Group",
490
+ underlying: { kind: "slice", elem: GOM_NODE_T },
491
+ };
492
+ const gomEl = {
493
+ kind: "func",
494
+ params: [GOM_NODE_T],
495
+ returns: [GOM_NODE_T],
496
+ variadic: true,
497
+ };
498
+ const gomAttr1 = { kind: "func", params: [STRING], returns: [GOM_NODE_T] };
499
+ const gomBoolAttr = { kind: "func", params: [], returns: [GOM_NODE_T] };
500
+ globals.define("gom", {
501
+ kind: "namespace",
502
+ name: "gom",
503
+ members: {
504
+ // Core types
505
+ Node: GOM_NODE_T,
506
+ NodeFunc: GOM_NODE_FUNC_T,
507
+ Group: GOM_GROUP_T,
508
+ // Core functions
509
+ El: {
510
+ kind: "func",
511
+ params: [STRING, GOM_NODE_T],
512
+ returns: [GOM_NODE_T],
513
+ variadic: true,
514
+ },
515
+ Text: { kind: "func", params: [STRING], returns: [GOM_NODE_T] },
516
+ Attr: { kind: "func", params: [STRING, STRING], returns: [GOM_NODE_T] },
517
+ Class: gomAttr1,
518
+ Type: gomAttr1,
519
+ Href: gomAttr1,
520
+ Src: gomAttr1,
521
+ Placeholder: gomAttr1,
522
+ DataAttr: {
523
+ kind: "func",
524
+ params: [STRING, STRING],
525
+ returns: [GOM_NODE_T],
526
+ },
527
+ If: { kind: "func", params: [BOOL, GOM_NODE_T], returns: [GOM_NODE_T] },
528
+ Map: { kind: "func", params: [ANY, ANY], returns: [GOM_NODE_T] },
529
+ Style: gomAttr1,
530
+ Mount: { kind: "func", params: [STRING, GOM_NODE_T], returns: [VOID] },
531
+ MountTo: {
532
+ kind: "func",
533
+ params: [STRING, GOM_NODE_T],
534
+ returns: [VOID],
535
+ },
536
+ // Block elements
537
+ Div: gomEl,
538
+ Section: gomEl,
539
+ Article: gomEl,
540
+ Aside: gomEl,
541
+ Header: gomEl,
542
+ Footer: gomEl,
543
+ Main: gomEl,
544
+ Nav: gomEl,
545
+ Figure: gomEl,
546
+ // Headings
547
+ H1: gomEl,
548
+ H2: gomEl,
549
+ H3: gomEl,
550
+ H4: gomEl,
551
+ H5: gomEl,
552
+ H6: gomEl,
553
+ // Inline elements
554
+ Span: gomEl,
555
+ A: gomEl,
556
+ Strong: gomEl,
557
+ Em: gomEl,
558
+ Code: gomEl,
559
+ Pre: gomEl,
560
+ Small: gomEl,
561
+ Mark: gomEl,
562
+ // Text-level
563
+ P: gomEl,
564
+ Br: gomEl,
565
+ Hr: gomEl,
566
+ // Lists
567
+ Ul: gomEl,
568
+ Ol: gomEl,
569
+ Li: gomEl,
570
+ Dl: gomEl,
571
+ Dt: gomEl,
572
+ Dd: gomEl,
573
+ // Forms
574
+ Form: gomEl,
575
+ Input: gomEl,
576
+ Button: gomEl,
577
+ Textarea: gomEl,
578
+ Select: gomEl,
579
+ Option: gomEl,
580
+ Label: gomEl,
581
+ Fieldset: gomEl,
582
+ Legend: gomEl,
583
+ // Media / table
584
+ Img: gomEl,
585
+ Video: gomEl,
586
+ Audio: gomEl,
587
+ Canvas: gomEl,
588
+ Table: gomEl,
589
+ Thead: gomEl,
590
+ Tbody: gomEl,
591
+ Tfoot: gomEl,
592
+ Tr: gomEl,
593
+ Th: gomEl,
594
+ Td: gomEl,
595
+ // Attribute helpers
596
+ For: gomAttr1,
597
+ Name: gomAttr1,
598
+ Value: gomAttr1,
599
+ Target: gomAttr1,
600
+ Rel: gomAttr1,
601
+ Alt: gomAttr1,
602
+ Title: gomAttr1,
603
+ Lang: gomAttr1,
604
+ Action: gomAttr1,
605
+ Method: gomAttr1,
606
+ AutoComplete: gomAttr1,
607
+ Draggable: gomAttr1,
608
+ Role: gomAttr1,
609
+ AriaLabel: gomAttr1,
610
+ StyleAttr: gomAttr1,
611
+ // Boolean attribute helpers
612
+ Disabled: gomBoolAttr,
613
+ Checked: gomBoolAttr,
614
+ Selected: gomBoolAttr,
615
+ Readonly: gomBoolAttr,
616
+ },
617
+ });
618
+ types.set("gom.Node", GOM_NODE_T);
619
+ types.set("gom.NodeFunc", GOM_NODE_FUNC_T);
620
+ types.set("gom.Group", GOM_GROUP_T);
621
+
622
+ // maps package (Go 1.21)
623
+ globals.define("maps", {
624
+ kind: "namespace",
625
+ name: "maps",
626
+ members: {
627
+ Keys: { kind: "func", params: [ANY], returns: [ANY] },
628
+ Values: { kind: "func", params: [ANY], returns: [ANY] },
629
+ Clone: { kind: "func", params: [ANY], returns: [ANY] },
630
+ Copy: { kind: "func", params: [ANY, ANY], returns: [VOID] },
631
+ Equal: { kind: "func", params: [ANY, ANY], returns: [BOOL] },
632
+ EqualFunc: { kind: "func", params: [ANY, ANY, ANY], returns: [BOOL] },
633
+ Delete: { kind: "func", params: [ANY, ANY], returns: [VOID] },
634
+ DeleteFunc: { kind: "func", params: [ANY, ANY], returns: [VOID] },
635
+ },
636
+ });
637
+
638
+ // regexp package
639
+ const REGEXP_T = {
640
+ kind: "named",
641
+ name: "regexp.Regexp",
642
+ underlying: { kind: "struct", fields: new Map(), methods: new Map() },
643
+ };
644
+ const REGEXP_PTR = { kind: "pointer", base: REGEXP_T };
645
+ const STR_SLICE = { kind: "slice", elem: STRING };
646
+ const INT_SLICE = { kind: "slice", elem: INT };
647
+ const regexpMethods = new Map([
648
+ ["MatchString", { kind: "func", params: [STRING], returns: [BOOL] }],
649
+ ["FindString", { kind: "func", params: [STRING], returns: [STRING] }],
650
+ [
651
+ "FindStringIndex",
652
+ { kind: "func", params: [STRING], returns: [INT_SLICE] },
653
+ ],
654
+ [
655
+ "FindAllString",
656
+ { kind: "func", params: [STRING, INT], returns: [STR_SLICE] },
657
+ ],
658
+ [
659
+ "FindStringSubmatch",
660
+ { kind: "func", params: [STRING], returns: [STR_SLICE] },
661
+ ],
662
+ [
663
+ "FindAllStringSubmatch",
664
+ {
665
+ kind: "func",
666
+ params: [STRING, INT],
667
+ returns: [{ kind: "slice", elem: STR_SLICE }],
668
+ },
669
+ ],
670
+ [
671
+ "ReplaceAllString",
672
+ { kind: "func", params: [STRING, STRING], returns: [STRING] },
673
+ ],
674
+ [
675
+ "ReplaceAllLiteralString",
676
+ { kind: "func", params: [STRING, STRING], returns: [STRING] },
677
+ ],
678
+ ["Split", { kind: "func", params: [STRING, INT], returns: [STR_SLICE] }],
679
+ ["String", { kind: "func", params: [], returns: [STRING] }],
680
+ ]);
681
+ REGEXP_T.underlying.methods = regexpMethods;
682
+ types.set("regexp.Regexp", REGEXP_T);
683
+ globals.define("regexp", {
684
+ kind: "namespace",
685
+ name: "regexp",
686
+ members: {
687
+ MustCompile: { kind: "func", params: [STRING], returns: [REGEXP_PTR] },
688
+ Compile: {
689
+ kind: "func",
690
+ params: [STRING],
691
+ returns: [REGEXP_PTR, ERROR],
692
+ },
693
+ MatchString: {
694
+ kind: "func",
695
+ params: [STRING, STRING],
696
+ returns: [BOOL, ERROR],
697
+ },
698
+ QuoteMeta: { kind: "func", params: [STRING], returns: [STRING] },
699
+ },
700
+ });
701
+
702
+ // strings.Builder
703
+ const BYTE_SLICE_T = { kind: "slice", elem: INT };
704
+ const strBuilderMethods = new Map([
705
+ ["WriteString", { kind: "func", params: [STRING], returns: [INT, ERROR] }],
706
+ ["WriteByte", { kind: "func", params: [INT], returns: [ERROR] }],
707
+ ["WriteRune", { kind: "func", params: [INT], returns: [INT, ERROR] }],
708
+ ["Write", { kind: "func", params: [BYTE_SLICE_T], returns: [INT, ERROR] }],
709
+ ["String", { kind: "func", params: [], returns: [STRING] }],
710
+ ["Len", { kind: "func", params: [], returns: [INT] }],
711
+ ["Reset", { kind: "func", params: [], returns: [VOID] }],
712
+ ["Grow", { kind: "func", params: [INT], returns: [VOID] }],
713
+ ]);
714
+ types.set("strings.Builder", {
715
+ kind: "named",
716
+ name: "strings.Builder",
717
+ underlying: {
718
+ kind: "struct",
719
+ fields: new Map(),
720
+ methods: strBuilderMethods,
721
+ },
722
+ });
723
+
724
+ // bytes.Buffer
725
+ const bytesBufferMethods = new Map([
726
+ ["WriteString", { kind: "func", params: [STRING], returns: [INT, ERROR] }],
727
+ ["WriteByte", { kind: "func", params: [INT], returns: [ERROR] }],
728
+ ["Write", { kind: "func", params: [BYTE_SLICE_T], returns: [INT, ERROR] }],
729
+ ["String", { kind: "func", params: [], returns: [STRING] }],
730
+ ["Bytes", { kind: "func", params: [], returns: [BYTE_SLICE_T] }],
731
+ ["Len", { kind: "func", params: [], returns: [INT] }],
732
+ ["Reset", { kind: "func", params: [], returns: [VOID] }],
733
+ ["Grow", { kind: "func", params: [INT], returns: [VOID] }],
734
+ ]);
735
+ types.set("bytes.Buffer", {
736
+ kind: "named",
737
+ name: "bytes.Buffer",
738
+ underlying: {
739
+ kind: "struct",
740
+ fields: new Map(),
741
+ methods: bytesBufferMethods,
742
+ },
743
+ });
744
+
745
+ // Built-in functions
746
+ globals.define("append", { kind: "builtin", name: "append" });
747
+ globals.define("len", { kind: "builtin", name: "len" });
748
+ globals.define("cap", { kind: "builtin", name: "cap" });
749
+ globals.define("make", { kind: "builtin", name: "make" });
750
+ globals.define("delete", { kind: "builtin", name: "delete" });
751
+ globals.define("print", { kind: "builtin", name: "print" });
752
+ globals.define("println", { kind: "builtin", name: "println" });
753
+ globals.define("panic", { kind: "builtin", name: "panic" });
754
+ globals.define("recover", { kind: "builtin", name: "recover" });
755
+ globals.define("new", { kind: "builtin", name: "new" });
756
+ globals.define("copy", { kind: "builtin", name: "copy" });
757
+ globals.define("error", { kind: "builtin", name: "error" });
758
+ globals.define("min", { kind: "builtin", name: "min" });
759
+ globals.define("max", { kind: "builtin", name: "max" });
760
+ globals.define("clear", { kind: "builtin", name: "clear" });
761
+ globals.define("complex", { kind: "builtin", name: "complex" });
762
+ globals.define("real", { kind: "builtin", name: "real" });
763
+ globals.define("imag", { kind: "builtin", name: "imag" });
764
+ }