tsc-ts 0.0.3 → 0.0.5

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 (596) hide show
  1. package/README.md +46 -0
  2. package/dist/api/compiler/ast-utilities.d.ts +82 -0
  3. package/dist/api/compiler/ast-utilities.js +462 -0
  4. package/dist/api/compiler/ast.d.ts +2350 -0
  5. package/dist/api/compiler/ast.js +11206 -0
  6. package/dist/api/compiler/astnav.d.ts +37 -0
  7. package/dist/api/compiler/astnav.js +767 -0
  8. package/dist/api/compiler/binder-utilities.d.ts +182 -0
  9. package/dist/api/compiler/binder-utilities.js +1240 -0
  10. package/dist/api/compiler/binder.d.ts +33 -0
  11. package/dist/api/compiler/binder.js +2358 -0
  12. package/dist/api/compiler/character-codes.d.ts +161 -0
  13. package/dist/api/compiler/character-codes.js +160 -0
  14. package/dist/api/compiler/checker-calls.d.ts +46 -0
  15. package/dist/api/compiler/checker-calls.js +1640 -0
  16. package/dist/api/compiler/checker-classes.d.ts +30 -0
  17. package/dist/api/compiler/checker-classes.js +582 -0
  18. package/dist/api/compiler/checker-contextual.d.ts +77 -0
  19. package/dist/api/compiler/checker-contextual.js +1136 -0
  20. package/dist/api/compiler/checker-declaration-order.d.ts +12 -0
  21. package/dist/api/compiler/checker-declaration-order.js +356 -0
  22. package/dist/api/compiler/checker-declarations.d.ts +33 -0
  23. package/dist/api/compiler/checker-declarations.js +888 -0
  24. package/dist/api/compiler/checker-declared-types.d.ts +48 -0
  25. package/dist/api/compiler/checker-declared-types.js +787 -0
  26. package/dist/api/compiler/checker-decorators.d.ts +26 -0
  27. package/dist/api/compiler/checker-decorators.js +562 -0
  28. package/dist/api/compiler/checker-deprecation.d.ts +33 -0
  29. package/dist/api/compiler/checker-deprecation.js +315 -0
  30. package/dist/api/compiler/checker-destructuring.d.ts +34 -0
  31. package/dist/api/compiler/checker-destructuring.js +584 -0
  32. package/dist/api/compiler/checker-elaboration.d.ts +15 -0
  33. package/dist/api/compiler/checker-elaboration.js +290 -0
  34. package/dist/api/compiler/checker-emit-helpers.d.ts +58 -0
  35. package/dist/api/compiler/checker-emit-helpers.js +154 -0
  36. package/dist/api/compiler/checker-emit-resolver.d.ts +75 -0
  37. package/dist/api/compiler/checker-emit-resolver.js +579 -0
  38. package/dist/api/compiler/checker-evaluator.d.ts +27 -0
  39. package/dist/api/compiler/checker-evaluator.js +188 -0
  40. package/dist/api/compiler/checker-expressions.d.ts +67 -0
  41. package/dist/api/compiler/checker-expressions.js +1351 -0
  42. package/dist/api/compiler/checker-features.d.ts +6 -0
  43. package/dist/api/compiler/checker-features.js +354 -0
  44. package/dist/api/compiler/checker-flow.d.ts +86 -0
  45. package/dist/api/compiler/checker-flow.js +169 -0
  46. package/dist/api/compiler/checker-functions.d.ts +43 -0
  47. package/dist/api/compiler/checker-functions.js +1002 -0
  48. package/dist/api/compiler/checker-generated-code.d.ts +25 -0
  49. package/dist/api/compiler/checker-generated-code.js +168 -0
  50. package/dist/api/compiler/checker-globals.d.ts +14 -0
  51. package/dist/api/compiler/checker-globals.js +37 -0
  52. package/dist/api/compiler/checker-grammar.d.ts +35 -0
  53. package/dist/api/compiler/checker-grammar.js +2573 -0
  54. package/dist/api/compiler/checker-heritage.d.ts +28 -0
  55. package/dist/api/compiler/checker-heritage.js +900 -0
  56. package/dist/api/compiler/checker-inference.d.ts +179 -0
  57. package/dist/api/compiler/checker-inference.js +2105 -0
  58. package/dist/api/compiler/checker-iteration.d.ts +115 -0
  59. package/dist/api/compiler/checker-iteration.js +857 -0
  60. package/dist/api/compiler/checker-javascript.d.ts +42 -0
  61. package/dist/api/compiler/checker-javascript.js +441 -0
  62. package/dist/api/compiler/checker-jsdoc.d.ts +30 -0
  63. package/dist/api/compiler/checker-jsdoc.js +320 -0
  64. package/dist/api/compiler/checker-jsx.d.ts +94 -0
  65. package/dist/api/compiler/checker-jsx.js +1433 -0
  66. package/dist/api/compiler/checker-literals.d.ts +6 -0
  67. package/dist/api/compiler/checker-literals.js +43 -0
  68. package/dist/api/compiler/checker-members.d.ts +198 -0
  69. package/dist/api/compiler/checker-members.js +2126 -0
  70. package/dist/api/compiler/checker-modules.d.ts +85 -0
  71. package/dist/api/compiler/checker-modules.js +2141 -0
  72. package/dist/api/compiler/checker-narrowing.d.ts +120 -0
  73. package/dist/api/compiler/checker-narrowing.js +2797 -0
  74. package/dist/api/compiler/checker-object-literals.d.ts +14 -0
  75. package/dist/api/compiler/checker-object-literals.js +479 -0
  76. package/dist/api/compiler/checker-operators.d.ts +33 -0
  77. package/dist/api/compiler/checker-operators.js +1040 -0
  78. package/dist/api/compiler/checker-overloads.d.ts +7 -0
  79. package/dist/api/compiler/checker-overloads.js +270 -0
  80. package/dist/api/compiler/checker-property-access.d.ts +34 -0
  81. package/dist/api/compiler/checker-property-access.js +672 -0
  82. package/dist/api/compiler/checker-services.d.ts +49 -0
  83. package/dist/api/compiler/checker-services.js +995 -0
  84. package/dist/api/compiler/checker-signatures.d.ts +55 -0
  85. package/dist/api/compiler/checker-signatures.js +788 -0
  86. package/dist/api/compiler/checker-source-file.d.ts +27 -0
  87. package/dist/api/compiler/checker-source-file.js +619 -0
  88. package/dist/api/compiler/checker-statements.d.ts +18 -0
  89. package/dist/api/compiler/checker-statements.js +226 -0
  90. package/dist/api/compiler/checker-super.d.ts +13 -0
  91. package/dist/api/compiler/checker-super.js +241 -0
  92. package/dist/api/compiler/checker-symbol-types.d.ts +67 -0
  93. package/dist/api/compiler/checker-symbol-types.js +1885 -0
  94. package/dist/api/compiler/checker-symbols.d.ts +181 -0
  95. package/dist/api/compiler/checker-symbols.js +1782 -0
  96. package/dist/api/compiler/checker-type-factory.d.ts +142 -0
  97. package/dist/api/compiler/checker-type-factory.js +2501 -0
  98. package/dist/api/compiler/checker-type-nodes.d.ts +26 -0
  99. package/dist/api/compiler/checker-type-nodes.js +828 -0
  100. package/dist/api/compiler/checker-type-operators.d.ts +109 -0
  101. package/dist/api/compiler/checker-type-operators.js +1842 -0
  102. package/dist/api/compiler/checker-types.d.ts +1027 -0
  103. package/dist/api/compiler/checker-types.js +1697 -0
  104. package/dist/api/compiler/checker-unused.d.ts +19 -0
  105. package/dist/api/compiler/checker-unused.js +524 -0
  106. package/dist/api/compiler/checker-utilities.d.ts +33 -0
  107. package/dist/api/compiler/checker-utilities.js +141 -0
  108. package/dist/api/compiler/checker.d.ts +491 -0
  109. package/dist/api/compiler/checker.js +912 -0
  110. package/dist/api/compiler/command-line.d.ts +32 -0
  111. package/dist/api/compiler/command-line.js +383 -0
  112. package/dist/api/compiler/compile-program.d.ts +118 -0
  113. package/dist/api/compiler/compile-program.js +384 -0
  114. package/dist/api/compiler/diagnostic-locales.d.ts +22 -0
  115. package/dist/api/compiler/diagnostic-locales.js +64 -0
  116. package/dist/api/compiler/diagnostic-messages.d.ts +2166 -0
  117. package/dist/api/compiler/diagnostic-messages.js +184 -0
  118. package/dist/api/compiler/diagnostics.d.ts +167 -0
  119. package/dist/api/compiler/diagnostics.js +820 -0
  120. package/dist/api/compiler/emitter.d.ts +71 -0
  121. package/dist/api/compiler/emitter.js +327 -0
  122. package/dist/api/compiler/file-include.d.ts +117 -0
  123. package/dist/api/compiler/file-include.js +536 -0
  124. package/dist/api/compiler/file-loader.d.ts +261 -0
  125. package/dist/api/compiler/file-loader.js +1257 -0
  126. package/dist/api/compiler/file-system.d.ts +51 -0
  127. package/dist/api/compiler/file-system.js +132 -0
  128. package/dist/api/compiler/flow.d.ts +60 -0
  129. package/dist/api/compiler/flow.js +45 -0
  130. package/dist/api/compiler/instantiation.d.ts +74 -0
  131. package/dist/api/compiler/instantiation.js +799 -0
  132. package/dist/api/compiler/jsdoc.d.ts +75 -0
  133. package/dist/api/compiler/jsdoc.js +1229 -0
  134. package/dist/api/compiler/link-tables.d.ts +36 -0
  135. package/dist/api/compiler/link-tables.js +83 -0
  136. package/dist/api/compiler/locale-data.d.ts +24 -0
  137. package/dist/api/compiler/locale-data.js +183 -0
  138. package/dist/api/compiler/locale.d.ts +4 -0
  139. package/dist/api/compiler/locale.js +317 -0
  140. package/dist/api/compiler/locales/cs-CZ.d.ts +2 -0
  141. package/dist/api/compiler/locales/cs-CZ.js +3 -0
  142. package/dist/api/compiler/locales/de-DE.d.ts +2 -0
  143. package/dist/api/compiler/locales/de-DE.js +3 -0
  144. package/dist/api/compiler/locales/es-ES.d.ts +2 -0
  145. package/dist/api/compiler/locales/es-ES.js +3 -0
  146. package/dist/api/compiler/locales/fr-FR.d.ts +2 -0
  147. package/dist/api/compiler/locales/fr-FR.js +3 -0
  148. package/dist/api/compiler/locales/it-IT.d.ts +2 -0
  149. package/dist/api/compiler/locales/it-IT.js +3 -0
  150. package/dist/api/compiler/locales/ja-JP.d.ts +2 -0
  151. package/dist/api/compiler/locales/ja-JP.js +3 -0
  152. package/dist/api/compiler/locales/ko-KR.d.ts +2 -0
  153. package/dist/api/compiler/locales/ko-KR.js +3 -0
  154. package/dist/api/compiler/locales/pl-PL.d.ts +2 -0
  155. package/dist/api/compiler/locales/pl-PL.js +3 -0
  156. package/dist/api/compiler/locales/pt-BR.d.ts +2 -0
  157. package/dist/api/compiler/locales/pt-BR.js +3 -0
  158. package/dist/api/compiler/locales/ru-RU.d.ts +2 -0
  159. package/dist/api/compiler/locales/ru-RU.js +3 -0
  160. package/dist/api/compiler/locales/tr-TR.d.ts +2 -0
  161. package/dist/api/compiler/locales/tr-TR.js +3 -0
  162. package/dist/api/compiler/locales/zh-CN.d.ts +2 -0
  163. package/dist/api/compiler/locales/zh-CN.js +3 -0
  164. package/dist/api/compiler/locales/zh-TW.d.ts +2 -0
  165. package/dist/api/compiler/locales/zh-TW.js +3 -0
  166. package/dist/api/compiler/module-resolution-types.d.ts +83 -0
  167. package/dist/api/compiler/module-resolution-types.js +176 -0
  168. package/dist/api/compiler/module-resolution.d.ts +71 -0
  169. package/dist/api/compiler/module-resolution.js +1598 -0
  170. package/dist/api/compiler/module-specifiers.d.ts +64 -0
  171. package/dist/api/compiler/module-specifiers.js +1101 -0
  172. package/dist/api/compiler/name-resolver.d.ts +43 -0
  173. package/dist/api/compiler/name-resolver.js +509 -0
  174. package/dist/api/compiler/node-builder-names.d.ts +32 -0
  175. package/dist/api/compiler/node-builder-names.js +854 -0
  176. package/dist/api/compiler/node-builder-pseudo.d.ts +36 -0
  177. package/dist/api/compiler/node-builder-pseudo.js +744 -0
  178. package/dist/api/compiler/node-builder-reuse.d.ts +4 -0
  179. package/dist/api/compiler/node-builder-reuse.js +647 -0
  180. package/dist/api/compiler/node-builder.d.ts +270 -0
  181. package/dist/api/compiler/node-builder.js +2645 -0
  182. package/dist/api/compiler/option-declarations.d.ts +90 -0
  183. package/dist/api/compiler/option-declarations.js +1460 -0
  184. package/dist/api/compiler/options.d.ts +289 -0
  185. package/dist/api/compiler/options.js +1197 -0
  186. package/dist/api/compiler/output-paths.d.ts +42 -0
  187. package/dist/api/compiler/output-paths.js +195 -0
  188. package/dist/api/compiler/package-json.d.ts +175 -0
  189. package/dist/api/compiler/package-json.js +1015 -0
  190. package/dist/api/compiler/parallel-parse.d.ts +219 -0
  191. package/dist/api/compiler/parallel-parse.js +537 -0
  192. package/dist/api/compiler/parser.d.ts +587 -0
  193. package/dist/api/compiler/parser.js +6407 -0
  194. package/dist/api/compiler/path.d.ts +91 -0
  195. package/dist/api/compiler/path.js +705 -0
  196. package/dist/api/compiler/printer/async-helpers.d.ts +22 -0
  197. package/dist/api/compiler/printer/async-helpers.js +91 -0
  198. package/dist/api/compiler/printer/auto-generate.d.ts +13 -0
  199. package/dist/api/compiler/printer/auto-generate.js +20 -0
  200. package/dist/api/compiler/printer/decorator-helpers.d.ts +24 -0
  201. package/dist/api/compiler/printer/decorator-helpers.js +118 -0
  202. package/dist/api/compiler/printer/emit-context.d.ts +154 -0
  203. package/dist/api/compiler/printer/emit-context.js +576 -0
  204. package/dist/api/compiler/printer/emit-flags.d.ts +60 -0
  205. package/dist/api/compiler/printer/emit-flags.js +2 -0
  206. package/dist/api/compiler/printer/factory-base.d.ts +171 -0
  207. package/dist/api/compiler/printer/factory-base.js +1505 -0
  208. package/dist/api/compiler/printer/factory.d.ts +147 -0
  209. package/dist/api/compiler/printer/factory.js +542 -0
  210. package/dist/api/compiler/printer/helpers.d.ts +27 -0
  211. package/dist/api/compiler/printer/helpers.js +164 -0
  212. package/dist/api/compiler/printer/name-generator.d.ts +41 -0
  213. package/dist/api/compiler/printer/name-generator.js +283 -0
  214. package/dist/api/compiler/printer/printer.d.ts +411 -0
  215. package/dist/api/compiler/printer/printer.js +4517 -0
  216. package/dist/api/compiler/printer/text-writer.d.ts +46 -0
  217. package/dist/api/compiler/printer/text-writer.js +172 -0
  218. package/dist/api/compiler/printer/utilities.d.ts +82 -0
  219. package/dist/api/compiler/printer/utilities.js +817 -0
  220. package/dist/api/compiler/program-checker.d.ts +156 -0
  221. package/dist/api/compiler/program-checker.js +526 -0
  222. package/dist/api/compiler/program-utilities.d.ts +52 -0
  223. package/dist/api/compiler/program-utilities.js +365 -0
  224. package/dist/api/compiler/program.d.ts +180 -0
  225. package/dist/api/compiler/program.js +1011 -0
  226. package/dist/api/compiler/pseudo-bigint.d.ts +5 -0
  227. package/dist/api/compiler/pseudo-bigint.js +61 -0
  228. package/dist/api/compiler/regexp-checker.d.ts +38 -0
  229. package/dist/api/compiler/regexp-checker.js +942 -0
  230. package/dist/api/compiler/relations.d.ts +263 -0
  231. package/dist/api/compiler/relations.js +4002 -0
  232. package/dist/api/compiler/reparser.d.ts +48 -0
  233. package/dist/api/compiler/reparser.js +1323 -0
  234. package/dist/api/compiler/scanner.d.ts +256 -0
  235. package/dist/api/compiler/scanner.js +2853 -0
  236. package/dist/api/compiler/side-state.d.ts +16 -0
  237. package/dist/api/compiler/side-state.js +89 -0
  238. package/dist/api/compiler/sourcemap.d.ts +55 -0
  239. package/dist/api/compiler/sourcemap.js +340 -0
  240. package/dist/api/compiler/spelling.d.ts +14 -0
  241. package/dist/api/compiler/spelling.js +128 -0
  242. package/dist/api/compiler/symbol-accessibility.d.ts +57 -0
  243. package/dist/api/compiler/symbol-accessibility.js +894 -0
  244. package/dist/api/compiler/symbol.d.ts +240 -0
  245. package/dist/api/compiler/symbol.js +228 -0
  246. package/dist/api/compiler/symlinks.d.ts +32 -0
  247. package/dist/api/compiler/symlinks.js +114 -0
  248. package/dist/api/compiler/syntax-kind.d.ts +389 -0
  249. package/dist/api/compiler/syntax-kind.js +2 -0
  250. package/dist/api/compiler/timeline.d.ts +9 -0
  251. package/dist/api/compiler/timeline.js +54 -0
  252. package/dist/api/compiler/transformers/alias-references.d.ts +39 -0
  253. package/dist/api/compiler/transformers/alias-references.js +676 -0
  254. package/dist/api/compiler/transformers/async-utilities.d.ts +51 -0
  255. package/dist/api/compiler/transformers/async-utilities.js +260 -0
  256. package/dist/api/compiler/transformers/async.d.ts +53 -0
  257. package/dist/api/compiler/transformers/async.js +645 -0
  258. package/dist/api/compiler/transformers/class-fields.d.ts +206 -0
  259. package/dist/api/compiler/transformers/class-fields.js +2418 -0
  260. package/dist/api/compiler/transformers/class-utilities.d.ts +46 -0
  261. package/dist/api/compiler/transformers/class-utilities.js +261 -0
  262. package/dist/api/compiler/transformers/commonjs-module.d.ts +103 -0
  263. package/dist/api/compiler/transformers/commonjs-module.js +1180 -0
  264. package/dist/api/compiler/transformers/const-enum-inliner.d.ts +11 -0
  265. package/dist/api/compiler/transformers/const-enum-inliner.js +36 -0
  266. package/dist/api/compiler/transformers/declarations-diagnostics.d.ts +52 -0
  267. package/dist/api/compiler/transformers/declarations-diagnostics.js +538 -0
  268. package/dist/api/compiler/transformers/declarations-pseudo.d.ts +160 -0
  269. package/dist/api/compiler/transformers/declarations-pseudo.js +797 -0
  270. package/dist/api/compiler/transformers/declarations-resolver.d.ts +152 -0
  271. package/dist/api/compiler/transformers/declarations-resolver.js +35 -0
  272. package/dist/api/compiler/transformers/declarations-syntactic.d.ts +119 -0
  273. package/dist/api/compiler/transformers/declarations-syntactic.js +1582 -0
  274. package/dist/api/compiler/transformers/declarations-tracker.d.ts +46 -0
  275. package/dist/api/compiler/transformers/declarations-tracker.js +197 -0
  276. package/dist/api/compiler/transformers/declarations.d.ts +175 -0
  277. package/dist/api/compiler/transformers/declarations.js +2380 -0
  278. package/dist/api/compiler/transformers/decorator-metadata.d.ts +54 -0
  279. package/dist/api/compiler/transformers/decorator-metadata.js +554 -0
  280. package/dist/api/compiler/transformers/decorator-utilities.d.ts +38 -0
  281. package/dist/api/compiler/transformers/decorator-utilities.js +238 -0
  282. package/dist/api/compiler/transformers/destructuring.d.ts +25 -0
  283. package/dist/api/compiler/transformers/destructuring.js +626 -0
  284. package/dist/api/compiler/transformers/downlevel.d.ts +6 -0
  285. package/dist/api/compiler/transformers/downlevel.js +45 -0
  286. package/dist/api/compiler/transformers/emit-resolver.d.ts +61 -0
  287. package/dist/api/compiler/transformers/emit-resolver.js +197 -0
  288. package/dist/api/compiler/transformers/es-decorators.d.ts +118 -0
  289. package/dist/api/compiler/transformers/es-decorators.js +1901 -0
  290. package/dist/api/compiler/transformers/exponentiation.d.ts +11 -0
  291. package/dist/api/compiler/transformers/exponentiation.js +76 -0
  292. package/dist/api/compiler/transformers/external-module-info.d.ts +35 -0
  293. package/dist/api/compiler/transformers/external-module-info.js +351 -0
  294. package/dist/api/compiler/transformers/for-await.d.ts +43 -0
  295. package/dist/api/compiler/transformers/for-await.js +469 -0
  296. package/dist/api/compiler/transformers/import-elision.d.ts +16 -0
  297. package/dist/api/compiler/transformers/import-elision.js +124 -0
  298. package/dist/api/compiler/transformers/jsx-entities.d.ts +1 -0
  299. package/dist/api/compiler/transformers/jsx-entities.js +256 -0
  300. package/dist/api/compiler/transformers/jsx.d.ts +71 -0
  301. package/dist/api/compiler/transformers/jsx.js +700 -0
  302. package/dist/api/compiler/transformers/legacy-decorators.d.ts +56 -0
  303. package/dist/api/compiler/transformers/legacy-decorators.js +564 -0
  304. package/dist/api/compiler/transformers/logical-assignment.d.ts +14 -0
  305. package/dist/api/compiler/transformers/logical-assignment.js +62 -0
  306. package/dist/api/compiler/transformers/module-utilities.d.ts +9 -0
  307. package/dist/api/compiler/transformers/module-utilities.js +36 -0
  308. package/dist/api/compiler/transformers/module.d.ts +49 -0
  309. package/dist/api/compiler/transformers/module.js +296 -0
  310. package/dist/api/compiler/transformers/named-evaluation.d.ts +26 -0
  311. package/dist/api/compiler/transformers/named-evaluation.js +266 -0
  312. package/dist/api/compiler/transformers/nullish-coalescing.d.ts +9 -0
  313. package/dist/api/compiler/transformers/nullish-coalescing.js +26 -0
  314. package/dist/api/compiler/transformers/object-rest-spread.d.ts +34 -0
  315. package/dist/api/compiler/transformers/object-rest-spread.js +411 -0
  316. package/dist/api/compiler/transformers/optional-catch.d.ts +9 -0
  317. package/dist/api/compiler/transformers/optional-catch.js +20 -0
  318. package/dist/api/compiler/transformers/optional-chain.d.ts +14 -0
  319. package/dist/api/compiler/transformers/optional-chain.js +188 -0
  320. package/dist/api/compiler/transformers/reference-resolver.d.ts +128 -0
  321. package/dist/api/compiler/transformers/reference-resolver.js +1155 -0
  322. package/dist/api/compiler/transformers/runtime-syntax.d.ts +71 -0
  323. package/dist/api/compiler/transformers/runtime-syntax.js +753 -0
  324. package/dist/api/compiler/transformers/subtree-facts.d.ts +9 -0
  325. package/dist/api/compiler/transformers/subtree-facts.js +203 -0
  326. package/dist/api/compiler/transformers/syntax-facts.d.ts +51 -0
  327. package/dist/api/compiler/transformers/syntax-facts.js +254 -0
  328. package/dist/api/compiler/transformers/tagged-template.d.ts +17 -0
  329. package/dist/api/compiler/transformers/tagged-template.js +148 -0
  330. package/dist/api/compiler/transformers/transformer.d.ts +17 -0
  331. package/dist/api/compiler/transformers/transformer.js +54 -0
  332. package/dist/api/compiler/transformers/type-eraser.d.ts +21 -0
  333. package/dist/api/compiler/transformers/type-eraser.js +346 -0
  334. package/dist/api/compiler/transformers/type-serialization.d.ts +20 -0
  335. package/dist/api/compiler/transformers/type-serialization.js +347 -0
  336. package/dist/api/compiler/transformers/using.d.ts +56 -0
  337. package/dist/api/compiler/transformers/using.js +453 -0
  338. package/dist/api/compiler/transformers/utilities.d.ts +50 -0
  339. package/dist/api/compiler/transformers/utilities.js +347 -0
  340. package/dist/api/compiler/transformers/visitor-base.d.ts +6 -0
  341. package/dist/api/compiler/transformers/visitor-base.js +817 -0
  342. package/dist/api/compiler/transformers/visitor-hooks.d.ts +29 -0
  343. package/dist/api/compiler/transformers/visitor-hooks.js +189 -0
  344. package/dist/api/compiler/tsconfig.d.ts +177 -0
  345. package/dist/api/compiler/tsconfig.js +1311 -0
  346. package/dist/api/compiler/type-printer.d.ts +15 -0
  347. package/dist/api/compiler/type-printer.js +74 -0
  348. package/dist/api/compiler/types.d.ts +87 -0
  349. package/dist/api/compiler/types.js +23 -0
  350. package/dist/api/compiler/unicode-identifiers.d.ts +2 -0
  351. package/dist/api/compiler/unicode-identifiers.js +209 -0
  352. package/dist/api/compiler/unicode-properties.d.ts +8 -0
  353. package/dist/api/compiler/unicode-properties.js +531 -0
  354. package/dist/api/compiler/vfs-match.d.ts +24 -0
  355. package/dist/api/compiler/vfs-match.js +587 -0
  356. package/dist/api/library/ast.d.ts +74 -0
  357. package/dist/api/library/ast.generated.d.ts +1145 -0
  358. package/dist/api/library/ast.generated.js +3 -0
  359. package/dist/api/library/ast.js +5 -0
  360. package/dist/api/library/checker.d.ts +51 -0
  361. package/dist/api/library/checker.js +318 -0
  362. package/dist/api/library/compiler-options.generated.d.ts +108 -0
  363. package/dist/api/library/compiler-options.generated.js +3 -0
  364. package/dist/api/library/diagnostics.d.ts +13 -0
  365. package/dist/api/library/diagnostics.js +50 -0
  366. package/dist/api/library/disk.d.ts +13 -0
  367. package/dist/api/library/disk.js +66 -0
  368. package/dist/api/library/enums.generated.d.ts +891 -0
  369. package/dist/api/library/enums.generated.js +916 -0
  370. package/dist/api/library/errors.d.ts +13 -0
  371. package/dist/api/library/errors.js +24 -0
  372. package/dist/api/library/host.d.ts +24 -0
  373. package/dist/api/library/host.js +52 -0
  374. package/dist/api/library/index.d.ts +14 -0
  375. package/dist/api/library/index.js +15 -0
  376. package/dist/api/library/nodes.d.ts +51 -0
  377. package/dist/api/library/nodes.js +196 -0
  378. package/dist/api/library/options.d.ts +144 -0
  379. package/dist/api/library/options.js +308 -0
  380. package/dist/api/library/parse.d.ts +19 -0
  381. package/dist/api/library/parse.js +41 -0
  382. package/dist/api/library/program.d.ts +21 -0
  383. package/dist/api/library/program.js +234 -0
  384. package/dist/api/library/symbols.d.ts +8 -0
  385. package/dist/api/library/symbols.js +11 -0
  386. package/dist/api/library/types.d.ts +313 -0
  387. package/dist/api/library/types.js +6 -0
  388. package/package.json +22 -8
  389. package/src/compiler/ast-utilities.ts +548 -0
  390. package/src/compiler/ast.ts +12862 -0
  391. package/src/compiler/astnav.ts +799 -0
  392. package/src/compiler/binder-utilities.ts +1392 -0
  393. package/src/compiler/binder.ts +2703 -0
  394. package/src/compiler/build-info.ts +1197 -0
  395. package/src/compiler/character-codes.ts +323 -0
  396. package/src/compiler/checker-calls.ts +2155 -0
  397. package/src/compiler/checker-classes.ts +706 -0
  398. package/src/compiler/checker-contextual.ts +1457 -0
  399. package/src/compiler/checker-declaration-order.ts +438 -0
  400. package/src/compiler/checker-declarations.ts +1194 -0
  401. package/src/compiler/checker-declared-types.ts +919 -0
  402. package/src/compiler/checker-decorators.ts +694 -0
  403. package/src/compiler/checker-deprecation.ts +359 -0
  404. package/src/compiler/checker-destructuring.ts +805 -0
  405. package/src/compiler/checker-elaboration.ts +477 -0
  406. package/src/compiler/checker-emit-helpers.ts +224 -0
  407. package/src/compiler/checker-emit-resolver.ts +769 -0
  408. package/src/compiler/checker-evaluator.ts +243 -0
  409. package/src/compiler/checker-expressions.ts +1831 -0
  410. package/src/compiler/checker-features.ts +361 -0
  411. package/src/compiler/checker-flow.ts +394 -0
  412. package/src/compiler/checker-functions.ts +1296 -0
  413. package/src/compiler/checker-generated-code.ts +227 -0
  414. package/src/compiler/checker-globals.ts +52 -0
  415. package/src/compiler/checker-grammar.ts +3584 -0
  416. package/src/compiler/checker-heritage.ts +1233 -0
  417. package/src/compiler/checker-inference.ts +2576 -0
  418. package/src/compiler/checker-iteration.ts +1206 -0
  419. package/src/compiler/checker-javascript.ts +502 -0
  420. package/src/compiler/checker-jsdoc.ts +360 -0
  421. package/src/compiler/checker-jsx.ts +1924 -0
  422. package/src/compiler/checker-literals.ts +61 -0
  423. package/src/compiler/checker-members.ts +2436 -0
  424. package/src/compiler/checker-modules.ts +2886 -0
  425. package/src/compiler/checker-narrowing.ts +3230 -0
  426. package/src/compiler/checker-object-literals.ts +575 -0
  427. package/src/compiler/checker-operators.ts +1422 -0
  428. package/src/compiler/checker-overloads.ts +328 -0
  429. package/src/compiler/checker-property-access.ts +906 -0
  430. package/src/compiler/checker-services.ts +1149 -0
  431. package/src/compiler/checker-signatures.ts +1032 -0
  432. package/src/compiler/checker-source-file.ts +732 -0
  433. package/src/compiler/checker-statements.ts +292 -0
  434. package/src/compiler/checker-super.ts +261 -0
  435. package/src/compiler/checker-symbol-types.ts +2107 -0
  436. package/src/compiler/checker-symbols.ts +2150 -0
  437. package/src/compiler/checker-type-factory.ts +2579 -0
  438. package/src/compiler/checker-type-nodes.ts +1033 -0
  439. package/src/compiler/checker-type-operators.ts +2502 -0
  440. package/src/compiler/checker-types.ts +2340 -0
  441. package/src/compiler/checker-unused.ts +642 -0
  442. package/src/compiler/checker-utilities.ts +161 -0
  443. package/src/compiler/checker.ts +1116 -0
  444. package/src/compiler/command-line.ts +436 -0
  445. package/src/compiler/compile-program.ts +439 -0
  446. package/src/compiler/decoder.ts +1209 -0
  447. package/src/compiler/diagnostic-locales.ts +86 -0
  448. package/src/compiler/diagnostic-messages.ts +2349 -0
  449. package/src/compiler/diagnostics.ts +897 -0
  450. package/src/compiler/emitter.ts +434 -0
  451. package/src/compiler/encoder.ts +1945 -0
  452. package/src/compiler/file-include.ts +673 -0
  453. package/src/compiler/file-loader.ts +1528 -0
  454. package/src/compiler/file-system.ts +143 -0
  455. package/src/compiler/flow.ts +89 -0
  456. package/src/compiler/help.ts +473 -0
  457. package/src/compiler/incremental.ts +2784 -0
  458. package/src/compiler/init.ts +141 -0
  459. package/src/compiler/instantiation.ts +894 -0
  460. package/src/compiler/jsdoc.ts +1386 -0
  461. package/src/compiler/link-tables.ts +98 -0
  462. package/src/compiler/locale-data.ts +203 -0
  463. package/src/compiler/locale.ts +307 -0
  464. package/src/compiler/locales/cs-CZ.ts +5 -0
  465. package/src/compiler/locales/de-DE.ts +5 -0
  466. package/src/compiler/locales/es-ES.ts +5 -0
  467. package/src/compiler/locales/fr-FR.ts +5 -0
  468. package/src/compiler/locales/it-IT.ts +5 -0
  469. package/src/compiler/locales/ja-JP.ts +5 -0
  470. package/src/compiler/locales/ko-KR.ts +5 -0
  471. package/src/compiler/locales/pl-PL.ts +5 -0
  472. package/src/compiler/locales/pt-BR.ts +5 -0
  473. package/src/compiler/locales/ru-RU.ts +5 -0
  474. package/src/compiler/locales/tr-TR.ts +5 -0
  475. package/src/compiler/locales/zh-CN.ts +5 -0
  476. package/src/compiler/locales/zh-TW.ts +5 -0
  477. package/src/compiler/module-resolution-types.ts +243 -0
  478. package/src/compiler/module-resolution.ts +2072 -0
  479. package/src/compiler/module-specifiers.ts +1491 -0
  480. package/src/compiler/name-resolver.ts +646 -0
  481. package/src/compiler/node-builder-names.ts +1069 -0
  482. package/src/compiler/node-builder-pseudo.ts +892 -0
  483. package/src/compiler/node-builder-reuse.ts +764 -0
  484. package/src/compiler/node-builder.ts +3425 -0
  485. package/src/compiler/option-declarations.ts +1560 -0
  486. package/src/compiler/options.ts +1576 -0
  487. package/src/compiler/output-paths.ts +334 -0
  488. package/src/compiler/package-json.ts +1083 -0
  489. package/src/compiler/parallel-check.ts +1951 -0
  490. package/src/compiler/parallel-parse.ts +590 -0
  491. package/src/compiler/parse-thread.ts +140 -0
  492. package/src/compiler/parser.ts +7716 -0
  493. package/src/compiler/path.ts +717 -0
  494. package/src/compiler/printer/async-helpers.ts +183 -0
  495. package/src/compiler/printer/auto-generate.ts +27 -0
  496. package/src/compiler/printer/decorator-helpers.ts +218 -0
  497. package/src/compiler/printer/emit-context.ts +679 -0
  498. package/src/compiler/printer/emit-flags.ts +64 -0
  499. package/src/compiler/printer/factory-base.ts +2577 -0
  500. package/src/compiler/printer/factory.ts +764 -0
  501. package/src/compiler/printer/helpers.ts +291 -0
  502. package/src/compiler/printer/name-generator.ts +372 -0
  503. package/src/compiler/printer/printer.ts +5072 -0
  504. package/src/compiler/printer/text-writer.ts +183 -0
  505. package/src/compiler/printer/utilities.ts +884 -0
  506. package/src/compiler/program-checker.ts +592 -0
  507. package/src/compiler/program-utilities.ts +435 -0
  508. package/src/compiler/program.ts +1419 -0
  509. package/src/compiler/pseudo-bigint.ts +62 -0
  510. package/src/compiler/regexp-checker.ts +1142 -0
  511. package/src/compiler/relations.ts +5149 -0
  512. package/src/compiler/reparser.ts +1566 -0
  513. package/src/compiler/scanner.ts +2951 -0
  514. package/src/compiler/show-config.ts +239 -0
  515. package/src/compiler/side-state.ts +125 -0
  516. package/src/compiler/sourcemap.ts +366 -0
  517. package/src/compiler/spelling.ts +122 -0
  518. package/src/compiler/symbol-accessibility.ts +1071 -0
  519. package/src/compiler/symbol.ts +439 -0
  520. package/src/compiler/symlinks.ts +137 -0
  521. package/src/compiler/syntax-kind.ts +391 -0
  522. package/src/compiler/thread-entry.ts +191 -0
  523. package/src/compiler/timeline.ts +53 -0
  524. package/src/compiler/transformers/alias-references.ts +757 -0
  525. package/src/compiler/transformers/async-utilities.ts +335 -0
  526. package/src/compiler/transformers/async.ts +838 -0
  527. package/src/compiler/transformers/class-fields.ts +2967 -0
  528. package/src/compiler/transformers/class-utilities.ts +324 -0
  529. package/src/compiler/transformers/commonjs-module.ts +1621 -0
  530. package/src/compiler/transformers/const-enum-inliner.ts +50 -0
  531. package/src/compiler/transformers/declarations-diagnostics.ts +832 -0
  532. package/src/compiler/transformers/declarations-pseudo.ts +966 -0
  533. package/src/compiler/transformers/declarations-resolver.ts +249 -0
  534. package/src/compiler/transformers/declarations-syntactic.ts +1859 -0
  535. package/src/compiler/transformers/declarations-tracker.ts +269 -0
  536. package/src/compiler/transformers/declarations.ts +3120 -0
  537. package/src/compiler/transformers/decorator-metadata.ts +697 -0
  538. package/src/compiler/transformers/decorator-utilities.ts +283 -0
  539. package/src/compiler/transformers/destructuring.ts +708 -0
  540. package/src/compiler/transformers/downlevel.ts +50 -0
  541. package/src/compiler/transformers/emit-resolver.ts +258 -0
  542. package/src/compiler/transformers/es-decorators.ts +2682 -0
  543. package/src/compiler/transformers/exponentiation.ts +80 -0
  544. package/src/compiler/transformers/external-module-info.ts +412 -0
  545. package/src/compiler/transformers/for-await.ts +687 -0
  546. package/src/compiler/transformers/import-elision.ts +152 -0
  547. package/src/compiler/transformers/jsx-entities.ts +256 -0
  548. package/src/compiler/transformers/jsx.ts +824 -0
  549. package/src/compiler/transformers/legacy-decorators.ts +726 -0
  550. package/src/compiler/transformers/logical-assignment.ts +75 -0
  551. package/src/compiler/transformers/module-utilities.ts +42 -0
  552. package/src/compiler/transformers/module.ts +474 -0
  553. package/src/compiler/transformers/named-evaluation.ts +389 -0
  554. package/src/compiler/transformers/nullish-coalescing.ts +35 -0
  555. package/src/compiler/transformers/object-rest-spread.ts +577 -0
  556. package/src/compiler/transformers/optional-catch.ts +29 -0
  557. package/src/compiler/transformers/optional-chain.ts +246 -0
  558. package/src/compiler/transformers/reference-resolver.ts +1201 -0
  559. package/src/compiler/transformers/runtime-syntax.ts +942 -0
  560. package/src/compiler/transformers/subtree-facts.ts +245 -0
  561. package/src/compiler/transformers/syntax-facts.ts +353 -0
  562. package/src/compiler/transformers/tagged-template.ts +167 -0
  563. package/src/compiler/transformers/transformer.ts +56 -0
  564. package/src/compiler/transformers/type-eraser.ts +520 -0
  565. package/src/compiler/transformers/type-serialization.ts +374 -0
  566. package/src/compiler/transformers/using.ts +613 -0
  567. package/src/compiler/transformers/utilities.ts +419 -0
  568. package/src/compiler/transformers/visitor-base.ts +1601 -0
  569. package/src/compiler/transformers/visitor-hooks.ts +252 -0
  570. package/src/compiler/tsc-build.ts +1418 -0
  571. package/src/compiler/tsc-cli.ts +666 -0
  572. package/src/compiler/tsc-compile.ts +437 -0
  573. package/src/compiler/tsc-watch.ts +854 -0
  574. package/src/compiler/tsconfig.ts +1574 -0
  575. package/src/compiler/type-printer.ts +110 -0
  576. package/src/compiler/types.ts +115 -0
  577. package/src/compiler/unicode-identifiers.ts +212 -0
  578. package/src/compiler/unicode-properties.ts +537 -0
  579. package/src/compiler/vfs-match.ts +597 -0
  580. package/src/compiler/xxh3.ts +650 -0
  581. package/src/library/ast.generated.ts +1685 -0
  582. package/src/library/ast.ts +104 -0
  583. package/src/library/checker.ts +384 -0
  584. package/src/library/compiler-options.generated.ts +114 -0
  585. package/src/library/diagnostics.ts +72 -0
  586. package/src/library/disk.ts +73 -0
  587. package/src/library/enums.generated.ts +1024 -0
  588. package/src/library/errors.ts +26 -0
  589. package/src/library/host.ts +63 -0
  590. package/src/library/index.ts +71 -0
  591. package/src/library/nodes.ts +232 -0
  592. package/src/library/options.ts +449 -0
  593. package/src/library/parse.ts +63 -0
  594. package/src/library/program.ts +293 -0
  595. package/src/library/symbols.ts +15 -0
  596. package/src/library/types.ts +359 -0
@@ -0,0 +1,1002 @@
1
+ // Functions: function expressions and arrows, bodies, inferred return types, generators, `await`.
2
+ import { checkCollisionsForDeclarationName } from './checker-generated-code.js';
3
+ import { ScriptTarget } from './options.js';
4
+ import { checkExternalEmitHelpers } from './checker-emit-helpers.js';
5
+ import { resolvedReturnTypeOf, signatureSideOf } from './side-state.js';
6
+ import { isJsxAttributesContextSensitive } from './checker-jsx.js';
7
+ import { NodeVisitor, getBody, getDotDotDotToken, getEndFlowNode, getFlowNode, getText, getExpression, getInitializer, getParameters, getProperties, getElements, getStatements, getSymbol, getType, getTypeParameters, getName, } from './ast.js';
8
+ import { isFunctionExpressionOrArrowFunction, isObjectLiteralMethod, skipParentheses } from './binder-utilities.js';
9
+ import { isPartOfTypeNode } from './transformers/alias-references.js';
10
+ import { createDiagnosticForNode } from './checker.js';
11
+ import { TypePredicate } from './checker-types.js';
12
+ import { filterType, getIntersectionType, getRegularTypeOfLiteralType, getUnionTypeEx, isErrorType, isUnitType, someType, } from './checker-type-factory.js';
13
+ import { getTypeOfSymbol, getWidenedType, isPrivateWithinAmbient, reportErrorsFromWidening, reportImplicitAny, } from './checker-symbol-types.js';
14
+ import { getMergedSymbol, getSymbolOfDeclaration } from './checker-symbols.js';
15
+ import { getReturnTypeFromAnnotation, getReturnTypeOfSignature, getSignatureFromDeclaration, } from './checker-signatures.js';
16
+ import { checkExpression, checkExpressionCached, getWidenedLiteralLikeTypeForContextualType, isConstContext, } from './checker-expressions.js';
17
+ import { getContextualIterationType, getContextualReturnType, getContextualType, hasContextSensitiveParameters, } from './checker-contextual.js';
18
+ import { checkNodeDeferred, checkSourceElement, checkTypeNodeIfPresent } from './checker-source-file.js';
19
+ import { checkTypeParameters, checkVariableLikeDeclaration } from './checker-declarations.js';
20
+ import { getFunctionFlags, maybeTypeOfKind } from './checker-utilities.js';
21
+ import { getSymbolId } from './symbol.js';
22
+ import { createAnonymousType, getWidenedLiteralType } from './checker-type-factory.js';
23
+ import { isGenericType } from './checker-type-operators.js';
24
+ import { createSymbolWithType, getReducedType, getSignaturesOfType } from './checker-members.js';
25
+ import { getEffectiveRestType, getRestTypeAtPosition, getTypeAtPosition, isOptionalDeclaration, tryGetTypeAtPosition, } from './checker-signatures.js';
26
+ import { addOptionality } from './checker-symbol-types.js';
27
+ import { getBindingElementTypeFromParentType, getTypeFromBindingPattern } from './checker-destructuring.js';
28
+ import { getTypeFromTypeNode } from './checker-type-nodes.js';
29
+ import { checkDeclarationInitializer, checkExpressionEx, checkTypeAssignableToAndOptionallyElaborate, } from './checker-expressions.js';
30
+ import { isTypeAssignableTo } from './relations.js';
31
+ import { inferTypes } from './checker-inference.js';
32
+ import { couldContainTypeVariables, instantiateSignature } from './instantiation.js';
33
+ import { getContextualSignatureForFunctionLikeDeclaration, getInferenceContext, instantiateContextualType, } from './checker-contextual.js';
34
+ import { checkJSDocFullSignature, checkUnmatchedJSDocParameters, getFullSignatureTypeNode } from './checker-jsdoc.js';
35
+ import { getEffectiveCheckNode, isFunctionLike, nodeIsMissing } from './ast-utilities.js';
36
+ import { getFlowTypeOfReferenceAt, isConstantReference, isReachableFlowNode, isSymbolAssigned, } from './checker-narrowing.js';
37
+ import { FlowNode } from './flow.js';
38
+ import { checkAwaitedType, checkGeneratorInstantiationAssignabilityToReturnType, checkIteratedTypeOrElementType, createGeneratorType, createPromiseReturnType, createPromiseType, getAwaitedTypeEx, getAwaitedTypeNoAlias, getGlobalPromiseTypeChecked, getIterationTypeOfGeneratorFunctionReturnType, getIterationTypeOfIterable, getIterationTypesOfGeneratorFunctionReturnType, getIterationTypesOfIterable, getPromisedTypeOfPromise, isReferenceToType, unwrapAwaitedType, unwrapReturnType, } from './checker-iteration.js';
39
+ import { typeToString } from './type-printer.js';
40
+ import { checkGrammarAwaitExpression, checkGrammarFunctionExpression, checkGrammarYieldOfExpression, } from './checker-grammar.js';
41
+ export function checkFunctionExpressionOrObjectLiteralMethod(c, node, checkMode) {
42
+ checkNodeDeferred(c, node);
43
+ if (node.kind === 219 /* SyntaxKind.FunctionExpression */)
44
+ checkCollisionsForDeclarationName(c, node, getName(node));
45
+ if (node.kind === 178 /* SyntaxKind.GetAccessor */ || node.kind === 179 /* SyntaxKind.SetAccessor */)
46
+ return c.anyType;
47
+ if ((checkMode & 4 /* CheckMode.SkipContextSensitive */) !== 0 && isContextSensitive(c, node)) {
48
+ // Skip parameters, but keep a return type with the non-contextual parts so that inferences can
49
+ // be drawn early.
50
+ if (getType(node) === undefined && !hasContextSensitiveParameters(node)) {
51
+ const contextualSignature = getContextualSignatureForFunctionLikeDeclaration(c, node);
52
+ if (contextualSignature !== undefined &&
53
+ couldContainTypeVariables(c, getReturnTypeOfSignature(c, contextualSignature))) {
54
+ const links = c.nodeLinks(node);
55
+ if (links.contextFreeType !== undefined)
56
+ return links.contextFreeType;
57
+ const returnType = getReturnTypeFromBodyEx(c, node, checkMode);
58
+ const returnOnlySignature = c.newSignature(128 /* SignatureFlags.IsNonInferrable */, undefined, [], undefined, [], returnType, 0);
59
+ const returnOnlyType = createAnonymousType(c, getSymbolOfDeclaration(c, node), undefined, [returnOnlySignature], [], []);
60
+ returnOnlyType.objectFlags |= 262144 /* ObjectFlags.NonInferrableType */;
61
+ links.contextFreeType = returnOnlyType;
62
+ return returnOnlyType;
63
+ }
64
+ }
65
+ return c.anyFunctionType;
66
+ }
67
+ if (node.kind === 219 /* SyntaxKind.FunctionExpression */ || node.kind === 220 /* SyntaxKind.ArrowFunction */)
68
+ checkGrammarFunctionExpression(c, node);
69
+ checkJSDocFullSignature(c, node);
70
+ contextuallyCheckFunctionExpressionOrObjectLiteralMethod(c, node, checkMode);
71
+ const symbol = getSymbolOfDeclaration(c, node);
72
+ return symbol !== undefined ? getTypeOfSymbol(c, symbol) : c.anyType;
73
+ }
74
+ /** Assigns contextual parameter types and the return type of a function expression, once. */
75
+ function contextuallyCheckFunctionExpressionOrObjectLiteralMethod(c, node, checkMode) {
76
+ const links = c.nodeLinks(node);
77
+ if ((links.flags & 64 /* NodeCheckFlags.ContextChecked */) !== 0)
78
+ return;
79
+ const contextualSignature = getContextualSignatureForFunctionLikeDeclaration(c, node);
80
+ // Obtaining the contextual signature may have come back here through overload resolution.
81
+ if ((links.flags & 64 /* NodeCheckFlags.ContextChecked */) !== 0)
82
+ return;
83
+ links.flags |= 64 /* NodeCheckFlags.ContextChecked */;
84
+ const symbol = getSymbolOfDeclaration(c, node);
85
+ if (symbol === undefined)
86
+ return;
87
+ const signatures = getSignaturesOfType(c, getTypeOfSymbol(c, symbol), 0 /* SignatureKind.Call */);
88
+ if (signatures.length === 0)
89
+ return;
90
+ const signature = signatures[0];
91
+ if (isContextSensitive(c, node)) {
92
+ if (contextualSignature !== undefined) {
93
+ const inferenceContext = getInferenceContext(c, node);
94
+ let instantiatedContextualSignature = undefined;
95
+ if ((checkMode & 2 /* CheckMode.Inferential */) !== 0 && inferenceContext !== undefined) {
96
+ inferFromAnnotatedParametersAndReturn(c, signature, contextualSignature, inferenceContext);
97
+ const restType = getEffectiveRestType(c, contextualSignature);
98
+ if (restType !== undefined && (restType.flags & 524288 /* TypeFlags.TypeParameter */) !== 0)
99
+ instantiatedContextualSignature = instantiateSignature(c, contextualSignature, inferenceContext.nonFixingMapper);
100
+ }
101
+ if (instantiatedContextualSignature === undefined)
102
+ instantiatedContextualSignature =
103
+ inferenceContext !== undefined
104
+ ? instantiateSignature(c, contextualSignature, inferenceContext.mapper)
105
+ : contextualSignature;
106
+ assignContextualParameterTypes(c, signature, instantiatedContextualSignature);
107
+ }
108
+ else
109
+ assignNonContextualParameterTypes(c, node);
110
+ }
111
+ else if (contextualSignature !== undefined &&
112
+ getTypeParameters(node) === undefined &&
113
+ contextualSignature.parameters.length > getParameters(node).nodes.length) {
114
+ const inferenceContext = getInferenceContext(c, node);
115
+ if ((checkMode & 2 /* CheckMode.Inferential */) !== 0 && inferenceContext !== undefined)
116
+ inferFromAnnotatedParametersAndReturn(c, signature, contextualSignature, inferenceContext);
117
+ }
118
+ if (contextualSignature !== undefined &&
119
+ getType(node) === undefined &&
120
+ resolvedReturnTypeOf(c, signature) === undefined) {
121
+ const returnType = getReturnTypeFromBodyEx(c, node, checkMode);
122
+ if (resolvedReturnTypeOf(c, signature) === undefined)
123
+ signatureSideOf(c, signature).resolvedReturnType = returnType;
124
+ }
125
+ checkFunctionLikeSignature(c, node);
126
+ }
127
+ function inferFromAnnotatedParametersAndReturn(c, sig, context, inferenceContext) {
128
+ const length = sig.parameters.length - (sig.hasRestParameter() ? 1 : 0);
129
+ for (let i = 0; i < length; i++) {
130
+ const declaration = sig.parameters[i].valueDeclaration;
131
+ const typeNode = declaration !== undefined ? getType(declaration) : undefined;
132
+ if (typeNode !== undefined) {
133
+ const source = addOptionality(c, getTypeFromTypeNode(c, typeNode), false, isOptionalDeclaration(declaration));
134
+ inferTypes(c, inferenceContext.inferences, source, getTypeAtPosition(c, context, i), 0 /* InferencePriority.None */, false);
135
+ }
136
+ }
137
+ const declaration = sig.declaration;
138
+ const returnTypeNode = declaration !== undefined ? getType(declaration) : undefined;
139
+ if (returnTypeNode !== undefined)
140
+ inferTypes(c, inferenceContext.inferences, getTypeFromTypeNode(c, returnTypeNode), getReturnTypeOfSignature(c, context), 0 /* InferencePriority.None */, false);
141
+ }
142
+ function assignContextualParameterTypes(c, sig, context) {
143
+ if (context.typeParameters.length !== 0) {
144
+ // A contextual inference was already performed and cached on this signature.
145
+ if (sig.typeParameters.length !== 0)
146
+ return;
147
+ sig.typeParameters = context.typeParameters;
148
+ }
149
+ if (context.thisParameter !== undefined) {
150
+ const parameter = sig.thisParameter;
151
+ if (parameter === undefined ||
152
+ (parameter.valueDeclaration !== undefined && getType(parameter.valueDeclaration) === undefined)) {
153
+ if (parameter === undefined)
154
+ sig.thisParameter = createSymbolWithType(c, context.thisParameter, undefined);
155
+ assignParameterSymbolType(c, sig.thisParameter, getTypeOfSymbol(c, context.thisParameter));
156
+ }
157
+ }
158
+ const length = sig.parameters.length - (sig.hasRestParameter() ? 1 : 0);
159
+ for (let i = 0; i < length; i++) {
160
+ const parameter = sig.parameters[i];
161
+ const declaration = parameter.valueDeclaration;
162
+ if (declaration === undefined || getType(declaration) !== undefined)
163
+ continue;
164
+ let t = tryGetTypeAtPosition(c, context, i);
165
+ if (t !== undefined && getInitializer(declaration) !== undefined) {
166
+ let initializerType = checkDeclarationInitializer(c, declaration);
167
+ if (!isTypeAssignableTo(c, initializerType, t)) {
168
+ initializerType = getWidenedLiteralType(c, initializerType);
169
+ if (isTypeAssignableTo(c, t, initializerType))
170
+ t = initializerType;
171
+ }
172
+ }
173
+ assignParameterSymbolType(c, parameter, t);
174
+ }
175
+ if (sig.hasRestParameter()) {
176
+ const parameter = sig.parameters[sig.parameters.length - 1];
177
+ const declaration = parameter.valueDeclaration;
178
+ if (declaration !== undefined && getType(declaration) === undefined)
179
+ assignParameterSymbolType(c, parameter, getRestTypeAtPosition(c, context, length, false));
180
+ }
181
+ }
182
+ function assignNonContextualParameterTypes(c, func) {
183
+ for (const param of getParameters(func).nodes)
184
+ assignParameterType(c, param);
185
+ }
186
+ /** Fixes a parameter's type to `contextualType`, or to its declared type without one. */
187
+ function assignParameterSymbolType(c, parameter, contextualType) {
188
+ const id = getSymbolId(parameter);
189
+ if (c.symbolTypes.get(id) !== undefined)
190
+ return;
191
+ const declaration = parameter.valueDeclaration;
192
+ if (contextualType === undefined) {
193
+ c.symbolTypes.set(id, getTypeOfSymbol(c, parameter));
194
+ return;
195
+ }
196
+ c.symbolTypes.set(id, addOptionality(c, contextualType, false, declaration !== undefined && getInitializer(declaration) === undefined && isOptionalDeclaration(declaration)));
197
+ if (declaration === undefined)
198
+ return;
199
+ const name = getName(declaration);
200
+ // Without a better inference than `unknown`, a binding pattern implies the type.
201
+ if (c.symbolTypes.get(id) === c.unknownType &&
202
+ name !== undefined &&
203
+ (name.kind === 207 /* SyntaxKind.ObjectBindingPattern */ || name.kind === 208 /* SyntaxKind.ArrayBindingPattern */))
204
+ c.symbolTypes.set(id, getTypeFromBindingPattern(c, name, false, false));
205
+ if (name !== undefined &&
206
+ (name.kind === 207 /* SyntaxKind.ObjectBindingPattern */ || name.kind === 208 /* SyntaxKind.ArrayBindingPattern */))
207
+ assignBindingElementTypes(c, name, c.symbolTypes.get(id));
208
+ }
209
+ export function getTypeOfObjectLiteralMethod(c, node, checkMode) {
210
+ return checkFunctionExpressionOrObjectLiteralMethod(c, node, checkMode);
211
+ }
212
+ /** Checks the type parameters, parameters and return type annotation of a function. */
213
+ function checkFunctionLikeSignature(c, node) {
214
+ const functionFlags = getFunctionFlags(node);
215
+ if ((functionFlags & 4 /* FunctionFlags.Invalid */) === 0) {
216
+ // Async generators before ES2018 use __await and __asyncGenerator, and async functions before ES2017 __awaiter.
217
+ if ((functionFlags & 3 /* FunctionFlags.AsyncGenerator */) === 3 /* FunctionFlags.AsyncGenerator */ &&
218
+ c.languageVersion < ScriptTarget.ES2018)
219
+ checkExternalEmitHelpers(c, node, 96 /* ExternalEmitHelpers.AsyncGeneratorIncludes */);
220
+ if ((functionFlags & 3 /* FunctionFlags.AsyncGenerator */) === 2 /* FunctionFlags.Async */ &&
221
+ c.languageVersion < ScriptTarget.ES2017)
222
+ checkExternalEmitHelpers(c, node, 16 /* ExternalEmitHelpers.Awaiter */);
223
+ }
224
+ checkTypeParameters(c, getTypeParameters(node));
225
+ checkUnmatchedJSDocParameters(c, node);
226
+ const params = getParameters(node);
227
+ if (params !== undefined)
228
+ for (const p of params.nodes)
229
+ checkVariableLikeDeclaration(c, p);
230
+ const returnTypeNode = getType(node);
231
+ checkTypeNodeIfPresent(c, returnTypeNode);
232
+ if (returnTypeNode !== undefined)
233
+ checkSignatureReturnType(c, node, returnTypeNode, getFunctionFlags(node));
234
+ }
235
+ /**
236
+ * Checks a function's signature and body. The signature of a function expression or object literal
237
+ * method is checked earlier, while its contextual parameter types are assigned.
238
+ */
239
+ export function checkFunctionLikeBody(c, node) {
240
+ if (((c.existingNodeLinks(node)?.flags ?? 0) & 64 /* NodeCheckFlags.ContextChecked */) === 0)
241
+ checkFunctionLikeSignature(c, node);
242
+ const returnTypeNode = getType(node);
243
+ const functionFlags = getFunctionFlags(node);
244
+ const body = getBody(node);
245
+ // Function and class method declarations without a body or return type return `any`.
246
+ if (returnTypeNode === undefined &&
247
+ nodeIsMissing(body) &&
248
+ (node.kind === 263 /* SyntaxKind.FunctionDeclaration */ ||
249
+ (node.kind === 175 /* SyntaxKind.MethodDeclaration */ && node.parent.kind !== 211 /* SyntaxKind.ObjectLiteralExpression */)) &&
250
+ !isPrivateWithinAmbient(node))
251
+ reportImplicitAny(c, node, c.anyType);
252
+ if (body === undefined)
253
+ return;
254
+ const returnType = node.kind !== 177 /* SyntaxKind.Constructor */ ? getReturnTypeFromAnnotation(c, node) : undefined;
255
+ // Errors only found while inferring the return type (such as of yielded values) need it resolved.
256
+ if (returnTypeNode === undefined &&
257
+ (isFunctionExpressionOrArrowFunction(node) ||
258
+ isObjectLiteralMethod(node) ||
259
+ ((functionFlags & 1 /* FunctionFlags.Generator */) !== 0 && node.kind !== 177 /* SyntaxKind.Constructor */)))
260
+ getReturnTypeOfSignature(c, getSignatureFromDeclaration(c, node));
261
+ if (body.kind === 242 /* SyntaxKind.Block */) {
262
+ for (const s of getStatements(body).nodes)
263
+ checkSourceElement(c, s);
264
+ if (node.kind !== 177 /* SyntaxKind.Constructor */ && node.kind !== 179 /* SyntaxKind.SetAccessor */)
265
+ checkAllCodePathsInNonVoidFunctionReturnOrThrow(c, node, returnType);
266
+ }
267
+ else {
268
+ // An async arrow function's awaited body is checked against the promised type.
269
+ const exprType = checkExpression(c, body);
270
+ if (returnType !== undefined)
271
+ checkReturnExpression(c, node, unwrapReturnType(c, returnType, functionFlags), body, body, exprType, false);
272
+ }
273
+ }
274
+ /** Checks a generator's or async function's return type annotation. */
275
+ function checkSignatureReturnType(c, node, returnTypeNode, functionFlags) {
276
+ if ((functionFlags & (4 /* FunctionFlags.Invalid */ | 1 /* FunctionFlags.Generator */)) === 1 /* FunctionFlags.Generator */) {
277
+ const returnType = getTypeFromTypeNode(c, returnTypeNode);
278
+ if (returnType === c.voidType)
279
+ c.error(returnTypeNode, 665 /* Diagnostics.A_generator_cannot_have_a_void_type_annotation */);
280
+ else
281
+ checkGeneratorInstantiationAssignabilityToReturnType(c, returnType, functionFlags, returnTypeNode);
282
+ }
283
+ else if ((functionFlags & 3 /* FunctionFlags.AsyncGenerator */) === 2 /* FunctionFlags.Async */)
284
+ checkAsyncFunctionReturnType(c, node, returnTypeNode);
285
+ }
286
+ /** Checks that an async function's return type is the global `Promise<T>` and can be awaited. */
287
+ function checkAsyncFunctionReturnType(c, node, returnTypeNode) {
288
+ const returnType = getTypeFromTypeNode(c, returnTypeNode);
289
+ if (isErrorType(c, returnType))
290
+ return;
291
+ const globalPromiseType = getGlobalPromiseTypeChecked(c);
292
+ if (globalPromiseType !== c.emptyGenericType && !isReferenceToType(returnType, globalPromiseType)) {
293
+ c.error(returnTypeNode, 49 /* Diagnostics.The_return_type_of_an_async_function_or_method_must_be_the_global_Promise_T_type_Did_you_mean_to_write_Promise_0 */, typeToString(c, getAwaitedTypeNoAlias(c, returnType) ?? c.voidType));
294
+ return;
295
+ }
296
+ checkAwaitedType(c, returnType, false, node, 43 /* Diagnostics.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member */);
297
+ }
298
+ function checkAllCodePathsInNonVoidFunctionReturnOrThrow(c, func, returnType) {
299
+ const functionFlags = getFunctionFlags(func);
300
+ const t = returnType !== undefined ? unwrapReturnType(c, returnType, functionFlags) : undefined;
301
+ // A return type that includes `void` or is `any` or `undefined` needs no return statements.
302
+ if (t !== undefined &&
303
+ (maybeTypeOfKind(t, 16 /* TypeFlags.Void */) || (t.flags & (1 /* TypeFlags.Any */ | 4 /* TypeFlags.Undefined */)) !== 0))
304
+ return;
305
+ // Signatures, expression bodies and bodies that end in a return or throw have nothing to check.
306
+ const body = getBody(func);
307
+ if (func.kind === 174 /* SyntaxKind.MethodSignature */ ||
308
+ body === undefined ||
309
+ nodeIsMissing(body) ||
310
+ body.kind !== 242 /* SyntaxKind.Block */ ||
311
+ !functionHasImplicitReturn(c, func))
312
+ return;
313
+ const hasExplicitReturn = (func.flags & 512 /* NodeFlags.HasExplicitReturn */) !== 0;
314
+ const errorNode = getType(func) ?? getFullSignatureTypeNode(func) ?? func;
315
+ if (t !== undefined && (t.flags & 262144 /* TypeFlags.Never */) !== 0)
316
+ c.error(errorNode, 692 /* Diagnostics.A_function_returning_never_cannot_have_a_reachable_end_point */);
317
+ else if (t !== undefined && !hasExplicitReturn)
318
+ c.error(errorNode, 531 /* Diagnostics.A_function_whose_declared_type_is_neither_undefined_void_nor_any_must_return_a_value */);
319
+ else if (t !== undefined && c.strictNullChecks && !isTypeAssignableTo(c, c.undefinedType, t))
320
+ c.error(errorNode, 540 /* Diagnostics.Function_lacks_ending_return_statement_and_return_type_does_not_include_undefined */);
321
+ else if (c.compilerOptions.noImplicitReturns === true) {
322
+ if (t === undefined) {
323
+ // Without an annotation, only functions that return values other than void or any are checked.
324
+ if (!hasExplicitReturn)
325
+ return;
326
+ const inferredReturnType = getReturnTypeOfSignature(c, getSignatureFromDeclaration(c, func));
327
+ if (isUnwrappedReturnTypeUndefinedVoidOrAny(c, func, inferredReturnType))
328
+ return;
329
+ }
330
+ c.error(errorNode, 1701 /* Diagnostics.Not_all_code_paths_return_a_value */);
331
+ }
332
+ }
333
+ export function isUnwrappedReturnTypeUndefinedVoidOrAny(c, func, returnType) {
334
+ const t = unwrapReturnType(c, returnType, getFunctionFlags(func));
335
+ return maybeTypeOfKind(t, 16 /* TypeFlags.Void */) || (t.flags & (1 /* TypeFlags.Any */ | 4 /* TypeFlags.Undefined */)) !== 0;
336
+ }
337
+ function functionHasImplicitReturn(c, func) {
338
+ const endFlowNode = getEndFlowNode(func);
339
+ return endFlowNode !== undefined && isReachableFlowNode(c, endFlowNode);
340
+ }
341
+ /**
342
+ * Checks a returned expression against the unwrapped return type; `node` is the return statement,
343
+ * or the expression body of an arrow function. Conditional expressions are checked by branch.
344
+ */
345
+ export function checkReturnExpression(c, container, unwrappedReturnType, node, expr, exprType, inConditionalExpression) {
346
+ const functionFlags = getFunctionFlags(container);
347
+ if (expr !== undefined) {
348
+ const unwrappedExpr = skipParentheses(expr);
349
+ if (unwrappedExpr.kind === 228 /* SyntaxKind.ConditionalExpression */) {
350
+ const conditional = unwrappedExpr;
351
+ const whenTrue = conditional.whenTrue;
352
+ const whenFalse = conditional.whenFalse;
353
+ checkReturnExpression(c, container, unwrappedReturnType, node, whenTrue, checkExpression(c, whenTrue), true);
354
+ checkReturnExpression(c, container, unwrappedReturnType, node, whenFalse, checkExpression(c, whenFalse), true);
355
+ return;
356
+ }
357
+ }
358
+ const inReturnStatement = node.kind === 254 /* SyntaxKind.ReturnStatement */;
359
+ const unwrappedExprType = (functionFlags & 2 /* FunctionFlags.Async */) !== 0
360
+ ? checkAwaitedType(c, exprType, false, node, 43 /* Diagnostics.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member */)
361
+ : exprType;
362
+ const effectiveExpr = expr !== undefined ? getEffectiveCheckNode(expr) : undefined;
363
+ const errorNode = inReturnStatement && !inConditionalExpression ? node : (effectiveExpr ?? node);
364
+ checkTypeAssignableToAndOptionallyElaborate(c, unwrappedExprType, unwrappedReturnType, errorNode, effectiveExpr);
365
+ }
366
+ /** `node` without parentheses and `satisfies`. */
367
+ export function checkAwaitExpression(c, node) {
368
+ checkGrammarAwaitExpression(c, node);
369
+ const operandType = checkExpression(c, getExpression(node));
370
+ const awaitedType = checkAwaitedType(c, operandType, true, node, 256 /* Diagnostics.Type_of_await_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member */);
371
+ if (awaitedType === operandType && !isErrorType(c, awaitedType) && (operandType.flags & 3 /* TypeFlags.AnyOrUnknown */) === 0)
372
+ c.addSuggestion(createDiagnosticForNode(node, 1884 /* Diagnostics.X_await_has_no_effect_on_the_type_of_this_expression */, []));
373
+ return awaitedType;
374
+ }
375
+ // ---- Generators
376
+ export function checkYieldExpression(c, node) {
377
+ checkGrammarYieldOfExpression(c, node);
378
+ const yieldExpr = node;
379
+ const func = getContainingFunctionLike(node);
380
+ if (func === undefined)
381
+ return c.anyType;
382
+ const functionFlags = getFunctionFlags(func);
383
+ // Outside a generator `yield` is a syntax error.
384
+ if ((functionFlags & 1 /* FunctionFlags.Generator */) === 0)
385
+ return c.anyType;
386
+ const isAsync = (functionFlags & 2 /* FunctionFlags.Async */) !== 0;
387
+ // `yield*` in an async generator before ES2018 uses __await, __asyncDelegator and __asyncValues.
388
+ if (yieldExpr.asteriskToken !== undefined && isAsync && c.languageVersion < ScriptTarget.ES2018)
389
+ checkExternalEmitHelpers(c, node, 416 /* ExternalEmitHelpers.AsyncDelegatorIncludes */);
390
+ // Without an annotation the return type is computed from the yields, so there's nothing to check.
391
+ let returnType = getReturnTypeFromAnnotation(c, func);
392
+ if (returnType !== undefined && (returnType.flags & 134217728 /* TypeFlags.Union */) !== 0)
393
+ returnType = filterType(c, returnType, (t) => checkGeneratorInstantiationAssignabilityToReturnType(c, t, functionFlags, undefined));
394
+ const iterationTypes = returnType !== undefined ? getIterationTypesOfGeneratorFunctionReturnType(c, returnType, isAsync) : undefined;
395
+ const signatureYieldType = iterationTypes?.yieldType ?? c.anyType;
396
+ const signatureNextType = iterationTypes?.nextType ?? c.anyType;
397
+ const operand = yieldExpr.expression;
398
+ const yieldExpressionType = operand !== undefined ? checkExpression(c, operand) : c.undefinedWideningType;
399
+ const yieldedType = getYieldedTypeOfYieldExpression(c, yieldExpr, yieldExpressionType, signatureNextType, isAsync);
400
+ if (returnType !== undefined && yieldedType !== undefined)
401
+ checkTypeAssignableToAndOptionallyElaborate(c, yieldedType, signatureYieldType, operand ?? node, operand);
402
+ if (yieldExpr.asteriskToken !== undefined)
403
+ return (getIterationTypeOfIterable(c, isAsync ? 19 /* IterationUse.AsyncYieldStar */ : 17 /* IterationUse.YieldStar */, 1 /* IterationTypeKind.Return */, yieldExpressionType, operand) ?? c.anyType);
404
+ if (returnType !== undefined)
405
+ return getIterationTypeOfGeneratorFunctionReturnType(c, 2 /* IterationTypeKind.Next */, returnType, isAsync) ?? c.anyType;
406
+ const t = getContextualIterationType(c, 2 /* IterationTypeKind.Next */, func);
407
+ if (t !== undefined)
408
+ return t;
409
+ if (c.noImplicitAny && !expressionResultIsUnused(node)) {
410
+ const contextualType = getContextualType(c, node);
411
+ if (contextualType === undefined || (contextualType.flags & 1 /* TypeFlags.Any */) !== 0)
412
+ c.error(node, 1728 /* Diagnostics.X_yield_expression_implicitly_results_in_an_any_type_because_its_containing_generator_lacks_a_return_type_annotation */);
413
+ }
414
+ return c.anyType;
415
+ }
416
+ /** What a `yield` yields: its operand, or what a `yield*` operand iterates, awaited in async generators. */
417
+ function getYieldedTypeOfYieldExpression(c, node, expressionType, sentType, isAsync) {
418
+ let errorNode = node;
419
+ if (node.expression !== undefined)
420
+ errorNode = node.expression;
421
+ const isYieldStar = node.asteriskToken !== undefined;
422
+ const yieldedType = isYieldStar
423
+ ? checkIteratedTypeOrElementType(c, isAsync ? 19 /* IterationUse.AsyncYieldStar */ : 17 /* IterationUse.YieldStar */, expressionType, sentType, errorNode)
424
+ : expressionType;
425
+ if (!isAsync)
426
+ return yieldedType;
427
+ return getAwaitedTypeEx(c, yieldedType, errorNode, isYieldStar
428
+ ? 258 /* Diagnostics.Type_of_iterated_elements_of_a_yield_Asterisk_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member */
429
+ : 257 /* Diagnostics.Type_of_yield_operand_in_an_async_generator_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member */);
430
+ }
431
+ /** Whether the value of `node` is discarded: by an expression statement, `void`, a `for` header or a comma. */
432
+ function expressionResultIsUnused(nodeIn) {
433
+ let node = nodeIn;
434
+ for (;;) {
435
+ const parent = node.parent;
436
+ if (parent.kind === 218 /* SyntaxKind.ParenthesizedExpression */) {
437
+ node = parent;
438
+ continue;
439
+ }
440
+ if (parent.kind === 245 /* SyntaxKind.ExpressionStatement */ ||
441
+ parent.kind === 223 /* SyntaxKind.VoidExpression */ ||
442
+ (parent.kind === 249 /* SyntaxKind.ForStatement */ &&
443
+ (parent.initializer === node || parent.incrementor === node)))
444
+ return true;
445
+ if (parent.kind === 227 /* SyntaxKind.BinaryExpression */ &&
446
+ parent.operatorToken.kind === 27 /* SyntaxKind.CommaToken */) {
447
+ // The left side of a comma is unused; the right side is when the comma is.
448
+ if (node === parent.left)
449
+ return true;
450
+ node = parent;
451
+ continue;
452
+ }
453
+ return false;
454
+ }
455
+ }
456
+ function getContainingFunctionLike(node) {
457
+ let current = node.parent;
458
+ while (current !== undefined && !isFunctionLike(current))
459
+ current = current.parent;
460
+ return current;
461
+ }
462
+ // ---- Context sensitivity
463
+ /** Whether checking `node` depends on its contextual type. */
464
+ export function isContextSensitive(c, node) {
465
+ switch (node.kind) {
466
+ case 219 /* SyntaxKind.FunctionExpression */:
467
+ case 220 /* SyntaxKind.ArrowFunction */:
468
+ case 175 /* SyntaxKind.MethodDeclaration */:
469
+ case 263 /* SyntaxKind.FunctionDeclaration */:
470
+ return isContextSensitiveFunctionLikeDeclaration(c, node);
471
+ case 211 /* SyntaxKind.ObjectLiteralExpression */:
472
+ for (const p of getProperties(node).nodes)
473
+ if (isContextSensitive(c, p))
474
+ return true;
475
+ return false;
476
+ case 210 /* SyntaxKind.ArrayLiteralExpression */:
477
+ for (const e of getElements(node).nodes)
478
+ if (isContextSensitive(c, e))
479
+ return true;
480
+ return false;
481
+ case 228 /* SyntaxKind.ConditionalExpression */: {
482
+ const cond = node;
483
+ return isContextSensitive(c, cond.whenTrue) || isContextSensitive(c, cond.whenFalse);
484
+ }
485
+ case 227 /* SyntaxKind.BinaryExpression */: {
486
+ const binary = node;
487
+ const op = binary.operatorToken.kind;
488
+ return ((op === 56 /* SyntaxKind.BarBarToken */ || op === 60 /* SyntaxKind.QuestionQuestionToken */) &&
489
+ (isContextSensitive(c, binary.left) || isContextSensitive(c, binary.right)));
490
+ }
491
+ case 303 /* SyntaxKind.PropertyAssignment */:
492
+ return isContextSensitive(c, getInitializer(node));
493
+ case 218 /* SyntaxKind.ParenthesizedExpression */:
494
+ return isContextSensitive(c, getExpression(node));
495
+ case 293 /* SyntaxKind.JsxAttributes */:
496
+ return isJsxAttributesContextSensitive(c, node);
497
+ case 292 /* SyntaxKind.JsxAttribute */: {
498
+ // Without an initializer an attribute is `true`.
499
+ const initializer = getInitializer(node);
500
+ return initializer !== undefined && isContextSensitive(c, initializer);
501
+ }
502
+ case 295 /* SyntaxKind.JsxExpression */: {
503
+ const expression = getExpression(node);
504
+ return expression !== undefined && isContextSensitive(c, expression);
505
+ }
506
+ }
507
+ return false;
508
+ }
509
+ function isContextSensitiveFunctionLikeDeclaration(c, node) {
510
+ return (hasContextSensitiveParameters(node) ||
511
+ hasContextSensitiveReturnExpression(c, node) ||
512
+ hasContextSensitiveYieldExpression(c, node));
513
+ }
514
+ /**
515
+ * The type predicate a function without a return type annotation implies, as `x is string` for
516
+ * `(x: string | number) => typeof x === "string"`: its single return expression must narrow a parameter
517
+ * to a type in the true branch and to `never` from that type in the false branch.
518
+ */
519
+ export function getTypePredicateFromBody(c, fn) {
520
+ switch (fn.kind) {
521
+ case 177 /* SyntaxKind.Constructor */:
522
+ case 178 /* SyntaxKind.GetAccessor */:
523
+ case 179 /* SyntaxKind.SetAccessor */:
524
+ return undefined;
525
+ }
526
+ if (getFunctionFlags(fn) !== 0 /* FunctionFlags.Normal */)
527
+ return undefined;
528
+ const body = getBody(fn);
529
+ let singleReturn = undefined;
530
+ if (body !== undefined && body.kind !== 242 /* SyntaxKind.Block */)
531
+ singleReturn = body;
532
+ else {
533
+ if (body === undefined)
534
+ return undefined;
535
+ const collector = new ReturnCollector();
536
+ collector.visitStatements(body);
537
+ if (collector.returns.length !== 1)
538
+ return undefined;
539
+ singleReturn = collector.returns[0].expression;
540
+ if (singleReturn === undefined || functionHasImplicitReturn(c, fn))
541
+ return undefined;
542
+ }
543
+ return checkIfExpressionRefinesAnyParameter(c, fn, singleReturn);
544
+ }
545
+ function checkIfExpressionRefinesAnyParameter(c, fn, exprIn) {
546
+ const expr = skipParentheses(exprIn);
547
+ const returnType = checkExpressionCached(c, expr);
548
+ if ((returnType.flags & 256 /* TypeFlags.Boolean */) === 0)
549
+ return undefined;
550
+ const parameters = getParameters(fn).nodes;
551
+ for (let i = 0; i < parameters.length; i++) {
552
+ const param = parameters[i];
553
+ const symbol = getSymbol(param);
554
+ const name = getName(param);
555
+ if (symbol === undefined || name === undefined)
556
+ continue;
557
+ const initType = getTypeOfSymbol(c, symbol);
558
+ // Refining `x: boolean` to `x is true` or `x is false` isn't useful.
559
+ if ((initType.flags & 256 /* TypeFlags.Boolean */) !== 0 ||
560
+ name.kind !== 79 /* SyntaxKind.Identifier */ ||
561
+ isSymbolAssigned(c, symbol) ||
562
+ getDotDotDotToken(param) !== undefined)
563
+ continue;
564
+ const trueType = checkIfExpressionRefinesParameter(c, fn, expr, name, initType);
565
+ if (trueType !== undefined)
566
+ return new TypePredicate(1 /* TypePredicateKind.Identifier */, getText(name), i, trueType);
567
+ }
568
+ return undefined;
569
+ }
570
+ function checkIfExpressionRefinesParameter(c, fn, expr, name, initType) {
571
+ let antecedent = getFlowNode(expr);
572
+ if (antecedent === undefined && expr.parent.kind === 254 /* SyntaxKind.ReturnStatement */)
573
+ antecedent = getFlowNode(expr.parent);
574
+ if (antecedent === undefined)
575
+ antecedent = new FlowNode(2 /* FlowFlags.Start */, undefined, undefined);
576
+ const trueCondition = new FlowNode(32 /* FlowFlags.TrueCondition */, expr, antecedent);
577
+ const trueType = getFlowTypeOfReferenceAt(c, name, initType, initType, fn, trueCondition);
578
+ if (trueType === initType)
579
+ return undefined;
580
+ // `x is T` also means x isn't T when the function returns false, so nothing of T may remain there.
581
+ const falseCondition = new FlowNode(64 /* FlowFlags.FalseCondition */, expr, antecedent);
582
+ const falseSubtype = getReducedType(c, getFlowTypeOfReferenceAt(c, name, initType, trueType, fn, falseCondition));
583
+ return (falseSubtype.flags & 262144 /* TypeFlags.Never */) !== 0 ? trueType : undefined;
584
+ }
585
+ function hasContextSensitiveReturnExpression(c, node) {
586
+ if (getTypeParameters(node) !== undefined || getType(node) !== undefined)
587
+ return false;
588
+ const body = getBody(node);
589
+ if (body === undefined)
590
+ return false;
591
+ if (body.kind !== 242 /* SyntaxKind.Block */)
592
+ return isContextSensitive(c, body);
593
+ const collector = new ReturnCollector();
594
+ collector.visitStatements(body);
595
+ for (const ret of collector.returns)
596
+ if (ret.expression !== undefined && isContextSensitive(c, ret.expression))
597
+ return true;
598
+ return false;
599
+ }
600
+ function hasContextSensitiveYieldExpression(c, node) {
601
+ if ((getFunctionFlags(node) & 1 /* FunctionFlags.Generator */) === 0)
602
+ return false;
603
+ const body = getBody(node);
604
+ if (body === undefined)
605
+ return false;
606
+ const finder = new YieldFinder(c);
607
+ body.forEachChild(finder);
608
+ return finder.found;
609
+ }
610
+ /** Finds a context-sensitive `yield` operand, skipping nested functions. */
611
+ class YieldFinder extends NodeVisitor {
612
+ c;
613
+ found = false;
614
+ constructor(c) {
615
+ super();
616
+ this.c = c;
617
+ }
618
+ visitNode(node) {
619
+ if (node.kind === 230 /* SyntaxKind.YieldExpression */) {
620
+ const expression = getExpression(node);
621
+ if (expression !== undefined && isContextSensitive(this.c, expression)) {
622
+ this.found = true;
623
+ return true;
624
+ }
625
+ }
626
+ if (isFunctionLikeOrClass(node))
627
+ return false;
628
+ return node.forEachChild(this);
629
+ }
630
+ }
631
+ function isFunctionLikeOrClass(node) {
632
+ switch (node.kind) {
633
+ case 263 /* SyntaxKind.FunctionDeclaration */:
634
+ case 219 /* SyntaxKind.FunctionExpression */:
635
+ case 220 /* SyntaxKind.ArrowFunction */:
636
+ case 175 /* SyntaxKind.MethodDeclaration */:
637
+ case 178 /* SyntaxKind.GetAccessor */:
638
+ case 179 /* SyntaxKind.SetAccessor */:
639
+ case 177 /* SyntaxKind.Constructor */:
640
+ case 264 /* SyntaxKind.ClassDeclaration */:
641
+ case 232 /* SyntaxKind.ClassExpression */:
642
+ return true;
643
+ }
644
+ return false;
645
+ }
646
+ // ---- Return type inference
647
+ /** The return type inferred from a function's body. */
648
+ export function getReturnTypeFromBody(c, func) {
649
+ return getReturnTypeFromBodyEx(c, func, 0 /* CheckMode.Normal */);
650
+ }
651
+ function checkExpressionCachedEx(c, node, checkMode) {
652
+ return checkMode !== 0 /* CheckMode.Normal */ ? checkExpressionEx(c, node, checkMode) : checkExpressionCached(c, node);
653
+ }
654
+ export function getReturnTypeFromBodyEx(c, func, checkMode) {
655
+ checkMode &= ~8 /* CheckMode.SkipGenericFunctions */;
656
+ const body = getBody(func);
657
+ if (body === undefined)
658
+ return c.errorType;
659
+ const functionFlags = getFunctionFlags(func);
660
+ const isAsync = (functionFlags & 2 /* FunctionFlags.Async */) !== 0;
661
+ const isGenerator = (functionFlags & 1 /* FunctionFlags.Generator */) !== 0;
662
+ let returnType;
663
+ let yieldType;
664
+ let nextType;
665
+ let fallbackReturnType = c.voidType;
666
+ if (body.kind !== 242 /* SyntaxKind.Block */) {
667
+ returnType = checkExpressionCachedEx(c, body, checkMode);
668
+ if (isConstContext(c, body))
669
+ returnType = getRegularTypeOfLiteralType(c, returnType);
670
+ // An async body may return a promise or a value; its awaited type is wrapped in `Promise<T>` below.
671
+ if (isAsync)
672
+ returnType = unwrapAwaitedType(c, checkAwaitedType(c, returnType, false, func, 43 /* Diagnostics.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member */));
673
+ }
674
+ else if (isGenerator) {
675
+ const returnTypes = checkAndAggregateReturnExpressionTypes(c, func, checkMode);
676
+ if (returnTypes === undefined)
677
+ fallbackReturnType = c.neverType;
678
+ else if (returnTypes.length !== 0)
679
+ returnType = getUnionTypeEx(c, returnTypes, 2 /* UnionReduction.Subtype */, undefined, undefined);
680
+ const yields = checkAndAggregateYieldOperandTypes(c, func, checkMode);
681
+ if (yields.yieldTypes.length !== 0)
682
+ yieldType = getUnionTypeEx(c, yields.yieldTypes, 2 /* UnionReduction.Subtype */, undefined, undefined);
683
+ if (yields.nextTypes.length !== 0)
684
+ nextType = getIntersectionType(c, yields.nextTypes);
685
+ }
686
+ else {
687
+ const types = checkAndAggregateReturnExpressionTypes(c, func, checkMode);
688
+ // An async function returns `Promise<never>`, not `never`.
689
+ if (types === undefined)
690
+ return isAsync ? createPromiseReturnType(c, func, c.neverType) : c.neverType;
691
+ if (types.length === 0) {
692
+ // `undefined` rather than `void` when the contextual return type includes `undefined`.
693
+ const contextualReturnType = getContextualReturnType(c, func);
694
+ const t = contextualReturnType !== undefined &&
695
+ someType(unwrapReturnType(c, contextualReturnType, functionFlags), (u) => (u.flags & 4 /* TypeFlags.Undefined */) !== 0)
696
+ ? c.undefinedType
697
+ : c.voidType;
698
+ return isAsync ? createPromiseReturnType(c, func, t) : t;
699
+ }
700
+ returnType = getUnionTypeEx(c, types, 2 /* UnionReduction.Subtype */, undefined, undefined);
701
+ }
702
+ if (returnType !== undefined || yieldType !== undefined || nextType !== undefined) {
703
+ if (yieldType !== undefined)
704
+ reportErrorsFromWidening(c, func, yieldType, 3 /* WideningKind.GeneratorYield */);
705
+ if (returnType !== undefined)
706
+ reportErrorsFromWidening(c, func, returnType, 1 /* WideningKind.FunctionReturn */);
707
+ if (nextType !== undefined)
708
+ reportErrorsFromWidening(c, func, nextType, 2 /* WideningKind.GeneratorNext */);
709
+ if ((returnType !== undefined && isUnitType(returnType)) ||
710
+ (yieldType !== undefined && isUnitType(yieldType)) ||
711
+ (nextType !== undefined && isUnitType(nextType))) {
712
+ const contextualSignature = getContextualSignatureForFunctionLikeDeclaration(c, func);
713
+ let contextualType;
714
+ if (contextualSignature === undefined)
715
+ contextualType = undefined;
716
+ else if (contextualSignature === getSignatureFromDeclaration(c, func))
717
+ contextualType = isGenerator ? undefined : returnType;
718
+ else
719
+ contextualType = instantiateContextualType(c, getReturnTypeOfSignature(c, contextualSignature), func, 0 /* ContextFlags.None */);
720
+ if (isGenerator) {
721
+ yieldType = getWidenedLiteralLikeTypeForContextualIterationTypeIfNeeded(c, yieldType, contextualType, 0 /* IterationTypeKind.Yield */, isAsync);
722
+ returnType = getWidenedLiteralLikeTypeForContextualIterationTypeIfNeeded(c, returnType, contextualType, 1 /* IterationTypeKind.Return */, isAsync);
723
+ nextType = getWidenedLiteralLikeTypeForContextualIterationTypeIfNeeded(c, nextType, contextualType, 2 /* IterationTypeKind.Next */, isAsync);
724
+ }
725
+ else if (returnType !== undefined && isUnitType(returnType)) {
726
+ const contextualReturnType = contextualType !== undefined && isAsync ? getPromisedTypeOfPromise(c, contextualType) : contextualType;
727
+ returnType = getWidenedLiteralLikeTypeForContextualType(c, returnType, contextualReturnType);
728
+ }
729
+ }
730
+ if (yieldType !== undefined)
731
+ yieldType = getWidenedType(c, yieldType);
732
+ if (returnType !== undefined)
733
+ returnType = getWidenedType(c, returnType);
734
+ if (nextType !== undefined)
735
+ nextType = getWidenedType(c, nextType);
736
+ }
737
+ if (isGenerator)
738
+ return createGeneratorType(c, yieldType ?? c.neverType, returnType ?? fallbackReturnType, nextType ?? getContextualIterationType(c, 2 /* IterationTypeKind.Next */, func) ?? c.unknownType, isAsync);
739
+ // An async function's body returns its awaited type, wrapped in `Promise<T>`.
740
+ return isAsync ? createPromiseType(c, returnType ?? fallbackReturnType) : (returnType ?? fallbackReturnType);
741
+ }
742
+ /**
743
+ * Whether the widened types inferred for a function report implicit `any`: without a contextual
744
+ * signature, or when the contextual return, yield or next type is generic.
745
+ */
746
+ export function shouldReportErrorsFromWideningWithContextualSignature(c, declaration, wideningKind) {
747
+ const signature = getContextualSignatureForFunctionLikeDeclaration(c, declaration);
748
+ if (signature === undefined)
749
+ return true;
750
+ let returnType = getReturnTypeOfSignature(c, signature);
751
+ const flags = getFunctionFlags(declaration);
752
+ const isAsync = (flags & 2 /* FunctionFlags.Async */) !== 0;
753
+ switch (wideningKind) {
754
+ case 1 /* WideningKind.FunctionReturn */:
755
+ if ((flags & 1 /* FunctionFlags.Generator */) !== 0)
756
+ returnType =
757
+ getIterationTypeOfGeneratorFunctionReturnType(c, 1 /* IterationTypeKind.Return */, returnType, isAsync) ?? returnType;
758
+ else if (isAsync)
759
+ returnType = getAwaitedTypeNoAlias(c, returnType) ?? returnType;
760
+ return isGenericType(c, returnType);
761
+ case 3 /* WideningKind.GeneratorYield */: {
762
+ const yieldType = getIterationTypeOfGeneratorFunctionReturnType(c, 0 /* IterationTypeKind.Yield */, returnType, isAsync);
763
+ return yieldType !== undefined && isGenericType(c, yieldType);
764
+ }
765
+ case 2 /* WideningKind.GeneratorNext */: {
766
+ const nextType = getIterationTypeOfGeneratorFunctionReturnType(c, 2 /* IterationTypeKind.Next */, returnType, isAsync);
767
+ return nextType !== undefined && isGenericType(c, nextType);
768
+ }
769
+ }
770
+ return false;
771
+ }
772
+ function getWidenedLiteralLikeTypeForContextualIterationTypeIfNeeded(c, t, contextualSignatureReturnType, kind, isAsyncGenerator) {
773
+ if (t === undefined || !isUnitType(t))
774
+ return t;
775
+ const contextualType = contextualSignatureReturnType !== undefined
776
+ ? getIterationTypeOfGeneratorFunctionReturnType(c, kind, contextualSignatureReturnType, isAsyncGenerator)
777
+ : undefined;
778
+ return getWidenedLiteralLikeTypeForContextualType(c, t, contextualType);
779
+ }
780
+ /** The types of a body's returned expressions, or undefined for a function that never returns. */
781
+ function checkAndAggregateReturnExpressionTypes(c, func, checkMode) {
782
+ const isAsync = (getFunctionFlags(func) & 2 /* FunctionFlags.Async */) !== 0;
783
+ const aggregatedTypes = [];
784
+ let hasReturnWithNoExpression = functionHasImplicitReturn(c, func);
785
+ let hasReturnOfTypeNever = false;
786
+ const collector = new ReturnCollector();
787
+ collector.visitStatements(getBody(func));
788
+ for (const ret of collector.returns) {
789
+ let expr = ret.expression;
790
+ if (expr === undefined) {
791
+ hasReturnWithNoExpression = true;
792
+ continue;
793
+ }
794
+ expr = skipParentheses(expr);
795
+ // `return await` unwraps in async functions, and bare calls of the function itself don't contribute.
796
+ if (isAsync && expr.kind === 224 /* SyntaxKind.AwaitExpression */)
797
+ expr = skipParentheses(getExpression(expr));
798
+ if (isRecursiveCall(c, func, expr)) {
799
+ hasReturnOfTypeNever = true;
800
+ continue;
801
+ }
802
+ let t = checkExpressionCachedEx(c, expr, checkMode);
803
+ // An async function's returned promises are awaited; the caller wraps the result in `Promise<T>`.
804
+ if (isAsync)
805
+ t = unwrapAwaitedType(c, checkAwaitedType(c, t, false, func, 43 /* Diagnostics.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member */));
806
+ if ((t.flags & 262144 /* TypeFlags.Never */) !== 0)
807
+ hasReturnOfTypeNever = true;
808
+ if (isConstContext(c, expr))
809
+ t = getRegularTypeOfLiteralType(c, t);
810
+ if (!aggregatedTypes.includes(t))
811
+ aggregatedTypes.push(t);
812
+ }
813
+ if (aggregatedTypes.length === 0 && !hasReturnWithNoExpression && (hasReturnOfTypeNever || mayReturnNever(func)))
814
+ return undefined;
815
+ if (c.strictNullChecks &&
816
+ aggregatedTypes.length !== 0 &&
817
+ hasReturnWithNoExpression &&
818
+ !aggregatedTypes.includes(c.undefinedType))
819
+ aggregatedTypes.push(c.undefinedType);
820
+ return aggregatedTypes;
821
+ }
822
+ function isRecursiveCall(c, func, expr) {
823
+ if (expr.kind !== 214 /* SyntaxKind.CallExpression */)
824
+ return false;
825
+ const callee = getExpression(expr);
826
+ if (callee.kind !== 79 /* SyntaxKind.Identifier */)
827
+ return false;
828
+ const symbol = getSymbol(func);
829
+ if (symbol === undefined || checkExpressionCached(c, callee).symbol !== getMergedSymbol(c, symbol))
830
+ return false;
831
+ const valueDeclaration = symbol.valueDeclaration;
832
+ return (valueDeclaration === undefined ||
833
+ !isFunctionExpressionOrArrowFunction(valueDeclaration) ||
834
+ isConstantReference(c, callee));
835
+ }
836
+ function mayReturnNever(func) {
837
+ switch (func.kind) {
838
+ case 219 /* SyntaxKind.FunctionExpression */:
839
+ case 220 /* SyntaxKind.ArrowFunction */:
840
+ return true;
841
+ case 175 /* SyntaxKind.MethodDeclaration */:
842
+ return func.parent.kind === 211 /* SyntaxKind.ObjectLiteralExpression */;
843
+ }
844
+ return false;
845
+ }
846
+ class YieldOperandTypes {
847
+ yieldTypes = [];
848
+ nextTypes = [];
849
+ }
850
+ function checkAndAggregateYieldOperandTypes(c, func, checkMode) {
851
+ const isAsync = (getFunctionFlags(func) & 2 /* FunctionFlags.Async */) !== 0;
852
+ const result = new YieldOperandTypes();
853
+ const collector = new YieldCollector();
854
+ collector.visit(getBody(func));
855
+ for (const yieldExpr of collector.yields) {
856
+ const operand = yieldExpr.expression;
857
+ let yieldExprType = operand !== undefined ? checkExpressionEx(c, operand, checkMode) : c.undefinedWideningType;
858
+ if (operand !== undefined && isConstContext(c, operand))
859
+ yieldExprType = getRegularTypeOfLiteralType(c, yieldExprType);
860
+ const yieldedType = getYieldedTypeOfYieldExpression(c, yieldExpr, yieldExprType, c.anyType, isAsync);
861
+ if (yieldedType !== undefined && !result.yieldTypes.includes(yieldedType))
862
+ result.yieldTypes.push(yieldedType);
863
+ const nextType = yieldExpr.asteriskToken !== undefined
864
+ ? getIterationTypesOfIterable(c, yieldExprType, isAsync ? 19 /* IterationUse.AsyncYieldStar */ : 17 /* IterationUse.YieldStar */, operand).nextType
865
+ : getContextualType(c, yieldExpr);
866
+ if (nextType !== undefined && !result.nextTypes.includes(nextType))
867
+ result.nextTypes.push(nextType);
868
+ }
869
+ return result;
870
+ }
871
+ /**
872
+ * Collects the `yield` expressions of a generator body, skipping nested functions and types. A class's
873
+ * `extends` expression is an expression, not a type.
874
+ */
875
+ class YieldCollector extends NodeVisitor {
876
+ yields = [];
877
+ visit(node) {
878
+ switch (node.kind) {
879
+ case 230 /* SyntaxKind.YieldExpression */: {
880
+ this.yields.push(node);
881
+ const operand = node.expression;
882
+ if (operand !== undefined)
883
+ this.visit(operand);
884
+ return;
885
+ }
886
+ case 267 /* SyntaxKind.EnumDeclaration */:
887
+ case 265 /* SyntaxKind.InterfaceDeclaration */:
888
+ case 268 /* SyntaxKind.ModuleDeclaration */:
889
+ case 266 /* SyntaxKind.TypeAliasDeclaration */:
890
+ return;
891
+ }
892
+ if (isFunctionLike(node)) {
893
+ // Nested functions are skipped, but not their computed names.
894
+ const name = getName(node);
895
+ if (name !== undefined && name.kind === 168 /* SyntaxKind.ComputedPropertyName */)
896
+ this.visit(getExpression(name));
897
+ return;
898
+ }
899
+ if (!isPartOfTypeNode(node))
900
+ node.forEachChild(this);
901
+ }
902
+ visitNode(node) {
903
+ this.visit(node);
904
+ return false;
905
+ }
906
+ }
907
+ /** Collects the return statements of a function body, skipping nested functions and classes. */
908
+ export class ReturnCollector {
909
+ returns = [];
910
+ visitStatements(block) {
911
+ for (const s of block.statements.nodes)
912
+ this.visit(s);
913
+ }
914
+ visit(node) {
915
+ switch (node.kind) {
916
+ case 254 /* SyntaxKind.ReturnStatement */:
917
+ this.returns.push(node);
918
+ return;
919
+ case 263 /* SyntaxKind.FunctionDeclaration */:
920
+ case 219 /* SyntaxKind.FunctionExpression */:
921
+ case 220 /* SyntaxKind.ArrowFunction */:
922
+ case 264 /* SyntaxKind.ClassDeclaration */:
923
+ case 232 /* SyntaxKind.ClassExpression */:
924
+ case 175 /* SyntaxKind.MethodDeclaration */:
925
+ case 178 /* SyntaxKind.GetAccessor */:
926
+ case 179 /* SyntaxKind.SetAccessor */:
927
+ case 177 /* SyntaxKind.Constructor */:
928
+ case 265 /* SyntaxKind.InterfaceDeclaration */:
929
+ case 266 /* SyntaxKind.TypeAliasDeclaration */:
930
+ case 267 /* SyntaxKind.EnumDeclaration */:
931
+ case 268 /* SyntaxKind.ModuleDeclaration */:
932
+ return;
933
+ }
934
+ if (isStatementContainer(node))
935
+ node.forEachChild(new ReturnVisitor(this));
936
+ }
937
+ }
938
+ function isStatementContainer(node) {
939
+ switch (node.kind) {
940
+ case 242 /* SyntaxKind.Block */:
941
+ case 246 /* SyntaxKind.IfStatement */:
942
+ case 247 /* SyntaxKind.DoStatement */:
943
+ case 248 /* SyntaxKind.WhileStatement */:
944
+ case 249 /* SyntaxKind.ForStatement */:
945
+ case 250 /* SyntaxKind.ForInStatement */:
946
+ case 251 /* SyntaxKind.ForOfStatement */:
947
+ case 255 /* SyntaxKind.WithStatement */:
948
+ case 256 /* SyntaxKind.SwitchStatement */:
949
+ case 270 /* SyntaxKind.CaseBlock */:
950
+ case 297 /* SyntaxKind.CaseClause */:
951
+ case 298 /* SyntaxKind.DefaultClause */:
952
+ case 257 /* SyntaxKind.LabeledStatement */:
953
+ case 259 /* SyntaxKind.TryStatement */:
954
+ case 300 /* SyntaxKind.CatchClause */:
955
+ return true;
956
+ }
957
+ return false;
958
+ }
959
+ class ReturnVisitor extends NodeVisitor {
960
+ collector;
961
+ constructor(collector) {
962
+ super();
963
+ this.collector = collector;
964
+ }
965
+ visitNode(node) {
966
+ this.collector.visit(node);
967
+ return false;
968
+ }
969
+ }
970
+ function assignParameterType(c, declaration) {
971
+ const symbol = getSymbolOfDeclaration(c, declaration);
972
+ if (symbol === undefined)
973
+ return;
974
+ const id = getSymbolId(symbol);
975
+ if (c.symbolTypes.get(id) !== undefined)
976
+ return;
977
+ const t = getTypeOfSymbol(c, symbol);
978
+ c.symbolTypes.set(id, addOptionality(c, t, false, getInitializer(declaration) === undefined && isOptionalDeclaration(declaration)));
979
+ const name = getName(declaration);
980
+ if (name !== undefined &&
981
+ (name.kind === 207 /* SyntaxKind.ObjectBindingPattern */ || name.kind === 208 /* SyntaxKind.ArrayBindingPattern */)) {
982
+ // Without a better inference than `unknown`, a binding pattern implies the type.
983
+ if (c.symbolTypes.get(id) === c.unknownType)
984
+ c.symbolTypes.set(id, getTypeFromBindingPattern(c, name, false, false));
985
+ assignBindingElementTypes(c, name, c.symbolTypes.get(id));
986
+ }
987
+ }
988
+ /** Pushes a contextually assigned parameter type into the binding elements of its pattern. */
989
+ function assignBindingElementTypes(c, pattern, parentType) {
990
+ for (const element of getElements(pattern).nodes) {
991
+ if (element.kind !== 209 /* SyntaxKind.BindingElement */)
992
+ continue;
993
+ const name = getName(element);
994
+ if (name === undefined)
995
+ continue;
996
+ const t = getBindingElementTypeFromParentType(c, element, parentType, false);
997
+ if (name.kind === 79 /* SyntaxKind.Identifier */)
998
+ c.symbolTypes.set(getSymbolId(getSymbolOfDeclaration(c, element)), t);
999
+ else
1000
+ assignBindingElementTypes(c, name, t);
1001
+ }
1002
+ }