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
@@ -8,18 +8,24 @@ import {
8
8
  buildOptionDeclarations,
9
9
  optionDeclarations,
10
10
  optionsForBuild,
11
- optionsForWatch,
12
11
  sameEnumValue,
13
12
  type OptionDeclaration,
14
13
  } from './option-declarations.js';
15
14
  import type { System } from './tsc-cli.js';
16
15
 
17
- export const version = '7.0.2';
16
+ export const version = '7.1.0-beta';
18
17
 
19
- /** Whether output gets colors: `NO_COLOR` and `FORCE_COLOR` override the TTY check. */
18
+ /**
19
+ * Whether output gets colors. As in Node, a set `FORCE_COLOR` decides: on when empty, `1`, `2`, `3` or `true`, off
20
+ * otherwise. Then `NO_COLOR` or `TERM=dumb` turn colors off, else they follow the TTY check.
21
+ */
20
22
  export function defaultIsPretty(sys: System): boolean {
23
+ if (sys.hasEnvironmentVariable('FORCE_COLOR')) {
24
+ const forceColor = sys.getEnvironmentVariable('FORCE_COLOR');
25
+ return forceColor === '' || forceColor === '1' || forceColor === '2' || forceColor === '3' || forceColor === 'true';
26
+ }
21
27
  if (sys.getEnvironmentVariable('NO_COLOR') !== '') return false;
22
- if (sys.getEnvironmentVariable('FORCE_COLOR') !== '') return true;
28
+ if (sys.getEnvironmentVariable('TERM') === 'dumb') return false;
23
29
  return sys.writeOutputIsTTY;
24
30
  }
25
31
 
@@ -262,16 +268,6 @@ function printAllHelp(writer: HelpWriter, options: readonly OptionDeclaration[])
262
268
  undefined,
263
269
  learnMore(writer),
264
270
  );
265
- out += sectionOutput(
266
- writer,
267
- writer.text(Diagnostics.WATCH_OPTIONS),
268
- optionsForWatch,
269
- false,
270
- writer.text(
271
- Diagnostics.Including_watch_w_will_start_watching_the_current_project_for_the_file_changes_Once_set_you_can_config_watch_mode_with_Colon,
272
- ),
273
- undefined,
274
- );
275
271
  out += sectionOutput(
276
272
  writer,
277
273
  writer.text(Diagnostics.BUILD_OPTIONS),
@@ -41,6 +41,7 @@ import {
41
41
  modeMismatchDetails,
42
42
  moduleNotFoundDetails,
43
43
  resolveExternalModuleName,
44
+ getImportAttributesTypeForModuleSpecifier,
44
45
  } from './checker-modules.js';
45
46
  import { getSymbolAtLocation } from './checker-services.js';
46
47
  import { resolveAlias } from './checker-symbols.js';
@@ -1231,7 +1232,17 @@ function addOwnReferencedFiles(checked: CheckedProgram, file: SourceFile, refere
1231
1232
  // call that does not initialize a variable (`exports.a = require("./a").a`), so its build info leaves out that
1232
1233
  // module and its incremental builds keep outputs that depend on it.
1233
1234
  for (const importName of file.imports) {
1234
- addReferencedFilesFromSymbol(file, referenced, resolveExternalModuleName(checker, importName, importName, true));
1235
+ addReferencedFilesFromSymbol(
1236
+ file,
1237
+ referenced,
1238
+ resolveExternalModuleName(
1239
+ checker,
1240
+ importName,
1241
+ importName,
1242
+ true,
1243
+ getImportAttributesTypeForModuleSpecifier(checker, importName),
1244
+ ),
1245
+ );
1235
1246
  }
1236
1247
  const sourceFileDirectory = getDirectoryPath(file.fileName);
1237
1248
  for (const reference of file.referencedFiles) {
@@ -1275,9 +1286,16 @@ function programToSnapshot(checked: CheckedProgram, oldSnapshot: Snapshot | unde
1275
1286
  // Reuse from the old state.
1276
1287
  if (oldSnapshot !== undefined) {
1277
1288
  if (options.composite === true) snapshot.latestChangedDtsFile = oldSnapshot.latestChangedDtsFile;
1278
- for (const path of oldSnapshot.changedFilesSet) snapshot.changedFilesSet.add(path);
1279
- for (const [path, kind] of oldSnapshot.affectedFilesPendingEmit) snapshot.affectedFilesPendingEmit.set(path, kind);
1280
1289
  snapshot.buildInfoEmitPending = oldSnapshot.buildInfoEmitPending;
1290
+ // Changes and pending emit of files no longer in the program are dropped, which changes the build info.
1291
+ for (const path of oldSnapshot.changedFilesSet) {
1292
+ if (program.getSourceFileByPath(path) !== undefined) snapshot.changedFilesSet.add(path);
1293
+ else snapshot.buildInfoEmitPending = true;
1294
+ }
1295
+ for (const [path, kind] of oldSnapshot.affectedFilesPendingEmit) {
1296
+ if (program.getSourceFileByPath(path) !== undefined) snapshot.affectedFilesPendingEmit.set(path, kind);
1297
+ else snapshot.buildInfoEmitPending = true;
1298
+ }
1281
1299
  snapshot.hasErrorsFromOldState = oldSnapshot.hasErrors;
1282
1300
  snapshot.hasSemanticErrorsFromOldState = oldSnapshot.hasSemanticErrors;
1283
1301
  const oldPackageJsons = oldSnapshot.packageJsons;
@@ -1425,13 +1443,23 @@ function programToSnapshot(checked: CheckedProgram, oldSnapshot: Snapshot | unde
1425
1443
  if (oldSnapshot !== undefined) {
1426
1444
  for (const [path, oldInfo] of oldSnapshot.fileInfos) {
1427
1445
  if (snapshot.fileInfos.has(path)) continue;
1428
- if (oldInfo.affectsGlobalScope) {
1429
- for (const file of snapshot.getAllFilesExcludingDefaultLibraryFile(program, undefined)) {
1430
- snapshot.addFileToChangeSet(file.path);
1431
- }
1432
- globalFileRemoved = true;
1433
- } else snapshot.buildInfoEmitPending = true;
1434
- break;
1446
+ snapshot.buildInfoEmitPending = true;
1447
+ snapshot.changedFilesSet.delete(path);
1448
+ snapshot.affectedFilesPendingEmit.delete(path);
1449
+ if (oldInfo.affectsGlobalScope) globalFileRemoved = true;
1450
+ }
1451
+ if (globalFileRemoved) invalidateGlobalScope(checked, snapshot);
1452
+ }
1453
+
1454
+ // A file that no longer affects the global scope changes it as its removal would.
1455
+ if (oldSnapshot !== undefined && !globalFileRemoved) {
1456
+ for (const [path, oldInfo] of oldSnapshot.fileInfos) {
1457
+ if (!oldInfo.affectsGlobalScope) continue;
1458
+ const info = snapshot.fileInfos.get(path);
1459
+ if (info !== undefined && !info.affectsGlobalScope) {
1460
+ invalidateGlobalScope(checked, snapshot);
1461
+ break;
1462
+ }
1435
1463
  }
1436
1464
  }
1437
1465
 
@@ -1460,6 +1488,19 @@ function programToSnapshot(checked: CheckedProgram, oldSnapshot: Snapshot | unde
1460
1488
  return snapshot;
1461
1489
  }
1462
1490
 
1491
+ /**
1492
+ * After a change to the global scope, every file but the default libraries is changed, and the default
1493
+ * libraries that are checked are checked again.
1494
+ */
1495
+ function invalidateGlobalScope(checked: CheckedProgram, snapshot: Snapshot): void {
1496
+ const program = checked.program;
1497
+ snapshot.buildInfoEmitPending = true;
1498
+ for (const file of program.getSourceFiles()) {
1499
+ if (!program.isSourceFileDefaultLibrary(file.path)) snapshot.addFileToChangeSet(file.path);
1500
+ else if (!checked.skipTypeChecking(file, true)) snapshot.semanticDiagnosticsPerFile.delete(file.path);
1501
+ }
1502
+ }
1503
+
1463
1504
  // ---- Affected files
1464
1505
 
1465
1506
  class AffectedFilesHandler {
@@ -1510,7 +1551,12 @@ class AffectedFilesHandler {
1510
1551
  private computeDtsSignature(file: SourceFile): string {
1511
1552
  const known = this.incremental.signatures.get(file.path);
1512
1553
  if (known !== undefined) return known;
1513
- return declarationSignature(this.incremental.emitter, file, this.snapshot.options);
1554
+ const done = this.incremental.beginNestedEmit();
1555
+ try {
1556
+ return declarationSignature(this.incremental.emitter, file, this.snapshot.options);
1557
+ } finally {
1558
+ done();
1559
+ }
1514
1560
  }
1515
1561
 
1516
1562
  updateShapeSignature(file: SourceFile, useFileVersionAsSignature: boolean): boolean {
@@ -1519,7 +1565,10 @@ class AffectedFilesHandler {
1519
1565
  if (info === undefined) return false;
1520
1566
  const previous = info.signature;
1521
1567
  let signature = '';
1522
- if (!file.isDeclarationFile && !useFileVersionAsSignature) signature = this.computeDtsSignature(file);
1568
+ // A JSON file has no declaration output, so its version is its signature, which invalidates its importers.
1569
+ if (!file.isDeclarationFile && !isJsonSourceFile(file) && !useFileVersionAsSignature) {
1570
+ signature = this.computeDtsSignature(file);
1571
+ }
1523
1572
  if (signature === '') signature = info.version;
1524
1573
  this.updatedSignatures.set(file.path, signature);
1525
1574
  return signature !== previous;
@@ -1549,7 +1598,7 @@ class AffectedFilesHandler {
1549
1598
  const info = this.snapshot.fileInfos.get(file.path);
1550
1599
  if (info !== undefined && info.affectsGlobalScope) {
1551
1600
  this.hasAllFilesExcludingDefaultLibraryFile = true;
1552
- this.snapshot.getAllFilesExcludingDefaultLibraryFile(this.program, file);
1601
+ return this.snapshot.getAllFilesExcludingDefaultLibraryFile(this.program, file);
1553
1602
  }
1554
1603
  if (this.snapshot.options.isolatedModules === true) return [file];
1555
1604
  const seen = this.forEachFileReferencedBy(file, (currentFile) => {
@@ -1966,7 +2015,7 @@ class EmitFilesHandler {
1966
2015
  results.push(
1967
2016
  declarations !== undefined
1968
2017
  ? this.writeThreadOutputs(file, declarations, writer)
1969
- : program.emitter.emit([file], EmitOnly.Dts, wrapped),
2018
+ : program.emitter.emit([file], emitOnly === EmitOnly.Dts ? EmitOnly.Dts : EmitOnly.DtsAfterJs, wrapped),
1970
2019
  );
1971
2020
  return combineEmitResults(results);
1972
2021
  }
@@ -2558,6 +2607,7 @@ export class IncrementalProgram extends CompilerProgram {
2558
2607
  readonly signatures: ReadonlyMap<string, string> = new Map(),
2559
2608
  ) {
2560
2609
  super(checked, times);
2610
+ checked.globalsInFileDiagnostics = true;
2561
2611
  this.snapshot = programToSnapshot(checked, oldSnapshot);
2562
2612
  }
2563
2613
 
@@ -2565,6 +2615,25 @@ export class IncrementalProgram extends CompilerProgram {
2565
2615
  return this.snapshot.hasChangedDtsFile;
2566
2616
  }
2567
2617
 
2618
+ /** Time spent in declaration emit for signatures while checking (`computeDtsSignature`), not yet taken. */
2619
+ private nestedEmitTime = 0;
2620
+ private nestedEmitDepth = 0;
2621
+ private nestedEmitStart = 0;
2622
+
2623
+ /** Starts timing a nested declaration emit; returns the function that ends it. */
2624
+ beginNestedEmit(): () => void {
2625
+ if (this.nestedEmitDepth++ === 0) this.nestedEmitStart = performance.now();
2626
+ return () => {
2627
+ if (--this.nestedEmitDepth === 0) this.nestedEmitTime += performance.now() - this.nestedEmitStart;
2628
+ };
2629
+ }
2630
+
2631
+ override takeNestedEmitTime(): number {
2632
+ const time = this.nestedEmitTime;
2633
+ this.nestedEmitTime = 0;
2634
+ return time;
2635
+ }
2636
+
2568
2637
  /**
2569
2638
  * The global diagnostics found before `filesToCheck` computed the affected files, which the program
2570
2639
  * reports before its semantic diagnostics (`getGlobalDiagnostics(false)`), as when they are computed
@@ -2697,10 +2766,9 @@ export class IncrementalProgram extends CompilerProgram {
2697
2766
  emit(writer: OutputWriter): EmitResult {
2698
2767
  const options = this.snapshot.options;
2699
2768
  let result: EmitResult | undefined;
2700
- if (options.noEmit === true) {
2701
- result = new EmitResult();
2702
- result.emitSkipped = true;
2703
- } else result = handleNoEmitOnError(this);
2769
+ // A `noEmit` program emits only its build info, and its emit is not skipped (tsgo's `HandleNoEmitOptions`).
2770
+ if (options.noEmit === true) result = new EmitResult();
2771
+ else result = handleNoEmitOnError(this);
2704
2772
  if (result !== undefined) {
2705
2773
  const buildInfoResult = this.emitBuildInfo(writer);
2706
2774
  if (buildInfoResult !== undefined) {
@@ -2,12 +2,7 @@
2
2
  * The tsconfig.json written by `tsc --init`.
3
3
  */
4
4
  import { Diagnostics, localizeMessage, type DiagnosticMessage, type Locale } from './diagnostics.js';
5
- import {
6
- compilerOptionsByName,
7
- sameEnumValue,
8
- watchOptionsByName,
9
- type OptionDeclaration,
10
- } from './option-declarations.js';
5
+ import { compilerOptionsByName, sameEnumValue, type OptionDeclaration } from './option-declarations.js';
11
6
  import { JsxEmit, ModuleDetectionKind, ModuleKind, ScriptTarget, type OptionValue } from './options.js';
12
7
 
13
8
  const enum Commented {
@@ -124,7 +119,7 @@ class ConfigWriter {
124
119
  }
125
120
 
126
121
  function formatValue(name: string, value: OptionValue): string {
127
- const option = compilerOptionsByName.get(name) ?? watchOptionsByName.get(name);
122
+ const option = compilerOptionsByName.get(name);
128
123
  if (value === null) return 'null';
129
124
  if (typeof value === 'boolean') return value ? 'true' : 'false';
130
125
  if (typeof value === 'number' || typeof value === 'string') return formatScalar(value, option);
@@ -43,6 +43,7 @@ import {
43
43
  newTypeMapper,
44
44
  SimpleTypeMapper,
45
45
  TypeListCache,
46
+ getMappedType,
46
47
  } from './checker-types.js';
47
48
  import {
48
49
  IntersectionFlags,
@@ -87,6 +88,7 @@ import {
87
88
  type Symbol,
88
89
  SymbolFlags,
89
90
  } from './symbol.js';
91
+ import { symbolToString } from './type-printer.js';
90
92
 
91
93
  // ---- Mappers that need the checker
92
94
 
@@ -104,8 +106,8 @@ export class CompositeTypeMapper extends TypeMapper {
104
106
  }
105
107
 
106
108
  map(type: Type): Type {
107
- const t1 = this.m1.map(type);
108
- return t1 !== type ? instantiateType(this.c, t1, this.m2) : this.m2.map(type);
109
+ const t1 = getMappedType(type, this.m1);
110
+ return t1 !== type ? instantiateType(this.c, t1, this.m2) : getMappedType(type, this.m2);
109
111
  }
110
112
  }
111
113
 
@@ -202,23 +204,37 @@ export function instantiateTypeWithAlias(
202
204
  }
203
205
  if (!could && (type.alias === undefined || !aliasCouldContainTypeVariables(c, type))) return type;
204
206
  if (c.instantiationDepth === 100 || c.instantiationCount >= 5000000) {
205
- // Probably infinitely expanding generic types; stop with the error type.
206
- c.error(c.currentNode, Diagnostics.Type_instantiation_is_excessively_deep_and_possibly_infinite);
207
+ // Probably infinitely expanding generic types; stop with the error type, naming the types whose
208
+ // instantiations nest three or more times.
209
+ const circularTypeNames = getCircularTypeNames(c);
210
+ if (circularTypeNames.length === 1)
211
+ c.error(c.currentNode, Diagnostics.Instantiations_of_type_0_appear_infinitely_circular, circularTypeNames[0]!);
212
+ else if (circularTypeNames.length > 1)
213
+ c.error(
214
+ c.currentNode,
215
+ Diagnostics.Instantiations_of_the_following_types_appear_infinitely_circular_Colon_0,
216
+ quotedAndCommaSeparated(circularTypeNames),
217
+ );
218
+ else c.error(c.currentNode, Diagnostics.Type_instantiation_is_excessively_deep_and_possibly_infinite);
207
219
  return c.errorType;
208
220
  }
209
- const depth = c.activeMapperDepth;
210
- const activeMappers = c.activeMappers;
211
- let index = depth - 1;
212
- while (index >= 0 && activeMappers[index]! !== mapper) index--;
221
+ const depth = c.activeMapperDepth | 0;
222
+ const mapperId = mapper.id | 0;
223
+ let index = (depth - 1) | 0;
224
+ while (index >= 0 && c.activeMapperIds[index]! !== mapperId) index = (index - 1) | 0;
213
225
  if (index === -1) {
214
226
  // A newly active mapper has no cached instantiations; its cache is created when a nested
215
227
  // instantiation with the same mapper stores one.
216
- if (depth < activeMappers.length) {
217
- activeMappers[depth] = mapper;
228
+ if (depth === c.activeMapperIds.length) {
229
+ const grown = new Int32Array(depth * 2);
230
+ grown.set(c.activeMapperIds);
231
+ c.activeMapperIds = grown;
232
+ }
233
+ c.activeMapperIds[depth] = mapperId;
234
+ if (depth < c.activeMapperCaches.length) {
218
235
  c.activeMapperCaches[depth] = undefined;
219
236
  c.activeMapperAliasCaches[depth] = undefined;
220
237
  } else {
221
- activeMappers.push(mapper);
222
238
  c.activeMapperCaches.push(undefined);
223
239
  c.activeMapperAliasCaches.push(undefined);
224
240
  }
@@ -236,7 +252,11 @@ export function instantiateTypeWithAlias(
236
252
  }
237
253
  c.instantiationCount++;
238
254
  c.totalInstantiations++;
239
- c.instantiationDepth++;
255
+ const instantiationDepth = c.instantiationDepth;
256
+ const instantiationStack = c.instantiationStack;
257
+ if (instantiationDepth < instantiationStack.length) instantiationStack[instantiationDepth] = type;
258
+ else instantiationStack.push(type);
259
+ c.instantiationDepth = instantiationDepth + 1;
240
260
  const result = instantiateTypeWorker(c, type, mapper, alias);
241
261
  if (index === -1) {
242
262
  // The mapper's slot stays until it is reused; its caches are released now.
@@ -274,6 +294,32 @@ export function instantiateTypeWithAlias(
274
294
  return result;
275
295
  }
276
296
 
297
+ /**
298
+ * The names of the types that are instantiated three or more times on the current instantiation stack, by
299
+ * their alias where they have one, in the order they reach the third, each once.
300
+ */
301
+ function getCircularTypeNames(c: Checker): string[] {
302
+ const counts = new Map<Type, number>();
303
+ const names: string[] = [];
304
+ const stack = c.instantiationStack;
305
+ for (let i = 0; i < c.instantiationDepth; i++) {
306
+ const t = stack[i]!;
307
+ const count = (counts.get(t) ?? 0) + 1;
308
+ counts.set(t, count);
309
+ if (count !== 3) continue;
310
+ const symbol = t.alias !== undefined ? t.alias.symbol : t.symbol;
311
+ if (symbol === undefined || symbol.name.length === 0 || symbol.name.charCodeAt(0) === 0xfffe) continue;
312
+ const name = symbolToString(c, symbol);
313
+ if (!names.includes(name)) names.push(name);
314
+ }
315
+ return names;
316
+ }
317
+
318
+ /** `'a', 'b', 'c'`. */
319
+ export function quotedAndCommaSeparated(items: readonly string[]): string {
320
+ return items.map((item) => "'" + item + "'").join(', ');
321
+ }
322
+
277
323
  function aliasCouldContainTypeVariables(c: Checker, type: Type): boolean {
278
324
  const alias = type.alias;
279
325
  if (alias === undefined || alias.typeArguments.length === 0) return false;
@@ -358,7 +404,7 @@ function isNonGenericTopLevelType(type: Type): boolean {
358
404
 
359
405
  function instantiateTypeWorker(c: Checker, type: Type, mapper: TypeMapper, alias: TypeAlias | undefined): Type {
360
406
  const flags = type.flags;
361
- if ((flags & TypeFlags.TypeParameter) !== 0) return mapper.map(type);
407
+ if ((flags & TypeFlags.TypeParameter) !== 0) return getMappedType(type, mapper);
362
408
  if ((flags & TypeFlags.Object) !== 0) {
363
409
  const objectFlags = type.objectFlags;
364
410
  if ((objectFlags & (ObjectFlags.Reference | ObjectFlags.Anonymous | ObjectFlags.Mapped)) === 0) return type;
@@ -447,7 +493,7 @@ function getObjectTypeInstantiation(
447
493
  mapper: TypeMapper,
448
494
  alias: TypeAlias | undefined,
449
495
  ): Type {
450
- if ((type.objectFlags & ObjectFlags.Reference) === 0 && c.withoutOuterTypeParameters.get(type.id) !== 0) return type;
496
+ if ((type.objectFlags & ObjectFlags.Reference) === 0 && c.withoutOuterTypeParameters.has(type.id)) return type;
451
497
  let declaration: Node;
452
498
  if ((type.objectFlags & ObjectFlags.Reference) !== 0) declaration = (type as TypeReference).node!;
453
499
  else if ((type.objectFlags & ObjectFlags.InstantiationExpressionType) !== 0)
@@ -483,7 +529,7 @@ function getObjectTypeInstantiation(
483
529
  links.outerTypeParameters = typeParameters;
484
530
  }
485
531
  if (typeParameters.length === 0) {
486
- if ((type.objectFlags & ObjectFlags.Reference) === 0) c.withoutOuterTypeParameters.set(type.id, 1);
532
+ if ((type.objectFlags & ObjectFlags.Reference) === 0) c.withoutOuterTypeParameters.add(type.id);
487
533
  return type;
488
534
  }
489
535
  // The type arguments, mapped as `combineTypeMappers(c, type.mapper, mapper)` maps them, into a
@@ -491,10 +537,10 @@ function getObjectTypeInstantiation(
491
537
  const typeMapper = type.mapper;
492
538
  const mapped = c.freeTypeLists.pop() ?? [];
493
539
  for (const tp of typeParameters) {
494
- if (typeMapper === undefined) mapped.push(mapper.map(tp));
540
+ if (typeMapper === undefined) mapped.push(getMappedType(tp, mapper));
495
541
  else {
496
- const t1 = typeMapper.map(tp);
497
- mapped.push(t1 !== tp ? instantiateType(c, t1, mapper) : mapper.map(tp));
542
+ const t1 = getMappedType(tp, typeMapper);
543
+ mapped.push(t1 !== tp ? instantiateType(c, t1, mapper) : getMappedType(tp, mapper));
498
544
  }
499
545
  }
500
546
  const newAlias = alias ?? instantiateTypeAlias(c, type.alias, mapper);
@@ -804,10 +850,19 @@ export function instantiateSymbol(c: Checker, symbol: Symbol, mapper: TypeMapper
804
850
  * is resolved yet, so lazily instantiated members record it when tsgo would instantiate them.
805
851
  */
806
852
  export function keepsSymbolUnderInstantiation(c: Checker, symbol: Symbol, mapper: TypeMapper): boolean {
807
- const symbolId = getSymbolId(symbol);
808
- if (mapper.mapsThisOnly() && isThisless(symbol)) return true;
809
- // A resolved type that can't change under instantiation keeps the symbol.
810
- const type = c.symbolTypes.get(symbolId);
853
+ if (mapper.mapsThisOnly() && isThisless(symbol)) {
854
+ getSymbolId(symbol);
855
+ return true;
856
+ }
857
+ return keepsSymbolTypeUnderInstantiation(c, symbol);
858
+ }
859
+
860
+ /**
861
+ * Whether the resolved type of `symbol` (and its write type) can't change under instantiation, so that
862
+ * `instantiateSymbol` keeps it whatever the mapper. Once true, it stays true: types are resolved once.
863
+ */
864
+ export function keepsSymbolTypeUnderInstantiation(c: Checker, symbol: Symbol): boolean {
865
+ const type = c.symbolTypes.get(getSymbolId(symbol));
811
866
  if (type !== undefined && !couldContainTypeVariables(c, type)) {
812
867
  if ((symbol.flags & SymbolFlags.SetAccessor) === 0) return true;
813
868
  const writeType = c.existingSymbolLinks(symbol)?.writeType;
@@ -46,6 +46,7 @@ import {
46
46
  getTagName,
47
47
  getType,
48
48
  type EntityName,
49
+ getText,
49
50
  } from './ast.js';
50
51
  import { isReservedWord, tokenIsIdentifierOrKeyword } from './ast-utilities.js';
51
52
  import { CharacterCodes, isWhiteSpaceLike } from './character-codes.js';
@@ -937,6 +938,7 @@ export class JSDocParser {
937
938
  undefined,
938
939
  SyntaxKind.NamespaceKeyword,
939
940
  typeNameOrNamespaceName,
941
+ undefined,
940
942
  body,
941
943
  );
942
944
  if (nested) jsDocNamespaceNode.flags |= NodeFlags.NestedNamespace;
@@ -1270,7 +1272,7 @@ function textsEqual(a: Node, b: Node): boolean {
1270
1272
  if (
1271
1273
  a instanceof QualifiedName &&
1272
1274
  b instanceof QualifiedName &&
1273
- (a as QualifiedName).right.text === (b as QualifiedName).right.text
1275
+ getText((a as QualifiedName).right) === getText((b as QualifiedName).right)
1274
1276
  ) {
1275
1277
  a = (a as QualifiedName).left;
1276
1278
  b = (b as QualifiedName).left;
@@ -7,8 +7,6 @@
7
7
  // checker that touches part of a program (as each of several parallel checkers does) stores only
8
8
  // the pages it touches.
9
9
 
10
- import type { Symbol } from './symbol.js';
11
-
12
10
  /** Links are stored in pages of 256 ids. */
13
11
  export const enum LinkPaging {
14
12
  Bits = 8,
@@ -203,20 +201,24 @@ const enum IdSetPaging {
203
201
 
204
202
  /** The number of set bits of a 32-bit value. */
205
203
  function bitCount(x: number): number {
206
- x = x - ((x >>> 1) & 0x55555555);
204
+ x = (x - ((x >>> 1) & 0x55555555)) | 0;
207
205
  x = (x & 0x33333333) + ((x >>> 2) & 0x33333333);
208
206
  x = (x + (x >>> 4)) & 0x0f0f0f0f;
209
- return Math.imul(x, 0x01010101) >>> 24;
207
+ // At most 32, so the top byte is the count with either shift; `>>` keeps it an int32.
208
+ return Math.imul(x, 0x01010101) >> 24;
210
209
  }
211
210
 
212
211
  /**
213
- * A page of a `CompactSymbolLinkTable`: one bit per id of the page in eight 32-id words, the number
214
- * of symbols stored before each word, and the symbols in id order. The words are fields, so a
215
- * lookup reads one object before the symbols. The class isn't generic, so natively the words are
216
- * 32-bit fields: every write stores an int32.
212
+ * A page of a `CompactLinkTable`'s presence bits: one bit per id of the page in eight 32-id words, the
213
+ * number of values stored before each word, and the position of the page's values in the table's
214
+ * `values`. The words are fields, so a lookup reads one object before the values. Natively the words
215
+ * are 32-bit fields, since every write stores an int32. A class that is generic or has a generic
216
+ * subclass keeps its number fields as doubles, so the values the bits index are in the table's
217
+ * `values`, not in this class or a subclass.
217
218
  */
218
219
  class CompactLinkPage {
219
- readonly values: Symbol[];
220
+ /** The position of the page's values in the table's `values`. */
221
+ readonly position: number;
220
222
  private w0: number;
221
223
  private w1: number;
222
224
  private w2: number;
@@ -229,8 +231,8 @@ class CompactLinkPage {
229
231
  private before0: number;
230
232
  private before1: number;
231
233
 
232
- constructor() {
233
- this.values = [];
234
+ constructor(position: number) {
235
+ this.position = position | 0;
234
236
  this.w0 = 0;
235
237
  this.w1 = 0;
236
238
  this.w2 = 0;
@@ -297,72 +299,90 @@ class CompactLinkPage {
297
299
  rank(slot: number, bits: number): number {
298
300
  const word = slot >> 5;
299
301
  const before = ((word < 4 ? this.before0 : this.before1) >>> ((word & 3) << 3)) & 0xff;
300
- return before + bitCount(bits & ((1 << (slot & 31)) - 1));
302
+ return (before + bitCount(bits & ((1 << (slot & 31)) - 1))) | 0;
301
303
  }
302
304
 
303
- /** Adds `delta` to the counts of the words after `word`. */
305
+ /**
306
+ * Adds 1 (`delta` 1) or subtracts 1 (`delta` -1) from the counts of the words after `word`, a byte
307
+ * of `before0` or `before1` each. No byte carries or borrows: a count is at most 224, and a count
308
+ * that goes down includes the value removed.
309
+ */
304
310
  shiftCounts(word: number, delta: number): void {
305
- for (let w = word + 1; w < 8; w++) {
306
- const step = delta << ((w & 3) << 3);
307
- if (w < 4) this.before0 = (this.before0 + step) | 0;
308
- else this.before1 = (this.before1 + step) | 0;
309
- }
311
+ // A 1 in each byte of the words after `word`: shifting `0x01010100` left by `word` bytes keeps
312
+ // the bytes above it, and shifts them all out at word 3.
313
+ const low = word < 4 ? 0x01010100 << (word << 3) : 0;
314
+ const high = word < 4 ? 0x01010101 : 0x01010100 << ((word & 3) << 3);
315
+ this.before0 = (this.before0 + Math.imul(low, delta)) | 0;
316
+ this.before1 = (this.before1 + Math.imul(high, delta)) | 0;
310
317
  }
311
318
  }
312
319
 
313
320
  /**
314
- * Symbols by node id, for ids a checker resolves in one in four to one in eight of the ids of the
315
- * pages it touches, as it resolves the identifiers and names of the files it checks. Pages of
316
- * `LinkPaging.Size` ids keep a presence bit per id and only the symbols stored, so a symbol costs
317
- * about one array slot. A `LinkTable` page costs a slot for every id, and a `Map` entry also
318
- * stores its key and a share of the hash buckets. At fewer values per page than that, the page's
319
- * own allocations outweigh what it saves, and a `SparseLinkTable` costs less.
321
+ * Values by node or symbol id, for ids a checker stores a value for in more than about one in
322
+ * sixteen of the ids of the pages it touches: the symbols it resolves for the identifiers and names
323
+ * of the files it checks (one in four to one in eight), the types and signatures it resolves for
324
+ * their type nodes and calls (one in twelve to one in seventeen), and the symbol columns most
325
+ * symbols leave empty, such as the name type of a property (one in ten to one in three with
326
+ * `--checkers 16`, where every checker touches symbols across the whole program). Pages of
327
+ * `LinkPaging.Size` ids keep a presence bit per id and only the values stored, so a value costs
328
+ * about one array slot. A `LinkTable` page costs a slot for every id, and a `Map` entry also stores
329
+ * its key and a share of the hash buckets. At fewer values per page than that, the page's own
330
+ * allocations outweigh what it saves, and a `SparseLinkTable` costs less.
320
331
  */
321
- export class CompactSymbolLinkTable {
332
+ export class CompactLinkTable<T> {
333
+ /**
334
+ * The pages by `id >> LinkPaging.Bits`, up to the highest page stored; undefined where a page stores
335
+ * nothing. A checker stores values in a few percent of the pages of a large program, so the values
336
+ * are kept apart, one list for each page stored, rather than in a second slot per page.
337
+ */
322
338
  readonly pages: (CompactLinkPage | undefined)[] = [];
323
- /** The number of symbols stored. */
339
+ /** The values of each page stored, in id order, at the page's `position`. */
340
+ readonly values: T[][] = [];
341
+ /** The number of values stored. */
324
342
  size = 0;
325
343
 
326
- get(id: number): Symbol | undefined {
327
- const page = this.pages[id >> LinkPaging.Bits];
344
+ get(id: number): T | undefined {
345
+ const index = id >> LinkPaging.Bits;
346
+ const page = this.pages[index];
328
347
  if (page === undefined) return undefined;
329
348
  const slot = id & LinkPaging.Mask;
330
349
  const bits = page.word(slot >> 5);
331
350
  if ((bits & (1 << (slot & 31))) === 0) return undefined;
332
- return page.values[page.rank(slot, bits)];
351
+ return this.values[page.position]![page.rank(slot, bits)];
333
352
  }
334
353
 
335
- set(id: number, value: Symbol | undefined): void {
354
+ set(id: number, value: T | undefined): void {
336
355
  const index = id >> LinkPaging.Bits;
337
356
  let page = this.pages[index];
338
357
  if (page === undefined) {
339
358
  if (value === undefined) return;
340
359
  while (this.pages.length <= index) this.pages.push(undefined);
341
- page = new CompactLinkPage();
360
+ page = new CompactLinkPage(this.values.length);
342
361
  this.pages[index] = page;
362
+ this.values.push([]);
343
363
  }
364
+ const values = this.values[page.position]!;
344
365
  const slot = id & LinkPaging.Mask;
345
366
  const word = slot >> 5;
346
367
  const bit = 1 << (slot & 31);
347
368
  const bits = page.word(word);
348
369
  const at = page.rank(slot, bits);
349
- const values = page.values;
350
370
  if ((bits & bit) !== 0) {
351
371
  if (value !== undefined) {
352
372
  values[at] = value;
353
373
  return;
354
374
  }
355
- for (let i = at; i < values.length - 1; i++) values[i] = values[i + 1]!;
356
- values.pop();
375
+ if (at === values.length - 1) values.pop();
376
+ else values.splice(at, 1);
357
377
  page.setWord(word, bits & ~bit);
358
378
  page.shiftCounts(word, -1);
359
379
  this.size--;
360
380
  return;
361
381
  }
362
382
  if (value === undefined) return;
363
- values.push(value);
364
- for (let i = values.length - 1; i > at; i--) values[i] = values[i - 1]!;
365
- values[at] = value;
383
+ // Values are mostly stored in id order, at the end.
384
+ if (at === values.length) values.push(value);
385
+ else values.splice(at, 0, value);
366
386
  page.setWord(word, bits | bit);
367
387
  page.shiftCounts(word, 1);
368
388
  this.size++;
@@ -370,6 +390,31 @@ export class CompactSymbolLinkTable {
370
390
 
371
391
  clear(): void {
372
392
  this.pages.length = 0;
393
+ this.values.length = 0;
373
394
  this.size = 0;
374
395
  }
375
396
  }
397
+
398
+ /**
399
+ * Int32 values by id, zero where none is stored, in a `CompactLinkTable`: pages of
400
+ * `LinkPaging.Size` ids keep a presence bit per id and only the nonzero values. For columns where a
401
+ * checker stores a value for fewer than about one in three of the ids of the pages it touches, such
402
+ * as the reference kinds of the symbols its files reference: an `IntLinkTable` page costs four bytes
403
+ * for every id.
404
+ */
405
+ export class CompactIntLinkTable {
406
+ private readonly table = new CompactLinkTable<number>();
407
+
408
+ get(id: number): number {
409
+ return this.table.get(id) ?? 0;
410
+ }
411
+
412
+ set(id: number, value: number): void {
413
+ value = value | 0;
414
+ this.table.set(id, value === 0 ? undefined : value);
415
+ }
416
+
417
+ clear(): void {
418
+ this.table.clear();
419
+ }
420
+ }