goscript 0.0.84 → 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 +23 -0
- 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 +15 -1
- package/dist/gs/builtin/hostio.js +134 -49
- package/dist/gs/builtin/hostio.js.map +1 -1
- 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/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.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.js +9 -9
- 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 +27 -0
- package/gs/builtin/hostio.test.ts +177 -0
- package/gs/builtin/hostio.ts +171 -56
- package/gs/builtin/index.ts +1 -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/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 +50 -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 +9 -9
- 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
|
@@ -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
|
-
}
|