goscript 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (330) 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} +35 -8
  5. package/cmd/goscript/cmd-test.go +14 -0
  6. package/cmd/goscript/cmd-test_test.go +1 -1
  7. package/cmd/goscript/cmd_compile_test.go +105 -6
  8. package/compiler/build-flags.go +9 -10
  9. package/compiler/compile-request.go +12 -9
  10. package/compiler/compliance_test.go +0 -1
  11. package/compiler/config.go +2 -0
  12. package/compiler/gotest/request.go +28 -0
  13. package/compiler/gotest/runner.go +353 -27
  14. package/compiler/gotest/runner_test.go +400 -1
  15. package/compiler/gotest/testdata/browserapi/browserapi_test.go +20 -0
  16. package/compiler/gotest/testdata/browserapi/go.mod +3 -0
  17. package/compiler/lowered-program.go +24 -17
  18. package/compiler/lowering.go +988 -263
  19. package/compiler/lowering_bench_test.go +364 -0
  20. package/compiler/override-facts.go +15 -0
  21. package/compiler/override-parity-verifier.go +450 -0
  22. package/compiler/override-parity.go +122 -0
  23. package/compiler/override-registry_test.go +559 -0
  24. package/compiler/package-graph.go +61 -4
  25. package/compiler/package-graph_test.go +30 -0
  26. package/compiler/protobuf-ts-binding.go +514 -0
  27. package/compiler/protobuf-ts-binding_test.go +172 -0
  28. package/compiler/semantic-model-types.go +17 -4
  29. package/compiler/semantic-model.go +709 -72
  30. package/compiler/semantic-model_test.go +219 -0
  31. package/compiler/service.go +20 -1
  32. package/compiler/skeleton_test.go +1008 -20
  33. package/compiler/typescript-emitter.go +147 -15
  34. package/dist/gs/builtin/builtin.d.ts +2 -2
  35. package/dist/gs/builtin/builtin.js +20 -0
  36. package/dist/gs/builtin/builtin.js.map +1 -1
  37. package/dist/gs/builtin/slice.d.ts +2 -1
  38. package/dist/gs/builtin/slice.js +34 -4
  39. package/dist/gs/builtin/slice.js.map +1 -1
  40. package/dist/gs/builtin/type.d.ts +14 -6
  41. package/dist/gs/builtin/type.js +224 -64
  42. package/dist/gs/builtin/type.js.map +1 -1
  43. package/dist/gs/builtin/varRef.d.ts +11 -0
  44. package/dist/gs/builtin/varRef.js +57 -2
  45. package/dist/gs/builtin/varRef.js.map +1 -1
  46. package/dist/gs/bytes/buffer.gs.js +1 -1
  47. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  48. package/dist/gs/bytes/reader.gs.js +1 -1
  49. package/dist/gs/bytes/reader.gs.js.map +1 -1
  50. package/dist/gs/compress/zlib/index.d.ts +13 -6
  51. package/dist/gs/compress/zlib/index.js +131 -35
  52. package/dist/gs/compress/zlib/index.js.map +1 -1
  53. package/dist/gs/crypto/sha1/index.js +2 -5
  54. package/dist/gs/crypto/sha1/index.js.map +1 -1
  55. package/dist/gs/crypto/sha256/index.js +2 -5
  56. package/dist/gs/crypto/sha256/index.js.map +1 -1
  57. package/dist/gs/crypto/sha512/index.js +2 -5
  58. package/dist/gs/crypto/sha512/index.js.map +1 -1
  59. package/dist/gs/embed/index.d.ts +6 -0
  60. package/dist/gs/embed/index.js +210 -5
  61. package/dist/gs/embed/index.js.map +1 -1
  62. package/dist/gs/encoding/json/index.d.ts +114 -0
  63. package/dist/gs/encoding/json/index.js +544 -36
  64. package/dist/gs/encoding/json/index.js.map +1 -1
  65. package/dist/gs/fmt/fmt.d.ts +3 -3
  66. package/dist/gs/fmt/fmt.js +29 -16
  67. package/dist/gs/fmt/fmt.js.map +1 -1
  68. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +100 -0
  69. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +564 -0
  70. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  71. package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.d.ts +45 -0
  72. package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.js +229 -0
  73. package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.js.map +1 -0
  74. package/dist/gs/github.com/pkg/errors/errors.js +54 -30
  75. package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
  76. package/dist/gs/go/scanner/index.d.ts +2 -0
  77. package/dist/gs/go/scanner/index.js +29 -5
  78. package/dist/gs/go/scanner/index.js.map +1 -1
  79. package/dist/gs/go/token/index.js +22 -6
  80. package/dist/gs/go/token/index.js.map +1 -1
  81. package/dist/gs/hash/index.d.ts +6 -0
  82. package/dist/gs/hash/index.js +20 -0
  83. package/dist/gs/hash/index.js.map +1 -1
  84. package/dist/gs/internal/goarch/index.d.ts +43 -3
  85. package/dist/gs/internal/goarch/index.js +42 -10
  86. package/dist/gs/internal/goarch/index.js.map +1 -1
  87. package/dist/gs/io/fs/fs.js +26 -14
  88. package/dist/gs/io/fs/fs.js.map +1 -1
  89. package/dist/gs/io/fs/readdir.js +8 -4
  90. package/dist/gs/io/fs/readdir.js.map +1 -1
  91. package/dist/gs/io/fs/sub.js +8 -1
  92. package/dist/gs/io/fs/sub.js.map +1 -1
  93. package/dist/gs/io/io.d.ts +12 -6
  94. package/dist/gs/io/io.js +87 -42
  95. package/dist/gs/io/io.js.map +1 -1
  96. package/dist/gs/math/bits/index.d.ts +31 -5
  97. package/dist/gs/math/bits/index.js +29 -28
  98. package/dist/gs/math/bits/index.js.map +1 -1
  99. package/dist/gs/mime/index.d.ts +16 -0
  100. package/dist/gs/mime/index.js +315 -6
  101. package/dist/gs/mime/index.js.map +1 -1
  102. package/dist/gs/net/http/httptest/index.d.ts +12 -0
  103. package/dist/gs/net/http/httptest/index.js +85 -6
  104. package/dist/gs/net/http/httptest/index.js.map +1 -1
  105. package/dist/gs/net/http/index.d.ts +303 -6
  106. package/dist/gs/net/http/index.js +1615 -58
  107. package/dist/gs/net/http/index.js.map +1 -1
  108. package/dist/gs/os/dir_unix.gs.js +1 -1
  109. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  110. package/dist/gs/os/error.gs.js +1 -1
  111. package/dist/gs/os/error.gs.js.map +1 -1
  112. package/dist/gs/os/exec.gs.d.ts +1 -0
  113. package/dist/gs/os/exec.gs.js +4 -8
  114. package/dist/gs/os/exec.gs.js.map +1 -1
  115. package/dist/gs/os/exec_posix.gs.js +1 -1
  116. package/dist/gs/os/exec_posix.gs.js.map +1 -1
  117. package/dist/gs/os/index.d.ts +1 -1
  118. package/dist/gs/os/index.js +1 -1
  119. package/dist/gs/os/index.js.map +1 -1
  120. package/dist/gs/os/proc.gs.d.ts +4 -0
  121. package/dist/gs/os/proc.gs.js +12 -6
  122. package/dist/gs/os/proc.gs.js.map +1 -1
  123. package/dist/gs/os/root_js.gs.js +1 -1
  124. package/dist/gs/os/root_js.gs.js.map +1 -1
  125. package/dist/gs/os/types.gs.js +1 -1
  126. package/dist/gs/os/types.gs.js.map +1 -1
  127. package/dist/gs/os/types_js.gs.d.ts +6 -2
  128. package/dist/gs/os/types_js.gs.js +170 -9
  129. package/dist/gs/os/types_js.gs.js.map +1 -1
  130. package/dist/gs/os/types_unix.gs.js +1 -1
  131. package/dist/gs/os/types_unix.gs.js.map +1 -1
  132. package/dist/gs/path/path.js +11 -7
  133. package/dist/gs/path/path.js.map +1 -1
  134. package/dist/gs/reflect/index.d.ts +5 -4
  135. package/dist/gs/reflect/index.js +4 -3
  136. package/dist/gs/reflect/index.js.map +1 -1
  137. package/dist/gs/reflect/map.js +15 -0
  138. package/dist/gs/reflect/map.js.map +1 -1
  139. package/dist/gs/reflect/type.d.ts +26 -6
  140. package/dist/gs/reflect/type.js +1498 -279
  141. package/dist/gs/reflect/type.js.map +1 -1
  142. package/dist/gs/reflect/types.d.ts +14 -6
  143. package/dist/gs/reflect/types.js +35 -1
  144. package/dist/gs/reflect/types.js.map +1 -1
  145. package/dist/gs/reflect/value.d.ts +1 -0
  146. package/dist/gs/reflect/value.js +83 -41
  147. package/dist/gs/reflect/value.js.map +1 -1
  148. package/dist/gs/reflect/visiblefields.js +4 -140
  149. package/dist/gs/reflect/visiblefields.js.map +1 -1
  150. package/dist/gs/runtime/pprof/index.d.ts +8 -2
  151. package/dist/gs/runtime/pprof/index.js +50 -30
  152. package/dist/gs/runtime/pprof/index.js.map +1 -1
  153. package/dist/gs/runtime/runtime.js +5 -4
  154. package/dist/gs/runtime/runtime.js.map +1 -1
  155. package/dist/gs/runtime/trace/index.js +5 -19
  156. package/dist/gs/runtime/trace/index.js.map +1 -1
  157. package/dist/gs/strconv/atoi.gs.js +1 -1
  158. package/dist/gs/strconv/atoi.gs.js.map +1 -1
  159. package/dist/gs/strconv/complex.gs.d.ts +3 -0
  160. package/dist/gs/strconv/complex.gs.js +148 -0
  161. package/dist/gs/strconv/complex.gs.js.map +1 -0
  162. package/dist/gs/strconv/index.d.ts +1 -0
  163. package/dist/gs/strconv/index.js +1 -0
  164. package/dist/gs/strconv/index.js.map +1 -1
  165. package/dist/gs/strings/builder.js +1 -1
  166. package/dist/gs/strings/reader.d.ts +1 -1
  167. package/dist/gs/strings/reader.js +11 -7
  168. package/dist/gs/strings/reader.js.map +1 -1
  169. package/dist/gs/strings/replace.js +15 -7
  170. package/dist/gs/strings/replace.js.map +1 -1
  171. package/dist/gs/strings/strings.d.ts +5 -0
  172. package/dist/gs/strings/strings.js +57 -5
  173. package/dist/gs/strings/strings.js.map +1 -1
  174. package/dist/gs/sync/atomic/type.gs.js +9 -9
  175. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  176. package/dist/gs/sync/atomic/value.gs.js +2 -2
  177. package/dist/gs/sync/atomic/value.gs.js.map +1 -1
  178. package/dist/gs/sync/sync.d.ts +2 -1
  179. package/dist/gs/sync/sync.js +37 -16
  180. package/dist/gs/sync/sync.js.map +1 -1
  181. package/dist/gs/syscall/env.js +22 -14
  182. package/dist/gs/syscall/env.js.map +1 -1
  183. package/dist/gs/syscall/js/index.js +9 -0
  184. package/dist/gs/syscall/js/index.js.map +1 -1
  185. package/dist/gs/testing/testing.js +59 -15
  186. package/dist/gs/testing/testing.js.map +1 -1
  187. package/dist/gs/time/time.d.ts +24 -1
  188. package/dist/gs/time/time.js +43 -3
  189. package/dist/gs/time/time.js.map +1 -1
  190. package/dist/gs/unique/index.js +7 -1
  191. package/dist/gs/unique/index.js.map +1 -1
  192. package/go.mod +3 -3
  193. package/go.sum +16 -0
  194. package/gs/builtin/builtin.ts +25 -2
  195. package/gs/builtin/runtime-contract.test.ts +260 -18
  196. package/gs/builtin/slice.ts +51 -4
  197. package/gs/builtin/type.ts +310 -63
  198. package/gs/builtin/varRef.ts +85 -2
  199. package/gs/bytes/buffer.gs.ts +1 -1
  200. package/gs/bytes/reader.gs.ts +1 -1
  201. package/gs/compress/zlib/index.test.ts +159 -1
  202. package/gs/compress/zlib/index.ts +164 -37
  203. package/gs/compress/zlib/meta.json +4 -1
  204. package/gs/compress/zlib/parity.json +51 -0
  205. package/gs/crypto/sha1/index.test.ts +19 -2
  206. package/gs/crypto/sha1/index.ts +3 -6
  207. package/gs/crypto/sha256/index.test.ts +14 -2
  208. package/gs/crypto/sha256/index.ts +3 -6
  209. package/gs/crypto/sha512/index.test.ts +17 -2
  210. package/gs/crypto/sha512/index.ts +3 -6
  211. package/gs/embed/index.test.ts +87 -0
  212. package/gs/embed/index.ts +229 -5
  213. package/gs/encoding/json/index.test.ts +360 -6
  214. package/gs/encoding/json/index.ts +679 -38
  215. package/gs/encoding/json/parity.json +81 -0
  216. package/gs/fmt/fmt.test.ts +41 -3
  217. package/gs/fmt/fmt.ts +40 -17
  218. package/gs/fmt/meta.json +6 -1
  219. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +211 -3
  220. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +857 -1
  221. package/gs/github.com/go-git/go-billy/v6/osfs/index.test.ts +110 -0
  222. package/gs/github.com/go-git/go-billy/v6/osfs/index.ts +280 -0
  223. package/gs/github.com/go-git/go-billy/v6/osfs/meta.json +8 -0
  224. package/gs/github.com/pkg/errors/errors.ts +54 -30
  225. package/gs/go/scanner/index.test.ts +39 -56
  226. package/gs/go/scanner/index.ts +33 -5
  227. package/gs/go/scanner/parity.json +27 -0
  228. package/gs/go/token/index.ts +22 -6
  229. package/gs/hash/index.test.ts +20 -33
  230. package/gs/hash/index.ts +28 -0
  231. package/gs/hash/parity.json +21 -0
  232. package/gs/internal/goarch/index.test.ts +32 -0
  233. package/gs/internal/goarch/index.ts +45 -13
  234. package/gs/internal/goarch/parity.json +144 -0
  235. package/gs/io/fs/fs.ts +26 -14
  236. package/gs/io/fs/readdir.test.ts +38 -0
  237. package/gs/io/fs/readdir.ts +8 -4
  238. package/gs/io/fs/sub.ts +8 -1
  239. package/gs/io/io.test.ts +77 -6
  240. package/gs/io/io.ts +115 -52
  241. package/gs/io/meta.json +7 -1
  242. package/gs/io/parity.json +162 -0
  243. package/gs/math/bits/index.test.ts +14 -1
  244. package/gs/math/bits/index.ts +75 -32
  245. package/gs/math/bits/parity.json +156 -0
  246. package/gs/mime/index.test.ts +90 -0
  247. package/gs/mime/index.ts +369 -6
  248. package/gs/mime/parity.json +36 -0
  249. package/gs/net/http/httptest/index.test.ts +98 -2
  250. package/gs/net/http/httptest/index.ts +101 -6
  251. package/gs/net/http/httptest/parity.json +15 -0
  252. package/gs/net/http/index.test.ts +797 -12
  253. package/gs/net/http/index.ts +1874 -136
  254. package/gs/net/http/meta.json +16 -1
  255. package/gs/net/http/parity.json +193 -0
  256. package/gs/os/dir_unix.gs.ts +1 -1
  257. package/gs/os/error.gs.ts +1 -1
  258. package/gs/os/exec.gs.ts +4 -8
  259. package/gs/os/exec_posix.gs.ts +1 -1
  260. package/gs/os/file_unix_js.test.ts +52 -0
  261. package/gs/os/index.test.ts +9 -0
  262. package/gs/os/index.ts +1 -0
  263. package/gs/os/meta.json +4 -0
  264. package/gs/os/parity.json +9 -0
  265. package/gs/os/proc.gs.ts +18 -5
  266. package/gs/os/proc.test.ts +26 -0
  267. package/gs/os/readdir.test.ts +56 -0
  268. package/gs/os/root_js.gs.ts +1 -1
  269. package/gs/os/types.gs.ts +1 -1
  270. package/gs/os/types_js.gs.ts +170 -9
  271. package/gs/os/types_unix.gs.ts +1 -1
  272. package/gs/path/path.ts +11 -7
  273. package/gs/reflect/deepequal.test.ts +10 -1
  274. package/gs/reflect/field.test.ts +37 -15
  275. package/gs/reflect/function-types.test.ts +518 -22
  276. package/gs/reflect/index.ts +8 -6
  277. package/gs/reflect/map.ts +20 -0
  278. package/gs/reflect/meta.json +6 -4
  279. package/gs/reflect/parity.json +234 -0
  280. package/gs/reflect/sliceat.test.ts +156 -0
  281. package/gs/reflect/structof.test.ts +401 -0
  282. package/gs/reflect/type.ts +1980 -365
  283. package/gs/reflect/typefor.test.ts +540 -10
  284. package/gs/reflect/types.ts +43 -18
  285. package/gs/reflect/value.ts +105 -45
  286. package/gs/reflect/visiblefields.ts +5 -168
  287. package/gs/runtime/parity.json +24 -0
  288. package/gs/runtime/pprof/index.test.ts +29 -7
  289. package/gs/runtime/pprof/index.ts +56 -30
  290. package/gs/runtime/pprof/parity.json +27 -0
  291. package/gs/runtime/runtime.test.ts +3 -1
  292. package/gs/runtime/runtime.ts +4 -3
  293. package/gs/runtime/trace/index.test.ts +5 -3
  294. package/gs/runtime/trace/index.ts +8 -20
  295. package/gs/runtime/trace/parity.json +36 -0
  296. package/gs/strconv/atoi.gs.ts +1 -1
  297. package/gs/strconv/complex.gs.ts +174 -0
  298. package/gs/strconv/complex.test.ts +65 -0
  299. package/gs/strconv/index.ts +1 -0
  300. package/gs/strconv/parity.json +120 -0
  301. package/gs/strings/builder.ts +1 -1
  302. package/gs/strings/meta.json +5 -2
  303. package/gs/strings/parity.json +186 -0
  304. package/gs/strings/reader.test.ts +2 -2
  305. package/gs/strings/reader.ts +11 -7
  306. package/gs/strings/replace.ts +15 -7
  307. package/gs/strings/strings.test.ts +22 -2
  308. package/gs/strings/strings.ts +64 -6
  309. package/gs/sync/atomic/type.gs.ts +9 -9
  310. package/gs/sync/atomic/value.gs.ts +2 -2
  311. package/gs/sync/meta.json +1 -0
  312. package/gs/sync/sync.test.ts +41 -1
  313. package/gs/sync/sync.ts +41 -16
  314. package/gs/syscall/env.ts +29 -14
  315. package/gs/syscall/js/index.test.ts +18 -0
  316. package/gs/syscall/js/index.ts +12 -0
  317. package/gs/testing/testing.test.ts +99 -3
  318. package/gs/testing/testing.ts +95 -24
  319. package/gs/time/parity.json +225 -0
  320. package/gs/time/time.test.ts +20 -2
  321. package/gs/time/time.ts +49 -7
  322. package/gs/unique/index.ts +7 -1
  323. package/package.json +4 -2
  324. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +0 -217
  325. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +0 -814
  326. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +0 -1
  327. package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +0 -31
  328. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +0 -1233
  329. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +0 -46
  330. /package/compiler/{wasm_api.go → wasm-api.go} +0 -0
@@ -242,6 +242,87 @@ func TestSemanticModelRecordsInterfaceAssertionAndNilFacts(t *testing.T) {
242
242
  }
243
243
  }
244
244
 
245
+ func TestSemanticModelRejectsInterfaceMethodSignatureMismatch(t *testing.T) {
246
+ moduleDir := writePackageGraphFixture(t, map[string]string{
247
+ "go.mod": "module example.test/signaturemismatch\n\ngo 1.25.3\n",
248
+ "main.go": strings.Join([]string{
249
+ "package signaturemismatch",
250
+ "type Reader interface { Read() int }",
251
+ "type Impl struct{}",
252
+ "func (Impl) Read() string { return \"bad\" }",
253
+ "",
254
+ }, "\n"),
255
+ })
256
+ graph := loadPackageGraph(t, &CompileRequest{
257
+ Patterns: []string{"."},
258
+ Dir: moduleDir,
259
+ OutputPath: filepath.Join(t.TempDir(), "out"),
260
+ DependencyMode: DependencyModeRequested,
261
+ RuntimeEmissionMode: RuntimeEmissionModeEmit,
262
+ })
263
+ model := buildSemanticModel(t, graph)
264
+
265
+ if hasInterfaceImplementation(model, "Impl", "Reader", false) {
266
+ t.Fatalf("unexpected Impl -> Reader implementation: %#v", model.interfaceImplementations)
267
+ }
268
+ }
269
+
270
+ func TestSemanticModelAcceptsPromotedInterfaceMethods(t *testing.T) {
271
+ moduleDir := writePackageGraphFixture(t, map[string]string{
272
+ "go.mod": "module example.test/promoted\n\ngo 1.25.3\n",
273
+ "main.go": strings.Join([]string{
274
+ "package promoted",
275
+ "type Reader interface { Read() int }",
276
+ "type Base struct{}",
277
+ "func (Base) Read() int { return 1 }",
278
+ "type Impl struct { Base }",
279
+ "",
280
+ }, "\n"),
281
+ })
282
+ graph := loadPackageGraph(t, &CompileRequest{
283
+ Patterns: []string{"."},
284
+ Dir: moduleDir,
285
+ OutputPath: filepath.Join(t.TempDir(), "out"),
286
+ DependencyMode: DependencyModeRequested,
287
+ RuntimeEmissionMode: RuntimeEmissionModeEmit,
288
+ })
289
+ model := buildSemanticModel(t, graph)
290
+
291
+ if !hasInterfaceImplementation(model, "Impl", "Reader", false) {
292
+ t.Fatalf("missing promoted Impl -> Reader implementation: %#v", model.interfaceImplementations)
293
+ }
294
+ }
295
+
296
+ func TestSemanticModelKeepsUnexportedInterfaceMethodsPackageScoped(t *testing.T) {
297
+ moduleDir := writePackageGraphFixture(t, map[string]string{
298
+ "go.mod": "module example.test/unexportediface\n\ngo 1.25.3\n",
299
+ "dep/dep.go": strings.Join([]string{
300
+ "package dep",
301
+ "type private interface { read() int }",
302
+ "",
303
+ }, "\n"),
304
+ "main.go": strings.Join([]string{
305
+ "package unexportediface",
306
+ "import _ \"example.test/unexportediface/dep\"",
307
+ "type Impl struct{}",
308
+ "func (Impl) read() int { return 1 }",
309
+ "",
310
+ }, "\n"),
311
+ })
312
+ graph := loadPackageGraph(t, &CompileRequest{
313
+ Patterns: []string{"."},
314
+ Dir: moduleDir,
315
+ OutputPath: filepath.Join(t.TempDir(), "out"),
316
+ DependencyMode: DependencyModeAll,
317
+ RuntimeEmissionMode: RuntimeEmissionModeEmit,
318
+ })
319
+ model := buildSemanticModel(t, graph)
320
+
321
+ if hasInterfaceImplementation(model, "Impl", "private", false) {
322
+ t.Fatalf("unexpected cross-package unexported implementation: %#v", model.interfaceImplementations)
323
+ }
324
+ }
325
+
245
326
  func TestSemanticModelColorsAsyncFunctionsAndOverrides(t *testing.T) {
246
327
  moduleDir := writePackageGraphFixture(t, map[string]string{
247
328
  "go.mod": "module example.test/async\n\ngo 1.25.3\n",
@@ -314,6 +395,144 @@ func TestSemanticModelPropagatesCascadedAsyncInterfaceMethods(t *testing.T) {
314
395
  }
315
396
  }
316
397
 
398
+ func TestSemanticModelPropagatesAsyncToOverrideInterfaceMethods(t *testing.T) {
399
+ moduleDir := writePackageGraphFixture(t, map[string]string{
400
+ "go.mod": "module example.test/overrideiface\n\ngo 1.25.3\n",
401
+ "main.go": strings.Join([]string{
402
+ "package overrideiface",
403
+ "import (",
404
+ " \"io\"",
405
+ " \"sync\"",
406
+ ")",
407
+ "type asyncWriter struct { mu sync.Mutex }",
408
+ "func (w *asyncWriter) Write(p []byte) (int, error) {",
409
+ " w.mu.Lock()",
410
+ " defer w.mu.Unlock()",
411
+ " return len(p), nil",
412
+ "}",
413
+ "func Use(w io.Writer) {",
414
+ " _, _ = w.Write(nil)",
415
+ "}",
416
+ "func main() { Use(&asyncWriter{}) }",
417
+ "",
418
+ }, "\n"),
419
+ })
420
+ graph := loadPackageGraph(t, &CompileRequest{
421
+ Patterns: []string{"."},
422
+ Dir: moduleDir,
423
+ OutputPath: filepath.Join(t.TempDir(), "out"),
424
+ DependencyMode: DependencyModeAll,
425
+ RuntimeEmissionMode: RuntimeEmissionModeEmit,
426
+ })
427
+ model := buildSemanticModel(t, graph)
428
+
429
+ for _, name := range []string{"Write", "Use", "main"} {
430
+ fn := requireDefinedFunc(t, graph, "example.test/overrideiface", name)
431
+ if !model.functions[fn].async {
432
+ t.Fatalf("expected %s to be async, got %#v", name, model.functions[fn])
433
+ }
434
+ }
435
+ found := false
436
+ for _, implementation := range model.interfaceImplementations {
437
+ if implementation.typ != nil && implementation.typ.Obj().Name() == "asyncWriter" &&
438
+ implementation.iface != nil && implementation.iface.Obj().Pkg().Path() == "io" &&
439
+ implementation.iface.Obj().Name() == "Writer" &&
440
+ implementation.pointer {
441
+ found = true
442
+ break
443
+ }
444
+ }
445
+ if !found {
446
+ t.Fatalf("missing async *asyncWriter -> io.Writer implementation: %#v", model.interfaceImplementations)
447
+ }
448
+ }
449
+
450
+ func TestSemanticModelPropagatesAsyncToAnonymousInterfaceMethods(t *testing.T) {
451
+ moduleDir := writePackageGraphFixture(t, map[string]string{
452
+ "go.mod": "module example.test/anonymousiface\n\ngo 1.25.3\n",
453
+ "main.go": strings.Join([]string{
454
+ "package anonymousiface",
455
+ "import \"context\"",
456
+ "type Snapshot int",
457
+ "type Watcher struct { ch chan Snapshot }",
458
+ "func (w *Watcher) WaitValueChange(ctx context.Context, old Snapshot, errCh <-chan error) (Snapshot, error) {",
459
+ " select {",
460
+ " case v := <-w.ch:",
461
+ " return v, nil",
462
+ " case err := <-errCh:",
463
+ " return old, err",
464
+ " case <-ctx.Done():",
465
+ " return old, ctx.Err()",
466
+ " }",
467
+ "}",
468
+ "func Use(ctx context.Context, w interface {",
469
+ " WaitValueChange(context.Context, Snapshot, <-chan error) (Snapshot, error)",
470
+ "}, old Snapshot) (Snapshot, error) {",
471
+ " return w.WaitValueChange(ctx, old, nil)",
472
+ "}",
473
+ "",
474
+ }, "\n"),
475
+ })
476
+ graph := loadPackageGraph(t, &CompileRequest{
477
+ Patterns: []string{"."},
478
+ Dir: moduleDir,
479
+ OutputPath: filepath.Join(t.TempDir(), "out"),
480
+ DependencyMode: DependencyModeAll,
481
+ RuntimeEmissionMode: RuntimeEmissionModeEmit,
482
+ })
483
+ model := buildSemanticModel(t, graph)
484
+
485
+ fn := requireDefinedFunc(t, graph, "example.test/anonymousiface", "Use")
486
+ if !model.functions[fn].async {
487
+ t.Fatalf("expected Use to be async, got %#v", model.functions[fn])
488
+ }
489
+ }
490
+
491
+ func TestSemanticModelPropagatesAsyncThroughInstantiatedNamedInterface(t *testing.T) {
492
+ moduleDir := writePackageGraphFixture(t, map[string]string{
493
+ "go.mod": "module example.test/instantiatediface\n\ngo 1.25.3\n",
494
+ "main.go": strings.Join([]string{
495
+ "package instantiatediface",
496
+ "import \"context\"",
497
+ "type Snapshot int",
498
+ "type Watchable[T any] interface {",
499
+ " WaitValueChange(context.Context, T, <-chan error) (T, error)",
500
+ "}",
501
+ "type Container[T any] struct { ch chan T }",
502
+ "func (c *Container[T]) WaitValueChange(ctx context.Context, old T, errCh <-chan error) (T, error) {",
503
+ " select {",
504
+ " case v := <-c.ch:",
505
+ " return v, nil",
506
+ " case err := <-errCh:",
507
+ " return old, err",
508
+ " case <-ctx.Done():",
509
+ " return old, ctx.Err()",
510
+ " }",
511
+ "}",
512
+ "func Bind(w Watchable[Snapshot]) {}",
513
+ "func Use(ctx context.Context, w interface {",
514
+ " WaitValueChange(context.Context, Snapshot, <-chan error) (Snapshot, error)",
515
+ "}, old Snapshot) (Snapshot, error) {",
516
+ " return w.WaitValueChange(ctx, old, nil)",
517
+ "}",
518
+ "",
519
+ }, "\n"),
520
+ })
521
+ graph := loadPackageGraph(t, &CompileRequest{
522
+ Patterns: []string{"."},
523
+ Dir: moduleDir,
524
+ OutputPath: filepath.Join(t.TempDir(), "out"),
525
+ DependencyMode: DependencyModeAll,
526
+ RuntimeEmissionMode: RuntimeEmissionModeEmit,
527
+ })
528
+ model := buildSemanticModel(t, graph)
529
+
530
+ fn := requireDefinedFunc(t, graph, "example.test/instantiatediface", "Use")
531
+ if !model.functions[fn].async {
532
+ t.Fatalf("expected Use to be async, got %#v", model.functions[fn])
533
+ }
534
+ }
535
+
317
536
  func TestSemanticModelIndexesFunctionsByFullName(t *testing.T) {
318
537
  model := newSemanticModel()
319
538
  semPkg := &semanticPackage{}
@@ -14,6 +14,7 @@ type CompileService struct {
14
14
  emitterOwner *TypeScriptEmitOwner
15
15
  runtimeOwner *RuntimeContractOwner
16
16
  overrideOwner *OverrideRegistryOwner
17
+ parityOwner *OverrideParityVerifier
17
18
  }
18
19
 
19
20
  // NewCompileService creates a compile service with every pipeline owner.
@@ -28,6 +29,7 @@ func NewCompileService(overrideDirs ...string) *CompileService {
28
29
  emitterOwner: NewTypeScriptEmitOwner(runtimeOwner),
29
30
  runtimeOwner: runtimeOwner,
30
31
  overrideOwner: overrideOwner,
32
+ parityOwner: NewOverrideParityVerifier(),
31
33
  }
32
34
  }
33
35
 
@@ -96,6 +98,19 @@ func (s *CompileService) Compile(ctx context.Context, req *CompileRequest) (*Com
96
98
  return result, NewCompileError(diagnostics)
97
99
  }
98
100
 
101
+ overrideFacts, factsDiagnostics := s.overrideOwner.Facts(ctx)
102
+ diagnostics = append(diagnostics, factsDiagnostics...)
103
+ if diagnosticsHaveErrors(diagnostics) {
104
+ result.Diagnostics = diagnostics
105
+ return result, NewCompileError(diagnostics)
106
+ }
107
+ parityDiagnostics := s.parityOwner.Verify(ctx, graph, overrideFacts)
108
+ diagnostics = append(diagnostics, parityDiagnostics...)
109
+ if diagnosticsHaveErrors(diagnostics) {
110
+ result.Diagnostics = diagnostics
111
+ return result, NewCompileError(diagnostics)
112
+ }
113
+
99
114
  semanticModel, semanticDiagnostics := s.semanticOwner.Build(ctx, graph)
100
115
  diagnostics = append(diagnostics, semanticDiagnostics...)
101
116
  if diagnosticsHaveErrors(diagnostics) {
@@ -110,7 +125,11 @@ func (s *CompileService) Compile(ctx context.Context, req *CompileRequest) (*Com
110
125
  return result, NewCompileError(diagnostics)
111
126
  }
112
127
 
113
- loweredProgram, loweringDiagnostics := s.loweringOwner.Build(ctx, semanticModel)
128
+ loweredProgram, loweringDiagnostics := s.loweringOwner.Build(ctx, semanticModel, LoweringOptions{
129
+ SourceRoot: protobufTypeScriptBindingRoot(req.Dir),
130
+ OutputPath: req.OutputPath,
131
+ ProtobufTypeScriptBinding: req.ProtobufTypeScriptBinding,
132
+ })
114
133
  diagnostics = append(diagnostics, loweringDiagnostics...)
115
134
  if diagnosticsHaveErrors(diagnostics) {
116
135
  result.Diagnostics = diagnostics