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.
Files changed (295) hide show
  1. package/README.md +5 -2
  2. package/cmd/go_js_wasm_exec/main.go +201 -0
  3. package/cmd/go_js_wasm_exec/main_test.go +83 -0
  4. package/cmd/goscript/{cmd_compile.go → cmd-compile.go} +7 -0
  5. package/cmd/goscript/cmd-test.go +14 -0
  6. package/cmd/goscript/cmd-test_test.go +1 -1
  7. package/cmd/goscript-wasm/main.go +38 -6
  8. package/compiler/compile-request.go +12 -9
  9. package/compiler/compliance_test.go +0 -1
  10. package/compiler/config.go +2 -0
  11. package/compiler/diagnostic.go +104 -12
  12. package/compiler/diagnostic_test.go +106 -0
  13. package/compiler/gotest/request.go +28 -0
  14. package/compiler/gotest/runner.go +354 -44
  15. package/compiler/gotest/runner_test.go +293 -1
  16. package/compiler/gotest/testdata/browserapi/browserapi_test.go +20 -0
  17. package/compiler/gotest/testdata/browserapi/go.mod +3 -0
  18. package/compiler/index.test.ts +23 -0
  19. package/compiler/lowered-program.go +33 -24
  20. package/compiler/lowering.go +746 -194
  21. package/compiler/lowering_bench_test.go +42 -27
  22. package/compiler/lowering_internal_test.go +18 -0
  23. package/compiler/override-facts.go +15 -0
  24. package/compiler/override-parity-verifier.go +450 -0
  25. package/compiler/override-parity.go +122 -0
  26. package/compiler/override-registry_test.go +559 -0
  27. package/compiler/protobuf-ts-binding.go +567 -0
  28. package/compiler/protobuf-ts-binding_test.go +402 -0
  29. package/compiler/runtime-contract.go +4 -0
  30. package/compiler/runtime-contract_test.go +2 -0
  31. package/compiler/semantic-model-types.go +9 -4
  32. package/compiler/semantic-model.go +282 -70
  33. package/compiler/semantic-model_test.go +82 -1
  34. package/compiler/service.go +21 -1
  35. package/compiler/skeleton_test.go +118 -10
  36. package/compiler/typescript-emitter.go +128 -13
  37. package/compiler/wasm/compile_test.go +37 -4
  38. package/compiler/{wasm_api.go → wasm-api.go} +57 -7
  39. package/dist/gs/builtin/hostio.js +5 -0
  40. package/dist/gs/builtin/hostio.js.map +1 -1
  41. package/dist/gs/builtin/slice.d.ts +13 -2
  42. package/dist/gs/builtin/slice.js +187 -6
  43. package/dist/gs/builtin/slice.js.map +1 -1
  44. package/dist/gs/builtin/type.d.ts +13 -5
  45. package/dist/gs/builtin/type.js +153 -60
  46. package/dist/gs/builtin/type.js.map +1 -1
  47. package/dist/gs/builtin/varRef.d.ts +11 -0
  48. package/dist/gs/builtin/varRef.js +57 -2
  49. package/dist/gs/builtin/varRef.js.map +1 -1
  50. package/dist/gs/bytes/buffer.gs.js +1 -1
  51. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  52. package/dist/gs/bytes/reader.gs.js +1 -1
  53. package/dist/gs/bytes/reader.gs.js.map +1 -1
  54. package/dist/gs/compress/zlib/index.d.ts +10 -3
  55. package/dist/gs/compress/zlib/index.js +50 -16
  56. package/dist/gs/compress/zlib/index.js.map +1 -1
  57. package/dist/gs/encoding/json/index.d.ts +114 -0
  58. package/dist/gs/encoding/json/index.js +544 -36
  59. package/dist/gs/encoding/json/index.js.map +1 -1
  60. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +101 -0
  61. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +589 -0
  62. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  63. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +1 -0
  64. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +17 -11
  65. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -1
  66. package/dist/gs/github.com/pkg/errors/errors.js +54 -30
  67. package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
  68. package/dist/gs/go/scanner/index.d.ts +2 -0
  69. package/dist/gs/go/scanner/index.js +29 -5
  70. package/dist/gs/go/scanner/index.js.map +1 -1
  71. package/dist/gs/go/token/index.js +22 -6
  72. package/dist/gs/go/token/index.js.map +1 -1
  73. package/dist/gs/hash/index.d.ts +6 -0
  74. package/dist/gs/hash/index.js +20 -0
  75. package/dist/gs/hash/index.js.map +1 -1
  76. package/dist/gs/internal/byteorder/index.js +2 -2
  77. package/dist/gs/internal/byteorder/index.js.map +1 -1
  78. package/dist/gs/internal/goarch/index.d.ts +43 -3
  79. package/dist/gs/internal/goarch/index.js +42 -10
  80. package/dist/gs/internal/goarch/index.js.map +1 -1
  81. package/dist/gs/io/fs/fs.js +26 -14
  82. package/dist/gs/io/fs/fs.js.map +1 -1
  83. package/dist/gs/io/fs/readdir.js +4 -2
  84. package/dist/gs/io/fs/readdir.js.map +1 -1
  85. package/dist/gs/io/fs/sub.js +8 -1
  86. package/dist/gs/io/fs/sub.js.map +1 -1
  87. package/dist/gs/io/io.d.ts +2 -0
  88. package/dist/gs/io/io.js.map +1 -1
  89. package/dist/gs/math/bits/index.d.ts +5 -0
  90. package/dist/gs/math/bits/index.js +16 -4
  91. package/dist/gs/math/bits/index.js.map +1 -1
  92. package/dist/gs/mime/index.d.ts +16 -0
  93. package/dist/gs/mime/index.js +315 -6
  94. package/dist/gs/mime/index.js.map +1 -1
  95. package/dist/gs/net/http/httptest/index.d.ts +12 -0
  96. package/dist/gs/net/http/httptest/index.js +85 -6
  97. package/dist/gs/net/http/httptest/index.js.map +1 -1
  98. package/dist/gs/net/http/index.d.ts +300 -5
  99. package/dist/gs/net/http/index.js +1598 -58
  100. package/dist/gs/net/http/index.js.map +1 -1
  101. package/dist/gs/os/dir_unix.gs.js +1 -1
  102. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  103. package/dist/gs/os/error.gs.js +1 -1
  104. package/dist/gs/os/error.gs.js.map +1 -1
  105. package/dist/gs/os/exec.gs.d.ts +1 -0
  106. package/dist/gs/os/exec.gs.js +4 -8
  107. package/dist/gs/os/exec.gs.js.map +1 -1
  108. package/dist/gs/os/exec_posix.gs.js +1 -1
  109. package/dist/gs/os/exec_posix.gs.js.map +1 -1
  110. package/dist/gs/os/index.d.ts +1 -1
  111. package/dist/gs/os/index.js +1 -1
  112. package/dist/gs/os/index.js.map +1 -1
  113. package/dist/gs/os/proc.gs.d.ts +4 -0
  114. package/dist/gs/os/proc.gs.js +12 -6
  115. package/dist/gs/os/proc.gs.js.map +1 -1
  116. package/dist/gs/os/root_js.gs.js +1 -1
  117. package/dist/gs/os/root_js.gs.js.map +1 -1
  118. package/dist/gs/os/types.gs.js +1 -1
  119. package/dist/gs/os/types.gs.js.map +1 -1
  120. package/dist/gs/os/types_js.gs.js +1 -1
  121. package/dist/gs/os/types_js.gs.js.map +1 -1
  122. package/dist/gs/os/types_unix.gs.js +1 -1
  123. package/dist/gs/os/types_unix.gs.js.map +1 -1
  124. package/dist/gs/path/path.js +11 -7
  125. package/dist/gs/path/path.js.map +1 -1
  126. package/dist/gs/reflect/index.d.ts +5 -4
  127. package/dist/gs/reflect/index.js +4 -3
  128. package/dist/gs/reflect/index.js.map +1 -1
  129. package/dist/gs/reflect/map.js +15 -0
  130. package/dist/gs/reflect/map.js.map +1 -1
  131. package/dist/gs/reflect/type.d.ts +25 -6
  132. package/dist/gs/reflect/type.js +1475 -228
  133. package/dist/gs/reflect/type.js.map +1 -1
  134. package/dist/gs/reflect/types.d.ts +14 -6
  135. package/dist/gs/reflect/types.js +35 -1
  136. package/dist/gs/reflect/types.js.map +1 -1
  137. package/dist/gs/reflect/value.d.ts +1 -0
  138. package/dist/gs/reflect/value.js +83 -41
  139. package/dist/gs/reflect/value.js.map +1 -1
  140. package/dist/gs/reflect/visiblefields.js +4 -140
  141. package/dist/gs/reflect/visiblefields.js.map +1 -1
  142. package/dist/gs/runtime/pprof/index.d.ts +8 -2
  143. package/dist/gs/runtime/pprof/index.js +50 -30
  144. package/dist/gs/runtime/pprof/index.js.map +1 -1
  145. package/dist/gs/runtime/runtime.js +5 -4
  146. package/dist/gs/runtime/runtime.js.map +1 -1
  147. package/dist/gs/runtime/trace/index.js +5 -19
  148. package/dist/gs/runtime/trace/index.js.map +1 -1
  149. package/dist/gs/strconv/atoi.gs.js +1 -1
  150. package/dist/gs/strconv/atoi.gs.js.map +1 -1
  151. package/dist/gs/strconv/complex.gs.d.ts +3 -0
  152. package/dist/gs/strconv/complex.gs.js +148 -0
  153. package/dist/gs/strconv/complex.gs.js.map +1 -0
  154. package/dist/gs/strconv/index.d.ts +1 -0
  155. package/dist/gs/strconv/index.js +1 -0
  156. package/dist/gs/strconv/index.js.map +1 -1
  157. package/dist/gs/strings/builder.js +1 -1
  158. package/dist/gs/strings/reader.js +9 -5
  159. package/dist/gs/strings/reader.js.map +1 -1
  160. package/dist/gs/strings/replace.js +15 -7
  161. package/dist/gs/strings/replace.js.map +1 -1
  162. package/dist/gs/strings/strings.d.ts +5 -0
  163. package/dist/gs/strings/strings.js +57 -5
  164. package/dist/gs/strings/strings.js.map +1 -1
  165. package/dist/gs/sync/atomic/doc_64.gs.js +7 -6
  166. package/dist/gs/sync/atomic/doc_64.gs.js.map +1 -1
  167. package/dist/gs/sync/atomic/type.gs.js +9 -9
  168. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  169. package/dist/gs/sync/atomic/value.gs.js +2 -2
  170. package/dist/gs/sync/atomic/value.gs.js.map +1 -1
  171. package/dist/gs/syscall/env.js +22 -14
  172. package/dist/gs/syscall/env.js.map +1 -1
  173. package/dist/gs/testing/testing.js +55 -13
  174. package/dist/gs/testing/testing.js.map +1 -1
  175. package/dist/gs/time/time.d.ts +24 -1
  176. package/dist/gs/time/time.js +43 -3
  177. package/dist/gs/time/time.js.map +1 -1
  178. package/dist/gs/unique/index.js +7 -1
  179. package/dist/gs/unique/index.js.map +1 -1
  180. package/go.mod +3 -3
  181. package/go.sum +16 -0
  182. package/gs/builtin/hostio.test.ts +16 -0
  183. package/gs/builtin/hostio.ts +7 -0
  184. package/gs/builtin/runtime-contract.test.ts +246 -21
  185. package/gs/builtin/slice.ts +269 -24
  186. package/gs/builtin/type.ts +226 -59
  187. package/gs/builtin/varRef.ts +85 -2
  188. package/gs/bytes/buffer.gs.ts +1 -1
  189. package/gs/bytes/reader.gs.ts +1 -1
  190. package/gs/compress/zlib/index.test.ts +62 -1
  191. package/gs/compress/zlib/index.ts +53 -16
  192. package/gs/compress/zlib/parity.json +51 -0
  193. package/gs/encoding/json/index.test.ts +360 -6
  194. package/gs/encoding/json/index.ts +679 -38
  195. package/gs/encoding/json/parity.json +81 -0
  196. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +373 -3
  197. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +893 -1
  198. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +18 -0
  199. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +17 -11
  200. package/gs/github.com/pkg/errors/errors.ts +54 -30
  201. package/gs/go/scanner/index.test.ts +39 -56
  202. package/gs/go/scanner/index.ts +33 -5
  203. package/gs/go/scanner/parity.json +27 -0
  204. package/gs/go/token/index.ts +22 -6
  205. package/gs/hash/index.test.ts +20 -33
  206. package/gs/hash/index.ts +28 -0
  207. package/gs/hash/parity.json +21 -0
  208. package/gs/internal/byteorder/index.test.ts +2 -2
  209. package/gs/internal/byteorder/index.ts +2 -2
  210. package/gs/internal/goarch/index.test.ts +32 -0
  211. package/gs/internal/goarch/index.ts +45 -13
  212. package/gs/internal/goarch/parity.json +144 -0
  213. package/gs/io/fs/fs.ts +26 -14
  214. package/gs/io/fs/readdir.ts +4 -4
  215. package/gs/io/fs/sub.ts +8 -1
  216. package/gs/io/io.ts +1 -0
  217. package/gs/io/parity.json +162 -0
  218. package/gs/math/bits/index.test.ts +14 -1
  219. package/gs/math/bits/index.ts +23 -4
  220. package/gs/math/bits/parity.json +156 -0
  221. package/gs/mime/index.test.ts +90 -0
  222. package/gs/mime/index.ts +369 -6
  223. package/gs/mime/parity.json +36 -0
  224. package/gs/net/http/httptest/index.test.ts +98 -2
  225. package/gs/net/http/httptest/index.ts +101 -6
  226. package/gs/net/http/httptest/parity.json +15 -0
  227. package/gs/net/http/index.test.ts +781 -12
  228. package/gs/net/http/index.ts +1860 -139
  229. package/gs/net/http/meta.json +16 -1
  230. package/gs/net/http/parity.json +193 -0
  231. package/gs/os/dir_unix.gs.ts +1 -1
  232. package/gs/os/error.gs.ts +1 -1
  233. package/gs/os/exec.gs.ts +4 -8
  234. package/gs/os/exec_posix.gs.ts +1 -1
  235. package/gs/os/index.test.ts +9 -0
  236. package/gs/os/index.ts +1 -0
  237. package/gs/os/parity.json +9 -0
  238. package/gs/os/proc.gs.ts +18 -5
  239. package/gs/os/proc.test.ts +26 -0
  240. package/gs/os/root_js.gs.ts +1 -1
  241. package/gs/os/types.gs.ts +1 -1
  242. package/gs/os/types_js.gs.ts +1 -1
  243. package/gs/os/types_unix.gs.ts +1 -1
  244. package/gs/path/path.ts +11 -7
  245. package/gs/reflect/field.test.ts +37 -15
  246. package/gs/reflect/function-types.test.ts +518 -22
  247. package/gs/reflect/index.ts +8 -6
  248. package/gs/reflect/map.ts +20 -0
  249. package/gs/reflect/meta.json +6 -4
  250. package/gs/reflect/parity.json +234 -0
  251. package/gs/reflect/sliceat.test.ts +156 -0
  252. package/gs/reflect/structof.test.ts +401 -0
  253. package/gs/reflect/type.ts +1961 -317
  254. package/gs/reflect/typefor.test.ts +530 -10
  255. package/gs/reflect/types.ts +43 -18
  256. package/gs/reflect/value.ts +105 -45
  257. package/gs/reflect/visiblefields.ts +5 -168
  258. package/gs/runtime/parity.json +24 -0
  259. package/gs/runtime/pprof/index.test.ts +29 -7
  260. package/gs/runtime/pprof/index.ts +56 -30
  261. package/gs/runtime/pprof/parity.json +27 -0
  262. package/gs/runtime/runtime.test.ts +3 -1
  263. package/gs/runtime/runtime.ts +4 -3
  264. package/gs/runtime/trace/index.test.ts +5 -3
  265. package/gs/runtime/trace/index.ts +8 -20
  266. package/gs/runtime/trace/parity.json +36 -0
  267. package/gs/strconv/atoi.gs.ts +1 -1
  268. package/gs/strconv/complex.gs.ts +174 -0
  269. package/gs/strconv/complex.test.ts +65 -0
  270. package/gs/strconv/index.ts +1 -0
  271. package/gs/strconv/parity.json +120 -0
  272. package/gs/strings/builder.ts +1 -1
  273. package/gs/strings/parity.json +186 -0
  274. package/gs/strings/reader.ts +9 -5
  275. package/gs/strings/replace.ts +15 -7
  276. package/gs/strings/strings.test.ts +22 -2
  277. package/gs/strings/strings.ts +64 -6
  278. package/gs/sync/atomic/doc_64.gs.ts +6 -7
  279. package/gs/sync/atomic/doc_64.test.ts +43 -0
  280. package/gs/sync/atomic/type.gs.ts +9 -9
  281. package/gs/sync/atomic/value.gs.ts +2 -2
  282. package/gs/syscall/env.ts +29 -14
  283. package/gs/testing/testing.test.ts +67 -0
  284. package/gs/testing/testing.ts +87 -19
  285. package/gs/time/parity.json +225 -0
  286. package/gs/time/time.test.ts +20 -2
  287. package/gs/time/time.ts +49 -7
  288. package/gs/unique/index.ts +7 -1
  289. package/package.json +4 -2
  290. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +0 -217
  291. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +0 -926
  292. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +0 -1
  293. package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +0 -38
  294. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +0 -1361
  295. 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
- interfaceGraph, interfaceDiagnostics := o.resolveInterfaceImplementationGraph(ctx, model)
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
- o.recordTupleImports(model, semPkg, position.file, pkg.PkgPath, signature.Params(), make(map[types.Type]bool))
396
- o.recordTupleImports(model, semPkg, position.file, pkg.PkgPath, signature.Results(), make(map[types.Type]bool))
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
- changed := true
1132
- for changed {
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
- changed = false
1137
- for _, semFn := range model.functions {
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
- for called := range semFn.calls {
1142
- if model.functionAsync(called) {
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 _, methodSet := range methodSets {
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
- var concretes []*types.Named
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 _, methodSet := range methodSets {
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: implementationMethodMap(methodSet.methods, ifaceMethods),
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 = model.interfaceImplementations[:0]
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: graphEntry.typ,
1567
- iface: graphEntry.iface,
1568
- pointer: graphEntry.pointer,
1569
- asyncMethods: make(map[string]bool),
1669
+ typ: graphEntry.typ,
1670
+ iface: graphEntry.iface,
1671
+ pointer: graphEntry.pointer,
1570
1672
  }
1571
- for methodName, implMethod := range graphEntry.implMethods {
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
- implementation.asyncMethods[methodName] = true
1575
- model.markInterfaceMethodAsync(graphEntry.ifaceMethods[methodName])
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, implMethod := range graphEntry.implMethods {
1698
+ for methodName, ifaceMethod := range graphEntry.ifaceMethods {
1699
+ implMethod := graphEntry.implMethods[methodName]
1602
1700
  if model.functionAsync(implMethod) {
1603
- model.markInterfaceMethodAsync(graphEntry.ifaceMethods[methodName])
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: make(map[string]*types.Func),
1682
- implMethods: implementationMethodMap(methodSet.methods, ifaceMethods),
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 implementationMethodMap(
1914
+ func implementationHasExactMethodSignatures(
1775
1915
  receiverMethods map[string]*types.Func,
1776
1916
  ifaceMethods map[string]*types.Func,
1777
- ) map[string]*types.Func {
1778
- methods := make(map[string]*types.Func, len(ifaceMethods))
1779
- for methodName := range ifaceMethods {
1780
- methods[methodName] = receiverMethods[methodName]
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 methods
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, make(map[types.Type]bool))
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(