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.
Files changed (197) hide show
  1. package/README.md +13 -1
  2. package/cmd/goscript/cmd_compile.go +70 -69
  3. package/cmd/goscript/cmd_compile_test.go +79 -0
  4. package/cmd/goscript/main.go +10 -5
  5. package/compiler/compile-request.go +218 -0
  6. package/compiler/compiler.go +16 -1336
  7. package/compiler/compliance_test.go +196 -0
  8. package/compiler/config.go +6 -13
  9. package/compiler/diagnostic.go +70 -0
  10. package/compiler/index.test.ts +28 -28
  11. package/compiler/index.ts +40 -72
  12. package/compiler/lowered-program.go +132 -0
  13. package/compiler/lowering.go +3576 -0
  14. package/compiler/override-registry.go +422 -0
  15. package/compiler/override-registry_test.go +207 -0
  16. package/compiler/package-graph.go +231 -0
  17. package/compiler/package-graph_test.go +281 -0
  18. package/compiler/result.go +13 -0
  19. package/compiler/runtime-contract.go +279 -0
  20. package/compiler/runtime-contract_test.go +90 -0
  21. package/compiler/semantic-model-types.go +110 -0
  22. package/compiler/semantic-model.go +922 -0
  23. package/compiler/semantic-model_test.go +416 -0
  24. package/compiler/service.go +133 -0
  25. package/compiler/skeleton_test.go +1145 -0
  26. package/compiler/typescript-emitter.go +663 -0
  27. package/compiler/wasm/compile.go +2 -3
  28. package/compiler/wasm/compile_test.go +29 -0
  29. package/compiler/wasm_api.go +10 -159
  30. package/dist/compiler/index.d.ts +1 -3
  31. package/dist/compiler/index.js +31 -55
  32. package/dist/compiler/index.js.map +1 -1
  33. package/dist/gs/builtin/builtin.d.ts +13 -0
  34. package/dist/gs/builtin/builtin.js +27 -7
  35. package/dist/gs/builtin/builtin.js.map +1 -1
  36. package/dist/gs/builtin/channel.d.ts +3 -3
  37. package/dist/gs/builtin/channel.js.map +1 -1
  38. package/dist/gs/builtin/hostio.d.ts +86 -0
  39. package/dist/gs/builtin/hostio.js +266 -0
  40. package/dist/gs/builtin/hostio.js.map +1 -0
  41. package/dist/gs/builtin/index.d.ts +1 -0
  42. package/dist/gs/builtin/index.js +1 -0
  43. package/dist/gs/builtin/index.js.map +1 -1
  44. package/dist/gs/builtin/print.d.ts +8 -0
  45. package/dist/gs/builtin/print.js +111 -0
  46. package/dist/gs/builtin/print.js.map +1 -0
  47. package/dist/gs/builtin/slice.d.ts +1 -1
  48. package/dist/gs/builtin/slice.js.map +1 -1
  49. package/dist/gs/builtin/type.d.ts +11 -0
  50. package/dist/gs/builtin/type.js +55 -1
  51. package/dist/gs/builtin/type.js.map +1 -1
  52. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  53. package/dist/gs/bytes/bytes.gs.js.map +1 -1
  54. package/dist/gs/bytes/reader.gs.js.map +1 -1
  55. package/dist/gs/context/context.js.map +1 -1
  56. package/dist/gs/crypto/rand/index.d.ts +5 -0
  57. package/dist/gs/crypto/rand/index.js +77 -0
  58. package/dist/gs/crypto/rand/index.js.map +1 -0
  59. package/dist/gs/encoding/json/index.d.ts +3 -0
  60. package/dist/gs/encoding/json/index.js +160 -0
  61. package/dist/gs/encoding/json/index.js.map +1 -0
  62. package/dist/gs/fmt/fmt.js +2 -22
  63. package/dist/gs/fmt/fmt.js.map +1 -1
  64. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +1 -1
  65. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +1 -1
  66. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  67. package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
  68. package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
  69. package/dist/gs/github.com/pkg/errors/stack.js.map +1 -1
  70. package/dist/gs/go/scanner/index.d.ts +29 -0
  71. package/dist/gs/go/scanner/index.js +120 -0
  72. package/dist/gs/go/scanner/index.js.map +1 -0
  73. package/dist/gs/go/token/index.d.ts +31 -0
  74. package/dist/gs/go/token/index.js +82 -0
  75. package/dist/gs/go/token/index.js.map +1 -0
  76. package/dist/gs/internal/abi/index.js.map +1 -1
  77. package/dist/gs/io/fs/fs.js.map +1 -1
  78. package/dist/gs/io/fs/readdir.js.map +1 -1
  79. package/dist/gs/io/fs/readfile.js.map +1 -1
  80. package/dist/gs/io/fs/stat.js.map +1 -1
  81. package/dist/gs/io/fs/sub.js.map +1 -1
  82. package/dist/gs/io/io.js.map +1 -1
  83. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  84. package/dist/gs/os/error.gs.js +2 -4
  85. package/dist/gs/os/error.gs.js.map +1 -1
  86. package/dist/gs/os/exec.gs.js.map +1 -1
  87. package/dist/gs/os/exec_posix.gs.js.map +1 -1
  88. package/dist/gs/os/rawconn_js.gs.js.map +1 -1
  89. package/dist/gs/os/root_js.gs.js.map +1 -1
  90. package/dist/gs/os/tempfile.gs.js +66 -9
  91. package/dist/gs/os/tempfile.gs.js.map +1 -1
  92. package/dist/gs/os/types.gs.js.map +1 -1
  93. package/dist/gs/os/types_js.gs.d.ts +2 -51
  94. package/dist/gs/os/types_js.gs.js +67 -105
  95. package/dist/gs/os/types_js.gs.js.map +1 -1
  96. package/dist/gs/os/types_unix.gs.js.map +1 -1
  97. package/dist/gs/path/filepath/match.js.map +1 -1
  98. package/dist/gs/path/match.js.map +1 -1
  99. package/dist/gs/path/path.js.map +1 -1
  100. package/dist/gs/reflect/index.d.ts +2 -2
  101. package/dist/gs/reflect/index.js +1 -1
  102. package/dist/gs/reflect/index.js.map +1 -1
  103. package/dist/gs/reflect/map.js.map +1 -1
  104. package/dist/gs/reflect/type.d.ts +2 -1
  105. package/dist/gs/reflect/type.js +85 -14
  106. package/dist/gs/reflect/type.js.map +1 -1
  107. package/dist/gs/reflect/types.js.map +1 -1
  108. package/dist/gs/reflect/visiblefields.js.map +1 -1
  109. package/dist/gs/runtime/runtime.js.map +1 -1
  110. package/dist/gs/sort/sort.gs.js.map +1 -1
  111. package/dist/gs/strconv/atoi.gs.js.map +1 -1
  112. package/dist/gs/strconv/quote.gs.js.map +1 -1
  113. package/dist/gs/strings/builder.js.map +1 -1
  114. package/dist/gs/strings/reader.js.map +1 -1
  115. package/dist/gs/strings/replace.js.map +1 -1
  116. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  117. package/dist/gs/sync/atomic/value.gs.js.map +1 -1
  118. package/dist/gs/sync/sync.d.ts +1 -0
  119. package/dist/gs/sync/sync.js +12 -0
  120. package/dist/gs/sync/sync.js.map +1 -1
  121. package/dist/gs/time/time.js.map +1 -1
  122. package/dist/gs/unicode/unicode.js.map +1 -1
  123. package/go.mod +2 -2
  124. package/gs/builtin/builtin.ts +31 -6
  125. package/gs/builtin/hostio.test.ts +246 -0
  126. package/gs/builtin/hostio.ts +413 -0
  127. package/gs/builtin/index.ts +1 -0
  128. package/gs/builtin/print.test.ts +48 -0
  129. package/gs/builtin/print.ts +154 -0
  130. package/gs/builtin/runtime-contract.test.ts +230 -0
  131. package/gs/builtin/type.ts +84 -1
  132. package/gs/crypto/rand/index.test.ts +32 -0
  133. package/gs/crypto/rand/index.ts +90 -0
  134. package/gs/crypto/rand/meta.json +5 -0
  135. package/gs/encoding/json/index.test.ts +65 -0
  136. package/gs/encoding/json/index.ts +186 -0
  137. package/gs/fmt/fmt.test.ts +41 -30
  138. package/gs/fmt/fmt.ts +2 -22
  139. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +23 -0
  140. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +3 -1
  141. package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/meta.json +3 -1
  142. package/gs/go/scanner/index.test.ts +50 -0
  143. package/gs/go/scanner/index.ts +157 -0
  144. package/gs/go/token/index.test.ts +21 -0
  145. package/gs/go/token/index.ts +120 -0
  146. package/gs/os/file_unix_js.test.ts +103 -0
  147. package/gs/os/meta.json +1 -2
  148. package/gs/os/tempfile.gs.test.ts +85 -0
  149. package/gs/os/tempfile.gs.ts +71 -11
  150. package/gs/os/types_js.gs.ts +74 -153
  151. package/gs/reflect/index.ts +1 -1
  152. package/gs/reflect/type.ts +106 -17
  153. package/gs/reflect/typefor.test.ts +75 -0
  154. package/gs/sync/sync.test.ts +24 -0
  155. package/gs/sync/sync.ts +12 -0
  156. package/package.json +13 -13
  157. package/compiler/analysis.go +0 -3475
  158. package/compiler/analysis_test.go +0 -338
  159. package/compiler/assignment.go +0 -580
  160. package/compiler/builtin_test.go +0 -92
  161. package/compiler/code-writer.go +0 -115
  162. package/compiler/compiler_test.go +0 -149
  163. package/compiler/composite-lit.go +0 -779
  164. package/compiler/config_test.go +0 -62
  165. package/compiler/constraint.go +0 -86
  166. package/compiler/decl.go +0 -801
  167. package/compiler/expr-call-async.go +0 -188
  168. package/compiler/expr-call-builtins.go +0 -208
  169. package/compiler/expr-call-helpers.go +0 -382
  170. package/compiler/expr-call-make.go +0 -318
  171. package/compiler/expr-call-type-conversion.go +0 -520
  172. package/compiler/expr-call.go +0 -413
  173. package/compiler/expr-selector.go +0 -343
  174. package/compiler/expr-star.go +0 -82
  175. package/compiler/expr-type.go +0 -442
  176. package/compiler/expr-value.go +0 -89
  177. package/compiler/expr.go +0 -773
  178. package/compiler/field.go +0 -183
  179. package/compiler/gs_dependencies_test.go +0 -298
  180. package/compiler/lit.go +0 -322
  181. package/compiler/output.go +0 -72
  182. package/compiler/primitive.go +0 -149
  183. package/compiler/protobuf.go +0 -697
  184. package/compiler/sanitize.go +0 -100
  185. package/compiler/spec-struct.go +0 -995
  186. package/compiler/spec-value.go +0 -540
  187. package/compiler/spec.go +0 -725
  188. package/compiler/stmt-assign.go +0 -664
  189. package/compiler/stmt-for.go +0 -266
  190. package/compiler/stmt-range.go +0 -475
  191. package/compiler/stmt-select.go +0 -262
  192. package/compiler/stmt-type-switch.go +0 -147
  193. package/compiler/stmt.go +0 -1308
  194. package/compiler/type-assert.go +0 -386
  195. package/compiler/type-info.go +0 -156
  196. package/compiler/type-utils.go +0 -207
  197. package/compiler/type.go +0 -892
@@ -1,338 +0,0 @@
1
- package compiler
2
-
3
- import (
4
- "go/ast"
5
- "go/parser"
6
- "go/token"
7
- "go/types"
8
- "os"
9
- "slices"
10
- "testing"
11
-
12
- "golang.org/x/tools/go/packages"
13
- )
14
-
15
- // TestAnalysisVarRefLogic verifies that the analysis correctly identifies
16
- // which variables need variable references based on actual tests test cases
17
- func TestAnalysisVarRefLogic(t *testing.T) {
18
- tests := []struct {
19
- name string
20
- code string
21
- expected map[string]AnalysisExpectation
22
- }{
23
- {
24
- name: "pointer_range_loop",
25
- code: `package main
26
- func main() {
27
- arr := [3]int{1, 2, 3}
28
- arrPtr := &arr
29
- for i, v := range arrPtr {
30
- println("index:", i, "value:", v)
31
- }
32
- }`,
33
- expected: map[string]AnalysisExpectation{
34
- "arr": {NeedsVarRef: true, NeedsVarRefAccess: true}, // varrefed because &arr is taken
35
- "arrPtr": {NeedsVarRef: false, NeedsVarRefAccess: true}, // NOT varrefed, but points to varrefed value
36
- "i": {NeedsVarRef: false, NeedsVarRefAccess: false}, // regular loop variable
37
- "v": {NeedsVarRef: false, NeedsVarRefAccess: false}, // regular loop variable
38
- },
39
- },
40
- {
41
- name: "simple_pointers",
42
- code: `package main
43
- type MyStruct struct {
44
- Val int
45
- }
46
- func main() {
47
- s1 := MyStruct{Val: 1}
48
- p1 := &s1
49
- pp1 := &p1
50
- p4 := &s1
51
- _ = p4
52
- _ = pp1
53
- }`,
54
- expected: map[string]AnalysisExpectation{
55
- "s1": {NeedsVarRef: true, NeedsVarRefAccess: true}, // varrefed because &s1 is taken
56
- "p1": {NeedsVarRef: true, NeedsVarRefAccess: true}, // varrefed because &p1 is taken
57
- "pp1": {NeedsVarRef: false, NeedsVarRefAccess: true}, // NOT varrefed, points to varrefed value
58
- "p4": {NeedsVarRef: false, NeedsVarRefAccess: true}, // NOT varrefed, points to varrefed value
59
- },
60
- },
61
- {
62
- name: "varref_deref_struct",
63
- code: `package main
64
- type MyStruct struct {
65
- MyInt int
66
- }
67
- func main() {
68
- myStruct := &MyStruct{}
69
- (*myStruct).MyInt = 5
70
- println((*myStruct).MyInt)
71
- }`,
72
- expected: map[string]AnalysisExpectation{
73
- "myStruct": {NeedsVarRef: false, NeedsVarRefAccess: false}, // NOT varrefed, direct pointer to struct
74
- },
75
- },
76
- {
77
- name: "pointer_composite_literal_untyped",
78
- code: `package main
79
- func main() {
80
- var ptr *struct{ x int }
81
- ptr = &struct{ x int }{42}
82
- println("Pointer value x:", ptr.x)
83
-
84
- data := []*struct{ x int }{{42}, {43}}
85
- println("First element x:", data[0].x)
86
- println("Second element x:", data[1].x)
87
- }`,
88
- expected: map[string]AnalysisExpectation{
89
- "ptr": {NeedsVarRef: false, NeedsVarRefAccess: false}, // Should NOT be varrefed
90
- "data": {NeedsVarRef: false, NeedsVarRefAccess: false}, // Should NOT be varrefed
91
- },
92
- },
93
- {
94
- name: "var_declaration_composite_literal",
95
- code: `package main
96
- type MockInode struct {
97
- Value int
98
- }
99
- func main() {
100
- var childInode *MockInode = &MockInode{Value: 42}
101
- println("childInode.Value:", childInode.Value)
102
- }`,
103
- expected: map[string]AnalysisExpectation{
104
- "childInode": {NeedsVarRef: false, NeedsVarRefAccess: false}, // Should NOT be varrefed
105
- },
106
- },
107
- }
108
-
109
- for _, tt := range tests {
110
- t.Run(tt.name, func(t *testing.T) {
111
- analysis, objects := parseAndAnalyze(t, tt.code)
112
-
113
- for varName, expected := range tt.expected {
114
- obj, exists := objects[varName]
115
- if !exists {
116
- t.Errorf("Variable %q not found in parsed objects", varName)
117
- continue
118
- }
119
-
120
- actualNeedsVarRef := analysis.NeedsVarRef(obj)
121
- actualNeedsVarRefAccess := analysis.NeedsVarRefAccess(obj)
122
-
123
- if actualNeedsVarRef != expected.NeedsVarRef {
124
- t.Errorf("Variable %q: NeedsVarRef = %v, want %v",
125
- varName, actualNeedsVarRef, expected.NeedsVarRef)
126
- }
127
-
128
- if actualNeedsVarRefAccess != expected.NeedsVarRefAccess {
129
- t.Errorf("Variable %q: NeedsVarRefAccess = %v, want %v",
130
- varName, actualNeedsVarRefAccess, expected.NeedsVarRefAccess)
131
- }
132
-
133
- // Print debug info
134
- t.Logf("Variable %q: NeedsVarRef=%v, NeedsVarRefAccess=%v",
135
- varName, actualNeedsVarRef, actualNeedsVarRefAccess)
136
- }
137
- })
138
- }
139
- }
140
-
141
- // AnalysisExpectation defines what we expect from the analysis for a variable
142
- type AnalysisExpectation struct {
143
- NeedsVarRef bool
144
- NeedsVarRefAccess bool
145
- }
146
-
147
- // parseAndAnalyze parses Go code and runs the analysis, returning the analysis and variable objects
148
- func parseAndAnalyze(t *testing.T, code string) (*Analysis, map[string]types.Object) {
149
- // Parse the code
150
- fset := token.NewFileSet()
151
- file, err := parser.ParseFile(fset, "test.go", code, parser.ParseComments)
152
- if err != nil {
153
- t.Fatalf("Failed to parse code: %v", err)
154
- }
155
-
156
- // Create a minimal package for type checking
157
- pkg := &packages.Package{
158
- Syntax: []*ast.File{file},
159
- TypesInfo: &types.Info{
160
- Types: make(map[ast.Expr]types.TypeAndValue),
161
- Defs: make(map[*ast.Ident]types.Object),
162
- Uses: make(map[*ast.Ident]types.Object),
163
- },
164
- Fset: fset,
165
- }
166
-
167
- // Type check the package
168
- typeConfig := &types.Config{}
169
- typePkg, err := typeConfig.Check("main", fset, pkg.Syntax, pkg.TypesInfo)
170
- if err != nil {
171
- t.Fatalf("Failed to type check: %v", err)
172
- }
173
- pkg.Types = typePkg
174
-
175
- // Run package-level analysis
176
- analysis := AnalyzePackageFiles(pkg, nil)
177
-
178
- // Collect variable objects
179
- objects := make(map[string]types.Object)
180
- for ident, obj := range pkg.TypesInfo.Defs {
181
- if obj != nil && ident.Name != "_" {
182
- if _, isVar := obj.(*types.Var); isVar {
183
- objects[ident.Name] = obj
184
- }
185
- }
186
- }
187
-
188
- return analysis, objects
189
- }
190
-
191
- // TestAnalysisDebugInfo prints debug information about variable usage for manual inspection
192
- func TestAnalysisDebugInfo(t *testing.T) {
193
- code := `package main
194
- func main() {
195
- arr := [3]int{1, 2, 3}
196
- arrPtr := &arr
197
- for i, v := range arrPtr {
198
- println("index:", i, "value:", v)
199
- }
200
- }`
201
-
202
- analysis, objects := parseAndAnalyze(t, code)
203
-
204
- t.Log("=== Analysis Debug Information ===")
205
- for varName, obj := range objects {
206
- needsVarRef := analysis.NeedsVarRef(obj)
207
- needsVarRefAccess := analysis.NeedsVarRefAccess(obj)
208
-
209
- t.Logf("Variable: %s", varName)
210
- t.Logf(" Type: %s", obj.Type())
211
- t.Logf(" NeedsVarRef: %v", needsVarRef)
212
- t.Logf(" NeedsVarRefAccess: %v", needsVarRefAccess)
213
-
214
- // Print usage info if available
215
- if usage, exists := analysis.VariableUsage[obj]; exists {
216
- t.Logf(" Sources: %d", len(usage.Sources))
217
- for i, src := range usage.Sources {
218
- srcName := "nil"
219
- if src.Object != nil {
220
- srcName = src.Object.Name()
221
- }
222
- t.Logf(" [%d] %s (type: %v)", i, srcName, src.Type)
223
- }
224
- t.Logf(" Destinations: %d", len(usage.Destinations))
225
- for i, dst := range usage.Destinations {
226
- dstName := "nil"
227
- if dst.Object != nil {
228
- dstName = dst.Object.Name()
229
- }
230
- t.Logf(" [%d] %s (type: %v)", i, dstName, dst.Type)
231
- }
232
- }
233
- t.Log("")
234
- }
235
- }
236
-
237
- // TestWrapperTypeDetection verifies that the analysis correctly identifies wrapper types
238
- func TestWrapperTypeDetection(t *testing.T) {
239
- // Use the actual tests test case
240
- testPath := "../tests/tests/wrapper_type_args"
241
-
242
- // Load the package using the packages config like the main compiler does
243
- cfg := &packages.Config{
244
- Mode: packages.NeedName |
245
- packages.NeedFiles |
246
- packages.NeedCompiledGoFiles |
247
- packages.NeedImports |
248
- packages.NeedDeps |
249
- packages.NeedExportFile |
250
- packages.NeedTypes |
251
- packages.NeedSyntax |
252
- packages.NeedTypesInfo |
253
- packages.NeedTypesSizes,
254
- Tests: false,
255
- Env: append(os.Environ(), "GOOS=js", "GOARCH=wasm"),
256
- }
257
-
258
- pkgs, err := packages.Load(cfg, testPath)
259
- if err != nil {
260
- t.Fatalf("Failed to load test package: %v", err)
261
- }
262
-
263
- if len(pkgs) != 1 {
264
- t.Fatalf("Expected 1 package, got %d", len(pkgs))
265
- }
266
-
267
- pkg := pkgs[0]
268
- if len(pkg.Errors) > 0 {
269
- t.Fatalf("Package has errors: %v", pkg.Errors[0])
270
- }
271
-
272
- // Run package-level analysis
273
- if len(pkg.Syntax) == 0 {
274
- t.Fatal("No syntax files found")
275
- }
276
-
277
- analysis := AnalyzePackageFiles(pkg, nil)
278
-
279
- // Verify the NamedBasicTypes map was initialized
280
- if analysis.NamedBasicTypes == nil {
281
- t.Error("NamedBasicTypes map was not initialized")
282
- }
283
-
284
- // Test some type lookups to verify wrapper type detection works
285
- // We'll check if MyMode (which has methods) is detected as a wrapper type
286
- scope := pkg.Types.Scope()
287
-
288
- // Check if MyMode is detected as a wrapper type
289
- if obj := scope.Lookup("MyMode"); obj != nil {
290
- if typeName, ok := obj.(*types.TypeName); ok {
291
- isWrapper := analysis.IsNamedBasicType(typeName.Type())
292
- if !isWrapper {
293
- t.Errorf("MyMode should be detected as wrapper type, got %v", isWrapper)
294
- }
295
- t.Logf("MyMode wrapper detection: %v (correct)", isWrapper)
296
- }
297
- }
298
-
299
- // Test that regular struct types are not detected as wrapper types
300
- if obj := scope.Lookup("MyDir"); obj != nil {
301
- if typeName, ok := obj.(*types.TypeName); ok {
302
- isWrapper := analysis.IsNamedBasicType(typeName.Type())
303
- if isWrapper {
304
- t.Errorf("MyDir should not be detected as wrapper type, got %v", isWrapper)
305
- }
306
- t.Logf("MyDir wrapper detection: %v (correct)", isWrapper)
307
- }
308
- }
309
-
310
- t.Logf("Analysis completed successfully with %d named basic types tracked", len(analysis.NamedBasicTypes))
311
- }
312
-
313
- // TestDiscoverGsPackages verifies that the discoverEmbeddedGsPackages function
314
- // can find packages in the embedded gs/ directory
315
- func TestDiscoverGsPackages(t *testing.T) {
316
- analysis := NewAnalysis(nil)
317
-
318
- // Test package discovery using the embedded filesystem
319
- packages := analysis.discoverEmbeddedGsPackages()
320
- t.Logf("Discovered %d packages:", len(packages))
321
- for _, pkg := range packages {
322
- t.Logf(" - %s", pkg)
323
- }
324
-
325
- // We should find at least some packages
326
- if len(packages) == 0 {
327
- t.Errorf("Expected to find at least one package in gs/ directory")
328
- }
329
-
330
- // Check for some known packages that should exist
331
- expectedPackages := []string{"sync", "bytes", "strings"}
332
- for _, expected := range expectedPackages {
333
- found := slices.Contains(packages, expected)
334
- if !found {
335
- t.Logf("Expected package '%s' not found in discovered packages: %v", expected, packages)
336
- }
337
- }
338
- }