tsc-ts 0.0.10 → 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 (367) hide show
  1. package/README.md +1 -1
  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 +20 -15
  6. package/dist/api/compiler/ast.js +1023 -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 +173 -123
  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 +469 -438
  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 -113
  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 +210 -74
  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 +137 -34
  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 +93 -31
  73. package/dist/api/compiler/checker.js +143 -35
  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 +19 -4
  77. package/dist/api/compiler/compile-program.js +45 -26
  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.js +7 -7
  81. package/dist/api/compiler/emitter.d.ts +7 -1
  82. package/dist/api/compiler/emitter.js +53 -11
  83. package/dist/api/compiler/file-include.d.ts +2 -1
  84. package/dist/api/compiler/file-include.js +11 -7
  85. package/dist/api/compiler/file-loader.d.ts +10 -0
  86. package/dist/api/compiler/file-loader.js +138 -41
  87. package/dist/api/compiler/instantiation.d.ts +7 -0
  88. package/dist/api/compiler/instantiation.js +101 -49
  89. package/dist/api/compiler/jsdoc.js +23 -23
  90. package/dist/api/compiler/link-tables.d.ts +48 -18
  91. package/dist/api/compiler/link-tables.js +80 -37
  92. package/dist/api/compiler/locales/cs-CZ.d.ts +1 -1
  93. package/dist/api/compiler/locales/cs-CZ.js +1 -1
  94. package/dist/api/compiler/locales/de-DE.d.ts +1 -1
  95. package/dist/api/compiler/locales/de-DE.js +1 -1
  96. package/dist/api/compiler/locales/es-ES.d.ts +1 -1
  97. package/dist/api/compiler/locales/es-ES.js +1 -1
  98. package/dist/api/compiler/locales/fr-FR.d.ts +1 -1
  99. package/dist/api/compiler/locales/fr-FR.js +1 -1
  100. package/dist/api/compiler/locales/it-IT.d.ts +1 -1
  101. package/dist/api/compiler/locales/it-IT.js +1 -1
  102. package/dist/api/compiler/locales/ja-JP.d.ts +1 -1
  103. package/dist/api/compiler/locales/ja-JP.js +1 -1
  104. package/dist/api/compiler/locales/ko-KR.d.ts +1 -1
  105. package/dist/api/compiler/locales/ko-KR.js +1 -1
  106. package/dist/api/compiler/locales/pl-PL.d.ts +1 -1
  107. package/dist/api/compiler/locales/pl-PL.js +1 -1
  108. package/dist/api/compiler/locales/pt-BR.d.ts +1 -1
  109. package/dist/api/compiler/locales/pt-BR.js +1 -1
  110. package/dist/api/compiler/locales/ru-RU.d.ts +1 -1
  111. package/dist/api/compiler/locales/ru-RU.js +1 -1
  112. package/dist/api/compiler/locales/tr-TR.d.ts +1 -1
  113. package/dist/api/compiler/locales/tr-TR.js +1 -1
  114. package/dist/api/compiler/locales/zh-CN.d.ts +1 -1
  115. package/dist/api/compiler/locales/zh-CN.js +1 -1
  116. package/dist/api/compiler/locales/zh-TW.d.ts +1 -1
  117. package/dist/api/compiler/locales/zh-TW.js +1 -1
  118. package/dist/api/compiler/module-resolution-types.js +6 -6
  119. package/dist/api/compiler/module-resolution.d.ts +10 -1
  120. package/dist/api/compiler/module-resolution.js +115 -84
  121. package/dist/api/compiler/module-specifiers.d.ts +15 -0
  122. package/dist/api/compiler/module-specifiers.js +24 -18
  123. package/dist/api/compiler/name-resolver.js +74 -65
  124. package/dist/api/compiler/node-builder-names.d.ts +11 -3
  125. package/dist/api/compiler/node-builder-names.js +210 -90
  126. package/dist/api/compiler/node-builder-pseudo.js +29 -31
  127. package/dist/api/compiler/node-builder-reuse.js +23 -22
  128. package/dist/api/compiler/node-builder.d.ts +18 -1
  129. package/dist/api/compiler/node-builder.js +191 -102
  130. package/dist/api/compiler/option-declarations.d.ts +2 -6
  131. package/dist/api/compiler/option-declarations.js +315 -375
  132. package/dist/api/compiler/options.d.ts +15 -33
  133. package/dist/api/compiler/options.js +21 -54
  134. package/dist/api/compiler/output-paths.d.ts +4 -1
  135. package/dist/api/compiler/output-paths.js +6 -11
  136. package/dist/api/compiler/package-json.d.ts +3 -3
  137. package/dist/api/compiler/package-json.js +11 -10
  138. package/dist/api/compiler/parser.d.ts +40 -19
  139. package/dist/api/compiler/parser.js +308 -216
  140. package/dist/api/compiler/path.d.ts +9 -0
  141. package/dist/api/compiler/path.js +20 -3
  142. package/dist/api/compiler/printer/emit-context.d.ts +3 -1
  143. package/dist/api/compiler/printer/emit-context.js +16 -1
  144. package/dist/api/compiler/printer/factory-base.d.ts +2 -2
  145. package/dist/api/compiler/printer/factory-base.js +7 -3
  146. package/dist/api/compiler/printer/factory.js +3 -1
  147. package/dist/api/compiler/printer/helpers.js +10 -1
  148. package/dist/api/compiler/printer/name-generator.d.ts +1 -1
  149. package/dist/api/compiler/printer/name-generator.js +35 -16
  150. package/dist/api/compiler/printer/printer.d.ts +1 -0
  151. package/dist/api/compiler/printer/printer.js +303 -281
  152. package/dist/api/compiler/printer/utilities.js +149 -147
  153. package/dist/api/compiler/program-checker.d.ts +8 -2
  154. package/dist/api/compiler/program-checker.js +84 -34
  155. package/dist/api/compiler/program-utilities.d.ts +3 -1
  156. package/dist/api/compiler/program-utilities.js +28 -15
  157. package/dist/api/compiler/program.d.ts +2 -0
  158. package/dist/api/compiler/program.js +69 -57
  159. package/dist/api/compiler/pseudo-bigint.d.ts +2 -0
  160. package/dist/api/compiler/pseudo-bigint.js +18 -0
  161. package/dist/api/compiler/regexp-checker.d.ts +1 -1
  162. package/dist/api/compiler/regexp-checker.js +93 -76
  163. package/dist/api/compiler/relations.d.ts +27 -4
  164. package/dist/api/compiler/relations.js +337 -180
  165. package/dist/api/compiler/reparser.js +60 -56
  166. package/dist/api/compiler/scanner.d.ts +19 -2
  167. package/dist/api/compiler/scanner.js +123 -108
  168. package/dist/api/compiler/shared-results.d.ts +463 -0
  169. package/dist/api/compiler/shared-results.js +2128 -0
  170. package/dist/api/compiler/sourcemap.js +2 -2
  171. package/dist/api/compiler/symbol-accessibility.js +87 -74
  172. package/dist/api/compiler/symbol.d.ts +22 -13
  173. package/dist/api/compiler/symbol.js +15 -1
  174. package/dist/api/compiler/syntax-kind.d.ts +198 -197
  175. package/dist/api/compiler/transformers/alias-references.js +247 -139
  176. package/dist/api/compiler/transformers/async-utilities.js +25 -25
  177. package/dist/api/compiler/transformers/async.d.ts +0 -1
  178. package/dist/api/compiler/transformers/async.js +64 -77
  179. package/dist/api/compiler/transformers/class-fields.d.ts +1 -0
  180. package/dist/api/compiler/transformers/class-fields.js +81 -78
  181. package/dist/api/compiler/transformers/commonjs-module.js +18 -15
  182. package/dist/api/compiler/transformers/const-enum-inliner.js +1 -1
  183. package/dist/api/compiler/transformers/declarations-diagnostics.js +247 -244
  184. package/dist/api/compiler/transformers/declarations-pseudo.js +100 -100
  185. package/dist/api/compiler/transformers/declarations-resolver.d.ts +0 -3
  186. package/dist/api/compiler/transformers/declarations-syntactic.d.ts +1 -2
  187. package/dist/api/compiler/transformers/declarations-syntactic.js +134 -156
  188. package/dist/api/compiler/transformers/declarations-tracker.js +18 -18
  189. package/dist/api/compiler/transformers/declarations.d.ts +4 -1
  190. package/dist/api/compiler/transformers/declarations.js +305 -238
  191. package/dist/api/compiler/transformers/decorator-metadata.d.ts +1 -1
  192. package/dist/api/compiler/transformers/decorator-metadata.js +53 -45
  193. package/dist/api/compiler/transformers/decorator-utilities.js +24 -24
  194. package/dist/api/compiler/transformers/destructuring.js +19 -18
  195. package/dist/api/compiler/transformers/emit-resolver.js +1 -1
  196. package/dist/api/compiler/transformers/es-decorators.js +55 -55
  197. package/dist/api/compiler/transformers/external-module-info.js +3 -3
  198. package/dist/api/compiler/transformers/for-await.js +25 -25
  199. package/dist/api/compiler/transformers/import-elision.js +14 -14
  200. package/dist/api/compiler/transformers/jsx.js +12 -12
  201. package/dist/api/compiler/transformers/legacy-decorators.js +17 -17
  202. package/dist/api/compiler/transformers/module.js +8 -8
  203. package/dist/api/compiler/transformers/named-evaluation.js +4 -4
  204. package/dist/api/compiler/transformers/object-rest-spread.js +20 -20
  205. package/dist/api/compiler/transformers/optional-chain.js +10 -10
  206. package/dist/api/compiler/transformers/reference-resolver.d.ts +12 -1
  207. package/dist/api/compiler/transformers/reference-resolver.js +131 -69
  208. package/dist/api/compiler/transformers/runtime-syntax.js +35 -31
  209. package/dist/api/compiler/transformers/subtree-facts.js +47 -47
  210. package/dist/api/compiler/transformers/syntax-facts.js +56 -58
  211. package/dist/api/compiler/transformers/type-eraser.js +73 -66
  212. package/dist/api/compiler/transformers/type-serialization.js +24 -24
  213. package/dist/api/compiler/transformers/using.js +12 -12
  214. package/dist/api/compiler/transformers/utilities.js +77 -77
  215. package/dist/api/compiler/transformers/visitor-base.js +172 -172
  216. package/dist/api/compiler/transformers/visitor-hooks.js +6 -2
  217. package/dist/api/compiler/tsconfig.d.ts +10 -2
  218. package/dist/api/compiler/tsconfig.js +136 -48
  219. package/dist/api/compiler/type-printer.js +40 -3
  220. package/dist/api/compiler/types.d.ts +2 -1
  221. package/dist/api/library/ast.generated.d.ts +42 -39
  222. package/dist/api/library/ast.generated.js +1 -1
  223. package/dist/api/library/compiler-options.generated.d.ts +111 -100
  224. package/dist/api/library/compiler-options.generated.js +1 -1
  225. package/dist/api/library/disk.js +12 -1
  226. package/dist/api/library/enums.generated.d.ts +206 -206
  227. package/dist/api/library/enums.generated.js +206 -206
  228. package/dist/api/library/nodes.js +26 -26
  229. package/package.json +9 -9
  230. package/src/compiler/ast-utilities.ts +99 -7
  231. package/src/compiler/ast.ts +55 -26
  232. package/src/compiler/binder.ts +39 -4
  233. package/src/compiler/character-codes.ts +2 -2
  234. package/src/compiler/checker-calls.ts +76 -8
  235. package/src/compiler/checker-classes.ts +78 -24
  236. package/src/compiler/checker-contextual.ts +6 -1
  237. package/src/compiler/checker-declarations.ts +31 -4
  238. package/src/compiler/checker-declared-types.ts +8 -5
  239. package/src/compiler/checker-decorators.ts +1 -1
  240. package/src/compiler/checker-deprecation.ts +29 -8
  241. package/src/compiler/checker-destructuring.ts +10 -3
  242. package/src/compiler/checker-emit-helpers.ts +1 -0
  243. package/src/compiler/checker-emit-resolver.ts +16 -6
  244. package/src/compiler/checker-expressions.ts +79 -46
  245. package/src/compiler/checker-functions.ts +21 -6
  246. package/src/compiler/checker-generated-code.ts +2 -22
  247. package/src/compiler/checker-grammar.ts +133 -60
  248. package/src/compiler/checker-heritage.ts +22 -21
  249. package/src/compiler/checker-inference.ts +514 -87
  250. package/src/compiler/checker-iteration.ts +18 -31
  251. package/src/compiler/checker-javascript.ts +1 -1
  252. package/src/compiler/checker-jsdoc.ts +50 -27
  253. package/src/compiler/checker-jsx.ts +26 -4
  254. package/src/compiler/checker-members.ts +197 -55
  255. package/src/compiler/checker-modules.ts +332 -65
  256. package/src/compiler/checker-narrowing.ts +98 -19
  257. package/src/compiler/checker-object-literals.ts +3 -0
  258. package/src/compiler/checker-operators.ts +11 -4
  259. package/src/compiler/checker-property-access.ts +7 -2
  260. package/src/compiler/checker-services.ts +39 -12
  261. package/src/compiler/checker-signatures.ts +15 -1
  262. package/src/compiler/checker-source-file.ts +39 -13
  263. package/src/compiler/checker-statements.ts +3 -2
  264. package/src/compiler/checker-symbol-types.ts +29 -6
  265. package/src/compiler/checker-symbols.ts +158 -15
  266. package/src/compiler/checker-type-factory.ts +120 -21
  267. package/src/compiler/checker-type-nodes.ts +46 -3
  268. package/src/compiler/checker-type-operators.ts +83 -26
  269. package/src/compiler/checker-types.ts +147 -4
  270. package/src/compiler/checker-unused.ts +9 -14
  271. package/src/compiler/checker.ts +168 -41
  272. package/src/compiler/command-line.ts +28 -28
  273. package/src/compiler/compile-program.ts +51 -25
  274. package/src/compiler/decoder.ts +13 -4
  275. package/src/compiler/diagnostic-messages.ts +1973 -1892
  276. package/src/compiler/emitter.ts +57 -8
  277. package/src/compiler/encoder.ts +23 -8
  278. package/src/compiler/file-include.ts +9 -3
  279. package/src/compiler/file-loader.ts +139 -32
  280. package/src/compiler/help.ts +10 -14
  281. package/src/compiler/incremental.ts +86 -18
  282. package/src/compiler/init.ts +2 -7
  283. package/src/compiler/instantiation.ts +77 -22
  284. package/src/compiler/jsdoc.ts +3 -1
  285. package/src/compiler/link-tables.ts +82 -37
  286. package/src/compiler/locales/cs-CZ.ts +1 -1
  287. package/src/compiler/locales/de-DE.ts +1 -1
  288. package/src/compiler/locales/es-ES.ts +1 -1
  289. package/src/compiler/locales/fr-FR.ts +1 -1
  290. package/src/compiler/locales/it-IT.ts +1 -1
  291. package/src/compiler/locales/ja-JP.ts +1 -1
  292. package/src/compiler/locales/ko-KR.ts +1 -1
  293. package/src/compiler/locales/pl-PL.ts +1 -1
  294. package/src/compiler/locales/pt-BR.ts +1 -1
  295. package/src/compiler/locales/ru-RU.ts +1 -1
  296. package/src/compiler/locales/tr-TR.ts +1 -1
  297. package/src/compiler/locales/zh-CN.ts +1 -1
  298. package/src/compiler/locales/zh-TW.ts +1 -1
  299. package/src/compiler/module-resolution.ts +44 -8
  300. package/src/compiler/module-specifiers.ts +62 -20
  301. package/src/compiler/name-resolver.ts +9 -1
  302. package/src/compiler/node-builder-names.ts +236 -54
  303. package/src/compiler/node-builder-pseudo.ts +4 -7
  304. package/src/compiler/node-builder-reuse.ts +5 -4
  305. package/src/compiler/node-builder.ts +130 -31
  306. package/src/compiler/option-declarations.ts +33 -103
  307. package/src/compiler/options.ts +23 -62
  308. package/src/compiler/output-paths.ts +5 -18
  309. package/src/compiler/package-entrypoints.ts +345 -0
  310. package/src/compiler/package-json.ts +4 -4
  311. package/src/compiler/parallel-check.ts +197 -8
  312. package/src/compiler/parallel-emit.ts +1 -1
  313. package/src/compiler/parser.ts +156 -39
  314. package/src/compiler/path.ts +22 -2
  315. package/src/compiler/printer/emit-context.ts +16 -0
  316. package/src/compiler/printer/factory-base.ts +10 -3
  317. package/src/compiler/printer/factory.ts +4 -1
  318. package/src/compiler/printer/helpers.ts +10 -1
  319. package/src/compiler/printer/name-generator.ts +24 -2
  320. package/src/compiler/printer/printer.ts +35 -14
  321. package/src/compiler/printer/utilities.ts +8 -2
  322. package/src/compiler/program-checker.ts +53 -5
  323. package/src/compiler/program-utilities.ts +23 -10
  324. package/src/compiler/program.ts +13 -1
  325. package/src/compiler/pseudo-bigint.ts +17 -0
  326. package/src/compiler/regexp-checker.ts +63 -30
  327. package/src/compiler/relations.ts +233 -77
  328. package/src/compiler/reparser.ts +7 -2
  329. package/src/compiler/scanner.ts +109 -79
  330. package/src/compiler/shared-results.ts +2414 -0
  331. package/src/compiler/show-config.ts +18 -1
  332. package/src/compiler/sourcemap.ts +2 -2
  333. package/src/compiler/symbol-accessibility.ts +26 -3
  334. package/src/compiler/symbol.ts +31 -14
  335. package/src/compiler/syntax-kind.ts +188 -187
  336. package/src/compiler/thread-entry.ts +19 -2
  337. package/src/compiler/transformers/alias-references.ts +123 -4
  338. package/src/compiler/transformers/async.ts +2 -17
  339. package/src/compiler/transformers/class-fields.ts +13 -12
  340. package/src/compiler/transformers/commonjs-module.ts +11 -7
  341. package/src/compiler/transformers/declarations-diagnostics.ts +5 -3
  342. package/src/compiler/transformers/declarations-pseudo.ts +2 -4
  343. package/src/compiler/transformers/declarations-resolver.ts +0 -3
  344. package/src/compiler/transformers/declarations-syntactic.ts +1 -21
  345. package/src/compiler/transformers/declarations.ts +134 -48
  346. package/src/compiler/transformers/decorator-metadata.ts +9 -1
  347. package/src/compiler/transformers/destructuring.ts +4 -3
  348. package/src/compiler/transformers/external-module-info.ts +1 -1
  349. package/src/compiler/transformers/jsx.ts +2 -1
  350. package/src/compiler/transformers/reference-resolver.ts +83 -19
  351. package/src/compiler/transformers/runtime-syntax.ts +6 -1
  352. package/src/compiler/transformers/syntax-facts.ts +2 -7
  353. package/src/compiler/transformers/type-eraser.ts +10 -1
  354. package/src/compiler/transformers/type-serialization.ts +3 -2
  355. package/src/compiler/transformers/visitor-base.ts +2 -1
  356. package/src/compiler/transformers/visitor-hooks.ts +9 -4
  357. package/src/compiler/tsc-build.ts +3 -0
  358. package/src/compiler/tsc-cli.ts +2 -0
  359. package/src/compiler/tsc-compile.ts +7 -2
  360. package/src/compiler/tsc-watch.ts +74 -45
  361. package/src/compiler/tsconfig.ts +176 -19
  362. package/src/compiler/type-printer.ts +36 -2
  363. package/src/compiler/types.ts +2 -1
  364. package/src/library/ast.generated.ts +57 -41
  365. package/src/library/compiler-options.generated.ts +117 -103
  366. package/src/library/disk.ts +10 -1
  367. package/src/library/enums.generated.ts +196 -196
@@ -1,7 +1,7 @@
1
1
  // Emits JavaScript and declarations for source files: runs the transforms, prints, and writes
2
2
  // the output, source map and `//# sourceMappingURL` comment.
3
3
  import { ScriptKind, type SourceFile } from './ast.js';
4
- import { compareDiagnostics, type Diagnostic } from './diagnostics.js';
4
+ import { compareDiagnostics, equalDiagnostics, type Diagnostic } from './diagnostics.js';
5
5
  import { type CompilerOptions, JsxEmit, NewLineKind, getEmitScriptTarget, getIsolatedModules } from './options.js';
6
6
  import { LanguageVariant } from './types.js';
7
7
  import { type OutputPathsHost, getOutputPathsFor } from './output-paths.js';
@@ -33,7 +33,7 @@ import { RuntimeSyntax } from './transformers/runtime-syntax.js';
33
33
  import { ConstEnumInliner } from './transformers/const-enum-inliner.js';
34
34
  import { addDownlevelTransformers } from './transformers/downlevel.js';
35
35
  import { JsxTransformer } from './transformers/jsx.js';
36
- import { SyntaxFacts } from './transformers/syntax-facts.js';
36
+ import { SubtreeFacts, SyntaxFacts } from './transformers/syntax-facts.js';
37
37
  import { LegacyDecorators } from './transformers/legacy-decorators.js';
38
38
  import { DecoratorMetadata } from './transformers/decorator-metadata.js';
39
39
 
@@ -143,6 +143,12 @@ export const enum EmitOnly {
143
143
  * signature of incremental builds; it is written with its errors and without a map.
144
144
  */
145
145
  ForcedDts,
146
+ /**
147
+ * The declaration file of a file whose JavaScript this build emits in a separate request, such as on another
148
+ * thread. tsgo emits both with one emit context, so the emit flags its JavaScript transforms set on the file's
149
+ * own nodes also apply to its declarations; this replays those transforms first.
150
+ */
151
+ DtsAfterJs,
146
152
  }
147
153
 
148
154
  export function emitFiles(host: EmitHost, files: readonly SourceFile[], emitOnly: EmitOnly = EmitOnly.All): EmitResult {
@@ -157,21 +163,44 @@ export function emitFiles(host: EmitHost, files: readonly SourceFile[], emitOnly
157
163
  const file = files[i];
158
164
  if (!sourceFileMayBeEmitted(file, options) || host.isSourceFileFromExternalLibrary(file)) continue;
159
165
  const paths = getOutputPathsFor(file.fileName, file.scriptKind === ScriptKind.JSON, options, host, forced);
166
+ // As in tsgo, a file's JavaScript and declarations share one emit context: emit flags that JavaScript
167
+ // transforms set on the file's own nodes, such as a decorated parameter's name, also apply to its declarations.
168
+ const context = new EmitContext();
160
169
  if (paths.jsFilePath !== '' && (emitOnly === EmitOnly.All || emitOnly === EmitOnly.Js)) {
161
170
  if (host.isEmitBlocked(paths.jsFilePath)) result.emitSkipped = true;
162
- else emitJSFile(host, file, paths.jsFilePath, paths.sourceMapFilePath, result);
171
+ else emitJSFile(host, context, file, paths.jsFilePath, paths.sourceMapFilePath, result);
163
172
  }
164
173
  if (paths.declarationFilePath !== '' && emitOnly !== EmitOnly.Js) {
165
174
  if (!forced && host.isEmitBlocked(paths.declarationFilePath)) result.emitSkipped = true;
166
- else emitDeclarationFile(host, file, paths.declarationFilePath, paths.declarationMapPath, result, forced);
175
+ else {
176
+ if (emitOnly === EmitOnly.DtsAfterJs && paths.jsFilePath !== '') replayScriptTransforms(host, context, file);
177
+ emitDeclarationFile(host, context, file, paths.declarationFilePath, paths.declarationMapPath, result, forced);
178
+ }
167
179
  }
168
180
  }
169
181
  return result;
170
182
  }
171
183
 
184
+ /**
185
+ * Runs the JavaScript transforms of `file` in `context` without printing, for the emit flags they set on the
186
+ * file's own nodes. Only the decorator transforms set any that declaration emit prints (on decorated parameters'
187
+ * names), so files without decorators are skipped.
188
+ */
189
+ function replayScriptTransforms(host: EmitHost, context: EmitContext, file: SourceFile): void {
190
+ if (!new SyntaxFacts().has(file, SubtreeFacts.ContainsDecorators)) return;
191
+ let transformed = file;
192
+ const transformers = getScriptTransformers(host, context, file);
193
+ for (let i = 0; i < transformers.length; i++) {
194
+ const transformer = transformers[i];
195
+ if (transformer.unsupported !== '') return;
196
+ transformed = transformer.transformSourceFile(transformed);
197
+ }
198
+ }
199
+
172
200
  /** Emits a declaration file; the host's resolver must be a `DeclarationEmitResolver`. */
173
201
  function emitDeclarationFile(
174
202
  host: EmitHost,
203
+ context: EmitContext,
175
204
  file: SourceFile,
176
205
  declarationFilePath: string,
177
206
  declarationMapPath: string,
@@ -184,7 +213,6 @@ function emitDeclarationFile(
184
213
  return false;
185
214
  }
186
215
  const options = host.options;
187
- const context = new EmitContext();
188
216
  const transformer = new DeclarationTransformer(context, host, options, resolver, declarationFilePath);
189
217
  const transformed = transformer.transformSourceFile(file);
190
218
  result.declarationTransformed = true;
@@ -214,11 +242,32 @@ function emitDeclarationFile(
214
242
  emitSourceMaps,
215
243
  false,
216
244
  result,
217
- // Sorted, as tsgo's emitter diagnostics are; the order is part of the file's signature in build info.
218
- diagnostics.length > 1 ? diagnostics.toSorted(compareDiagnostics) : diagnostics,
245
+ emitterDiagnostics(diagnostics),
219
246
  );
220
247
  }
221
248
 
249
+ /**
250
+ * Declaration diagnostics as tsgo's emitter collects them: sorted, without repeats of an equal
251
+ * diagnostic. They are part of the file's signature in build info.
252
+ */
253
+ function emitterDiagnostics(diagnostics: readonly Diagnostic[]): readonly Diagnostic[] {
254
+ if (diagnostics.length < 2) return diagnostics;
255
+ const sorted = diagnostics.toSorted(compareDiagnostics);
256
+ const result: Diagnostic[] = [];
257
+ for (const diagnostic of sorted) {
258
+ // Equal diagnostics compare as 0, so a repeat is among the last ones kept that compare as 0.
259
+ let repeated = false;
260
+ for (let i = result.length - 1; i >= 0 && compareDiagnostics(result[i], diagnostic) === 0; i--) {
261
+ if (equalDiagnostics(result[i], diagnostic)) {
262
+ repeated = true;
263
+ break;
264
+ }
265
+ }
266
+ if (!repeated) result.push(diagnostic);
267
+ }
268
+ return result;
269
+ }
270
+
222
271
  function getScriptTransformers(host: EmitHost, context: EmitContext, file: SourceFile): Transformer[] {
223
272
  const options = host.options;
224
273
  const facts = new TypeScriptFacts();
@@ -248,13 +297,13 @@ function isJsxTransformEnabled(options: CompilerOptions): boolean {
248
297
 
249
298
  function emitJSFile(
250
299
  host: EmitHost,
300
+ context: EmitContext,
251
301
  file: SourceFile,
252
302
  jsFilePath: string,
253
303
  sourceMapFilePath: string,
254
304
  result: EmitResult,
255
305
  ): boolean {
256
306
  const options = host.options;
257
- const context = new EmitContext();
258
307
  let transformed = file;
259
308
  const transformers = getScriptTransformers(host, context, file);
260
309
  for (let i = 0; i < transformers.length; i++) {
@@ -1,7 +1,7 @@
1
- // Encodes a source file in TypeScript 7's binary AST format (protocol version 5), the
1
+ // Encodes a source file in TypeScript 7.1's binary AST format (protocol version 9), the
2
2
  // `getSourceFile` payload of the API.
3
3
  //
4
- // Layout: a 44-byte header, string offsets (UTF-8 start/end pairs), string data (the
4
+ // Layout: a 64-byte header, string offsets (UTF-8 start/end pairs), string data (the
5
5
  // UTF-8 file text, then strings that aren't slices of it), extended node data,
6
6
  // msgpack structured data, and 28-byte node records in visit order. Node positions are
7
7
  // UTF-16 offsets.
@@ -197,10 +197,10 @@ import { SyntaxKind } from './syntax-kind.js';
197
197
  import { hash128 } from './xxh3.js';
198
198
  import { utf8Offsets } from './character-codes.js';
199
199
 
200
- export const protocolVersion = 5;
200
+ export const protocolVersion = 9;
201
201
 
202
202
  const nodeSize = 28;
203
- const headerSize = 44;
203
+ const headerSize = 64;
204
204
  const nodeListKind = 0xffffffff;
205
205
  const noStructuredData = 0xffffffff;
206
206
 
@@ -210,6 +210,11 @@ const dataTypeExtended = 2 << 30;
210
210
 
211
211
  const utf8Encoder = new TextEncoder();
212
212
 
213
+ /** A node list record's last word: 1 when the list ends with a comma. */
214
+ function trailingComma(list: NodeList): number {
215
+ return list.hasTrailingComma() ? 1 : 0;
216
+ }
217
+
213
218
  /** A growable little-endian byte buffer. */
214
219
  class ByteWriter {
215
220
  bytes: Uint8Array;
@@ -1261,7 +1266,8 @@ function childrenPropertyMask(node: Node): number {
1261
1266
  return node instanceof ModuleDeclaration
1262
1267
  ? (hasModifiers((node as ModuleDeclaration).modifiers) ? 1 : 0) |
1263
1268
  ((node as ModuleDeclaration).name !== undefined ? 2 : 0) |
1264
- ((node as ModuleDeclaration).body !== undefined ? 4 : 0)
1269
+ ((node as ModuleDeclaration).attributes !== undefined ? 4 : 0) |
1270
+ ((node as ModuleDeclaration).body !== undefined ? 8 : 0)
1265
1271
  : 0;
1266
1272
  case SyntaxKind.ImportEqualsDeclaration:
1267
1273
  return node instanceof ImportEqualsDeclaration
@@ -1381,6 +1387,7 @@ function commonData(node: Node): number {
1381
1387
  if (!(node instanceof ImportClause)) return 0;
1382
1388
  if ((node as ImportClause).phaseModifier === SyntaxKind.TypeKeyword) return 1 << 24;
1383
1389
  if ((node as ImportClause).phaseModifier === SyntaxKind.DeferKeyword) return 2 << 24;
1390
+ if ((node as ImportClause).phaseModifier === SyntaxKind.SourceKeyword) return 3 << 24;
1384
1391
  return 0;
1385
1392
  case SyntaxKind.ImportSpecifier:
1386
1393
  return node instanceof ImportSpecifier ? bit((node as ImportSpecifier).isTypeOnly) << 24 : 0;
@@ -1577,7 +1584,7 @@ class Encoder extends NodeVisitor {
1577
1584
  this.linkSibling(index);
1578
1585
  const positions = this.positions;
1579
1586
  if (positions === undefined)
1580
- this.nodes.push(nodeListKind, list.pos, list.end, this.parentIndex, list.nodes.length, 0);
1587
+ this.nodes.push(nodeListKind, list.pos, list.end, this.parentIndex, list.nodes.length, trailingComma(list));
1581
1588
  else
1582
1589
  this.nodes.push(
1583
1590
  nodeListKind,
@@ -1585,7 +1592,7 @@ class Encoder extends NodeVisitor {
1585
1592
  positions.of(list.end),
1586
1593
  this.parentIndex,
1587
1594
  list.nodes.length,
1588
- 0,
1595
+ trailingComma(list),
1589
1596
  );
1590
1597
  const saveParent = this.parentIndex;
1591
1598
  this.prevIndex = 0;
@@ -1659,6 +1666,8 @@ class Encoder extends NodeVisitor {
1659
1666
  out.u32(offsetExtended);
1660
1667
  out.u32(offsetStructured);
1661
1668
  out.u32(offsetNodes);
1669
+ // Source file ID and lease ID (u64 each) and binder data offset: 0, none.
1670
+ for (let i = 0; i < 5; i++) out.u32(0);
1662
1671
  out.append(strings.offsets.view());
1663
1672
  out.append(fileText);
1664
1673
  out.append(strings.others.view());
@@ -1787,7 +1796,8 @@ class Encoder extends NodeVisitor {
1787
1796
  );
1788
1797
  out.u32((node as TemplateTail).templateFlags);
1789
1798
  } else if (node instanceof SourceFile) {
1790
- out.u32(strings.addFileText((node as SourceFile).pos, (node as SourceFile).end));
1799
+ const text = strings.addFileText((node as SourceFile).pos, (node as SourceFile).end);
1800
+ out.u32(text);
1791
1801
  out.u32(strings.add((node as SourceFile).fileName, SyntaxKind.Unknown, 0, 0));
1792
1802
  out.u32(strings.add((node as SourceFile).path, SyntaxKind.Unknown, 0, 0));
1793
1803
  out.u32((node as SourceFile).languageVariant);
@@ -1801,6 +1811,11 @@ class Encoder extends NodeVisitor {
1801
1811
  out.u32(noStructuredData);
1802
1812
  out.u32(noStructuredData);
1803
1813
  out.u32(0);
1814
+ // The original text is the text, and the content mapper fields (span map, supplemental
1815
+ // file names, canonical file name, mapper, virtual file name, diagnostic directives) are
1816
+ // empty: tsc-ts maps no file contents.
1817
+ out.u32(text);
1818
+ for (let i = 0; i < 6; i++) out.u32(noStructuredData);
1804
1819
  } else throw new Error(`no extended data for kind ${node.kind}`);
1805
1820
  return offset;
1806
1821
  }
@@ -597,10 +597,16 @@ export class IncludeProcessor {
597
597
  return this.fileIncludeReasons.get(path) ?? [];
598
598
  }
599
599
 
600
- addReason(path: string, reason: FileIncludeReason): void {
600
+ /** Adds an include reason of the file at `path`; returns the file's reasons. */
601
+ addReason(path: string, reason: FileIncludeReason): FileIncludeReason[] {
601
602
  const reasons = this.fileIncludeReasons.get(path);
602
- if (reasons === undefined) this.fileIncludeReasons.set(path, [reason]);
603
- else reasons.push(reason);
603
+ if (reasons === undefined) {
604
+ const added = [reason];
605
+ this.fileIncludeReasons.set(path, added);
606
+ return added;
607
+ }
608
+ reasons.push(reason);
609
+ return reasons;
604
610
  }
605
611
 
606
612
  addProcessingDiagnostic(diagnostic: ProcessingDiagnostic): void {
@@ -13,7 +13,7 @@ import {
13
13
  type Node,
14
14
  type SourceFile,
15
15
  } from './ast.js';
16
- import { Diagnostics, type DiagnosticMessage, type MessageWithArgs } from './diagnostics.js';
16
+ import { Diagnostics, type DiagnosticMessage, type MessageWithArgs, messageWithArgs } from './diagnostics.js';
17
17
  import { FileIncludeKind, FileIncludeReason, IncludeProcessor, ProcessingDiagnostic } from './file-include.js';
18
18
  import type { FileSystem } from './file-system.js';
19
19
  import { ModuleResolutionHost, Resolver, getAutomaticTypeDirectiveNames } from './module-resolution.js';
@@ -42,7 +42,7 @@ import {
42
42
  takePreparedFile,
43
43
  } from './parallel-parse.js';
44
44
  import type { PackageJsonLookup } from './package-json.js';
45
- import { parseSourceFile } from './parser.js';
45
+ import { parseSourceFile, getScriptKindFromFileName } from './parser.js';
46
46
  import { mark } from './timeline.js';
47
47
  import {
48
48
  combinePaths,
@@ -59,6 +59,7 @@ import {
59
59
  supportedTSExtensionsWithJsonFlat,
60
60
  toFileNameLowerCase,
61
61
  toPath,
62
+ isNetworkPath,
62
63
  } from './path.js';
63
64
  import {
64
65
  getDefaultLibFileName,
@@ -76,6 +77,7 @@ import {
76
77
  SourceFileMetadata,
77
78
  } from './program-utilities.js';
78
79
  import { SyntaxKind } from './syntax-kind.js';
80
+ import { isSourcePhaseImport } from './ast-utilities.js';
79
81
  import { hasExtension } from './vfs-match.js';
80
82
  import { TokenFlags } from './types.js';
81
83
  import {
@@ -140,7 +142,10 @@ export class CompilerHost extends ModuleResolutionHost {
140
142
  if (prepared !== undefined) return prepared;
141
143
  const text = this.fs.readFile(fileName);
142
144
  if (text === undefined) return undefined;
143
- return parseSourceFile(fileName, text, new ParseOptions(path, ScriptKind.Unknown, externalModuleIndicatorOptions));
145
+ // A file without a known extension (with allowNonTsExtensions) parses as TypeScript.
146
+ const kind = getScriptKindFromFileName(fileName);
147
+ const scriptKind = kind === ScriptKind.Unknown ? ScriptKind.TS : kind;
148
+ return parseSourceFile(fileName, text, new ParseOptions(path, scriptKind, externalModuleIndicatorOptions));
144
149
  }
145
150
 
146
151
  /** The config of a referenced project, or `undefined` if it can't be read. */
@@ -246,6 +251,8 @@ class ParseTask {
246
251
  subTasks: ParseTask[] | undefined = undefined;
247
252
  loaded = false;
248
253
  startedSubTasks = false;
254
+ /** A root file name that resolved to no supported file: the task only carries its processing diagnostic. */
255
+ failedLookup = false;
249
256
  metadata: SourceFileMetadata = libFileMetadata;
250
257
  resolutionsInFile: ModeAwareCache<ResolvedModule> | undefined = undefined;
251
258
  resolutionsTrace: MessageWithArgs[] | undefined = undefined;
@@ -256,6 +263,8 @@ class ParseTask {
256
263
  jsxRuntimeImport: JsxRuntimeImport | undefined = undefined;
257
264
  /** The task of the same file name that was loaded instead of this one. */
258
265
  loadedTask: ParseTask | undefined = undefined;
266
+ /** The index in `FileLoader.taskData` of the tasks of this task's path, once known; -1 before. */
267
+ dataIndex = -1;
259
268
  /** Whether an import or a type reference directive adds the file (`ProcessedFiles.addedFiles`). */
260
269
  readonly byImport: boolean;
261
270
 
@@ -303,9 +312,30 @@ class ParseTask {
303
312
 
304
313
  const noData: readonly ParseTaskData[] = [];
305
314
 
315
+ /** The resolution of a module the importing file declares itself: none. */
316
+ const locallyDeclaredModule: ResolvedModule = {
317
+ resolvedFileName: '',
318
+ originalPath: '',
319
+ extension: '',
320
+ resolvedUsingTsExtension: false,
321
+ packageId: undefined,
322
+ isExternalLibraryImport: false,
323
+ alternateResult: '',
324
+ resolutionDiagnostics: [],
325
+ };
326
+
306
327
  /** The tasks of one path, by file name casing. */
307
328
  class ParseTaskData {
308
329
  readonly tasks = new Map<string, ParseTask>();
330
+ /** Whether a task of the path is queued (`start`). */
331
+ queued = false;
332
+ /** The path's first queued task, the first of `tasks`. */
333
+ first: ParseTask | undefined = undefined;
334
+ /**
335
+ * Whether every task of `tasks` is loaded (`run`): then more work of the path does nothing unless it
336
+ * reaches the path at a lower depth.
337
+ */
338
+ settled = false;
309
339
  lowestDepth = Number.MAX_SAFE_INTEGER;
310
340
  startedSubTasks = false;
311
341
  packageId: PackageId | undefined = undefined;
@@ -315,10 +345,10 @@ class ParseTaskData {
315
345
  keptCopy: ParseTaskData | undefined = undefined;
316
346
  /** The paths the file's imports and type reference directives add, once collected. */
317
347
  added: readonly ParseTaskData[] = noData;
318
-
319
- constructor(task: ParseTask) {
320
- this.tasks.set(task.normalizedFilePath, task);
321
- }
348
+ /** The file name `collect` reached the path by first, once it did. */
349
+ collectedName: string | undefined = undefined;
350
+ /** The path's include reasons, once `collect` found one: the list in `IncludeProcessor.fileIncludeReasons`. */
351
+ reasons: FileIncludeReason[] | undefined = undefined;
322
352
  }
323
353
 
324
354
  /** Pending processing of `tasks[index]`. */
@@ -477,7 +507,7 @@ export function needsImportHelpersImportSpecifier(file: SourceFile, options: Com
477
507
 
478
508
  /** The module `file` imports the JSX runtime from under `options`, or '' if it imports none. */
479
509
  export function jsxRuntimeImportOf(file: SourceFile, options: CompilerOptions): string {
480
- if (file.scriptKind !== ScriptKind.JSX && file.scriptKind !== ScriptKind.TSX) return '';
510
+ if (!isSourceFileJS(file) && file.scriptKind !== ScriptKind.TSX) return '';
481
511
  return getJSXRuntimeImport(getJSXImplicitImportBase(options, file), options);
482
512
  }
483
513
 
@@ -557,7 +587,10 @@ export class FileLoader {
557
587
  private readonly supportedExtensionsWithJson: readonly (readonly string[])[];
558
588
  private readonly maxNodeModuleJsDepth: number;
559
589
  private readonly rootTasks: ParseTask[] = [];
560
- private readonly taskDataByPath = new Map<string, ParseTaskData>();
590
+ /** The tasks of each path, created when a task of the path is first queued or built ahead. */
591
+ private readonly taskData: ParseTaskData[] = [];
592
+ /** The index in `taskData` of each path's tasks. */
593
+ private readonly taskDataByPath = new Map<string, number>();
561
594
  /** Work queued by `start`, run last-in first-out like tsgo's single-threaded work group. */
562
595
  private readonly work: ParseWork[] = [];
563
596
  private readonly libFileCache = new Map<string, LibFile>();
@@ -627,7 +660,11 @@ export class FileLoader {
627
660
  const loaded = prepared.loaded;
628
661
  if (loaded === undefined) continue;
629
662
  const subTasks = this.subTasksOf(loaded);
630
- for (const task of subTasks) task.path = this.toPath(task.normalizedFilePath);
663
+ // Their paths and tasks, found here while threads parse rather than when the walk reaches them.
664
+ for (const task of subTasks) {
665
+ task.path = this.toPath(task.normalizedFilePath);
666
+ task.dataIndex = this.dataIndexOf(task.path);
667
+ }
631
668
  this.subTasksAhead.set(prepared.fileName, new SubTasksAhead(loaded, subTasks));
632
669
  }
633
670
  }
@@ -705,7 +742,7 @@ export class FileLoader {
705
742
 
706
743
  private walk(): void {
707
744
  for (let work = this.work.pop(); work !== undefined; work = this.work.pop()) {
708
- if (this.walkingAhead && this.parsesUnprepared(work.tasks[work.index], work.data)) {
745
+ if (this.walkingAhead && !this.elides(work) && this.parsesUnprepared(work.tasks[work.index], work.data)) {
709
746
  this.work.push(work);
710
747
  return;
711
748
  }
@@ -721,6 +758,7 @@ export class FileLoader {
721
758
  */
722
759
  release(): void {
723
760
  this.rootTasks.length = 0;
761
+ this.taskData.length = 0;
724
762
  this.taskDataByPath.clear();
725
763
  this.work.length = 0;
726
764
  this.subTasksAhead.clear();
@@ -900,6 +938,7 @@ export class FileLoader {
900
938
  return;
901
939
  }
902
940
  const task = new ParseTask(absolute, undefined, reason, false, false, false, undefined);
941
+ task.failedLookup = true;
903
942
  task.addProcessingDiagnostic(
904
943
  ProcessingDiagnostic.explainingFileInclude('', reason, resolved.message, resolved.args),
905
944
  );
@@ -926,6 +965,8 @@ export class FileLoader {
926
965
  ): string | ReferenceDiagnostic {
927
966
  const allowNonTsExtensions = this.options.allowNonTsExtensions === true;
928
967
  const diagnosticFileName = normalizeSlashes(referenceText);
968
+ if (isNetworkPath(fileName))
969
+ return new ReferenceDiagnostic(Diagnostics.Network_path_0_is_not_supported, [diagnosticFileName]);
929
970
  const fs = this.host.fs;
930
971
  if (hasExtension(fileName)) {
931
972
  const canonicalFileName = getCanonicalFileName(fileName, fs.useCaseSensitiveFileNames);
@@ -1026,43 +1067,67 @@ export class FileLoader {
1026
1067
  // ---- Loading
1027
1068
 
1028
1069
  private start(tasks: ParseTask[], depth: number): void {
1070
+ const taskData = this.taskData;
1029
1071
  for (let i = 0; i < tasks.length; i++) {
1030
1072
  const task = tasks[i];
1031
- // Sub-tasks built ahead have their paths.
1032
- if (task.path === '') task.path = this.toPath(task.normalizedFilePath);
1033
- let data = this.taskDataByPath.get(task.path);
1034
- const loaded = data !== undefined;
1035
- if (data === undefined) {
1036
- data = new ParseTaskData(task);
1037
- this.taskDataByPath.set(task.path, data);
1073
+ // Sub-tasks built ahead have their paths and tasks.
1074
+ let k = task.dataIndex;
1075
+ if (k < 0) {
1076
+ if (task.path === '') task.path = this.toPath(task.normalizedFilePath);
1077
+ k = this.dataIndexOf(task.path);
1078
+ task.dataIndex = k;
1079
+ }
1080
+ const data = taskData[k];
1081
+ const loaded = data.queued;
1082
+ if (!loaded) {
1083
+ data.queued = true;
1084
+ data.first = task;
1085
+ data.tasks.set(task.normalizedFilePath, task);
1038
1086
  }
1039
1087
  this.work.push(new ParseWork(tasks, i, data, loaded, depth));
1040
1088
  }
1041
1089
  }
1042
1090
 
1091
+ /** The index in `taskData` of the tasks of `path`, created if needed. */
1092
+ private dataIndexOf(path: string): number {
1093
+ let k = this.taskDataByPath.get(path);
1094
+ if (k === undefined) {
1095
+ k = this.taskData.length;
1096
+ this.taskData.push(new ParseTaskData());
1097
+ this.taskDataByPath.set(path, k);
1098
+ }
1099
+ return k;
1100
+ }
1101
+
1043
1102
  private run(work: ParseWork): void {
1044
1103
  const task = work.tasks[work.index];
1045
1104
  const data = work.data;
1046
1105
  let startSubTasks = false;
1047
1106
  if (work.loaded) {
1048
- const existing = data.tasks.get(task.normalizedFilePath);
1107
+ const name = task.normalizedFilePath;
1108
+ const first = data.first;
1109
+ const existing = first !== undefined && first.normalizedFilePath === name ? first : data.tasks.get(name);
1049
1110
  if (existing !== undefined) {
1050
1111
  task.loadedTask = existing;
1051
1112
  } else {
1052
- data.tasks.set(task.normalizedFilePath, task);
1113
+ data.tasks.set(name, task);
1114
+ data.settled = false;
1053
1115
  // A new casing of a file: load its references if another casing's were.
1054
1116
  startSubTasks = data.startedSubTasks;
1055
1117
  }
1056
1118
  }
1057
1119
  if (data.packageId === undefined && task.packageId !== undefined) data.packageId = task.packageId;
1058
1120
  const depth = task.increaseDepth ? work.depth + 1 : work.depth;
1059
- if (depth < data.lowestDepth) {
1121
+ const lowered = depth < data.lowestDepth;
1122
+ if (lowered) {
1060
1123
  // Reached at a lower depth than before: load references again.
1061
1124
  data.lowestDepth = depth;
1062
1125
  startSubTasks = true;
1063
1126
  data.startedSubTasks = true;
1064
1127
  }
1065
1128
  if (task.elideOnDepth && depth > this.maxNodeModuleJsDepth) return;
1129
+ // Most work reaches a path already loaded, at no lower depth.
1130
+ if (data.settled && !startSubTasks) return;
1066
1131
  for (const taskByFileName of data.tasks.values()) {
1067
1132
  let loadSubTasks = startSubTasks;
1068
1133
  if (!taskByFileName.loaded) {
@@ -1072,11 +1137,23 @@ export class FileLoader {
1072
1137
  data.startedSubTasks = true;
1073
1138
  }
1074
1139
  }
1075
- if (!taskByFileName.startedSubTasks && loadSubTasks) {
1140
+ // A lower depth restarts references already started, which may now be loaded past `maxNodeModuleJsDepth`.
1141
+ // Every file reached from them is at least as deep, so a depth past it changes nothing they load.
1142
+ if (loadSubTasks && ((lowered && depth <= this.maxNodeModuleJsDepth) || !taskByFileName.startedSubTasks)) {
1076
1143
  taskByFileName.startedSubTasks = true;
1077
1144
  if (taskByFileName.subTasks !== undefined) this.start(taskByFileName.subTasks, data.lowestDepth);
1078
1145
  }
1079
1146
  }
1147
+ data.settled = true;
1148
+ }
1149
+
1150
+ /**
1151
+ * Whether `run` drops `work` without loading its file: a JavaScript file past `maxNodeModuleJsDepth`,
1152
+ * which no parse thread prepares, so the walk ahead does not wait for it.
1153
+ */
1154
+ private elides(work: ParseWork): boolean {
1155
+ const task = work.tasks[work.index];
1156
+ return task.elideOnDepth && (task.increaseDepth ? work.depth + 1 : work.depth) > this.maxNodeModuleJsDepth;
1080
1157
  }
1081
1158
 
1082
1159
  /**
@@ -1096,6 +1173,7 @@ export class FileLoader {
1096
1173
  this.loadAutomaticTypeDirectives(task);
1097
1174
  return;
1098
1175
  }
1176
+ if (task.failedLookup) return;
1099
1177
  const redirect = this.mapper.getParseFileRedirect(task.path);
1100
1178
  if (redirect !== '') {
1101
1179
  const redirected = new ParseTask(
@@ -1344,8 +1422,24 @@ export class FileLoader {
1344
1422
  for (let index = 0; index < moduleNames.length; index++) {
1345
1423
  const entry = moduleNames[index];
1346
1424
  const moduleName = getText(entry);
1347
- if (moduleName === '') continue;
1425
+ // A source phase import loads no module declarations.
1426
+ if (moduleName === '' || isSourcePhaseImport(entry.parent!)) continue;
1348
1427
  const mode = getModeForUsageLocation(file.fileName, task.metadata, entry, options);
1428
+ // A module the file declares itself (`declare module "m"`) isn't resolved.
1429
+ if (file.ambientModuleNames.includes(moduleName)) {
1430
+ if (options.traceResolution === true)
1431
+ task
1432
+ .moduleTraces(true)!
1433
+ .push(
1434
+ messageWithArgs(
1435
+ Diagnostics.Module_0_was_resolved_as_locally_declared_ambient_module_in_file_1,
1436
+ moduleName,
1437
+ file.fileName,
1438
+ ),
1439
+ );
1440
+ resolutions.set(modeAwareKey(moduleName, mode), locallyDeclaredModule);
1441
+ continue;
1442
+ }
1349
1443
  const resolved = this.resolver.resolveModuleName(
1350
1444
  moduleName,
1351
1445
  containingFile,
@@ -1412,7 +1506,7 @@ export class FileLoader {
1412
1506
  const redirectFilesByPath = new Map<string, RedirectFile>();
1413
1507
  const packageIdToSourceFile = new Map<string, SourceFile>();
1414
1508
  const checkCasing = this.options.forceConsistentCasingInFileNames !== false;
1415
- const seen = new Map<ParseTaskData, string>();
1509
+ const taskData = this.taskData;
1416
1510
  // The paths each file's imports and type reference directives add (the tasks of each path), for
1417
1511
  // `ProcessedFiles.addedFiles`: recorded while collecting visits them, as their files are only known
1418
1512
  // once every file is collected.
@@ -1427,13 +1521,13 @@ export class FileLoader {
1427
1521
  // Automatic type directive tasks are an implementation detail, not a reason.
1428
1522
  if (task.redirectedParseTask === undefined && !task.isForAutomaticTypeDirective) {
1429
1523
  if (task.loadedTask !== undefined) task = task.loadedTask;
1430
- if (includeReason !== undefined) addIncludeReason(includeProcessor, task, includeReason);
1524
+ if (includeReason !== undefined) addIncludeReason(includeProcessor, taskData, task, includeReason);
1431
1525
  }
1432
- const data = this.taskDataByPath.get(task.path);
1526
+ const data = task.dataIndex >= 0 ? taskData[task.dataIndex] : undefined;
1433
1527
  if (added !== undefined && data !== undefined && byImport) added.push(data);
1434
1528
  if (!task.loaded || data === undefined) continue;
1435
1529
 
1436
- const checkedName = seen.get(data);
1530
+ const checkedName = data.collectedName;
1437
1531
  if (checkedName !== undefined) {
1438
1532
  // The same name normalizes the same: only another spelling needs comparing.
1439
1533
  if (
@@ -1446,7 +1540,7 @@ export class FileLoader {
1446
1540
  }
1447
1541
  continue;
1448
1542
  }
1449
- seen.set(data, task.normalizedFilePath);
1543
+ data.collectedName = task.normalizedFilePath;
1450
1544
 
1451
1545
  if (tasksSeenByNameIgnoreCase !== undefined) {
1452
1546
  const lowerCasePath = toFileNameLowerCase(task.path);
@@ -1509,13 +1603,15 @@ export class FileLoader {
1509
1603
  includeProcessor.addProcessingDiagnostic(diagnostic);
1510
1604
  continue;
1511
1605
  }
1512
- const path = task.path;
1513
1606
  for (const diagnostic of task.processingDiagnostics ?? noProcessingDiagnostics)
1514
1607
  includeProcessor.addProcessingDiagnostic(diagnostic);
1515
1608
  if (file === undefined) {
1516
1609
  missingFiles.push(task.normalizedFilePath);
1517
1610
  continue;
1518
1611
  }
1612
+ // The program's maps of the file are keyed by the file's own path: lookups by `file.path` then find
1613
+ // the same string, also for a file a parse thread created, whose path is another string than the task's.
1614
+ const path = file.path === task.path ? file.path : task.path;
1519
1615
  if (task.libFile !== undefined) {
1520
1616
  libFiles.push(file);
1521
1617
  libData.set(file, data);
@@ -1599,10 +1695,21 @@ export function releaseLater(loader: FileLoader): void {
1599
1695
  setImmediate(() => loader.release());
1600
1696
  }
1601
1697
 
1602
- function addIncludeReason(processor: IncludeProcessor, task: ParseTask, reason: FileIncludeReason): void {
1698
+ function addIncludeReason(
1699
+ processor: IncludeProcessor,
1700
+ taskData: readonly ParseTaskData[],
1701
+ task: ParseTask,
1702
+ reason: FileIncludeReason,
1703
+ ): void {
1603
1704
  const redirected = task.redirectedParseTask;
1604
- if (redirected !== undefined) addIncludeReason(processor, redirected, reason);
1605
- else if (task.loaded) processor.addReason(task.path, reason);
1705
+ if (redirected !== undefined) addIncludeReason(processor, taskData, redirected, reason);
1706
+ else if (task.loaded) {
1707
+ // The path's list, without looking the path up for each reference to the file.
1708
+ const data = task.dataIndex >= 0 ? taskData[task.dataIndex] : undefined;
1709
+ if (data === undefined) processor.addReason(task.path, reason);
1710
+ else if (data.reasons !== undefined) data.reasons.push(reason);
1711
+ else data.reasons = processor.addReason(task.path, reason);
1712
+ }
1606
1713
  }
1607
1714
 
1608
1715
  function createProjectReferenceTasks(paths: readonly string[]): ProjectReferenceTask[] {