goscript 0.1.0 → 0.1.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 (327) hide show
  1. package/README.md +267 -255
  2. package/cmd/goscript/cmd-test.go +193 -0
  3. package/cmd/goscript/cmd-test_test.go +76 -0
  4. package/cmd/goscript/main.go +1 -0
  5. package/compiler/build-flags.go +38 -0
  6. package/compiler/compile-request.go +2 -0
  7. package/compiler/compliance_test.go +0 -8
  8. package/compiler/gotest/owner.go +24 -0
  9. package/compiler/gotest/package-result.go +67 -0
  10. package/compiler/gotest/request.go +145 -0
  11. package/compiler/gotest/result.go +28 -0
  12. package/compiler/gotest/runner.go +588 -0
  13. package/compiler/gotest/runner_test.go +627 -0
  14. package/compiler/gotest/test.go +9 -0
  15. package/compiler/index.test.ts +1 -1
  16. package/compiler/lowered-program.go +71 -19
  17. package/compiler/lowering.go +5065 -569
  18. package/compiler/override-facts.go +307 -0
  19. package/compiler/override-registry.go +50 -189
  20. package/compiler/override-registry_test.go +47 -0
  21. package/compiler/package-graph.go +50 -27
  22. package/compiler/package-graph_test.go +37 -2
  23. package/compiler/package-test-function.go +9 -0
  24. package/compiler/package-test-graph-package.go +40 -0
  25. package/compiler/package-test-graph-variant.go +105 -0
  26. package/compiler/package-test-graph.go +117 -0
  27. package/compiler/package-test-graph_test.go +144 -0
  28. package/compiler/runtime-contract.go +189 -29
  29. package/compiler/runtime-contract_test.go +44 -30
  30. package/compiler/semantic-model-types.go +9 -6
  31. package/compiler/semantic-model.go +538 -38
  32. package/compiler/semantic-model_test.go +55 -0
  33. package/compiler/service.go +1 -1
  34. package/compiler/skeleton_test.go +679 -49
  35. package/compiler/tsworkspace/owner.go +334 -0
  36. package/compiler/tsworkspace/owner_test.go +93 -0
  37. package/compiler/tsworkspace/result.go +17 -0
  38. package/compiler/typescript-emitter.go +459 -82
  39. package/compiler/wasm/compile.go +1 -1
  40. package/compiler/wasm/compile_test.go +61 -11
  41. package/compiler/wasm_api.go +172 -7
  42. package/dist/gs/builtin/builtin.d.ts +20 -2
  43. package/dist/gs/builtin/builtin.js +194 -6
  44. package/dist/gs/builtin/builtin.js.map +1 -1
  45. package/dist/gs/builtin/channel.d.ts +8 -0
  46. package/dist/gs/builtin/channel.js +12 -0
  47. package/dist/gs/builtin/channel.js.map +1 -1
  48. package/dist/gs/builtin/slice.d.ts +22 -2
  49. package/dist/gs/builtin/slice.js +216 -44
  50. package/dist/gs/builtin/slice.js.map +1 -1
  51. package/dist/gs/builtin/type.d.ts +5 -2
  52. package/dist/gs/builtin/type.js +83 -24
  53. package/dist/gs/builtin/type.js.map +1 -1
  54. package/dist/gs/builtin/varRef.d.ts +5 -0
  55. package/dist/gs/builtin/varRef.js +23 -0
  56. package/dist/gs/builtin/varRef.js.map +1 -1
  57. package/dist/gs/bytes/buffer.gs.js +48 -44
  58. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  59. package/dist/gs/bytes/reader.gs.js +20 -18
  60. package/dist/gs/bytes/reader.gs.js.map +1 -1
  61. package/dist/gs/context/context.d.ts +5 -4
  62. package/dist/gs/context/context.js +10 -10
  63. package/dist/gs/context/context.js.map +1 -1
  64. package/dist/gs/crypto/internal/fips140deps/byteorder/index.d.ts +1 -0
  65. package/dist/gs/crypto/internal/fips140deps/byteorder/index.js +2 -0
  66. package/dist/gs/crypto/internal/fips140deps/byteorder/index.js.map +1 -0
  67. package/dist/gs/crypto/internal/fips140deps/godebug/index.d.ts +1 -0
  68. package/dist/gs/crypto/internal/fips140deps/godebug/index.js +2 -0
  69. package/dist/gs/crypto/internal/fips140deps/godebug/index.js.map +1 -0
  70. package/dist/gs/embed/index.d.ts +7 -0
  71. package/dist/gs/embed/index.js +16 -0
  72. package/dist/gs/embed/index.js.map +1 -0
  73. package/dist/gs/encoding/json/index.d.ts +1 -0
  74. package/dist/gs/encoding/json/index.js +18 -0
  75. package/dist/gs/encoding/json/index.js.map +1 -1
  76. package/dist/gs/errors/errors.d.ts +4 -0
  77. package/dist/gs/errors/errors.js +81 -0
  78. package/dist/gs/errors/errors.js.map +1 -1
  79. package/dist/gs/fmt/fmt.d.ts +4 -4
  80. package/dist/gs/fmt/fmt.js +42 -11
  81. package/dist/gs/fmt/fmt.js.map +1 -1
  82. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +35 -0
  83. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +211 -1
  84. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  85. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +189 -0
  86. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +825 -0
  87. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -0
  88. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +163 -0
  89. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +449 -0
  90. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -0
  91. package/dist/gs/github.com/klauspost/compress/internal/le/index.d.ts +9 -0
  92. package/dist/gs/github.com/klauspost/compress/internal/le/index.js +71 -0
  93. package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -0
  94. package/dist/gs/go/internal/scannerhooks/index.d.ts +3 -0
  95. package/dist/gs/go/internal/scannerhooks/index.js +5 -0
  96. package/dist/gs/go/internal/scannerhooks/index.js.map +1 -0
  97. package/dist/gs/go/scanner/index.d.ts +13 -0
  98. package/dist/gs/go/scanner/index.js +35 -0
  99. package/dist/gs/go/scanner/index.js.map +1 -1
  100. package/dist/gs/go/token/index.d.ts +156 -0
  101. package/dist/gs/go/token/index.js +500 -4
  102. package/dist/gs/go/token/index.js.map +1 -1
  103. package/dist/gs/internal/abi/index.d.ts +4 -0
  104. package/dist/gs/internal/abi/index.js +10 -0
  105. package/dist/gs/internal/abi/index.js.map +1 -1
  106. package/dist/gs/internal/bytealg/index.d.ts +2 -0
  107. package/dist/gs/internal/bytealg/index.js +14 -0
  108. package/dist/gs/internal/bytealg/index.js.map +1 -1
  109. package/dist/gs/internal/byteorder/index.d.ts +8 -2
  110. package/dist/gs/internal/byteorder/index.js +56 -25
  111. package/dist/gs/internal/byteorder/index.js.map +1 -1
  112. package/dist/gs/internal/godebug/index.d.ts +12 -0
  113. package/dist/gs/internal/godebug/index.js +30 -0
  114. package/dist/gs/internal/godebug/index.js.map +1 -0
  115. package/dist/gs/io/fs/index.d.ts +1 -0
  116. package/dist/gs/io/fs/index.js +1 -0
  117. package/dist/gs/io/fs/index.js.map +1 -1
  118. package/dist/gs/io/fs/readlink.d.ts +8 -0
  119. package/dist/gs/io/fs/readlink.js +64 -0
  120. package/dist/gs/io/fs/readlink.js.map +1 -0
  121. package/dist/gs/io/fs/walk.d.ts +3 -3
  122. package/dist/gs/io/fs/walk.js +7 -7
  123. package/dist/gs/io/fs/walk.js.map +1 -1
  124. package/dist/gs/io/io.d.ts +40 -6
  125. package/dist/gs/io/io.js +151 -26
  126. package/dist/gs/io/io.js.map +1 -1
  127. package/dist/gs/maps/iter.d.ts +3 -3
  128. package/dist/gs/maps/iter.js +3 -3
  129. package/dist/gs/maps/iter.js.map +1 -1
  130. package/dist/gs/maps/maps.d.ts +2 -2
  131. package/dist/gs/maps/maps.js +1 -1
  132. package/dist/gs/maps/maps.js.map +1 -1
  133. package/dist/gs/math/bits/index.d.ts +13 -4
  134. package/dist/gs/math/bits/index.js +66 -34
  135. package/dist/gs/math/bits/index.js.map +1 -1
  136. package/dist/gs/math/const.gs.d.ts +5 -5
  137. package/dist/gs/math/const.gs.js +4 -4
  138. package/dist/gs/math/const.gs.js.map +1 -1
  139. package/dist/gs/mime/index.d.ts +1 -0
  140. package/dist/gs/mime/index.js +50 -0
  141. package/dist/gs/mime/index.js.map +1 -0
  142. package/dist/gs/net/http/httptest/index.d.ts +11 -0
  143. package/dist/gs/net/http/httptest/index.js +21 -0
  144. package/dist/gs/net/http/httptest/index.js.map +1 -0
  145. package/dist/gs/net/http/index.d.ts +27 -0
  146. package/dist/gs/net/http/index.js +61 -0
  147. package/dist/gs/net/http/index.js.map +1 -0
  148. package/dist/gs/os/dir_unix.gs.js +2 -2
  149. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  150. package/dist/gs/os/types_js.gs.js.map +1 -1
  151. package/dist/gs/path/filepath/match.js +165 -3
  152. package/dist/gs/path/filepath/match.js.map +1 -1
  153. package/dist/gs/path/filepath/path.d.ts +3 -1
  154. package/dist/gs/path/filepath/path.js +133 -4
  155. package/dist/gs/path/filepath/path.js.map +1 -1
  156. package/dist/gs/path/path.d.ts +4 -1
  157. package/dist/gs/path/path.js +16 -4
  158. package/dist/gs/path/path.js.map +1 -1
  159. package/dist/gs/reflect/index.d.ts +1 -1
  160. package/dist/gs/reflect/index.js +1 -1
  161. package/dist/gs/reflect/index.js.map +1 -1
  162. package/dist/gs/reflect/map.js +3 -0
  163. package/dist/gs/reflect/map.js.map +1 -1
  164. package/dist/gs/reflect/type.d.ts +7 -4
  165. package/dist/gs/reflect/type.js +148 -7
  166. package/dist/gs/reflect/type.js.map +1 -1
  167. package/dist/gs/runtime/debug/index.d.ts +2 -0
  168. package/dist/gs/runtime/debug/index.js +8 -0
  169. package/dist/gs/runtime/debug/index.js.map +1 -0
  170. package/dist/gs/runtime/runtime.d.ts +35 -3
  171. package/dist/gs/runtime/runtime.js +72 -0
  172. package/dist/gs/runtime/runtime.js.map +1 -1
  173. package/dist/gs/slices/slices.d.ts +24 -5
  174. package/dist/gs/slices/slices.js +214 -5
  175. package/dist/gs/slices/slices.js.map +1 -1
  176. package/dist/gs/sort/slice.gs.d.ts +3 -3
  177. package/dist/gs/sort/slice.gs.js +6 -6
  178. package/dist/gs/sort/slice.gs.js.map +1 -1
  179. package/dist/gs/sort/sort.gs.d.ts +4 -4
  180. package/dist/gs/sort/sort.gs.js +11 -8
  181. package/dist/gs/sort/sort.gs.js.map +1 -1
  182. package/dist/gs/strings/builder.d.ts +1 -1
  183. package/dist/gs/strings/builder.js +3 -2
  184. package/dist/gs/strings/builder.js.map +1 -1
  185. package/dist/gs/sync/atomic/type.gs.d.ts +9 -8
  186. package/dist/gs/sync/atomic/type.gs.js +0 -2
  187. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  188. package/dist/gs/sync/sync.d.ts +2 -0
  189. package/dist/gs/sync/sync.js +27 -0
  190. package/dist/gs/sync/sync.js.map +1 -1
  191. package/dist/gs/syscall/constants.d.ts +36 -24
  192. package/dist/gs/syscall/constants.js +12 -0
  193. package/dist/gs/syscall/constants.js.map +1 -1
  194. package/dist/gs/syscall/errors.d.ts +2 -0
  195. package/dist/gs/syscall/errors.js +8 -0
  196. package/dist/gs/syscall/errors.js.map +1 -1
  197. package/dist/gs/syscall/fs.d.ts +43 -0
  198. package/dist/gs/syscall/fs.js +102 -0
  199. package/dist/gs/syscall/fs.js.map +1 -1
  200. package/dist/gs/syscall/js/index.d.ts +90 -0
  201. package/dist/gs/syscall/js/index.js +375 -0
  202. package/dist/gs/syscall/js/index.js.map +1 -0
  203. package/dist/gs/syscall/types.d.ts +22 -0
  204. package/dist/gs/syscall/types.js +45 -1
  205. package/dist/gs/syscall/types.js.map +1 -1
  206. package/dist/gs/testing/index.d.ts +1 -0
  207. package/dist/gs/testing/index.js +2 -0
  208. package/dist/gs/testing/index.js.map +1 -0
  209. package/dist/gs/testing/testing.d.ts +77 -0
  210. package/dist/gs/testing/testing.js +301 -0
  211. package/dist/gs/testing/testing.js.map +1 -0
  212. package/dist/gs/time/time.d.ts +41 -4
  213. package/dist/gs/time/time.js +205 -36
  214. package/dist/gs/time/time.js.map +1 -1
  215. package/dist/gs/unicode/unicode.d.ts +23 -1
  216. package/dist/gs/unicode/unicode.js +79 -10
  217. package/dist/gs/unicode/unicode.js.map +1 -1
  218. package/dist/gs/unicode/utf8/utf8.d.ts +4 -4
  219. package/dist/gs/unicode/utf8/utf8.js +24 -11
  220. package/dist/gs/unicode/utf8/utf8.js.map +1 -1
  221. package/dist/gs/unique/index.d.ts +11 -0
  222. package/dist/gs/unique/index.js +71 -0
  223. package/dist/gs/unique/index.js.map +1 -0
  224. package/go.sum +9 -0
  225. package/gs/builtin/builtin.ts +239 -8
  226. package/gs/builtin/channel.ts +22 -0
  227. package/gs/builtin/runtime-contract.test.ts +126 -0
  228. package/gs/builtin/slice.ts +259 -50
  229. package/gs/builtin/type.ts +109 -34
  230. package/gs/builtin/varRef.ts +38 -1
  231. package/gs/bytes/buffer.gs.ts +48 -44
  232. package/gs/bytes/meta.json +8 -3
  233. package/gs/bytes/reader.gs.ts +20 -19
  234. package/gs/context/context.test.ts +41 -0
  235. package/gs/context/context.ts +22 -26
  236. package/gs/crypto/internal/fips140deps/byteorder/index.ts +1 -0
  237. package/gs/crypto/internal/fips140deps/godebug/index.ts +1 -0
  238. package/gs/embed/index.ts +20 -0
  239. package/gs/embed/meta.json +5 -0
  240. package/gs/encoding/json/index.test.ts +15 -1
  241. package/gs/encoding/json/index.ts +24 -0
  242. package/gs/errors/errors.test.ts +82 -0
  243. package/gs/errors/errors.ts +104 -0
  244. package/gs/fmt/fmt.ts +56 -16
  245. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +73 -1
  246. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +297 -1
  247. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +159 -0
  248. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +1005 -0
  249. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +719 -0
  250. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +40 -0
  251. package/gs/github.com/klauspost/compress/internal/le/index.test.ts +36 -0
  252. package/gs/github.com/klauspost/compress/internal/le/index.ts +114 -0
  253. package/gs/go/internal/scannerhooks/index.test.ts +14 -0
  254. package/gs/go/internal/scannerhooks/index.ts +9 -0
  255. package/gs/go/scanner/index.test.ts +22 -0
  256. package/gs/go/scanner/index.ts +47 -0
  257. package/gs/go/token/index.test.ts +47 -1
  258. package/gs/go/token/index.ts +570 -4
  259. package/gs/internal/abi/index.test.ts +18 -0
  260. package/gs/internal/abi/index.ts +14 -0
  261. package/gs/internal/bytealg/index.test.ts +18 -0
  262. package/gs/internal/bytealg/index.ts +16 -0
  263. package/gs/internal/byteorder/index.test.ts +39 -0
  264. package/gs/internal/byteorder/index.ts +100 -27
  265. package/gs/internal/godebug/index.test.ts +16 -0
  266. package/gs/internal/godebug/index.ts +35 -0
  267. package/gs/io/fs/index.ts +1 -0
  268. package/gs/io/fs/meta.json +5 -0
  269. package/gs/io/fs/readlink.test.ts +43 -0
  270. package/gs/io/fs/readlink.ts +77 -0
  271. package/gs/io/fs/walk.test.ts +61 -0
  272. package/gs/io/fs/walk.ts +9 -9
  273. package/gs/io/io.ts +174 -31
  274. package/gs/io/meta.json +10 -2
  275. package/gs/maps/iter.ts +12 -6
  276. package/gs/maps/maps.ts +8 -6
  277. package/gs/math/bits/index.ts +103 -47
  278. package/gs/math/const.gs.test.ts +11 -5
  279. package/gs/math/const.gs.ts +5 -6
  280. package/gs/mime/index.ts +54 -0
  281. package/gs/net/http/httptest/index.ts +25 -0
  282. package/gs/net/http/index.test.ts +20 -0
  283. package/gs/net/http/index.ts +81 -0
  284. package/gs/os/dir_unix.gs.ts +2 -3
  285. package/gs/os/types_js.gs.ts +2 -2
  286. package/gs/path/filepath/match.test.ts +31 -12
  287. package/gs/path/filepath/match.ts +178 -3
  288. package/gs/path/filepath/path.test.ts +25 -0
  289. package/gs/path/filepath/path.ts +159 -5
  290. package/gs/path/path.ts +20 -5
  291. package/gs/reflect/index.ts +1 -0
  292. package/gs/reflect/map.test.ts +19 -0
  293. package/gs/reflect/map.ts +4 -0
  294. package/gs/reflect/type.ts +197 -17
  295. package/gs/runtime/debug/index.test.ts +24 -0
  296. package/gs/runtime/debug/index.ts +8 -0
  297. package/gs/runtime/runtime.test.ts +19 -0
  298. package/gs/runtime/runtime.ts +98 -3
  299. package/gs/slices/slices.test.ts +94 -0
  300. package/gs/slices/slices.ts +245 -5
  301. package/gs/sort/meta.json +7 -0
  302. package/gs/sort/slice.gs.ts +16 -7
  303. package/gs/sort/sort.gs.ts +16 -13
  304. package/gs/strings/builder.ts +4 -3
  305. package/gs/sync/atomic/type.gs.ts +13 -14
  306. package/gs/sync/meta.json +3 -1
  307. package/gs/sync/sync.test.ts +13 -1
  308. package/gs/sync/sync.ts +27 -0
  309. package/gs/syscall/constants.ts +39 -24
  310. package/gs/syscall/errors.ts +10 -0
  311. package/gs/syscall/fs.ts +195 -0
  312. package/gs/syscall/js/index.ts +458 -0
  313. package/gs/syscall/js/meta.json +4 -0
  314. package/gs/syscall/net.test.ts +85 -0
  315. package/gs/syscall/types.ts +56 -0
  316. package/gs/testing/index.ts +1 -0
  317. package/gs/testing/meta.json +5 -0
  318. package/gs/testing/testing.test.ts +90 -0
  319. package/gs/testing/testing.ts +382 -0
  320. package/gs/time/time.test.ts +106 -0
  321. package/gs/time/time.ts +278 -57
  322. package/gs/unicode/unicode.test.ts +25 -0
  323. package/gs/unicode/unicode.ts +119 -9
  324. package/gs/unicode/utf8/utf8.test.ts +13 -0
  325. package/gs/unicode/utf8/utf8.ts +28 -16
  326. package/gs/unique/index.ts +91 -0
  327. package/package.json +2 -1
@@ -68,35 +68,51 @@ func (o *SemanticModelOwner) Build(ctx context.Context, graph *PackageGraph) (*S
68
68
  })
69
69
  continue
70
70
  }
71
- diagnostics = append(diagnostics, o.buildPackage(model, node, pkg)...)
71
+ diagnostics = append(diagnostics, o.buildPackage(ctx, model, node, pkg)...)
72
72
  }
73
73
  if diagnosticsHaveErrors(diagnostics) {
74
74
  return model, diagnostics
75
75
  }
76
76
 
77
- o.propagateFunctionAsync(model)
78
- o.resolveInterfaceImplementations(model)
79
- o.propagateFunctionAsync(model)
77
+ diagnostics = append(diagnostics, o.propagateFunctionAsync(ctx, model)...)
78
+ if diagnosticsHaveErrors(diagnostics) {
79
+ return model, diagnostics
80
+ }
81
+ diagnostics = append(diagnostics, o.propagateAsyncFunctionArguments(ctx, model)...)
82
+ if diagnosticsHaveErrors(diagnostics) {
83
+ return model, diagnostics
84
+ }
85
+ diagnostics = append(diagnostics, o.resolveInterfaceImplementations(ctx, model)...)
86
+ if diagnosticsHaveErrors(diagnostics) {
87
+ return model, diagnostics
88
+ }
89
+ diagnostics = append(diagnostics, o.propagateFunctionAsync(ctx, model)...)
80
90
  return model, diagnostics
81
91
  }
82
92
 
83
93
  func newSemanticModel() *SemanticModel {
84
94
  return &SemanticModel{
85
- packages: make(map[string]*semanticPackage),
86
- addressTaken: make(map[types.Object]bool),
87
- needsVarRef: make(map[types.Object]bool),
88
- functions: make(map[*types.Func]*semanticFunction),
89
- types: make(map[*types.Named]*semanticType),
90
- values: make(map[types.Object]*semanticValue),
91
- generatedImports: make(map[string]map[string]bool),
95
+ packages: make(map[string]*semanticPackage),
96
+ addressTaken: make(map[types.Object]bool),
97
+ needsVarRef: make(map[types.Object]bool),
98
+ functions: make(map[*types.Func]*semanticFunction),
99
+ functionsByFullName: make(map[string]*semanticFunction),
100
+ types: make(map[*types.Named]*semanticType),
101
+ values: make(map[types.Object]*semanticValue),
102
+ generatedImports: make(map[string]map[string]bool),
92
103
  }
93
104
  }
94
105
 
95
106
  func (o *SemanticModelOwner) buildPackage(
107
+ ctx context.Context,
96
108
  model *SemanticModel,
97
109
  node *PackageGraphNode,
98
110
  pkg *packages.Package,
99
111
  ) []Diagnostic {
112
+ overrideFacts, diagnostics := o.overrideOwner.Facts(ctx)
113
+ if diagnosticsHaveErrors(diagnostics) {
114
+ return diagnostics
115
+ }
100
116
  semPkg := &semanticPackage{
101
117
  pkgPath: node.PkgPath,
102
118
  name: node.Name,
@@ -109,9 +125,8 @@ func (o *SemanticModelOwner) buildPackage(
109
125
  o.collectFileDeclarations(model, semPkg, pkg, file)
110
126
  o.collectFileFacts(model, semPkg, pkg, file)
111
127
  }
112
- var diagnostics []Diagnostic
113
128
  for _, file := range pkg.Syntax {
114
- diagnostics = append(diagnostics, o.collectFunctionFacts(model, pkg, file)...)
129
+ diagnostics = append(diagnostics, o.collectFunctionFacts(model, pkg, file, overrideFacts)...)
115
130
  }
116
131
  return diagnostics
117
132
  }
@@ -150,7 +165,8 @@ func (o *SemanticModelOwner) collectFileDeclarations(
150
165
  continue
151
166
  }
152
167
  position := sourcePos(pkg, typed.Name.Pos())
153
- o.addFunction(model, semPkg, fn, position)
168
+ semFn := o.addFunction(model, semPkg, fn, position)
169
+ semFn.hasBody = typed.Body != nil
154
170
  semPkg.declarations = append(semPkg.declarations, semanticDeclaration{
155
171
  kind: "func",
156
172
  name: typed.Name.Name,
@@ -176,6 +192,7 @@ func (o *SemanticModelOwner) collectGenDecl(
176
192
  }
177
193
  position := sourcePos(pkg, typed.Name.Pos())
178
194
  o.addType(model, semPkg, obj, position, typed.Type)
195
+ o.recordGeneratedImports(model, semPkg, position.file, pkg.PkgPath, obj.Type())
179
196
  semPkg.declarations = append(semPkg.declarations, semanticDeclaration{
180
197
  kind: "type",
181
198
  name: typed.Name.Name,
@@ -233,13 +250,121 @@ func (o *SemanticModelOwner) collectFileFacts(
233
250
  o.recordTypeAssertion(semPkg, pkg, typed)
234
251
  case *ast.ValueSpec:
235
252
  o.recordValueSpecNilFacts(semPkg, pkg, typed)
253
+ names := make([]ast.Expr, 0, len(typed.Names))
254
+ for _, name := range typed.Names {
255
+ names = append(names, name)
256
+ }
257
+ o.recordAsyncCompatibleFunctionAssignments(model, pkg, names, typed.Values)
236
258
  case *ast.AssignStmt:
237
259
  o.recordAssignNilFacts(semPkg, pkg, typed)
260
+ o.recordAsyncCompatibleFunctionAssignments(model, pkg, typed.Lhs, typed.Rhs)
261
+ case *ast.FuncLit:
262
+ o.recordFuncLitAssignedCaptures(model, pkg, typed)
263
+ return false
264
+ case *ast.CallExpr:
265
+ o.recordCallSignatureImports(model, semPkg, pkg, typed)
266
+ }
267
+ return true
268
+ })
269
+ }
270
+
271
+ func (o *SemanticModelOwner) recordFuncLitAssignedCaptures(
272
+ model *SemanticModel,
273
+ pkg *packages.Package,
274
+ lit *ast.FuncLit,
275
+ ) {
276
+ ast.Inspect(lit.Body, func(node ast.Node) bool {
277
+ switch typed := node.(type) {
278
+ case *ast.FuncLit:
279
+ o.recordFuncLitAssignedCaptures(model, pkg, typed)
280
+ return false
281
+ case *ast.UnaryExpr:
282
+ if typed.Op == token.AND {
283
+ o.recordAddressTaken(model, pkg, typed.X)
284
+ }
285
+ case *ast.AssignStmt:
286
+ for _, lhs := range typed.Lhs {
287
+ o.recordFuncLitAssignedCapture(model, pkg, lit, lhs)
288
+ }
289
+ case *ast.IncDecStmt:
290
+ o.recordFuncLitAssignedCapture(model, pkg, lit, typed.X)
238
291
  }
239
292
  return true
240
293
  })
241
294
  }
242
295
 
296
+ func (o *SemanticModelOwner) recordFuncLitAssignedCapture(
297
+ model *SemanticModel,
298
+ pkg *packages.Package,
299
+ lit *ast.FuncLit,
300
+ expr ast.Expr,
301
+ ) {
302
+ ident, ok := ast.Unparen(expr).(*ast.Ident)
303
+ if !ok {
304
+ return
305
+ }
306
+ obj, _ := pkg.TypesInfo.Uses[ident].(*types.Var)
307
+ if obj == nil || !obj.Pos().IsValid() {
308
+ return
309
+ }
310
+ if lit.Pos() < obj.Pos() && obj.Pos() < lit.End() {
311
+ return
312
+ }
313
+ if signatureForType(obj.Type()) == nil {
314
+ return
315
+ }
316
+ model.needsVarRef[obj] = true
317
+ }
318
+
319
+ func (o *SemanticModelOwner) recordCallSignatureImports(
320
+ model *SemanticModel,
321
+ semPkg *semanticPackage,
322
+ pkg *packages.Package,
323
+ expr *ast.CallExpr,
324
+ ) {
325
+ signature := signatureForType(pkg.TypesInfo.TypeOf(expr.Fun))
326
+ if signature == nil {
327
+ return
328
+ }
329
+ position := sourcePos(pkg, expr.Pos())
330
+ o.recordTupleImports(model, semPkg, position.file, pkg.PkgPath, signature.Params(), make(map[types.Type]bool))
331
+ o.recordTupleImports(model, semPkg, position.file, pkg.PkgPath, signature.Results(), make(map[types.Type]bool))
332
+ }
333
+
334
+ func (o *SemanticModelOwner) recordAsyncCompatibleFunctionAssignments(
335
+ model *SemanticModel,
336
+ pkg *packages.Package,
337
+ lhs []ast.Expr,
338
+ rhs []ast.Expr,
339
+ ) {
340
+ for idx, target := range lhs {
341
+ if idx >= len(rhs) {
342
+ return
343
+ }
344
+ obj := objectForAddress(pkg, target)
345
+ if obj == nil || signatureForType(obj.Type()) == nil {
346
+ continue
347
+ }
348
+ if !exprMayNeedAwait(model, pkg, rhs[idx]) {
349
+ continue
350
+ }
351
+ if value := model.values[obj]; value != nil {
352
+ value.asyncCompatibleFunction = true
353
+ }
354
+ }
355
+ }
356
+
357
+ func signatureForType(typ types.Type) *types.Signature {
358
+ if typ == nil {
359
+ return nil
360
+ }
361
+ if signature, ok := typ.(*types.Signature); ok {
362
+ return signature
363
+ }
364
+ signature, _ := types.Unalias(typ).Underlying().(*types.Signature)
365
+ return signature
366
+ }
367
+
243
368
  func (o *SemanticModelOwner) recordPointerReceiverUse(
244
369
  model *SemanticModel,
245
370
  pkg *packages.Package,
@@ -368,6 +493,12 @@ func (o *SemanticModelOwner) addFunction(
368
493
  if existing := model.functions[fn]; existing != nil {
369
494
  return existing
370
495
  }
496
+ if origin := fn.Origin(); origin != nil {
497
+ if existing := model.functions[origin]; existing != nil {
498
+ model.functions[fn] = existing
499
+ return existing
500
+ }
501
+ }
371
502
  signature, _ := fn.Type().(*types.Signature)
372
503
  semFn := &semanticFunction{
373
504
  name: fn.Name(),
@@ -384,6 +515,14 @@ func (o *SemanticModelOwner) addFunction(
384
515
  semFn.receiver = receiverNamedType(recv)
385
516
  }
386
517
  model.functions[fn] = semFn
518
+ if origin := fn.Origin(); origin != nil {
519
+ model.functions[origin] = semFn
520
+ }
521
+ if fullName := fn.FullName(); fullName != "" {
522
+ if existing := model.functionsByFullName[fullName]; existing == nil {
523
+ model.functionsByFullName[fullName] = semFn
524
+ }
525
+ }
387
526
  semPkg.functions = append(semPkg.functions, semFn)
388
527
  return semFn
389
528
  }
@@ -461,6 +600,7 @@ func (o *SemanticModelOwner) collectFunctionFacts(
461
600
  model *SemanticModel,
462
601
  pkg *packages.Package,
463
602
  file *ast.File,
603
+ overrideFacts *OverrideFacts,
464
604
  ) []Diagnostic {
465
605
  var diagnostics []Diagnostic
466
606
  for _, decl := range file.Decls {
@@ -487,19 +627,21 @@ func (o *SemanticModelOwner) collectFunctionFacts(
487
627
  }
488
628
  case *ast.CallExpr:
489
629
  if called := calledFunction(pkg, typed.Fun); called != nil {
490
- semFn.calls[called] = true
630
+ semFn.calls[called.Origin()] = true
491
631
  }
492
- async, err := o.isOverrideAsyncCall(pkg, typed.Fun)
493
- if err != nil {
494
- diagnostics = append(diagnostics, Diagnostic{
495
- Severity: DiagnosticSeverityError,
496
- Code: "goscript/overrides:metadata",
497
- Message: "failed to read override metadata",
498
- Detail: err.Error(),
499
- })
500
- return false
632
+ if fun, ok := ast.Unparen(typed.Fun).(*ast.FuncLit); ok && funcLitUsesFunctionIdentifierCall(pkg, fun) {
633
+ markFunctionAsync(semFn, "async-function-literal-call")
634
+ }
635
+ if callUsesFunctionValue(pkg, typed.Fun) {
636
+ markFunctionAsync(semFn, "function-value-call")
501
637
  }
502
- if async {
638
+ if callUsesFunctionIdentifier(pkg, typed.Fun) {
639
+ markFunctionAsync(semFn, "function-identifier-call")
640
+ }
641
+ if overrideFacts.IsMethodAsync(overrideCallPackage(pkg, typed.Fun), overrideCallMethod(pkg, typed.Fun)) {
642
+ markFunctionAsync(semFn, "override")
643
+ }
644
+ if overrideFacts.IsFunctionAsync(overrideFunctionCallPackage(pkg, typed.Fun), overrideFunctionCallName(pkg, typed.Fun)) {
503
645
  markFunctionAsync(semFn, "override")
504
646
  }
505
647
  }
@@ -509,28 +651,187 @@ func (o *SemanticModelOwner) collectFunctionFacts(
509
651
  return diagnostics
510
652
  }
511
653
 
512
- func (o *SemanticModelOwner) isOverrideAsyncCall(pkg *packages.Package, expr ast.Expr) (bool, error) {
654
+ func (o *SemanticModelOwner) propagateAsyncFunctionArguments(
655
+ ctx context.Context,
656
+ model *SemanticModel,
657
+ ) []Diagnostic {
658
+ changed := true
659
+ for changed {
660
+ if err := ctx.Err(); err != nil {
661
+ return []Diagnostic{contextCanceledDiagnostic(err)}
662
+ }
663
+ changed = false
664
+ for _, semPkg := range model.packages {
665
+ if err := ctx.Err(); err != nil {
666
+ return []Diagnostic{contextCanceledDiagnostic(err)}
667
+ }
668
+ pkg := semPkg.source
669
+ if pkg == nil {
670
+ continue
671
+ }
672
+ for _, file := range pkg.Syntax {
673
+ if err := ctx.Err(); err != nil {
674
+ return []Diagnostic{contextCanceledDiagnostic(err)}
675
+ }
676
+ var inspectErr error
677
+ ast.Inspect(file, func(node ast.Node) bool {
678
+ if inspectErr = ctx.Err(); inspectErr != nil {
679
+ return false
680
+ }
681
+ switch typed := node.(type) {
682
+ case *ast.CallExpr:
683
+ called := calledFunction(pkg, typed.Fun)
684
+ semFn := semanticFunctionFor(model, called)
685
+ if semFn == nil || !semFn.hasBody {
686
+ return true
687
+ }
688
+ signature, _ := called.Type().(*types.Signature)
689
+ if callPassesAsyncFunctionArgument(model, pkg, signature, typed.Args) {
690
+ if markFunctionAsync(semFn, "async-function-argument") {
691
+ changed = true
692
+ }
693
+ }
694
+ }
695
+ return true
696
+ })
697
+ if inspectErr != nil {
698
+ return []Diagnostic{contextCanceledDiagnostic(inspectErr)}
699
+ }
700
+ }
701
+ }
702
+ if changed {
703
+ if diagnostics := o.propagateFunctionAsync(ctx, model); diagnosticsHaveErrors(diagnostics) {
704
+ return diagnostics
705
+ }
706
+ }
707
+ }
708
+ return nil
709
+ }
710
+
711
+ func overrideCallPackage(pkg *packages.Package, expr ast.Expr) string {
513
712
  selector, ok := expr.(*ast.SelectorExpr)
514
713
  if !ok {
515
- return false, nil
714
+ return ""
516
715
  }
517
716
  selection := pkg.TypesInfo.Selections[selector]
518
717
  if selection == nil {
519
- return false, nil
718
+ return ""
520
719
  }
521
720
  method, _ := selection.Obj().(*types.Func)
522
721
  if method == nil {
523
- return false, nil
722
+ return ""
524
723
  }
525
- named := receiverNamedType(selection.Recv())
724
+ named := selectedReceiverNamedType(pkg, selector, selection)
526
725
  if named == nil || named.Obj() == nil || named.Obj().Pkg() == nil {
527
- return false, nil
726
+ return ""
727
+ }
728
+ return named.Obj().Pkg().Path()
729
+ }
730
+
731
+ func overrideCallMethod(pkg *packages.Package, expr ast.Expr) string {
732
+ selector, ok := expr.(*ast.SelectorExpr)
733
+ if !ok {
734
+ return ""
735
+ }
736
+ selection := pkg.TypesInfo.Selections[selector]
737
+ if selection == nil {
738
+ return ""
739
+ }
740
+ method, _ := selection.Obj().(*types.Func)
741
+ if method == nil {
742
+ return ""
743
+ }
744
+ named := selectedReceiverNamedType(pkg, selector, selection)
745
+ if named == nil || named.Obj() == nil {
746
+ return ""
747
+ }
748
+ return named.Obj().Name() + "." + method.Name()
749
+ }
750
+
751
+ func selectedReceiverNamedType(pkg *packages.Package, selector *ast.SelectorExpr, selection *types.Selection) *types.Named {
752
+ if named := promotedReceiverNamedType(selection); named != nil {
753
+ return named
754
+ }
755
+ if named := receiverNamedType(selection.Recv()); named != nil {
756
+ return named
757
+ }
758
+ if pkg == nil || selector == nil {
759
+ return nil
760
+ }
761
+ return receiverNamedType(pkg.TypesInfo.TypeOf(selector.X))
762
+ }
763
+
764
+ func promotedReceiverNamedType(selection *types.Selection) *types.Named {
765
+ index := selection.Index()
766
+ if len(index) <= 1 {
767
+ return nil
768
+ }
769
+ typ := selection.Recv()
770
+ for _, idx := range index[:len(index)-1] {
771
+ for {
772
+ if pointer, ok := types.Unalias(typ).(*types.Pointer); ok {
773
+ typ = pointer.Elem()
774
+ continue
775
+ }
776
+ break
777
+ }
778
+ switch underlying := types.Unalias(typ).Underlying().(type) {
779
+ case *types.Struct:
780
+ if idx < 0 || idx >= underlying.NumFields() {
781
+ return nil
782
+ }
783
+ typ = underlying.Field(idx).Type()
784
+ default:
785
+ return receiverNamedType(typ)
786
+ }
787
+ }
788
+ return receiverNamedType(typ)
789
+ }
790
+
791
+ func overrideFunctionCallPackage(pkg *packages.Package, expr ast.Expr) string {
792
+ fn := calledFunction(pkg, expr)
793
+ if fn == nil || fn.Pkg() == nil {
794
+ return ""
795
+ }
796
+ return fn.Pkg().Path()
797
+ }
798
+
799
+ func overrideFunctionCallName(pkg *packages.Package, expr ast.Expr) string {
800
+ fn := calledFunction(pkg, expr)
801
+ if fn == nil {
802
+ return ""
803
+ }
804
+ return fn.Name()
805
+ }
806
+
807
+ func semanticFunctionFor(model *SemanticModel, fn *types.Func) *semanticFunction {
808
+ if model == nil || fn == nil {
809
+ return nil
528
810
  }
529
- methodKey := named.Obj().Name() + "." + method.Name()
530
- return o.overrideOwner.IsMethodAsync(named.Obj().Pkg().Path(), methodKey)
811
+ if semFn := model.functions[fn]; semFn != nil {
812
+ return semFn
813
+ }
814
+ if semFn := model.functions[fn.Origin()]; semFn != nil {
815
+ return semFn
816
+ }
817
+ if semFn := model.functionsByFullName[fn.FullName()]; semFn != nil {
818
+ return semFn
819
+ }
820
+ return nil
531
821
  }
532
822
 
533
823
  func calledFunction(pkg *packages.Package, expr ast.Expr) *types.Func {
824
+ for {
825
+ switch typed := expr.(type) {
826
+ case *ast.IndexExpr:
827
+ expr = typed.X
828
+ case *ast.IndexListExpr:
829
+ expr = typed.X
830
+ default:
831
+ goto unwrapped
832
+ }
833
+ }
834
+ unwrapped:
534
835
  switch typed := expr.(type) {
535
836
  case *ast.Ident:
536
837
  fn, _ := pkg.TypesInfo.Uses[typed].(*types.Func)
@@ -546,6 +847,150 @@ func calledFunction(pkg *packages.Package, expr ast.Expr) *types.Func {
546
847
  return nil
547
848
  }
548
849
 
850
+ func callUsesFunctionValue(pkg *packages.Package, expr ast.Expr) bool {
851
+ if signatureForType(pkg.TypesInfo.TypeOf(expr)) == nil {
852
+ return false
853
+ }
854
+ switch typed := expr.(type) {
855
+ case *ast.CallExpr:
856
+ return true
857
+ case *ast.SelectorExpr:
858
+ selection := pkg.TypesInfo.Selections[typed]
859
+ if selection == nil || selection.Kind() != types.FieldVal {
860
+ return false
861
+ }
862
+ return signatureForType(selection.Type()) != nil
863
+ case *ast.IndexExpr:
864
+ if signatureForType(pkg.TypesInfo.TypeOf(typed.X)) != nil {
865
+ return false
866
+ }
867
+ return true
868
+ case *ast.IndexListExpr:
869
+ if signatureForType(pkg.TypesInfo.TypeOf(typed.X)) != nil {
870
+ return false
871
+ }
872
+ return true
873
+ default:
874
+ return false
875
+ }
876
+ }
877
+
878
+ func callUsesFunctionIdentifier(pkg *packages.Package, expr ast.Expr) bool {
879
+ if signatureForType(pkg.TypesInfo.TypeOf(expr)) == nil {
880
+ return false
881
+ }
882
+ ident, ok := expr.(*ast.Ident)
883
+ if !ok {
884
+ return false
885
+ }
886
+ obj := pkg.TypesInfo.Uses[ident]
887
+ if obj == nil {
888
+ obj = pkg.TypesInfo.Defs[ident]
889
+ }
890
+ _, ok = obj.(*types.Var)
891
+ return ok
892
+ }
893
+
894
+ func funcLitUsesFunctionIdentifierCall(pkg *packages.Package, lit *ast.FuncLit) bool {
895
+ if pkg == nil || lit == nil || lit.Body == nil {
896
+ return false
897
+ }
898
+ signature, _ := pkg.TypesInfo.TypeOf(lit).(*types.Signature)
899
+ if signature == nil || signature.Results() == nil || signature.Results().Len() == 0 {
900
+ return false
901
+ }
902
+ uses := false
903
+ ast.Inspect(lit.Body, func(node ast.Node) bool {
904
+ if uses {
905
+ return false
906
+ }
907
+ if nested, ok := node.(*ast.FuncLit); ok && nested != lit {
908
+ return false
909
+ }
910
+ call, ok := node.(*ast.CallExpr)
911
+ if !ok {
912
+ return true
913
+ }
914
+ uses = callUsesFunctionIdentifier(pkg, call.Fun)
915
+ return !uses
916
+ })
917
+ return uses
918
+ }
919
+
920
+ func callPassesAsyncFunctionArgument(
921
+ model *SemanticModel,
922
+ pkg *packages.Package,
923
+ signature *types.Signature,
924
+ args []ast.Expr,
925
+ ) bool {
926
+ if signature == nil || signature.Params() == nil {
927
+ return false
928
+ }
929
+ for idx, arg := range args {
930
+ paramIdx := idx
931
+ if signature.Variadic() && idx >= signature.Params().Len()-1 {
932
+ paramIdx = signature.Params().Len() - 1
933
+ }
934
+ if paramIdx < 0 || paramIdx >= signature.Params().Len() {
935
+ continue
936
+ }
937
+ if signatureForType(signature.Params().At(paramIdx).Type()) == nil {
938
+ continue
939
+ }
940
+ if exprMayNeedAwait(model, pkg, arg) {
941
+ return true
942
+ }
943
+ }
944
+ return false
945
+ }
946
+
947
+ func exprMayNeedAwait(model *SemanticModel, pkg *packages.Package, expr ast.Expr) bool {
948
+ if called := calledFunction(pkg, expr); called != nil {
949
+ semFn := semanticFunctionFor(model, called)
950
+ return semFn != nil && semFn.async
951
+ }
952
+ lit, ok := expr.(*ast.FuncLit)
953
+ if !ok {
954
+ return false
955
+ }
956
+ needsAwait := false
957
+ ast.Inspect(lit.Body, func(node ast.Node) bool {
958
+ if needsAwait {
959
+ return false
960
+ }
961
+ switch typed := node.(type) {
962
+ case *ast.FuncLit:
963
+ return false
964
+ case *ast.SendStmt, *ast.SelectStmt:
965
+ needsAwait = true
966
+ return false
967
+ case *ast.UnaryExpr:
968
+ if typed.Op == token.ARROW {
969
+ needsAwait = true
970
+ return false
971
+ }
972
+ case *ast.CallExpr:
973
+ if callUsesFunctionValue(pkg, typed.Fun) {
974
+ needsAwait = true
975
+ return false
976
+ }
977
+ if callUsesFunctionIdentifier(pkg, typed.Fun) {
978
+ needsAwait = true
979
+ return false
980
+ }
981
+ if called := calledFunction(pkg, typed.Fun); called != nil {
982
+ semFn := semanticFunctionFor(model, called)
983
+ if semFn != nil && semFn.async {
984
+ needsAwait = true
985
+ return false
986
+ }
987
+ }
988
+ }
989
+ return true
990
+ })
991
+ return needsAwait
992
+ }
993
+
549
994
  func receiverNamedType(typ types.Type) *types.Named {
550
995
  for {
551
996
  pointer, ok := typ.(*types.Pointer)
@@ -554,17 +999,23 @@ func receiverNamedType(typ types.Type) *types.Named {
554
999
  }
555
1000
  typ = pointer.Elem()
556
1001
  }
557
- named, _ := typ.(*types.Named)
1002
+ named, _ := types.Unalias(typ).(*types.Named)
558
1003
  return named
559
1004
  }
560
1005
 
561
- func (o *SemanticModelOwner) propagateFunctionAsync(model *SemanticModel) {
1006
+ func (o *SemanticModelOwner) propagateFunctionAsync(ctx context.Context, model *SemanticModel) []Diagnostic {
562
1007
  changed := true
563
1008
  for changed {
1009
+ if err := ctx.Err(); err != nil {
1010
+ return []Diagnostic{contextCanceledDiagnostic(err)}
1011
+ }
564
1012
  changed = false
565
1013
  for _, semFn := range model.functions {
1014
+ if err := ctx.Err(); err != nil {
1015
+ return []Diagnostic{contextCanceledDiagnostic(err)}
1016
+ }
566
1017
  for called := range semFn.calls {
567
- calledFn := model.functions[called]
1018
+ calledFn := semanticFunctionFor(model, called)
568
1019
  if calledFn != nil && calledFn.async {
569
1020
  if markFunctionAsync(semFn, "call:"+called.FullName()) {
570
1021
  changed = true
@@ -573,6 +1024,7 @@ func (o *SemanticModelOwner) propagateFunctionAsync(model *SemanticModel) {
573
1024
  }
574
1025
  }
575
1026
  }
1027
+ return nil
576
1028
  }
577
1029
 
578
1030
  func markFunctionAsync(fn *semanticFunction, reason string) bool {
@@ -588,10 +1040,16 @@ func markFunctionAsync(fn *semanticFunction, reason string) bool {
588
1040
  return true
589
1041
  }
590
1042
 
591
- func (o *SemanticModelOwner) resolveInterfaceImplementations(model *SemanticModel) {
1043
+ func (o *SemanticModelOwner) resolveInterfaceImplementations(
1044
+ ctx context.Context,
1045
+ model *SemanticModel,
1046
+ ) []Diagnostic {
592
1047
  var interfaces []*types.Named
593
1048
  var concretes []*types.Named
594
1049
  for named, semType := range model.types {
1050
+ if err := ctx.Err(); err != nil {
1051
+ return []Diagnostic{contextCanceledDiagnostic(err)}
1052
+ }
595
1053
  if semType.isInterface {
596
1054
  interfaces = append(interfaces, named)
597
1055
  continue
@@ -602,16 +1060,31 @@ func (o *SemanticModelOwner) resolveInterfaceImplementations(model *SemanticMode
602
1060
  sortNamedTypes(concretes)
603
1061
 
604
1062
  for _, ifaceNamed := range interfaces {
1063
+ if err := ctx.Err(); err != nil {
1064
+ return []Diagnostic{contextCanceledDiagnostic(err)}
1065
+ }
605
1066
  iface, _ := ifaceNamed.Underlying().(*types.Interface)
606
1067
  if iface == nil {
607
1068
  continue
608
1069
  }
609
1070
  iface.Complete()
610
1071
  for _, concrete := range concretes {
1072
+ if err := ctx.Err(); err != nil {
1073
+ return []Diagnostic{contextCanceledDiagnostic(err)}
1074
+ }
611
1075
  o.addInterfaceImplementation(model, concrete, ifaceNamed, iface, false)
612
1076
  o.addInterfaceImplementation(model, concrete, ifaceNamed, iface, true)
613
1077
  }
614
1078
  }
1079
+ return nil
1080
+ }
1081
+
1082
+ func contextCanceledDiagnostic(err error) Diagnostic {
1083
+ return Diagnostic{
1084
+ Severity: DiagnosticSeverityError,
1085
+ Code: "goscript/context:canceled",
1086
+ Message: err.Error(),
1087
+ }
615
1088
  }
616
1089
 
617
1090
  func (o *SemanticModelOwner) addInterfaceImplementation(
@@ -774,6 +1247,18 @@ func isInterfaceType(typ types.Type) bool {
774
1247
  return ok
775
1248
  }
776
1249
 
1250
+ func isNonEmptyInterfaceType(typ types.Type) bool {
1251
+ if typ == nil {
1252
+ return false
1253
+ }
1254
+ iface, ok := types.Unalias(typ).Underlying().(*types.Interface)
1255
+ if !ok {
1256
+ return false
1257
+ }
1258
+ iface.Complete()
1259
+ return iface.NumMethods() != 0
1260
+ }
1261
+
777
1262
  func isNilableType(typ types.Type) bool {
778
1263
  if typ == nil {
779
1264
  return false
@@ -812,6 +1297,19 @@ func (o *SemanticModelOwner) recordTypeImports(
812
1297
  }
813
1298
  seen[typ] = true
814
1299
 
1300
+ if alias, ok := typ.(*types.Alias); ok {
1301
+ if obj := alias.Obj(); obj != nil && obj.Pkg() != nil && obj.Pkg().Path() != currentPkg {
1302
+ addGeneratedImport(model, semPkg, file, obj.Pkg().Path())
1303
+ }
1304
+ if args := alias.TypeArgs(); args != nil {
1305
+ for t := range args.Types() {
1306
+ o.recordTypeImports(model, semPkg, file, currentPkg, t, seen)
1307
+ }
1308
+ }
1309
+ o.recordTypeImports(model, semPkg, file, currentPkg, alias.Rhs(), seen)
1310
+ return
1311
+ }
1312
+
815
1313
  switch typed := types.Unalias(typ).(type) {
816
1314
  case *types.Named:
817
1315
  if obj := typed.Obj(); obj != nil && obj.Pkg() != nil && obj.Pkg().Path() != currentPkg {
@@ -822,7 +1320,9 @@ func (o *SemanticModelOwner) recordTypeImports(
822
1320
  o.recordTypeImports(model, semPkg, file, currentPkg, t, seen)
823
1321
  }
824
1322
  }
825
- o.recordTypeImports(model, semPkg, file, currentPkg, typed.Underlying(), seen)
1323
+ if obj := typed.Obj(); obj != nil && obj.Pkg() != nil && obj.Pkg().Path() == currentPkg {
1324
+ o.recordTypeImports(model, semPkg, file, currentPkg, typed.Underlying(), seen)
1325
+ }
826
1326
  case *types.Pointer:
827
1327
  o.recordTypeImports(model, semPkg, file, currentPkg, typed.Elem(), seen)
828
1328
  case *types.Slice: