goscript 0.1.4 → 0.2.1
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 +5 -2
- package/cmd/go_js_wasm_exec/main.go +201 -0
- package/cmd/go_js_wasm_exec/main_test.go +83 -0
- package/cmd/goscript/{cmd_compile.go → cmd-compile.go} +7 -0
- package/cmd/goscript/cmd-test.go +14 -0
- package/cmd/goscript/cmd-test_test.go +1 -1
- package/cmd/goscript-wasm/main.go +38 -6
- package/compiler/compile-request.go +12 -9
- package/compiler/compliance_test.go +0 -1
- package/compiler/config.go +2 -0
- package/compiler/diagnostic.go +104 -12
- package/compiler/diagnostic_test.go +106 -0
- package/compiler/gotest/request.go +28 -0
- package/compiler/gotest/runner.go +354 -44
- package/compiler/gotest/runner_test.go +293 -1
- package/compiler/gotest/testdata/browserapi/browserapi_test.go +20 -0
- package/compiler/gotest/testdata/browserapi/go.mod +3 -0
- package/compiler/index.test.ts +23 -0
- package/compiler/lowered-program.go +33 -24
- package/compiler/lowering.go +746 -194
- package/compiler/lowering_bench_test.go +42 -27
- package/compiler/lowering_internal_test.go +18 -0
- package/compiler/override-facts.go +15 -0
- package/compiler/override-parity-verifier.go +450 -0
- package/compiler/override-parity.go +122 -0
- package/compiler/override-registry_test.go +559 -0
- package/compiler/protobuf-ts-binding.go +567 -0
- package/compiler/protobuf-ts-binding_test.go +402 -0
- package/compiler/runtime-contract.go +4 -0
- package/compiler/runtime-contract_test.go +2 -0
- package/compiler/semantic-model-types.go +9 -4
- package/compiler/semantic-model.go +282 -70
- package/compiler/semantic-model_test.go +82 -1
- package/compiler/service.go +21 -1
- package/compiler/skeleton_test.go +118 -10
- package/compiler/typescript-emitter.go +128 -13
- package/compiler/wasm/compile_test.go +37 -4
- package/compiler/{wasm_api.go → wasm-api.go} +57 -7
- package/dist/gs/builtin/hostio.js +5 -0
- package/dist/gs/builtin/hostio.js.map +1 -1
- package/dist/gs/builtin/slice.d.ts +13 -2
- package/dist/gs/builtin/slice.js +187 -6
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/builtin/type.d.ts +13 -5
- package/dist/gs/builtin/type.js +153 -60
- package/dist/gs/builtin/type.js.map +1 -1
- package/dist/gs/builtin/varRef.d.ts +11 -0
- package/dist/gs/builtin/varRef.js +57 -2
- package/dist/gs/builtin/varRef.js.map +1 -1
- package/dist/gs/bytes/buffer.gs.js +1 -1
- package/dist/gs/bytes/buffer.gs.js.map +1 -1
- package/dist/gs/bytes/reader.gs.js +1 -1
- package/dist/gs/bytes/reader.gs.js.map +1 -1
- package/dist/gs/compress/zlib/index.d.ts +10 -3
- package/dist/gs/compress/zlib/index.js +50 -16
- package/dist/gs/compress/zlib/index.js.map +1 -1
- package/dist/gs/encoding/json/index.d.ts +114 -0
- package/dist/gs/encoding/json/index.js +544 -36
- package/dist/gs/encoding/json/index.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +101 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +589 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +1 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +17 -11
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -1
- package/dist/gs/github.com/pkg/errors/errors.js +54 -30
- package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
- package/dist/gs/go/scanner/index.d.ts +2 -0
- package/dist/gs/go/scanner/index.js +29 -5
- package/dist/gs/go/scanner/index.js.map +1 -1
- package/dist/gs/go/token/index.js +22 -6
- package/dist/gs/go/token/index.js.map +1 -1
- package/dist/gs/hash/index.d.ts +6 -0
- package/dist/gs/hash/index.js +20 -0
- package/dist/gs/hash/index.js.map +1 -1
- package/dist/gs/internal/byteorder/index.js +2 -2
- package/dist/gs/internal/byteorder/index.js.map +1 -1
- package/dist/gs/internal/goarch/index.d.ts +43 -3
- package/dist/gs/internal/goarch/index.js +42 -10
- package/dist/gs/internal/goarch/index.js.map +1 -1
- package/dist/gs/io/fs/fs.js +26 -14
- package/dist/gs/io/fs/fs.js.map +1 -1
- package/dist/gs/io/fs/readdir.js +4 -2
- package/dist/gs/io/fs/readdir.js.map +1 -1
- package/dist/gs/io/fs/sub.js +8 -1
- package/dist/gs/io/fs/sub.js.map +1 -1
- package/dist/gs/io/io.d.ts +2 -0
- package/dist/gs/io/io.js.map +1 -1
- package/dist/gs/math/bits/index.d.ts +5 -0
- package/dist/gs/math/bits/index.js +16 -4
- package/dist/gs/math/bits/index.js.map +1 -1
- package/dist/gs/mime/index.d.ts +16 -0
- package/dist/gs/mime/index.js +315 -6
- package/dist/gs/mime/index.js.map +1 -1
- package/dist/gs/net/http/httptest/index.d.ts +12 -0
- package/dist/gs/net/http/httptest/index.js +85 -6
- package/dist/gs/net/http/httptest/index.js.map +1 -1
- package/dist/gs/net/http/index.d.ts +300 -5
- package/dist/gs/net/http/index.js +1598 -58
- package/dist/gs/net/http/index.js.map +1 -1
- package/dist/gs/os/dir_unix.gs.js +1 -1
- package/dist/gs/os/dir_unix.gs.js.map +1 -1
- package/dist/gs/os/error.gs.js +1 -1
- package/dist/gs/os/error.gs.js.map +1 -1
- package/dist/gs/os/exec.gs.d.ts +1 -0
- package/dist/gs/os/exec.gs.js +4 -8
- package/dist/gs/os/exec.gs.js.map +1 -1
- package/dist/gs/os/exec_posix.gs.js +1 -1
- package/dist/gs/os/exec_posix.gs.js.map +1 -1
- package/dist/gs/os/index.d.ts +1 -1
- package/dist/gs/os/index.js +1 -1
- package/dist/gs/os/index.js.map +1 -1
- package/dist/gs/os/proc.gs.d.ts +4 -0
- package/dist/gs/os/proc.gs.js +12 -6
- package/dist/gs/os/proc.gs.js.map +1 -1
- package/dist/gs/os/root_js.gs.js +1 -1
- package/dist/gs/os/root_js.gs.js.map +1 -1
- package/dist/gs/os/types.gs.js +1 -1
- package/dist/gs/os/types.gs.js.map +1 -1
- package/dist/gs/os/types_js.gs.js +1 -1
- package/dist/gs/os/types_js.gs.js.map +1 -1
- package/dist/gs/os/types_unix.gs.js +1 -1
- package/dist/gs/os/types_unix.gs.js.map +1 -1
- package/dist/gs/path/path.js +11 -7
- package/dist/gs/path/path.js.map +1 -1
- package/dist/gs/reflect/index.d.ts +5 -4
- package/dist/gs/reflect/index.js +4 -3
- package/dist/gs/reflect/index.js.map +1 -1
- package/dist/gs/reflect/map.js +15 -0
- package/dist/gs/reflect/map.js.map +1 -1
- package/dist/gs/reflect/type.d.ts +25 -6
- package/dist/gs/reflect/type.js +1475 -228
- package/dist/gs/reflect/type.js.map +1 -1
- package/dist/gs/reflect/types.d.ts +14 -6
- package/dist/gs/reflect/types.js +35 -1
- package/dist/gs/reflect/types.js.map +1 -1
- package/dist/gs/reflect/value.d.ts +1 -0
- package/dist/gs/reflect/value.js +83 -41
- package/dist/gs/reflect/value.js.map +1 -1
- package/dist/gs/reflect/visiblefields.js +4 -140
- package/dist/gs/reflect/visiblefields.js.map +1 -1
- package/dist/gs/runtime/pprof/index.d.ts +8 -2
- package/dist/gs/runtime/pprof/index.js +50 -30
- package/dist/gs/runtime/pprof/index.js.map +1 -1
- package/dist/gs/runtime/runtime.js +5 -4
- package/dist/gs/runtime/runtime.js.map +1 -1
- package/dist/gs/runtime/trace/index.js +5 -19
- package/dist/gs/runtime/trace/index.js.map +1 -1
- package/dist/gs/strconv/atoi.gs.js +1 -1
- package/dist/gs/strconv/atoi.gs.js.map +1 -1
- package/dist/gs/strconv/complex.gs.d.ts +3 -0
- package/dist/gs/strconv/complex.gs.js +148 -0
- package/dist/gs/strconv/complex.gs.js.map +1 -0
- package/dist/gs/strconv/index.d.ts +1 -0
- package/dist/gs/strconv/index.js +1 -0
- package/dist/gs/strconv/index.js.map +1 -1
- package/dist/gs/strings/builder.js +1 -1
- package/dist/gs/strings/reader.js +9 -5
- package/dist/gs/strings/reader.js.map +1 -1
- package/dist/gs/strings/replace.js +15 -7
- package/dist/gs/strings/replace.js.map +1 -1
- package/dist/gs/strings/strings.d.ts +5 -0
- package/dist/gs/strings/strings.js +57 -5
- package/dist/gs/strings/strings.js.map +1 -1
- package/dist/gs/sync/atomic/doc_64.gs.js +7 -6
- package/dist/gs/sync/atomic/doc_64.gs.js.map +1 -1
- package/dist/gs/sync/atomic/type.gs.js +9 -9
- package/dist/gs/sync/atomic/type.gs.js.map +1 -1
- package/dist/gs/sync/atomic/value.gs.js +2 -2
- package/dist/gs/sync/atomic/value.gs.js.map +1 -1
- package/dist/gs/syscall/env.js +22 -14
- package/dist/gs/syscall/env.js.map +1 -1
- package/dist/gs/testing/testing.js +55 -13
- package/dist/gs/testing/testing.js.map +1 -1
- package/dist/gs/time/time.d.ts +24 -1
- package/dist/gs/time/time.js +43 -3
- package/dist/gs/time/time.js.map +1 -1
- package/dist/gs/unique/index.js +7 -1
- package/dist/gs/unique/index.js.map +1 -1
- package/go.mod +3 -3
- package/go.sum +16 -0
- package/gs/builtin/hostio.test.ts +16 -0
- package/gs/builtin/hostio.ts +7 -0
- package/gs/builtin/runtime-contract.test.ts +246 -21
- package/gs/builtin/slice.ts +269 -24
- package/gs/builtin/type.ts +226 -59
- package/gs/builtin/varRef.ts +85 -2
- package/gs/bytes/buffer.gs.ts +1 -1
- package/gs/bytes/reader.gs.ts +1 -1
- package/gs/compress/zlib/index.test.ts +62 -1
- package/gs/compress/zlib/index.ts +53 -16
- package/gs/compress/zlib/parity.json +51 -0
- package/gs/encoding/json/index.test.ts +360 -6
- package/gs/encoding/json/index.ts +679 -38
- package/gs/encoding/json/parity.json +81 -0
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +373 -3
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +893 -1
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +18 -0
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +17 -11
- package/gs/github.com/pkg/errors/errors.ts +54 -30
- package/gs/go/scanner/index.test.ts +39 -56
- package/gs/go/scanner/index.ts +33 -5
- package/gs/go/scanner/parity.json +27 -0
- package/gs/go/token/index.ts +22 -6
- package/gs/hash/index.test.ts +20 -33
- package/gs/hash/index.ts +28 -0
- package/gs/hash/parity.json +21 -0
- package/gs/internal/byteorder/index.test.ts +2 -2
- package/gs/internal/byteorder/index.ts +2 -2
- package/gs/internal/goarch/index.test.ts +32 -0
- package/gs/internal/goarch/index.ts +45 -13
- package/gs/internal/goarch/parity.json +144 -0
- package/gs/io/fs/fs.ts +26 -14
- package/gs/io/fs/readdir.ts +4 -4
- package/gs/io/fs/sub.ts +8 -1
- package/gs/io/io.ts +1 -0
- package/gs/io/parity.json +162 -0
- package/gs/math/bits/index.test.ts +14 -1
- package/gs/math/bits/index.ts +23 -4
- package/gs/math/bits/parity.json +156 -0
- package/gs/mime/index.test.ts +90 -0
- package/gs/mime/index.ts +369 -6
- package/gs/mime/parity.json +36 -0
- package/gs/net/http/httptest/index.test.ts +98 -2
- package/gs/net/http/httptest/index.ts +101 -6
- package/gs/net/http/httptest/parity.json +15 -0
- package/gs/net/http/index.test.ts +781 -12
- package/gs/net/http/index.ts +1860 -139
- package/gs/net/http/meta.json +16 -1
- package/gs/net/http/parity.json +193 -0
- package/gs/os/dir_unix.gs.ts +1 -1
- package/gs/os/error.gs.ts +1 -1
- package/gs/os/exec.gs.ts +4 -8
- package/gs/os/exec_posix.gs.ts +1 -1
- package/gs/os/index.test.ts +9 -0
- package/gs/os/index.ts +1 -0
- package/gs/os/parity.json +9 -0
- package/gs/os/proc.gs.ts +18 -5
- package/gs/os/proc.test.ts +26 -0
- package/gs/os/root_js.gs.ts +1 -1
- package/gs/os/types.gs.ts +1 -1
- package/gs/os/types_js.gs.ts +1 -1
- package/gs/os/types_unix.gs.ts +1 -1
- package/gs/path/path.ts +11 -7
- package/gs/reflect/field.test.ts +37 -15
- package/gs/reflect/function-types.test.ts +518 -22
- package/gs/reflect/index.ts +8 -6
- package/gs/reflect/map.ts +20 -0
- package/gs/reflect/meta.json +6 -4
- package/gs/reflect/parity.json +234 -0
- package/gs/reflect/sliceat.test.ts +156 -0
- package/gs/reflect/structof.test.ts +401 -0
- package/gs/reflect/type.ts +1961 -317
- package/gs/reflect/typefor.test.ts +530 -10
- package/gs/reflect/types.ts +43 -18
- package/gs/reflect/value.ts +105 -45
- package/gs/reflect/visiblefields.ts +5 -168
- package/gs/runtime/parity.json +24 -0
- package/gs/runtime/pprof/index.test.ts +29 -7
- package/gs/runtime/pprof/index.ts +56 -30
- package/gs/runtime/pprof/parity.json +27 -0
- package/gs/runtime/runtime.test.ts +3 -1
- package/gs/runtime/runtime.ts +4 -3
- package/gs/runtime/trace/index.test.ts +5 -3
- package/gs/runtime/trace/index.ts +8 -20
- package/gs/runtime/trace/parity.json +36 -0
- package/gs/strconv/atoi.gs.ts +1 -1
- package/gs/strconv/complex.gs.ts +174 -0
- package/gs/strconv/complex.test.ts +65 -0
- package/gs/strconv/index.ts +1 -0
- package/gs/strconv/parity.json +120 -0
- package/gs/strings/builder.ts +1 -1
- package/gs/strings/parity.json +186 -0
- package/gs/strings/reader.ts +9 -5
- package/gs/strings/replace.ts +15 -7
- package/gs/strings/strings.test.ts +22 -2
- package/gs/strings/strings.ts +64 -6
- package/gs/sync/atomic/doc_64.gs.ts +6 -7
- package/gs/sync/atomic/doc_64.test.ts +43 -0
- package/gs/sync/atomic/type.gs.ts +9 -9
- package/gs/sync/atomic/value.gs.ts +2 -2
- package/gs/syscall/env.ts +29 -14
- package/gs/testing/testing.test.ts +67 -0
- package/gs/testing/testing.ts +87 -19
- package/gs/time/parity.json +225 -0
- package/gs/time/time.test.ts +20 -2
- package/gs/time/time.ts +49 -7
- package/gs/unique/index.ts +7 -1
- package/package.json +4 -2
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +0 -217
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +0 -926
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +0 -1
- package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +0 -38
- package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +0 -1361
- package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +0 -46
|
@@ -6,7 +6,6 @@ import (
|
|
|
6
6
|
"go/ast"
|
|
7
7
|
"go/token"
|
|
8
8
|
"go/types"
|
|
9
|
-
"maps"
|
|
10
9
|
"slices"
|
|
11
10
|
"strconv"
|
|
12
11
|
"strings"
|
|
@@ -75,6 +74,7 @@ func (o *SemanticModelOwner) Build(ctx context.Context, graph *PackageGraph) (*S
|
|
|
75
74
|
return model, diagnostics
|
|
76
75
|
}
|
|
77
76
|
|
|
77
|
+
model.functionCallers = semanticFunctionCallers(model)
|
|
78
78
|
diagnostics = append(diagnostics, o.propagateFunctionAsync(ctx, model)...)
|
|
79
79
|
if diagnosticsHaveErrors(diagnostics) {
|
|
80
80
|
return model, diagnostics
|
|
@@ -83,12 +83,17 @@ func (o *SemanticModelOwner) Build(ctx context.Context, graph *PackageGraph) (*S
|
|
|
83
83
|
if diagnosticsHaveErrors(diagnostics) {
|
|
84
84
|
return model, diagnostics
|
|
85
85
|
}
|
|
86
|
-
|
|
86
|
+
methodSets, methodSetDiagnostics := o.resolveImplementationMethodSets(ctx, model)
|
|
87
|
+
diagnostics = append(diagnostics, methodSetDiagnostics...)
|
|
88
|
+
if diagnosticsHaveErrors(diagnostics) {
|
|
89
|
+
return model, diagnostics
|
|
90
|
+
}
|
|
91
|
+
interfaceGraph, interfaceDiagnostics := o.resolveInterfaceImplementationGraph(ctx, model, methodSets)
|
|
87
92
|
diagnostics = append(diagnostics, interfaceDiagnostics...)
|
|
88
93
|
if diagnosticsHaveErrors(diagnostics) {
|
|
89
94
|
return model, diagnostics
|
|
90
95
|
}
|
|
91
|
-
anonymousInterfaceGraph, anonymousInterfaceDiagnostics := o.resolveAnonymousInterfaceImplementationGraph(ctx, model)
|
|
96
|
+
anonymousInterfaceGraph, anonymousInterfaceDiagnostics := o.resolveAnonymousInterfaceImplementationGraph(ctx, model, methodSets)
|
|
92
97
|
diagnostics = append(diagnostics, anonymousInterfaceDiagnostics...)
|
|
93
98
|
if diagnosticsHaveErrors(diagnostics) {
|
|
94
99
|
return model, diagnostics
|
|
@@ -120,12 +125,14 @@ func newSemanticModel() *SemanticModel {
|
|
|
120
125
|
addressTaken: make(map[types.Object]bool),
|
|
121
126
|
needsVarRef: make(map[types.Object]bool),
|
|
122
127
|
functions: make(map[*types.Func]*semanticFunction),
|
|
128
|
+
functionCallers: make(map[*types.Func][]*semanticFunction),
|
|
123
129
|
functionsByFullName: make(map[string]*semanticFunction),
|
|
124
130
|
functionLookupMisses: make(map[*types.Func]bool),
|
|
125
131
|
functionFullNames: make(map[*types.Func]string),
|
|
126
132
|
types: make(map[*types.Named]*semanticType),
|
|
127
133
|
values: make(map[types.Object]*semanticValue),
|
|
128
134
|
generatedImports: make(map[string]map[string]bool),
|
|
135
|
+
generatedImportTypes: make(map[string]map[types.Type]bool),
|
|
129
136
|
asyncInterfaceMethods: make(map[string]bool),
|
|
130
137
|
asyncInterfaceMethodObjs: make(map[*types.Func]bool),
|
|
131
138
|
}
|
|
@@ -219,7 +226,7 @@ func (o *SemanticModelOwner) collectGenDecl(
|
|
|
219
226
|
continue
|
|
220
227
|
}
|
|
221
228
|
position := sourcePos(pkg, typed.Name.Pos())
|
|
222
|
-
o.addType(model, semPkg, obj, position, typed.Type)
|
|
229
|
+
o.addType(model, semPkg, obj, position, typed.Type, pkg.TypesSizes)
|
|
223
230
|
o.recordGeneratedImports(model, semPkg, position.file, pkg.PkgPath, obj.Type())
|
|
224
231
|
semPkg.declarations = append(semPkg.declarations, semanticDeclaration{
|
|
225
232
|
kind: "type",
|
|
@@ -354,7 +361,7 @@ func (o *SemanticModelOwner) recordTypeSpec(
|
|
|
354
361
|
return
|
|
355
362
|
}
|
|
356
363
|
position := sourcePos(pkg, spec.Name.Pos())
|
|
357
|
-
o.addType(model, semPkg, obj, position, spec.Type)
|
|
364
|
+
o.addType(model, semPkg, obj, position, spec.Type, pkg.TypesSizes)
|
|
358
365
|
o.recordGeneratedImports(model, semPkg, position.file, pkg.PkgPath, obj.Type())
|
|
359
366
|
}
|
|
360
367
|
|
|
@@ -392,8 +399,9 @@ func (o *SemanticModelOwner) recordCallSignatureImports(
|
|
|
392
399
|
return
|
|
393
400
|
}
|
|
394
401
|
position := sourcePos(pkg, expr.Pos())
|
|
395
|
-
|
|
396
|
-
o.recordTupleImports(model, semPkg, position.file, pkg.PkgPath, signature.
|
|
402
|
+
seen := model.generatedImportSeen(position.file)
|
|
403
|
+
o.recordTupleImports(model, semPkg, position.file, pkg.PkgPath, signature.Params(), seen)
|
|
404
|
+
o.recordTupleImports(model, semPkg, position.file, pkg.PkgPath, signature.Results(), seen)
|
|
397
405
|
}
|
|
398
406
|
|
|
399
407
|
func (o *SemanticModelOwner) recordAsyncCompatibleFunctionAssignments(
|
|
@@ -478,7 +486,7 @@ func (o *SemanticModelOwner) addDefinedObject(
|
|
|
478
486
|
o.addValue(model, semPkg, typed, position, false)
|
|
479
487
|
o.recordGeneratedImports(model, semPkg, position.file, pkg.PkgPath, typed.Type())
|
|
480
488
|
case *types.TypeName:
|
|
481
|
-
o.addType(model, semPkg, typed, sourcePos(pkg, ident.Pos()), nil)
|
|
489
|
+
o.addType(model, semPkg, typed, sourcePos(pkg, ident.Pos()), nil, pkg.TypesSizes)
|
|
482
490
|
case *types.Func:
|
|
483
491
|
o.addFunction(model, semPkg, typed, sourcePos(pkg, ident.Pos()))
|
|
484
492
|
}
|
|
@@ -490,6 +498,7 @@ func (o *SemanticModelOwner) addType(
|
|
|
490
498
|
obj *types.TypeName,
|
|
491
499
|
position sourcePosition,
|
|
492
500
|
typeExpr ast.Expr,
|
|
501
|
+
sizes types.Sizes,
|
|
493
502
|
) *semanticType {
|
|
494
503
|
named, _ := obj.Type().(*types.Named)
|
|
495
504
|
if named == nil {
|
|
@@ -497,7 +506,7 @@ func (o *SemanticModelOwner) addType(
|
|
|
497
506
|
}
|
|
498
507
|
if existing := model.types[named]; existing != nil {
|
|
499
508
|
if typeExpr != nil && len(existing.fields) == 0 {
|
|
500
|
-
existing.fields = semanticFields(named, typeExpr)
|
|
509
|
+
existing.fields = semanticFields(named, typeExpr, sizes)
|
|
501
510
|
}
|
|
502
511
|
return existing
|
|
503
512
|
}
|
|
@@ -506,7 +515,7 @@ func (o *SemanticModelOwner) addType(
|
|
|
506
515
|
name: obj.Name(),
|
|
507
516
|
named: named,
|
|
508
517
|
isInterface: isInterface,
|
|
509
|
-
fields: semanticFields(named, typeExpr),
|
|
518
|
+
fields: semanticFields(named, typeExpr, sizes),
|
|
510
519
|
position: position,
|
|
511
520
|
}
|
|
512
521
|
model.types[named] = semType
|
|
@@ -604,7 +613,7 @@ func (o *SemanticModelOwner) addFunction(
|
|
|
604
613
|
return semFn
|
|
605
614
|
}
|
|
606
615
|
|
|
607
|
-
func semanticFields(named *types.Named, typeExpr ast.Expr) []semanticField {
|
|
616
|
+
func semanticFields(named *types.Named, typeExpr ast.Expr, sizes types.Sizes) []semanticField {
|
|
608
617
|
if named == nil {
|
|
609
618
|
return nil
|
|
610
619
|
}
|
|
@@ -614,19 +623,64 @@ func semanticFields(named *types.Named, typeExpr ast.Expr) []semanticField {
|
|
|
614
623
|
}
|
|
615
624
|
docs := structFieldDocs(typeExpr)
|
|
616
625
|
fields := make([]semanticField, 0, structType.NumFields())
|
|
626
|
+
var vars []*types.Var
|
|
627
|
+
for field := range structType.Fields() {
|
|
628
|
+
vars = append(vars, field)
|
|
629
|
+
}
|
|
630
|
+
offsets := structFieldOffsets(sizes, vars)
|
|
617
631
|
for i := range structType.NumFields() {
|
|
618
632
|
field := structType.Field(i)
|
|
633
|
+
pkgPath := ""
|
|
634
|
+
if !field.Exported() && field.Pkg() != nil {
|
|
635
|
+
pkgPath = field.Pkg().Path()
|
|
636
|
+
}
|
|
619
637
|
fields = append(fields, semanticField{
|
|
620
638
|
name: field.Name(),
|
|
621
639
|
typ: field.Type(),
|
|
622
640
|
doc: docs[field.Name()],
|
|
623
641
|
tag: structType.Tag(i),
|
|
624
642
|
embedded: field.Embedded(),
|
|
643
|
+
pkgPath: pkgPath,
|
|
644
|
+
index: []int{i},
|
|
645
|
+
offset: offsets[i],
|
|
646
|
+
exported: field.Exported(),
|
|
625
647
|
})
|
|
626
648
|
}
|
|
627
649
|
return fields
|
|
628
650
|
}
|
|
629
651
|
|
|
652
|
+
func goScriptTypeSizes() types.Sizes {
|
|
653
|
+
if sizes := types.SizesFor("gc", "wasm"); sizes != nil {
|
|
654
|
+
return sizes
|
|
655
|
+
}
|
|
656
|
+
return types.SizesFor("gc", "amd64")
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
func structFieldOffsets(sizes types.Sizes, fields []*types.Var) (offsets []int64) {
|
|
660
|
+
offsets = make([]int64, len(fields))
|
|
661
|
+
if len(fields) == 0 {
|
|
662
|
+
return offsets
|
|
663
|
+
}
|
|
664
|
+
if sizes == nil {
|
|
665
|
+
sizes = goScriptTypeSizes()
|
|
666
|
+
}
|
|
667
|
+
if sizes == nil {
|
|
668
|
+
return offsets
|
|
669
|
+
}
|
|
670
|
+
defer func() {
|
|
671
|
+
if recover() != nil {
|
|
672
|
+
// Generic field layouts do not have concrete target offsets during
|
|
673
|
+
// package-level metadata emission; keep compiling and leave them zero.
|
|
674
|
+
offsets = make([]int64, len(fields))
|
|
675
|
+
}
|
|
676
|
+
}()
|
|
677
|
+
computed := sizes.Offsetsof(fields)
|
|
678
|
+
if len(computed) == len(fields) {
|
|
679
|
+
copy(offsets, computed)
|
|
680
|
+
}
|
|
681
|
+
return offsets
|
|
682
|
+
}
|
|
683
|
+
|
|
630
684
|
func structFieldDocs(typeExpr ast.Expr) map[string]string {
|
|
631
685
|
structType, _ := typeExpr.(*ast.StructType)
|
|
632
686
|
if structType == nil || structType.Fields == nil {
|
|
@@ -1128,28 +1182,56 @@ func receiverNamedType(typ types.Type) *types.Named {
|
|
|
1128
1182
|
}
|
|
1129
1183
|
|
|
1130
1184
|
func (o *SemanticModelOwner) propagateFunctionAsync(ctx context.Context, model *SemanticModel) []Diagnostic {
|
|
1131
|
-
|
|
1132
|
-
|
|
1185
|
+
if err := ctx.Err(); err != nil {
|
|
1186
|
+
return []Diagnostic{contextCanceledDiagnostic(err)}
|
|
1187
|
+
}
|
|
1188
|
+
queued := make(map[*types.Func]bool)
|
|
1189
|
+
queue := make([]*types.Func, 0)
|
|
1190
|
+
enqueue := func(fn *types.Func) {
|
|
1191
|
+
fn = functionOriginOrSelf(fn)
|
|
1192
|
+
if fn == nil || queued[fn] {
|
|
1193
|
+
return
|
|
1194
|
+
}
|
|
1195
|
+
queued[fn] = true
|
|
1196
|
+
queue = append(queue, fn)
|
|
1197
|
+
}
|
|
1198
|
+
for called := range model.functionCallers {
|
|
1199
|
+
if model.functionAsync(called) {
|
|
1200
|
+
enqueue(called)
|
|
1201
|
+
}
|
|
1202
|
+
}
|
|
1203
|
+
for len(queue) != 0 {
|
|
1133
1204
|
if err := ctx.Err(); err != nil {
|
|
1134
1205
|
return []Diagnostic{contextCanceledDiagnostic(err)}
|
|
1135
1206
|
}
|
|
1136
|
-
|
|
1137
|
-
|
|
1207
|
+
called := queue[0]
|
|
1208
|
+
queue = queue[1:]
|
|
1209
|
+
for _, semFn := range model.functionCallers[called] {
|
|
1138
1210
|
if err := ctx.Err(); err != nil {
|
|
1139
1211
|
return []Diagnostic{contextCanceledDiagnostic(err)}
|
|
1140
1212
|
}
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
if markFunctionAsync(semFn, "call:"+called.FullName()) {
|
|
1144
|
-
changed = true
|
|
1145
|
-
}
|
|
1146
|
-
}
|
|
1213
|
+
if markFunctionAsync(semFn, "call:"+model.functionFullName(called)) {
|
|
1214
|
+
enqueue(semFn.function)
|
|
1147
1215
|
}
|
|
1148
1216
|
}
|
|
1149
1217
|
}
|
|
1150
1218
|
return nil
|
|
1151
1219
|
}
|
|
1152
1220
|
|
|
1221
|
+
func semanticFunctionCallers(model *SemanticModel) map[*types.Func][]*semanticFunction {
|
|
1222
|
+
callers := make(map[*types.Func][]*semanticFunction)
|
|
1223
|
+
for _, semFn := range model.functions {
|
|
1224
|
+
for called := range semFn.calls {
|
|
1225
|
+
called = functionOriginOrSelf(called)
|
|
1226
|
+
if called == nil {
|
|
1227
|
+
continue
|
|
1228
|
+
}
|
|
1229
|
+
callers[called] = append(callers[called], semFn)
|
|
1230
|
+
}
|
|
1231
|
+
}
|
|
1232
|
+
return callers
|
|
1233
|
+
}
|
|
1234
|
+
|
|
1153
1235
|
func markFunctionAsync(fn *semanticFunction, reason string) bool {
|
|
1154
1236
|
if fn == nil {
|
|
1155
1237
|
return false
|
|
@@ -1179,21 +1261,12 @@ func semanticAsyncFunctionCount(model *SemanticModel) int {
|
|
|
1179
1261
|
func (o *SemanticModelOwner) resolveInterfaceImplementationGraph(
|
|
1180
1262
|
ctx context.Context,
|
|
1181
1263
|
model *SemanticModel,
|
|
1264
|
+
methodSets []semanticImplementationMethodSet,
|
|
1182
1265
|
) ([]semanticInterfaceImplementationGraphEntry, []Diagnostic) {
|
|
1183
1266
|
interfaces := collectInterfaceImplementationCandidates(model)
|
|
1184
|
-
var concretes []*types.Named
|
|
1185
|
-
for named, semType := range model.types {
|
|
1186
|
-
if err := ctx.Err(); err != nil {
|
|
1187
|
-
return nil, []Diagnostic{contextCanceledDiagnostic(err)}
|
|
1188
|
-
}
|
|
1189
|
-
if !semType.isInterface {
|
|
1190
|
-
concretes = append(concretes, namedOriginOrSelf(named))
|
|
1191
|
-
}
|
|
1192
|
-
}
|
|
1193
1267
|
sortNamedTypes(interfaces)
|
|
1194
|
-
sortNamedTypes(concretes)
|
|
1195
|
-
methodSets := implementationMethodSets(concretes)
|
|
1196
1268
|
|
|
1269
|
+
methodSetIndexByName := indexImplementationMethodSets(methodSets)
|
|
1197
1270
|
implementationGraph := make([]semanticInterfaceImplementationGraphEntry, 0)
|
|
1198
1271
|
for _, ifaceNamed := range interfaces {
|
|
1199
1272
|
if err := ctx.Err(); err != nil {
|
|
@@ -1208,10 +1281,11 @@ func (o *SemanticModelOwner) resolveInterfaceImplementationGraph(
|
|
|
1208
1281
|
if len(ifaceMethods) == 0 {
|
|
1209
1282
|
continue
|
|
1210
1283
|
}
|
|
1211
|
-
for _,
|
|
1284
|
+
for _, methodSetIdx := range implementationMethodSetCandidates(methodSetIndexByName, ifaceMethods) {
|
|
1212
1285
|
if err := ctx.Err(); err != nil {
|
|
1213
1286
|
return nil, []Diagnostic{contextCanceledDiagnostic(err)}
|
|
1214
1287
|
}
|
|
1288
|
+
methodSet := methodSets[methodSetIdx]
|
|
1215
1289
|
if implementation, ok := o.interfaceImplementationGraphEntry(methodSet, ifaceNamed, ifaceMethods); ok {
|
|
1216
1290
|
implementationGraph = append(implementationGraph, implementation)
|
|
1217
1291
|
}
|
|
@@ -1223,19 +1297,13 @@ func (o *SemanticModelOwner) resolveInterfaceImplementationGraph(
|
|
|
1223
1297
|
func (o *SemanticModelOwner) resolveAnonymousInterfaceImplementationGraph(
|
|
1224
1298
|
ctx context.Context,
|
|
1225
1299
|
model *SemanticModel,
|
|
1300
|
+
methodSets []semanticImplementationMethodSet,
|
|
1226
1301
|
) ([]semanticAnonymousInterfaceImplementation, []Diagnostic) {
|
|
1227
1302
|
interfaces := collectAnonymousInterfaceImplementationCandidates(model)
|
|
1228
|
-
|
|
1229
|
-
for named, semType := range model.types {
|
|
1303
|
+
for _, namedIface := range collectNamedInterfaceImplementationCandidates(model) {
|
|
1230
1304
|
if err := ctx.Err(); err != nil {
|
|
1231
1305
|
return nil, []Diagnostic{contextCanceledDiagnostic(err)}
|
|
1232
1306
|
}
|
|
1233
|
-
if !semType.isInterface {
|
|
1234
|
-
concretes = append(concretes, namedOriginOrSelf(named))
|
|
1235
|
-
}
|
|
1236
|
-
}
|
|
1237
|
-
methodSets := implementationMethodSets(concretes)
|
|
1238
|
-
for _, namedIface := range collectNamedInterfaceImplementationCandidates(model) {
|
|
1239
1307
|
methodSets = append(methodSets, semanticImplementationMethodSet{
|
|
1240
1308
|
typ: namedIface,
|
|
1241
1309
|
receiver: namedIface,
|
|
@@ -1243,6 +1311,7 @@ func (o *SemanticModelOwner) resolveAnonymousInterfaceImplementationGraph(
|
|
|
1243
1311
|
})
|
|
1244
1312
|
}
|
|
1245
1313
|
|
|
1314
|
+
methodSetIndexByName := indexImplementationMethodSets(methodSets)
|
|
1246
1315
|
implementationGraph := make([]semanticAnonymousInterfaceImplementation, 0)
|
|
1247
1316
|
for _, iface := range interfaces {
|
|
1248
1317
|
if err := ctx.Err(); err != nil {
|
|
@@ -1253,13 +1322,26 @@ func (o *SemanticModelOwner) resolveAnonymousInterfaceImplementationGraph(
|
|
|
1253
1322
|
if len(ifaceMethods) == 0 {
|
|
1254
1323
|
continue
|
|
1255
1324
|
}
|
|
1256
|
-
for _,
|
|
1325
|
+
for _, methodSetIdx := range implementationMethodSetCandidates(methodSetIndexByName, ifaceMethods) {
|
|
1257
1326
|
if err := ctx.Err(); err != nil {
|
|
1258
1327
|
return nil, []Diagnostic{contextCanceledDiagnostic(err)}
|
|
1259
1328
|
}
|
|
1329
|
+
methodSet := methodSets[methodSetIdx]
|
|
1260
1330
|
if !implementationHasMethods(methodSet.methods, ifaceMethods) {
|
|
1261
1331
|
continue
|
|
1262
1332
|
}
|
|
1333
|
+
if !namedTypeHasParams(methodSet.typ) {
|
|
1334
|
+
if matches, exact := implementationHasExactMethodSignatures(methodSet.methods, ifaceMethods); exact {
|
|
1335
|
+
if !matches {
|
|
1336
|
+
continue
|
|
1337
|
+
}
|
|
1338
|
+
implementationGraph = append(implementationGraph, semanticAnonymousInterfaceImplementation{
|
|
1339
|
+
ifaceMethods: ifaceMethods,
|
|
1340
|
+
implMethods: methodSet.methods,
|
|
1341
|
+
})
|
|
1342
|
+
continue
|
|
1343
|
+
}
|
|
1344
|
+
}
|
|
1263
1345
|
receiver := methodSet.receiver
|
|
1264
1346
|
if (methodSet.typ.TypeArgs() == nil || methodSet.typ.TypeArgs().Len() == 0) &&
|
|
1265
1347
|
methodSet.typ.TypeParams() != nil && methodSet.typ.TypeParams().Len() != 0 {
|
|
@@ -1276,13 +1358,30 @@ func (o *SemanticModelOwner) resolveAnonymousInterfaceImplementationGraph(
|
|
|
1276
1358
|
}
|
|
1277
1359
|
implementationGraph = append(implementationGraph, semanticAnonymousInterfaceImplementation{
|
|
1278
1360
|
ifaceMethods: ifaceMethods,
|
|
1279
|
-
implMethods:
|
|
1361
|
+
implMethods: methodSet.methods,
|
|
1280
1362
|
})
|
|
1281
1363
|
}
|
|
1282
1364
|
}
|
|
1283
1365
|
return implementationGraph, nil
|
|
1284
1366
|
}
|
|
1285
1367
|
|
|
1368
|
+
func (o *SemanticModelOwner) resolveImplementationMethodSets(
|
|
1369
|
+
ctx context.Context,
|
|
1370
|
+
model *SemanticModel,
|
|
1371
|
+
) ([]semanticImplementationMethodSet, []Diagnostic) {
|
|
1372
|
+
var concretes []*types.Named
|
|
1373
|
+
for named, semType := range model.types {
|
|
1374
|
+
if err := ctx.Err(); err != nil {
|
|
1375
|
+
return nil, []Diagnostic{contextCanceledDiagnostic(err)}
|
|
1376
|
+
}
|
|
1377
|
+
if !semType.isInterface {
|
|
1378
|
+
concretes = append(concretes, namedOriginOrSelf(named))
|
|
1379
|
+
}
|
|
1380
|
+
}
|
|
1381
|
+
sortNamedTypes(concretes)
|
|
1382
|
+
return implementationMethodSets(concretes), nil
|
|
1383
|
+
}
|
|
1384
|
+
|
|
1286
1385
|
func collectInterfaceImplementationCandidates(model *SemanticModel) []*types.Named {
|
|
1287
1386
|
if model == nil {
|
|
1288
1387
|
return nil
|
|
@@ -1557,33 +1656,31 @@ func (o *SemanticModelOwner) applyInterfaceAsyncMethods(
|
|
|
1557
1656
|
model *SemanticModel,
|
|
1558
1657
|
interfaceGraph []semanticInterfaceImplementationGraphEntry,
|
|
1559
1658
|
) []Diagnostic {
|
|
1560
|
-
model.interfaceImplementations
|
|
1659
|
+
if cap(model.interfaceImplementations) < len(interfaceGraph) {
|
|
1660
|
+
model.interfaceImplementations = make([]semanticInterfaceImplementation, 0, len(interfaceGraph))
|
|
1661
|
+
} else {
|
|
1662
|
+
model.interfaceImplementations = model.interfaceImplementations[:0]
|
|
1663
|
+
}
|
|
1561
1664
|
for _, graphEntry := range interfaceGraph {
|
|
1562
1665
|
if err := ctx.Err(); err != nil {
|
|
1563
1666
|
return []Diagnostic{contextCanceledDiagnostic(err)}
|
|
1564
1667
|
}
|
|
1565
1668
|
implementation := semanticInterfaceImplementation{
|
|
1566
|
-
typ:
|
|
1567
|
-
iface:
|
|
1568
|
-
pointer:
|
|
1569
|
-
asyncMethods: make(map[string]bool),
|
|
1669
|
+
typ: graphEntry.typ,
|
|
1670
|
+
iface: graphEntry.iface,
|
|
1671
|
+
pointer: graphEntry.pointer,
|
|
1570
1672
|
}
|
|
1571
|
-
for methodName,
|
|
1673
|
+
for methodName, ifaceMethod := range graphEntry.ifaceMethods {
|
|
1674
|
+
implMethod := graphEntry.implMethods[methodName]
|
|
1572
1675
|
implFn := semanticFunctionFor(model, implMethod)
|
|
1573
1676
|
if implFn != nil && implFn.async {
|
|
1574
|
-
|
|
1575
|
-
model
|
|
1576
|
-
if ifaceFn := semanticFunctionFor(model, graphEntry.ifaceMethods[methodName]); ifaceFn != nil {
|
|
1677
|
+
model.markInterfaceMethodAsync(ifaceMethod)
|
|
1678
|
+
if ifaceFn := semanticFunctionFor(model, ifaceMethod); ifaceFn != nil {
|
|
1577
1679
|
markFunctionAsync(ifaceFn, "interface-implementation")
|
|
1578
1680
|
}
|
|
1681
|
+
markFunctionAsync(implFn, "interface-method")
|
|
1579
1682
|
}
|
|
1580
1683
|
}
|
|
1581
|
-
for methodName, async := range implementation.asyncMethods {
|
|
1582
|
-
if !async {
|
|
1583
|
-
continue
|
|
1584
|
-
}
|
|
1585
|
-
markFunctionAsync(semanticFunctionFor(model, graphEntry.implMethods[methodName]), "interface-method")
|
|
1586
|
-
}
|
|
1587
1684
|
model.interfaceImplementations = append(model.interfaceImplementations, implementation)
|
|
1588
1685
|
}
|
|
1589
1686
|
return nil
|
|
@@ -1598,9 +1695,10 @@ func (o *SemanticModelOwner) applyAnonymousInterfaceAsyncMethods(
|
|
|
1598
1695
|
if err := ctx.Err(); err != nil {
|
|
1599
1696
|
return []Diagnostic{contextCanceledDiagnostic(err)}
|
|
1600
1697
|
}
|
|
1601
|
-
for methodName,
|
|
1698
|
+
for methodName, ifaceMethod := range graphEntry.ifaceMethods {
|
|
1699
|
+
implMethod := graphEntry.implMethods[methodName]
|
|
1602
1700
|
if model.functionAsync(implMethod) {
|
|
1603
|
-
model.markInterfaceMethodAsync(
|
|
1701
|
+
model.markInterfaceMethodAsync(ifaceMethod)
|
|
1604
1702
|
}
|
|
1605
1703
|
}
|
|
1606
1704
|
}
|
|
@@ -1654,6 +1752,22 @@ func (o *SemanticModelOwner) interfaceImplementationGraphEntry(
|
|
|
1654
1752
|
return semanticInterfaceImplementationGraphEntry{}, false
|
|
1655
1753
|
}
|
|
1656
1754
|
|
|
1755
|
+
if !namedTypeHasParams(methodSet.typ) && !namedTypeHasParams(ifaceNamed) {
|
|
1756
|
+
if matches, exact := implementationHasExactMethodSignatures(methodSet.methods, ifaceMethods); exact {
|
|
1757
|
+
if !matches {
|
|
1758
|
+
return semanticInterfaceImplementationGraphEntry{}, false
|
|
1759
|
+
}
|
|
1760
|
+
implementation := semanticInterfaceImplementationGraphEntry{
|
|
1761
|
+
typ: methodSet.typ,
|
|
1762
|
+
iface: ifaceNamed,
|
|
1763
|
+
pointer: methodSet.pointer,
|
|
1764
|
+
ifaceMethods: ifaceMethods,
|
|
1765
|
+
implMethods: methodSet.methods,
|
|
1766
|
+
}
|
|
1767
|
+
return implementation, true
|
|
1768
|
+
}
|
|
1769
|
+
}
|
|
1770
|
+
|
|
1657
1771
|
implementsReceiver := methodSet.receiver
|
|
1658
1772
|
implementsIface := types.Type(ifaceNamed.Underlying())
|
|
1659
1773
|
if methodSet.typ.TypeParams() != nil && methodSet.typ.TypeParams().Len() != 0 {
|
|
@@ -1678,10 +1792,9 @@ func (o *SemanticModelOwner) interfaceImplementationGraphEntry(
|
|
|
1678
1792
|
typ: methodSet.typ,
|
|
1679
1793
|
iface: ifaceNamed,
|
|
1680
1794
|
pointer: methodSet.pointer,
|
|
1681
|
-
ifaceMethods:
|
|
1682
|
-
implMethods:
|
|
1795
|
+
ifaceMethods: ifaceMethods,
|
|
1796
|
+
implMethods: methodSet.methods,
|
|
1683
1797
|
}
|
|
1684
|
-
maps.Copy(implementation.ifaceMethods, ifaceMethods)
|
|
1685
1798
|
return implementation, true
|
|
1686
1799
|
}
|
|
1687
1800
|
|
|
@@ -1696,6 +1809,33 @@ func interfaceMethodMap(iface *types.Interface) map[string]*types.Func {
|
|
|
1696
1809
|
return methods
|
|
1697
1810
|
}
|
|
1698
1811
|
|
|
1812
|
+
func indexImplementationMethodSets(methodSets []semanticImplementationMethodSet) map[string][]int {
|
|
1813
|
+
index := make(map[string][]int)
|
|
1814
|
+
for methodSetIndex, methodSet := range methodSets {
|
|
1815
|
+
for methodName := range methodSet.methods {
|
|
1816
|
+
index[methodName] = append(index[methodName], methodSetIndex)
|
|
1817
|
+
}
|
|
1818
|
+
}
|
|
1819
|
+
return index
|
|
1820
|
+
}
|
|
1821
|
+
|
|
1822
|
+
func implementationMethodSetCandidates(
|
|
1823
|
+
index map[string][]int,
|
|
1824
|
+
ifaceMethods map[string]*types.Func,
|
|
1825
|
+
) []int {
|
|
1826
|
+
var candidates []int
|
|
1827
|
+
for methodName := range ifaceMethods {
|
|
1828
|
+
methodSets := index[methodName]
|
|
1829
|
+
if len(methodSets) == 0 {
|
|
1830
|
+
return nil
|
|
1831
|
+
}
|
|
1832
|
+
if candidates == nil || len(methodSets) < len(candidates) {
|
|
1833
|
+
candidates = methodSets
|
|
1834
|
+
}
|
|
1835
|
+
}
|
|
1836
|
+
return candidates
|
|
1837
|
+
}
|
|
1838
|
+
|
|
1699
1839
|
func (m *SemanticModel) functionFullName(fn *types.Func) string {
|
|
1700
1840
|
if m == nil || fn == nil {
|
|
1701
1841
|
return ""
|
|
@@ -1771,15 +1911,78 @@ func implementationHasMethods(
|
|
|
1771
1911
|
return true
|
|
1772
1912
|
}
|
|
1773
1913
|
|
|
1774
|
-
func
|
|
1914
|
+
func implementationHasExactMethodSignatures(
|
|
1775
1915
|
receiverMethods map[string]*types.Func,
|
|
1776
1916
|
ifaceMethods map[string]*types.Func,
|
|
1777
|
-
)
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1917
|
+
) (bool, bool) {
|
|
1918
|
+
for methodName, ifaceMethod := range ifaceMethods {
|
|
1919
|
+
implMethod := receiverMethods[methodName]
|
|
1920
|
+
if implMethod == nil {
|
|
1921
|
+
return false, true
|
|
1922
|
+
}
|
|
1923
|
+
if !methodPackagesCompatible(implMethod, ifaceMethod) {
|
|
1924
|
+
return false, true
|
|
1925
|
+
}
|
|
1926
|
+
implSignature, _ := implMethod.Type().(*types.Signature)
|
|
1927
|
+
ifaceSignature, _ := ifaceMethod.Type().(*types.Signature)
|
|
1928
|
+
if implSignature == nil || ifaceSignature == nil {
|
|
1929
|
+
return false, false
|
|
1930
|
+
}
|
|
1931
|
+
if !methodSignaturesIdentical(implSignature, ifaceSignature) {
|
|
1932
|
+
return false, true
|
|
1933
|
+
}
|
|
1781
1934
|
}
|
|
1782
|
-
return
|
|
1935
|
+
return true, true
|
|
1936
|
+
}
|
|
1937
|
+
|
|
1938
|
+
func methodPackagesCompatible(implMethod *types.Func, ifaceMethod *types.Func) bool {
|
|
1939
|
+
if implMethod == nil || ifaceMethod == nil {
|
|
1940
|
+
return false
|
|
1941
|
+
}
|
|
1942
|
+
if ifaceMethod.Exported() {
|
|
1943
|
+
return true
|
|
1944
|
+
}
|
|
1945
|
+
return packagePathOfObject(implMethod) == packagePathOfObject(ifaceMethod)
|
|
1946
|
+
}
|
|
1947
|
+
|
|
1948
|
+
func packagePathOfObject(obj types.Object) string {
|
|
1949
|
+
if obj == nil || obj.Pkg() == nil {
|
|
1950
|
+
return ""
|
|
1951
|
+
}
|
|
1952
|
+
return obj.Pkg().Path()
|
|
1953
|
+
}
|
|
1954
|
+
|
|
1955
|
+
func methodSignaturesIdentical(implSignature *types.Signature, ifaceSignature *types.Signature) bool {
|
|
1956
|
+
if implSignature == nil || ifaceSignature == nil || implSignature.Variadic() != ifaceSignature.Variadic() {
|
|
1957
|
+
return false
|
|
1958
|
+
}
|
|
1959
|
+
return tupleTypesIdentical(implSignature.Params(), ifaceSignature.Params()) &&
|
|
1960
|
+
tupleTypesIdentical(implSignature.Results(), ifaceSignature.Results())
|
|
1961
|
+
}
|
|
1962
|
+
|
|
1963
|
+
func tupleTypesIdentical(a *types.Tuple, b *types.Tuple) bool {
|
|
1964
|
+
if a == nil || b == nil {
|
|
1965
|
+
return a == b
|
|
1966
|
+
}
|
|
1967
|
+
if a.Len() != b.Len() {
|
|
1968
|
+
return false
|
|
1969
|
+
}
|
|
1970
|
+
for idx := range a.Len() {
|
|
1971
|
+
if !types.IdenticalIgnoreTags(a.At(idx).Type(), b.At(idx).Type()) {
|
|
1972
|
+
return false
|
|
1973
|
+
}
|
|
1974
|
+
}
|
|
1975
|
+
return true
|
|
1976
|
+
}
|
|
1977
|
+
|
|
1978
|
+
func namedTypeHasParams(named *types.Named) bool {
|
|
1979
|
+
if named == nil {
|
|
1980
|
+
return false
|
|
1981
|
+
}
|
|
1982
|
+
if params := named.TypeParams(); params != nil && params.Len() != 0 {
|
|
1983
|
+
return true
|
|
1984
|
+
}
|
|
1985
|
+
return named.TypeArgs() != nil && named.TypeArgs().Len() != 0
|
|
1783
1986
|
}
|
|
1784
1987
|
|
|
1785
1988
|
func typeParamTypes(params *types.TypeParamList) []types.Type {
|
|
@@ -1951,7 +2154,16 @@ func (o *SemanticModelOwner) recordGeneratedImports(
|
|
|
1951
2154
|
if file == "" || typ == nil {
|
|
1952
2155
|
return
|
|
1953
2156
|
}
|
|
1954
|
-
o.recordTypeImports(model, semPkg, file, currentPkg, typ,
|
|
2157
|
+
o.recordTypeImports(model, semPkg, file, currentPkg, typ, model.generatedImportSeen(file))
|
|
2158
|
+
}
|
|
2159
|
+
|
|
2160
|
+
func (m *SemanticModel) generatedImportSeen(file string) map[types.Type]bool {
|
|
2161
|
+
seen := m.generatedImportTypes[file]
|
|
2162
|
+
if seen == nil {
|
|
2163
|
+
seen = make(map[types.Type]bool)
|
|
2164
|
+
m.generatedImportTypes[file] = seen
|
|
2165
|
+
}
|
|
2166
|
+
return seen
|
|
1955
2167
|
}
|
|
1956
2168
|
|
|
1957
2169
|
func (o *SemanticModelOwner) recordTypeImports(
|