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
@@ -1,9 +1,199 @@
1
1
  import * as $ from '@goscript/builtin/index.js'
2
2
 
3
+ export type Token = number
3
4
  export type Pos = number
4
5
 
6
+ export const ILLEGAL: Token = 0
7
+ export const EOF: Token = 1
8
+ export const COMMENT: Token = 2
9
+ const literal_beg: Token = 3
10
+ export const IDENT: Token = 4
11
+ export const INT: Token = 5
12
+ export const FLOAT: Token = 6
13
+ export const IMAG: Token = 7
14
+ export const CHAR: Token = 8
15
+ export const STRING: Token = 9
16
+ const literal_end: Token = 10
17
+ const operator_beg: Token = 11
18
+ export const ADD: Token = 12
19
+ export const SUB: Token = 13
20
+ export const MUL: Token = 14
21
+ export const QUO: Token = 15
22
+ export const REM: Token = 16
23
+ export const AND: Token = 17
24
+ export const OR: Token = 18
25
+ export const XOR: Token = 19
26
+ export const SHL: Token = 20
27
+ export const SHR: Token = 21
28
+ export const AND_NOT: Token = 22
29
+ export const ADD_ASSIGN: Token = 23
30
+ export const SUB_ASSIGN: Token = 24
31
+ export const MUL_ASSIGN: Token = 25
32
+ export const QUO_ASSIGN: Token = 26
33
+ export const REM_ASSIGN: Token = 27
34
+ export const AND_ASSIGN: Token = 28
35
+ export const OR_ASSIGN: Token = 29
36
+ export const XOR_ASSIGN: Token = 30
37
+ export const SHL_ASSIGN: Token = 31
38
+ export const SHR_ASSIGN: Token = 32
39
+ export const AND_NOT_ASSIGN: Token = 33
40
+ export const LAND: Token = 34
41
+ export const LOR: Token = 35
42
+ export const ARROW: Token = 36
43
+ export const INC: Token = 37
44
+ export const DEC: Token = 38
45
+ export const EQL: Token = 39
46
+ export const LSS: Token = 40
47
+ export const GTR: Token = 41
48
+ export const ASSIGN: Token = 42
49
+ export const NOT: Token = 43
50
+ export const NEQ: Token = 44
51
+ export const LEQ: Token = 45
52
+ export const GEQ: Token = 46
53
+ export const DEFINE: Token = 47
54
+ export const ELLIPSIS: Token = 48
55
+ export const LPAREN: Token = 49
56
+ export const LBRACK: Token = 50
57
+ export const LBRACE: Token = 51
58
+ export const COMMA: Token = 52
59
+ export const PERIOD: Token = 53
60
+ export const RPAREN: Token = 54
61
+ export const RBRACK: Token = 55
62
+ export const RBRACE: Token = 56
63
+ export const SEMICOLON: Token = 57
64
+ export const COLON: Token = 58
65
+ const operator_end: Token = 59
66
+ const keyword_beg: Token = 60
67
+ export const BREAK: Token = 61
68
+ export const CASE: Token = 62
69
+ export const CHAN: Token = 63
70
+ export const CONST: Token = 64
71
+ export const CONTINUE: Token = 65
72
+ export const DEFAULT: Token = 66
73
+ export const DEFER: Token = 67
74
+ export const ELSE: Token = 68
75
+ export const FALLTHROUGH: Token = 69
76
+ export const FOR: Token = 70
77
+ export const FUNC: Token = 71
78
+ export const GO: Token = 72
79
+ export const GOTO: Token = 73
80
+ export const IF: Token = 74
81
+ export const IMPORT: Token = 75
82
+ export const INTERFACE: Token = 76
83
+ export const MAP: Token = 77
84
+ export const PACKAGE: Token = 78
85
+ export const RANGE: Token = 79
86
+ export const RETURN: Token = 80
87
+ export const SELECT: Token = 81
88
+ export const STRUCT: Token = 82
89
+ export const SWITCH: Token = 83
90
+ export const TYPE: Token = 84
91
+ export const VAR: Token = 85
92
+ const keyword_end: Token = 86
93
+ export const TILDE: Token = 88
94
+
95
+ export const LowestPrec = 0
96
+ export const UnaryPrec = 6
97
+ export const HighestPrec = 7
5
98
  export const NoPos: Pos = 0
6
99
 
100
+ const tokenStrings = new Map<Token, string>([
101
+ [ILLEGAL, 'ILLEGAL'],
102
+ [EOF, 'EOF'],
103
+ [COMMENT, 'COMMENT'],
104
+ [IDENT, 'IDENT'],
105
+ [INT, 'INT'],
106
+ [FLOAT, 'FLOAT'],
107
+ [IMAG, 'IMAG'],
108
+ [CHAR, 'CHAR'],
109
+ [STRING, 'STRING'],
110
+ [ADD, '+'],
111
+ [SUB, '-'],
112
+ [MUL, '*'],
113
+ [QUO, '/'],
114
+ [REM, '%'],
115
+ [AND, '&'],
116
+ [OR, '|'],
117
+ [XOR, '^'],
118
+ [SHL, '<<'],
119
+ [SHR, '>>'],
120
+ [AND_NOT, '&^'],
121
+ [ADD_ASSIGN, '+='],
122
+ [SUB_ASSIGN, '-='],
123
+ [MUL_ASSIGN, '*='],
124
+ [QUO_ASSIGN, '/='],
125
+ [REM_ASSIGN, '%='],
126
+ [AND_ASSIGN, '&='],
127
+ [OR_ASSIGN, '|='],
128
+ [XOR_ASSIGN, '^='],
129
+ [SHL_ASSIGN, '<<='],
130
+ [SHR_ASSIGN, '>>='],
131
+ [AND_NOT_ASSIGN, '&^='],
132
+ [LAND, '&&'],
133
+ [LOR, '||'],
134
+ [ARROW, '<-'],
135
+ [INC, '++'],
136
+ [DEC, '--'],
137
+ [EQL, '=='],
138
+ [LSS, '<'],
139
+ [GTR, '>'],
140
+ [ASSIGN, '='],
141
+ [NOT, '!'],
142
+ [NEQ, '!='],
143
+ [LEQ, '<='],
144
+ [GEQ, '>='],
145
+ [DEFINE, ':='],
146
+ [ELLIPSIS, '...'],
147
+ [LPAREN, '('],
148
+ [LBRACK, '['],
149
+ [LBRACE, '{'],
150
+ [COMMA, ','],
151
+ [PERIOD, '.'],
152
+ [RPAREN, ')'],
153
+ [RBRACK, ']'],
154
+ [RBRACE, '}'],
155
+ [SEMICOLON, ';'],
156
+ [COLON, ':'],
157
+ [BREAK, 'break'],
158
+ [CASE, 'case'],
159
+ [CHAN, 'chan'],
160
+ [CONST, 'const'],
161
+ [CONTINUE, 'continue'],
162
+ [DEFAULT, 'default'],
163
+ [DEFER, 'defer'],
164
+ [ELSE, 'else'],
165
+ [FALLTHROUGH, 'fallthrough'],
166
+ [FOR, 'for'],
167
+ [FUNC, 'func'],
168
+ [GO, 'go'],
169
+ [GOTO, 'goto'],
170
+ [IF, 'if'],
171
+ [IMPORT, 'import'],
172
+ [INTERFACE, 'interface'],
173
+ [MAP, 'map'],
174
+ [PACKAGE, 'package'],
175
+ [RANGE, 'range'],
176
+ [RETURN, 'return'],
177
+ [SELECT, 'select'],
178
+ [STRUCT, 'struct'],
179
+ [SWITCH, 'switch'],
180
+ [TYPE, 'type'],
181
+ [VAR, 'var'],
182
+ [TILDE, '~'],
183
+ ])
184
+
185
+ const keywords = new Map<string, Token>()
186
+ for (let tok = keyword_beg + 1; tok < keyword_end; tok++) {
187
+ keywords.set(tokenStrings.get(tok)!, tok)
188
+ }
189
+
190
+ type lineInfo = {
191
+ Offset: number
192
+ Filename: string
193
+ Line: number
194
+ Column: number
195
+ }
196
+
7
197
  export class Position {
8
198
  public get Filename(): string {
9
199
  return this._fields.Filename.value
@@ -109,12 +299,388 @@ export function Position_IsValid(pos: Position): boolean {
109
299
  }
110
300
 
111
301
  export function Position_String(pos: Position): string {
302
+ let text = pos.Filename
112
303
  if (!Position_IsValid(pos)) {
113
- return '-'
304
+ return text === '' ? '-' : text
305
+ }
306
+ if (text !== '') {
307
+ text += ':'
114
308
  }
115
- const filename = pos.Filename === '' ? '<input>' : pos.Filename
309
+ text += `${pos.Line}`
116
310
  if (pos.Column > 0) {
117
- return `${filename}:${pos.Line}:${pos.Column}`
311
+ text += `:${pos.Column}`
312
+ }
313
+ return text
314
+ }
315
+
316
+ export class File {
317
+ private nameValue: string
318
+ private baseValue: number
319
+ private sizeValue: number
320
+ private linesValue: number[]
321
+ private infosValue: lineInfo[]
322
+
323
+ constructor(
324
+ init?: Partial<{
325
+ name: string
326
+ base: number
327
+ size: number
328
+ lines: number[]
329
+ infos: lineInfo[]
330
+ }>,
331
+ ) {
332
+ this.nameValue = init?.name ?? ''
333
+ this.baseValue = init?.base ?? 0
334
+ this.sizeValue = init?.size ?? 0
335
+ this.linesValue = init?.lines?.slice() ?? [0]
336
+ this.infosValue = init?.infos?.slice() ?? []
337
+ }
338
+
339
+ public clone(): File {
340
+ return new File({
341
+ name: this.nameValue,
342
+ base: this.baseValue,
343
+ size: this.sizeValue,
344
+ lines: this.linesValue,
345
+ infos: this.infosValue,
346
+ })
347
+ }
348
+
349
+ public Name(): string {
350
+ return this.nameValue
351
+ }
352
+
353
+ public Base(): number {
354
+ return this.baseValue
355
+ }
356
+
357
+ public Size(): number {
358
+ return this.sizeValue
359
+ }
360
+
361
+ public End(): Pos {
362
+ return this.baseValue + this.sizeValue
363
+ }
364
+
365
+ public LineCount(): number {
366
+ return this.linesValue.length
367
+ }
368
+
369
+ public AddLine(offset: number): void {
370
+ const last = this.linesValue[this.linesValue.length - 1]
371
+ if ((this.linesValue.length === 0 || last < offset) && offset < this.sizeValue) {
372
+ this.linesValue.push(offset)
373
+ }
374
+ }
375
+
376
+ public MergeLine(line: number): void {
377
+ if (line < 1 || line >= this.linesValue.length) {
378
+ $.panic(`invalid line number ${line}`)
379
+ }
380
+ this.linesValue.splice(line, 1)
381
+ }
382
+
383
+ public Lines(): $.Slice<number> {
384
+ return $.arrayToSlice(this.linesValue.slice())
385
+ }
386
+
387
+ public SetLines(lines: $.Slice<number>): boolean {
388
+ const next = $.asArray(lines)
389
+ for (let i = 0; i < next.length; i++) {
390
+ if ((i > 0 && next[i] <= next[i - 1]) || this.sizeValue <= next[i]) {
391
+ return false
392
+ }
393
+ }
394
+ this.linesValue = next.slice()
395
+ return true
396
+ }
397
+
398
+ public SetLinesForContent(content: $.Slice<number>): void {
399
+ const lines: number[] = []
400
+ let line = 0
401
+ for (let offset = 0; offset < $.len(content); offset++) {
402
+ if (line >= 0) {
403
+ lines.push(line)
404
+ }
405
+ line = -1
406
+ if (content![offset] === 10) {
407
+ line = offset + 1
408
+ }
409
+ }
410
+ this.linesValue = lines
411
+ }
412
+
413
+ public LineStart(line: number): Pos {
414
+ if (line < 1 || line > this.linesValue.length) {
415
+ $.panic(`invalid line number ${line}`)
416
+ }
417
+ return this.baseValue + this.linesValue[line - 1]
418
+ }
419
+
420
+ public AddLineInfo(offset: number, filename: string, line: number): void {
421
+ this.AddLineColumnInfo(offset, filename, line, 1)
422
+ }
423
+
424
+ public AddLineColumnInfo(
425
+ offset: number,
426
+ filename: string,
427
+ line: number,
428
+ column: number,
429
+ ): void {
430
+ const last = this.infosValue[this.infosValue.length - 1]
431
+ if ((this.infosValue.length === 0 || last.Offset < offset) && offset < this.sizeValue) {
432
+ this.infosValue.push({ Offset: offset, Filename: filename, Line: line, Column: column })
433
+ }
434
+ }
435
+
436
+ public Pos(offset: number): Pos {
437
+ return this.baseValue + this.fixOffset(offset)
438
+ }
439
+
440
+ public Offset(pos: Pos): number {
441
+ return this.fixOffset(pos - this.baseValue)
442
+ }
443
+
444
+ public Line(pos: Pos): number {
445
+ return this.Position(pos).Line
446
+ }
447
+
448
+ public PositionFor(pos: Pos, adjusted: boolean): Position {
449
+ if (pos === NoPos) {
450
+ return new Position()
451
+ }
452
+ return this.position(pos, adjusted)
453
+ }
454
+
455
+ public Position(pos: Pos): Position {
456
+ return this.PositionFor(pos, true)
457
+ }
458
+
459
+ private fixOffset(offset: number): number {
460
+ if (offset < 0) {
461
+ return 0
462
+ }
463
+ if (offset > this.sizeValue) {
464
+ return this.sizeValue
465
+ }
466
+ return offset
467
+ }
468
+
469
+ private position(pos: Pos, adjusted: boolean): Position {
470
+ const offset = this.fixOffset(pos - this.baseValue)
471
+ let filename = this.nameValue
472
+ let line = 0
473
+ let column = 0
474
+ const lineIndex = searchInts(this.linesValue, offset)
475
+ if (lineIndex >= 0) {
476
+ line = lineIndex + 1
477
+ column = offset - this.linesValue[lineIndex] + 1
478
+ }
479
+ if (adjusted && this.infosValue.length > 0) {
480
+ const infoIndex = searchLineInfos(this.infosValue, offset)
481
+ if (infoIndex >= 0) {
482
+ const info = this.infosValue[infoIndex]
483
+ filename = info.Filename
484
+ const baseLineIndex = searchInts(this.linesValue, info.Offset)
485
+ if (baseLineIndex >= 0) {
486
+ const delta = line - (baseLineIndex + 1)
487
+ line = info.Line + delta
488
+ if (info.Column === 0) {
489
+ column = 0
490
+ } else if (delta === 0) {
491
+ column = info.Column + (offset - info.Offset)
492
+ }
493
+ }
494
+ }
495
+ }
496
+ return $.markAsStructValue(
497
+ new Position({
498
+ Filename: filename,
499
+ Offset: offset,
500
+ Line: line,
501
+ Column: column,
502
+ }),
503
+ )
504
+ }
505
+ }
506
+
507
+ export class FileSet {
508
+ private baseValue: number
509
+ private files: File[]
510
+
511
+ constructor(init?: Partial<{ base: number; files: File[] }>) {
512
+ this.baseValue = init?.base ?? 1
513
+ this.files = init?.files?.slice() ?? []
514
+ }
515
+
516
+ public clone(): FileSet {
517
+ return new FileSet({
518
+ base: this.baseValue,
519
+ files: this.files,
520
+ })
521
+ }
522
+
523
+ public Base(): number {
524
+ return this.baseValue
525
+ }
526
+
527
+ public AddFile(filename: string, base: number, size: number): File {
528
+ if (base < 0) {
529
+ base = this.baseValue
530
+ }
531
+ if (base < this.baseValue) {
532
+ $.panic(`invalid base ${base}`)
533
+ }
534
+ if (size < 0) {
535
+ $.panic(`invalid size ${size}`)
536
+ }
537
+ const file = new File({ name: filename, base, size })
538
+ this.files.push(file)
539
+ this.files.sort((left, right) => left.Base() - right.Base())
540
+ this.baseValue = base + size + 1
541
+ return file
542
+ }
543
+
544
+ public AddExistingFiles(...files: File[]): void {
545
+ for (const file of files) {
546
+ if (file != null && !this.files.includes(file)) {
547
+ this.files.push(file)
548
+ this.baseValue = Math.max(this.baseValue, file.Base() + file.Size() + 1)
549
+ }
550
+ }
551
+ this.files.sort((left, right) => left.Base() - right.Base())
552
+ }
553
+
554
+ public RemoveFile(file: File): void {
555
+ this.files = this.files.filter((candidate) => candidate !== file)
556
+ }
557
+
558
+ public Iterate(yieldFile: (file: File) => boolean): void {
559
+ for (const file of this.files.slice()) {
560
+ if (!yieldFile(file)) {
561
+ return
562
+ }
563
+ }
564
+ }
565
+
566
+ public File(pos: Pos): File | null {
567
+ if (pos === NoPos) {
568
+ return null
569
+ }
570
+ return this.files.find((file) => file.Base() <= pos && pos <= file.End()) ?? null
571
+ }
572
+
573
+ public PositionFor(pos: Pos, adjusted: boolean): Position {
574
+ const file = this.File(pos)
575
+ if (file === null) {
576
+ return new Position()
577
+ }
578
+ return file.PositionFor(pos, adjusted)
579
+ }
580
+
581
+ public Position(pos: Pos): Position {
582
+ return this.PositionFor(pos, true)
583
+ }
584
+ }
585
+
586
+ export function NewFileSet(): FileSet {
587
+ return new FileSet()
588
+ }
589
+
590
+ export function Pos_IsValid(pos: Pos): boolean {
591
+ return pos !== NoPos
592
+ }
593
+
594
+ export function Token_String(tok: Token): string {
595
+ return tokenStrings.get(tok) ?? `token(${tok})`
596
+ }
597
+
598
+ export function Token_Precedence(tok: Token): number {
599
+ switch (tok) {
600
+ case LOR:
601
+ return 1
602
+ case LAND:
603
+ return 2
604
+ case EQL:
605
+ case NEQ:
606
+ case LSS:
607
+ case LEQ:
608
+ case GTR:
609
+ case GEQ:
610
+ return 3
611
+ case ADD:
612
+ case SUB:
613
+ case OR:
614
+ case XOR:
615
+ return 4
616
+ case MUL:
617
+ case QUO:
618
+ case REM:
619
+ case SHL:
620
+ case SHR:
621
+ case AND:
622
+ case AND_NOT:
623
+ return 5
624
+ default:
625
+ return LowestPrec
626
+ }
627
+ }
628
+
629
+ export function Token_IsLiteral(tok: Token): boolean {
630
+ return literal_beg < tok && tok < literal_end
631
+ }
632
+
633
+ export function Token_IsOperator(tok: Token): boolean {
634
+ return (operator_beg < tok && tok < operator_end) || tok === TILDE
635
+ }
636
+
637
+ export function Token_IsKeyword(tok: Token): boolean {
638
+ return keyword_beg < tok && tok < keyword_end
639
+ }
640
+
641
+ export function Lookup(ident: string): Token {
642
+ return keywords.get(ident) ?? IDENT
643
+ }
644
+
645
+ export function IsExported(name: string): boolean {
646
+ return /^\p{Lu}/u.test(name)
647
+ }
648
+
649
+ export function IsKeyword(name: string): boolean {
650
+ return keywords.has(name)
651
+ }
652
+
653
+ export function IsIdentifier(name: string): boolean {
654
+ if (name === '' || IsKeyword(name)) {
655
+ return false
656
+ }
657
+ return /^[$_\p{L}][$_\p{L}\p{N}]*$/u.test(name)
658
+ }
659
+
660
+ function searchInts(values: number[], offset: number): number {
661
+ let low = 0
662
+ let high = values.length
663
+ while (low < high) {
664
+ const mid = Math.floor((low + high) / 2)
665
+ if (values[mid] > offset) {
666
+ high = mid
667
+ } else {
668
+ low = mid + 1
669
+ }
670
+ }
671
+ return low - 1
672
+ }
673
+
674
+ function searchLineInfos(values: lineInfo[], offset: number): number {
675
+ let low = 0
676
+ let high = values.length
677
+ while (low < high) {
678
+ const mid = Math.floor((low + high) / 2)
679
+ if (values[mid].Offset > offset) {
680
+ high = mid
681
+ } else {
682
+ low = mid + 1
683
+ }
118
684
  }
119
- return `${filename}:${pos.Line}`
685
+ return low - 1
120
686
  }
@@ -0,0 +1,18 @@
1
+ import { describe, expect, test } from 'vitest'
2
+
3
+ import {
4
+ Escape,
5
+ EscapeNonString,
6
+ EscapeToResultNonString,
7
+ NoEscape,
8
+ } from './index.js'
9
+
10
+ describe('internal/abi escape intrinsics', () => {
11
+ test('return identity values in the JavaScript target', () => {
12
+ const value = { id: 1 }
13
+ expect(Escape(value)).toBe(value)
14
+ expect(NoEscape(value)).toBe(value)
15
+ expect(EscapeToResultNonString(value)).toBe(value)
16
+ expect(EscapeNonString(value)).toBeUndefined()
17
+ })
18
+ })
@@ -26,6 +26,20 @@ export class IntArgRegBitmap {
26
26
  }
27
27
  }
28
28
 
29
+ export function NoEscape<T>(p: T): T {
30
+ return p
31
+ }
32
+
33
+ export function Escape<T>(x: T): T {
34
+ return x
35
+ }
36
+
37
+ export function EscapeNonString<T>(_v: T): void {}
38
+
39
+ export function EscapeToResultNonString<T>(v: T): T {
40
+ return v
41
+ }
42
+
29
43
  // FuncPCABI0 returns the entry PC of the function f for ABI0
30
44
  export function FuncPCABI0(_f: any): number {
31
45
  return 0 // Placeholder
@@ -0,0 +1,18 @@
1
+ import { describe, expect, test } from 'vitest'
2
+
3
+ import { CountString, IndexByteString, LastIndexByteString } from './index.js'
4
+
5
+ describe('internal/bytealg string byte indexes', () => {
6
+ test('finds first and last byte positions in strings', () => {
7
+ expect(IndexByteString('hello', 'l'.charCodeAt(0))).toBe(2)
8
+ expect(LastIndexByteString('hello', 'l'.charCodeAt(0))).toBe(3)
9
+ expect(LastIndexByteString('hello', 'x'.charCodeAt(0))).toBe(-1)
10
+ expect(LastIndexByteString('', 'x'.charCodeAt(0))).toBe(-1)
11
+ })
12
+
13
+ test('counts byte positions in strings', () => {
14
+ expect(CountString('hello', 'l'.charCodeAt(0))).toBe(2)
15
+ expect(CountString('hello', 'x'.charCodeAt(0))).toBe(0)
16
+ expect(CountString('', 'x'.charCodeAt(0))).toBe(0)
17
+ })
18
+ })
@@ -131,6 +131,22 @@ export function IndexByteString(s: string, b: number): number {
131
131
  return s.indexOf(char)
132
132
  }
133
133
 
134
+ export function LastIndexByteString(s: string, b: number): number {
135
+ const char = String.fromCharCode(b)
136
+ return s.lastIndexOf(char)
137
+ }
138
+
139
+ export function CountString(s: string, b: number): number {
140
+ const char = String.fromCharCode(b)
141
+ let count = 0
142
+ for (let i = 0; i < s.length; i++) {
143
+ if (s[i] === char) {
144
+ count++
145
+ }
146
+ }
147
+ return count
148
+ }
149
+
134
150
  export function IndexString(s: string, substr: string): number {
135
151
  return s.indexOf(substr)
136
152
  }
@@ -0,0 +1,39 @@
1
+ import { describe, expect, test } from 'vitest'
2
+
3
+ import {
4
+ BEAppendUint64,
5
+ BEPutUint64,
6
+ BEUint64,
7
+ LEAppendUint64,
8
+ LEPutUint64,
9
+ LEUint64,
10
+ } from './index.js'
11
+
12
+ describe('internal/byteorder uint64', () => {
13
+ test('reads and writes big-endian bigint values', () => {
14
+ const bytes = new Uint8Array(8)
15
+
16
+ BEPutUint64(bytes, 0x0102030405060708n)
17
+
18
+ expect(Array.from(bytes)).toEqual([1, 2, 3, 4, 5, 6, 7, 8])
19
+ expect(BEUint64(bytes)).toBe(Number(0x0102030405060708n))
20
+ })
21
+
22
+ test('reads and writes little-endian bigint values', () => {
23
+ const bytes = new Uint8Array(8)
24
+
25
+ LEPutUint64(bytes, 0x0102030405060708n)
26
+
27
+ expect(Array.from(bytes)).toEqual([8, 7, 6, 5, 4, 3, 2, 1])
28
+ expect(LEUint64(bytes)).toBe(Number(0x0102030405060708n))
29
+ })
30
+
31
+ test('appends uint64 values', () => {
32
+ expect(Array.from(BEAppendUint64(new Uint8Array([0xaa]), 0x0102n))).toEqual([
33
+ 0xaa, 0, 0, 0, 0, 0, 0, 1, 2,
34
+ ])
35
+ expect(Array.from(LEAppendUint64(new Uint8Array([0xaa]), 0x0102n))).toEqual([
36
+ 0xaa, 2, 1, 0, 0, 0, 0, 0, 0,
37
+ ])
38
+ })
39
+ })