tsc-ts 0.0.9 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (373) hide show
  1. package/README.md +2 -2
  2. package/bin/tsc-ts.js +70 -1
  3. package/dist/api/compiler/ast-utilities.d.ts +19 -1
  4. package/dist/api/compiler/ast-utilities.js +180 -95
  5. package/dist/api/compiler/ast.d.ts +22 -15
  6. package/dist/api/compiler/ast.js +1026 -995
  7. package/dist/api/compiler/astnav.js +15 -15
  8. package/dist/api/compiler/binder-utilities.js +186 -186
  9. package/dist/api/compiler/binder.js +290 -263
  10. package/dist/api/compiler/character-codes.js +2 -2
  11. package/dist/api/compiler/checker-calls.js +178 -124
  12. package/dist/api/compiler/checker-classes.d.ts +14 -3
  13. package/dist/api/compiler/checker-classes.js +134 -90
  14. package/dist/api/compiler/checker-contextual.js +64 -61
  15. package/dist/api/compiler/checker-declaration-order.js +79 -79
  16. package/dist/api/compiler/checker-declarations.d.ts +1 -0
  17. package/dist/api/compiler/checker-declarations.js +160 -136
  18. package/dist/api/compiler/checker-declared-types.js +67 -65
  19. package/dist/api/compiler/checker-decorators.js +77 -77
  20. package/dist/api/compiler/checker-deprecation.d.ts +8 -3
  21. package/dist/api/compiler/checker-deprecation.js +76 -55
  22. package/dist/api/compiler/checker-destructuring.js +47 -45
  23. package/dist/api/compiler/checker-elaboration.js +24 -24
  24. package/dist/api/compiler/checker-emit-helpers.js +4 -4
  25. package/dist/api/compiler/checker-emit-resolver.d.ts +4 -2
  26. package/dist/api/compiler/checker-emit-resolver.js +25 -13
  27. package/dist/api/compiler/checker-evaluator.js +9 -9
  28. package/dist/api/compiler/checker-expressions.js +244 -211
  29. package/dist/api/compiler/checker-functions.js +113 -107
  30. package/dist/api/compiler/checker-generated-code.d.ts +0 -11
  31. package/dist/api/compiler/checker-generated-code.js +28 -52
  32. package/dist/api/compiler/checker-grammar.d.ts +1 -0
  33. package/dist/api/compiler/checker-grammar.js +472 -440
  34. package/dist/api/compiler/checker-heritage.js +91 -93
  35. package/dist/api/compiler/checker-inference.d.ts +77 -5
  36. package/dist/api/compiler/checker-inference.js +487 -107
  37. package/dist/api/compiler/checker-iteration.d.ts +0 -10
  38. package/dist/api/compiler/checker-iteration.js +35 -52
  39. package/dist/api/compiler/checker-javascript.js +14 -14
  40. package/dist/api/compiler/checker-jsdoc.d.ts +8 -10
  41. package/dist/api/compiler/checker-jsdoc.js +67 -58
  42. package/dist/api/compiler/checker-jsx.js +105 -88
  43. package/dist/api/compiler/checker-members.d.ts +9 -2
  44. package/dist/api/compiler/checker-members.js +212 -75
  45. package/dist/api/compiler/checker-modules.d.ts +15 -6
  46. package/dist/api/compiler/checker-modules.js +469 -309
  47. package/dist/api/compiler/checker-narrowing.js +273 -189
  48. package/dist/api/compiler/checker-object-literals.js +25 -22
  49. package/dist/api/compiler/checker-operators.js +126 -118
  50. package/dist/api/compiler/checker-overloads.js +27 -27
  51. package/dist/api/compiler/checker-property-access.js +59 -55
  52. package/dist/api/compiler/checker-services.d.ts +1 -0
  53. package/dist/api/compiler/checker-services.js +222 -210
  54. package/dist/api/compiler/checker-signatures.js +65 -49
  55. package/dist/api/compiler/checker-source-file.d.ts +5 -0
  56. package/dist/api/compiler/checker-source-file.js +154 -130
  57. package/dist/api/compiler/checker-statements.js +33 -32
  58. package/dist/api/compiler/checker-super.js +50 -50
  59. package/dist/api/compiler/checker-symbol-types.js +109 -93
  60. package/dist/api/compiler/checker-symbols.d.ts +13 -1
  61. package/dist/api/compiler/checker-symbols.js +264 -149
  62. package/dist/api/compiler/checker-type-factory.d.ts +5 -0
  63. package/dist/api/compiler/checker-type-factory.js +145 -36
  64. package/dist/api/compiler/checker-type-nodes.d.ts +1 -0
  65. package/dist/api/compiler/checker-type-nodes.js +179 -141
  66. package/dist/api/compiler/checker-type-operators.d.ts +2 -0
  67. package/dist/api/compiler/checker-type-operators.js +110 -63
  68. package/dist/api/compiler/checker-types.d.ts +80 -3
  69. package/dist/api/compiler/checker-types.js +121 -2
  70. package/dist/api/compiler/checker-unused.js +114 -118
  71. package/dist/api/compiler/checker-utilities.js +11 -11
  72. package/dist/api/compiler/checker.d.ts +104 -31
  73. package/dist/api/compiler/checker.js +181 -33
  74. package/dist/api/compiler/command-line.d.ts +1 -3
  75. package/dist/api/compiler/command-line.js +47 -44
  76. package/dist/api/compiler/compile-program.d.ts +42 -3
  77. package/dist/api/compiler/compile-program.js +139 -27
  78. package/dist/api/compiler/diagnostic-messages.d.ts +1849 -1774
  79. package/dist/api/compiler/diagnostic-messages.js +128 -122
  80. package/dist/api/compiler/diagnostics.d.ts +22 -0
  81. package/dist/api/compiler/diagnostics.js +93 -11
  82. package/dist/api/compiler/emitter.d.ts +7 -1
  83. package/dist/api/compiler/emitter.js +53 -11
  84. package/dist/api/compiler/file-include.d.ts +2 -1
  85. package/dist/api/compiler/file-include.js +11 -7
  86. package/dist/api/compiler/file-loader.d.ts +21 -1
  87. package/dist/api/compiler/file-loader.js +201 -48
  88. package/dist/api/compiler/instantiation.d.ts +7 -0
  89. package/dist/api/compiler/instantiation.js +101 -49
  90. package/dist/api/compiler/jsdoc.js +23 -23
  91. package/dist/api/compiler/link-tables.d.ts +48 -18
  92. package/dist/api/compiler/link-tables.js +80 -37
  93. package/dist/api/compiler/locales/cs-CZ.d.ts +1 -1
  94. package/dist/api/compiler/locales/cs-CZ.js +1 -1
  95. package/dist/api/compiler/locales/de-DE.d.ts +1 -1
  96. package/dist/api/compiler/locales/de-DE.js +1 -1
  97. package/dist/api/compiler/locales/es-ES.d.ts +1 -1
  98. package/dist/api/compiler/locales/es-ES.js +1 -1
  99. package/dist/api/compiler/locales/fr-FR.d.ts +1 -1
  100. package/dist/api/compiler/locales/fr-FR.js +1 -1
  101. package/dist/api/compiler/locales/it-IT.d.ts +1 -1
  102. package/dist/api/compiler/locales/it-IT.js +1 -1
  103. package/dist/api/compiler/locales/ja-JP.d.ts +1 -1
  104. package/dist/api/compiler/locales/ja-JP.js +1 -1
  105. package/dist/api/compiler/locales/ko-KR.d.ts +1 -1
  106. package/dist/api/compiler/locales/ko-KR.js +1 -1
  107. package/dist/api/compiler/locales/pl-PL.d.ts +1 -1
  108. package/dist/api/compiler/locales/pl-PL.js +1 -1
  109. package/dist/api/compiler/locales/pt-BR.d.ts +1 -1
  110. package/dist/api/compiler/locales/pt-BR.js +1 -1
  111. package/dist/api/compiler/locales/ru-RU.d.ts +1 -1
  112. package/dist/api/compiler/locales/ru-RU.js +1 -1
  113. package/dist/api/compiler/locales/tr-TR.d.ts +1 -1
  114. package/dist/api/compiler/locales/tr-TR.js +1 -1
  115. package/dist/api/compiler/locales/zh-CN.d.ts +1 -1
  116. package/dist/api/compiler/locales/zh-CN.js +1 -1
  117. package/dist/api/compiler/locales/zh-TW.d.ts +1 -1
  118. package/dist/api/compiler/locales/zh-TW.js +1 -1
  119. package/dist/api/compiler/module-resolution-types.js +6 -6
  120. package/dist/api/compiler/module-resolution.d.ts +10 -1
  121. package/dist/api/compiler/module-resolution.js +115 -84
  122. package/dist/api/compiler/module-specifiers.d.ts +15 -0
  123. package/dist/api/compiler/module-specifiers.js +24 -18
  124. package/dist/api/compiler/name-resolver.js +74 -65
  125. package/dist/api/compiler/node-builder-names.d.ts +11 -3
  126. package/dist/api/compiler/node-builder-names.js +210 -90
  127. package/dist/api/compiler/node-builder-pseudo.js +29 -31
  128. package/dist/api/compiler/node-builder-reuse.js +23 -22
  129. package/dist/api/compiler/node-builder.d.ts +18 -1
  130. package/dist/api/compiler/node-builder.js +191 -102
  131. package/dist/api/compiler/option-declarations.d.ts +2 -6
  132. package/dist/api/compiler/option-declarations.js +315 -375
  133. package/dist/api/compiler/options.d.ts +15 -33
  134. package/dist/api/compiler/options.js +21 -54
  135. package/dist/api/compiler/output-paths.d.ts +4 -1
  136. package/dist/api/compiler/output-paths.js +6 -11
  137. package/dist/api/compiler/package-json.d.ts +3 -3
  138. package/dist/api/compiler/package-json.js +11 -10
  139. package/dist/api/compiler/parallel-parse.d.ts +3 -2
  140. package/dist/api/compiler/parallel-parse.js +17 -5
  141. package/dist/api/compiler/parser.d.ts +40 -19
  142. package/dist/api/compiler/parser.js +308 -216
  143. package/dist/api/compiler/path.d.ts +9 -0
  144. package/dist/api/compiler/path.js +20 -3
  145. package/dist/api/compiler/printer/emit-context.d.ts +5 -1
  146. package/dist/api/compiler/printer/emit-context.js +20 -1
  147. package/dist/api/compiler/printer/factory-base.d.ts +2 -2
  148. package/dist/api/compiler/printer/factory-base.js +7 -3
  149. package/dist/api/compiler/printer/factory.js +3 -1
  150. package/dist/api/compiler/printer/helpers.js +10 -1
  151. package/dist/api/compiler/printer/name-generator.d.ts +1 -1
  152. package/dist/api/compiler/printer/name-generator.js +35 -16
  153. package/dist/api/compiler/printer/printer.d.ts +49 -2
  154. package/dist/api/compiler/printer/printer.js +539 -293
  155. package/dist/api/compiler/printer/utilities.js +149 -147
  156. package/dist/api/compiler/program-checker.d.ts +12 -2
  157. package/dist/api/compiler/program-checker.js +88 -34
  158. package/dist/api/compiler/program-utilities.d.ts +3 -1
  159. package/dist/api/compiler/program-utilities.js +28 -15
  160. package/dist/api/compiler/program.d.ts +4 -6
  161. package/dist/api/compiler/program.js +74 -87
  162. package/dist/api/compiler/pseudo-bigint.d.ts +2 -0
  163. package/dist/api/compiler/pseudo-bigint.js +18 -0
  164. package/dist/api/compiler/regexp-checker.d.ts +1 -1
  165. package/dist/api/compiler/regexp-checker.js +93 -76
  166. package/dist/api/compiler/relations.d.ts +27 -4
  167. package/dist/api/compiler/relations.js +347 -180
  168. package/dist/api/compiler/reparser.js +60 -56
  169. package/dist/api/compiler/scanner.d.ts +19 -2
  170. package/dist/api/compiler/scanner.js +123 -108
  171. package/dist/api/compiler/shared-results.d.ts +463 -0
  172. package/dist/api/compiler/shared-results.js +2128 -0
  173. package/dist/api/compiler/sourcemap.js +2 -2
  174. package/dist/api/compiler/symbol-accessibility.js +87 -74
  175. package/dist/api/compiler/symbol.d.ts +23 -14
  176. package/dist/api/compiler/symbol.js +23 -11
  177. package/dist/api/compiler/syntax-kind.d.ts +198 -197
  178. package/dist/api/compiler/transformers/alias-references.js +247 -139
  179. package/dist/api/compiler/transformers/async-utilities.js +25 -25
  180. package/dist/api/compiler/transformers/async.d.ts +0 -1
  181. package/dist/api/compiler/transformers/async.js +64 -77
  182. package/dist/api/compiler/transformers/class-fields.d.ts +1 -0
  183. package/dist/api/compiler/transformers/class-fields.js +81 -78
  184. package/dist/api/compiler/transformers/commonjs-module.js +18 -15
  185. package/dist/api/compiler/transformers/const-enum-inliner.js +1 -1
  186. package/dist/api/compiler/transformers/declarations-diagnostics.js +247 -244
  187. package/dist/api/compiler/transformers/declarations-pseudo.js +100 -100
  188. package/dist/api/compiler/transformers/declarations-resolver.d.ts +0 -3
  189. package/dist/api/compiler/transformers/declarations-syntactic.d.ts +1 -2
  190. package/dist/api/compiler/transformers/declarations-syntactic.js +134 -156
  191. package/dist/api/compiler/transformers/declarations-tracker.js +18 -18
  192. package/dist/api/compiler/transformers/declarations.d.ts +4 -1
  193. package/dist/api/compiler/transformers/declarations.js +305 -238
  194. package/dist/api/compiler/transformers/decorator-metadata.d.ts +1 -1
  195. package/dist/api/compiler/transformers/decorator-metadata.js +53 -45
  196. package/dist/api/compiler/transformers/decorator-utilities.js +24 -24
  197. package/dist/api/compiler/transformers/destructuring.js +19 -18
  198. package/dist/api/compiler/transformers/emit-resolver.js +1 -1
  199. package/dist/api/compiler/transformers/es-decorators.js +55 -55
  200. package/dist/api/compiler/transformers/external-module-info.js +3 -3
  201. package/dist/api/compiler/transformers/for-await.js +25 -25
  202. package/dist/api/compiler/transformers/import-elision.js +14 -14
  203. package/dist/api/compiler/transformers/jsx.js +12 -12
  204. package/dist/api/compiler/transformers/legacy-decorators.js +17 -17
  205. package/dist/api/compiler/transformers/module.js +8 -8
  206. package/dist/api/compiler/transformers/named-evaluation.js +4 -4
  207. package/dist/api/compiler/transformers/object-rest-spread.js +20 -20
  208. package/dist/api/compiler/transformers/optional-chain.js +10 -10
  209. package/dist/api/compiler/transformers/reference-resolver.d.ts +12 -1
  210. package/dist/api/compiler/transformers/reference-resolver.js +131 -69
  211. package/dist/api/compiler/transformers/runtime-syntax.js +35 -31
  212. package/dist/api/compiler/transformers/subtree-facts.js +47 -47
  213. package/dist/api/compiler/transformers/syntax-facts.js +56 -58
  214. package/dist/api/compiler/transformers/type-eraser.js +73 -66
  215. package/dist/api/compiler/transformers/type-serialization.js +24 -24
  216. package/dist/api/compiler/transformers/using.js +12 -12
  217. package/dist/api/compiler/transformers/utilities.js +77 -77
  218. package/dist/api/compiler/transformers/visitor-base.js +172 -172
  219. package/dist/api/compiler/transformers/visitor-hooks.js +6 -2
  220. package/dist/api/compiler/tsconfig.d.ts +10 -2
  221. package/dist/api/compiler/tsconfig.js +136 -48
  222. package/dist/api/compiler/type-printer.js +40 -3
  223. package/dist/api/compiler/types.d.ts +2 -1
  224. package/dist/api/library/ast.generated.d.ts +42 -39
  225. package/dist/api/library/ast.generated.js +1 -1
  226. package/dist/api/library/compiler-options.generated.d.ts +111 -100
  227. package/dist/api/library/compiler-options.generated.js +1 -1
  228. package/dist/api/library/disk.js +12 -1
  229. package/dist/api/library/enums.generated.d.ts +206 -206
  230. package/dist/api/library/enums.generated.js +206 -206
  231. package/dist/api/library/nodes.js +26 -26
  232. package/package.json +9 -9
  233. package/src/compiler/ast-utilities.ts +99 -7
  234. package/src/compiler/ast.ts +58 -26
  235. package/src/compiler/binder.ts +39 -4
  236. package/src/compiler/character-codes.ts +2 -2
  237. package/src/compiler/checker-calls.ts +79 -9
  238. package/src/compiler/checker-classes.ts +78 -24
  239. package/src/compiler/checker-contextual.ts +6 -1
  240. package/src/compiler/checker-declarations.ts +31 -4
  241. package/src/compiler/checker-declared-types.ts +8 -5
  242. package/src/compiler/checker-decorators.ts +1 -1
  243. package/src/compiler/checker-deprecation.ts +29 -8
  244. package/src/compiler/checker-destructuring.ts +10 -3
  245. package/src/compiler/checker-emit-helpers.ts +1 -0
  246. package/src/compiler/checker-emit-resolver.ts +16 -6
  247. package/src/compiler/checker-expressions.ts +79 -46
  248. package/src/compiler/checker-functions.ts +21 -6
  249. package/src/compiler/checker-generated-code.ts +2 -22
  250. package/src/compiler/checker-grammar.ts +136 -62
  251. package/src/compiler/checker-heritage.ts +22 -21
  252. package/src/compiler/checker-inference.ts +514 -82
  253. package/src/compiler/checker-iteration.ts +18 -31
  254. package/src/compiler/checker-javascript.ts +1 -1
  255. package/src/compiler/checker-jsdoc.ts +50 -27
  256. package/src/compiler/checker-jsx.ts +26 -4
  257. package/src/compiler/checker-members.ts +200 -56
  258. package/src/compiler/checker-modules.ts +332 -65
  259. package/src/compiler/checker-narrowing.ts +98 -19
  260. package/src/compiler/checker-object-literals.ts +3 -0
  261. package/src/compiler/checker-operators.ts +11 -4
  262. package/src/compiler/checker-property-access.ts +7 -2
  263. package/src/compiler/checker-services.ts +39 -12
  264. package/src/compiler/checker-signatures.ts +15 -1
  265. package/src/compiler/checker-source-file.ts +39 -13
  266. package/src/compiler/checker-statements.ts +3 -2
  267. package/src/compiler/checker-symbol-types.ts +29 -6
  268. package/src/compiler/checker-symbols.ts +158 -15
  269. package/src/compiler/checker-type-factory.ts +124 -23
  270. package/src/compiler/checker-type-nodes.ts +46 -3
  271. package/src/compiler/checker-type-operators.ts +83 -26
  272. package/src/compiler/checker-types.ts +147 -4
  273. package/src/compiler/checker-unused.ts +9 -14
  274. package/src/compiler/checker.ts +203 -39
  275. package/src/compiler/command-line.ts +28 -28
  276. package/src/compiler/compile-program.ts +167 -27
  277. package/src/compiler/decoder.ts +13 -4
  278. package/src/compiler/diagnostic-messages.ts +1973 -1892
  279. package/src/compiler/diagnostics.ts +84 -3
  280. package/src/compiler/emitter.ts +57 -8
  281. package/src/compiler/encoder.ts +23 -8
  282. package/src/compiler/file-include.ts +9 -3
  283. package/src/compiler/file-loader.ts +197 -38
  284. package/src/compiler/help.ts +10 -14
  285. package/src/compiler/incremental.ts +165 -30
  286. package/src/compiler/init.ts +2 -7
  287. package/src/compiler/instantiation.ts +77 -22
  288. package/src/compiler/jsdoc.ts +3 -1
  289. package/src/compiler/link-tables.ts +82 -37
  290. package/src/compiler/locales/cs-CZ.ts +1 -1
  291. package/src/compiler/locales/de-DE.ts +1 -1
  292. package/src/compiler/locales/es-ES.ts +1 -1
  293. package/src/compiler/locales/fr-FR.ts +1 -1
  294. package/src/compiler/locales/it-IT.ts +1 -1
  295. package/src/compiler/locales/ja-JP.ts +1 -1
  296. package/src/compiler/locales/ko-KR.ts +1 -1
  297. package/src/compiler/locales/pl-PL.ts +1 -1
  298. package/src/compiler/locales/pt-BR.ts +1 -1
  299. package/src/compiler/locales/ru-RU.ts +1 -1
  300. package/src/compiler/locales/tr-TR.ts +1 -1
  301. package/src/compiler/locales/zh-CN.ts +1 -1
  302. package/src/compiler/locales/zh-TW.ts +1 -1
  303. package/src/compiler/module-resolution.ts +44 -8
  304. package/src/compiler/module-specifiers.ts +62 -20
  305. package/src/compiler/name-resolver.ts +9 -1
  306. package/src/compiler/node-builder-names.ts +236 -54
  307. package/src/compiler/node-builder-pseudo.ts +4 -7
  308. package/src/compiler/node-builder-reuse.ts +5 -4
  309. package/src/compiler/node-builder.ts +130 -31
  310. package/src/compiler/option-declarations.ts +33 -103
  311. package/src/compiler/options.ts +23 -62
  312. package/src/compiler/output-paths.ts +5 -18
  313. package/src/compiler/package-entrypoints.ts +345 -0
  314. package/src/compiler/package-json.ts +4 -4
  315. package/src/compiler/parallel-check.ts +326 -52
  316. package/src/compiler/parallel-emit.ts +320 -0
  317. package/src/compiler/parallel-parse.ts +16 -5
  318. package/src/compiler/parse-thread.ts +3 -0
  319. package/src/compiler/parser.ts +156 -39
  320. package/src/compiler/path.ts +22 -2
  321. package/src/compiler/printer/emit-context.ts +21 -0
  322. package/src/compiler/printer/factory-base.ts +10 -3
  323. package/src/compiler/printer/factory.ts +4 -1
  324. package/src/compiler/printer/helpers.ts +10 -1
  325. package/src/compiler/printer/name-generator.ts +24 -2
  326. package/src/compiler/printer/printer.ts +266 -30
  327. package/src/compiler/printer/utilities.ts +8 -2
  328. package/src/compiler/program-checker.ts +57 -5
  329. package/src/compiler/program-utilities.ts +23 -10
  330. package/src/compiler/program.ts +18 -26
  331. package/src/compiler/pseudo-bigint.ts +17 -0
  332. package/src/compiler/regexp-checker.ts +63 -30
  333. package/src/compiler/relations.ts +240 -77
  334. package/src/compiler/reparser.ts +7 -2
  335. package/src/compiler/scanner.ts +109 -79
  336. package/src/compiler/shared-results.ts +2414 -0
  337. package/src/compiler/show-config.ts +18 -1
  338. package/src/compiler/sourcemap.ts +2 -2
  339. package/src/compiler/symbol-accessibility.ts +26 -3
  340. package/src/compiler/symbol.ts +46 -24
  341. package/src/compiler/syntax-kind.ts +188 -187
  342. package/src/compiler/thread-entry.ts +64 -4
  343. package/src/compiler/transformers/alias-references.ts +123 -4
  344. package/src/compiler/transformers/async.ts +2 -17
  345. package/src/compiler/transformers/class-fields.ts +13 -12
  346. package/src/compiler/transformers/commonjs-module.ts +11 -7
  347. package/src/compiler/transformers/declarations-diagnostics.ts +5 -3
  348. package/src/compiler/transformers/declarations-pseudo.ts +2 -4
  349. package/src/compiler/transformers/declarations-resolver.ts +0 -3
  350. package/src/compiler/transformers/declarations-syntactic.ts +1 -21
  351. package/src/compiler/transformers/declarations.ts +134 -48
  352. package/src/compiler/transformers/decorator-metadata.ts +9 -1
  353. package/src/compiler/transformers/destructuring.ts +4 -3
  354. package/src/compiler/transformers/external-module-info.ts +1 -1
  355. package/src/compiler/transformers/jsx.ts +2 -1
  356. package/src/compiler/transformers/reference-resolver.ts +83 -19
  357. package/src/compiler/transformers/runtime-syntax.ts +6 -1
  358. package/src/compiler/transformers/syntax-facts.ts +2 -7
  359. package/src/compiler/transformers/type-eraser.ts +10 -1
  360. package/src/compiler/transformers/type-serialization.ts +3 -2
  361. package/src/compiler/transformers/visitor-base.ts +2 -1
  362. package/src/compiler/transformers/visitor-hooks.ts +9 -4
  363. package/src/compiler/tsc-build.ts +66 -9
  364. package/src/compiler/tsc-cli.ts +7 -0
  365. package/src/compiler/tsc-compile.ts +284 -4
  366. package/src/compiler/tsc-watch.ts +74 -45
  367. package/src/compiler/tsconfig.ts +176 -19
  368. package/src/compiler/type-printer.ts +36 -2
  369. package/src/compiler/types.ts +2 -1
  370. package/src/library/ast.generated.ts +57 -41
  371. package/src/library/compiler-options.generated.ts +117 -103
  372. package/src/library/disk.ts +10 -1
  373. package/src/library/enums.generated.ts +196 -196
@@ -1,32 +1,31 @@
1
1
  // Type inference: inference contexts, inferring from source to target types, and the inferred
2
2
  // types of type parameters.
3
3
  import { sideOf, signatureSideOf } from './side-state.js';
4
+ import { isInJSFile } from './ast-utilities.js';
4
5
  import { hasSyntacticModifier } from './binder-utilities.js';
5
- import { ArrayToSingleTypeMapper, MergedTypeMapper, TupleElementInfo, TypeMapper, newTypeMapper, SimpleTypeMapper, emptyTypes, } from './checker-types.js';
6
- import { createAnonymousType, createArrayType, createArrayTypeEx, createTupleType, createTupleTypeEx, filterType, getBaseTypeOfLiteralType, getBigIntLiteralType, getElementTypes, getEndElementCount, getIntersectionType, getNumberLiteralType, getRegularTypeOfLiteralType, getStringLiteralType, getTemplateLiteralType, getTypeArguments, getTypeReferenceArity, getUnionType, getUnionTypeEx, getWidenedLiteralType, isArrayOrTupleType, isErrorType, isArrayType, isGenericTupleType, isLiteralType, isMutableArrayOrTuple, isReadonlyArrayType, isTupleType, mapType, newIndexInfo, newObjectType, setStructuredTypeMembers, someType, tupleTargetOf, typesOf, } from './checker-type-factory.js';
6
+ import { ArrayToSingleTypeMapper, MergedTypeMapper, TupleElementInfo, TypeMapper, newTypeMapper, SimpleTypeMapper, emptyTypes, getNonDistributedTypeParameter, } from './checker-types.js';
7
+ import { createAnonymousType, createArrayType, createArrayTypeEx, createTupleType, createTupleTypeEx, filterType, getBaseTypeOfLiteralType, getBigIntLiteralType, getElementTypes, getEndElementCount, getIntersectionType, getNumberLiteralType, getRegularTypeOfLiteralType, getStringLiteralType, getTemplateLiteralType, getTypeArguments, getTypeReferenceArity, getUnionType, getUnionTypeEx, getWidenedLiteralType, isArrayOrTupleType, isErrorType, isArrayType, isGenericTupleType, isLiteralType, isMutableArrayOrTuple, isReadonlyArrayType, isTupleType, mapType, newIndexInfo, newObjectType, setStructuredTypeMembers, someType, tupleTargetOf, typesOf, compareTypes, } from './checker-type-factory.js';
7
8
  import { getDeclaredTypeOfClassOrInterface, getDeclaredTypeOfSymbol, fillMissingTypeArguments, getConstraintOfTypeParameter, getDefaultFromTypeParameter, getMinTypeArgumentCount, getDeclaredTypeOfTypeParameter, } from './checker-declared-types.js';
8
9
  import { applyStringMapping, getActualTypeVariable, getBranchTypesFromConditionalType, getConstraintFromConditionalType, getConstraintOfConditionalType, getConstraintTypeFromMappedType, getElementTypeOfSliceOfTupleType, getFalseTypeFromConditionalType, getHomomorphicTypeVariable, getIndexType, getIndexTypeEx, getIndexedAccessType, getLiteralTypeFromProperty, getMappedTypeModifiers, getNameTypeFromMappedType, getSimplifiedType, getSubstitutionIntersection, getTemplateTypeFromMappedType, getTrueTypeFromConditionalType, getTypeParameterFromMappedType, isGenericMappedType, isNoInferType, isTypeMatchedByTemplateLiteralType, shouldDeferIndexType, } from './checker-type-operators.js';
9
10
  import { getApparentType, getApplicableIndexInfo, getBaseConstraintOfType, getBaseConstraintOrType, getConstraintOfType, getIndexInfoOfType, getIndexInfosOfType, getPropertiesOfObjectType, getPropertiesOfType, getPropertyOfType, getPropertyOfUnionOrIntersectionType, getReducedApparentType, getReducedType, getSignaturesOfType, getTypeWithThisArgument, isApplicableIndexType, isObjectLiteralType, } from './checker-members.js';
10
11
  import { getEffectiveRestType, getErasedSignature, getParameterCount, getRestTypeAtPosition, getReturnTypeOfSignature, getSignatureInstantiation, getThisTypeOfSignature, getTypeAtPosition, getTypePredicateOfSignature, sliceTupleType, } from './checker-signatures.js';
11
12
  import { getNullableType, getTypeOfSymbol, getWidenedType, isReadonlySymbol, removeMissingOrUndefinedType, removeMissingType, } from './checker-symbol-types.js';
12
13
  import { combineTypeMappers, couldContainTypeVariables, instantiateSignature, instantiateSignatureEx, instantiateType, instantiateTypes, } from './instantiation.js';
13
- import { getAliasVariances, getComparer, getUnmatchedProperty, getVariances, isUnmatchedProperty, isDeeplyNestedType, setStackEntry, isObjectTypeWithInferableIndex, isTypeAssignableTo, isTypeIdenticalTo, isTypeStrictSubtypeOf, isTypeSubtypeOf, } from './relations.js';
14
+ import { getAliasVariances, getComparer, getUnmatchedProperty, getVariances, isUnmatchedProperty, isDeeplyNestedStackEntry, isDeeplyNestedType, setStackEntry, isObjectTypeWithInferableIndex, isTypeAssignableTo, isTypeIdenticalTo, isTypeStrictSubtypeOf, isTypeSubtypeOf, } from './relations.js';
14
15
  import { maybeTypeOfKind } from './checker-utilities.js';
15
16
  import { getTypeFromTypeNode } from './checker-type-nodes.js';
16
- import { getMergedSymbol, getSymbolOfDeclaration } from './checker-symbols.js';
17
+ import { findResolutionCycleStartIndex, getMergedSymbol, getSymbolOfDeclaration, } from './checker-symbols.js';
17
18
  import { parsePseudoBigInt } from './pseudo-bigint.js';
18
19
  import { getContextualTypeForInference } from './checker-contextual.js';
19
20
  import { copyDeclarations, declarationCount, getDeclarations, getSymbolId, } from './symbol.js';
20
21
  // Shared empty candidate lists: an InferenceInfo gets its own on its first candidate, as tsgo's nil
21
22
  // slices do. Never changed.
22
23
  const noCandidates = [];
23
- const noCandidateDepths = [];
24
24
  /** Inferences for one type parameter. */
25
25
  export class InferenceInfo {
26
26
  typeParameter;
27
- /** Covariant candidates, in decreasing depth order. */
27
+ /** Covariant candidates. */
28
28
  candidates = noCandidates;
29
- candidateDepths = noCandidateDepths;
30
29
  contraCandidates = noCandidates;
31
30
  inferredType = undefined;
32
31
  priority = 2048 /* InferencePriority.MaxValue */;
@@ -39,10 +38,8 @@ export class InferenceInfo {
39
38
  }
40
39
  clone() {
41
40
  const info = new InferenceInfo(this.typeParameter);
42
- if (this.candidates.length !== 0) {
41
+ if (this.candidates.length !== 0)
43
42
  info.candidates = this.candidates.slice();
44
- info.candidateDepths = this.candidateDepths.slice();
45
- }
46
43
  if (this.contraCandidates.length !== 0)
47
44
  info.contraCandidates = this.contraCandidates.slice();
48
45
  info.inferredType = this.inferredType;
@@ -201,7 +198,7 @@ function hasTypeParameterDefault(tp) {
201
198
  if (symbol === undefined)
202
199
  return false;
203
200
  for (const d of getDeclarations(symbol))
204
- if (d.kind === 169 /* SyntaxKind.TypeParameter */ && d.defaultType !== undefined)
201
+ if (d.kind === 170 /* SyntaxKind.TypeParameter */ && d.defaultType !== undefined)
205
202
  return true;
206
203
  return false;
207
204
  }
@@ -222,6 +219,224 @@ export function inferTypes(c, inferences, source, target, priority, contravarian
222
219
  const state = new InferenceState(c, inferences, target, priority, contravariant);
223
220
  state.inferFromTypes(source, target);
224
221
  }
222
+ /** Whether no inference has a candidate or an inferred type, or is fixed, as in a new context. */
223
+ function isUnstarted(inferences) {
224
+ for (const i of inferences)
225
+ if (i.candidates.length !== 0 || i.contraCandidates.length !== 0 || i.inferredType !== undefined || i.isFixed)
226
+ return false;
227
+ return true;
228
+ }
229
+ /** A memoized `inferTypesFromUnstarted` walk. */
230
+ export class UnstartedInference {
231
+ state;
232
+ inferences;
233
+ /** The instantiations the walk does, which a skipped walk adds to the counts. */
234
+ instantiations;
235
+ /** The instantiation depth the confirming walk started at: a walk starting deeper might reach the limit. */
236
+ depth;
237
+ /** The variance reliability flags the walk reports. */
238
+ reliabilityFlags;
239
+ /** The unions and intersections the walk searched before their properties were resolved. */
240
+ searched;
241
+ constructor(state, inferences, instantiations, depth, reliabilityFlags, searched) {
242
+ this.state = state;
243
+ this.inferences = inferences;
244
+ this.instantiations = instantiations;
245
+ this.depth = depth;
246
+ this.reliabilityFlags = reliabilityFlags;
247
+ this.searched = searched;
248
+ }
249
+ }
250
+ const verifyUnstartedInferences = process.env['TSC_TS_VERIFY_INFERENCE_MEMO'] === '1';
251
+ /**
252
+ * `inferTypes` into the inferences for `signature`'s type parameters, to `target`, which is
253
+ * determined by `signature` (its return type). When no inference has started, the walk depends only
254
+ * on `signature`, `source` and `priority`, so it is memoized per checker. Contextual return type
255
+ * inference repeats the same walk for calls of a generic function with the same contextual type at
256
+ * different call sites.
257
+ *
258
+ * A walk is skipped only when it would add nothing but the inferences:
259
+ * - Once a second and a third walk have both created no types or signatures and done the same. The
260
+ * first walk resolves the types it reaches; only walks that repeat keep their inferences.
261
+ * - With the instantiation count and depth replayed. The walk is skipped only where it could not
262
+ * reach the instantiation limits.
263
+ * - With the variance reliability flags replayed.
264
+ * - Never when a walk reported a diagnostic or met a circularity. Never during a variance
265
+ * computation, where relations are not cached and circularities are found differently.
266
+ * - Only while the unions and intersections whose unresolved properties the walk searched
267
+ * (hasUnmatchedProperty) are still unresolved. Once they are resolved, the same walk creates the
268
+ * property types, so it is learned again.
269
+ */
270
+ export function inferTypesFromUnstarted(c, signature, inferences, source, target, priority) {
271
+ if (c.varianceStack.length !== 0 || !isUnstarted(inferences)) {
272
+ inferTypes(c, inferences, source, target, priority, false);
273
+ return;
274
+ }
275
+ const caches = c.inferenceCaches;
276
+ const memo = caches.unstartedInferences;
277
+ let bySource = memo.get(signature.id);
278
+ if (bySource === undefined) {
279
+ bySource = new Map();
280
+ memo.set(signature.id, bySource);
281
+ }
282
+ const key = source.id * 4096 + priority;
283
+ let known = bySource.get(key);
284
+ if (known !== undefined && known.state === 2 /* UnstartedInferenceState.Confirmed */) {
285
+ if (havePropertiesResolved(c, known.searched)) {
286
+ // Learn the walk again for the resolved properties; each union's properties are resolved once.
287
+ bySource.delete(key);
288
+ known = undefined;
289
+ }
290
+ else if (c.instantiationDepth <= known.depth && c.instantiationCount + known.instantiations < 5000000) {
291
+ if (verifyUnstartedInferences)
292
+ verifyUnstartedInference(c, signature, known, source, target, priority);
293
+ copyInferences(inferences, known.inferences);
294
+ const outer = c.unresolvedPropertySearches;
295
+ if (outer !== undefined)
296
+ for (const t of known.searched)
297
+ outer.push(t);
298
+ c.instantiationCount += known.instantiations;
299
+ c.totalInstantiations += known.instantiations;
300
+ c.reliabilityFlags |= known.reliabilityFlags;
301
+ return;
302
+ }
303
+ }
304
+ const reports = c.reports;
305
+ const cycles = c.resolutionCycleCount;
306
+ const outerSearches = c.unresolvedPropertySearches;
307
+ const searches = [];
308
+ c.unresolvedPropertySearches = searches;
309
+ const types = c.typeCount;
310
+ const signatures = c.signatureCount;
311
+ const count = c.instantiationCount;
312
+ const total = c.totalInstantiations;
313
+ const depth = c.instantiationDepth;
314
+ const reliabilityFlags = c.reliabilityFlags;
315
+ // Nothing reads the flags before setting them, so the walk's own are those it leaves from zero.
316
+ c.reliabilityFlags = 0;
317
+ inferTypes(c, inferences, source, target, priority, false);
318
+ const walkFlags = c.reliabilityFlags;
319
+ c.reliabilityFlags = reliabilityFlags | walkFlags;
320
+ c.unresolvedPropertySearches = outerSearches;
321
+ // An enclosing walk depends on the searches of the walks within it.
322
+ if (outerSearches !== undefined)
323
+ for (const t of searches)
324
+ outerSearches.push(t);
325
+ const state = known === undefined ? undefined : known.state;
326
+ if (state === 2 /* UnstartedInferenceState.Confirmed */ || state === 3 /* UnstartedInferenceState.Unusable */)
327
+ return;
328
+ const instantiations = c.totalInstantiations - total;
329
+ if (c.reports !== reports || c.resolutionCycleCount !== cycles || c.instantiationCount - count !== instantiations) {
330
+ bySource.set(key, caches.alwaysWalked);
331
+ return;
332
+ }
333
+ if (state === undefined) {
334
+ bySource.set(key, caches.seenOnce);
335
+ return;
336
+ }
337
+ if (c.typeCount !== types || c.signatureCount !== signatures) {
338
+ bySource.set(key, caches.alwaysWalked);
339
+ return;
340
+ }
341
+ const searched = searches.length === 0 ? searches : [...new Set(searches)];
342
+ if (state === 0 /* UnstartedInferenceState.Seen */) {
343
+ const snapshot = [];
344
+ for (const i of inferences)
345
+ snapshot.push(i.clone());
346
+ bySource.set(key, new UnstartedInference(1 /* UnstartedInferenceState.Walked */, snapshot, instantiations, depth, walkFlags, searched));
347
+ return;
348
+ }
349
+ bySource.set(key, sameInferences(inferences, known.inferences) &&
350
+ instantiations === known.instantiations &&
351
+ walkFlags === known.reliabilityFlags
352
+ ? new UnstartedInference(2 /* UnstartedInferenceState.Confirmed */, known.inferences, instantiations, depth, walkFlags, searched)
353
+ : caches.alwaysWalked);
354
+ }
355
+ /** Whether the properties of any of `types` have been resolved. */
356
+ function havePropertiesResolved(c, types) {
357
+ for (const t of types)
358
+ if (sideOf(c, t).membersOf?.resolvedProperties !== undefined)
359
+ return true;
360
+ return false;
361
+ }
362
+ function copyInferences(inferences, from) {
363
+ for (let k = 0; k < inferences.length; k++) {
364
+ const info = inferences[k];
365
+ const known = from[k];
366
+ if (known.candidates.length !== 0)
367
+ info.candidates = known.candidates.slice();
368
+ if (known.contraCandidates.length !== 0)
369
+ info.contraCandidates = known.contraCandidates.slice();
370
+ info.inferredType = known.inferredType;
371
+ info.priority = known.priority;
372
+ info.topLevel = known.topLevel;
373
+ info.isFixed = known.isFixed;
374
+ info.impliedArity = known.impliedArity;
375
+ }
376
+ }
377
+ function sameTypes(a, b) {
378
+ if (a.length !== b.length)
379
+ return false;
380
+ for (let k = 0; k < a.length; k++)
381
+ if (a[k] !== b[k])
382
+ return false;
383
+ return true;
384
+ }
385
+ function sameInferences(a, b) {
386
+ for (let k = 0; k < a.length; k++) {
387
+ const x = a[k];
388
+ const y = b[k];
389
+ if (!sameTypes(x.candidates, y.candidates) ||
390
+ !sameTypes(x.contraCandidates, y.contraCandidates) ||
391
+ x.inferredType !== y.inferredType ||
392
+ x.priority !== y.priority ||
393
+ x.topLevel !== y.topLevel ||
394
+ x.isFixed !== y.isFixed ||
395
+ x.impliedArity !== y.impliedArity)
396
+ return false;
397
+ }
398
+ return true;
399
+ }
400
+ /** With TSC_TS_VERIFY_INFERENCE_MEMO=1: walks anyway and reports how the skipped walk would have differed. */
401
+ function verifyUnstartedInference(c, signature, known, source, target, priority) {
402
+ const inferences = [];
403
+ for (const i of known.inferences)
404
+ inferences.push(new InferenceInfo(i.typeParameter));
405
+ const types = c.typeCount;
406
+ const signatures = c.signatureCount;
407
+ const total = c.totalInstantiations;
408
+ const reports = c.reports;
409
+ const cycles = c.resolutionCycleCount;
410
+ const reliabilityFlags = c.reliabilityFlags;
411
+ const outerSearches = c.unresolvedPropertySearches;
412
+ c.reliabilityFlags = 0;
413
+ c.unresolvedPropertySearches = undefined;
414
+ inferTypes(c, inferences, source, target, priority, false);
415
+ const walkFlags = c.reliabilityFlags;
416
+ c.reliabilityFlags = reliabilityFlags;
417
+ c.unresolvedPropertySearches = outerSearches;
418
+ const instantiations = c.totalInstantiations - total;
419
+ // Undo the check walk's count so the run continues as without verification.
420
+ c.instantiationCount -= instantiations;
421
+ c.totalInstantiations -= instantiations;
422
+ const differences = [];
423
+ if (!sameInferences(inferences, known.inferences))
424
+ differences.push('inferences');
425
+ if (c.typeCount !== types)
426
+ differences.push(`${c.typeCount - types} types`);
427
+ if (c.signatureCount !== signatures)
428
+ differences.push(`${c.signatureCount - signatures} signatures`);
429
+ if (instantiations !== known.instantiations)
430
+ differences.push(`${instantiations} instantiations, not ${known.instantiations}`);
431
+ if (c.reports !== reports)
432
+ differences.push(`${c.reports - reports} diagnostics`);
433
+ if (c.resolutionCycleCount !== cycles)
434
+ differences.push('a circularity');
435
+ if (walkFlags !== known.reliabilityFlags)
436
+ differences.push('reliability flags');
437
+ if (differences.length !== 0)
438
+ process.stderr.write(`inference memo: signature ${signature.id} source ${source.id} priority ${priority}: ${differences.join(', ')}\n`);
439
+ }
225
440
  class MatchedTypes {
226
441
  sources;
227
442
  targets;
@@ -251,20 +466,34 @@ class InferenceState {
251
466
  bivariant = false;
252
467
  expandingFlags = 0 /* ExpandingFlags.None */;
253
468
  propagationType = undefined;
254
- /** invokeOnce's pairs by packed type ids (`visitKey`), or spelled when an id is too large to pack. */
469
+ /**
470
+ * The statuses of the pairs invokeOnce finished, for each priority and variance of the walk (`visitMode`), by
471
+ * packed type ids (`visitKey`), or spelled when an id is too large to pack. The first pair with packed ids is in
472
+ * `firstVisitKey` instead: most walks finish at most one.
473
+ */
255
474
  visited = undefined;
256
475
  visitedSpelled = undefined;
257
- /** invokeOnce's recursion stacks; the first `stackDepth` entries of each are live. */
258
- sourceStack = [];
259
- targetStack = [];
476
+ /** The mode `visitedPairs` belongs to, or -1 before the first `visitedPairsOf`. */
477
+ visitedMode = -1;
478
+ /** `visited`'s map for `visitedMode`; a walk mostly stays in one mode. */
479
+ visitedPairs = undefined;
480
+ /** The first finished pair with packed ids (-1 before it), its mode and its status. */
481
+ firstVisitKey = -1;
482
+ firstVisitMode = 0;
483
+ firstVisitStatus = 2048 /* InferencePriority.MaxValue */;
484
+ /**
485
+ * Where this walk's entries start on the checker's invokeOnce stacks (`InferenceCaches.invokeSourceStack`). The
486
+ * `stackDepth` entries from there are live: the pairs being visited.
487
+ */
488
+ stackBase;
260
489
  stackDepth = 0;
261
- depth = 0;
262
490
  constructor(c, inferences, originalTarget, priority, contravariant) {
263
491
  this.c = c;
264
492
  this.inferences = inferences;
265
493
  this.originalTarget = originalTarget;
266
494
  this.priority = priority;
267
495
  this.contravariant = contravariant;
496
+ this.stackBase = c.inferenceCaches.invokeStackDepth;
268
497
  }
269
498
  infoFor(t) {
270
499
  return getInferenceInfoForType(this.inferences, t);
@@ -284,14 +513,9 @@ class InferenceState {
284
513
  const sourceAlias = source.alias;
285
514
  const targetAlias = target.alias;
286
515
  if (sourceAlias !== undefined && targetAlias !== undefined && sourceAlias.symbol === targetAlias.symbol) {
287
- if (sourceAlias.typeArguments.length !== 0 || targetAlias.typeArguments.length !== 0) {
288
- // Instantiations of the same alias: infer between the type arguments, with defaults applied.
289
- const params = c.symbolLinks(sourceAlias.symbol).typeParameters ?? [];
290
- const minParams = getMinTypeArgumentCount(c, params);
291
- const sourceTypes = fillMissingTypeArguments(c, sourceAlias.typeArguments, params, minParams, false);
292
- const targetTypes = fillMissingTypeArguments(c, targetAlias.typeArguments, params, minParams, false);
293
- this.inferFromTypeArguments(sourceTypes, targetTypes, someTypeCouldHoldInference(c, targetTypes) ? getAliasVariances(c, sourceAlias.symbol) : noVariances);
294
- }
516
+ // Instantiations of the same alias infer between their type arguments, once for each pair of types, as tsc does.
517
+ if (sourceAlias.typeArguments.length !== 0 || targetAlias.typeArguments.length !== 0)
518
+ this.invokeOnce(source, target, 0 /* InferenceAction.AliasTypeArguments */);
295
519
  return;
296
520
  }
297
521
  if (source === target && (source.flags & 402653184 /* TypeFlags.UnionOrIntersection */) !== 0) {
@@ -302,7 +526,7 @@ class InferenceState {
302
526
  if ((target.flags & 134217728 /* TypeFlags.Union */) !== 0) {
303
527
  const sourceTypes = (source.flags & 134217728 /* TypeFlags.Union */) !== 0 ? typesOf(source) : [source];
304
528
  // Infer between identically matching constituents, then closely matching ones, removing them.
305
- const temp = this.inferFromMatchingTypes(sourceTypes, distributedTypes(target), 0 /* MatchKind.TypeOrBaseIdentical */);
529
+ const temp = this.inferFromMatchingTypes(sourceTypes, typesOf(target), 0 /* MatchKind.TypeOrBaseIdentical */);
306
530
  const matched = this.inferFromMatchingTypes(temp.sources, temp.targets, 1 /* MatchKind.CloselyMatched */);
307
531
  if (matched.targets.length === 0)
308
532
  return;
@@ -355,7 +579,7 @@ class InferenceState {
355
579
  (target.objectFlags & 4 /* ObjectFlags.Reference */) !== 0 &&
356
580
  (referenceTarget(source) === referenceTarget(target) || (isArrayType(c, source) && isArrayType(c, target))) &&
357
581
  !(referenceNode(source) !== undefined && referenceNode(target) !== undefined)) {
358
- this.inferFromReferenceTypeArguments(source, target);
582
+ this.invokeOnce(source, target, 4 /* InferenceAction.ReferenceTypeArguments */);
359
583
  }
360
584
  else if ((source.flags & 2097152 /* TypeFlags.Index */) !== 0 && (target.flags & 2097152 /* TypeFlags.Index */) !== 0) {
361
585
  this.inferFromContravariantTypes(source.target, target.target);
@@ -379,7 +603,7 @@ class InferenceState {
379
603
  this.inferWithPriority(getSubstitutionIntersection(c, source), target, 4 /* InferencePriority.SubstituteSource */);
380
604
  }
381
605
  else if ((target.flags & 67108864 /* TypeFlags.Conditional */) !== 0) {
382
- this.invokeOnce(source, target, 0 /* InferenceAction.ConditionalType */);
606
+ this.invokeOnce(source, target, 1 /* InferenceAction.ConditionalType */);
383
607
  }
384
608
  else if ((target.flags & 402653184 /* TypeFlags.UnionOrIntersection */) !== 0) {
385
609
  this.inferToMultipleTypes(source, typesOf(target), target.flags);
@@ -394,7 +618,7 @@ class InferenceState {
394
618
  else {
395
619
  source = getReducedType(c, source);
396
620
  if (isGenericMappedType(c, source) && isGenericMappedType(c, target))
397
- this.invokeOnce(source, target, 1 /* InferenceAction.GenericMappedTypes */);
621
+ this.invokeOnce(source, target, 2 /* InferenceAction.GenericMappedTypes */);
398
622
  if (!((this.priority & 512 /* InferencePriority.NoConstraints */) !== 0 &&
399
623
  (source.flags & (268435456 /* TypeFlags.Intersection */ | 132644864 /* TypeFlags.Instantiable */)) !== 0)) {
400
624
  const apparentSource = getApparentType(c, source);
@@ -406,7 +630,7 @@ class InferenceState {
406
630
  source = apparentSource;
407
631
  }
408
632
  if ((source.flags & (1048576 /* TypeFlags.Object */ | 268435456 /* TypeFlags.Intersection */)) !== 0)
409
- this.invokeOnce(source, target, 2 /* InferenceAction.ObjectTypes */);
633
+ this.invokeOnce(source, target, 3 /* InferenceAction.ObjectTypes */);
410
634
  }
411
635
  }
412
636
  inferToTypeVariable(inference, source, target) {
@@ -420,7 +644,6 @@ class InferenceState {
420
644
  return;
421
645
  if (this.priority < inference.priority) {
422
646
  inference.candidates = noCandidates;
423
- inference.candidateDepths = noCandidateDepths;
424
647
  inference.contraCandidates = noCandidates;
425
648
  inference.topLevel = true;
426
649
  inference.priority = this.priority;
@@ -435,25 +658,11 @@ class InferenceState {
435
658
  clearCachedInferences(this.inferences);
436
659
  }
437
660
  }
438
- else {
439
- let index = inference.candidates.indexOf(candidate);
440
- if (index < 0 || inference.candidateDepths[index] < this.depth) {
441
- if (index >= 0) {
442
- inference.candidates.splice(index, 1);
443
- inference.candidateDepths.splice(index, 1);
444
- }
445
- if (inference.candidates === noCandidates) {
446
- inference.candidates = [];
447
- inference.candidateDepths = [];
448
- }
449
- // Keep candidates with the highest depth first.
450
- index = 0;
451
- while (index < inference.candidateDepths.length && inference.candidateDepths[index] >= this.depth)
452
- index++;
453
- inference.candidates.splice(index, 0, candidate);
454
- inference.candidateDepths.splice(index, 0, this.depth);
455
- clearCachedInferences(this.inferences);
456
- }
661
+ else if (!inference.candidates.includes(candidate)) {
662
+ if (inference.candidates === noCandidates)
663
+ inference.candidates = [];
664
+ inference.candidates.push(candidate);
665
+ clearCachedInferences(this.inferences);
457
666
  }
458
667
  }
459
668
  if ((this.priority & 128 /* InferencePriority.ReturnType */) === 0 &&
@@ -478,7 +687,6 @@ class InferenceState {
478
687
  this.inferFromTypeArguments(sourceTypes, targetTypes, someTypeCouldHoldInference(c, targetTypes) ? getVariances(c, referenceTarget(source)) : noVariances);
479
688
  }
480
689
  inferFromTypeArguments(sourceTypes, targetTypes, variances) {
481
- this.depth++;
482
690
  const count = Math.min(sourceTypes.length, targetTypes.length);
483
691
  for (let i = 0; i < count; i++) {
484
692
  if (i < variances.length && (variances[i] & 7 /* VarianceFlags.VarianceMask */) === 2 /* VarianceFlags.Contravariant */)
@@ -486,7 +694,6 @@ class InferenceState {
486
694
  else
487
695
  this.inferFromTypes(sourceTypes[i], targetTypes[i]);
488
696
  }
489
- this.depth--;
490
697
  }
491
698
  inferWithPriority(source, target, newPriority) {
492
699
  const savePriority = this.priority;
@@ -513,63 +720,139 @@ class InferenceState {
513
720
  }
514
721
  /** Runs `action` once per source and target pair, stopping at circularities. */
515
722
  invokeOnce(source, target, action) {
723
+ // As in tsc, a pair is visited once for each priority and variance it is inferred with.
724
+ const mode = visitMode(this.priority, this.contravariant, this.bivariant);
516
725
  const key = visitKey(source, target);
517
- const status = key >= 0 ? this.visited?.get(key) : this.visitedSpelled?.get(source.id + ',' + target.id);
726
+ const status = this.getVisited(source, target, key, mode);
518
727
  if (status !== undefined) {
519
728
  this.inferencePriority = Math.min(this.inferencePriority, status);
520
729
  return;
521
730
  }
522
- this.setVisited(source, target, key, -1 /* InferencePriority.Circularity */);
523
731
  const saveInferencePriority = this.inferencePriority;
524
732
  this.inferencePriority = 2048 /* InferencePriority.MaxValue */;
525
733
  // Duplicate recursion identities on both sides mean a circularity.
526
734
  const saveExpandingFlags = this.expandingFlags;
735
+ const caches = this.c.inferenceCaches;
527
736
  const stackDepth = this.stackDepth;
528
- setStackEntry(this.sourceStack, stackDepth, source);
529
- setStackEntry(this.targetStack, stackDepth, target);
737
+ const start = this.stackBase;
738
+ const end = start + stackDepth + 1;
739
+ setStackEntry(caches.invokeSourceStack, end - 1, source);
740
+ setStackEntry(caches.invokeTargetStack, end - 1, target);
741
+ setNumberEntry(caches.invokeModeStack, end - 1, mode);
742
+ setNumberEntry(caches.invokeSourceIdentities, end - 1, 0);
743
+ setNumberEntry(caches.invokeTargetIdentities, end - 1, 0);
530
744
  this.stackDepth = stackDepth + 1;
531
- if (isDeeplyNestedType(this.c, source, this.sourceStack, stackDepth + 1, 2))
745
+ caches.invokeStackDepth = end;
746
+ if (isDeeplyNestedStackEntry(this.c, caches.invokeSourceStack, caches.invokeSourceIdentities, start, end, 2))
532
747
  this.expandingFlags |= 1 /* ExpandingFlags.Source */;
533
- if (isDeeplyNestedType(this.c, target, this.targetStack, stackDepth + 1, 2))
748
+ if (isDeeplyNestedStackEntry(this.c, caches.invokeTargetStack, caches.invokeTargetIdentities, start, end, 2))
534
749
  this.expandingFlags |= 2 /* ExpandingFlags.Target */;
535
750
  if (this.expandingFlags !== 3 /* ExpandingFlags.Both */) {
536
751
  switch (action) {
537
- case 0 /* InferenceAction.ConditionalType */:
752
+ case 0 /* InferenceAction.AliasTypeArguments */:
753
+ this.inferFromAliasTypeArguments(source, target);
754
+ break;
755
+ case 1 /* InferenceAction.ConditionalType */:
538
756
  this.inferToConditionalType(source, target);
539
757
  break;
540
- case 1 /* InferenceAction.GenericMappedTypes */:
758
+ case 2 /* InferenceAction.GenericMappedTypes */:
541
759
  this.inferFromGenericMappedTypes(source, target);
542
760
  break;
543
- case 2 /* InferenceAction.ObjectTypes */:
761
+ case 3 /* InferenceAction.ObjectTypes */:
544
762
  this.inferFromObjectTypes(source, target);
545
763
  break;
764
+ case 4 /* InferenceAction.ReferenceTypeArguments */:
765
+ this.inferFromReferenceTypeArguments(source, target);
766
+ break;
546
767
  }
547
768
  }
548
769
  else
549
770
  this.inferencePriority = -1 /* InferencePriority.Circularity */;
550
771
  this.stackDepth = stackDepth;
772
+ caches.invokeStackDepth = end - 1;
551
773
  this.expandingFlags = saveExpandingFlags;
552
- this.setVisited(source, target, key, this.inferencePriority);
774
+ this.setVisited(source, target, key, mode, this.inferencePriority);
553
775
  this.inferencePriority = Math.min(this.inferencePriority, saveInferencePriority);
554
776
  }
555
- setVisited(source, target, key, status) {
777
+ /**
778
+ * The status of the pair in `mode`: its status once it is finished, Circularity while it is being visited, and
779
+ * undefined before its first visit.
780
+ */
781
+ getVisited(source, target, key, mode) {
556
782
  if (key >= 0) {
557
- let visited = this.visited;
558
- if (visited === undefined) {
559
- visited = new Map();
560
- this.visited = visited;
561
- }
562
- visited.set(key, status);
783
+ if (key === this.firstVisitKey && mode === this.firstVisitMode)
784
+ return this.firstVisitStatus;
785
+ const status = this.visited !== undefined ? this.visitedPairsOf(mode)?.get(key) : undefined;
786
+ if (status !== undefined)
787
+ return status;
563
788
  }
564
789
  else {
790
+ const status = this.visitedSpelled?.get(source.id + ',' + target.id + ',' + mode);
791
+ if (status !== undefined)
792
+ return status;
793
+ }
794
+ const caches = this.c.inferenceCaches;
795
+ const targetStack = caches.invokeTargetStack;
796
+ const end = this.stackBase + this.stackDepth;
797
+ for (let i = this.stackBase; i < end; i++)
798
+ if (targetStack[i] === target && caches.invokeSourceStack[i] === source && caches.invokeModeStack[i] === mode)
799
+ return -1 /* InferencePriority.Circularity */;
800
+ return undefined;
801
+ }
802
+ /** Records the status of a finished pair. */
803
+ setVisited(source, target, key, mode, status) {
804
+ if (key < 0) {
565
805
  let visited = this.visitedSpelled;
566
806
  if (visited === undefined) {
567
807
  visited = new Map();
568
808
  this.visitedSpelled = visited;
569
809
  }
570
- visited.set(source.id + ',' + target.id, status);
810
+ visited.set(source.id + ',' + target.id + ',' + mode, status);
811
+ }
812
+ else if (this.firstVisitKey < 0) {
813
+ this.firstVisitKey = key;
814
+ this.firstVisitMode = mode;
815
+ this.firstVisitStatus = status;
816
+ }
817
+ else {
818
+ let modes = this.visited;
819
+ if (modes === undefined) {
820
+ modes = new Map();
821
+ this.visited = modes;
822
+ }
823
+ let pairs = this.visitedPairsOf(mode);
824
+ if (pairs === undefined) {
825
+ pairs = new Map();
826
+ modes.set(mode, pairs);
827
+ this.visitedMode = mode;
828
+ this.visitedPairs = pairs;
829
+ }
830
+ pairs.set(key, status);
571
831
  }
572
832
  }
833
+ // Source and target are instantiations of the same type alias: infers between the type arguments, with defaults
834
+ // applied.
835
+ inferFromAliasTypeArguments(source, target) {
836
+ const c = this.c;
837
+ const sourceAlias = source.alias;
838
+ const params = c.symbolLinks(sourceAlias.symbol).typeParameters ?? [];
839
+ const minParams = getMinTypeArgumentCount(c, params);
840
+ const isJavaScript = isInJSFile(sourceAlias.symbol.valueDeclaration);
841
+ const sourceTypes = fillMissingTypeArguments(c, sourceAlias.typeArguments, params, minParams, isJavaScript);
842
+ const targetTypes = fillMissingTypeArguments(c, target.alias.typeArguments, params, minParams, isJavaScript);
843
+ this.inferFromTypeArguments(sourceTypes, targetTypes, someTypeCouldHoldInference(c, targetTypes) ? getAliasVariances(c, sourceAlias.symbol) : noVariances);
844
+ }
845
+ /** `visited`'s map of the pairs finished in `mode`, if there is one. */
846
+ visitedPairsOf(mode) {
847
+ if (mode === this.visitedMode)
848
+ return this.visitedPairs;
849
+ const pairs = this.visited?.get(mode);
850
+ if (pairs !== undefined) {
851
+ this.visitedMode = mode;
852
+ this.visitedPairs = pairs;
853
+ }
854
+ return pairs;
855
+ }
573
856
  inferFromMatchingTypes(sources, targets, kind) {
574
857
  const c = this.c;
575
858
  const matchedSources = [];
@@ -577,12 +860,24 @@ class InferenceState {
577
860
  for (const t of targets)
578
861
  for (const s of sources)
579
862
  if (typesMatch(c, s, t, kind)) {
580
- this.inferFromTypes(s, t);
863
+ if (kind !== 1 /* MatchKind.CloselyMatched */)
864
+ this.inferFromTypes(s, t);
581
865
  if (!matchedSources.includes(s))
582
866
  matchedSources.push(s);
583
867
  if (!matchedTargets.includes(t))
584
868
  matchedTargets.push(t);
585
869
  }
870
+ if (kind === 1 /* MatchKind.CloselyMatched */) {
871
+ // Infer to closely matched targets in decreasing depth of generic instantiations: an inference
872
+ // from a more deeply nested type argument has had more layers of instantiation stripped away. For
873
+ // example, from `string[] | string[][]` to `T[] | T[][]`, relating `string[][]` to `T[][]` infers
874
+ // `string`, a better inference than the `string[]` that relating `string[][]` to `T[]` infers.
875
+ matchedTargets.sort((t1, t2) => compareTypesAndDepth(c, t1, t2));
876
+ for (const t of matchedTargets)
877
+ for (const s of matchedSources)
878
+ if (typesMatch(c, s, t, kind))
879
+ this.inferFromTypes(s, t);
880
+ }
586
881
  return new MatchedTypes(matchedSources.length !== 0 ? sources.filter((t) => !matchedSources.includes(t)) : sources, matchedTargets.length !== 0 ? targets.filter((t) => !matchedTargets.includes(t)) : targets);
587
882
  }
588
883
  inferToMultipleTypes(source, targets, targetFlags) {
@@ -669,10 +964,11 @@ class InferenceState {
669
964
  const c = this.c;
670
965
  if ((source.flags & 67108864 /* TypeFlags.Conditional */) !== 0) {
671
966
  const s = source;
672
- this.inferFromTypes(s.checkType, target.checkType);
673
- this.inferFromTypes(s.extendsType, target.extendsType);
674
- this.inferFromTypes(getTrueTypeFromConditionalType(c, s), getTrueTypeFromConditionalType(c, target));
675
- this.inferFromTypes(getFalseTypeFromConditionalType(c, s), getFalseTypeFromConditionalType(c, target));
967
+ // A source's distributed type parameters infer as the type parameters they were made from.
968
+ this.inferFromTypes(getNonDistributedTypeParameter(s.checkType), target.checkType);
969
+ this.inferFromTypes(getNonDistributedTypeParameter(s.extendsType), target.extendsType);
970
+ this.inferFromTypes(getNonDistributedTypeParameter(getTrueTypeFromConditionalType(c, s)), getTrueTypeFromConditionalType(c, target));
971
+ this.inferFromTypes(getNonDistributedTypeParameter(getFalseTypeFromConditionalType(c, s)), getFalseTypeFromConditionalType(c, target));
676
972
  }
677
973
  else {
678
974
  const savePriority = this.priority;
@@ -882,9 +1178,9 @@ class InferenceState {
882
1178
  // Once in a bivariant signature, nested inferences stay bivariant.
883
1179
  this.bivariant =
884
1180
  this.bivariant ||
885
- kind === 175 /* SyntaxKind.MethodDeclaration */ ||
886
- kind === 174 /* SyntaxKind.MethodSignature */ ||
887
- kind === 177 /* SyntaxKind.Constructor */;
1181
+ kind === 176 /* SyntaxKind.MethodDeclaration */ ||
1182
+ kind === 175 /* SyntaxKind.MethodSignature */ ||
1183
+ kind === 178 /* SyntaxKind.Constructor */;
888
1184
  applyToParameterTypes(c, source, target, (s, t) => this.inferFromContravariantTypesIfStrictFunctionTypes(s, t));
889
1185
  this.bivariant = saveBivariant;
890
1186
  }
@@ -959,12 +1255,47 @@ class InferenceState {
959
1255
  }
960
1256
  // ---- Helpers
961
1257
  function getInferenceInfoForType(inferences, t) {
962
- if ((t.flags & 34078720 /* TypeFlags.TypeVariable */) !== 0)
1258
+ if ((t.flags & 34078720 /* TypeFlags.TypeVariable */) !== 0) {
1259
+ const typeVariable = getNonDistributedTypeParameter(t);
963
1260
  for (const inference of inferences)
964
- if (t === inference.typeParameter)
1261
+ if (typeVariable === inference.typeParameter)
965
1262
  return inference;
1263
+ }
966
1264
  return undefined;
967
1265
  }
1266
+ /** Orders types by decreasing depth, then by the regular type ordering. */
1267
+ function compareTypesAndDepth(c, t1, t2) {
1268
+ const d1 = getTypeDepth(c, t1, 3);
1269
+ const d2 = getTypeDepth(c, t2, 3);
1270
+ if (d1 !== d2)
1271
+ return d2 - d1;
1272
+ return compareTypes(c, t1, t2);
1273
+ }
1274
+ /**
1275
+ * The depth of a type, up to `maxDepth`: one plus the largest type argument depth for generic aliased
1276
+ * types and type references, the largest constituent depth for unions and intersections, and zero
1277
+ * otherwise. The maximum keeps circular types from recursing forever.
1278
+ */
1279
+ function getTypeDepth(c, t, maxDepth) {
1280
+ if (maxDepth !== 0) {
1281
+ if (t.alias !== undefined && t.alias.typeArguments.length !== 0)
1282
+ return getTypeListDepth(c, t.alias.typeArguments, maxDepth - 1) + 1;
1283
+ if ((t.objectFlags & 4 /* ObjectFlags.Reference */) !== 0) {
1284
+ const typeArguments = getTypeArguments(c, t);
1285
+ if (typeArguments.length !== 0)
1286
+ return getTypeListDepth(c, typeArguments, maxDepth - 1) + 1;
1287
+ }
1288
+ if ((t.flags & 402653184 /* TypeFlags.UnionOrIntersection */) !== 0)
1289
+ return getTypeListDepth(c, typesOf(t), maxDepth);
1290
+ }
1291
+ return 0;
1292
+ }
1293
+ function getTypeListDepth(c, types, maxDepth) {
1294
+ let depth = 0;
1295
+ for (const t of types)
1296
+ depth = Math.max(depth, getTypeDepth(c, t, maxDepth));
1297
+ return depth;
1298
+ }
968
1299
  function distributedTypes(t) {
969
1300
  return (t.flags & 134217728 /* TypeFlags.Union */) !== 0 ? typesOf(t) : [t];
970
1301
  }
@@ -984,9 +1315,10 @@ function someTypeCouldHoldInference(c, targets) {
984
1315
  }
985
1316
  /**
986
1317
  * `couldContainTypeVariables` without two of its conservative answers: a deferred reference without an
987
- * alias, once its type arguments are resolved, holds type variables only through them, like any other
988
- * reference; and the static side of a class declared at the top level of a file or module holds none
989
- * outside its generic signatures, which inference erases.
1318
+ * alias holds type variables only through its type arguments, like any other reference; and the static
1319
+ * side of a class declared at the top level of a file or module holds none outside its generic
1320
+ * signatures, which inference erases. A deferred reference's type arguments are resolved here unless
1321
+ * they are being resolved already, where resolving them would report a circularity.
990
1322
  */
991
1323
  function couldHoldInference(c, t, depth) {
992
1324
  if (!couldContainTypeVariables(c, t))
@@ -994,7 +1326,11 @@ function couldHoldInference(c, t, depth) {
994
1326
  if (t.alias !== undefined || depth === 4)
995
1327
  return true;
996
1328
  if ((t.objectFlags & 4 /* ObjectFlags.Reference */) !== 0) {
997
- const resolved = t.resolvedTypeArguments ?? sideOf(c, t).resolvedTypeArguments;
1329
+ const resolved = t.resolvedTypeArguments ??
1330
+ sideOf(c, t).resolvedTypeArguments ??
1331
+ (findResolutionCycleStartIndex(c, t, 5 /* TypeSystemPropertyName.ResolvedTypeArguments */) < 0
1332
+ ? getTypeArguments(c, t)
1333
+ : undefined);
998
1334
  if (resolved === undefined)
999
1335
  return true;
1000
1336
  for (const a of resolved)
@@ -1015,12 +1351,12 @@ function isTopLevelClassStaticSide(t) {
1015
1351
  declarationCount(symbol) === 0)
1016
1352
  return false;
1017
1353
  for (const d of getDeclarations(symbol)) {
1018
- if (d.kind !== 264 /* SyntaxKind.ClassDeclaration */ &&
1019
- d.kind !== 265 /* SyntaxKind.InterfaceDeclaration */ &&
1020
- d.kind !== 268 /* SyntaxKind.ModuleDeclaration */)
1354
+ if (d.kind !== 265 /* SyntaxKind.ClassDeclaration */ &&
1355
+ d.kind !== 266 /* SyntaxKind.InterfaceDeclaration */ &&
1356
+ d.kind !== 269 /* SyntaxKind.ModuleDeclaration */)
1021
1357
  return false;
1022
- for (let n = d.parent; n.kind !== 307 /* SyntaxKind.SourceFile */; n = n.parent)
1023
- if (n.kind !== 269 /* SyntaxKind.ModuleBlock */ && n.kind !== 268 /* SyntaxKind.ModuleDeclaration */)
1358
+ for (let n = d.parent; n.kind !== 308 /* SyntaxKind.SourceFile */; n = n.parent)
1359
+ if (n.kind !== 270 /* SyntaxKind.ModuleBlock */ && n.kind !== 269 /* SyntaxKind.ModuleDeclaration */)
1024
1360
  return false;
1025
1361
  }
1026
1362
  return true;
@@ -1124,6 +1460,8 @@ function hasUnmatchedProperty(c, source, target, matchDiscriminantProperties) {
1124
1460
  if ((t.flags & 402653184 /* TypeFlags.UnionOrIntersection */) === 0 ||
1125
1461
  sideOf(c, t).membersOf?.resolvedProperties !== undefined)
1126
1462
  return getUnmatchedProperty(c, source, target, false, matchDiscriminantProperties) !== undefined;
1463
+ if (c.unresolvedPropertySearches !== undefined)
1464
+ c.unresolvedPropertySearches.push(t);
1127
1465
  const containingType = t;
1128
1466
  const isUnion = (t.flags & 134217728 /* TypeFlags.Union */) !== 0;
1129
1467
  const checked = new Set();
@@ -1199,7 +1537,8 @@ export function isConstTypeVariable(c, t, depth) {
1199
1537
  }
1200
1538
  export function isMutableArrayLikeType(c, t) {
1201
1539
  return (isMutableArrayOrTuple(c, t) ||
1202
- ((t.flags & (1 /* TypeFlags.Any */ | 12 /* TypeFlags.Nullable */)) === 0 && isTypeAssignableTo(c, t, c.anyArrayType)));
1540
+ ((t.flags & (1 /* TypeFlags.Any */ | 12 /* TypeFlags.Nullable */ | 262144 /* TypeFlags.Never */)) === 0 &&
1541
+ isTypeAssignableTo(c, t, c.anyArrayType)));
1203
1542
  }
1204
1543
  function typePredicateKindsMatch(a, b) {
1205
1544
  return a.kind === b.kind && a.parameterIndex === b.parameterIndex;
@@ -1322,7 +1661,11 @@ export function isUnmatchedTemplateLiteralKey(source, target) {
1322
1661
  return failsTemplateLiteralTextTest(source, target);
1323
1662
  }
1324
1663
  /** The types matched by `target`'s placeholders in `source`, or undefined if it doesn't match. */
1325
- export function inferTypesFromTemplateLiteralType(c, source, target) {
1664
+ /**
1665
+ * The types that `source` gives the placeholders of `target`. A placeholder of a source template with the same
1666
+ * texts keeps its type where `compareTypes` (assignability by default) relates their base constraints.
1667
+ */
1668
+ export function inferTypesFromTemplateLiteralType(c, source, target, compareTypes) {
1326
1669
  if ((source.flags & 1024 /* TypeFlags.StringLiteral */) !== 0) {
1327
1670
  // Most string literals fail the start and end text test; apply it before building the
1328
1671
  // one-element source texts.
@@ -1336,9 +1679,12 @@ export function inferTypesFromTemplateLiteralType(c, source, target) {
1336
1679
  const result = [];
1337
1680
  for (let i = 0; i < s.types.length; i++) {
1338
1681
  const t = s.types[i];
1339
- result.push(isTypeAssignableTo(c, getBaseConstraintOrType(c, t), getBaseConstraintOrType(c, target.types[i]))
1340
- ? t
1341
- : getStringLikeTypeForType(c, t));
1682
+ const sourceConstraint = getBaseConstraintOrType(c, t);
1683
+ const targetConstraint = getBaseConstraintOrType(c, target.types[i]);
1684
+ const related = compareTypes !== undefined
1685
+ ? compareTypes(sourceConstraint, targetConstraint)
1686
+ : isTypeAssignableTo(c, sourceConstraint, targetConstraint);
1687
+ result.push(related ? t : getStringLikeTypeForType(c, t));
1342
1688
  }
1343
1689
  return result;
1344
1690
  }
@@ -1635,7 +1981,7 @@ export function resolveReverseMappedTypeMembers(c, t) {
1635
1981
  if (!isTypeAssignableTo(c, propertyNameType, limitedConstraint))
1636
1982
  continue;
1637
1983
  }
1638
- const checkFlags = 8192 /* CheckFlags.ReverseMapped */ | (readonlyMask && isReadonlySymbol(c, prop) ? 8 /* CheckFlags.Readonly */ : 0);
1984
+ const checkFlags = 65536 /* CheckFlags.ReverseMapped */ | (readonlyMask && isReadonlySymbol(c, prop) ? 8 /* CheckFlags.Readonly */ : 0);
1639
1985
  const inferredProp = c.newSymbolWithCheckFlags(4 /* SymbolFlags.Property */ | (prop.flags & optionalMask), prop.name, checkFlags);
1640
1986
  copyDeclarations(inferredProp, prop);
1641
1987
  const links = c.symbolLinks(inferredProp);
@@ -1755,7 +2101,10 @@ export function getInferredType(c, context, index) {
1755
2101
  const constraint = getConstraintOfTypeParameter(c, inference.typeParameter);
1756
2102
  if (constraint !== undefined) {
1757
2103
  const instantiatedConstraint = instantiateType(c, constraint, context.nonFixingMapper);
1758
- if (inferredType !== undefined) {
2104
+ // A pure return type inference is still filtered in a recursive call resolution: its result can become
2105
+ // the type of the enclosing declaration.
2106
+ if (inferredType !== undefined &&
2107
+ ((context.flags & 8 /* InferenceFlags.NoConstraintChecks */) === 0 || inference.priority === 128 /* InferencePriority.ReturnType */)) {
1759
2108
  const constraintWithThis = getTypeWithThisArgument(c, instantiatedConstraint, inferredType, false);
1760
2109
  if (context.compareTypes.compare(inferredType, constraintWithThis, false) === 0 /* Ternary.False */) {
1761
2110
  // A pure return type inference may still succeed without the constituents the constraint rejects.
@@ -1784,8 +2133,18 @@ function clearActiveMapperCaches(c) {
1784
2133
  if (cache !== undefined)
1785
2134
  cache.clear();
1786
2135
  }
2136
+ function setNumberEntry(stack, depth, value) {
2137
+ if (depth < stack.length)
2138
+ stack[depth] = value;
2139
+ else
2140
+ stack.push(value);
2141
+ }
1787
2142
  /** Type ids below this bound pack in pairs into one exact number. */
1788
2143
  const VisitKeyIdLimit = 1 << 26;
2144
+ /** The priority and variance of an inference walk, packed. */
2145
+ function visitMode(priority, contravariant, bivariant) {
2146
+ return priority * 4 + (contravariant ? 2 : 0) + (bivariant ? 1 : 0);
2147
+ }
1789
2148
  /** invokeOnce's key for a pair of types: both ids in one number, or -1 when an id is too large. */
1790
2149
  function visitKey(source, target) {
1791
2150
  const s = source.id;
@@ -1992,11 +2351,32 @@ export class InferenceCaches {
1992
2351
  contextFreeTypes = new Map();
1993
2352
  reverseMapped = new Map();
1994
2353
  reverseHomomorphicMapped = new Map();
2354
+ /**
2355
+ * invokeOnce's recursion stacks, shared by the checker's inference walks, with the mode of each visit and the
2356
+ * recursion identities isDeeplyNestedStackEntry keeps for each entry. The first `invokeStackDepth` entries are live.
2357
+ * A walk's entries start where the live entries end when it starts (`InferenceState.stackBase`), so a walk started
2358
+ * during another one keeps the other's entries.
2359
+ */
2360
+ invokeSourceStack = [];
2361
+ invokeTargetStack = [];
2362
+ invokeModeStack = [];
2363
+ invokeSourceIdentities = [];
2364
+ invokeTargetIdentities = [];
2365
+ invokeStackDepth = 0;
1995
2366
  /** inferReverseMappedType's recursion stacks; the first `reverseStackDepth` entries of each are live. */
1996
2367
  reverseSourceStack = [];
1997
2368
  reverseTargetStack = [];
1998
2369
  reverseStackDepth = 0;
1999
2370
  reverseExpandingFlags = 0 /* ExpandingFlags.None */;
2371
+ /**
2372
+ * What `inferTypesFromUnstarted` left in each inference, by signature id, then by source type id
2373
+ * times 4096 plus the priority.
2374
+ */
2375
+ unstartedInferences = new Map();
2376
+ /** The `unstartedInferences` entry of a walk seen once. */
2377
+ seenOnce = new UnstartedInference(0 /* UnstartedInferenceState.Seen */, [], 0, 0, 0, []);
2378
+ /** The `unstartedInferences` entry of a walk that is never skipped. */
2379
+ alwaysWalked = new UnstartedInference(3 /* UnstartedInferenceState.Unusable */, [], 0, 0, 0, []);
2000
2380
  }
2001
2381
  // ---- Constraints of `infer` type parameters
2002
2382
  /**
@@ -2038,18 +2418,18 @@ export function getInferredTypeParameterConstraint(c, t, omitTypeReferences = fa
2038
2418
  const symbol = t.symbol;
2039
2419
  if (symbol !== undefined)
2040
2420
  for (const declaration of getDeclarations(symbol)) {
2041
- if (declaration.parent === undefined || declaration.parent.kind !== 196 /* SyntaxKind.InferType */)
2421
+ if (declaration.parent === undefined || declaration.parent.kind !== 197 /* SyntaxKind.InferType */)
2042
2422
  continue;
2043
2423
  let child = declaration.parent;
2044
2424
  let parent = child.parent;
2045
- while (parent !== undefined && parent.kind === 197 /* SyntaxKind.ParenthesizedType */) {
2425
+ while (parent !== undefined && parent.kind === 198 /* SyntaxKind.ParenthesizedType */) {
2046
2426
  child = parent;
2047
2427
  parent = child.parent;
2048
2428
  }
2049
2429
  if (parent === undefined)
2050
2430
  continue;
2051
2431
  switch (parent.kind) {
2052
- case 184 /* SyntaxKind.TypeReference */: {
2432
+ case 185 /* SyntaxKind.TypeReference */: {
2053
2433
  if (omitTypeReferences)
2054
2434
  break;
2055
2435
  // `Foo<infer T>` takes the constraint of Foo's corresponding type parameter.
@@ -2069,34 +2449,34 @@ export function getInferredTypeParameterConstraint(c, t, omitTypeReferences = fa
2069
2449
  inferences.push(constraint);
2070
2450
  break;
2071
2451
  }
2072
- case 170 /* SyntaxKind.Parameter */:
2452
+ case 171 /* SyntaxKind.Parameter */:
2073
2453
  if (parent.dotDotDotToken !== undefined)
2074
2454
  inferences.push(createArrayType(c, c.unknownType));
2075
2455
  break;
2076
- case 192 /* SyntaxKind.RestType */:
2456
+ case 193 /* SyntaxKind.RestType */:
2077
2457
  inferences.push(createArrayType(c, c.unknownType));
2078
2458
  break;
2079
- case 203 /* SyntaxKind.NamedTupleMember */:
2459
+ case 204 /* SyntaxKind.NamedTupleMember */:
2080
2460
  if (parent.dotDotDotToken !== undefined)
2081
2461
  inferences.push(createArrayType(c, c.unknownType));
2082
2462
  break;
2083
- case 205 /* SyntaxKind.TemplateLiteralTypeSpan */:
2463
+ case 206 /* SyntaxKind.TemplateLiteralTypeSpan */:
2084
2464
  inferences.push(c.stringType);
2085
2465
  break;
2086
- case 169 /* SyntaxKind.TypeParameter */:
2087
- if (parent.parent !== undefined && parent.parent.kind === 201 /* SyntaxKind.MappedType */)
2466
+ case 170 /* SyntaxKind.TypeParameter */:
2467
+ if (parent.parent !== undefined && parent.parent.kind === 202 /* SyntaxKind.MappedType */)
2088
2468
  inferences.push(c.stringNumberSymbolType);
2089
2469
  break;
2090
- case 201 /* SyntaxKind.MappedType */: {
2470
+ case 202 /* SyntaxKind.MappedType */: {
2091
2471
  // `{ [P in K]: X } extends { [Q in L]: infer U }` constrains U to X with P replaced by K.
2092
2472
  const mapped = parent;
2093
2473
  const conditional = parent.parent;
2094
2474
  if (mapped.type !== undefined &&
2095
2475
  mapped.type === declaration.parent &&
2096
2476
  conditional !== undefined &&
2097
- conditional.kind === 195 /* SyntaxKind.ConditionalType */ &&
2477
+ conditional.kind === 196 /* SyntaxKind.ConditionalType */ &&
2098
2478
  conditional.extendsType === parent &&
2099
- conditional.checkType.kind === 201 /* SyntaxKind.MappedType */ &&
2479
+ conditional.checkType.kind === 202 /* SyntaxKind.MappedType */ &&
2100
2480
  conditional.checkType.type !== undefined) {
2101
2481
  const checkMappedType = conditional.checkType;
2102
2482
  const nodeType = getTypeFromTypeNode(c, checkMappedType.type);