tsc-ts 0.0.9 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (373) hide show
  1. package/README.md +2 -2
  2. package/bin/tsc-ts.js +70 -1
  3. package/dist/api/compiler/ast-utilities.d.ts +19 -1
  4. package/dist/api/compiler/ast-utilities.js +180 -95
  5. package/dist/api/compiler/ast.d.ts +22 -15
  6. package/dist/api/compiler/ast.js +1026 -995
  7. package/dist/api/compiler/astnav.js +15 -15
  8. package/dist/api/compiler/binder-utilities.js +186 -186
  9. package/dist/api/compiler/binder.js +290 -263
  10. package/dist/api/compiler/character-codes.js +2 -2
  11. package/dist/api/compiler/checker-calls.js +178 -124
  12. package/dist/api/compiler/checker-classes.d.ts +14 -3
  13. package/dist/api/compiler/checker-classes.js +134 -90
  14. package/dist/api/compiler/checker-contextual.js +64 -61
  15. package/dist/api/compiler/checker-declaration-order.js +79 -79
  16. package/dist/api/compiler/checker-declarations.d.ts +1 -0
  17. package/dist/api/compiler/checker-declarations.js +160 -136
  18. package/dist/api/compiler/checker-declared-types.js +67 -65
  19. package/dist/api/compiler/checker-decorators.js +77 -77
  20. package/dist/api/compiler/checker-deprecation.d.ts +8 -3
  21. package/dist/api/compiler/checker-deprecation.js +76 -55
  22. package/dist/api/compiler/checker-destructuring.js +47 -45
  23. package/dist/api/compiler/checker-elaboration.js +24 -24
  24. package/dist/api/compiler/checker-emit-helpers.js +4 -4
  25. package/dist/api/compiler/checker-emit-resolver.d.ts +4 -2
  26. package/dist/api/compiler/checker-emit-resolver.js +25 -13
  27. package/dist/api/compiler/checker-evaluator.js +9 -9
  28. package/dist/api/compiler/checker-expressions.js +244 -211
  29. package/dist/api/compiler/checker-functions.js +113 -107
  30. package/dist/api/compiler/checker-generated-code.d.ts +0 -11
  31. package/dist/api/compiler/checker-generated-code.js +28 -52
  32. package/dist/api/compiler/checker-grammar.d.ts +1 -0
  33. package/dist/api/compiler/checker-grammar.js +472 -440
  34. package/dist/api/compiler/checker-heritage.js +91 -93
  35. package/dist/api/compiler/checker-inference.d.ts +77 -5
  36. package/dist/api/compiler/checker-inference.js +487 -107
  37. package/dist/api/compiler/checker-iteration.d.ts +0 -10
  38. package/dist/api/compiler/checker-iteration.js +35 -52
  39. package/dist/api/compiler/checker-javascript.js +14 -14
  40. package/dist/api/compiler/checker-jsdoc.d.ts +8 -10
  41. package/dist/api/compiler/checker-jsdoc.js +67 -58
  42. package/dist/api/compiler/checker-jsx.js +105 -88
  43. package/dist/api/compiler/checker-members.d.ts +9 -2
  44. package/dist/api/compiler/checker-members.js +212 -75
  45. package/dist/api/compiler/checker-modules.d.ts +15 -6
  46. package/dist/api/compiler/checker-modules.js +469 -309
  47. package/dist/api/compiler/checker-narrowing.js +273 -189
  48. package/dist/api/compiler/checker-object-literals.js +25 -22
  49. package/dist/api/compiler/checker-operators.js +126 -118
  50. package/dist/api/compiler/checker-overloads.js +27 -27
  51. package/dist/api/compiler/checker-property-access.js +59 -55
  52. package/dist/api/compiler/checker-services.d.ts +1 -0
  53. package/dist/api/compiler/checker-services.js +222 -210
  54. package/dist/api/compiler/checker-signatures.js +65 -49
  55. package/dist/api/compiler/checker-source-file.d.ts +5 -0
  56. package/dist/api/compiler/checker-source-file.js +154 -130
  57. package/dist/api/compiler/checker-statements.js +33 -32
  58. package/dist/api/compiler/checker-super.js +50 -50
  59. package/dist/api/compiler/checker-symbol-types.js +109 -93
  60. package/dist/api/compiler/checker-symbols.d.ts +13 -1
  61. package/dist/api/compiler/checker-symbols.js +264 -149
  62. package/dist/api/compiler/checker-type-factory.d.ts +5 -0
  63. package/dist/api/compiler/checker-type-factory.js +145 -36
  64. package/dist/api/compiler/checker-type-nodes.d.ts +1 -0
  65. package/dist/api/compiler/checker-type-nodes.js +179 -141
  66. package/dist/api/compiler/checker-type-operators.d.ts +2 -0
  67. package/dist/api/compiler/checker-type-operators.js +110 -63
  68. package/dist/api/compiler/checker-types.d.ts +80 -3
  69. package/dist/api/compiler/checker-types.js +121 -2
  70. package/dist/api/compiler/checker-unused.js +114 -118
  71. package/dist/api/compiler/checker-utilities.js +11 -11
  72. package/dist/api/compiler/checker.d.ts +104 -31
  73. package/dist/api/compiler/checker.js +181 -33
  74. package/dist/api/compiler/command-line.d.ts +1 -3
  75. package/dist/api/compiler/command-line.js +47 -44
  76. package/dist/api/compiler/compile-program.d.ts +42 -3
  77. package/dist/api/compiler/compile-program.js +139 -27
  78. package/dist/api/compiler/diagnostic-messages.d.ts +1849 -1774
  79. package/dist/api/compiler/diagnostic-messages.js +128 -122
  80. package/dist/api/compiler/diagnostics.d.ts +22 -0
  81. package/dist/api/compiler/diagnostics.js +93 -11
  82. package/dist/api/compiler/emitter.d.ts +7 -1
  83. package/dist/api/compiler/emitter.js +53 -11
  84. package/dist/api/compiler/file-include.d.ts +2 -1
  85. package/dist/api/compiler/file-include.js +11 -7
  86. package/dist/api/compiler/file-loader.d.ts +21 -1
  87. package/dist/api/compiler/file-loader.js +201 -48
  88. package/dist/api/compiler/instantiation.d.ts +7 -0
  89. package/dist/api/compiler/instantiation.js +101 -49
  90. package/dist/api/compiler/jsdoc.js +23 -23
  91. package/dist/api/compiler/link-tables.d.ts +48 -18
  92. package/dist/api/compiler/link-tables.js +80 -37
  93. package/dist/api/compiler/locales/cs-CZ.d.ts +1 -1
  94. package/dist/api/compiler/locales/cs-CZ.js +1 -1
  95. package/dist/api/compiler/locales/de-DE.d.ts +1 -1
  96. package/dist/api/compiler/locales/de-DE.js +1 -1
  97. package/dist/api/compiler/locales/es-ES.d.ts +1 -1
  98. package/dist/api/compiler/locales/es-ES.js +1 -1
  99. package/dist/api/compiler/locales/fr-FR.d.ts +1 -1
  100. package/dist/api/compiler/locales/fr-FR.js +1 -1
  101. package/dist/api/compiler/locales/it-IT.d.ts +1 -1
  102. package/dist/api/compiler/locales/it-IT.js +1 -1
  103. package/dist/api/compiler/locales/ja-JP.d.ts +1 -1
  104. package/dist/api/compiler/locales/ja-JP.js +1 -1
  105. package/dist/api/compiler/locales/ko-KR.d.ts +1 -1
  106. package/dist/api/compiler/locales/ko-KR.js +1 -1
  107. package/dist/api/compiler/locales/pl-PL.d.ts +1 -1
  108. package/dist/api/compiler/locales/pl-PL.js +1 -1
  109. package/dist/api/compiler/locales/pt-BR.d.ts +1 -1
  110. package/dist/api/compiler/locales/pt-BR.js +1 -1
  111. package/dist/api/compiler/locales/ru-RU.d.ts +1 -1
  112. package/dist/api/compiler/locales/ru-RU.js +1 -1
  113. package/dist/api/compiler/locales/tr-TR.d.ts +1 -1
  114. package/dist/api/compiler/locales/tr-TR.js +1 -1
  115. package/dist/api/compiler/locales/zh-CN.d.ts +1 -1
  116. package/dist/api/compiler/locales/zh-CN.js +1 -1
  117. package/dist/api/compiler/locales/zh-TW.d.ts +1 -1
  118. package/dist/api/compiler/locales/zh-TW.js +1 -1
  119. package/dist/api/compiler/module-resolution-types.js +6 -6
  120. package/dist/api/compiler/module-resolution.d.ts +10 -1
  121. package/dist/api/compiler/module-resolution.js +115 -84
  122. package/dist/api/compiler/module-specifiers.d.ts +15 -0
  123. package/dist/api/compiler/module-specifiers.js +24 -18
  124. package/dist/api/compiler/name-resolver.js +74 -65
  125. package/dist/api/compiler/node-builder-names.d.ts +11 -3
  126. package/dist/api/compiler/node-builder-names.js +210 -90
  127. package/dist/api/compiler/node-builder-pseudo.js +29 -31
  128. package/dist/api/compiler/node-builder-reuse.js +23 -22
  129. package/dist/api/compiler/node-builder.d.ts +18 -1
  130. package/dist/api/compiler/node-builder.js +191 -102
  131. package/dist/api/compiler/option-declarations.d.ts +2 -6
  132. package/dist/api/compiler/option-declarations.js +315 -375
  133. package/dist/api/compiler/options.d.ts +15 -33
  134. package/dist/api/compiler/options.js +21 -54
  135. package/dist/api/compiler/output-paths.d.ts +4 -1
  136. package/dist/api/compiler/output-paths.js +6 -11
  137. package/dist/api/compiler/package-json.d.ts +3 -3
  138. package/dist/api/compiler/package-json.js +11 -10
  139. package/dist/api/compiler/parallel-parse.d.ts +3 -2
  140. package/dist/api/compiler/parallel-parse.js +17 -5
  141. package/dist/api/compiler/parser.d.ts +40 -19
  142. package/dist/api/compiler/parser.js +308 -216
  143. package/dist/api/compiler/path.d.ts +9 -0
  144. package/dist/api/compiler/path.js +20 -3
  145. package/dist/api/compiler/printer/emit-context.d.ts +5 -1
  146. package/dist/api/compiler/printer/emit-context.js +20 -1
  147. package/dist/api/compiler/printer/factory-base.d.ts +2 -2
  148. package/dist/api/compiler/printer/factory-base.js +7 -3
  149. package/dist/api/compiler/printer/factory.js +3 -1
  150. package/dist/api/compiler/printer/helpers.js +10 -1
  151. package/dist/api/compiler/printer/name-generator.d.ts +1 -1
  152. package/dist/api/compiler/printer/name-generator.js +35 -16
  153. package/dist/api/compiler/printer/printer.d.ts +49 -2
  154. package/dist/api/compiler/printer/printer.js +539 -293
  155. package/dist/api/compiler/printer/utilities.js +149 -147
  156. package/dist/api/compiler/program-checker.d.ts +12 -2
  157. package/dist/api/compiler/program-checker.js +88 -34
  158. package/dist/api/compiler/program-utilities.d.ts +3 -1
  159. package/dist/api/compiler/program-utilities.js +28 -15
  160. package/dist/api/compiler/program.d.ts +4 -6
  161. package/dist/api/compiler/program.js +74 -87
  162. package/dist/api/compiler/pseudo-bigint.d.ts +2 -0
  163. package/dist/api/compiler/pseudo-bigint.js +18 -0
  164. package/dist/api/compiler/regexp-checker.d.ts +1 -1
  165. package/dist/api/compiler/regexp-checker.js +93 -76
  166. package/dist/api/compiler/relations.d.ts +27 -4
  167. package/dist/api/compiler/relations.js +347 -180
  168. package/dist/api/compiler/reparser.js +60 -56
  169. package/dist/api/compiler/scanner.d.ts +19 -2
  170. package/dist/api/compiler/scanner.js +123 -108
  171. package/dist/api/compiler/shared-results.d.ts +463 -0
  172. package/dist/api/compiler/shared-results.js +2128 -0
  173. package/dist/api/compiler/sourcemap.js +2 -2
  174. package/dist/api/compiler/symbol-accessibility.js +87 -74
  175. package/dist/api/compiler/symbol.d.ts +23 -14
  176. package/dist/api/compiler/symbol.js +23 -11
  177. package/dist/api/compiler/syntax-kind.d.ts +198 -197
  178. package/dist/api/compiler/transformers/alias-references.js +247 -139
  179. package/dist/api/compiler/transformers/async-utilities.js +25 -25
  180. package/dist/api/compiler/transformers/async.d.ts +0 -1
  181. package/dist/api/compiler/transformers/async.js +64 -77
  182. package/dist/api/compiler/transformers/class-fields.d.ts +1 -0
  183. package/dist/api/compiler/transformers/class-fields.js +81 -78
  184. package/dist/api/compiler/transformers/commonjs-module.js +18 -15
  185. package/dist/api/compiler/transformers/const-enum-inliner.js +1 -1
  186. package/dist/api/compiler/transformers/declarations-diagnostics.js +247 -244
  187. package/dist/api/compiler/transformers/declarations-pseudo.js +100 -100
  188. package/dist/api/compiler/transformers/declarations-resolver.d.ts +0 -3
  189. package/dist/api/compiler/transformers/declarations-syntactic.d.ts +1 -2
  190. package/dist/api/compiler/transformers/declarations-syntactic.js +134 -156
  191. package/dist/api/compiler/transformers/declarations-tracker.js +18 -18
  192. package/dist/api/compiler/transformers/declarations.d.ts +4 -1
  193. package/dist/api/compiler/transformers/declarations.js +305 -238
  194. package/dist/api/compiler/transformers/decorator-metadata.d.ts +1 -1
  195. package/dist/api/compiler/transformers/decorator-metadata.js +53 -45
  196. package/dist/api/compiler/transformers/decorator-utilities.js +24 -24
  197. package/dist/api/compiler/transformers/destructuring.js +19 -18
  198. package/dist/api/compiler/transformers/emit-resolver.js +1 -1
  199. package/dist/api/compiler/transformers/es-decorators.js +55 -55
  200. package/dist/api/compiler/transformers/external-module-info.js +3 -3
  201. package/dist/api/compiler/transformers/for-await.js +25 -25
  202. package/dist/api/compiler/transformers/import-elision.js +14 -14
  203. package/dist/api/compiler/transformers/jsx.js +12 -12
  204. package/dist/api/compiler/transformers/legacy-decorators.js +17 -17
  205. package/dist/api/compiler/transformers/module.js +8 -8
  206. package/dist/api/compiler/transformers/named-evaluation.js +4 -4
  207. package/dist/api/compiler/transformers/object-rest-spread.js +20 -20
  208. package/dist/api/compiler/transformers/optional-chain.js +10 -10
  209. package/dist/api/compiler/transformers/reference-resolver.d.ts +12 -1
  210. package/dist/api/compiler/transformers/reference-resolver.js +131 -69
  211. package/dist/api/compiler/transformers/runtime-syntax.js +35 -31
  212. package/dist/api/compiler/transformers/subtree-facts.js +47 -47
  213. package/dist/api/compiler/transformers/syntax-facts.js +56 -58
  214. package/dist/api/compiler/transformers/type-eraser.js +73 -66
  215. package/dist/api/compiler/transformers/type-serialization.js +24 -24
  216. package/dist/api/compiler/transformers/using.js +12 -12
  217. package/dist/api/compiler/transformers/utilities.js +77 -77
  218. package/dist/api/compiler/transformers/visitor-base.js +172 -172
  219. package/dist/api/compiler/transformers/visitor-hooks.js +6 -2
  220. package/dist/api/compiler/tsconfig.d.ts +10 -2
  221. package/dist/api/compiler/tsconfig.js +136 -48
  222. package/dist/api/compiler/type-printer.js +40 -3
  223. package/dist/api/compiler/types.d.ts +2 -1
  224. package/dist/api/library/ast.generated.d.ts +42 -39
  225. package/dist/api/library/ast.generated.js +1 -1
  226. package/dist/api/library/compiler-options.generated.d.ts +111 -100
  227. package/dist/api/library/compiler-options.generated.js +1 -1
  228. package/dist/api/library/disk.js +12 -1
  229. package/dist/api/library/enums.generated.d.ts +206 -206
  230. package/dist/api/library/enums.generated.js +206 -206
  231. package/dist/api/library/nodes.js +26 -26
  232. package/package.json +9 -9
  233. package/src/compiler/ast-utilities.ts +99 -7
  234. package/src/compiler/ast.ts +58 -26
  235. package/src/compiler/binder.ts +39 -4
  236. package/src/compiler/character-codes.ts +2 -2
  237. package/src/compiler/checker-calls.ts +79 -9
  238. package/src/compiler/checker-classes.ts +78 -24
  239. package/src/compiler/checker-contextual.ts +6 -1
  240. package/src/compiler/checker-declarations.ts +31 -4
  241. package/src/compiler/checker-declared-types.ts +8 -5
  242. package/src/compiler/checker-decorators.ts +1 -1
  243. package/src/compiler/checker-deprecation.ts +29 -8
  244. package/src/compiler/checker-destructuring.ts +10 -3
  245. package/src/compiler/checker-emit-helpers.ts +1 -0
  246. package/src/compiler/checker-emit-resolver.ts +16 -6
  247. package/src/compiler/checker-expressions.ts +79 -46
  248. package/src/compiler/checker-functions.ts +21 -6
  249. package/src/compiler/checker-generated-code.ts +2 -22
  250. package/src/compiler/checker-grammar.ts +136 -62
  251. package/src/compiler/checker-heritage.ts +22 -21
  252. package/src/compiler/checker-inference.ts +514 -82
  253. package/src/compiler/checker-iteration.ts +18 -31
  254. package/src/compiler/checker-javascript.ts +1 -1
  255. package/src/compiler/checker-jsdoc.ts +50 -27
  256. package/src/compiler/checker-jsx.ts +26 -4
  257. package/src/compiler/checker-members.ts +200 -56
  258. package/src/compiler/checker-modules.ts +332 -65
  259. package/src/compiler/checker-narrowing.ts +98 -19
  260. package/src/compiler/checker-object-literals.ts +3 -0
  261. package/src/compiler/checker-operators.ts +11 -4
  262. package/src/compiler/checker-property-access.ts +7 -2
  263. package/src/compiler/checker-services.ts +39 -12
  264. package/src/compiler/checker-signatures.ts +15 -1
  265. package/src/compiler/checker-source-file.ts +39 -13
  266. package/src/compiler/checker-statements.ts +3 -2
  267. package/src/compiler/checker-symbol-types.ts +29 -6
  268. package/src/compiler/checker-symbols.ts +158 -15
  269. package/src/compiler/checker-type-factory.ts +124 -23
  270. package/src/compiler/checker-type-nodes.ts +46 -3
  271. package/src/compiler/checker-type-operators.ts +83 -26
  272. package/src/compiler/checker-types.ts +147 -4
  273. package/src/compiler/checker-unused.ts +9 -14
  274. package/src/compiler/checker.ts +203 -39
  275. package/src/compiler/command-line.ts +28 -28
  276. package/src/compiler/compile-program.ts +167 -27
  277. package/src/compiler/decoder.ts +13 -4
  278. package/src/compiler/diagnostic-messages.ts +1973 -1892
  279. package/src/compiler/diagnostics.ts +84 -3
  280. package/src/compiler/emitter.ts +57 -8
  281. package/src/compiler/encoder.ts +23 -8
  282. package/src/compiler/file-include.ts +9 -3
  283. package/src/compiler/file-loader.ts +197 -38
  284. package/src/compiler/help.ts +10 -14
  285. package/src/compiler/incremental.ts +165 -30
  286. package/src/compiler/init.ts +2 -7
  287. package/src/compiler/instantiation.ts +77 -22
  288. package/src/compiler/jsdoc.ts +3 -1
  289. package/src/compiler/link-tables.ts +82 -37
  290. package/src/compiler/locales/cs-CZ.ts +1 -1
  291. package/src/compiler/locales/de-DE.ts +1 -1
  292. package/src/compiler/locales/es-ES.ts +1 -1
  293. package/src/compiler/locales/fr-FR.ts +1 -1
  294. package/src/compiler/locales/it-IT.ts +1 -1
  295. package/src/compiler/locales/ja-JP.ts +1 -1
  296. package/src/compiler/locales/ko-KR.ts +1 -1
  297. package/src/compiler/locales/pl-PL.ts +1 -1
  298. package/src/compiler/locales/pt-BR.ts +1 -1
  299. package/src/compiler/locales/ru-RU.ts +1 -1
  300. package/src/compiler/locales/tr-TR.ts +1 -1
  301. package/src/compiler/locales/zh-CN.ts +1 -1
  302. package/src/compiler/locales/zh-TW.ts +1 -1
  303. package/src/compiler/module-resolution.ts +44 -8
  304. package/src/compiler/module-specifiers.ts +62 -20
  305. package/src/compiler/name-resolver.ts +9 -1
  306. package/src/compiler/node-builder-names.ts +236 -54
  307. package/src/compiler/node-builder-pseudo.ts +4 -7
  308. package/src/compiler/node-builder-reuse.ts +5 -4
  309. package/src/compiler/node-builder.ts +130 -31
  310. package/src/compiler/option-declarations.ts +33 -103
  311. package/src/compiler/options.ts +23 -62
  312. package/src/compiler/output-paths.ts +5 -18
  313. package/src/compiler/package-entrypoints.ts +345 -0
  314. package/src/compiler/package-json.ts +4 -4
  315. package/src/compiler/parallel-check.ts +326 -52
  316. package/src/compiler/parallel-emit.ts +320 -0
  317. package/src/compiler/parallel-parse.ts +16 -5
  318. package/src/compiler/parse-thread.ts +3 -0
  319. package/src/compiler/parser.ts +156 -39
  320. package/src/compiler/path.ts +22 -2
  321. package/src/compiler/printer/emit-context.ts +21 -0
  322. package/src/compiler/printer/factory-base.ts +10 -3
  323. package/src/compiler/printer/factory.ts +4 -1
  324. package/src/compiler/printer/helpers.ts +10 -1
  325. package/src/compiler/printer/name-generator.ts +24 -2
  326. package/src/compiler/printer/printer.ts +266 -30
  327. package/src/compiler/printer/utilities.ts +8 -2
  328. package/src/compiler/program-checker.ts +57 -5
  329. package/src/compiler/program-utilities.ts +23 -10
  330. package/src/compiler/program.ts +18 -26
  331. package/src/compiler/pseudo-bigint.ts +17 -0
  332. package/src/compiler/regexp-checker.ts +63 -30
  333. package/src/compiler/relations.ts +240 -77
  334. package/src/compiler/reparser.ts +7 -2
  335. package/src/compiler/scanner.ts +109 -79
  336. package/src/compiler/shared-results.ts +2414 -0
  337. package/src/compiler/show-config.ts +18 -1
  338. package/src/compiler/sourcemap.ts +2 -2
  339. package/src/compiler/symbol-accessibility.ts +26 -3
  340. package/src/compiler/symbol.ts +46 -24
  341. package/src/compiler/syntax-kind.ts +188 -187
  342. package/src/compiler/thread-entry.ts +64 -4
  343. package/src/compiler/transformers/alias-references.ts +123 -4
  344. package/src/compiler/transformers/async.ts +2 -17
  345. package/src/compiler/transformers/class-fields.ts +13 -12
  346. package/src/compiler/transformers/commonjs-module.ts +11 -7
  347. package/src/compiler/transformers/declarations-diagnostics.ts +5 -3
  348. package/src/compiler/transformers/declarations-pseudo.ts +2 -4
  349. package/src/compiler/transformers/declarations-resolver.ts +0 -3
  350. package/src/compiler/transformers/declarations-syntactic.ts +1 -21
  351. package/src/compiler/transformers/declarations.ts +134 -48
  352. package/src/compiler/transformers/decorator-metadata.ts +9 -1
  353. package/src/compiler/transformers/destructuring.ts +4 -3
  354. package/src/compiler/transformers/external-module-info.ts +1 -1
  355. package/src/compiler/transformers/jsx.ts +2 -1
  356. package/src/compiler/transformers/reference-resolver.ts +83 -19
  357. package/src/compiler/transformers/runtime-syntax.ts +6 -1
  358. package/src/compiler/transformers/syntax-facts.ts +2 -7
  359. package/src/compiler/transformers/type-eraser.ts +10 -1
  360. package/src/compiler/transformers/type-serialization.ts +3 -2
  361. package/src/compiler/transformers/visitor-base.ts +2 -1
  362. package/src/compiler/transformers/visitor-hooks.ts +9 -4
  363. package/src/compiler/tsc-build.ts +66 -9
  364. package/src/compiler/tsc-cli.ts +7 -0
  365. package/src/compiler/tsc-compile.ts +284 -4
  366. package/src/compiler/tsc-watch.ts +74 -45
  367. package/src/compiler/tsconfig.ts +176 -19
  368. package/src/compiler/type-printer.ts +36 -2
  369. package/src/compiler/types.ts +2 -1
  370. package/src/library/ast.generated.ts +57 -41
  371. package/src/library/compiler-options.generated.ts +117 -103
  372. package/src/library/disk.ts +10 -1
  373. package/src/library/enums.generated.ts +196 -196
@@ -0,0 +1,320 @@
1
+ /**
2
+ * Emitting a program's JavaScript on threads while the main thread checks it (`--checkers 1` in
3
+ * scriptc builds).
4
+ *
5
+ * JavaScript emit needs nothing of a checker but how decorator metadata serializes a type: import
6
+ * elision, export names and const enum values come from syntax, the binder's symbols and the other
7
+ * files of the program (`SyntacticEmitResolver`, `ReferenceResolver`). So emit threads create no
8
+ * checker. They receive the published program, emit with a `JavaScriptEmitter` the files the main
9
+ * thread hands out through a shared counter, write the outputs and send back their emit results.
10
+ * The main thread checks meanwhile, and so does the declaration thread, a checker thread that only
11
+ * emits declarations (`startDeclarationThread`): `--checkers` counts the checkers that check. Then the
12
+ * main thread records how its checker serializes the types of the decorator metadata of the files that
13
+ * have it (`recordMetadataKinds`), which a second wave of emit threads emits with those answers as plain
14
+ * data (`startMetadataEmit`). Which thread emits a file doesn't change its output, and the main
15
+ * thread's checker finds every diagnostic but those of declaration emit.
16
+ */
17
+ import type { Worker } from 'node:worker_threads';
18
+ import { availableParallelism } from 'node:os';
19
+ import { publish } from '@scriptc/threads';
20
+ import { lastNodeIdValue, type SourceFile } from './ast.js';
21
+ import { JavaScriptEmitter, type OutputWriter } from './compile-program.js';
22
+ import type { Diagnostic, DiagnosticFile } from './diagnostics.js';
23
+ import { EmitOnly, EmitResult, sourceFileMayBeEmitted } from './emitter.js';
24
+ import {
25
+ CheckerResult,
26
+ packResult,
27
+ packsResults,
28
+ type PackedResult,
29
+ startParallelCheck,
30
+ unpackResult,
31
+ } from './parallel-check.js';
32
+ import type { CheckedProgram } from './program-checker.js';
33
+ import type { Program } from './program.js';
34
+ import { lastSymbolIdValue } from './symbol.js';
35
+ import { mark } from './timeline.js';
36
+ import { SubtreeFacts, SyntaxFacts } from './transformers/syntax-facts.js';
37
+
38
+ /**
39
+ * Starts emit thread `index` (main.ts owns the worker entry point) on the shared, published
40
+ * `program`: it emits the files of `files` at the positions it takes from `counter`, with the decorator
41
+ * metadata `kinds` the main thread recorded (`startMetadataEmit`); ids continue above `nodeIds` and
42
+ * `symbolIds`.
43
+ */
44
+ export type EmitSpawn = (
45
+ program: Program,
46
+ index: number,
47
+ counter: SharedArrayBuffer,
48
+ files: number[],
49
+ kinds: number[],
50
+ nodeIds: number,
51
+ symbolIds: number,
52
+ ) => Worker;
53
+
54
+ export class ParallelEmit {
55
+ /** Set where emit threads can be started. */
56
+ spawn: EmitSpawn | undefined = undefined;
57
+ }
58
+
59
+ export const parallelEmit = new ParallelEmit();
60
+
61
+ /** The most emit threads: four emitted VS Code's JavaScript as fast as 15 did while one thread checked it. */
62
+ const maxEmitThreads = 4;
63
+
64
+ /**
65
+ * The least text of the files to emit, in characters, for emit threads: starting them and sharing
66
+ * the program takes about as long as emitting this much.
67
+ */
68
+ const littleEmitText = 50_000;
69
+
70
+ /**
71
+ * The number of threads to emit the JavaScript of `program` on, or 0 to emit it on this thread:
72
+ * where threads can start and the program emits enough, one fewer than the CPUs, at most
73
+ * `maxEmitThreads`. `emitKinds` are what the emit of each file includes (`emitsJavaScript`).
74
+ */
75
+ export function emitThreads(
76
+ program: Program,
77
+ singleThreaded: boolean | undefined,
78
+ emitKinds: readonly number[] | undefined = undefined,
79
+ ): number {
80
+ if (parallelEmit.spawn === undefined || singleThreaded === true) return 0;
81
+ const cpus = availableParallelism();
82
+ if (cpus < 2) return 0;
83
+ const files = program.getSourceFiles();
84
+ let text = 0;
85
+ for (let i = 0; i < files.length; i++)
86
+ if (emitsJavaScript(program, emitKinds, i)) {
87
+ text += files[i]!.end;
88
+ if (text >= littleEmitText) return Math.min(cpus - 1, maxEmitThreads);
89
+ }
90
+ return 0;
91
+ }
92
+
93
+ /**
94
+ * Whether the emit of file `index` of `program` includes its JavaScript. `emitKinds` are what the emit of
95
+ * each file includes, by file index: an `EmitOnly`, or -1 for nothing, as an incremental program's pending
96
+ * emit selects (`IncrementalProgram.emitKindsOnCheckers`); `undefined` where every file that may be emitted
97
+ * is emitted in full.
98
+ */
99
+ function emitsJavaScript(program: Program, emitKinds: readonly number[] | undefined, index: number): boolean {
100
+ if (emitKinds === undefined) return sourceFileMayBeEmitted(program.getSourceFiles()[index]!, program.options);
101
+ const kind = emitKinds[index]!;
102
+ return kind === EmitOnly.All || kind === EmitOnly.Js;
103
+ }
104
+
105
+ /**
106
+ * Whether the JavaScript of `file` needs decorator metadata kinds from the checker (`emitDecoratorMetadata`
107
+ * asks it how the types of decorated declarations serialize): a file with decorators is emitted by the second
108
+ * wave of emit threads, with the kinds the main thread's checker recorded after checking (`startMetadataEmit`).
109
+ */
110
+ function needsMetadataKinds(file: SourceFile, program: Program): boolean {
111
+ return program.options.emitDecoratorMetadata === true && new SyntaxFacts().has(file, SubtreeFacts.ContainsDecorators);
112
+ }
113
+
114
+ /**
115
+ * Emits the JavaScript of the files of `checked` whose emit includes it (`emitKinds`) on `threads` threads
116
+ * and calls `done` once they are emitted; the program must be shared (`shareWithCheckers`). The emit results
117
+ * go to `checked.emittedInParallel`, which the program's emit (`PlainProgram`, `IncrementalProgram`) completes
118
+ * on this thread. Returns at once, with the indexes of the files left for `startMetadataEmit`: the results
119
+ * arrive on this thread's event loop.
120
+ */
121
+ export function startParallelEmit(
122
+ checked: CheckedProgram,
123
+ threads: number,
124
+ done: () => void,
125
+ emitKinds: readonly number[] | undefined = undefined,
126
+ ): number[] {
127
+ const program = checked.program;
128
+ const files = program.getSourceFiles();
129
+ const order: number[] = [];
130
+ const metadata: number[] = [];
131
+ for (let i = 0; i < files.length; i++) {
132
+ const file = files[i]!;
133
+ if (!emitsJavaScript(program, emitKinds, i)) continue;
134
+ if (needsMetadataKinds(file, program)) metadata.push(i);
135
+ else order.push(i);
136
+ }
137
+ const perFileEmits: (EmitResult | undefined)[] = [];
138
+ for (let i = 0; i < files.length; i++) perFileEmits.push(undefined);
139
+ checked.emittedInParallel = perFileEmits;
140
+ checked.javaScriptEmittedOnThreads = true;
141
+ spawnEmitThreads(checked, threads, order, [], done);
142
+ return metadata;
143
+ }
144
+
145
+ /**
146
+ * Emits the JavaScript of `files` (indexes, from `startParallelEmit`), whose decorator metadata asks the
147
+ * checker, on `threads` threads with the kinds that this thread's checker gave (`recordMetadataKinds`), and
148
+ * calls `done` once they are emitted. Called once this thread has checked the program, so that asking for the
149
+ * kinds doesn't change what checking finds.
150
+ */
151
+ export function startMetadataEmit(
152
+ checked: CheckedProgram,
153
+ threads: number,
154
+ files: number[],
155
+ kinds: number[],
156
+ done: () => void,
157
+ ): void {
158
+ spawnEmitThreads(checked, Math.min(threads, files.length), files, kinds, done);
159
+ }
160
+
161
+ function spawnEmitThreads(
162
+ checked: CheckedProgram,
163
+ threads: number,
164
+ files: number[],
165
+ kinds: number[],
166
+ done: () => void,
167
+ ): void {
168
+ const program = checked.program;
169
+ const sourceFiles = program.getSourceFiles();
170
+ const perFileEmits = checked.emittedInParallel!;
171
+ const order = files.slice();
172
+ // The longest files first, so that the threads finish together.
173
+ order.sort((a, b) => sourceFiles[b]!.end - sourceFiles[a]!.end || a - b);
174
+ publish(order);
175
+ publish(kinds);
176
+ mark(`planned ${order.length} files to emit`);
177
+ const trace = process.env.TSC_TS_CHECKERS_TRACE !== undefined;
178
+ const start = performance.now();
179
+ const counter = new SharedArrayBuffer(4);
180
+ const diagnosticFiles = new Map<string, DiagnosticFile>();
181
+ let remaining = threads;
182
+ if (remaining === 0) done();
183
+ for (let i = 0; i < threads; i++) {
184
+ const worker = parallelEmit.spawn!(program, i, counter, order, kinds, lastNodeIdValue(), lastSymbolIdValue());
185
+ let ended = false;
186
+ const end = (): void => {
187
+ if (ended) return;
188
+ ended = true;
189
+ remaining--;
190
+ if (remaining === 0) done();
191
+ };
192
+ worker.on('message', (message: unknown) => {
193
+ mark(`result from e${i}`);
194
+ const result = packsResults
195
+ ? unpackResult(message as PackedResult, program, diagnosticFiles)
196
+ : publish((message as { result: CheckerResult }).result);
197
+ for (let k = 0; k < result.files.length; k++) perFileEmits[result.files[k]!] = result.emits[k]!;
198
+ if (trace)
199
+ process.stderr.write(
200
+ `emit threads: thread ${i} emitted ${result.files.length} files${kinds.length > 0 ? ` with metadata kinds (${result.stats[0] ?? 0} missed a kind)` : ''} in ${result.checkTime.toFixed(1)}ms, done at ${(performance.now() - start).toFixed(1)}ms\n`,
201
+ );
202
+ end();
203
+ });
204
+ // The files a failed thread took and did not send back are emitted on this thread (`PlainProgram.emit`).
205
+ worker.on('error', (error: unknown) => {
206
+ if (trace) process.stderr.write(`emit threads: thread ${i} failed: ${String(error)}\n`);
207
+ end();
208
+ });
209
+ }
210
+ mark('emit threads spawned');
211
+ }
212
+
213
+ /** The most checkers that a declaration thread makes faster (`declarationThreadPays`). */
214
+ const maxDeclarationThreadCheckers = 8;
215
+
216
+ /**
217
+ * Whether a declaration thread (`startDeclarationThread`) shortens a compile with `checkers` checkers: it
218
+ * takes the declaration emit off the checkers, but a checker that only emits declarations takes about as long
219
+ * as the whole check of VS Code or typeorm at 16 checkers. Measured with declarations on both: 6-16% faster
220
+ * from 1 to 8 checkers, about even at 12, and 32-38% slower at 16. It also needs a CPU of its own.
221
+ */
222
+ export function declarationThreadPays(checkers: number): boolean {
223
+ return checkers <= maxDeclarationThreadCheckers && checkers < availableParallelism();
224
+ }
225
+
226
+ /**
227
+ * Starts the declaration thread: one checker thread that only emits, while the program is checked on this
228
+ * thread (`--checkers 1`) or on checker threads that emit only JavaScript, and calls `done` once it is done. It
229
+ * emits the declarations of every file of `checked` whose emit includes them (`emitKinds`), and also the
230
+ * JavaScript of `metadata` (file indexes, from `startParallelEmit`), whose decorator metadata asks a checker. Its
231
+ * checker checks only what emit asks; it reports nothing but the emit results, which it writes and which the
232
+ * returned array receives by file index (undefined for a file it didn't emit, which the program's emit then
233
+ * emits here). Declaration files and decorator metadata are the same with any checker that emits them.
234
+ */
235
+ export function startDeclarationThread(
236
+ checked: CheckedProgram,
237
+ metadata: readonly number[],
238
+ done: () => void,
239
+ emitKinds: readonly number[] | undefined = undefined,
240
+ ): (EmitResult | undefined)[] {
241
+ const program = checked.program;
242
+ const options = program.options;
243
+ const files = program.getSourceFiles();
244
+ const kinds: number[] = [];
245
+ const results: (EmitResult | undefined)[] = [];
246
+ for (let i = 0; i < files.length; i++) {
247
+ let declarations: boolean;
248
+ if (emitKinds === undefined) declarations = sourceFileMayBeEmitted(files[i]!, options);
249
+ else declarations = emitKinds[i] === EmitOnly.All || emitKinds[i] === EmitOnly.Dts;
250
+ kinds.push(declarations ? (emitsJavaScript(program, emitKinds, i) ? EmitOnly.DtsAfterJs : EmitOnly.Dts) : -1);
251
+ results.push(undefined);
252
+ }
253
+ for (const i of metadata) kinds[i] = emitKinds === undefined ? EmitOnly.All : emitKinds[i]!;
254
+ startParallelCheck(checked, 1, () => done(), true, kinds, false, results);
255
+ mark('declaration thread spawned');
256
+ return results;
257
+ }
258
+
259
+ /**
260
+ * Starts the declaration thread of a `noEmit` program that reports the errors of declaration emit
261
+ * (`checkersReportDeclarations`): one checker thread that finds the declaration errors of every file of
262
+ * `checked` while the program is checked on this thread, and calls `done` once it is done. Its checker
263
+ * checks only what declaration emit asks; it reports nothing but the declaration errors, which `done`
264
+ * receives by file index (undefined for a file it didn't reach, whose errors
265
+ * `PlainProgram.getDeclarationDiagnostics` then finds here).
266
+ */
267
+ export function startDeclarationErrorThread(
268
+ checked: CheckedProgram,
269
+ done: (declarations: (Diagnostic[] | undefined)[]) => void,
270
+ ): void {
271
+ const results: (Diagnostic[] | undefined)[] = [];
272
+ for (let i = 0; i < checked.program.getSourceFiles().length; i++) results.push(undefined);
273
+ startParallelCheck(checked, 1, () => done(results), true, undefined, false, undefined, results);
274
+ mark('declaration thread spawned');
275
+ }
276
+
277
+ /**
278
+ * On emit thread `index`: emits the JavaScript of the files of `order` at the positions it takes
279
+ * from `counter` until none are left, writing it with `writer`; `kinds` are the decorator metadata kinds
280
+ * the main thread recorded for them (`recordMetadataKinds`), if any. `stats` has the number of files that
281
+ * missed a kind.
282
+ */
283
+ export function emitFromQueue(
284
+ program: Program,
285
+ index: number,
286
+ counter: Int32Array,
287
+ order: readonly number[],
288
+ kinds: readonly number[],
289
+ writer: OutputWriter,
290
+ ): CheckerResult {
291
+ const start = performance.now();
292
+ const files = program.getSourceFiles();
293
+ const emitter = new JavaScriptEmitter(program, kinds);
294
+ mark('emitter ready');
295
+ const done: number[] = [];
296
+ const diagnostics: Diagnostic[][] = [];
297
+ const emits: EmitResult[] = [];
298
+ let missed = 0;
299
+ for (;;) {
300
+ const position = Atomics.add(counter, 0, 1);
301
+ if (position >= order.length) break;
302
+ const i = order[position]!;
303
+ const result = emitter.emit(files[i]!, writer);
304
+ // A file whose emit missed a kind isn't sent back: the main thread emits it again, with its checker.
305
+ if (result === undefined) {
306
+ missed++;
307
+ continue;
308
+ }
309
+ done.push(i);
310
+ diagnostics.push([]);
311
+ emits.push(result);
312
+ }
313
+ mark(`emitted ${done.length} files`);
314
+ return new CheckerResult(index, done, diagnostics, [], [], performance.now() - start, [missed], false, [], emits);
315
+ }
316
+
317
+ /** What an emit thread posts back: `result`, packed for `postMessage` where results are packed. */
318
+ export function postedEmitResult(result: CheckerResult, program: Program): PackedResult | { result: CheckerResult } {
319
+ return packsResults ? packResult(result, program) : { result: publish(result) };
320
+ }
@@ -226,6 +226,13 @@ const maxChunk = 16;
226
226
  /** Files from this size (bytes) on take a parse thread 25 ms or more, and go out ahead of others. */
227
227
  const largeFile = 256 * 1024;
228
228
 
229
+ /**
230
+ * The most text (bytes) a chunk of other files holds, about one large file's: a chunk ends with the file
231
+ * that reaches it. Sixteen of tsc-ts's own compiler sources, 50-200 KB each, made one chunk that kept its
232
+ * thread busy for 30-45 ms after the others were done.
233
+ */
234
+ const maxChunkBytes = largeFile;
235
+
229
236
  /**
230
237
  * The files to hand out to parse threads, each queued once. Library files go out first, one per
231
238
  * chunk, also those found later through `/// <reference lib>`: a large one (`lib.dom.d.ts`) takes a
@@ -233,7 +240,7 @@ const largeFile = 256 * 1024;
233
240
  * Then, for the same reason, large files, one per chunk: root files (TypeScript's 3 MB `checker.ts`,
234
241
  * which in a chunk of root files kept one thread busy after the others were done) and the files the
235
242
  * parse threads found (`csstype`'s 0.9 MB of declarations, found through React's). The other files go
236
- * out in program order, in chunks of up to `maxChunk`.
243
+ * out in program order, in chunks of up to `maxChunk` files and about `maxChunkBytes` of text.
237
244
  */
238
245
  export class ParseQueue {
239
246
  private readonly libraries = new LoadJobs();
@@ -281,7 +288,8 @@ export class ParseQueue {
281
288
 
282
289
  /**
283
290
  * The next chunk for one of `threads` parse threads, or `undefined` when nothing is left. With
284
- * `full`, other files only go out `maxChunk` at a time, and stay queued until there are as many.
291
+ * `full`, other files only go out in full chunks, `maxChunk` files or `maxChunkBytes` of text, and stay
292
+ * queued until there are as many.
285
293
  */
286
294
  next(threads: number, full = false): LoadMessage | undefined {
287
295
  const libraries = this.libraries;
@@ -306,10 +314,13 @@ export class ParseQueue {
306
314
  }
307
315
  const queue = this.others;
308
316
  const left = queue.names.length - this.head;
309
- if (left <= 0 || (full && left < maxChunk)) return undefined;
310
- const size = full ? maxChunk : Math.min(maxChunk, Math.max(1, Math.floor(left / threads)));
317
+ if (left <= 0) return undefined;
318
+ const most = full ? maxChunk : Math.min(maxChunk, Math.max(1, Math.floor(left / threads)));
311
319
  const start = this.head;
312
- const end = start + size;
320
+ let end = start;
321
+ let bytes = 0;
322
+ while (end < queue.names.length && end - start < most && bytes < maxChunkBytes) bytes += queue.sizes[end++]!;
323
+ if (full && end - start < maxChunk && bytes < maxChunkBytes) return undefined;
313
324
  this.head = end;
314
325
  return {
315
326
  stop: false,
@@ -49,6 +49,9 @@ class PreparingHost extends CompilerHost {
49
49
  );
50
50
  const t2 = timeline ? performance.now() : 0;
51
51
  bindSourceFile(file);
52
+ // Published now, while its nodes are in cache: the chunk's publish (`ParseThread.load`) then skips
53
+ // them, where walking the whole chunk's files at once reads each node from memory again.
54
+ publish(file);
52
55
  if (timeline) {
53
56
  const t3 = performance.now();
54
57
  this.readMs += t1 - t0;