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.
Files changed (152) hide show
  1. package/cmd/goscript/deps.go +1 -4
  2. package/compiler/analysis.go +224 -63
  3. package/compiler/analysis_test.go +112 -0
  4. package/compiler/compiler.go +19 -87
  5. package/compiler/expr-call-type-conversion.go +148 -59
  6. package/compiler/expr-call.go +202 -10
  7. package/compiler/expr.go +5 -82
  8. package/compiler/gs_dependencies_test.go +60 -1
  9. package/compiler/spec-value.go +73 -51
  10. package/compiler/spec.go +293 -151
  11. package/compiler/stmt.go +192 -81
  12. package/dist/gs/builtin/builtin.d.ts +1 -5
  13. package/dist/gs/builtin/builtin.js +1 -34
  14. package/dist/gs/builtin/builtin.js.map +1 -1
  15. package/dist/gs/builtin/slice.js.map +1 -1
  16. package/dist/gs/fmt/fmt.js +20 -4
  17. package/dist/gs/fmt/fmt.js.map +1 -1
  18. package/dist/gs/io/fs/fs.d.ts +6 -12
  19. package/dist/gs/io/fs/fs.js +52 -67
  20. package/dist/gs/io/fs/fs.js.map +1 -1
  21. package/dist/gs/os/index.d.ts +2 -1
  22. package/dist/gs/os/index.js +1 -1
  23. package/dist/gs/os/index.js.map +1 -1
  24. package/dist/gs/os/types_js.gs.d.ts +7 -1
  25. package/dist/gs/os/types_js.gs.js +16 -1
  26. package/dist/gs/os/types_js.gs.js.map +1 -1
  27. package/dist/gs/os/types_unix.gs.js +2 -2
  28. package/dist/gs/os/types_unix.gs.js.map +1 -1
  29. package/dist/gs/reflect/index.d.ts +3 -3
  30. package/dist/gs/reflect/index.js +2 -2
  31. package/dist/gs/reflect/index.js.map +1 -1
  32. package/dist/gs/reflect/map.js +2 -2
  33. package/dist/gs/reflect/map.js.map +1 -1
  34. package/dist/gs/reflect/type.d.ts +8 -9
  35. package/dist/gs/reflect/type.js +101 -103
  36. package/dist/gs/reflect/type.js.map +1 -1
  37. package/dist/gs/reflect/types.d.ts +1 -10
  38. package/dist/gs/reflect/types.js +3 -26
  39. package/dist/gs/reflect/types.js.map +1 -1
  40. package/dist/gs/reflect/value.js +23 -23
  41. package/dist/gs/reflect/value.js.map +1 -1
  42. package/dist/gs/reflect/visiblefields.js +3 -3
  43. package/dist/gs/reflect/visiblefields.js.map +1 -1
  44. package/dist/gs/time/time.d.ts +11 -22
  45. package/dist/gs/time/time.js +29 -57
  46. package/dist/gs/time/time.js.map +1 -1
  47. package/gs/TODO.md +129 -0
  48. package/gs/builtin/builtin.ts +3 -41
  49. package/gs/builtin/slice.ts +1 -1
  50. package/gs/bytes/meta.json +10 -0
  51. package/gs/fmt/fmt.ts +18 -4
  52. package/gs/fmt/meta.json +5 -0
  53. package/gs/internal/meta.json +5 -0
  54. package/gs/io/fs/fs.ts +58 -73
  55. package/gs/io/meta.json +9 -0
  56. package/gs/maps/meta.json +6 -0
  57. package/gs/math/meta.json +5 -0
  58. package/gs/os/index.ts +8 -1
  59. package/gs/os/meta.json +15 -0
  60. package/gs/os/types_js.gs.ts +22 -1
  61. package/gs/os/types_unix.gs.ts +2 -2
  62. package/gs/path/meta.json +6 -0
  63. package/gs/reflect/function-types.test.ts +10 -10
  64. package/gs/reflect/index.ts +6 -6
  65. package/gs/reflect/map.ts +2 -2
  66. package/gs/reflect/meta.json +5 -0
  67. package/gs/reflect/type.ts +108 -103
  68. package/gs/reflect/types.ts +2 -28
  69. package/gs/reflect/value.ts +23 -23
  70. package/gs/reflect/visiblefields.ts +3 -3
  71. package/gs/strconv/meta.json +5 -0
  72. package/gs/strings/meta.json +9 -0
  73. package/gs/sync/meta.json +19 -0
  74. package/gs/time/time.ts +32 -65
  75. package/package.json +1 -1
  76. package/dist/gs/builtin/io.d.ts +0 -16
  77. package/dist/gs/builtin/io.js +0 -15
  78. package/dist/gs/builtin/io.js.map +0 -1
  79. package/dist/gs/internal/testlog/index.d.ts +0 -1
  80. package/dist/gs/internal/testlog/index.js +0 -5
  81. package/dist/gs/internal/testlog/index.js.map +0 -1
  82. package/dist/gs/maps/iter.gs.d.ts +0 -7
  83. package/dist/gs/maps/iter.gs.js +0 -65
  84. package/dist/gs/maps/iter.gs.js.map +0 -1
  85. package/dist/gs/maps/maps.gs.d.ts +0 -7
  86. package/dist/gs/maps/maps.gs.js +0 -79
  87. package/dist/gs/maps/maps.gs.js.map +0 -1
  88. package/dist/gs/reflect/abi.d.ts +0 -59
  89. package/dist/gs/reflect/abi.gs.d.ts +0 -59
  90. package/dist/gs/reflect/abi.gs.js +0 -79
  91. package/dist/gs/reflect/abi.gs.js.map +0 -1
  92. package/dist/gs/reflect/abi.js +0 -79
  93. package/dist/gs/reflect/abi.js.map +0 -1
  94. package/dist/gs/reflect/badlinkname.d.ts +0 -52
  95. package/dist/gs/reflect/badlinkname.gs.d.ts +0 -52
  96. package/dist/gs/reflect/badlinkname.gs.js +0 -72
  97. package/dist/gs/reflect/badlinkname.gs.js.map +0 -1
  98. package/dist/gs/reflect/badlinkname.js +0 -72
  99. package/dist/gs/reflect/badlinkname.js.map +0 -1
  100. package/dist/gs/reflect/deepequal.gs.d.ts +0 -25
  101. package/dist/gs/reflect/deepequal.gs.js +0 -308
  102. package/dist/gs/reflect/deepequal.gs.js.map +0 -1
  103. package/dist/gs/reflect/float32reg_generic.gs.d.ts +0 -2
  104. package/dist/gs/reflect/float32reg_generic.gs.js +0 -10
  105. package/dist/gs/reflect/float32reg_generic.gs.js.map +0 -1
  106. package/dist/gs/reflect/index.gs.d.ts +0 -1
  107. package/dist/gs/reflect/index.gs.js +0 -3
  108. package/dist/gs/reflect/index.gs.js.map +0 -1
  109. package/dist/gs/reflect/iter.gs.d.ts +0 -3
  110. package/dist/gs/reflect/iter.gs.js +0 -24
  111. package/dist/gs/reflect/iter.gs.js.map +0 -1
  112. package/dist/gs/reflect/makefunc.gs.d.ts +0 -34
  113. package/dist/gs/reflect/makefunc.gs.js +0 -288
  114. package/dist/gs/reflect/makefunc.gs.js.map +0 -1
  115. package/dist/gs/reflect/map_swiss.gs.d.ts +0 -14
  116. package/dist/gs/reflect/map_swiss.gs.js +0 -70
  117. package/dist/gs/reflect/map_swiss.gs.js.map +0 -1
  118. package/dist/gs/reflect/reflect.gs.d.ts +0 -132
  119. package/dist/gs/reflect/reflect.gs.js +0 -437
  120. package/dist/gs/reflect/reflect.gs.js.map +0 -1
  121. package/dist/gs/reflect/swapper.gs.d.ts +0 -1
  122. package/dist/gs/reflect/swapper.gs.js +0 -32
  123. package/dist/gs/reflect/swapper.gs.js.map +0 -1
  124. package/dist/gs/reflect/type.gs.d.ts +0 -4
  125. package/dist/gs/reflect/type.gs.js +0 -21
  126. package/dist/gs/reflect/type.gs.js.map +0 -1
  127. package/dist/gs/reflect/value.gs.d.ts +0 -4
  128. package/dist/gs/reflect/value.gs.js +0 -12
  129. package/dist/gs/reflect/value.gs.js.map +0 -1
  130. package/dist/gs/reflect/visiblefields.gs.d.ts +0 -3
  131. package/dist/gs/reflect/visiblefields.gs.js +0 -123
  132. package/dist/gs/reflect/visiblefields.gs.js.map +0 -1
  133. package/dist/gs/stringslite/index.d.ts +0 -1
  134. package/dist/gs/stringslite/index.js +0 -2
  135. package/dist/gs/stringslite/index.js.map +0 -1
  136. package/dist/gs/stringslite/strings.d.ts +0 -11
  137. package/dist/gs/stringslite/strings.js +0 -67
  138. package/dist/gs/stringslite/strings.js.map +0 -1
  139. package/gs/bytes/metadata.go +0 -12
  140. package/gs/fmt/metadata.go +0 -7
  141. package/gs/internal/metadata.go +0 -7
  142. package/gs/io/io.go +0 -75
  143. package/gs/io/metadata.go +0 -11
  144. package/gs/maps/metadata.go +0 -8
  145. package/gs/math/metadata.go +0 -7
  146. package/gs/os/metadata.go +0 -17
  147. package/gs/path/metadata.go +0 -8
  148. package/gs/reflect/metadata.go +0 -7
  149. package/gs/strconv/metadata.go +0 -7
  150. package/gs/strings/metadata.go +0 -11
  151. package/gs/sync/metadata.go +0 -7
  152. 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 dependency
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
  }
@@ -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
- typeName := namedType.Obj().Name()
240
- if c.hasReceiverMethods(typeName) {
241
- // Check if the initializer is a basic literal or simple value that needs wrapping
242
- needsConstructor := false
243
- switch expr := initializerExpr.(type) {
244
- case *ast.BasicLit:
245
- needsConstructor = true
246
- case *ast.Ident:
247
- // Check if it's a simple identifier (not a function call or complex expression)
248
- if expr.Name != "nil" {
249
- // Check if this identifier refers to a value of the underlying type
250
- if obj := c.pkg.TypesInfo.Uses[expr]; obj != nil {
251
- if objType := obj.Type(); objType != nil {
252
- // If the identifier's type matches the underlying type, wrap it
253
- if types.Identical(objType, namedType.Underlying()) {
254
- needsConstructor = true
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
- case *ast.CallExpr:
260
- // Check if this is a make() call that returns the underlying type
261
- if funIdent, ok := expr.Fun.(*ast.Ident); ok && funIdent.Name == "make" {
262
- // Check if the make call returns a type that matches the underlying type
263
- if exprType := c.pkg.TypesInfo.TypeOf(expr); exprType != nil {
264
- if types.Identical(exprType, namedType.Underlying()) {
265
- needsConstructor = true
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
- if needsConstructor {
272
- c.tsw.WriteLiterallyf("new %s(", typeName)
273
- if err := c.WriteValueExpr(initializerExpr); err != nil {
274
- return err
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
- // Regular initializer for named type (e.g., function call that returns the type)
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 named type with methods
335
+ // Check if this is a wrapper type first
320
336
  if namedType, isNamed := goType.(*types.Named); isNamed {
321
- typeName := namedType.Obj().Name()
322
- if c.hasReceiverMethods(typeName) {
323
- // For named types with methods, create a new instance with zero value
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)