goscript 0.0.47 → 0.0.49
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/cmd/goscript/deps.go +1 -4
- package/compiler/analysis.go +224 -63
- package/compiler/analysis_test.go +112 -0
- package/compiler/compiler.go +19 -87
- package/compiler/expr-call-type-conversion.go +148 -59
- package/compiler/expr-call.go +202 -10
- package/compiler/expr.go +5 -82
- package/compiler/gs_dependencies_test.go +60 -1
- package/compiler/spec-value.go +73 -51
- package/compiler/spec.go +293 -151
- package/compiler/stmt.go +192 -81
- package/dist/gs/builtin/builtin.d.ts +1 -5
- package/dist/gs/builtin/builtin.js +1 -34
- package/dist/gs/builtin/builtin.js.map +1 -1
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/fmt/fmt.js +20 -4
- package/dist/gs/fmt/fmt.js.map +1 -1
- package/dist/gs/io/fs/fs.d.ts +6 -12
- package/dist/gs/io/fs/fs.js +52 -67
- package/dist/gs/io/fs/fs.js.map +1 -1
- package/dist/gs/os/index.d.ts +2 -1
- package/dist/gs/os/index.js +1 -1
- package/dist/gs/os/index.js.map +1 -1
- package/dist/gs/os/types_js.gs.d.ts +7 -1
- package/dist/gs/os/types_js.gs.js +16 -1
- package/dist/gs/os/types_js.gs.js.map +1 -1
- package/dist/gs/os/types_unix.gs.js +2 -2
- package/dist/gs/os/types_unix.gs.js.map +1 -1
- package/dist/gs/reflect/index.d.ts +3 -3
- package/dist/gs/reflect/index.js +2 -2
- package/dist/gs/reflect/index.js.map +1 -1
- package/dist/gs/reflect/map.js +2 -2
- package/dist/gs/reflect/map.js.map +1 -1
- package/dist/gs/reflect/type.d.ts +8 -9
- package/dist/gs/reflect/type.js +101 -103
- package/dist/gs/reflect/type.js.map +1 -1
- package/dist/gs/reflect/types.d.ts +1 -10
- package/dist/gs/reflect/types.js +3 -26
- package/dist/gs/reflect/types.js.map +1 -1
- package/dist/gs/reflect/value.js +23 -23
- package/dist/gs/reflect/value.js.map +1 -1
- package/dist/gs/reflect/visiblefields.js +3 -3
- package/dist/gs/reflect/visiblefields.js.map +1 -1
- package/dist/gs/time/time.d.ts +11 -22
- package/dist/gs/time/time.js +29 -57
- package/dist/gs/time/time.js.map +1 -1
- package/gs/TODO.md +129 -0
- package/gs/builtin/builtin.ts +3 -41
- package/gs/builtin/slice.ts +1 -1
- package/gs/bytes/meta.json +10 -0
- package/gs/fmt/fmt.ts +18 -4
- package/gs/fmt/meta.json +5 -0
- package/gs/internal/meta.json +5 -0
- package/gs/io/fs/fs.ts +58 -73
- package/gs/io/meta.json +9 -0
- package/gs/maps/meta.json +6 -0
- package/gs/math/meta.json +5 -0
- package/gs/os/index.ts +8 -1
- package/gs/os/meta.json +15 -0
- package/gs/os/types_js.gs.ts +22 -1
- package/gs/os/types_unix.gs.ts +2 -2
- package/gs/path/meta.json +6 -0
- package/gs/reflect/function-types.test.ts +10 -10
- package/gs/reflect/index.ts +6 -6
- package/gs/reflect/map.ts +2 -2
- package/gs/reflect/meta.json +5 -0
- package/gs/reflect/type.ts +108 -103
- package/gs/reflect/types.ts +2 -28
- package/gs/reflect/value.ts +23 -23
- package/gs/reflect/visiblefields.ts +3 -3
- package/gs/strconv/meta.json +5 -0
- package/gs/strings/meta.json +9 -0
- package/gs/sync/meta.json +19 -0
- package/gs/time/time.ts +32 -65
- package/package.json +1 -1
- package/dist/gs/builtin/io.d.ts +0 -16
- package/dist/gs/builtin/io.js +0 -15
- package/dist/gs/builtin/io.js.map +0 -1
- package/dist/gs/internal/testlog/index.d.ts +0 -1
- package/dist/gs/internal/testlog/index.js +0 -5
- package/dist/gs/internal/testlog/index.js.map +0 -1
- package/dist/gs/maps/iter.gs.d.ts +0 -7
- package/dist/gs/maps/iter.gs.js +0 -65
- package/dist/gs/maps/iter.gs.js.map +0 -1
- package/dist/gs/maps/maps.gs.d.ts +0 -7
- package/dist/gs/maps/maps.gs.js +0 -79
- package/dist/gs/maps/maps.gs.js.map +0 -1
- package/dist/gs/reflect/abi.d.ts +0 -59
- package/dist/gs/reflect/abi.gs.d.ts +0 -59
- package/dist/gs/reflect/abi.gs.js +0 -79
- package/dist/gs/reflect/abi.gs.js.map +0 -1
- package/dist/gs/reflect/abi.js +0 -79
- package/dist/gs/reflect/abi.js.map +0 -1
- package/dist/gs/reflect/badlinkname.d.ts +0 -52
- package/dist/gs/reflect/badlinkname.gs.d.ts +0 -52
- package/dist/gs/reflect/badlinkname.gs.js +0 -72
- package/dist/gs/reflect/badlinkname.gs.js.map +0 -1
- package/dist/gs/reflect/badlinkname.js +0 -72
- package/dist/gs/reflect/badlinkname.js.map +0 -1
- package/dist/gs/reflect/deepequal.gs.d.ts +0 -25
- package/dist/gs/reflect/deepequal.gs.js +0 -308
- package/dist/gs/reflect/deepequal.gs.js.map +0 -1
- package/dist/gs/reflect/float32reg_generic.gs.d.ts +0 -2
- package/dist/gs/reflect/float32reg_generic.gs.js +0 -10
- package/dist/gs/reflect/float32reg_generic.gs.js.map +0 -1
- package/dist/gs/reflect/index.gs.d.ts +0 -1
- package/dist/gs/reflect/index.gs.js +0 -3
- package/dist/gs/reflect/index.gs.js.map +0 -1
- package/dist/gs/reflect/iter.gs.d.ts +0 -3
- package/dist/gs/reflect/iter.gs.js +0 -24
- package/dist/gs/reflect/iter.gs.js.map +0 -1
- package/dist/gs/reflect/makefunc.gs.d.ts +0 -34
- package/dist/gs/reflect/makefunc.gs.js +0 -288
- package/dist/gs/reflect/makefunc.gs.js.map +0 -1
- package/dist/gs/reflect/map_swiss.gs.d.ts +0 -14
- package/dist/gs/reflect/map_swiss.gs.js +0 -70
- package/dist/gs/reflect/map_swiss.gs.js.map +0 -1
- package/dist/gs/reflect/reflect.gs.d.ts +0 -132
- package/dist/gs/reflect/reflect.gs.js +0 -437
- package/dist/gs/reflect/reflect.gs.js.map +0 -1
- package/dist/gs/reflect/swapper.gs.d.ts +0 -1
- package/dist/gs/reflect/swapper.gs.js +0 -32
- package/dist/gs/reflect/swapper.gs.js.map +0 -1
- package/dist/gs/reflect/type.gs.d.ts +0 -4
- package/dist/gs/reflect/type.gs.js +0 -21
- package/dist/gs/reflect/type.gs.js.map +0 -1
- package/dist/gs/reflect/value.gs.d.ts +0 -4
- package/dist/gs/reflect/value.gs.js +0 -12
- package/dist/gs/reflect/value.gs.js.map +0 -1
- package/dist/gs/reflect/visiblefields.gs.d.ts +0 -3
- package/dist/gs/reflect/visiblefields.gs.js +0 -123
- package/dist/gs/reflect/visiblefields.gs.js.map +0 -1
- package/dist/gs/stringslite/index.d.ts +0 -1
- package/dist/gs/stringslite/index.js +0 -2
- package/dist/gs/stringslite/index.js.map +0 -1
- package/dist/gs/stringslite/strings.d.ts +0 -11
- package/dist/gs/stringslite/strings.js +0 -67
- package/dist/gs/stringslite/strings.js.map +0 -1
- package/gs/bytes/metadata.go +0 -12
- package/gs/fmt/metadata.go +0 -7
- package/gs/internal/metadata.go +0 -7
- package/gs/io/io.go +0 -75
- package/gs/io/metadata.go +0 -11
- package/gs/maps/metadata.go +0 -8
- package/gs/math/metadata.go +0 -7
- package/gs/os/metadata.go +0 -17
- package/gs/path/metadata.go +0 -8
- package/gs/reflect/metadata.go +0 -7
- package/gs/strconv/metadata.go +0 -7
- package/gs/strings/metadata.go +0 -11
- package/gs/sync/metadata.go +0 -7
- package/gs/sync/sync.go +0 -64
|
@@ -30,7 +30,7 @@ func TestReadGsPackageMetadata(t *testing.T) {
|
|
|
30
30
|
t.Fatalf("Failed to read metadata: %v", err)
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
// Check that we found the expected
|
|
33
|
+
// Check that we found the expected dependencies
|
|
34
34
|
if len(metadata.Dependencies) == 0 {
|
|
35
35
|
t.Errorf("Expected at least one dependency, got none")
|
|
36
36
|
}
|
|
@@ -47,6 +47,61 @@ func TestReadGsPackageMetadata(t *testing.T) {
|
|
|
47
47
|
if !foundIter {
|
|
48
48
|
t.Errorf("Expected to find 'iter' dependency, got dependencies: %v", metadata.Dependencies)
|
|
49
49
|
}
|
|
50
|
+
|
|
51
|
+
// Also check for other expected dependencies from the bytes package
|
|
52
|
+
expectedDeps := []string{"errors", "io", "iter", "unicode", "unicode/utf8", "unsafe"}
|
|
53
|
+
for _, expected := range expectedDeps {
|
|
54
|
+
found := false
|
|
55
|
+
for _, dep := range metadata.Dependencies {
|
|
56
|
+
if dep == expected {
|
|
57
|
+
found = true
|
|
58
|
+
break
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if !found {
|
|
62
|
+
t.Errorf("Expected to find dependency '%s', got dependencies: %v", expected, metadata.Dependencies)
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
func TestReadGsPackageMetadataWithAsyncMethods(t *testing.T) {
|
|
68
|
+
// Create a basic compiler configuration
|
|
69
|
+
config := &Config{
|
|
70
|
+
OutputPath: "./test_output",
|
|
71
|
+
Dir: ".",
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Create a logger (set to warn level to reduce noise in tests)
|
|
75
|
+
logger := logrus.New()
|
|
76
|
+
logger.SetLevel(logrus.WarnLevel)
|
|
77
|
+
le := logrus.NewEntry(logger)
|
|
78
|
+
|
|
79
|
+
// Create a compiler
|
|
80
|
+
comp, err := NewCompiler(config, le, nil)
|
|
81
|
+
if err != nil {
|
|
82
|
+
t.Fatalf("Failed to create compiler: %v", err)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Test reading metadata from the sync package (which has async methods)
|
|
86
|
+
metadata, err := comp.ReadGsPackageMetadata("gs/sync")
|
|
87
|
+
if err != nil {
|
|
88
|
+
t.Fatalf("Failed to read metadata: %v", err)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Check that we have async methods
|
|
92
|
+
if len(metadata.AsyncMethods) == 0 {
|
|
93
|
+
t.Errorf("Expected at least one async method for sync package, got none")
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Check for specific async methods
|
|
97
|
+
expectedAsyncMethods := []string{"Mutex.Lock", "WaitGroup.Wait", "RWMutex.Lock"}
|
|
98
|
+
for _, methodName := range expectedAsyncMethods {
|
|
99
|
+
if isAsync, exists := metadata.AsyncMethods[methodName]; !exists {
|
|
100
|
+
t.Errorf("Expected to find async method '%s'", methodName)
|
|
101
|
+
} else if !isAsync {
|
|
102
|
+
t.Errorf("Expected method '%s' to be async, but it's not", methodName)
|
|
103
|
+
}
|
|
104
|
+
}
|
|
50
105
|
}
|
|
51
106
|
|
|
52
107
|
func TestReadGsPackageMetadataNonExistent(t *testing.T) {
|
|
@@ -77,4 +132,8 @@ func TestReadGsPackageMetadataNonExistent(t *testing.T) {
|
|
|
77
132
|
if len(metadata.Dependencies) != 0 {
|
|
78
133
|
t.Errorf("Expected empty dependencies for non-existent package, got: %v", metadata.Dependencies)
|
|
79
134
|
}
|
|
135
|
+
|
|
136
|
+
if len(metadata.AsyncMethods) != 0 {
|
|
137
|
+
t.Errorf("Expected empty async methods for non-existent package, got: %v", metadata.AsyncMethods)
|
|
138
|
+
}
|
|
80
139
|
}
|
package/compiler/spec-value.go
CHANGED
|
@@ -236,46 +236,74 @@ func (c *GoToTSCompiler) WriteValueSpec(a *ast.ValueSpec) error {
|
|
|
236
236
|
} else {
|
|
237
237
|
// Check if this is a named type with methods and the initializer is a basic value
|
|
238
238
|
if namedType, isNamed := goType.(*types.Named); isNamed {
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
239
|
+
// Check if this is a wrapper type first
|
|
240
|
+
isWrapperType := c.analysis.IsWrapperType(namedType)
|
|
241
|
+
if isWrapperType {
|
|
242
|
+
// For wrapper types, no constructor wrapping needed
|
|
243
|
+
if shouldApplyClone(c.pkg, initializerExpr) {
|
|
244
|
+
if err := c.WriteValueExpr(initializerExpr); err != nil {
|
|
245
|
+
return err
|
|
246
|
+
}
|
|
247
|
+
c.tsw.WriteLiterally(".clone()")
|
|
248
|
+
} else {
|
|
249
|
+
if err := c.WriteValueExpr(initializerExpr); err != nil {
|
|
250
|
+
return err
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
} else {
|
|
254
|
+
typeName := namedType.Obj().Name()
|
|
255
|
+
if c.hasReceiverMethods(typeName) {
|
|
256
|
+
// Check if the initializer is a basic literal or simple value that needs wrapping
|
|
257
|
+
needsConstructor := false
|
|
258
|
+
switch expr := initializerExpr.(type) {
|
|
259
|
+
case *ast.BasicLit:
|
|
260
|
+
needsConstructor = true
|
|
261
|
+
case *ast.Ident:
|
|
262
|
+
// Check if it's a simple identifier (not a function call or complex expression)
|
|
263
|
+
if expr.Name != "nil" {
|
|
264
|
+
// Check if this identifier refers to a value of the underlying type
|
|
265
|
+
if obj := c.pkg.TypesInfo.Uses[expr]; obj != nil {
|
|
266
|
+
if objType := obj.Type(); objType != nil {
|
|
267
|
+
// If the identifier's type matches the underlying type, wrap it
|
|
268
|
+
if types.Identical(objType, namedType.Underlying()) {
|
|
269
|
+
needsConstructor = true
|
|
270
|
+
}
|
|
255
271
|
}
|
|
256
272
|
}
|
|
257
273
|
}
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
274
|
+
case *ast.CallExpr:
|
|
275
|
+
// Check if this is a make() call that returns the underlying type
|
|
276
|
+
if funIdent, ok := expr.Fun.(*ast.Ident); ok && funIdent.Name == "make" {
|
|
277
|
+
// Check if the make call returns a type that matches the underlying type
|
|
278
|
+
if exprType := c.pkg.TypesInfo.TypeOf(expr); exprType != nil {
|
|
279
|
+
if types.Identical(exprType, namedType.Underlying()) {
|
|
280
|
+
needsConstructor = true
|
|
281
|
+
}
|
|
266
282
|
}
|
|
267
283
|
}
|
|
268
284
|
}
|
|
269
|
-
}
|
|
270
285
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
286
|
+
if needsConstructor {
|
|
287
|
+
c.tsw.WriteLiterallyf("new %s(", typeName)
|
|
288
|
+
if err := c.WriteValueExpr(initializerExpr); err != nil {
|
|
289
|
+
return err
|
|
290
|
+
}
|
|
291
|
+
c.tsw.WriteLiterally(")")
|
|
292
|
+
} else {
|
|
293
|
+
// Regular initializer for named type (e.g., function call that returns the type)
|
|
294
|
+
if shouldApplyClone(c.pkg, initializerExpr) {
|
|
295
|
+
if err := c.WriteValueExpr(initializerExpr); err != nil {
|
|
296
|
+
return err
|
|
297
|
+
}
|
|
298
|
+
c.tsw.WriteLiterally(".clone()")
|
|
299
|
+
} else {
|
|
300
|
+
if err := c.WriteValueExpr(initializerExpr); err != nil {
|
|
301
|
+
return err
|
|
302
|
+
}
|
|
303
|
+
}
|
|
275
304
|
}
|
|
276
|
-
c.tsw.WriteLiterally(")")
|
|
277
305
|
} else {
|
|
278
|
-
//
|
|
306
|
+
// Named type without methods, handle normally
|
|
279
307
|
if shouldApplyClone(c.pkg, initializerExpr) {
|
|
280
308
|
if err := c.WriteValueExpr(initializerExpr); err != nil {
|
|
281
309
|
return err
|
|
@@ -287,18 +315,6 @@ func (c *GoToTSCompiler) WriteValueSpec(a *ast.ValueSpec) error {
|
|
|
287
315
|
}
|
|
288
316
|
}
|
|
289
317
|
}
|
|
290
|
-
} else {
|
|
291
|
-
// Named type without methods, handle normally
|
|
292
|
-
if shouldApplyClone(c.pkg, initializerExpr) {
|
|
293
|
-
if err := c.WriteValueExpr(initializerExpr); err != nil {
|
|
294
|
-
return err
|
|
295
|
-
}
|
|
296
|
-
c.tsw.WriteLiterally(".clone()")
|
|
297
|
-
} else {
|
|
298
|
-
if err := c.WriteValueExpr(initializerExpr); err != nil {
|
|
299
|
-
return err
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
318
|
}
|
|
303
319
|
} else {
|
|
304
320
|
// Regular initializer, clone if needed
|
|
@@ -316,16 +332,22 @@ func (c *GoToTSCompiler) WriteValueSpec(a *ast.ValueSpec) error {
|
|
|
316
332
|
}
|
|
317
333
|
} else {
|
|
318
334
|
// No initializer, use the zero value directly
|
|
319
|
-
// Check if this is a
|
|
335
|
+
// Check if this is a wrapper type first
|
|
320
336
|
if namedType, isNamed := goType.(*types.Named); isNamed {
|
|
321
|
-
|
|
322
|
-
if
|
|
323
|
-
// For
|
|
324
|
-
c.tsw.WriteLiterallyf("new %s(", typeName)
|
|
325
|
-
c.WriteZeroValueForType(namedType.Underlying())
|
|
326
|
-
c.tsw.WriteLiterally(")")
|
|
327
|
-
} else {
|
|
337
|
+
isWrapperType := c.analysis.IsWrapperType(namedType)
|
|
338
|
+
if isWrapperType {
|
|
339
|
+
// For wrapper types, just use zero value directly
|
|
328
340
|
c.WriteZeroValueForType(goType)
|
|
341
|
+
} else {
|
|
342
|
+
typeName := namedType.Obj().Name()
|
|
343
|
+
if c.hasReceiverMethods(typeName) {
|
|
344
|
+
// For named types with methods, create a new instance with zero value
|
|
345
|
+
c.tsw.WriteLiterallyf("new %s(", typeName)
|
|
346
|
+
c.WriteZeroValueForType(namedType.Underlying())
|
|
347
|
+
c.tsw.WriteLiterally(")")
|
|
348
|
+
} else {
|
|
349
|
+
c.WriteZeroValueForType(goType)
|
|
350
|
+
}
|
|
329
351
|
}
|
|
330
352
|
} else {
|
|
331
353
|
c.WriteZeroValueForType(goType)
|