goscript 0.0.48 → 0.0.50

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 (159) hide show
  1. package/cmd/goscript/deps.go +1 -4
  2. package/compiler/analysis.go +1120 -513
  3. package/compiler/analysis_test.go +113 -4
  4. package/compiler/compiler.go +88 -124
  5. package/compiler/decl.go +22 -0
  6. package/compiler/expr-call-async.go +46 -52
  7. package/compiler/expr-call-type-conversion.go +144 -59
  8. package/compiler/expr-call.go +235 -12
  9. package/compiler/expr.go +5 -82
  10. package/compiler/gs_dependencies_test.go +60 -1
  11. package/compiler/spec-value.go +73 -51
  12. package/compiler/spec.go +337 -151
  13. package/compiler/stmt-assign.go +7 -4
  14. package/compiler/stmt.go +250 -81
  15. package/compiler/type.go +13 -0
  16. package/dist/gs/builtin/builtin.d.ts +1 -5
  17. package/dist/gs/builtin/builtin.js +1 -34
  18. package/dist/gs/builtin/builtin.js.map +1 -1
  19. package/dist/gs/builtin/slice.js.map +1 -1
  20. package/dist/gs/context/context.d.ts +16 -18
  21. package/dist/gs/context/context.js +23 -13
  22. package/dist/gs/context/context.js.map +1 -1
  23. package/dist/gs/fmt/fmt.js +22 -4
  24. package/dist/gs/fmt/fmt.js.map +1 -1
  25. package/dist/gs/io/fs/fs.d.ts +6 -12
  26. package/dist/gs/io/fs/fs.js +52 -67
  27. package/dist/gs/io/fs/fs.js.map +1 -1
  28. package/dist/gs/os/index.d.ts +2 -1
  29. package/dist/gs/os/index.js +1 -1
  30. package/dist/gs/os/index.js.map +1 -1
  31. package/dist/gs/os/types_js.gs.d.ts +7 -1
  32. package/dist/gs/os/types_js.gs.js +16 -1
  33. package/dist/gs/os/types_js.gs.js.map +1 -1
  34. package/dist/gs/os/types_unix.gs.js +2 -2
  35. package/dist/gs/os/types_unix.gs.js.map +1 -1
  36. package/dist/gs/reflect/index.d.ts +3 -3
  37. package/dist/gs/reflect/index.js +2 -2
  38. package/dist/gs/reflect/index.js.map +1 -1
  39. package/dist/gs/reflect/map.js +2 -2
  40. package/dist/gs/reflect/map.js.map +1 -1
  41. package/dist/gs/reflect/type.d.ts +8 -9
  42. package/dist/gs/reflect/type.js +98 -103
  43. package/dist/gs/reflect/type.js.map +1 -1
  44. package/dist/gs/reflect/types.d.ts +1 -10
  45. package/dist/gs/reflect/types.js +3 -26
  46. package/dist/gs/reflect/types.js.map +1 -1
  47. package/dist/gs/reflect/value.js +23 -23
  48. package/dist/gs/reflect/value.js.map +1 -1
  49. package/dist/gs/reflect/visiblefields.js +3 -3
  50. package/dist/gs/reflect/visiblefields.js.map +1 -1
  51. package/dist/gs/time/time.d.ts +13 -23
  52. package/dist/gs/time/time.js +57 -75
  53. package/dist/gs/time/time.js.map +1 -1
  54. package/gs/builtin/builtin.ts +3 -47
  55. package/gs/builtin/slice.ts +1 -1
  56. package/gs/bytes/meta.json +10 -0
  57. package/gs/context/context.ts +63 -45
  58. package/gs/fmt/fmt.ts +22 -4
  59. package/gs/fmt/meta.json +5 -0
  60. package/gs/internal/meta.json +5 -0
  61. package/gs/io/fs/fs.ts +58 -73
  62. package/gs/io/meta.json +9 -0
  63. package/gs/maps/meta.json +6 -0
  64. package/gs/math/meta.json +5 -0
  65. package/gs/os/index.ts +8 -1
  66. package/gs/os/meta.json +15 -0
  67. package/gs/os/types_js.gs.ts +22 -1
  68. package/gs/os/types_unix.gs.ts +2 -2
  69. package/gs/path/meta.json +6 -0
  70. package/gs/reflect/function-types.test.ts +10 -10
  71. package/gs/reflect/index.ts +6 -6
  72. package/gs/reflect/map.ts +2 -2
  73. package/gs/reflect/meta.json +5 -0
  74. package/gs/reflect/type.ts +105 -105
  75. package/gs/reflect/types.ts +2 -28
  76. package/gs/reflect/value.ts +23 -23
  77. package/gs/reflect/visiblefields.ts +3 -3
  78. package/gs/strconv/meta.json +5 -0
  79. package/gs/strings/meta.json +9 -0
  80. package/gs/sync/meta.json +19 -0
  81. package/gs/time/time.ts +65 -84
  82. package/package.json +2 -2
  83. package/dist/gs/builtin/io.d.ts +0 -16
  84. package/dist/gs/builtin/io.js +0 -15
  85. package/dist/gs/builtin/io.js.map +0 -1
  86. package/dist/gs/internal/testlog/index.d.ts +0 -1
  87. package/dist/gs/internal/testlog/index.js +0 -5
  88. package/dist/gs/internal/testlog/index.js.map +0 -1
  89. package/dist/gs/maps/iter.gs.d.ts +0 -7
  90. package/dist/gs/maps/iter.gs.js +0 -65
  91. package/dist/gs/maps/iter.gs.js.map +0 -1
  92. package/dist/gs/maps/maps.gs.d.ts +0 -7
  93. package/dist/gs/maps/maps.gs.js +0 -79
  94. package/dist/gs/maps/maps.gs.js.map +0 -1
  95. package/dist/gs/reflect/abi.d.ts +0 -59
  96. package/dist/gs/reflect/abi.gs.d.ts +0 -59
  97. package/dist/gs/reflect/abi.gs.js +0 -79
  98. package/dist/gs/reflect/abi.gs.js.map +0 -1
  99. package/dist/gs/reflect/abi.js +0 -79
  100. package/dist/gs/reflect/abi.js.map +0 -1
  101. package/dist/gs/reflect/badlinkname.d.ts +0 -52
  102. package/dist/gs/reflect/badlinkname.gs.d.ts +0 -52
  103. package/dist/gs/reflect/badlinkname.gs.js +0 -72
  104. package/dist/gs/reflect/badlinkname.gs.js.map +0 -1
  105. package/dist/gs/reflect/badlinkname.js +0 -72
  106. package/dist/gs/reflect/badlinkname.js.map +0 -1
  107. package/dist/gs/reflect/deepequal.gs.d.ts +0 -25
  108. package/dist/gs/reflect/deepequal.gs.js +0 -308
  109. package/dist/gs/reflect/deepequal.gs.js.map +0 -1
  110. package/dist/gs/reflect/float32reg_generic.gs.d.ts +0 -2
  111. package/dist/gs/reflect/float32reg_generic.gs.js +0 -10
  112. package/dist/gs/reflect/float32reg_generic.gs.js.map +0 -1
  113. package/dist/gs/reflect/index.gs.d.ts +0 -1
  114. package/dist/gs/reflect/index.gs.js +0 -3
  115. package/dist/gs/reflect/index.gs.js.map +0 -1
  116. package/dist/gs/reflect/iter.gs.d.ts +0 -3
  117. package/dist/gs/reflect/iter.gs.js +0 -24
  118. package/dist/gs/reflect/iter.gs.js.map +0 -1
  119. package/dist/gs/reflect/makefunc.gs.d.ts +0 -34
  120. package/dist/gs/reflect/makefunc.gs.js +0 -288
  121. package/dist/gs/reflect/makefunc.gs.js.map +0 -1
  122. package/dist/gs/reflect/map_swiss.gs.d.ts +0 -14
  123. package/dist/gs/reflect/map_swiss.gs.js +0 -70
  124. package/dist/gs/reflect/map_swiss.gs.js.map +0 -1
  125. package/dist/gs/reflect/reflect.gs.d.ts +0 -132
  126. package/dist/gs/reflect/reflect.gs.js +0 -437
  127. package/dist/gs/reflect/reflect.gs.js.map +0 -1
  128. package/dist/gs/reflect/swapper.gs.d.ts +0 -1
  129. package/dist/gs/reflect/swapper.gs.js +0 -32
  130. package/dist/gs/reflect/swapper.gs.js.map +0 -1
  131. package/dist/gs/reflect/type.gs.d.ts +0 -4
  132. package/dist/gs/reflect/type.gs.js +0 -21
  133. package/dist/gs/reflect/type.gs.js.map +0 -1
  134. package/dist/gs/reflect/value.gs.d.ts +0 -4
  135. package/dist/gs/reflect/value.gs.js +0 -12
  136. package/dist/gs/reflect/value.gs.js.map +0 -1
  137. package/dist/gs/reflect/visiblefields.gs.d.ts +0 -3
  138. package/dist/gs/reflect/visiblefields.gs.js +0 -123
  139. package/dist/gs/reflect/visiblefields.gs.js.map +0 -1
  140. package/dist/gs/stringslite/index.d.ts +0 -1
  141. package/dist/gs/stringslite/index.js +0 -2
  142. package/dist/gs/stringslite/index.js.map +0 -1
  143. package/dist/gs/stringslite/strings.d.ts +0 -11
  144. package/dist/gs/stringslite/strings.js +0 -67
  145. package/dist/gs/stringslite/strings.js.map +0 -1
  146. package/gs/bytes/metadata.go +0 -12
  147. package/gs/fmt/metadata.go +0 -7
  148. package/gs/internal/metadata.go +0 -7
  149. package/gs/io/io.go +0 -75
  150. package/gs/io/metadata.go +0 -11
  151. package/gs/maps/metadata.go +0 -8
  152. package/gs/math/metadata.go +0 -7
  153. package/gs/os/metadata.go +0 -17
  154. package/gs/path/metadata.go +0 -8
  155. package/gs/reflect/metadata.go +0 -7
  156. package/gs/strconv/metadata.go +0 -7
  157. package/gs/strings/metadata.go +0 -11
  158. package/gs/sync/metadata.go +0 -7
  159. package/gs/sync/sync.go +0 -64
package/compiler/expr.go CHANGED
@@ -294,70 +294,6 @@ func (c *GoToTSCompiler) isNamedNumericType(t types.Type) bool {
294
294
  return false
295
295
  }
296
296
 
297
- // isWrapperType checks if a type is implemented as a wrapper class with valueOf() method
298
- // This is true for named types that have methods defined on them
299
- func (c *GoToTSCompiler) isWrapperType(t types.Type) bool {
300
- if t == nil {
301
- return false
302
- }
303
-
304
- // Follow any type aliases to get to the actual named type
305
- namedType, ok := t.(*types.Named)
306
- if !ok {
307
- return false
308
- }
309
-
310
- // If the named type has methods, it's implemented as a class with valueOf()
311
- numMethods := namedType.NumMethods()
312
- return numMethods > 0
313
- }
314
-
315
- // needsValueOfForBitwiseOp checks if an operand in a bitwise operation needs .valueOf() to be called
316
- // This is needed for custom types (like FileMode) that have a valueOf() method and need to be treated as numbers
317
- func (c *GoToTSCompiler) needsValueOfForBitwiseOp(expr ast.Expr) bool {
318
- if c.pkg == nil || c.pkg.TypesInfo == nil {
319
- return false
320
- }
321
-
322
- exprType := c.pkg.TypesInfo.TypeOf(expr)
323
- if exprType == nil {
324
- return false
325
- }
326
-
327
- // Don't add valueOf() for basic literals (numeric, string, bool literals)
328
- switch expr.(type) {
329
- case *ast.BasicLit:
330
- return false
331
- }
332
-
333
- // Check if this is a compile-time constant of a primitive type
334
- if tv, ok := c.pkg.TypesInfo.Types[expr]; ok {
335
- if tv.Value != nil {
336
- // This is a constant expression - but only skip valueOf() if it's truly a primitive type
337
- // (not a named type with methods that happens to be constant)
338
- if _, isBasic := exprType.(*types.Basic); isBasic {
339
- // Primitive constant, don't add valueOf()
340
- return false
341
- }
342
- }
343
- }
344
-
345
- // Check if this type is implemented as a wrapper class with valueOf()
346
- return c.isWrapperType(exprType)
347
- }
348
-
349
- // writeBitwiseOperand writes an operand for a bitwise operation, adding .valueOf() if needed
350
- func (c *GoToTSCompiler) writeBitwiseOperand(expr ast.Expr) error {
351
- if c.needsValueOfForBitwiseOp(expr) {
352
- if err := c.WriteValueExpr(expr); err != nil {
353
- return err
354
- }
355
- c.tsw.WriteLiterally(".valueOf()")
356
- return nil
357
- }
358
- return c.WriteValueExpr(expr)
359
- }
360
-
361
297
  // WriteBinaryExpr translates a Go binary expression (`ast.BinaryExpr`) into its
362
298
  // TypeScript equivalent.
363
299
  // It handles several cases:
@@ -542,16 +478,10 @@ func (c *GoToTSCompiler) WriteBinaryExpr(exp *ast.BinaryExpr) error {
542
478
  c.tsw.WriteLiterally("(") // Add opening parenthesis for bitwise operations
543
479
  }
544
480
 
545
- // For bitwise operations, use special operand writing that adds .valueOf() when needed
546
- if isBitwise {
547
- if err := c.writeBitwiseOperand(exp.X); err != nil {
548
- return fmt.Errorf("failed to write binary expression left operand: %w", err)
549
- }
550
- } else {
551
- if err := c.WriteValueExpr(exp.X); err != nil {
552
- return fmt.Errorf("failed to write binary expression left operand: %w", err)
553
- }
481
+ if err := c.WriteValueExpr(exp.X); err != nil {
482
+ return fmt.Errorf("failed to write binary expression left operand: %w", err)
554
483
  }
484
+
555
485
  c.tsw.WriteLiterally(" ")
556
486
  tokStr, ok := TokenToTs(exp.Op)
557
487
  if !ok {
@@ -561,15 +491,8 @@ func (c *GoToTSCompiler) WriteBinaryExpr(exp *ast.BinaryExpr) error {
561
491
  c.tsw.WriteLiterally(tokStr)
562
492
  c.tsw.WriteLiterally(" ")
563
493
 
564
- // For bitwise operations, use special operand writing that adds .valueOf() when needed
565
- if isBitwise {
566
- if err := c.writeBitwiseOperand(exp.Y); err != nil {
567
- return fmt.Errorf("failed to write binary expression right operand: %w", err)
568
- }
569
- } else {
570
- if err := c.WriteValueExpr(exp.Y); err != nil {
571
- return fmt.Errorf("failed to write binary expression right operand: %w", err)
572
- }
494
+ if err := c.WriteValueExpr(exp.Y); err != nil {
495
+ return fmt.Errorf("failed to write binary expression right operand: %w", err)
573
496
  }
574
497
 
575
498
  if isBitwise {
@@ -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.IsNamedBasicType(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.IsNamedBasicType(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)