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
@@ -33,7 +33,14 @@ import {
33
33
  type OutputWriter,
34
34
  ProgramEmitter,
35
35
  } from './compile-program.js';
36
- import { Diagnostic, DiagnosticFile, RepopulateInfo } from './diagnostics.js';
36
+ import {
37
+ Diagnostic,
38
+ DiagnosticFile,
39
+ type DiagnosticFormatOptions,
40
+ formatDiagnostic,
41
+ formattedReports,
42
+ RepopulateInfo,
43
+ } from './diagnostics.js';
37
44
  import { EmitOnly, EmitResult } from './emitter.js';
38
45
  import { getEmitDeclarations, isIncremental } from './options.js';
39
46
  import { DeclarationSignatureWriter } from './incremental.js';
@@ -45,6 +52,17 @@ import { lastSymbolIdValue } from './symbol.js';
45
52
  import { shareMergedGlobals } from './checker-symbols.js';
46
53
  import { readFileSync } from 'node:fs';
47
54
  import { availableParallelism, totalmem } from 'node:os';
55
+ import {
56
+ forbiddenWords,
57
+ isForbidden,
58
+ maxSharingCheckers,
59
+ numberLogSize,
60
+ recordTableSize,
61
+ resultTableSize,
62
+ shareThreads,
63
+ stringLogSize,
64
+ type ThreadSharingData,
65
+ } from './shared-results.js';
48
66
 
49
67
  /** With TSC_TS_CHECKERS_TRACE: the process's resident and peak resident set in MB (Linux), else 0. */
50
68
  export function residentMB(): number[] {
@@ -66,7 +84,8 @@ export function residentMB(): number[] {
66
84
  * the main thread emits the program (`checkersEmit`). `emitKinds`, by file index, is what the emit of
67
85
  * each file includes (an `EmitOnly`, or -1 for none) where not every output of every file is emitted
68
86
  * (an incremental program's rebuild); `undefined` for all of them. `units` are the statement ranges of
69
- * declaration files the order has positions for (`CheckPlan.units`).
87
+ * declaration files the order has positions for (`CheckPlan.units`). `globalsInFileDiagnostics` is the main
88
+ * thread's `CheckedProgram.globalsInFileDiagnostics`.
70
89
  */
71
90
  export type CheckerSpawn = (
72
91
  program: Program | undefined,
@@ -80,6 +99,8 @@ export type CheckerSpawn = (
80
99
  emitKinds: number[] | undefined,
81
100
  checking: boolean,
82
101
  units: number[],
102
+ globalsInFileDiagnostics: boolean,
103
+ sharing: ThreadSharingData | undefined,
83
104
  ) => Worker;
84
105
 
85
106
  export class ParallelCheck {
@@ -144,10 +165,13 @@ export const recycleFiles: number = Math.max(0, Number(process.env.TSC_TS_RECYCL
144
165
  * text (index, -1 when the program has the file), pos, end, code, category, message,
145
166
  * skippedOnNoEmit, the argument count and indices, its repopulate kind (0 for none) followed by the
146
167
  * module reference (index), mode and package name (index) of other kinds, then its message chain and
147
- * related information as lists. An emit result is emitSkipped, the emitted files, errors and
148
- * unsupported files as lists of indices, then its diagnostics and its declaration signatures as a list
149
- * of indices. `files` and `nums` are typed arrays, which postMessage copies as one block of memory
150
- * each; it copies an array of numbers element by element.
168
+ * related information as lists. A diagnostic of a reported list (the files' diagnostic and declaration
169
+ * diagnostic lists, the global diagnostics and an emit result's diagnostics) is followed by its text in
170
+ * the main thread's report format (`Diagnostic.formatted`, an index, -1 for none). An emit result is
171
+ * emitSkipped, the emitted files, errors and unsupported files as lists of indices, then its
172
+ * diagnostics and its declaration signatures as a list of indices. `files` and `nums` are typed
173
+ * arrays, which postMessage copies as one block of memory each; it copies an array of numbers element
174
+ * by element.
151
175
  */
152
176
  export type PackedResult = {
153
177
  readonly index: number;
@@ -167,7 +191,11 @@ class ResultPacker {
167
191
  readonly strs: string[] = [];
168
192
  private readonly indices = new Map<string, number>();
169
193
 
170
- constructor(private readonly program: Program) {}
194
+ constructor(
195
+ private readonly program: Program,
196
+ /** The main thread's report format, which this thread formats the reported diagnostics in. */
197
+ private readonly format: DiagnosticFormatOptions | undefined,
198
+ ) {}
171
199
 
172
200
  private str(text: string): number {
173
201
  let k = this.indices.get(text);
@@ -184,6 +212,21 @@ class ResultPacker {
184
212
  for (const d of diagnostics) this.diagnostic(d);
185
213
  }
186
214
 
215
+ /** A list the main thread reports: each diagnostic with its text in the report format. */
216
+ reported(diagnostics: readonly Diagnostic[]): void {
217
+ const nums = this.nums;
218
+ const format = this.format;
219
+ nums.push(diagnostics.length);
220
+ for (const d of diagnostics) {
221
+ this.diagnostic(d);
222
+ if (format === undefined) nums.push(-1);
223
+ else {
224
+ nums.push(this.strs.length);
225
+ this.strs.push(formatDiagnostic(d, format));
226
+ }
227
+ }
228
+ }
229
+
187
230
  private strList(texts: readonly string[]): void {
188
231
  this.nums.push(texts.length);
189
232
  for (const text of texts) this.nums.push(this.str(text));
@@ -194,7 +237,7 @@ class ResultPacker {
194
237
  this.strList(result.emittedFiles);
195
238
  this.strList(result.errors);
196
239
  this.strList(result.unsupported);
197
- this.list(result.diagnostics);
240
+ this.reported(result.diagnostics);
198
241
  this.strList(result.declarationSignatures);
199
242
  this.strList(result.heldOutputs);
200
243
  }
@@ -226,11 +269,11 @@ class ResultPacker {
226
269
 
227
270
  /** Packs `result` (on the checker thread) for `postMessage`. */
228
271
  export function packResult(result: CheckerResult, program: Program): PackedResult {
229
- const packer = new ResultPacker(program);
230
- for (const list of result.diagnostics) packer.list(list);
272
+ const packer = new ResultPacker(program, formattedReports.format);
273
+ for (const list of result.diagnostics) packer.reported(list);
231
274
  packer.nums.push(result.declarations.length);
232
- for (const list of result.declarations) packer.list(list);
233
- packer.list(result.globals);
275
+ for (const list of result.declarations) packer.reported(list);
276
+ packer.reported(result.globals);
234
277
  packer.nums.push(result.emits.length);
235
278
  for (const emit of result.emits) packer.emit(emit);
236
279
  return {
@@ -272,6 +315,19 @@ class ResultUnpacker {
272
315
  return result;
273
316
  }
274
317
 
318
+ /** A list `ResultPacker.reported` packed. */
319
+ reported(): Diagnostic[] {
320
+ const n = this.next();
321
+ const result: Diagnostic[] = [];
322
+ for (let k = 0; k < n; k++) {
323
+ const d = this.diagnostic();
324
+ const text = this.next();
325
+ if (text >= 0) d.formatted = this.packed.strs[text]!;
326
+ result.push(d);
327
+ }
328
+ return result;
329
+ }
330
+
275
331
  private diagnostic(): Diagnostic {
276
332
  const strs = this.packed.strs;
277
333
  const name = this.next();
@@ -325,7 +381,7 @@ class ResultUnpacker {
325
381
  this.strList(result.emittedFiles);
326
382
  this.strList(result.errors);
327
383
  this.strList(result.unsupported);
328
- for (const d of this.list()) result.diagnostics.push(d);
384
+ for (const d of this.reported()) result.diagnostics.push(d);
329
385
  this.strList(result.declarationSignatures);
330
386
  this.strList(result.heldOutputs);
331
387
  return result;
@@ -339,11 +395,11 @@ export function unpackResult(
339
395
  ): CheckerResult {
340
396
  const unpacker = new ResultUnpacker(packed, program, files);
341
397
  const diagnostics: Diagnostic[][] = [];
342
- for (let k = 0; k < packed.files.length; k++) diagnostics.push(unpacker.list());
398
+ for (let k = 0; k < packed.files.length; k++) diagnostics.push(unpacker.reported());
343
399
  const declarations: Diagnostic[][] = [];
344
400
  const nd = unpacker.count();
345
- for (let k = 0; k < nd; k++) declarations.push(unpacker.list());
346
- const globals = unpacker.list();
401
+ for (let k = 0; k < nd; k++) declarations.push(unpacker.reported());
402
+ const globals = unpacker.reported();
347
403
  const emits: EmitResult[] = [];
348
404
  const ne = unpacker.count();
349
405
  for (let k = 0; k < ne; k++) emits.push(unpacker.emit());
@@ -650,8 +706,8 @@ class CheckCosts {
650
706
  readonly libraries: number[][],
651
707
  /** What resolving a library costs a checker the first time (`libraryFirstUseShare` of the text it reaches), by index. */
652
708
  readonly libraryCost: number[],
653
- /** The program files (indices) each file of `order` imports, by index. */
654
- readonly imports: (number[] | undefined)[],
709
+ /** The program files (indices) each file imports (`ProcessedFiles.addedFiles`), by index. */
710
+ readonly imports: readonly (readonly number[])[],
655
711
  ) {}
656
712
  }
657
713
 
@@ -696,34 +752,18 @@ function checkCosts(checked: CheckedProgram, order: number[]): CheckCosts {
696
752
  }
697
753
  const length = textLengths(program);
698
754
  for (const i of order) cost[i] = length[i]!;
699
- const indexOf = new Map<SourceFile, number>();
700
- for (let i = 0; i < files.length; i++) indexOf.set(files[i]!, i);
701
- // A file resolved by its own file name is that file (its path is the path of that name).
702
- const byFileName = new Map<string, SourceFile>();
703
- for (const file of files) byFileName.set(file.fileName, file);
704
755
  const checkedFile: boolean[] = [];
705
756
  for (let i = 0; i < files.length; i++) checkedFile.push(false);
706
757
  for (const i of order) checkedFile[i] = true;
707
758
  // Libraries: unchecked modules that are not default libraries (globals every checker has).
708
759
  const isLibrary = (i: number): boolean =>
709
760
  !checkedFile[i]! && !program.isSourceFileDefaultLibrary(files[i]!.path) && isExternalModuleFile(files[i]!);
710
- const edges: (number[] | undefined)[] = [];
711
- const edgesOf = (i: number): number[] => {
712
- let result = edges[i];
713
- if (result === undefined) {
714
- result = [];
715
- for (const target of program.getResolvedFilesOf(files[i]!, byFileName)) {
716
- const k = indexOf.get(target);
717
- if (k !== undefined && k !== i) result.push(k);
718
- }
719
- edges[i] = result;
720
- }
721
- return result;
722
- };
761
+ // The files each file imports: those it added to the program (`ProcessedFiles.addedFiles`).
762
+ const edges = program.addedFiles();
723
763
  const importers = new Map<number, number>();
724
764
  for (const i of order) {
725
765
  const libraries: number[] = [];
726
- for (const k of edgesOf(i)) if (isLibrary(k) && libraries.indexOf(k) < 0) libraries.push(k);
766
+ for (const k of edges[i]!) if (isLibrary(k) && libraries.indexOf(k) < 0) libraries.push(k);
727
767
  librariesOf[i] = libraries;
728
768
  for (const k of libraries) importers.set(k, (importers.get(k) ?? 0) + 1);
729
769
  }
@@ -738,7 +778,7 @@ function checkCosts(checked: CheckedProgram, order: number[]): CheckCosts {
738
778
  while (stack.length > 0) {
739
779
  const k = stack.pop()!;
740
780
  total += length[k]!;
741
- for (const t of edgesOf(k))
781
+ for (const t of edges[k]!)
742
782
  if (!seen.has(t) && isLibrary(t)) {
743
783
  seen.add(t);
744
784
  stack.push(t);
@@ -1523,6 +1563,137 @@ export function traceSingleChecker(checked: CheckedProgram): void {
1523
1563
  );
1524
1564
  }
1525
1565
 
1566
+ /** The file a position of the order checks: a file index, or for a statement range, its file's. */
1567
+ function fileOfPosition(order: readonly number[], units: readonly number[], k: number): number {
1568
+ const i = order[k]!;
1569
+ return i >= 0 ? i : units[3 * (-1 - i)]!;
1570
+ }
1571
+
1572
+ /**
1573
+ * Hands position `k` of the order on to another checker (TSC_TS_SHARE). The handed-on positions are a list in
1574
+ * `handoff`: a lock, their number, the number of checkers that may still hand positions on, then the positions.
1575
+ */
1576
+ function handOff(handoff: Int32Array, k: number): void {
1577
+ while (Atomics.compareExchange(handoff, 0, 0, 1) !== 0) {
1578
+ // Another checker hands a position on or takes one.
1579
+ }
1580
+ const n = handoff[1]!;
1581
+ handoff[3 + n] = k;
1582
+ Atomics.store(handoff, 1, n + 1);
1583
+ Atomics.store(handoff, 0, 0);
1584
+ // Checkers with nothing else to check wait for handed-on positions.
1585
+ Atomics.notify(handoff, 1);
1586
+ }
1587
+
1588
+ /**
1589
+ * Once checker `index` has no more positions of its own: a handed-on position it may check, waiting while other
1590
+ * checkers may still hand some on; -1 when none is left for it.
1591
+ */
1592
+ function waitForHandedOff(
1593
+ handoff: Int32Array,
1594
+ forbidden: Int32Array,
1595
+ count: number,
1596
+ order: readonly number[],
1597
+ units: readonly number[],
1598
+ index: number,
1599
+ ): number {
1600
+ Atomics.sub(handoff, 2, 1);
1601
+ const start = performance.now();
1602
+ for (;;) {
1603
+ const n = Atomics.load(handoff, 1);
1604
+ const k = takeHandedOff(handoff, forbidden, count, order, units, index);
1605
+ if (k >= 0) {
1606
+ // Checking it, this checker may hand positions on again.
1607
+ Atomics.add(handoff, 2, 1);
1608
+ return k;
1609
+ }
1610
+ // The main thread checks what is handed on later, as it does the files of a thread that failed.
1611
+ if (Atomics.load(handoff, 2) === 0 || performance.now() - start > 2000) return -1;
1612
+ Atomics.wait(handoff, 1, n, 1);
1613
+ }
1614
+ }
1615
+
1616
+ /**
1617
+ * A handed-on position checker `index` of `count` may check, removed from the handed-on positions; -1 if there is
1618
+ * none.
1619
+ */
1620
+ function takeHandedOff(
1621
+ handoff: Int32Array,
1622
+ forbidden: Int32Array,
1623
+ count: number,
1624
+ order: readonly number[],
1625
+ units: readonly number[],
1626
+ index: number,
1627
+ ): number {
1628
+ if (Atomics.load(handoff, 1) === 0) return -1;
1629
+ while (Atomics.compareExchange(handoff, 0, 0, 1) !== 0) {
1630
+ // Another checker hands a position on or takes one.
1631
+ }
1632
+ const n = handoff[1]!;
1633
+ let found = -1;
1634
+ for (let j = 0; j < n; j++) {
1635
+ const k = handoff[3 + j]!;
1636
+ if (!isForbidden(forbidden, count, fileOfPosition(order, units, k), index)) {
1637
+ found = k;
1638
+ handoff[3 + j] = handoff[3 + n - 1]!;
1639
+ Atomics.store(handoff, 1, n - 1);
1640
+ break;
1641
+ }
1642
+ }
1643
+ Atomics.store(handoff, 0, 0);
1644
+ return found;
1645
+ }
1646
+
1647
+ /** TSC_TS_SHARE: the sharing data of each of `count` checker threads. */
1648
+ function threadSharingOf(
1649
+ count: number,
1650
+ order: readonly number[],
1651
+ units: readonly number[],
1652
+ files: number,
1653
+ ): ThreadSharingData[] {
1654
+ const takers = new SharedArrayBuffer(4 * files);
1655
+ const forbidden = new SharedArrayBuffer(4 * files * forbiddenWords(count));
1656
+ const handoff = new SharedArrayBuffer(4 * (3 + order.length));
1657
+ new Int32Array(handoff)[2] = count;
1658
+ const taken = new Int32Array(takers);
1659
+ taken.fill(-2);
1660
+ for (let k = 0; k < order.length; k++) {
1661
+ const i = order[k]!;
1662
+ if (i >= 0) {
1663
+ if (taken[i] === -2) taken[i] = 0;
1664
+ } else taken[units[3 * (-1 - i)]!] = -1;
1665
+ }
1666
+ const typeTable = new SharedArrayBuffer(8 * resultTableSize);
1667
+ const returnTable = new SharedArrayBuffer(8 * resultTableSize);
1668
+ const numberLogs: SharedArrayBuffer[] = [];
1669
+ const recordTables: SharedArrayBuffer[] = [];
1670
+ const stringLogs: SharedArrayBuffer[] = [];
1671
+ for (let i = 0; i < count; i++) {
1672
+ numberLogs.push(new SharedArrayBuffer(4 * numberLogSize));
1673
+ recordTables.push(new SharedArrayBuffer(8 * recordTableSize));
1674
+ stringLogs.push(new SharedArrayBuffer(2 * stringLogSize));
1675
+ }
1676
+ const used = new SharedArrayBuffer(8 * count);
1677
+ const data: ThreadSharingData[] = [];
1678
+ for (let i = 0; i < count; i++)
1679
+ data.push({
1680
+ index: i,
1681
+ count,
1682
+ takers,
1683
+ forbidden,
1684
+ handoff,
1685
+ typeTable,
1686
+ returnTable,
1687
+ nodeIds: lastNodeIdValue(),
1688
+ symbolIds: lastSymbolIdValue(),
1689
+ numberLogs,
1690
+ recordTables,
1691
+ stringLogs,
1692
+ used,
1693
+ });
1694
+ return data;
1695
+ }
1696
+
1526
1697
  /**
1527
1698
  * Checks files from the shared queue until it is empty; the main thread and checker threads alike.
1528
1699
  * A checker thread (`onMainThread` false) also sends back its global diagnostics. At `limit` files
@@ -1544,8 +1715,14 @@ export function checkFromQueue(
1544
1715
  emitKinds: readonly number[] | undefined = undefined,
1545
1716
  checking: boolean = true,
1546
1717
  units: readonly number[] = [],
1718
+ sharing: ThreadSharingData | undefined = undefined,
1547
1719
  ): CheckerResult {
1548
1720
  const start = performance.now();
1721
+ // TSC_TS_SHARE: each file's taker, which other checkers then take the results of its declarations from.
1722
+ const takers = sharing === undefined ? undefined : new Int32Array(sharing.takers);
1723
+ const forbidden = sharing === undefined ? undefined : new Int32Array(sharing.forbidden);
1724
+ const handoff = sharing === undefined ? undefined : new Int32Array(sharing.handoff);
1725
+ const sharingCount = sharing === undefined ? 0 : sharing.count;
1549
1726
  const readyAt = Date.now();
1550
1727
  const verbose = process.env.TSC_TS_CHECKERS_TRACE === '3';
1551
1728
  mark('checking');
@@ -1587,16 +1764,29 @@ export function checkFromQueue(
1587
1764
  if (limit > 0 && done.length >= limit) {
1588
1765
  more = true;
1589
1766
  left = reservedBy(index).splice(0);
1767
+ // The thread that continues doesn't share results, so it hands nothing on.
1768
+ if (handoff !== undefined) Atomics.sub(handoff, 2, 1);
1590
1769
  break;
1591
1770
  }
1592
1771
  // Except on checker 0, read the process's memory every 20 ms at most.
1593
1772
  if (retirement > 0 && performance.now() - memoryReadAt >= 20) {
1594
1773
  memoryReadAt = performance.now();
1595
- if (retires(counter, index, retirement)) break;
1774
+ if (retires(counter, index, retirement)) {
1775
+ if (handoff !== undefined) Atomics.sub(handoff, 2, 1);
1776
+ break;
1777
+ }
1596
1778
  }
1597
- const k = takePosition(counter, order.length, index, plan);
1779
+ let k = handoff !== undefined ? takeHandedOff(handoff, forbidden!, sharingCount, order, units, index) : -1;
1780
+ if (k < 0) k = takePosition(counter, order.length, index, plan);
1781
+ if (k < 0 && handoff !== undefined) k = waitForHandedOff(handoff, forbidden!, sharingCount, order, units, index);
1598
1782
  if (k < 0) break;
1599
1783
  const i = order[k]!;
1784
+ // A file this checker took results for before anyone took it goes to another checker.
1785
+ if (forbidden !== undefined && i >= 0 && isForbidden(forbidden, sharingCount, i, index)) {
1786
+ handOff(handoff!, k);
1787
+ continue;
1788
+ }
1789
+ if (takers !== undefined && i >= 0) Atomics.store(takers, i, index + 1);
1600
1790
  if (i < 0) {
1601
1791
  // A statement range of a declaration file, which has nothing to emit.
1602
1792
  const u = -1 - i;
@@ -1642,24 +1832,39 @@ export function checkFromQueue(
1642
1832
  } else if (writer !== undefined) {
1643
1833
  const emitStart = timeline ? performance.now() : 0;
1644
1834
  const kind = (emitKinds === undefined ? EmitOnly.All : emitKinds[i]!) as EmitOnly;
1835
+ // Global diagnostics found while emitting are not reported: the program collects them
1836
+ // before it emits.
1837
+ const checker = checked.checker;
1645
1838
  if (kind < 0) emits.push(new EmitResult());
1646
1839
  else if (signatures !== undefined) {
1647
1840
  signatures.file = files[i]!;
1648
- const result = emitter!.emit([files[i]!], kind, signatures);
1841
+ const result = checker.withoutGlobalDiagnostics(() => emitter!.emit([files[i]!], kind, signatures));
1649
1842
  for (const s of signatures.take()) result.declarationSignatures.push(s);
1650
1843
  if (holding !== undefined) for (const o of holding.take()) result.heldOutputs.push(o);
1651
1844
  emits.push(result);
1652
1845
  } else {
1653
- const result = emitter!.emit([files[i]!], kind, writer);
1846
+ const result = checker.withoutGlobalDiagnostics(() => emitter!.emit([files[i]!], kind, writer));
1654
1847
  if (holding !== undefined) for (const o of holding.take()) result.heldOutputs.push(o);
1655
1848
  emits.push(result);
1656
1849
  }
1657
1850
  if (timeline) markAt(emitStart, `emit ${(performance.now() - emitStart).toFixed(1)} ${files[i]!.fileName}`);
1658
- } else if (emitter !== undefined) declarations.push(declarationDiagnosticsOfFile(emitter, files[i]!));
1851
+ } else if (emitter !== undefined)
1852
+ declarations.push(
1853
+ checked.checker.withoutGlobalDiagnostics(() => declarationDiagnosticsOfFile(emitter, files[i]!)),
1854
+ );
1855
+ // What emitting found and forgot can stay cached in this checker (a missing global type, an
1856
+ // instantiation too deep), where checking a later file would report it: a new checker continues
1857
+ // the schedule, as at the file limit.
1858
+ if (checked.checker.forgottenGlobalDiagnostics() > 0) {
1859
+ more = true;
1860
+ left = reservedBy(index).splice(0);
1861
+ break;
1862
+ }
1659
1863
  }
1660
1864
  mark(`checked ${done.length} files, ${unitsDone.length} ranges`);
1661
- // The main thread reports its own global diagnostics (CheckedProgram.getGlobalDiagnostics).
1662
- const globals = onMainThread ? [] : checked.getGlobalDiagnostics().slice();
1865
+ // On the main thread, those from before checking are the program's own (`ownGlobalDiagnostics`), and
1866
+ // CheckedProgram.getGlobalDiagnostics deduplicates them with these.
1867
+ const globals = (onMainThread ? checked.checker.getGlobalDiagnostics() : checked.getGlobalDiagnostics()).slice();
1663
1868
  let stats: number[] = [];
1664
1869
  if (process.env.TSC_TS_CHECKERS_TRACE !== undefined) {
1665
1870
  const cpu = process.threadCpuUsage();
@@ -1828,7 +2033,11 @@ export function shareWithCheckers(checked: CheckedProgram): void {
1828
2033
  /**
1829
2034
  * Checks `checked` on `checkers` threads and calls `done` once they are done. With `emits`, each thread
1830
2035
  * emits the files it checks (`emitKinds` limits what). With `checking` false, the threads only emit:
1831
- * for a program whose report has no semantic diagnostics, so that no file is checked in full.
2036
+ * for a program whose report has no semantic diagnostics, so that no file is checked in full. With
2037
+ * `emitsTo`, the emit results go only there, by file index, and nothing else the threads find reaches
2038
+ * the program: a declaration thread (parallel-emit.ts), while this thread's checker checks. With
2039
+ * `declarationsTo`, the same holds for the declaration errors of a `noEmit` program
2040
+ * (`checkersReportDeclarations`).
1832
2041
  */
1833
2042
  export function startParallelCheck(
1834
2043
  checked: CheckedProgram,
@@ -1837,6 +2046,8 @@ export function startParallelCheck(
1837
2046
  emits: boolean = true,
1838
2047
  emitKinds: number[] | undefined = undefined,
1839
2048
  checking: boolean = true,
2049
+ emitsTo: (EmitResult | undefined)[] | undefined = undefined,
2050
+ declarationsTo: (Diagnostic[] | undefined)[] | undefined = undefined,
1840
2051
  ): void {
1841
2052
  let count = checkers;
1842
2053
  const start = performance.now();
@@ -1899,11 +2110,22 @@ export function startParallelCheck(
1899
2110
  let remaining = count - firstThread;
1900
2111
  let ownDone = false;
1901
2112
  const finish = (): void => {
2113
+ if (emitsTo !== undefined || declarationsTo !== undefined) {
2114
+ mark('emitted on checker threads');
2115
+ done(performance.now() - start);
2116
+ return;
2117
+ }
1902
2118
  if (checking) {
1903
2119
  joinRanges(checked, units, perUnit, perFile);
1904
- // A thread that failed may have taken files it never checked: check them here.
2120
+ // A thread that failed may have taken files it never checked, and with TSC_TS_SHARE every checker left may
2121
+ // have taken results for declarations of a file handed on: check them here.
2122
+ let left = 0;
1905
2123
  for (const i of order)
1906
- if (i >= 0 && perFile[i] === undefined) perFile[i] = checked.unfilteredDiagnosticsOfFile(files[i]!);
2124
+ if (i >= 0 && perFile[i] === undefined) {
2125
+ perFile[i] = checked.unfilteredDiagnosticsOfFile(files[i]!);
2126
+ left++;
2127
+ }
2128
+ if (trace && left > 0) process.stderr.write(`checkers: the main thread checked ${left} files\n`);
1907
2129
  checked.checkedInParallel = perFile;
1908
2130
  }
1909
2131
  mark('all checked');
@@ -1929,6 +2151,22 @@ export function startParallelCheck(
1929
2151
  done(performance.now() - start);
1930
2152
  };
1931
2153
  const record = (result: CheckerResult): void => {
2154
+ if (declarationsTo !== undefined) {
2155
+ for (let k = 0; k < result.declarations.length; k++) declarationsTo[result.files[k]!] = result.declarations[k]!;
2156
+ if (trace)
2157
+ process.stderr.write(
2158
+ `checkers: emit-only thread ${result.index} found the declaration errors of ${result.declarations.length} files in ${result.checkTime.toFixed(1)}ms, done at ${(performance.now() - start).toFixed(1)}ms rss ${result.stats[7] ?? '?'}MB\n`,
2159
+ );
2160
+ return;
2161
+ }
2162
+ if (emitsTo !== undefined) {
2163
+ for (let k = 0; k < result.emits.length; k++) emitsTo[result.files[k]!] = result.emits[k]!;
2164
+ if (trace)
2165
+ process.stderr.write(
2166
+ `checkers: emit-only thread ${result.index} emitted ${result.emits.length} files in ${result.checkTime.toFixed(1)}ms, done at ${(performance.now() - start).toFixed(1)}ms rss ${result.stats[7] ?? '?'}MB\n`,
2167
+ );
2168
+ return;
2169
+ }
1932
2170
  for (let k = 0; k < result.files.length; k++) perFile[result.files[k]!] = result.diagnostics[k]!;
1933
2171
  for (let k = 0; k < result.declarations.length; k++)
1934
2172
  perFileDeclarations[result.files[k]!] = result.declarations[k]!;
@@ -1950,6 +2188,17 @@ export function startParallelCheck(
1950
2188
  if (remaining === 0 && ownDone) finish();
1951
2189
  };
1952
2190
  const diagnosticFiles = new Map<string, DiagnosticFile>();
2191
+ // TSC_TS_SHARE: checker threads share results (shared-results.ts).
2192
+ const sharing =
2193
+ shareThreads && shared && !mainChecks && count > 1 && count <= maxSharingCheckers
2194
+ ? threadSharingOf(count, order, units, files.length)
2195
+ : undefined;
2196
+ const sharingStarted: boolean[] = [];
2197
+ for (let i = 0; i < count; i++) sharingStarted.push(false);
2198
+ const startSharingOf = (i: number): ThreadSharingData => {
2199
+ sharingStarted[i] = true;
2200
+ return sharing![i]!;
2201
+ };
1953
2202
  const spawn = (i: number, reserved: number[]): void => {
1954
2203
  const worker = parallelCheck.spawn!(
1955
2204
  shared ? program : undefined,
@@ -1963,6 +2212,9 @@ export function startParallelCheck(
1963
2212
  emitKinds,
1964
2213
  checking,
1965
2214
  units,
2215
+ checked.globalsInFileDiagnostics,
2216
+ // A thread that continues another's index doesn't share.
2217
+ reserved.length === 0 && sharing !== undefined && !sharingStarted[i] ? startSharingOf(i) : undefined,
1966
2218
  );
1967
2219
  worker.on('message', (message: unknown) => {
1968
2220
  mark(`result from c${i}`);
@@ -1979,7 +2231,8 @@ export function startParallelCheck(
1979
2231
  else threadDone();
1980
2232
  });
1981
2233
  worker.on('error', (error: unknown) => {
1982
- if (trace) process.stderr.write(`checkers: thread ${i} failed: ${String(error)}\n`);
2234
+ // Sharing results (TSC_TS_SHARE) is still checked for such failures, which the main thread hides otherwise.
2235
+ if (trace || shareThreads) process.stderr.write(`checkers: thread ${i} failed: ${String(error)}\n`);
1983
2236
  threadDone();
1984
2237
  });
1985
2238
  };
@@ -1991,10 +2244,31 @@ export function startParallelCheck(
1991
2244
  mark('reporting checker created');
1992
2245
  const emittedHere =
1993
2246
  !mainChecks && emitKinds === undefined ? emitUncheckedFiles(checked, order, emits) : new Map<number, EmitResult>();
1994
- if (mainChecks)
1995
- record(
1996
- checkFromQueue(checked, 0, new Int32Array(counter), order, epoch, true, 0, [], emits, emitKinds, checking, units),
2247
+ if (mainChecks) {
2248
+ // The program reports the global diagnostics this checker has before checking files as found before
2249
+ // checking; those it finds checking them come with the threads' (`record`).
2250
+ checked.ownGlobalDiagnostics = checked.checker.getGlobalDiagnostics().slice();
2251
+ const own = checkFromQueue(
2252
+ checked,
2253
+ 0,
2254
+ new Int32Array(counter),
2255
+ order,
2256
+ epoch,
2257
+ true,
2258
+ 0,
2259
+ [],
2260
+ emits,
2261
+ emitKinds,
2262
+ checking,
2263
+ units,
1997
2264
  );
2265
+ record(own);
2266
+ // A thread continues where this checker stopped (`checkFromQueue`).
2267
+ if (own.more) {
2268
+ remaining++;
2269
+ spawn(0, own.reserved);
2270
+ }
2271
+ }
1998
2272
  ownDone = true;
1999
2273
  if (remaining === 0) finish();
2000
2274
  }