@soundscript/soundscript 0.1.13 → 0.1.15

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 (441) hide show
  1. package/package.json +15 -6
  2. package/project-transform/index.js +2 -0
  3. package/project-transform/index.ts +8 -0
  4. package/project-transform/src/annotation_syntax.js +948 -0
  5. package/project-transform/src/annotation_syntax.ts +1217 -0
  6. package/project-transform/src/build_package.js +475 -0
  7. package/project-transform/src/build_package.ts +683 -0
  8. package/project-transform/src/bundled/portable-web-globals.d.ts +153 -0
  9. package/project-transform/src/bundled/runtime_externs.js +220 -0
  10. package/project-transform/src/bundled/runtime_externs.ts +237 -0
  11. package/project-transform/src/bundled/sound-libs/lib.decorators.d.ts +385 -0
  12. package/project-transform/src/bundled/sound-libs/lib.decorators.legacy.d.ts +22 -0
  13. package/project-transform/src/bundled/sound-libs/lib.dom.asynciterable.d.ts +42 -0
  14. package/project-transform/src/bundled/sound-libs/lib.dom.d.ts +39440 -0
  15. package/project-transform/src/bundled/sound-libs/lib.es2015.collection.d.ts +149 -0
  16. package/project-transform/src/bundled/sound-libs/lib.es2015.core.d.ts +657 -0
  17. package/project-transform/src/bundled/sound-libs/lib.es2015.d.ts +28 -0
  18. package/project-transform/src/bundled/sound-libs/lib.es2015.generator.d.ts +77 -0
  19. package/project-transform/src/bundled/sound-libs/lib.es2015.iterable.d.ts +616 -0
  20. package/project-transform/src/bundled/sound-libs/lib.es2015.promise.d.ts +80 -0
  21. package/project-transform/src/bundled/sound-libs/lib.es2015.proxy.d.ts +128 -0
  22. package/project-transform/src/bundled/sound-libs/lib.es2015.reflect.d.ts +144 -0
  23. package/project-transform/src/bundled/sound-libs/lib.es2015.symbol.d.ts +46 -0
  24. package/project-transform/src/bundled/sound-libs/lib.es2015.symbol.wellknown.d.ts +170 -0
  25. package/project-transform/src/bundled/sound-libs/lib.es2016.array.include.d.ts +116 -0
  26. package/project-transform/src/bundled/sound-libs/lib.es2016.d.ts +21 -0
  27. package/project-transform/src/bundled/sound-libs/lib.es2017.arraybuffer.d.ts +21 -0
  28. package/project-transform/src/bundled/sound-libs/lib.es2017.d.ts +26 -0
  29. package/project-transform/src/bundled/sound-libs/lib.es2017.date.d.ts +31 -0
  30. package/project-transform/src/bundled/sound-libs/lib.es2017.object.d.ts +49 -0
  31. package/project-transform/src/bundled/sound-libs/lib.es2017.string.d.ts +45 -0
  32. package/project-transform/src/bundled/sound-libs/lib.es2017.typedarrays.d.ts +53 -0
  33. package/project-transform/src/bundled/sound-libs/lib.es2018.asyncgenerator.d.ts +77 -0
  34. package/project-transform/src/bundled/sound-libs/lib.es2018.asynciterable.d.ts +57 -0
  35. package/project-transform/src/bundled/sound-libs/lib.es2018.d.ts +24 -0
  36. package/project-transform/src/bundled/sound-libs/lib.es2018.promise.d.ts +30 -0
  37. package/project-transform/src/bundled/sound-libs/lib.es2018.regexp.d.ts +37 -0
  38. package/project-transform/src/bundled/sound-libs/lib.es2019.array.d.ts +79 -0
  39. package/project-transform/src/bundled/sound-libs/lib.es2019.d.ts +24 -0
  40. package/project-transform/src/bundled/sound-libs/lib.es2019.object.d.ts +47 -0
  41. package/project-transform/src/bundled/sound-libs/lib.es2019.string.d.ts +37 -0
  42. package/project-transform/src/bundled/sound-libs/lib.es2019.symbol.d.ts +24 -0
  43. package/project-transform/src/bundled/sound-libs/lib.es2020.bigint.d.ts +765 -0
  44. package/project-transform/src/bundled/sound-libs/lib.es2020.d.ts +27 -0
  45. package/project-transform/src/bundled/sound-libs/lib.es2020.date.d.ts +42 -0
  46. package/project-transform/src/bundled/sound-libs/lib.es2020.number.d.ts +28 -0
  47. package/project-transform/src/bundled/sound-libs/lib.es2020.promise.d.ts +49 -0
  48. package/project-transform/src/bundled/sound-libs/lib.es2020.string.d.ts +44 -0
  49. package/project-transform/src/bundled/sound-libs/lib.es2020.symbol.wellknown.d.ts +41 -0
  50. package/project-transform/src/bundled/sound-libs/lib.es2021.d.ts +23 -0
  51. package/project-transform/src/bundled/sound-libs/lib.es2021.promise.d.ts +48 -0
  52. package/project-transform/src/bundled/sound-libs/lib.es2021.string.d.ts +33 -0
  53. package/project-transform/src/bundled/sound-libs/lib.es2021.weakref.d.ts +78 -0
  54. package/project-transform/src/bundled/sound-libs/lib.es2022.array.d.ts +121 -0
  55. package/project-transform/src/bundled/sound-libs/lib.es2022.d.ts +25 -0
  56. package/project-transform/src/bundled/sound-libs/lib.es2022.error.d.ts +75 -0
  57. package/project-transform/src/bundled/sound-libs/lib.es2022.object.d.ts +26 -0
  58. package/project-transform/src/bundled/sound-libs/lib.es2022.regexp.d.ts +39 -0
  59. package/project-transform/src/bundled/sound-libs/lib.es2022.string.d.ts +25 -0
  60. package/project-transform/src/bundled/sound-libs/lib.es2023.array.d.ts +924 -0
  61. package/project-transform/src/bundled/sound-libs/lib.es2023.collection.d.ts +21 -0
  62. package/project-transform/src/bundled/sound-libs/lib.es2023.d.ts +22 -0
  63. package/project-transform/src/bundled/sound-libs/lib.es2024.arraybuffer.d.ts +65 -0
  64. package/project-transform/src/bundled/sound-libs/lib.es2024.collection.d.ts +29 -0
  65. package/project-transform/src/bundled/sound-libs/lib.es2024.d.ts +26 -0
  66. package/project-transform/src/bundled/sound-libs/lib.es2024.object.d.ts +33 -0
  67. package/project-transform/src/bundled/sound-libs/lib.es2024.promise.d.ts +35 -0
  68. package/project-transform/src/bundled/sound-libs/lib.es2024.regexp.d.ts +25 -0
  69. package/project-transform/src/bundled/sound-libs/lib.es2024.string.d.ts +29 -0
  70. package/project-transform/src/bundled/sound-libs/lib.es5.d.ts +4924 -0
  71. package/project-transform/src/bundled/sound_stdlib.js +142 -0
  72. package/project-transform/src/bundled/sound_stdlib.ts +180 -0
  73. package/project-transform/src/checker/analyze_project.js +1361 -0
  74. package/project-transform/src/checker/analyze_project.ts +2246 -0
  75. package/project-transform/src/checker/diagnostics.js +112 -0
  76. package/project-transform/src/checker/diagnostics.ts +222 -0
  77. package/project-transform/src/checker/engine/context.js +235 -0
  78. package/project-transform/src/checker/engine/context.ts +340 -0
  79. package/project-transform/src/checker/engine/diagnostic_codes.js +72 -0
  80. package/project-transform/src/checker/engine/diagnostic_codes.ts +95 -0
  81. package/project-transform/src/checker/engine/facts.js +35 -0
  82. package/project-transform/src/checker/engine/facts.ts +48 -0
  83. package/project-transform/src/checker/engine/types.js +1 -0
  84. package/project-transform/src/checker/engine/types.ts +485 -0
  85. package/project-transform/src/checker/proof_escape_hatch_diagnostics.js +104 -0
  86. package/project-transform/src/checker/proof_escape_hatch_diagnostics.ts +173 -0
  87. package/project-transform/src/checker/rules/async_surface.js +231 -0
  88. package/project-transform/src/checker/rules/async_surface.ts +335 -0
  89. package/project-transform/src/checker/rules/class_lifecycle.js +798 -0
  90. package/project-transform/src/checker/rules/class_lifecycle.ts +1276 -0
  91. package/project-transform/src/checker/rules/directive_validation.js +571 -0
  92. package/project-transform/src/checker/rules/directive_validation.ts +938 -0
  93. package/project-transform/src/checker/rules/directives.js +23 -0
  94. package/project-transform/src/checker/rules/directives.ts +25 -0
  95. package/project-transform/src/checker/rules/flow.js +202 -0
  96. package/project-transform/src/checker/rules/flow.ts +333 -0
  97. package/project-transform/src/checker/rules/flow_facts.js +601 -0
  98. package/project-transform/src/checker/rules/flow_facts.ts +978 -0
  99. package/project-transform/src/checker/rules/flow_invalidation.js +1119 -0
  100. package/project-transform/src/checker/rules/flow_invalidation.ts +2150 -0
  101. package/project-transform/src/checker/rules/flow_shared.js +2822 -0
  102. package/project-transform/src/checker/rules/flow_shared.ts +4383 -0
  103. package/project-transform/src/checker/rules/foreign_boundary.js +120 -0
  104. package/project-transform/src/checker/rules/foreign_boundary.ts +196 -0
  105. package/project-transform/src/checker/rules/foreign_projection.js +279 -0
  106. package/project-transform/src/checker/rules/foreign_projection.ts +425 -0
  107. package/project-transform/src/checker/rules/generated_helpers.js +13 -0
  108. package/project-transform/src/checker/rules/generated_helpers.ts +18 -0
  109. package/project-transform/src/checker/rules/index.js +35 -0
  110. package/project-transform/src/checker/rules/index.ts +49 -0
  111. package/project-transform/src/checker/rules/namespace_object.js +845 -0
  112. package/project-transform/src/checker/rules/namespace_object.ts +1224 -0
  113. package/project-transform/src/checker/rules/non_ordinary_recovery.js +1328 -0
  114. package/project-transform/src/checker/rules/non_ordinary_recovery.ts +2391 -0
  115. package/project-transform/src/checker/rules/null_prototype.js +3 -0
  116. package/project-transform/src/checker/rules/null_prototype.ts +6 -0
  117. package/project-transform/src/checker/rules/overloads.js +181 -0
  118. package/project-transform/src/checker/rules/overloads.ts +317 -0
  119. package/project-transform/src/checker/rules/predicate_verification.js +691 -0
  120. package/project-transform/src/checker/rules/predicate_verification.ts +1088 -0
  121. package/project-transform/src/checker/rules/prototype_hardening.js +237 -0
  122. package/project-transform/src/checker/rules/prototype_hardening.ts +343 -0
  123. package/project-transform/src/checker/rules/receiver_discipline.js +263 -0
  124. package/project-transform/src/checker/rules/receiver_discipline.ts +356 -0
  125. package/project-transform/src/checker/rules/relations.js +6861 -0
  126. package/project-transform/src/checker/rules/relations.ts +12158 -0
  127. package/project-transform/src/checker/rules/resolved_builtins.js +274 -0
  128. package/project-transform/src/checker/rules/resolved_builtins.ts +438 -0
  129. package/project-transform/src/checker/rules/trust.js +217 -0
  130. package/project-transform/src/checker/rules/trust.ts +301 -0
  131. package/project-transform/src/checker/rules/type_guards.js +173 -0
  132. package/project-transform/src/checker/rules/type_guards.ts +257 -0
  133. package/project-transform/src/checker/rules/universal.js +17 -0
  134. package/project-transform/src/checker/rules/universal.ts +22 -0
  135. package/project-transform/src/checker/rules/unsafe_value_origin.js +80 -0
  136. package/project-transform/src/checker/rules/unsafe_value_origin.ts +125 -0
  137. package/project-transform/src/checker/rules/unsound_imports.js +218 -0
  138. package/project-transform/src/checker/rules/unsound_imports.ts +301 -0
  139. package/project-transform/src/checker/rules/unsound_syntax.js +1695 -0
  140. package/project-transform/src/checker/rules/unsound_syntax.ts +2540 -0
  141. package/project-transform/src/checker/rules/value_types.js +206 -0
  142. package/project-transform/src/checker/rules/value_types.ts +407 -0
  143. package/project-transform/src/checker/timing.js +43 -0
  144. package/project-transform/src/checker/timing.ts +78 -0
  145. package/project-transform/src/checker/unsupported_feature_messages.js +337 -0
  146. package/project-transform/src/checker/unsupported_feature_messages.ts +531 -0
  147. package/project-transform/src/cli.js +892 -0
  148. package/project-transform/src/cli.ts +1476 -0
  149. package/project-transform/src/compiler/compile_project.js +319 -0
  150. package/project-transform/src/compiler/compile_project.ts +508 -0
  151. package/project-transform/src/compiler/errors.js +10 -0
  152. package/project-transform/src/compiler/errors.ts +29 -0
  153. package/project-transform/src/compiler/ir.js +1 -0
  154. package/project-transform/src/compiler/ir.ts +1526 -0
  155. package/project-transform/src/compiler/lower.js +30550 -0
  156. package/project-transform/src/compiler/lower.ts +43645 -0
  157. package/project-transform/src/compiler/lower_arrays.js +140 -0
  158. package/project-transform/src/compiler/lower_arrays.ts +190 -0
  159. package/project-transform/src/compiler/lower_strings.js +121 -0
  160. package/project-transform/src/compiler/lower_strings.ts +198 -0
  161. package/project-transform/src/compiler/lower_tagged.js +329 -0
  162. package/project-transform/src/compiler/lower_tagged.ts +427 -0
  163. package/project-transform/src/compiler/lower_views.js +171 -0
  164. package/project-transform/src/compiler/lower_views.ts +251 -0
  165. package/project-transform/src/compiler/object_keys.js +25 -0
  166. package/project-transform/src/compiler/object_keys.ts +35 -0
  167. package/project-transform/src/compiler/runtime_ir.js +30 -0
  168. package/project-transform/src/compiler/runtime_ir.ts +727 -0
  169. package/project-transform/src/compiler/tagged_boundary.js +18 -0
  170. package/project-transform/src/compiler/tagged_boundary.ts +37 -0
  171. package/project-transform/src/compiler/toolchain.js +170 -0
  172. package/project-transform/src/compiler/toolchain.ts +229 -0
  173. package/project-transform/src/compiler/unicode_case_data.js +2102 -0
  174. package/project-transform/src/compiler/unicode_case_data.ts +2112 -0
  175. package/project-transform/src/compiler/wasm_js_host_runtime.js +656 -0
  176. package/project-transform/src/compiler/wasm_js_host_runtime.ts +762 -0
  177. package/project-transform/src/compiler/wat_arrays.js +3132 -0
  178. package/project-transform/src/compiler/wat_arrays.ts +3768 -0
  179. package/project-transform/src/compiler/wat_emitter.js +17952 -0
  180. package/project-transform/src/compiler/wat_emitter.ts +22812 -0
  181. package/project-transform/src/compiler/wat_strings.js +129 -0
  182. package/project-transform/src/compiler/wat_strings.ts +187 -0
  183. package/project-transform/src/compiler/wat_tagged.js +548 -0
  184. package/project-transform/src/compiler/wat_tagged.ts +674 -0
  185. package/project-transform/src/compiler_generator_runner.js +153 -0
  186. package/project-transform/src/compiler_generator_runner.ts +171 -0
  187. package/project-transform/src/compiler_object_test_helpers.js +69 -0
  188. package/project-transform/src/compiler_object_test_helpers.ts +96 -0
  189. package/project-transform/src/compiler_promise_runner.js +2116 -0
  190. package/project-transform/src/compiler_promise_runner.ts +2184 -0
  191. package/project-transform/src/compiler_test_helpers.js +854 -0
  192. package/project-transform/src/compiler_test_helpers.ts +1087 -0
  193. package/project-transform/src/config.js +568 -0
  194. package/project-transform/src/config.ts +892 -0
  195. package/project-transform/src/diagnostic_metadata.js +67 -0
  196. package/project-transform/src/diagnostic_metadata.ts +99 -0
  197. package/project-transform/src/diagnostic_reference.js +1368 -0
  198. package/project-transform/src/diagnostic_reference.ts +1523 -0
  199. package/project-transform/src/editor_diagnostics_worker.js +176 -0
  200. package/project-transform/src/editor_diagnostics_worker.ts +250 -0
  201. package/project-transform/src/editor_projection.js +224 -0
  202. package/project-transform/src/editor_projection.ts +421 -0
  203. package/project-transform/src/frontend/builtin_expanded_program_test_cleanup.js +47 -0
  204. package/project-transform/src/frontend/builtin_expanded_program_test_cleanup.ts +72 -0
  205. package/project-transform/src/frontend/builtin_macro_support.js +842 -0
  206. package/project-transform/src/frontend/builtin_macro_support.ts +1386 -0
  207. package/project-transform/src/frontend/builtin_macros.js +409 -0
  208. package/project-transform/src/frontend/builtin_macros.ts +542 -0
  209. package/project-transform/src/frontend/component_poc_runtime.js +279 -0
  210. package/project-transform/src/frontend/component_poc_runtime.ts +372 -0
  211. package/project-transform/src/frontend/css_macro.js +148 -0
  212. package/project-transform/src/frontend/css_macro.ts +222 -0
  213. package/project-transform/src/frontend/derive_macros.js +2072 -0
  214. package/project-transform/src/frontend/derive_macros.ts +3188 -0
  215. package/project-transform/src/frontend/embedded_fragment_support.js +106 -0
  216. package/project-transform/src/frontend/embedded_fragment_support.ts +172 -0
  217. package/project-transform/src/frontend/error_normalization.js +403 -0
  218. package/project-transform/src/frontend/error_normalization.ts +832 -0
  219. package/project-transform/src/frontend/error_stdlib_support.js +1 -0
  220. package/project-transform/src/frontend/error_stdlib_support.ts +6 -0
  221. package/project-transform/src/frontend/expand_project.js +169 -0
  222. package/project-transform/src/frontend/expand_project.ts +248 -0
  223. package/project-transform/src/frontend/format_soundscript.js +297 -0
  224. package/project-transform/src/frontend/format_soundscript.ts +582 -0
  225. package/project-transform/src/frontend/graphql_macro.js +174 -0
  226. package/project-transform/src/frontend/graphql_macro.ts +253 -0
  227. package/project-transform/src/frontend/hash_context.js +83 -0
  228. package/project-transform/src/frontend/hash_context.ts +113 -0
  229. package/project-transform/src/frontend/hkt_macro.js +448 -0
  230. package/project-transform/src/frontend/hkt_macro.ts +897 -0
  231. package/project-transform/src/frontend/import_binding_usage.js +190 -0
  232. package/project-transform/src/frontend/import_binding_usage.ts +277 -0
  233. package/project-transform/src/frontend/macro_advanced_backend_adapter.js +58 -0
  234. package/project-transform/src/frontend/macro_advanced_backend_adapter.ts +123 -0
  235. package/project-transform/src/frontend/macro_advanced_context.js +826 -0
  236. package/project-transform/src/frontend/macro_advanced_context.ts +1102 -0
  237. package/project-transform/src/frontend/macro_advanced_output.js +21 -0
  238. package/project-transform/src/frontend/macro_advanced_output.ts +41 -0
  239. package/project-transform/src/frontend/macro_api.js +353 -0
  240. package/project-transform/src/frontend/macro_api.ts +1722 -0
  241. package/project-transform/src/frontend/macro_api_internal.js +35 -0
  242. package/project-transform/src/frontend/macro_api_internal.ts +80 -0
  243. package/project-transform/src/frontend/macro_api_module_support.js +39 -0
  244. package/project-transform/src/frontend/macro_api_module_support.ts +65 -0
  245. package/project-transform/src/frontend/macro_backend_adapter.js +272 -0
  246. package/project-transform/src/frontend/macro_backend_adapter.ts +420 -0
  247. package/project-transform/src/frontend/macro_context.js +816 -0
  248. package/project-transform/src/frontend/macro_context.ts +1105 -0
  249. package/project-transform/src/frontend/macro_debug.js +99 -0
  250. package/project-transform/src/frontend/macro_debug.ts +157 -0
  251. package/project-transform/src/frontend/macro_definition_support.js +28 -0
  252. package/project-transform/src/frontend/macro_definition_support.ts +73 -0
  253. package/project-transform/src/frontend/macro_errors.js +40 -0
  254. package/project-transform/src/frontend/macro_errors.ts +70 -0
  255. package/project-transform/src/frontend/macro_expander.js +919 -0
  256. package/project-transform/src/frontend/macro_expander.ts +1611 -0
  257. package/project-transform/src/frontend/macro_factory_support.js +176 -0
  258. package/project-transform/src/frontend/macro_factory_support.ts +263 -0
  259. package/project-transform/src/frontend/macro_host_ast_internal.js +64 -0
  260. package/project-transform/src/frontend/macro_host_ast_internal.ts +109 -0
  261. package/project-transform/src/frontend/macro_index.js +27 -0
  262. package/project-transform/src/frontend/macro_index.ts +50 -0
  263. package/project-transform/src/frontend/macro_loader.js +281 -0
  264. package/project-transform/src/frontend/macro_loader.ts +506 -0
  265. package/project-transform/src/frontend/macro_operand_semantics.js +838 -0
  266. package/project-transform/src/frontend/macro_operand_semantics.ts +1489 -0
  267. package/project-transform/src/frontend/macro_output.js +54 -0
  268. package/project-transform/src/frontend/macro_output.ts +123 -0
  269. package/project-transform/src/frontend/macro_parser.js +611 -0
  270. package/project-transform/src/frontend/macro_parser.ts +832 -0
  271. package/project-transform/src/frontend/macro_resolver.js +69 -0
  272. package/project-transform/src/frontend/macro_resolver.ts +125 -0
  273. package/project-transform/src/frontend/macro_rewrite.js +285 -0
  274. package/project-transform/src/frontend/macro_rewrite.ts +442 -0
  275. package/project-transform/src/frontend/macro_runtime_support.js +232 -0
  276. package/project-transform/src/frontend/macro_runtime_support.ts +324 -0
  277. package/project-transform/src/frontend/macro_scanner.js +393 -0
  278. package/project-transform/src/frontend/macro_scanner.ts +455 -0
  279. package/project-transform/src/frontend/macro_semantic_backend_adapter.js +87 -0
  280. package/project-transform/src/frontend/macro_semantic_backend_adapter.ts +166 -0
  281. package/project-transform/src/frontend/macro_semantic_context.js +5 -0
  282. package/project-transform/src/frontend/macro_semantic_context.ts +12 -0
  283. package/project-transform/src/frontend/macro_semantic_output.js +24 -0
  284. package/project-transform/src/frontend/macro_semantic_output.ts +47 -0
  285. package/project-transform/src/frontend/macro_semantic_types.js +1 -0
  286. package/project-transform/src/frontend/macro_semantic_types.ts +98 -0
  287. package/project-transform/src/frontend/macro_semantics.js +1172 -0
  288. package/project-transform/src/frontend/macro_semantics.ts +1502 -0
  289. package/project-transform/src/frontend/macro_site_kind_support.js +164 -0
  290. package/project-transform/src/frontend/macro_site_kind_support.ts +255 -0
  291. package/project-transform/src/frontend/macro_syntax_internal.js +1950 -0
  292. package/project-transform/src/frontend/macro_syntax_internal.ts +3338 -0
  293. package/project-transform/src/frontend/macro_templates.js +57 -0
  294. package/project-transform/src/frontend/macro_templates.ts +143 -0
  295. package/project-transform/src/frontend/macro_test_helpers.js +82 -0
  296. package/project-transform/src/frontend/macro_test_helpers.ts +136 -0
  297. package/project-transform/src/frontend/macro_types.js +1 -0
  298. package/project-transform/src/frontend/macro_types.ts +103 -0
  299. package/project-transform/src/frontend/macro_vm.js +39 -0
  300. package/project-transform/src/frontend/macro_vm.ts +113 -0
  301. package/project-transform/src/frontend/match_macro.js +885 -0
  302. package/project-transform/src/frontend/match_macro.ts +1220 -0
  303. package/project-transform/src/frontend/numeric_normalization.js +824 -0
  304. package/project-transform/src/frontend/numeric_normalization.ts +1380 -0
  305. package/project-transform/src/frontend/numeric_prelude.js +278 -0
  306. package/project-transform/src/frontend/numeric_prelude.ts +370 -0
  307. package/project-transform/src/frontend/project_frontend.js +2396 -0
  308. package/project-transform/src/frontend/project_frontend.ts +3776 -0
  309. package/project-transform/src/frontend/project_macro_support.js +1401 -0
  310. package/project-transform/src/frontend/project_macro_support.ts +2137 -0
  311. package/project-transform/src/frontend/sql_macro.js +175 -0
  312. package/project-transform/src/frontend/sql_macro.ts +254 -0
  313. package/project-transform/src/frontend/sql_stdlib_support.js +1 -0
  314. package/project-transform/src/frontend/sql_stdlib_support.ts +6 -0
  315. package/project-transform/src/frontend/std_package_support.js +228 -0
  316. package/project-transform/src/frontend/std_package_support.ts +400 -0
  317. package/project-transform/src/frontend/value_normalization.js +306 -0
  318. package/project-transform/src/frontend/value_normalization.ts +599 -0
  319. package/project-transform/src/lsp/project_service.js +4771 -0
  320. package/project-transform/src/lsp/project_service.ts +7580 -0
  321. package/project-transform/src/lsp/protocol.js +9 -0
  322. package/project-transform/src/lsp/protocol.ts +38 -0
  323. package/project-transform/src/lsp/server.js +355 -0
  324. package/project-transform/src/lsp/server.ts +671 -0
  325. package/project-transform/src/lsp/session.js +49 -0
  326. package/project-transform/src/lsp/session.ts +48 -0
  327. package/project-transform/src/lsp/timing.js +43 -0
  328. package/project-transform/src/lsp/timing.ts +76 -0
  329. package/project-transform/src/lsp/transport.js +205 -0
  330. package/project-transform/src/lsp/transport.ts +253 -0
  331. package/project-transform/src/lsp_main.js +5 -0
  332. package/project-transform/src/lsp_main.ts +7 -0
  333. package/project-transform/src/macros.d.ts +1 -0
  334. package/project-transform/src/macros.js +1 -0
  335. package/project-transform/src/macros.ts +1 -0
  336. package/project-transform/src/main.js +24 -0
  337. package/project-transform/src/main.ts +28 -0
  338. package/project-transform/src/platform/host.js +264 -0
  339. package/project-transform/src/platform/host.ts +343 -0
  340. package/project-transform/src/platform/path.js +8 -0
  341. package/project-transform/src/platform/path.ts +20 -0
  342. package/project-transform/src/public_macro_api/macro_api.d.ts +1054 -0
  343. package/project-transform/src/public_macro_api/macro_semantic_types.d.ts +66 -0
  344. package/project-transform/src/public_macro_api/macro_types.d.ts +70 -0
  345. package/project-transform/src/run_program.js +14 -0
  346. package/project-transform/src/run_program.ts +33 -0
  347. package/project-transform/src/runtime/materialize.js +371 -0
  348. package/project-transform/src/runtime/materialize.ts +502 -0
  349. package/project-transform/src/runtime/on_demand.js +203 -0
  350. package/project-transform/src/runtime/on_demand.ts +305 -0
  351. package/project-transform/src/runtime/source_maps.js +205 -0
  352. package/project-transform/src/runtime/source_maps.ts +297 -0
  353. package/project-transform/src/runtime/transform.js +148 -0
  354. package/project-transform/src/runtime/transform.ts +295 -0
  355. package/project-transform/src/service/types.js +1 -0
  356. package/project-transform/src/service/types.ts +22 -0
  357. package/project-transform/src/soundscript_packages.js +477 -0
  358. package/project-transform/src/soundscript_packages.ts +754 -0
  359. package/project-transform/src/soundscript_runtime_specifiers.js +88 -0
  360. package/project-transform/src/soundscript_runtime_specifiers.ts +96 -0
  361. package/project-transform/src/stdlib/async.d.ts +81 -0
  362. package/project-transform/src/stdlib/async.js +213 -0
  363. package/project-transform/src/stdlib/async.ts +315 -0
  364. package/project-transform/src/stdlib/codec.d.ts +32 -0
  365. package/project-transform/src/stdlib/codec.js +30 -0
  366. package/project-transform/src/stdlib/codec.ts +76 -0
  367. package/project-transform/src/stdlib/compare.d.ts +28 -0
  368. package/project-transform/src/stdlib/compare.js +115 -0
  369. package/project-transform/src/stdlib/compare.ts +151 -0
  370. package/project-transform/src/stdlib/css.d.ts +16 -0
  371. package/project-transform/src/stdlib/css.js +9 -0
  372. package/project-transform/src/stdlib/css.ts +28 -0
  373. package/project-transform/src/stdlib/debug.d.ts +2 -0
  374. package/project-transform/src/stdlib/debug.js +9 -0
  375. package/project-transform/src/stdlib/debug.ts +10 -0
  376. package/project-transform/src/stdlib/decode.d.ts +86 -0
  377. package/project-transform/src/stdlib/decode.js +254 -0
  378. package/project-transform/src/stdlib/decode.ts +390 -0
  379. package/project-transform/src/stdlib/derive.d.ts +6 -0
  380. package/project-transform/src/stdlib/derive.js +7 -0
  381. package/project-transform/src/stdlib/derive.ts +7 -0
  382. package/project-transform/src/stdlib/encode.d.ts +100 -0
  383. package/project-transform/src/stdlib/encode.js +130 -0
  384. package/project-transform/src/stdlib/encode.ts +259 -0
  385. package/project-transform/src/stdlib/failures.d.ts +23 -0
  386. package/project-transform/src/stdlib/failures.js +41 -0
  387. package/project-transform/src/stdlib/failures.ts +64 -0
  388. package/project-transform/src/stdlib/fetch.d.ts +67 -0
  389. package/project-transform/src/stdlib/fetch.js +5 -0
  390. package/project-transform/src/stdlib/fetch.ts +11 -0
  391. package/project-transform/src/stdlib/graphql.d.ts +16 -0
  392. package/project-transform/src/stdlib/graphql.js +9 -0
  393. package/project-transform/src/stdlib/graphql.ts +28 -0
  394. package/project-transform/src/stdlib/hash.d.ts +34 -0
  395. package/project-transform/src/stdlib/hash.js +110 -0
  396. package/project-transform/src/stdlib/hash.ts +188 -0
  397. package/project-transform/src/stdlib/hkt.d.ts +40 -0
  398. package/project-transform/src/stdlib/hkt.js +3 -0
  399. package/project-transform/src/stdlib/hkt.ts +41 -0
  400. package/project-transform/src/stdlib/index.d.ts +9 -0
  401. package/project-transform/src/stdlib/index.js +15 -0
  402. package/project-transform/src/stdlib/index.ts +23 -0
  403. package/project-transform/src/stdlib/json.d.ts +125 -0
  404. package/project-transform/src/stdlib/json.js +764 -0
  405. package/project-transform/src/stdlib/json.ts +1034 -0
  406. package/project-transform/src/stdlib/match.d.ts +11 -0
  407. package/project-transform/src/stdlib/match.js +13 -0
  408. package/project-transform/src/stdlib/match.ts +26 -0
  409. package/project-transform/src/stdlib/numerics.d.ts +523 -0
  410. package/project-transform/src/stdlib/numerics.js +1356 -0
  411. package/project-transform/src/stdlib/numerics.ts +1937 -0
  412. package/project-transform/src/stdlib/random.d.ts +19 -0
  413. package/project-transform/src/stdlib/random.js +3 -0
  414. package/project-transform/src/stdlib/random.ts +5 -0
  415. package/project-transform/src/stdlib/result.d.ts +68 -0
  416. package/project-transform/src/stdlib/result.js +139 -0
  417. package/project-transform/src/stdlib/result.ts +248 -0
  418. package/project-transform/src/stdlib/sql.d.ts +22 -0
  419. package/project-transform/src/stdlib/sql.js +23 -0
  420. package/project-transform/src/stdlib/sql.ts +53 -0
  421. package/project-transform/src/stdlib/text.d.ts +24 -0
  422. package/project-transform/src/stdlib/text.js +3 -0
  423. package/project-transform/src/stdlib/text.ts +4 -0
  424. package/project-transform/src/stdlib/thunk.d.ts +2 -0
  425. package/project-transform/src/stdlib/thunk.js +9 -0
  426. package/project-transform/src/stdlib/thunk.ts +15 -0
  427. package/project-transform/src/stdlib/typeclasses.d.ts +57 -0
  428. package/project-transform/src/stdlib/typeclasses.js +78 -0
  429. package/project-transform/src/stdlib/typeclasses.ts +173 -0
  430. package/project-transform/src/stdlib/url.d.ts +37 -0
  431. package/project-transform/src/stdlib/url.js +3 -0
  432. package/project-transform/src/stdlib/url.ts +4 -0
  433. package/project-transform/src/stdlib/value.d.ts +9 -0
  434. package/project-transform/src/stdlib/value.js +104 -0
  435. package/project-transform/src/stdlib/value.ts +133 -0
  436. package/project-transform/src/test_installed_stdlib.js +147 -0
  437. package/project-transform/src/test_installed_stdlib.ts +245 -0
  438. package/project-transform/src/test_macro_package_fixture.js +50 -0
  439. package/project-transform/src/test_macro_package_fixture.ts +68 -0
  440. package/project-transform/src/value_deep_safe.js +191 -0
  441. package/project-transform/src/value_deep_safe.ts +273 -0
@@ -0,0 +1,824 @@
1
+ import ts from 'typescript';
2
+ import { buildRewriteStageFromTexts } from './error_normalization.js';
3
+ import { isSoundscriptSourceFile, toSourceFileName, } from './project_frontend.js';
4
+ const MACHINE_NUMERIC_CONSTRUCTOR_BY_LEAF = new Map([
5
+ ['f64', 'F64'],
6
+ ['f32', 'F32'],
7
+ ['i8', 'I8'],
8
+ ['i16', 'I16'],
9
+ ['i32', 'I32'],
10
+ ['i64', 'I64'],
11
+ ['u8', 'U8'],
12
+ ['u16', 'U16'],
13
+ ['u32', 'U32'],
14
+ ['u64', 'U64'],
15
+ ]);
16
+ const MACHINE_NUMERIC_BINARY_HELPER = '__numericBinary';
17
+ const MACHINE_NUMERIC_UNARY_HELPER = '__numericUnary';
18
+ const MACHINE_NUMERIC_WASM_LEAF_HELPER = '__numericWasmLeaf';
19
+ const MACHINE_NUMERIC_LEAF_NAMES = new Set(MACHINE_NUMERIC_CONSTRUCTOR_BY_LEAF.keys());
20
+ const ABSTRACT_NUMERIC_FAMILY_NAMES = new Set(['Numeric', 'Int', 'Float']);
21
+ const SORT_METHOD_OWNER_NAMES = new Set([
22
+ 'Array',
23
+ 'ReadonlyArray',
24
+ 'Int8Array',
25
+ 'Uint8Array',
26
+ 'Uint8ClampedArray',
27
+ 'Int16Array',
28
+ 'Uint16Array',
29
+ 'Int32Array',
30
+ 'Uint32Array',
31
+ 'Float32Array',
32
+ 'Float64Array',
33
+ 'BigInt64Array',
34
+ 'BigUint64Array',
35
+ ]);
36
+ const MACHINE_NUMERIC_BINARY_OPERATOR_KINDS = new Set([
37
+ ts.SyntaxKind.PlusToken,
38
+ ts.SyntaxKind.MinusToken,
39
+ ts.SyntaxKind.AsteriskToken,
40
+ ts.SyntaxKind.SlashToken,
41
+ ts.SyntaxKind.PercentToken,
42
+ ts.SyntaxKind.AsteriskAsteriskToken,
43
+ ts.SyntaxKind.AmpersandToken,
44
+ ts.SyntaxKind.BarToken,
45
+ ts.SyntaxKind.CaretToken,
46
+ ts.SyntaxKind.LessThanLessThanToken,
47
+ ts.SyntaxKind.GreaterThanGreaterThanToken,
48
+ ts.SyntaxKind.GreaterThanGreaterThanGreaterThanToken,
49
+ ]);
50
+ const MACHINE_NUMERIC_COMPOUND_ASSIGNMENT_OPERATOR_KINDS = new Map([
51
+ [ts.SyntaxKind.PlusEqualsToken, ts.SyntaxKind.PlusToken],
52
+ [ts.SyntaxKind.MinusEqualsToken, ts.SyntaxKind.MinusToken],
53
+ [ts.SyntaxKind.AsteriskEqualsToken, ts.SyntaxKind.AsteriskToken],
54
+ [ts.SyntaxKind.SlashEqualsToken, ts.SyntaxKind.SlashToken],
55
+ [ts.SyntaxKind.PercentEqualsToken, ts.SyntaxKind.PercentToken],
56
+ [ts.SyntaxKind.AsteriskAsteriskEqualsToken, ts.SyntaxKind.AsteriskAsteriskToken],
57
+ [ts.SyntaxKind.AmpersandEqualsToken, ts.SyntaxKind.AmpersandToken],
58
+ [ts.SyntaxKind.BarEqualsToken, ts.SyntaxKind.BarToken],
59
+ [ts.SyntaxKind.CaretEqualsToken, ts.SyntaxKind.CaretToken],
60
+ [ts.SyntaxKind.LessThanLessThanEqualsToken, ts.SyntaxKind.LessThanLessThanToken],
61
+ [ts.SyntaxKind.GreaterThanGreaterThanEqualsToken, ts.SyntaxKind.GreaterThanGreaterThanToken],
62
+ [
63
+ ts.SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken,
64
+ ts.SyntaxKind.GreaterThanGreaterThanGreaterThanToken,
65
+ ],
66
+ ]);
67
+ const MACHINE_NUMERIC_UNARY_OPERATOR_KINDS = new Set([
68
+ ts.SyntaxKind.PlusToken,
69
+ ts.SyntaxKind.MinusToken,
70
+ ts.SyntaxKind.TildeToken,
71
+ ]);
72
+ const MACHINE_NUMERIC_UPDATE_OPERATOR_KINDS = new Map([
73
+ [ts.SyntaxKind.PlusPlusToken, ts.SyntaxKind.PlusToken],
74
+ [ts.SyntaxKind.MinusMinusToken, ts.SyntaxKind.MinusToken],
75
+ ]);
76
+ function repairBuiltinMacroModuleSpecifiers(text) {
77
+ return text.replaceAll(/from\s+soundscript:builtins(?=[;\n])/gu, "from 'soundscript:builtins'");
78
+ }
79
+ function unwrapParenthesizedExpression(expression) {
80
+ let current = expression;
81
+ while (ts.isParenthesizedExpression(current)) {
82
+ current = current.expression;
83
+ }
84
+ return current;
85
+ }
86
+ function getDeclarationNameText(name) {
87
+ if (!name) {
88
+ return undefined;
89
+ }
90
+ if (ts.isIdentifier(name) ||
91
+ ts.isPrivateIdentifier(name) ||
92
+ ts.isStringLiteral(name) ||
93
+ ts.isNumericLiteral(name)) {
94
+ return name.text;
95
+ }
96
+ return undefined;
97
+ }
98
+ function getSignatureDeclarationOwnerName(declaration) {
99
+ let current = declaration.parent;
100
+ while (current) {
101
+ if (ts.isInterfaceDeclaration(current) ||
102
+ ts.isClassDeclaration(current) ||
103
+ ts.isModuleDeclaration(current)) {
104
+ return getDeclarationNameText(current.name);
105
+ }
106
+ if (ts.isVariableDeclaration(current) && ts.isIdentifier(current.name)) {
107
+ return current.name.text;
108
+ }
109
+ current = current.parent;
110
+ }
111
+ return undefined;
112
+ }
113
+ function getSignatureDeclarationMemberName(declaration) {
114
+ return getDeclarationNameText(declaration.name);
115
+ }
116
+ function getSortMethodNameFromSignatureDeclaration(declaration) {
117
+ if (!declaration || !declaration.getSourceFile().isDeclarationFile) {
118
+ return undefined;
119
+ }
120
+ const ownerName = getSignatureDeclarationOwnerName(declaration);
121
+ const memberName = getSignatureDeclarationMemberName(declaration);
122
+ if (!ownerName || !memberName || !SORT_METHOD_OWNER_NAMES.has(ownerName)) {
123
+ return undefined;
124
+ }
125
+ return memberName === 'sort' || memberName === 'toSorted'
126
+ ? memberName
127
+ : undefined;
128
+ }
129
+ function getSortMethodNameFromCallExpressionType(checker, expression) {
130
+ const type = checker.getTypeAtLocation(expression);
131
+ for (const signature of type.getCallSignatures()) {
132
+ const methodName = getSortMethodNameFromSignatureDeclaration(signature.getDeclaration());
133
+ if (methodName) {
134
+ return methodName;
135
+ }
136
+ }
137
+ return undefined;
138
+ }
139
+ function getSortMethodNameFromReference(checker, expression) {
140
+ const methodName = getMemberAccessName(expression);
141
+ const baseExpression = getMemberAccessBaseExpression(expression);
142
+ if (baseExpression &&
143
+ (methodName === 'sort' || methodName === 'toSorted') &&
144
+ isArrayLikeSortTarget(checker, baseExpression)) {
145
+ return methodName;
146
+ }
147
+ return getSortMethodNameFromCallExpressionType(checker, expression);
148
+ }
149
+ function getMemberAccessName(expression) {
150
+ const unwrapped = unwrapParenthesizedExpression(expression);
151
+ if (ts.isPropertyAccessExpression(unwrapped)) {
152
+ return unwrapped.name.text;
153
+ }
154
+ if (ts.isElementAccessExpression(unwrapped) &&
155
+ unwrapped.argumentExpression &&
156
+ (ts.isStringLiteral(unwrapped.argumentExpression) ||
157
+ ts.isNoSubstitutionTemplateLiteral(unwrapped.argumentExpression))) {
158
+ return unwrapped.argumentExpression.text;
159
+ }
160
+ return undefined;
161
+ }
162
+ function getMemberAccessBaseExpression(expression) {
163
+ const unwrapped = unwrapParenthesizedExpression(expression);
164
+ if (ts.isPropertyAccessExpression(unwrapped) || ts.isElementAccessExpression(unwrapped)) {
165
+ return unwrapped.expression;
166
+ }
167
+ return undefined;
168
+ }
169
+ function getConstInitializer(checker, expression) {
170
+ const unwrapped = unwrapParenthesizedExpression(expression);
171
+ if (!ts.isIdentifier(unwrapped)) {
172
+ return undefined;
173
+ }
174
+ const symbol = checker.getSymbolAtLocation(unwrapped);
175
+ if (!symbol) {
176
+ return undefined;
177
+ }
178
+ for (const declaration of symbol.getDeclarations() ?? []) {
179
+ if (ts.isVariableDeclaration(declaration) &&
180
+ ts.isVariableDeclarationList(declaration.parent) &&
181
+ (declaration.parent.flags & ts.NodeFlags.Const) !== 0 &&
182
+ declaration.initializer) {
183
+ return declaration.initializer;
184
+ }
185
+ }
186
+ return undefined;
187
+ }
188
+ function getBoundSortMethodName(checker, expression, seenSymbols = new Set()) {
189
+ const unwrapped = unwrapParenthesizedExpression(expression);
190
+ if (ts.isCallExpression(unwrapped)) {
191
+ const wrapperName = getMemberAccessName(unwrapped.expression);
192
+ if (wrapperName !== 'bind' || unwrapped.arguments.length !== 1) {
193
+ return undefined;
194
+ }
195
+ const targetExpression = getMemberAccessBaseExpression(unwrapped.expression);
196
+ const methodName = targetExpression
197
+ ? getSortMethodNameFromReference(checker, targetExpression)
198
+ : undefined;
199
+ return methodName && isArrayLikeSortTarget(checker, unwrapped.arguments[0])
200
+ ? methodName
201
+ : undefined;
202
+ }
203
+ if (!ts.isIdentifier(unwrapped)) {
204
+ return undefined;
205
+ }
206
+ const symbol = checker.getSymbolAtLocation(unwrapped);
207
+ if (!symbol || seenSymbols.has(symbol)) {
208
+ return undefined;
209
+ }
210
+ seenSymbols.add(symbol);
211
+ const initializer = getConstInitializer(checker, unwrapped);
212
+ return initializer ? getBoundSortMethodName(checker, initializer, seenSymbols) : undefined;
213
+ }
214
+ function getMachineNumericLeafName(type) {
215
+ const aliasName = type.aliasSymbol?.getName();
216
+ return aliasName && MACHINE_NUMERIC_LEAF_NAMES.has(aliasName) ? aliasName : undefined;
217
+ }
218
+ function getAbstractNumericFamilyName(type) {
219
+ const aliasName = type.aliasSymbol?.getName();
220
+ return aliasName && ABSTRACT_NUMERIC_FAMILY_NAMES.has(aliasName) ? aliasName : undefined;
221
+ }
222
+ function getDeclaredAbstractNumericFamilyName(expression, checker) {
223
+ const unwrapped = unwrapParenthesizedExpression(expression);
224
+ if (!ts.isIdentifier(unwrapped)) {
225
+ return undefined;
226
+ }
227
+ const symbol = checker.getSymbolAtLocation(unwrapped);
228
+ const declaration = symbol?.valueDeclaration ?? symbol?.declarations?.[0];
229
+ if (!declaration) {
230
+ return undefined;
231
+ }
232
+ if ((ts.isVariableDeclaration(declaration) || ts.isParameter(declaration)) &&
233
+ declaration.type &&
234
+ ts.isTypeReferenceNode(declaration.type) &&
235
+ ts.isIdentifier(declaration.type.typeName) &&
236
+ ABSTRACT_NUMERIC_FAMILY_NAMES.has(declaration.type.typeName.text)) {
237
+ return declaration.type.typeName.text;
238
+ }
239
+ return undefined;
240
+ }
241
+ function getAbstractNumericFamilyNameForExpression(expression, checker) {
242
+ return getAbstractNumericFamilyName(checker.getTypeAtLocation(expression)) ??
243
+ getDeclaredAbstractNumericFamilyName(expression, checker);
244
+ }
245
+ function getNumericArithmeticOperandKind(type) {
246
+ const machineLeaf = getMachineNumericLeafName(type);
247
+ if (machineLeaf) {
248
+ return machineLeaf;
249
+ }
250
+ if ((type.flags & (ts.TypeFlags.Number | ts.TypeFlags.NumberLiteral)) !== 0) {
251
+ return 'number';
252
+ }
253
+ if ((type.flags & (ts.TypeFlags.BigInt | ts.TypeFlags.BigIntLiteral)) !== 0) {
254
+ return 'bigint';
255
+ }
256
+ return undefined;
257
+ }
258
+ function getSameMachineNumericLeafName(expression, checker) {
259
+ if (!MACHINE_NUMERIC_BINARY_OPERATOR_KINDS.has(expression.operatorToken.kind)) {
260
+ return undefined;
261
+ }
262
+ const leftLeaf = getMachineNumericLeafName(checker.getTypeAtLocation(expression.left));
263
+ const rightLeaf = getMachineNumericLeafName(checker.getTypeAtLocation(expression.right));
264
+ return leftLeaf && leftLeaf === rightLeaf ? leftLeaf : undefined;
265
+ }
266
+ function getSameMachineNumericCompoundAssignmentLeafName(expression, checker) {
267
+ if (!MACHINE_NUMERIC_COMPOUND_ASSIGNMENT_OPERATOR_KINDS.has(expression.operatorToken.kind)) {
268
+ return undefined;
269
+ }
270
+ const leftLeaf = getMachineNumericLeafName(checker.getTypeAtLocation(expression.left));
271
+ const rightLeaf = getMachineNumericLeafName(checker.getTypeAtLocation(expression.right));
272
+ return leftLeaf && leftLeaf === rightLeaf ? leftLeaf : undefined;
273
+ }
274
+ function getSameMachineNumericUnaryLeafName(expression, checker) {
275
+ if (!MACHINE_NUMERIC_UNARY_OPERATOR_KINDS.has(expression.operator)) {
276
+ return undefined;
277
+ }
278
+ const leaf = getMachineNumericLeafName(checker.getTypeAtLocation(expression.operand));
279
+ if (!leaf) {
280
+ return undefined;
281
+ }
282
+ if (expression.operator === ts.SyntaxKind.PlusToken &&
283
+ (leaf === 'i64' || leaf === 'u64')) {
284
+ return undefined;
285
+ }
286
+ return leaf;
287
+ }
288
+ function getMachineNumericUpdateLeafName(expression, checker) {
289
+ if (!MACHINE_NUMERIC_UPDATE_OPERATOR_KINDS.has(expression.operator)) {
290
+ return undefined;
291
+ }
292
+ return getMachineNumericLeafName(checker.getTypeAtLocation(expression.operand));
293
+ }
294
+ function getOperatorText(kind) {
295
+ return ts.tokenToString(kind) ?? ts.SyntaxKind[kind];
296
+ }
297
+ function createStringLiteralOperator(kind) {
298
+ return ts.factory.createStringLiteral(getOperatorText(kind));
299
+ }
300
+ function createLeafConstructorCall(leaf, expression) {
301
+ const constructorName = MACHINE_NUMERIC_CONSTRUCTOR_BY_LEAF.get(leaf);
302
+ if (!constructorName) {
303
+ throw new Error(`Unsupported machine numeric leaf ${leaf}.`);
304
+ }
305
+ return ts.factory.createCallExpression(ts.factory.createIdentifier(constructorName), undefined, [expression]);
306
+ }
307
+ function createNumericBinaryHelperCall(operatorKind, left, right, leaf, loweringTarget) {
308
+ const helperCall = ts.factory.createCallExpression(ts.factory.createIdentifier(MACHINE_NUMERIC_BINARY_HELPER), undefined, [createStringLiteralOperator(operatorKind), left, right]);
309
+ if (loweringTarget === 'wasm') {
310
+ return ts.factory.createCallExpression(ts.factory.createIdentifier(MACHINE_NUMERIC_WASM_LEAF_HELPER), [ts.factory.createTypeReferenceNode(leaf)], [helperCall]);
311
+ }
312
+ return helperCall;
313
+ }
314
+ function createNumericUnaryHelperCall(operatorKind, operand, leaf, loweringTarget) {
315
+ const helperCall = ts.factory.createCallExpression(ts.factory.createIdentifier(MACHINE_NUMERIC_UNARY_HELPER), undefined, [createStringLiteralOperator(operatorKind), operand]);
316
+ if (loweringTarget === 'wasm') {
317
+ return ts.factory.createCallExpression(ts.factory.createIdentifier(MACHINE_NUMERIC_WASM_LEAF_HELPER), [ts.factory.createTypeReferenceNode(leaf)], [helperCall]);
318
+ }
319
+ return helperCall;
320
+ }
321
+ function createMachineNumericUnitLiteralExpression(leaf) {
322
+ if (leaf === 'i64' || leaf === 'u64') {
323
+ return createLeafConstructorCall(leaf, ts.factory.createBigIntLiteral('1n'));
324
+ }
325
+ return createLeafConstructorCall(leaf, ts.factory.createNumericLiteral('1'));
326
+ }
327
+ function getMachineNumericAssignmentTarget(expression) {
328
+ const unwrapped = unwrapParenthesizedExpression(expression);
329
+ if (ts.isIdentifier(unwrapped)) {
330
+ return { kind: 'identifier', target: unwrapped };
331
+ }
332
+ if (ts.isPropertyAccessExpression(unwrapped)) {
333
+ return {
334
+ kind: 'property',
335
+ base: unwrapped.expression,
336
+ name: unwrapped.name,
337
+ };
338
+ }
339
+ if (ts.isElementAccessExpression(unwrapped) && unwrapped.argumentExpression) {
340
+ return {
341
+ kind: 'element',
342
+ base: unwrapped.expression,
343
+ argument: unwrapped.argumentExpression,
344
+ };
345
+ }
346
+ return undefined;
347
+ }
348
+ function createConstBinding(name, initializer) {
349
+ return ts.factory.createVariableStatement(undefined, ts.factory.createVariableDeclarationList([ts.factory.createVariableDeclaration(name, undefined, undefined, initializer)], ts.NodeFlags.Const));
350
+ }
351
+ function createIifeExpression(statements, result) {
352
+ return ts.factory.createCallExpression(ts.factory.createParenthesizedExpression(ts.factory.createArrowFunction(undefined, undefined, [], undefined, ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), ts.factory.createBlock([...statements, ts.factory.createReturnStatement(result)], true))), undefined, []);
353
+ }
354
+ function createMachineNumericReadExpression(target, refs) {
355
+ switch (target.kind) {
356
+ case 'identifier':
357
+ return target.target;
358
+ case 'property':
359
+ return ts.factory.createPropertyAccessExpression(refs?.baseTemp ?? target.base, target.name);
360
+ case 'element':
361
+ return ts.factory.createElementAccessExpression(refs?.baseTemp ?? target.base, refs?.keyTemp ?? target.argument);
362
+ }
363
+ }
364
+ function createMachineNumericWriteExpression(target, value, refs) {
365
+ return ts.factory.createBinaryExpression(createMachineNumericReadExpression(target, refs), ts.factory.createToken(ts.SyntaxKind.EqualsToken), value);
366
+ }
367
+ function createMachineNumericCompoundAssignmentRewrite(target, right, binaryOperatorKind, leaf, loweringTarget) {
368
+ if (target.kind === 'identifier') {
369
+ return createMachineNumericWriteExpression(target, createNumericBinaryHelperCall(binaryOperatorKind, createMachineNumericReadExpression(target), right, leaf, loweringTarget));
370
+ }
371
+ const baseTemp = ts.factory.createUniqueName('__sts_numeric_target');
372
+ const statements = [createConstBinding(baseTemp, target.base)];
373
+ const refs = { baseTemp };
374
+ if (target.kind === 'element') {
375
+ refs.keyTemp = ts.factory.createUniqueName('__sts_numeric_key');
376
+ statements.push(createConstBinding(refs.keyTemp, target.argument));
377
+ }
378
+ return createIifeExpression(statements, createMachineNumericWriteExpression(target, createNumericBinaryHelperCall(binaryOperatorKind, createMachineNumericReadExpression(target, refs), right, leaf, loweringTarget), refs));
379
+ }
380
+ function createMachineNumericUpdateRewrite(target, binaryOperatorKind, leaf, loweringTarget, postfix) {
381
+ const delta = createMachineNumericUnitLiteralExpression(leaf);
382
+ if (target.kind === 'identifier' && !postfix) {
383
+ return createMachineNumericWriteExpression(target, createNumericBinaryHelperCall(binaryOperatorKind, createMachineNumericReadExpression(target), delta, leaf, loweringTarget));
384
+ }
385
+ const statements = [];
386
+ const refs = {};
387
+ if (target.kind === 'property' || target.kind === 'element') {
388
+ refs.baseTemp = ts.factory.createUniqueName('__sts_numeric_target');
389
+ statements.push(createConstBinding(refs.baseTemp, target.base));
390
+ }
391
+ if (target.kind === 'element') {
392
+ refs.keyTemp = ts.factory.createUniqueName('__sts_numeric_key');
393
+ statements.push(createConstBinding(refs.keyTemp, target.argument));
394
+ }
395
+ if (postfix) {
396
+ const oldTemp = ts.factory.createUniqueName('__sts_numeric_old');
397
+ statements.push(createConstBinding(oldTemp, createMachineNumericReadExpression(target, refs)));
398
+ statements.push(ts.factory.createExpressionStatement(createMachineNumericWriteExpression(target, createNumericBinaryHelperCall(binaryOperatorKind, createMachineNumericReadExpression(target, refs), delta, leaf, loweringTarget), refs)));
399
+ return createIifeExpression(statements, oldTemp);
400
+ }
401
+ return createIifeExpression(statements, createMachineNumericWriteExpression(target, createNumericBinaryHelperCall(binaryOperatorKind, createMachineNumericReadExpression(target, refs), delta, leaf, loweringTarget), refs));
402
+ }
403
+ function getLeafNameFromTypeNode(typeNode) {
404
+ return typeNode &&
405
+ ts.isTypeReferenceNode(typeNode) &&
406
+ ts.isIdentifier(typeNode.typeName) &&
407
+ MACHINE_NUMERIC_LEAF_NAMES.has(typeNode.typeName.text)
408
+ ? typeNode.typeName.text
409
+ : undefined;
410
+ }
411
+ function getLeafNameFromTupleElementTypeNode(typeNode) {
412
+ if (!typeNode) {
413
+ return undefined;
414
+ }
415
+ if (ts.isOptionalTypeNode(typeNode) || ts.isRestTypeNode(typeNode)) {
416
+ return getLeafNameFromTupleElementTypeNode(typeNode.type);
417
+ }
418
+ return getLeafNameFromTypeNode(typeNode);
419
+ }
420
+ function getExplicitLeafNameForBindingElement(node) {
421
+ const parentPattern = node.parent;
422
+ if (!ts.isObjectBindingPattern(parentPattern) && !ts.isArrayBindingPattern(parentPattern)) {
423
+ return undefined;
424
+ }
425
+ const patternType = (ts.isVariableDeclaration(parentPattern.parent) ||
426
+ ts.isParameter(parentPattern.parent))
427
+ ? parentPattern.parent.type
428
+ : undefined;
429
+ if (!patternType) {
430
+ return undefined;
431
+ }
432
+ if (ts.isArrayBindingPattern(parentPattern)) {
433
+ const index = parentPattern.elements.indexOf(node);
434
+ if (index < 0) {
435
+ return undefined;
436
+ }
437
+ if (ts.isArrayTypeNode(patternType)) {
438
+ return getLeafNameFromTypeNode(patternType.elementType);
439
+ }
440
+ if (ts.isTupleTypeNode(patternType)) {
441
+ return getLeafNameFromTupleElementTypeNode(patternType.elements[index]);
442
+ }
443
+ return undefined;
444
+ }
445
+ if (!ts.isTypeLiteralNode(patternType)) {
446
+ return undefined;
447
+ }
448
+ const propertyName = node.propertyName ?? node.name;
449
+ if (!ts.isIdentifier(propertyName) && !ts.isStringLiteral(propertyName)) {
450
+ return undefined;
451
+ }
452
+ const propertyText = propertyName.text;
453
+ for (const member of patternType.members) {
454
+ if (!ts.isPropertySignature(member) || !member.type || !member.name) {
455
+ continue;
456
+ }
457
+ const memberName = ts.isIdentifier(member.name) || ts.isStringLiteral(member.name)
458
+ ? member.name.text
459
+ : undefined;
460
+ if (memberName === propertyText) {
461
+ return getLeafNameFromTypeNode(member.type);
462
+ }
463
+ }
464
+ return undefined;
465
+ }
466
+ function parseContextualLiteral(expression) {
467
+ const unwrapped = unwrapParenthesizedExpression(expression);
468
+ if (ts.isNumericLiteral(unwrapped)) {
469
+ return { kind: 'number', text: unwrapped.text, value: Number(unwrapped.text) };
470
+ }
471
+ if (ts.isBigIntLiteral(unwrapped)) {
472
+ return { kind: 'bigint', value: BigInt(unwrapped.text.slice(0, -1)) };
473
+ }
474
+ if (ts.isPrefixUnaryExpression(unwrapped) &&
475
+ unwrapped.operator === ts.SyntaxKind.MinusToken &&
476
+ ts.isNumericLiteral(unwrapped.operand)) {
477
+ const text = `-${unwrapped.operand.text}`;
478
+ return { kind: 'number', text, value: Number(text) };
479
+ }
480
+ if (ts.isPrefixUnaryExpression(unwrapped) &&
481
+ unwrapped.operator === ts.SyntaxKind.MinusToken &&
482
+ ts.isBigIntLiteral(unwrapped.operand)) {
483
+ return { kind: 'bigint', value: -BigInt(unwrapped.operand.text.slice(0, -1)) };
484
+ }
485
+ return undefined;
486
+ }
487
+ function literalFitsLeaf(literal, leaf) {
488
+ switch (leaf) {
489
+ case 'f64':
490
+ return literal.kind === 'number';
491
+ case 'f32':
492
+ return literal.kind === 'number';
493
+ case 'i8':
494
+ return literal.kind === 'number' && Number.isInteger(literal.value) && literal.value >= -128 && literal.value <= 127;
495
+ case 'i16':
496
+ return literal.kind === 'number' && Number.isInteger(literal.value) && literal.value >= -32768 && literal.value <= 32767;
497
+ case 'i32':
498
+ return literal.kind === 'number' && Number.isInteger(literal.value) &&
499
+ literal.value >= -2147483648 && literal.value <= 2147483647;
500
+ case 'i64':
501
+ if (literal.kind === 'bigint') {
502
+ return BigInt.asIntN(64, literal.value) === literal.value;
503
+ }
504
+ return literal.kind === 'number' && Number.isInteger(literal.value) &&
505
+ BigInt.asIntN(64, BigInt(literal.value)) === BigInt(literal.value);
506
+ case 'u8':
507
+ return literal.kind === 'number' && Number.isInteger(literal.value) && literal.value >= 0 && literal.value <= 255;
508
+ case 'u16':
509
+ return literal.kind === 'number' && Number.isInteger(literal.value) && literal.value >= 0 && literal.value <= 65535;
510
+ case 'u32':
511
+ return literal.kind === 'number' && Number.isInteger(literal.value) && literal.value >= 0 && literal.value <= 4294967295;
512
+ case 'u64':
513
+ if (literal.kind === 'bigint') {
514
+ return literal.value >= 0n && BigInt.asUintN(64, literal.value) === literal.value;
515
+ }
516
+ return literal.kind === 'number' && Number.isInteger(literal.value) && literal.value >= 0 &&
517
+ BigInt.asUintN(64, BigInt(literal.value)) === BigInt(literal.value);
518
+ default:
519
+ return false;
520
+ }
521
+ }
522
+ function createContextualLeafLiteralRewrite(leaf, expression) {
523
+ const literal = parseContextualLiteral(expression);
524
+ if (!literal || !literalFitsLeaf(literal, leaf)) {
525
+ return undefined;
526
+ }
527
+ return createLeafConstructorCall(leaf, expression);
528
+ }
529
+ function createContextualLeafLiteralRewriteFromContext(originalExpression, rewrittenExpression, checker) {
530
+ const contextualType = checker.getContextualType(originalExpression);
531
+ const leaf = contextualType ? getMachineNumericLeafName(contextualType) : undefined;
532
+ return leaf ? createContextualLeafLiteralRewrite(leaf, rewrittenExpression) : undefined;
533
+ }
534
+ function isArrayLikeSortTarget(checker, expression) {
535
+ const type = checker.getTypeAtLocation(expression);
536
+ const typeChecker = checker;
537
+ if (typeChecker.isArrayLikeType?.(type)) {
538
+ return true;
539
+ }
540
+ const symbolName = type.getSymbol()?.getName();
541
+ return symbolName !== undefined && (symbolName === 'Array' ||
542
+ symbolName === 'ReadonlyArray' ||
543
+ symbolName.endsWith('Array'));
544
+ }
545
+ function normalizeSourceFile(sourceFile, checker, loweringTarget) {
546
+ let changed = false;
547
+ const transformer = (context) => {
548
+ const visit = (node) => {
549
+ if (ts.isBindingElement(node)) {
550
+ const initializer = node.initializer
551
+ ? ts.visitNode(node.initializer, visit)
552
+ : undefined;
553
+ const bindingLeaf = getExplicitLeafNameForBindingElement(node) ??
554
+ getMachineNumericLeafName(checker.getTypeAtLocation(node.name));
555
+ const literalRewrite = bindingLeaf && initializer
556
+ ? createContextualLeafLiteralRewrite(bindingLeaf, initializer)
557
+ : undefined;
558
+ if (literalRewrite) {
559
+ changed = true;
560
+ return ts.factory.updateBindingElement(node, node.dotDotDotToken, node.propertyName, node.name, literalRewrite);
561
+ }
562
+ if (initializer !== node.initializer) {
563
+ changed = true;
564
+ return ts.factory.updateBindingElement(node, node.dotDotDotToken, node.propertyName, node.name, initializer);
565
+ }
566
+ return node;
567
+ }
568
+ if (ts.isVariableDeclaration(node)) {
569
+ const name = ts.visitNode(node.name, visit);
570
+ const initializer = node.initializer
571
+ ? ts.visitNode(node.initializer, visit)
572
+ : undefined;
573
+ if (name !== node.name || initializer !== node.initializer) {
574
+ changed = true;
575
+ return ts.factory.updateVariableDeclaration(node, name, node.exclamationToken, node.type, initializer);
576
+ }
577
+ return node;
578
+ }
579
+ if (ts.isBinaryExpression(node)) {
580
+ const left = ts.visitNode(node.left, visit);
581
+ const right = ts.visitNode(node.right, visit);
582
+ const updated = left === node.left && right === node.right
583
+ ? node
584
+ : ts.factory.updateBinaryExpression(node, left, node.operatorToken, right);
585
+ const compoundLeaf = getSameMachineNumericCompoundAssignmentLeafName(updated, checker);
586
+ if (compoundLeaf) {
587
+ const binaryOperatorKind = MACHINE_NUMERIC_COMPOUND_ASSIGNMENT_OPERATOR_KINDS.get(node.operatorToken.kind);
588
+ const target = getMachineNumericAssignmentTarget(left);
589
+ if (binaryOperatorKind && target) {
590
+ changed = true;
591
+ return createMachineNumericCompoundAssignmentRewrite(target, right, binaryOperatorKind, compoundLeaf, loweringTarget);
592
+ }
593
+ }
594
+ const sameLeaf = getSameMachineNumericLeafName(updated, checker);
595
+ if (!sameLeaf) {
596
+ return updated;
597
+ }
598
+ changed = true;
599
+ return createNumericBinaryHelperCall(updated.operatorToken.kind, left, right, sameLeaf, loweringTarget);
600
+ }
601
+ if (ts.isPrefixUnaryExpression(node)) {
602
+ const updateLeaf = getMachineNumericUpdateLeafName(node, checker);
603
+ if (updateLeaf) {
604
+ const operand = ts.visitNode(node.operand, visit);
605
+ const target = getMachineNumericAssignmentTarget(operand);
606
+ const binaryOperatorKind = MACHINE_NUMERIC_UPDATE_OPERATOR_KINDS.get(node.operator);
607
+ if (target && binaryOperatorKind) {
608
+ changed = true;
609
+ return createMachineNumericUpdateRewrite(target, binaryOperatorKind, updateLeaf, loweringTarget, false);
610
+ }
611
+ }
612
+ const operand = ts.visitNode(node.operand, visit);
613
+ const updated = operand === node.operand
614
+ ? node
615
+ : ts.factory.updatePrefixUnaryExpression(node, operand);
616
+ const sameLeaf = getSameMachineNumericUnaryLeafName(updated, checker);
617
+ if (!sameLeaf) {
618
+ const literalRewrite = createContextualLeafLiteralRewriteFromContext(node, updated, checker);
619
+ if (literalRewrite) {
620
+ changed = true;
621
+ return literalRewrite;
622
+ }
623
+ return updated;
624
+ }
625
+ changed = true;
626
+ return createNumericUnaryHelperCall(updated.operator, operand, sameLeaf, loweringTarget);
627
+ }
628
+ if (ts.isPostfixUnaryExpression(node)) {
629
+ const updateLeaf = getMachineNumericUpdateLeafName(node, checker);
630
+ if (!updateLeaf) {
631
+ return node;
632
+ }
633
+ const operand = ts.visitNode(node.operand, visit);
634
+ const target = getMachineNumericAssignmentTarget(operand);
635
+ const binaryOperatorKind = MACHINE_NUMERIC_UPDATE_OPERATOR_KINDS.get(node.operator);
636
+ if (!target || !binaryOperatorKind) {
637
+ return operand === node.operand ? node : ts.factory.updatePostfixUnaryExpression(node, operand);
638
+ }
639
+ changed = true;
640
+ return createMachineNumericUpdateRewrite(target, binaryOperatorKind, updateLeaf, loweringTarget, true);
641
+ }
642
+ const visitedNode = ts.visitEachChild(node, visit, context);
643
+ if (ts.isExpression(node) && ts.isExpression(visitedNode)) {
644
+ const literalRewrite = createContextualLeafLiteralRewriteFromContext(node, visitedNode, checker);
645
+ if (literalRewrite) {
646
+ changed = true;
647
+ return literalRewrite;
648
+ }
649
+ }
650
+ return visitedNode;
651
+ };
652
+ return (node) => ts.visitNode(node, visit);
653
+ };
654
+ const result = ts.transform(sourceFile, [transformer]);
655
+ const [transformed] = result.transformed;
656
+ result.dispose();
657
+ if (!changed || !transformed) {
658
+ return undefined;
659
+ }
660
+ const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
661
+ const rewrittenText = repairBuiltinMacroModuleSpecifiers(printer.printFile(transformed));
662
+ return {
663
+ rewriteStage: buildRewriteStageFromTexts(sourceFile.fileName, sourceFile.text, rewrittenText),
664
+ sourceFile: ts.createSourceFile(sourceFile.fileName, rewrittenText, sourceFile.languageVersion, true),
665
+ };
666
+ }
667
+ export function normalizeMachineNumericSemanticsInProgram(program, loweringTarget = 'js') {
668
+ const checker = program.getTypeChecker();
669
+ const changedFiles = new Map();
670
+ for (const sourceFile of program.getSourceFiles()) {
671
+ if (sourceFile.isDeclarationFile ||
672
+ !isSoundscriptSourceFile(toSourceFileName(sourceFile.fileName))) {
673
+ continue;
674
+ }
675
+ const normalized = normalizeSourceFile(sourceFile, checker, loweringTarget);
676
+ if (normalized) {
677
+ changedFiles.set(sourceFile.fileName, normalized);
678
+ }
679
+ }
680
+ return { changedFiles };
681
+ }
682
+ export function collectMixedMachineNumericArithmeticInProgram(program) {
683
+ const checker = program.getTypeChecker();
684
+ const mixedArithmetic = [];
685
+ function visit(sourceFile, node) {
686
+ if (ts.isBinaryExpression(node) &&
687
+ (MACHINE_NUMERIC_BINARY_OPERATOR_KINDS.has(node.operatorToken.kind) ||
688
+ MACHINE_NUMERIC_COMPOUND_ASSIGNMENT_OPERATOR_KINDS.has(node.operatorToken.kind))) {
689
+ const leftLeaf = getNumericArithmeticOperandKind(checker.getTypeAtLocation(node.left));
690
+ const rightLeaf = getNumericArithmeticOperandKind(checker.getTypeAtLocation(node.right));
691
+ if (leftLeaf && rightLeaf && leftLeaf !== rightLeaf) {
692
+ mixedArithmetic.push({
693
+ end: node.getEnd(),
694
+ expressionText: node.getText(sourceFile),
695
+ fileName: sourceFile.fileName,
696
+ leftLeaf,
697
+ operatorText: node.operatorToken.getText(sourceFile),
698
+ rightLeaf,
699
+ start: node.getStart(sourceFile),
700
+ });
701
+ }
702
+ }
703
+ ts.forEachChild(node, (child) => visit(sourceFile, child));
704
+ }
705
+ for (const sourceFile of program.getSourceFiles()) {
706
+ if (sourceFile.isDeclarationFile ||
707
+ !isSoundscriptSourceFile(toSourceFileName(sourceFile.fileName))) {
708
+ continue;
709
+ }
710
+ visit(sourceFile, sourceFile);
711
+ }
712
+ return mixedArithmetic;
713
+ }
714
+ export function collectAbstractNumericFamilyArithmeticInProgram(program) {
715
+ const checker = program.getTypeChecker();
716
+ const abstractArithmetic = [];
717
+ function pushAbstractArithmetic(sourceFile, node, operandExpression, operatorText) {
718
+ const abstractFamily = getAbstractNumericFamilyNameForExpression(operandExpression, checker);
719
+ if (!abstractFamily) {
720
+ return;
721
+ }
722
+ abstractArithmetic.push({
723
+ abstractFamilies: [abstractFamily],
724
+ end: node.getEnd(),
725
+ expressionText: node.getText(sourceFile),
726
+ fileName: sourceFile.fileName,
727
+ operatorText,
728
+ start: node.getStart(sourceFile),
729
+ });
730
+ }
731
+ function visit(sourceFile, node) {
732
+ if (ts.isBinaryExpression(node) &&
733
+ (MACHINE_NUMERIC_BINARY_OPERATOR_KINDS.has(node.operatorToken.kind) ||
734
+ MACHINE_NUMERIC_COMPOUND_ASSIGNMENT_OPERATOR_KINDS.has(node.operatorToken.kind))) {
735
+ const abstractFamilies = [
736
+ getAbstractNumericFamilyNameForExpression(node.left, checker),
737
+ getAbstractNumericFamilyNameForExpression(node.right, checker),
738
+ ].filter((name) => name !== undefined);
739
+ if (abstractFamilies.length > 0) {
740
+ abstractArithmetic.push({
741
+ abstractFamilies: [...new Set(abstractFamilies)].sort(),
742
+ end: node.getEnd(),
743
+ expressionText: node.getText(sourceFile),
744
+ fileName: sourceFile.fileName,
745
+ operatorText: node.operatorToken.getText(sourceFile),
746
+ start: node.getStart(sourceFile),
747
+ });
748
+ }
749
+ }
750
+ if (ts.isPrefixUnaryExpression(node) &&
751
+ (MACHINE_NUMERIC_UNARY_OPERATOR_KINDS.has(node.operator) ||
752
+ MACHINE_NUMERIC_UPDATE_OPERATOR_KINDS.has(node.operator))) {
753
+ pushAbstractArithmetic(sourceFile, node, node.operand, getOperatorText(node.operator));
754
+ }
755
+ if (ts.isPostfixUnaryExpression(node) &&
756
+ MACHINE_NUMERIC_UPDATE_OPERATOR_KINDS.has(node.operator)) {
757
+ pushAbstractArithmetic(sourceFile, node, node.operand, getOperatorText(node.operator));
758
+ }
759
+ ts.forEachChild(node, (child) => visit(sourceFile, child));
760
+ }
761
+ for (const sourceFile of program.getSourceFiles()) {
762
+ if (sourceFile.isDeclarationFile ||
763
+ !isSoundscriptSourceFile(toSourceFileName(sourceFile.fileName))) {
764
+ continue;
765
+ }
766
+ visit(sourceFile, sourceFile);
767
+ }
768
+ return abstractArithmetic;
769
+ }
770
+ export function collectSortCallsWithoutComparatorInProgram(program) {
771
+ const checker = program.getTypeChecker();
772
+ const diagnostics = [];
773
+ function addDiagnostic(sourceFile, node, methodName) {
774
+ diagnostics.push({
775
+ end: node.getEnd(),
776
+ expressionText: node.getText(sourceFile),
777
+ fileName: sourceFile.fileName,
778
+ methodName,
779
+ start: node.getStart(sourceFile),
780
+ });
781
+ }
782
+ function visit(sourceFile, node) {
783
+ if (ts.isCallExpression(node)) {
784
+ if (node.arguments.length === 0) {
785
+ const directMethodName = getMemberAccessName(node.expression);
786
+ const directTarget = getMemberAccessBaseExpression(node.expression);
787
+ if (directTarget &&
788
+ (directMethodName === 'sort' || directMethodName === 'toSorted') &&
789
+ isArrayLikeSortTarget(checker, directTarget)) {
790
+ addDiagnostic(sourceFile, node, directMethodName);
791
+ }
792
+ else {
793
+ const boundMethodName = getBoundSortMethodName(checker, node.expression);
794
+ if (boundMethodName) {
795
+ addDiagnostic(sourceFile, node, boundMethodName);
796
+ }
797
+ }
798
+ }
799
+ else {
800
+ const wrapperName = getMemberAccessName(node.expression);
801
+ const wrapperTarget = getMemberAccessBaseExpression(node.expression);
802
+ const methodName = wrapperTarget
803
+ ? getSortMethodNameFromReference(checker, wrapperTarget)
804
+ : undefined;
805
+ if (methodName &&
806
+ node.arguments[0] &&
807
+ isArrayLikeSortTarget(checker, node.arguments[0]) &&
808
+ ((wrapperName === 'call' && node.arguments.length === 1) ||
809
+ (wrapperName === 'apply' && node.arguments.length === 1))) {
810
+ addDiagnostic(sourceFile, node, methodName);
811
+ }
812
+ }
813
+ }
814
+ ts.forEachChild(node, (child) => visit(sourceFile, child));
815
+ }
816
+ for (const sourceFile of program.getSourceFiles()) {
817
+ if (sourceFile.isDeclarationFile ||
818
+ !isSoundscriptSourceFile(toSourceFileName(sourceFile.fileName))) {
819
+ continue;
820
+ }
821
+ visit(sourceFile, sourceFile);
822
+ }
823
+ return diagnostics;
824
+ }