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
@@ -0,0 +1,364 @@
1
+ package compiler
2
+
3
+ import (
4
+ "context"
5
+ "go/ast"
6
+ "go/types"
7
+ "os"
8
+ "path/filepath"
9
+ "testing"
10
+ )
11
+
12
+ type loweringBenchFixture struct {
13
+ model *SemanticModel
14
+ owner *LoweringOwner
15
+ semPkg *semanticPackage
16
+ lazyPackageVarsByPkg map[string]map[types.Object]bool
17
+ file loweringBenchFile
18
+ genDecls []loweringBenchGenDecl
19
+ stmtLists []loweringBenchStmtList
20
+ }
21
+
22
+ type loweringBenchFile struct {
23
+ file *ast.File
24
+ sourcePath string
25
+ associated []*ast.FuncDecl
26
+ declFiles map[types.Object]string
27
+ outputNames map[string]string
28
+ lazyPackageVars map[types.Object]bool
29
+ }
30
+
31
+ type loweringBenchGenDecl struct {
32
+ ctx lowerFileContext
33
+ decl *ast.GenDecl
34
+ }
35
+
36
+ type loweringBenchStmtList struct {
37
+ ctx lowerFileContext
38
+ stmts []ast.Stmt
39
+ }
40
+
41
+ func BenchmarkLoweringPackage(b *testing.B) {
42
+ fixture := newLoweringBenchFixture(b)
43
+ b.ReportAllocs()
44
+ b.ResetTimer()
45
+ for i := 0; i < b.N; i++ {
46
+ if _, diagnostics := fixture.owner.lowerPackage(
47
+ fixture.model,
48
+ fixture.semPkg,
49
+ make(map[string]map[types.Object]bool),
50
+ make(runtimeMethodSetCache),
51
+ LoweringOptions{},
52
+ ); diagnosticsHaveErrors(diagnostics) {
53
+ b.Fatal(diagnostics)
54
+ }
55
+ }
56
+ }
57
+
58
+ func BenchmarkLoweringAnalyzeLocalFileReferences(b *testing.B) {
59
+ fixture := newLoweringBenchFixture(b)
60
+ b.ReportAllocs()
61
+ b.ResetTimer()
62
+ for i := 0; i < b.N; i++ {
63
+ _ = fixture.owner.analyzeLocalFileReferences(
64
+ fixture.semPkg,
65
+ fixture.file.file,
66
+ fixture.file.sourcePath,
67
+ fixture.file.associated,
68
+ fixture.file.declFiles,
69
+ fixture.file.outputNames,
70
+ make(runtimeMethodSetCache),
71
+ )
72
+ }
73
+ }
74
+
75
+ func BenchmarkLoweringFile(b *testing.B) {
76
+ fixture := newLoweringBenchFixture(b)
77
+ b.ReportAllocs()
78
+ b.ResetTimer()
79
+ for i := 0; i < b.N; i++ {
80
+ if _, diagnostics := fixture.owner.lowerFile(
81
+ fixture.model,
82
+ fixture.semPkg,
83
+ fixture.file.file,
84
+ fixture.file.sourcePath,
85
+ fixture.file.declFiles,
86
+ fixture.file.outputNames,
87
+ fixture.file.lazyPackageVars,
88
+ fixture.lazyPackageVarsByPkg,
89
+ make(runtimeMethodSetCache),
90
+ false,
91
+ ); diagnosticsHaveErrors(diagnostics) {
92
+ b.Fatal(diagnostics)
93
+ }
94
+ }
95
+ }
96
+
97
+ func BenchmarkLoweringGenDecls(b *testing.B) {
98
+ fixture := newLoweringBenchFixture(b)
99
+ b.ReportAllocs()
100
+ b.ResetTimer()
101
+ for i := 0; i < b.N; i++ {
102
+ for _, target := range fixture.genDecls {
103
+ if _, diagnostics := fixture.owner.lowerGenDecl(target.ctx, target.decl); diagnosticsHaveErrors(diagnostics) {
104
+ b.Fatal(diagnostics)
105
+ }
106
+ }
107
+ }
108
+ }
109
+
110
+ func BenchmarkLoweringStmtLists(b *testing.B) {
111
+ fixture := newLoweringBenchFixture(b)
112
+ b.ReportAllocs()
113
+ b.ResetTimer()
114
+ for i := 0; i < b.N; i++ {
115
+ for _, target := range fixture.stmtLists {
116
+ if _, diagnostics := fixture.owner.lowerStmtList(target.ctx, target.stmts); diagnosticsHaveErrors(diagnostics) {
117
+ b.Fatal(diagnostics)
118
+ }
119
+ }
120
+ }
121
+ }
122
+
123
+ func BenchmarkLoweringPackageDeclFiles(b *testing.B) {
124
+ fixture := newLoweringBenchFixture(b)
125
+ b.ReportAllocs()
126
+ b.ResetTimer()
127
+ for i := 0; i < b.N; i++ {
128
+ _ = packageDeclFiles(fixture.semPkg)
129
+ }
130
+ }
131
+
132
+ func BenchmarkLoweringLazyPackageVars(b *testing.B) {
133
+ fixture := newLoweringBenchFixture(b)
134
+ b.ReportAllocs()
135
+ b.ResetTimer()
136
+ for i := 0; i < b.N; i++ {
137
+ _ = fixture.owner.lazyPackageVars(fixture.semPkg, fixture.file.declFiles)
138
+ }
139
+ }
140
+
141
+ func newLoweringBenchFixture(tb testing.TB) *loweringBenchFixture {
142
+ tb.Helper()
143
+ dir := tb.TempDir()
144
+ if err := os.WriteFile(filepath.Join(dir, "go.mod"), []byte("module example.test/loweringbench\n\ngo 1.25.3\n"), 0o644); err != nil {
145
+ tb.Fatal(err)
146
+ }
147
+ for name, source := range loweringBenchSources {
148
+ if err := os.WriteFile(filepath.Join(dir, name), []byte(source), 0o644); err != nil {
149
+ tb.Fatal(err)
150
+ }
151
+ }
152
+
153
+ service := NewCompileService()
154
+ req := &CompileRequest{
155
+ Dir: dir,
156
+ OutputPath: filepath.Join(dir, "out"),
157
+ Patterns: []string{"."},
158
+ }
159
+ graph, graphDiagnostics := service.PackageGraphOwner().Load(context.Background(), req)
160
+ if diagnosticsHaveErrors(graphDiagnostics) {
161
+ tb.Fatal(graphDiagnostics)
162
+ }
163
+ model, semanticDiagnostics := service.SemanticModelOwner().Build(context.Background(), graph)
164
+ if diagnosticsHaveErrors(semanticDiagnostics) {
165
+ tb.Fatal(semanticDiagnostics)
166
+ }
167
+ semPkg := model.packages["example.test/loweringbench"]
168
+ if semPkg == nil {
169
+ tb.Fatal("missing benchmark semantic package")
170
+ }
171
+ owner := service.LoweringOwner()
172
+ declFiles := packageDeclFiles(semPkg)
173
+ outputNames := packageOutputNames(semPkg)
174
+ lazyPackageVarsByPkg := make(map[string]map[types.Object]bool)
175
+ lazyPackageVars := owner.packageLazyVars(semPkg, lazyPackageVarsByPkg, declFiles)
176
+
177
+ var benchFile loweringBenchFile
178
+ var genDecls []loweringBenchGenDecl
179
+ var stmtLists []loweringBenchStmtList
180
+ for idx, file := range semPkg.source.Syntax {
181
+ sourcePath := sourceFilePath(semPkg, idx, file)
182
+ associated := owner.methodDeclsForFileTypes(semPkg, file)
183
+ localRefs := owner.analyzeLocalFileReferences(semPkg, file, sourcePath, associated, declFiles, outputNames, make(runtimeMethodSetCache))
184
+ ctx := lowerFileContext{
185
+ model: model,
186
+ semPkg: semPkg,
187
+ file: file,
188
+ importAliases: make(map[string]string),
189
+ importPaths: make(map[string]string),
190
+ importNames: make(map[string]string),
191
+ importObjects: make(map[*types.PkgName]string),
192
+ sourcePath: sourcePath,
193
+ localAliases: localRefs.aliases,
194
+ lazyPackageVars: lazyPackageVars,
195
+ lazyPackageVarsByPkg: lazyPackageVarsByPkg,
196
+ tempNames: newTempNameOwner(),
197
+ topLevel: true,
198
+ }
199
+ if filepath.Base(sourcePath) == "bench.go" {
200
+ benchFile = loweringBenchFile{
201
+ file: file,
202
+ sourcePath: sourcePath,
203
+ associated: associated,
204
+ declFiles: declFiles,
205
+ outputNames: outputNames,
206
+ lazyPackageVars: lazyPackageVars,
207
+ }
208
+ }
209
+ for _, decl := range file.Decls {
210
+ switch typed := decl.(type) {
211
+ case *ast.GenDecl:
212
+ genDecls = append(genDecls, loweringBenchGenDecl{ctx: ctx, decl: typed})
213
+ case *ast.FuncDecl:
214
+ fn, _ := semPkg.source.TypesInfo.Defs[typed.Name].(*types.Func)
215
+ signature, _ := fn.Type().(*types.Signature)
216
+ bodyCtx := ctx.withSignature(signature).withAsyncFunction(owner.functionAsync(ctx, fn))
217
+ if typed.Body != nil {
218
+ stmtLists = append(stmtLists, loweringBenchStmtList{ctx: bodyCtx, stmts: typed.Body.List})
219
+ }
220
+ }
221
+ }
222
+ }
223
+ if benchFile.file == nil {
224
+ tb.Fatal("missing bench.go fixture file")
225
+ }
226
+ if len(genDecls) == 0 || len(stmtLists) == 0 {
227
+ tb.Fatalf("incomplete lowering benchmark fixture: genDecls=%d stmtLists=%d", len(genDecls), len(stmtLists))
228
+ }
229
+ return &loweringBenchFixture{
230
+ model: model,
231
+ owner: owner,
232
+ semPkg: semPkg,
233
+ lazyPackageVarsByPkg: lazyPackageVarsByPkg,
234
+ file: benchFile,
235
+ genDecls: genDecls,
236
+ stmtLists: stmtLists,
237
+ }
238
+ }
239
+
240
+ var loweringBenchSources = map[string]string{
241
+ "bench.go": `package loweringbench
242
+
243
+ type Number interface {
244
+ ~int | ~int64
245
+ }
246
+
247
+ type Item[T Number] struct {
248
+ ID int
249
+ Name string
250
+ Values []T
251
+ Meta map[string]T
252
+ Next *Item[T]
253
+ }
254
+
255
+ type Processor[T Number] interface {
256
+ Process(Item[T]) (T, error)
257
+ }
258
+
259
+ type Runner[T Number] struct {
260
+ Items []Item[T]
261
+ Proc Processor[T]
262
+ }
263
+
264
+ var GlobalItems = []Item[int]{
265
+ {ID: 1, Name: "one", Values: []int{1, 2, 3}, Meta: map[string]int{"a": 1}},
266
+ {ID: 2, Name: "two", Values: []int{4, 5, 6}, Meta: map[string]int{"b": 2}},
267
+ }
268
+
269
+ var Lookup = map[string]Item[int]{
270
+ "one": GlobalItems[0],
271
+ "two": GlobalItems[1],
272
+ }
273
+
274
+ func (r *Runner[T]) Sum(seed T) (T, error) {
275
+ total := seed
276
+ for idx, item := range r.Items {
277
+ for _, value := range item.Values {
278
+ total += value
279
+ }
280
+ if r.Proc != nil {
281
+ next, err := r.Proc.Process(item)
282
+ if err != nil {
283
+ return total, err
284
+ }
285
+ total += next
286
+ }
287
+ if idx%2 == 0 {
288
+ total += T(idx)
289
+ }
290
+ }
291
+ return total, nil
292
+ }
293
+
294
+ func UseRunner(r *Runner[int]) int {
295
+ total, err := r.Sum(10)
296
+ if err != nil {
297
+ return -1
298
+ }
299
+ switch {
300
+ case total > 100:
301
+ return total / 2
302
+ case total > 20:
303
+ return total + len(r.Items)
304
+ default:
305
+ return total
306
+ }
307
+ }
308
+ `,
309
+ "flow.go": `package loweringbench
310
+
311
+ func FoldItems(items []Item[int], fn func(Item[int]) int) int {
312
+ total := 0
313
+ for _, item := range items {
314
+ total += fn(item)
315
+ }
316
+ return total
317
+ }
318
+
319
+ func ComplexFlow(items []Item[int], ch chan int) int {
320
+ total := 0
321
+ for idx := 0; idx < len(items); idx++ {
322
+ item := items[idx]
323
+ select {
324
+ case ch <- item.ID:
325
+ total += item.ID
326
+ default:
327
+ total += len(item.Values)
328
+ }
329
+ for key, value := range item.Meta {
330
+ if key == "" {
331
+ continue
332
+ }
333
+ total += value
334
+ }
335
+ }
336
+ return total
337
+ }
338
+ `,
339
+ "types.go": `package loweringbench
340
+
341
+ type NamedInt int
342
+
343
+ func (n NamedInt) Process(item Item[int]) (int, error) {
344
+ return int(n) + item.ID + len(item.Values), nil
345
+ }
346
+
347
+ type Pair[A, B any] struct {
348
+ A A
349
+ B B
350
+ }
351
+
352
+ type Registry struct {
353
+ ByName map[string]Processor[int]
354
+ Pairs []Pair[string, Item[int]]
355
+ }
356
+
357
+ func NewRegistry() *Registry {
358
+ return &Registry{
359
+ ByName: map[string]Processor[int]{"default": NamedInt(3)},
360
+ Pairs: []Pair[string, Item[int]]{{A: "one", B: GlobalItems[0]}},
361
+ }
362
+ }
363
+ `,
364
+ }
@@ -24,6 +24,7 @@ type OverrideFacts struct {
24
24
 
25
25
  type overridePackageFacts struct {
26
26
  metadata OverrideMetadata
27
+ parity overrideParityLedger
27
28
  copyPackage overrideCopyPackage
28
29
  dependencies []string
29
30
  }
@@ -52,6 +53,14 @@ func (f *OverrideFacts) Metadata(pkgPath string) OverrideMetadata {
52
53
  return cloneOverrideMetadata(pkg.metadata)
53
54
  }
54
55
 
56
+ func (f *OverrideFacts) parityLedger(pkgPath string) overrideParityLedger {
57
+ if f == nil {
58
+ return newOverrideParityLedger()
59
+ }
60
+ pkg := f.packages[pkgPath]
61
+ return cloneOverrideParityLedger(pkg.parity)
62
+ }
63
+
55
64
  // IsMethodAsync returns true when override metadata marks a method async.
56
65
  func (f *OverrideFacts) IsMethodAsync(pkgPath, method string) bool {
57
66
  if f == nil {
@@ -122,6 +131,11 @@ func buildOverrideFacts(ctx context.Context, overrideDirs []string) (*OverrideFa
122
131
  diagnostics = append(diagnostics, overrideError("read override metadata", pkgPath, err))
123
132
  continue
124
133
  }
134
+ parity, err := loadOverrideParityLedger(roots[pkgPath])
135
+ if err != nil {
136
+ diagnostics = append(diagnostics, overrideError("read override parity ledger", pkgPath, err))
137
+ continue
138
+ }
125
139
  copyPackage, dependencies, packageDiagnostics := loadOverrideCopyPackage(roots[pkgPath], roots, metadata)
126
140
  diagnostics = append(diagnostics, packageDiagnostics...)
127
141
  if diagnosticsHaveErrors(packageDiagnostics) {
@@ -129,6 +143,7 @@ func buildOverrideFacts(ctx context.Context, overrideDirs []string) (*OverrideFa
129
143
  }
130
144
  facts.packages[pkgPath] = overridePackageFacts{
131
145
  metadata: cloneOverrideMetadata(metadata),
146
+ parity: cloneOverrideParityLedger(parity),
132
147
  copyPackage: copyPackage,
133
148
  dependencies: dependencies,
134
149
  }