goscript 0.0.83 → 0.1.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.
- package/README.md +13 -1
- package/cmd/goscript/cmd_compile.go +70 -69
- package/cmd/goscript/cmd_compile_test.go +79 -0
- package/cmd/goscript/main.go +10 -5
- package/compiler/compile-request.go +218 -0
- package/compiler/compiler.go +16 -1336
- package/compiler/compliance_test.go +196 -0
- package/compiler/config.go +6 -13
- package/compiler/diagnostic.go +70 -0
- package/compiler/index.test.ts +28 -28
- package/compiler/index.ts +40 -72
- package/compiler/lowered-program.go +132 -0
- package/compiler/lowering.go +3576 -0
- package/compiler/override-registry.go +422 -0
- package/compiler/override-registry_test.go +207 -0
- package/compiler/package-graph.go +231 -0
- package/compiler/package-graph_test.go +281 -0
- package/compiler/result.go +13 -0
- package/compiler/runtime-contract.go +279 -0
- package/compiler/runtime-contract_test.go +90 -0
- package/compiler/semantic-model-types.go +110 -0
- package/compiler/semantic-model.go +922 -0
- package/compiler/semantic-model_test.go +416 -0
- package/compiler/service.go +133 -0
- package/compiler/skeleton_test.go +1145 -0
- package/compiler/typescript-emitter.go +663 -0
- package/compiler/wasm/compile.go +2 -3
- package/compiler/wasm/compile_test.go +29 -0
- package/compiler/wasm_api.go +10 -159
- package/dist/compiler/index.d.ts +1 -3
- package/dist/compiler/index.js +31 -55
- package/dist/compiler/index.js.map +1 -1
- package/dist/gs/builtin/builtin.d.ts +13 -0
- package/dist/gs/builtin/builtin.js +27 -7
- package/dist/gs/builtin/builtin.js.map +1 -1
- package/dist/gs/builtin/channel.d.ts +3 -3
- package/dist/gs/builtin/channel.js.map +1 -1
- package/dist/gs/builtin/hostio.d.ts +86 -0
- package/dist/gs/builtin/hostio.js +266 -0
- package/dist/gs/builtin/hostio.js.map +1 -0
- package/dist/gs/builtin/index.d.ts +1 -0
- package/dist/gs/builtin/index.js +1 -0
- package/dist/gs/builtin/index.js.map +1 -1
- package/dist/gs/builtin/print.d.ts +8 -0
- package/dist/gs/builtin/print.js +111 -0
- package/dist/gs/builtin/print.js.map +1 -0
- package/dist/gs/builtin/slice.d.ts +1 -1
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/builtin/type.d.ts +11 -0
- package/dist/gs/builtin/type.js +55 -1
- package/dist/gs/builtin/type.js.map +1 -1
- package/dist/gs/bytes/buffer.gs.js.map +1 -1
- package/dist/gs/bytes/bytes.gs.js.map +1 -1
- package/dist/gs/bytes/reader.gs.js.map +1 -1
- package/dist/gs/context/context.js.map +1 -1
- package/dist/gs/crypto/rand/index.d.ts +5 -0
- package/dist/gs/crypto/rand/index.js +77 -0
- package/dist/gs/crypto/rand/index.js.map +1 -0
- package/dist/gs/encoding/json/index.d.ts +3 -0
- package/dist/gs/encoding/json/index.js +160 -0
- package/dist/gs/encoding/json/index.js.map +1 -0
- package/dist/gs/fmt/fmt.js +2 -22
- package/dist/gs/fmt/fmt.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
- package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
- package/dist/gs/github.com/pkg/errors/stack.js.map +1 -1
- package/dist/gs/go/scanner/index.d.ts +29 -0
- package/dist/gs/go/scanner/index.js +120 -0
- package/dist/gs/go/scanner/index.js.map +1 -0
- package/dist/gs/go/token/index.d.ts +31 -0
- package/dist/gs/go/token/index.js +82 -0
- package/dist/gs/go/token/index.js.map +1 -0
- package/dist/gs/internal/abi/index.js.map +1 -1
- package/dist/gs/io/fs/fs.js.map +1 -1
- package/dist/gs/io/fs/readdir.js.map +1 -1
- package/dist/gs/io/fs/readfile.js.map +1 -1
- package/dist/gs/io/fs/stat.js.map +1 -1
- package/dist/gs/io/fs/sub.js.map +1 -1
- package/dist/gs/io/io.js.map +1 -1
- package/dist/gs/os/dir_unix.gs.js.map +1 -1
- package/dist/gs/os/error.gs.js +2 -4
- package/dist/gs/os/error.gs.js.map +1 -1
- package/dist/gs/os/exec.gs.js.map +1 -1
- package/dist/gs/os/exec_posix.gs.js.map +1 -1
- package/dist/gs/os/rawconn_js.gs.js.map +1 -1
- package/dist/gs/os/root_js.gs.js.map +1 -1
- package/dist/gs/os/tempfile.gs.js +66 -9
- package/dist/gs/os/tempfile.gs.js.map +1 -1
- package/dist/gs/os/types.gs.js.map +1 -1
- package/dist/gs/os/types_js.gs.d.ts +2 -51
- package/dist/gs/os/types_js.gs.js +67 -105
- package/dist/gs/os/types_js.gs.js.map +1 -1
- package/dist/gs/os/types_unix.gs.js.map +1 -1
- package/dist/gs/path/filepath/match.js.map +1 -1
- package/dist/gs/path/match.js.map +1 -1
- package/dist/gs/path/path.js.map +1 -1
- package/dist/gs/reflect/index.d.ts +2 -2
- package/dist/gs/reflect/index.js +1 -1
- package/dist/gs/reflect/index.js.map +1 -1
- package/dist/gs/reflect/map.js.map +1 -1
- package/dist/gs/reflect/type.d.ts +2 -1
- package/dist/gs/reflect/type.js +85 -14
- package/dist/gs/reflect/type.js.map +1 -1
- package/dist/gs/reflect/types.js.map +1 -1
- package/dist/gs/reflect/visiblefields.js.map +1 -1
- package/dist/gs/runtime/runtime.js.map +1 -1
- package/dist/gs/sort/sort.gs.js.map +1 -1
- package/dist/gs/strconv/atoi.gs.js.map +1 -1
- package/dist/gs/strconv/quote.gs.js.map +1 -1
- package/dist/gs/strings/builder.js.map +1 -1
- package/dist/gs/strings/reader.js.map +1 -1
- package/dist/gs/strings/replace.js.map +1 -1
- package/dist/gs/sync/atomic/type.gs.js.map +1 -1
- package/dist/gs/sync/atomic/value.gs.js.map +1 -1
- package/dist/gs/sync/sync.d.ts +1 -0
- package/dist/gs/sync/sync.js +12 -0
- package/dist/gs/sync/sync.js.map +1 -1
- package/dist/gs/time/time.js.map +1 -1
- package/dist/gs/unicode/unicode.js.map +1 -1
- package/go.mod +2 -2
- package/gs/builtin/builtin.ts +31 -6
- package/gs/builtin/hostio.test.ts +246 -0
- package/gs/builtin/hostio.ts +413 -0
- package/gs/builtin/index.ts +1 -0
- package/gs/builtin/print.test.ts +48 -0
- package/gs/builtin/print.ts +154 -0
- package/gs/builtin/runtime-contract.test.ts +230 -0
- package/gs/builtin/type.ts +84 -1
- package/gs/crypto/rand/index.test.ts +32 -0
- package/gs/crypto/rand/index.ts +90 -0
- package/gs/crypto/rand/meta.json +5 -0
- package/gs/encoding/json/index.test.ts +65 -0
- package/gs/encoding/json/index.ts +186 -0
- package/gs/fmt/fmt.test.ts +41 -30
- package/gs/fmt/fmt.ts +2 -22
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +23 -0
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +3 -1
- package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/meta.json +3 -1
- package/gs/go/scanner/index.test.ts +50 -0
- package/gs/go/scanner/index.ts +157 -0
- package/gs/go/token/index.test.ts +21 -0
- package/gs/go/token/index.ts +120 -0
- package/gs/os/file_unix_js.test.ts +103 -0
- package/gs/os/meta.json +1 -2
- package/gs/os/tempfile.gs.test.ts +85 -0
- package/gs/os/tempfile.gs.ts +71 -11
- package/gs/os/types_js.gs.ts +74 -153
- package/gs/reflect/index.ts +1 -1
- package/gs/reflect/type.ts +106 -17
- package/gs/reflect/typefor.test.ts +75 -0
- package/gs/sync/sync.test.ts +24 -0
- package/gs/sync/sync.ts +12 -0
- package/package.json +13 -13
- package/compiler/analysis.go +0 -3475
- package/compiler/analysis_test.go +0 -338
- package/compiler/assignment.go +0 -580
- package/compiler/builtin_test.go +0 -92
- package/compiler/code-writer.go +0 -115
- package/compiler/compiler_test.go +0 -149
- package/compiler/composite-lit.go +0 -779
- package/compiler/config_test.go +0 -62
- package/compiler/constraint.go +0 -86
- package/compiler/decl.go +0 -801
- package/compiler/expr-call-async.go +0 -188
- package/compiler/expr-call-builtins.go +0 -208
- package/compiler/expr-call-helpers.go +0 -382
- package/compiler/expr-call-make.go +0 -318
- package/compiler/expr-call-type-conversion.go +0 -520
- package/compiler/expr-call.go +0 -413
- package/compiler/expr-selector.go +0 -343
- package/compiler/expr-star.go +0 -82
- package/compiler/expr-type.go +0 -442
- package/compiler/expr-value.go +0 -89
- package/compiler/expr.go +0 -773
- package/compiler/field.go +0 -183
- package/compiler/gs_dependencies_test.go +0 -298
- package/compiler/lit.go +0 -322
- package/compiler/output.go +0 -72
- package/compiler/primitive.go +0 -149
- package/compiler/protobuf.go +0 -697
- package/compiler/sanitize.go +0 -100
- package/compiler/spec-struct.go +0 -995
- package/compiler/spec-value.go +0 -540
- package/compiler/spec.go +0 -725
- package/compiler/stmt-assign.go +0 -664
- package/compiler/stmt-for.go +0 -266
- package/compiler/stmt-range.go +0 -475
- package/compiler/stmt-select.go +0 -262
- package/compiler/stmt-type-switch.go +0 -147
- package/compiler/stmt.go +0 -1308
- package/compiler/type-assert.go +0 -386
- package/compiler/type-info.go +0 -156
- package/compiler/type-utils.go +0 -207
- package/compiler/type.go +0 -892
package/compiler/type-utils.go
DELETED
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
package compiler
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"go/ast"
|
|
5
|
-
"go/types"
|
|
6
|
-
)
|
|
7
|
-
|
|
8
|
-
// isByteSliceType checks if a type is []byte (slice of uint8)
|
|
9
|
-
func (c *GoToTSCompiler) isByteSliceType(t types.Type) bool {
|
|
10
|
-
if sliceType, isSlice := t.Underlying().(*types.Slice); isSlice {
|
|
11
|
-
if basicElem, isBasic := sliceType.Elem().(*types.Basic); isBasic && basicElem.Kind() == types.Uint8 {
|
|
12
|
-
return true
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
return false
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// isRuneSliceType checks if a type is []rune (slice of int32)
|
|
19
|
-
func (c *GoToTSCompiler) isRuneSliceType(t types.Type) bool {
|
|
20
|
-
if sliceType, isSlice := t.Underlying().(*types.Slice); isSlice {
|
|
21
|
-
if basicElem, isBasic := sliceType.Elem().(*types.Basic); isBasic && basicElem.Kind() == types.Int32 {
|
|
22
|
-
return true
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return false
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// isStringType checks if a type is string or could be string (e.g., type parameter)
|
|
29
|
-
func (c *GoToTSCompiler) isStringType(t types.Type) bool {
|
|
30
|
-
if basic, isBasic := t.Underlying().(*types.Basic); isBasic {
|
|
31
|
-
return basic.Kind() == types.String || basic.Kind() == types.UntypedString
|
|
32
|
-
}
|
|
33
|
-
// Handle type parameters (e.g., Bytes ~[]byte | ~string)
|
|
34
|
-
if typeParam, isTypeParam := t.(*types.TypeParam); isTypeParam {
|
|
35
|
-
constraint := typeParam.Constraint()
|
|
36
|
-
if constraintIface, ok := constraint.(*types.Interface); ok {
|
|
37
|
-
return c.constraintIncludesString(constraintIface)
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
return false
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// constraintIncludesString checks if a type constraint includes string
|
|
44
|
-
func (c *GoToTSCompiler) constraintIncludesString(constraint *types.Interface) bool {
|
|
45
|
-
// Check if the constraint has type terms that include string
|
|
46
|
-
if constraint.IsMethodSet() {
|
|
47
|
-
return false // Pure method interface, no type terms
|
|
48
|
-
}
|
|
49
|
-
// For union constraints like []byte | string, check each term
|
|
50
|
-
for embedded := range constraint.EmbeddedTypes() {
|
|
51
|
-
// Check if embedded is a union
|
|
52
|
-
if union, isUnion := embedded.(*types.Union); isUnion {
|
|
53
|
-
for term := range union.Terms() {
|
|
54
|
-
termType := term.Type()
|
|
55
|
-
// Check if term is string or ~string
|
|
56
|
-
if basic, isBasic := termType.Underlying().(*types.Basic); isBasic {
|
|
57
|
-
if basic.Kind() == types.String {
|
|
58
|
-
return true
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
// Check direct embedded type
|
|
64
|
-
if basic, isBasic := embedded.Underlying().(*types.Basic); isBasic {
|
|
65
|
-
if basic.Kind() == types.String {
|
|
66
|
-
return true
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
return false
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// isPointerType checks if a type expression represents a pointer type
|
|
74
|
-
func (c *GoToTSCompiler) isPointerType(expr ast.Expr) bool {
|
|
75
|
-
_, isPointer := expr.(*ast.StarExpr)
|
|
76
|
-
return isPointer
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// isProtobufType checks if a given type is a protobuf type by examining its methods
|
|
80
|
-
// and, when available, by verifying it implements the protobuf-go-lite Message interface.
|
|
81
|
-
func (c *GoToTSCompiler) isProtobufType(typ types.Type) bool {
|
|
82
|
-
// Normalize to a named type if possible
|
|
83
|
-
var named *types.Named
|
|
84
|
-
switch t := typ.(type) {
|
|
85
|
-
case *types.Named:
|
|
86
|
-
named = t
|
|
87
|
-
case *types.Pointer:
|
|
88
|
-
if n, ok := t.Elem().(*types.Named); ok {
|
|
89
|
-
named = n
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
if named == nil {
|
|
93
|
-
return false
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// Prefer interface-based detection when the protobuf-go-lite package is loaded
|
|
97
|
-
if iface := c.getProtobufMessageInterface(); iface != nil {
|
|
98
|
-
if types.Implements(named, iface) || types.Implements(types.NewPointer(named), iface) {
|
|
99
|
-
return true
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// Fallback: method-set detection for common protobuf-go-lite methods
|
|
104
|
-
// Check both value and pointer method sets
|
|
105
|
-
if c.typeHasMethods(named, "MarshalVT", "UnmarshalVT") || c.typeHasMethods(types.NewPointer(named), "MarshalVT", "UnmarshalVT") {
|
|
106
|
-
return true
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
return false
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// isWrapperType checks if a type should be treated as a wrapper type (type alias with basic underlying type).
|
|
113
|
-
// Wrapper types are rendered as TypeScript type aliases rather than classes with constructors.
|
|
114
|
-
// Examples: os.FileMode (uint32), MyString (string), etc.
|
|
115
|
-
func (c *GoToTSCompiler) isWrapperType(t types.Type) bool {
|
|
116
|
-
// Check analysis cache first (for types with methods in analyzed packages)
|
|
117
|
-
if c.analysis.IsNamedBasicType(t) {
|
|
118
|
-
return true
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// For external package types, check if it's a named type with a basic underlying type
|
|
122
|
-
if namedType, ok := t.(*types.Named); ok {
|
|
123
|
-
if _, ok := namedType.Underlying().(*types.Basic); ok {
|
|
124
|
-
return true
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// Also check for type aliases with basic underlying types
|
|
129
|
-
if aliasType, ok := t.(*types.Alias); ok {
|
|
130
|
-
if _, ok := aliasType.Underlying().(*types.Basic); ok {
|
|
131
|
-
return true
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
return false
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
// isStructValueType checks if a type is a named struct type
|
|
139
|
-
func (c *GoToTSCompiler) isStructValueType(fieldType types.Type) bool {
|
|
140
|
-
if named, ok := fieldType.(*types.Named); ok {
|
|
141
|
-
if _, isStruct := named.Underlying().(*types.Struct); isStruct {
|
|
142
|
-
return true
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
return false
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// isImportedBasicType checks if a type is an imported named type with a basic underlying type
|
|
149
|
-
func (c *GoToTSCompiler) isImportedBasicType(fieldType types.Type) bool {
|
|
150
|
-
// Handle named types
|
|
151
|
-
if named, isNamed := fieldType.(*types.Named); isNamed {
|
|
152
|
-
obj := named.Obj()
|
|
153
|
-
if obj == nil || obj.Pkg() == nil || obj.Pkg() == c.pkg.Types {
|
|
154
|
-
return false // Not imported or is local
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
underlying := named.Underlying()
|
|
158
|
-
if underlying == nil {
|
|
159
|
-
return false
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
_, isBasic := underlying.(*types.Basic)
|
|
163
|
-
return isBasic
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// Handle type aliases (like os.FileMode = fs.FileMode)
|
|
167
|
-
if alias, isAlias := fieldType.(*types.Alias); isAlias {
|
|
168
|
-
obj := alias.Obj()
|
|
169
|
-
if obj == nil || obj.Pkg() == nil || obj.Pkg() == c.pkg.Types {
|
|
170
|
-
return false // Not imported or is local
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
underlying := alias.Underlying()
|
|
174
|
-
if underlying == nil {
|
|
175
|
-
return false
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
_, isBasic := underlying.(*types.Basic)
|
|
179
|
-
return isBasic
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
return false
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
// isMapType checks if a type is a map type (including type parameters constrained to maps)
|
|
186
|
-
func (c *GoToTSCompiler) isMapType(iterType, underlying types.Type) bool {
|
|
187
|
-
if _, ok := underlying.(*types.Map); ok {
|
|
188
|
-
return true
|
|
189
|
-
}
|
|
190
|
-
if typeParam, isTypeParam := iterType.(*types.TypeParam); isTypeParam {
|
|
191
|
-
constraint := typeParam.Constraint()
|
|
192
|
-
if constraint != nil {
|
|
193
|
-
constraintUnderlying := constraint.Underlying()
|
|
194
|
-
if iface, isInterface := constraintUnderlying.(*types.Interface); isInterface {
|
|
195
|
-
return hasMapConstraint(iface)
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
return false
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
// isArrayOrSlice checks if a type is an array or slice type
|
|
203
|
-
func (c *GoToTSCompiler) isArrayOrSlice(underlying types.Type) bool {
|
|
204
|
-
_, isSlice := underlying.(*types.Slice)
|
|
205
|
-
_, isArray := underlying.(*types.Array)
|
|
206
|
-
return isArray || isSlice
|
|
207
|
-
}
|