tsc-ts 0.0.4 → 0.0.6

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 (584) hide show
  1. package/README.md +34 -2
  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 +2351 -0
  5. package/dist/api/compiler/ast.js +11212 -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 +1241 -0
  10. package/dist/api/compiler/binder.d.ts +33 -0
  11. package/dist/api/compiler/binder.js +2359 -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 +1641 -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 +357 -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 +788 -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 +314 -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 +291 -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 +580 -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 +2587 -0
  54. package/dist/api/compiler/checker-heritage.d.ts +28 -0
  55. package/dist/api/compiler/checker-heritage.js +901 -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 +442 -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 +200 -0
  69. package/dist/api/compiler/checker-members.js +2148 -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 +483 -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 +271 -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 +789 -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 +51 -0
  93. package/dist/api/compiler/checker-symbol-types.js +955 -0
  94. package/dist/api/compiler/checker-symbols.d.ts +181 -0
  95. package/dist/api/compiler/checker-symbols.js +1784 -0
  96. package/dist/api/compiler/checker-type-factory.d.ts +142 -0
  97. package/dist/api/compiler/checker-type-factory.js +2542 -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 +1093 -0
  103. package/dist/api/compiler/checker-types.js +1874 -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 +512 -0
  109. package/dist/api/compiler/checker.js +932 -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 +161 -0
  119. package/dist/api/compiler/diagnostics.js +784 -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 +144 -0
  123. package/dist/api/compiler/file-include.js +599 -0
  124. package/dist/api/compiler/file-loader.d.ts +290 -0
  125. package/dist/api/compiler/file-loader.js +1323 -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 +835 -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 +105 -0
  135. package/dist/api/compiler/link-tables.js +319 -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 +745 -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 +221 -0
  191. package/dist/api/compiler/parallel-parse.js +541 -0
  192. package/dist/api/compiler/parser.d.ts +604 -0
  193. package/dist/api/compiler/parser.js +6426 -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 +157 -0
  203. package/dist/api/compiler/printer/emit-context.js +582 -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 +529 -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 +1019 -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 +991 -0
  244. package/dist/api/compiler/symbol.d.ts +282 -0
  245. package/dist/api/compiler/symbol.js +339 -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 +677 -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 +539 -0
  268. package/dist/api/compiler/transformers/declarations-pseudo.d.ts +160 -0
  269. package/dist/api/compiler/transformers/declarations-pseudo.js +799 -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 +198 -0
  276. package/dist/api/compiler/transformers/declarations.d.ts +175 -0
  277. package/dist/api/compiler/transformers/declarations.js +2381 -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 +129 -0
  321. package/dist/api/compiler/transformers/reference-resolver.js +1157 -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 +10 -0
  325. package/dist/api/compiler/transformers/subtree-facts.js +205 -0
  326. package/dist/api/compiler/transformers/syntax-facts.d.ts +52 -0
  327. package/dist/api/compiler/transformers/syntax-facts.js +258 -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 +3 -2
  357. package/dist/api/library/ast.generated.d.ts +127 -139
  358. package/dist/api/library/checker.d.ts +51 -0
  359. package/dist/api/library/checker.js +318 -0
  360. package/dist/api/library/diagnostics.d.ts +13 -0
  361. package/dist/api/library/diagnostics.js +50 -0
  362. package/dist/api/library/disk.d.ts +13 -0
  363. package/dist/api/library/disk.js +66 -0
  364. package/dist/api/library/errors.d.ts +13 -0
  365. package/dist/api/library/errors.js +24 -0
  366. package/dist/api/library/host.d.ts +24 -0
  367. package/dist/api/library/host.js +52 -0
  368. package/dist/api/library/index.d.ts +5 -1
  369. package/dist/api/library/index.js +4 -0
  370. package/dist/api/library/nodes.d.ts +51 -0
  371. package/dist/api/library/nodes.js +196 -0
  372. package/dist/api/library/options.d.ts +144 -0
  373. package/dist/api/library/options.js +308 -0
  374. package/dist/api/library/parse.d.ts +19 -0
  375. package/dist/api/library/parse.js +41 -0
  376. package/dist/api/library/program.d.ts +21 -0
  377. package/dist/api/library/program.js +234 -0
  378. package/dist/api/library/types.d.ts +14 -1
  379. package/package.json +12 -8
  380. package/src/compiler/ast-utilities.ts +548 -0
  381. package/src/compiler/ast.ts +12870 -0
  382. package/src/compiler/astnav.ts +799 -0
  383. package/src/compiler/binder-utilities.ts +1392 -0
  384. package/src/compiler/binder.ts +2707 -0
  385. package/src/compiler/build-info.ts +1197 -0
  386. package/src/compiler/character-codes.ts +323 -0
  387. package/src/compiler/checker-calls.ts +2155 -0
  388. package/src/compiler/checker-classes.ts +706 -0
  389. package/src/compiler/checker-contextual.ts +1457 -0
  390. package/src/compiler/checker-declaration-order.ts +438 -0
  391. package/src/compiler/checker-declarations.ts +1201 -0
  392. package/src/compiler/checker-declared-types.ts +919 -0
  393. package/src/compiler/checker-decorators.ts +694 -0
  394. package/src/compiler/checker-deprecation.ts +355 -0
  395. package/src/compiler/checker-destructuring.ts +805 -0
  396. package/src/compiler/checker-elaboration.ts +477 -0
  397. package/src/compiler/checker-emit-helpers.ts +224 -0
  398. package/src/compiler/checker-emit-resolver.ts +769 -0
  399. package/src/compiler/checker-evaluator.ts +243 -0
  400. package/src/compiler/checker-expressions.ts +1831 -0
  401. package/src/compiler/checker-features.ts +361 -0
  402. package/src/compiler/checker-flow.ts +394 -0
  403. package/src/compiler/checker-functions.ts +1296 -0
  404. package/src/compiler/checker-generated-code.ts +227 -0
  405. package/src/compiler/checker-globals.ts +52 -0
  406. package/src/compiler/checker-grammar.ts +3596 -0
  407. package/src/compiler/checker-heritage.ts +1240 -0
  408. package/src/compiler/checker-inference.ts +2584 -0
  409. package/src/compiler/checker-iteration.ts +1206 -0
  410. package/src/compiler/checker-javascript.ts +502 -0
  411. package/src/compiler/checker-jsdoc.ts +360 -0
  412. package/src/compiler/checker-jsx.ts +1928 -0
  413. package/src/compiler/checker-literals.ts +61 -0
  414. package/src/compiler/checker-members.ts +2480 -0
  415. package/src/compiler/checker-modules.ts +2896 -0
  416. package/src/compiler/checker-narrowing.ts +3230 -0
  417. package/src/compiler/checker-object-literals.ts +591 -0
  418. package/src/compiler/checker-operators.ts +1422 -0
  419. package/src/compiler/checker-overloads.ts +328 -0
  420. package/src/compiler/checker-property-access.ts +906 -0
  421. package/src/compiler/checker-services.ts +1149 -0
  422. package/src/compiler/checker-signatures.ts +1032 -0
  423. package/src/compiler/checker-source-file.ts +732 -0
  424. package/src/compiler/checker-statements.ts +292 -0
  425. package/src/compiler/checker-super.ts +261 -0
  426. package/src/compiler/checker-symbol-types.ts +1187 -0
  427. package/src/compiler/checker-symbols.ts +2157 -0
  428. package/src/compiler/checker-type-factory.ts +2616 -0
  429. package/src/compiler/checker-type-nodes.ts +1033 -0
  430. package/src/compiler/checker-type-operators.ts +2510 -0
  431. package/src/compiler/checker-types.ts +2520 -0
  432. package/src/compiler/checker-unused.ts +642 -0
  433. package/src/compiler/checker-utilities.ts +161 -0
  434. package/src/compiler/checker.ts +1138 -0
  435. package/src/compiler/command-line.ts +436 -0
  436. package/src/compiler/compile-program.ts +439 -0
  437. package/src/compiler/decoder.ts +1209 -0
  438. package/src/compiler/diagnostic-locales.ts +86 -0
  439. package/src/compiler/diagnostic-messages.ts +2349 -0
  440. package/src/compiler/diagnostics.ts +858 -0
  441. package/src/compiler/emitter.ts +434 -0
  442. package/src/compiler/encoder.ts +1945 -0
  443. package/src/compiler/file-include.ts +741 -0
  444. package/src/compiler/file-loader.ts +1597 -0
  445. package/src/compiler/file-system.ts +143 -0
  446. package/src/compiler/flow.ts +89 -0
  447. package/src/compiler/help.ts +473 -0
  448. package/src/compiler/incremental.ts +2818 -0
  449. package/src/compiler/init.ts +141 -0
  450. package/src/compiler/instantiation.ts +938 -0
  451. package/src/compiler/jsdoc.ts +1386 -0
  452. package/src/compiler/link-tables.ts +343 -0
  453. package/src/compiler/locale-data.ts +203 -0
  454. package/src/compiler/locale.ts +307 -0
  455. package/src/compiler/locales/cs-CZ.ts +5 -0
  456. package/src/compiler/locales/de-DE.ts +5 -0
  457. package/src/compiler/locales/es-ES.ts +5 -0
  458. package/src/compiler/locales/fr-FR.ts +5 -0
  459. package/src/compiler/locales/it-IT.ts +5 -0
  460. package/src/compiler/locales/ja-JP.ts +5 -0
  461. package/src/compiler/locales/ko-KR.ts +5 -0
  462. package/src/compiler/locales/pl-PL.ts +5 -0
  463. package/src/compiler/locales/pt-BR.ts +5 -0
  464. package/src/compiler/locales/ru-RU.ts +5 -0
  465. package/src/compiler/locales/tr-TR.ts +5 -0
  466. package/src/compiler/locales/zh-CN.ts +5 -0
  467. package/src/compiler/locales/zh-TW.ts +5 -0
  468. package/src/compiler/module-resolution-types.ts +243 -0
  469. package/src/compiler/module-resolution.ts +2072 -0
  470. package/src/compiler/module-specifiers.ts +1491 -0
  471. package/src/compiler/name-resolver.ts +646 -0
  472. package/src/compiler/node-builder-names.ts +1071 -0
  473. package/src/compiler/node-builder-pseudo.ts +892 -0
  474. package/src/compiler/node-builder-reuse.ts +764 -0
  475. package/src/compiler/node-builder.ts +3433 -0
  476. package/src/compiler/option-declarations.ts +1560 -0
  477. package/src/compiler/options.ts +1576 -0
  478. package/src/compiler/output-paths.ts +334 -0
  479. package/src/compiler/package-json.ts +1083 -0
  480. package/src/compiler/parallel-check.ts +1954 -0
  481. package/src/compiler/parallel-parse.ts +595 -0
  482. package/src/compiler/parse-thread.ts +136 -0
  483. package/src/compiler/parser.ts +7766 -0
  484. package/src/compiler/path.ts +717 -0
  485. package/src/compiler/printer/async-helpers.ts +183 -0
  486. package/src/compiler/printer/auto-generate.ts +27 -0
  487. package/src/compiler/printer/decorator-helpers.ts +218 -0
  488. package/src/compiler/printer/emit-context.ts +684 -0
  489. package/src/compiler/printer/emit-flags.ts +64 -0
  490. package/src/compiler/printer/factory-base.ts +2577 -0
  491. package/src/compiler/printer/factory.ts +764 -0
  492. package/src/compiler/printer/helpers.ts +291 -0
  493. package/src/compiler/printer/name-generator.ts +372 -0
  494. package/src/compiler/printer/printer.ts +5072 -0
  495. package/src/compiler/printer/text-writer.ts +183 -0
  496. package/src/compiler/printer/utilities.ts +884 -0
  497. package/src/compiler/program-checker.ts +594 -0
  498. package/src/compiler/program-utilities.ts +435 -0
  499. package/src/compiler/program.ts +1426 -0
  500. package/src/compiler/pseudo-bigint.ts +62 -0
  501. package/src/compiler/regexp-checker.ts +1142 -0
  502. package/src/compiler/relations.ts +5149 -0
  503. package/src/compiler/reparser.ts +1566 -0
  504. package/src/compiler/scanner.ts +2951 -0
  505. package/src/compiler/show-config.ts +239 -0
  506. package/src/compiler/side-state.ts +125 -0
  507. package/src/compiler/sourcemap.ts +366 -0
  508. package/src/compiler/spelling.ts +122 -0
  509. package/src/compiler/symbol-accessibility.ts +1166 -0
  510. package/src/compiler/symbol.ts +557 -0
  511. package/src/compiler/symlinks.ts +137 -0
  512. package/src/compiler/syntax-kind.ts +391 -0
  513. package/src/compiler/thread-entry.ts +191 -0
  514. package/src/compiler/timeline.ts +53 -0
  515. package/src/compiler/transformers/alias-references.ts +757 -0
  516. package/src/compiler/transformers/async-utilities.ts +335 -0
  517. package/src/compiler/transformers/async.ts +838 -0
  518. package/src/compiler/transformers/class-fields.ts +2967 -0
  519. package/src/compiler/transformers/class-utilities.ts +324 -0
  520. package/src/compiler/transformers/commonjs-module.ts +1621 -0
  521. package/src/compiler/transformers/const-enum-inliner.ts +50 -0
  522. package/src/compiler/transformers/declarations-diagnostics.ts +833 -0
  523. package/src/compiler/transformers/declarations-pseudo.ts +969 -0
  524. package/src/compiler/transformers/declarations-resolver.ts +249 -0
  525. package/src/compiler/transformers/declarations-syntactic.ts +1867 -0
  526. package/src/compiler/transformers/declarations-tracker.ts +269 -0
  527. package/src/compiler/transformers/declarations.ts +3120 -0
  528. package/src/compiler/transformers/decorator-metadata.ts +697 -0
  529. package/src/compiler/transformers/decorator-utilities.ts +283 -0
  530. package/src/compiler/transformers/destructuring.ts +708 -0
  531. package/src/compiler/transformers/downlevel.ts +50 -0
  532. package/src/compiler/transformers/emit-resolver.ts +258 -0
  533. package/src/compiler/transformers/es-decorators.ts +2682 -0
  534. package/src/compiler/transformers/exponentiation.ts +80 -0
  535. package/src/compiler/transformers/external-module-info.ts +412 -0
  536. package/src/compiler/transformers/for-await.ts +687 -0
  537. package/src/compiler/transformers/import-elision.ts +152 -0
  538. package/src/compiler/transformers/jsx-entities.ts +256 -0
  539. package/src/compiler/transformers/jsx.ts +824 -0
  540. package/src/compiler/transformers/legacy-decorators.ts +726 -0
  541. package/src/compiler/transformers/logical-assignment.ts +75 -0
  542. package/src/compiler/transformers/module-utilities.ts +42 -0
  543. package/src/compiler/transformers/module.ts +474 -0
  544. package/src/compiler/transformers/named-evaluation.ts +389 -0
  545. package/src/compiler/transformers/nullish-coalescing.ts +35 -0
  546. package/src/compiler/transformers/object-rest-spread.ts +577 -0
  547. package/src/compiler/transformers/optional-catch.ts +29 -0
  548. package/src/compiler/transformers/optional-chain.ts +246 -0
  549. package/src/compiler/transformers/reference-resolver.ts +1213 -0
  550. package/src/compiler/transformers/runtime-syntax.ts +942 -0
  551. package/src/compiler/transformers/subtree-facts.ts +253 -0
  552. package/src/compiler/transformers/syntax-facts.ts +358 -0
  553. package/src/compiler/transformers/tagged-template.ts +167 -0
  554. package/src/compiler/transformers/transformer.ts +56 -0
  555. package/src/compiler/transformers/type-eraser.ts +520 -0
  556. package/src/compiler/transformers/type-serialization.ts +374 -0
  557. package/src/compiler/transformers/using.ts +613 -0
  558. package/src/compiler/transformers/utilities.ts +419 -0
  559. package/src/compiler/transformers/visitor-base.ts +1601 -0
  560. package/src/compiler/transformers/visitor-hooks.ts +252 -0
  561. package/src/compiler/tsc-build.ts +1422 -0
  562. package/src/compiler/tsc-cli.ts +669 -0
  563. package/src/compiler/tsc-compile.ts +446 -0
  564. package/src/compiler/tsc-watch.ts +922 -0
  565. package/src/compiler/tsconfig.ts +1574 -0
  566. package/src/compiler/type-printer.ts +110 -0
  567. package/src/compiler/types.ts +115 -0
  568. package/src/compiler/unicode-identifiers.ts +212 -0
  569. package/src/compiler/unicode-properties.ts +537 -0
  570. package/src/compiler/vfs-match.ts +597 -0
  571. package/src/compiler/xxh3.ts +650 -0
  572. package/src/library/ast.generated.ts +141 -167
  573. package/src/library/ast.ts +4 -1
  574. package/src/library/checker.ts +384 -0
  575. package/src/library/diagnostics.ts +72 -0
  576. package/src/library/disk.ts +73 -0
  577. package/src/library/errors.ts +26 -0
  578. package/src/library/host.ts +63 -0
  579. package/src/library/index.ts +21 -0
  580. package/src/library/nodes.ts +232 -0
  581. package/src/library/options.ts +449 -0
  582. package/src/library/parse.ts +63 -0
  583. package/src/library/program.ts +293 -0
  584. package/src/library/types.ts +14 -1
@@ -0,0 +1,1040 @@
1
+ // Operator checking: unary, binary, conditional, `delete`, and truthiness and nullishness tests.
2
+ import { checkExternalEmitHelpers } from './checker-emit-helpers.js';
3
+ import { skipTrivia } from './scanner.js';
4
+ import { NodeVisitor, getExpression, getText, } from './ast.js';
5
+ import { getContainingClass, getSourceFileOfNode, getSourceTextOfNode, isAccessExpression, isEntityNameExpression, skipParentheses, } from './binder-utilities.js';
6
+ import { isAssignmentOperator, isInJSFile } from './ast-utilities.js';
7
+ import { ScriptTarget, getUseDefineForClassFields } from './options.js';
8
+ import { tokenToString } from './scanner.js';
9
+ import { internalSymbolNamePrefix } from './symbol.js';
10
+ import { createDiagnosticForNode } from './checker.js';
11
+ import { getResolvedSignature, isUntypedFunctionCall, resolveCall, resolveErrorCall, resolveUntypedCall, } from './checker-calls.js';
12
+ import { getReturnTypeOfSignature } from './checker-signatures.js';
13
+ import { getApparentType } from './checker-members.js';
14
+ import { filterType, getBaseTypeOfLiteralType, getBaseTypeOfLiteralTypeForComparison, getBigIntLiteralType, getFreshTypeOfLiteralType, getNumberLiteralType, getUnionType, getUnionTypeEx, isEmptyAnonymousObjectType, isErrorType, someType, typesOf, } from './checker-type-factory.js';
15
+ import { getBaseConstraintOrType, getPropertyOfType, getSignaturesOfType, getTypeOfPropertyOfType, } from './checker-members.js';
16
+ import { getExportSymbolOfValueSymbolIfExported, getGlobalValueSymbol, getMergedSymbol } from './checker-symbols.js';
17
+ import { getTypeOfSymbol, isReadonlySymbol } from './checker-symbol-types.js';
18
+ import { getNonNullableType, getTypeFacts, hasTypeFacts } from './checker-flow.js';
19
+ import { areTypesComparable, checkTypeAssignableTo, getTypeNamesForErrorDisplay, isTypeAssignableTo, isTypeComparableTo, isExactOptionalPropertyMismatch, isTypeSubtypeOf, } from './relations.js';
20
+ import { checkTypeRelatedToAndOptionallyElaborate } from './checker-elaboration.js';
21
+ import { isTypeAssignableToKindEx } from './checker-type-operators.js';
22
+ import { typeToString } from './type-printer.js';
23
+ import { getPropertyNameFromType, isTypeUsableAsPropertyName, maybeTypeOfKind } from './checker-utilities.js';
24
+ import { getAwaitedTypeNoAlias, getAwaitedTypeOfPromise } from './checker-iteration.js';
25
+ import { checkExpression, checkExpressionEx, checkNonNullType, checkPropertyAccessExpression, entityNameToString, getResolvedSymbol, getTypeOfExpression, parseBigIntText, } from './checker-expressions.js';
26
+ import { checkDestructuringAssignment } from './checker-destructuring.js';
27
+ import { evaluate } from './checker-evaluator.js';
28
+ import { reportNonexistentProperty } from './checker-property-access.js';
29
+ import { isUndefinedAssignmentToCommonJSExport } from './checker-javascript.js';
30
+ import { getSymbolAtLocationWorker } from './checker-services.js';
31
+ // ---- Unary operators
32
+ export function checkPrefixUnaryExpression(c, node) {
33
+ const operandType = checkExpression(c, node.operand);
34
+ if (operandType === c.silentNeverType)
35
+ return c.silentNeverType;
36
+ switch (node.operand.kind) {
37
+ case 8 /* SyntaxKind.NumericLiteral */:
38
+ if (node.operator === 40 /* SyntaxKind.MinusToken */)
39
+ return getFreshTypeOfLiteralType(c, getNumberLiteralType(c, -Number(getText(node.operand))));
40
+ if (node.operator === 39 /* SyntaxKind.PlusToken */)
41
+ return getFreshTypeOfLiteralType(c, getNumberLiteralType(c, Number(getText(node.operand))));
42
+ break;
43
+ case 9 /* SyntaxKind.BigIntLiteral */:
44
+ if (node.operator === 40 /* SyntaxKind.MinusToken */) {
45
+ const value = parseBigIntText(getText(node.operand));
46
+ return getFreshTypeOfLiteralType(c, getBigIntLiteralType(c, value === '0' ? '0' : '-' + value));
47
+ }
48
+ break;
49
+ }
50
+ switch (node.operator) {
51
+ case 39 /* SyntaxKind.PlusToken */:
52
+ case 40 /* SyntaxKind.MinusToken */:
53
+ case 54 /* SyntaxKind.TildeToken */:
54
+ checkNonNullType(c, operandType, node.operand);
55
+ if (maybeTypeOfKindConsideringBaseConstraint(c, operandType, 16896 /* TypeFlags.ESSymbolLike */))
56
+ c.error(node.operand, 635 /* Diagnostics.The_0_operator_cannot_be_applied_to_type_symbol */, tokenToString(node.operator));
57
+ if (node.operator === 39 /* SyntaxKind.PlusToken */) {
58
+ if (maybeTypeOfKindConsideringBaseConstraint(c, operandType, 4224 /* TypeFlags.BigIntLike */))
59
+ c.error(node.operand, 868 /* Diagnostics.Operator_0_cannot_be_applied_to_type_1 */, tokenToString(node.operator), typeToString(c, getBaseTypeOfLiteralType(c, operandType)));
60
+ return c.numberType;
61
+ }
62
+ return getUnaryResultType(c, operandType);
63
+ case 53 /* SyntaxKind.ExclamationToken */: {
64
+ checkTruthinessOfType(c, operandType, node.operand);
65
+ const facts = getTypeFacts(c, operandType, 4194304 /* TypeFacts.Truthy */ | 8388608 /* TypeFacts.Falsy */);
66
+ if (facts === 4194304 /* TypeFacts.Truthy */)
67
+ return c.falseType;
68
+ if (facts === 8388608 /* TypeFacts.Falsy */)
69
+ return c.trueType;
70
+ return c.booleanType;
71
+ }
72
+ case 45 /* SyntaxKind.PlusPlusToken */:
73
+ case 46 /* SyntaxKind.MinusMinusToken */:
74
+ checkIncrementOperand(c, node.operand, operandType);
75
+ return getUnaryResultType(c, operandType);
76
+ }
77
+ return c.errorType;
78
+ }
79
+ export function checkPostfixUnaryExpression(c, node) {
80
+ const operandType = checkExpression(c, node.operand);
81
+ if (operandType === c.silentNeverType)
82
+ return c.silentNeverType;
83
+ checkIncrementOperand(c, node.operand, operandType);
84
+ return getUnaryResultType(c, operandType);
85
+ }
86
+ function checkIncrementOperand(c, operand, operandType) {
87
+ const ok = checkArithmeticOperandType(c, operand, checkNonNullType(c, operandType, operand), 532 /* Diagnostics.An_arithmetic_operand_must_be_of_type_any_number_bigint_or_an_enum_type */, false);
88
+ // Only checked when the operand type is fine, to avoid cascading errors.
89
+ if (ok)
90
+ checkReferenceExpression(c, operand, 533 /* Diagnostics.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access */, 909 /* Diagnostics.The_operand_of_an_increment_or_decrement_operator_may_not_be_an_optional_property_access */);
91
+ }
92
+ function getUnaryResultType(c, operandType) {
93
+ if (maybeTypeOfKind(operandType, 4224 /* TypeFlags.BigIntLike */)) {
94
+ return isTypeAssignableToKind(c, operandType, 3 /* TypeFlags.AnyOrUnknown */) ||
95
+ maybeTypeOfKind(operandType, 67648 /* TypeFlags.NumberLike */)
96
+ ? c.numberOrBigIntType
97
+ : c.bigintType;
98
+ }
99
+ return c.numberType;
100
+ }
101
+ export function checkDeleteExpression(c, node) {
102
+ checkExpression(c, getExpression(node));
103
+ const expr = skipParentheses(getExpression(node));
104
+ if (!isAccessExpression(expr)) {
105
+ c.error(expr, 835 /* Diagnostics.The_operand_of_a_delete_operator_must_be_a_property_reference */);
106
+ return c.booleanType;
107
+ }
108
+ if (expr.kind === 212 /* SyntaxKind.PropertyAccessExpression */ &&
109
+ expr.name.kind === 80 /* SyntaxKind.PrivateIdentifier */)
110
+ c.error(expr, 1833 /* Diagnostics.The_operand_of_a_delete_operator_cannot_be_a_private_identifier */);
111
+ const resolved = c.resolvedSymbols.get(expr.id);
112
+ if (resolved !== undefined) {
113
+ const symbol = getExportSymbolOfValueSymbolIfExported(c, resolved);
114
+ if (isReadonlySymbol(c, symbol))
115
+ c.error(expr, 836 /* Diagnostics.The_operand_of_a_delete_operator_cannot_be_a_read_only_property */);
116
+ else
117
+ checkDeleteExpressionMustBeOptional(c, expr, symbol);
118
+ }
119
+ return c.booleanType;
120
+ }
121
+ function checkDeleteExpressionMustBeOptional(c, expr, symbol) {
122
+ const t = getTypeOfSymbol(c, symbol);
123
+ if (!c.strictNullChecks || (t.flags & (3 /* TypeFlags.AnyOrUnknown */ | 262144 /* TypeFlags.Never */)) !== 0)
124
+ return;
125
+ const isOptional = c.exactOptionalPropertyTypes
126
+ ? (symbol.flags & 16777216 /* SymbolFlags.Optional */) !== 0
127
+ : hasTypeFacts(c, t, 16777216 /* TypeFacts.IsUndefined */);
128
+ if (!isOptional)
129
+ c.error(expr, 922 /* Diagnostics.The_operand_of_a_delete_operator_must_be_optional */);
130
+ }
131
+ /** Reports a grammar error unless the file already has syntax errors. */
132
+ export function grammarErrorOnNode(c, node, message, ...args) {
133
+ if (getSourceFileOfNode(node).diagnostics.length !== 0)
134
+ return false;
135
+ c.error(node, message, ...args);
136
+ return true;
137
+ }
138
+ // ---- Arithmetic helpers
139
+ function isTypeAssignableToKind(c, t, kind) {
140
+ return isTypeAssignableToKindEx(c, t, kind, false);
141
+ }
142
+ export function allTypesAssignableToKind(c, t, kind) {
143
+ if ((t.flags & 134217728 /* TypeFlags.Union */) !== 0) {
144
+ for (const u of typesOf(t))
145
+ if (!allTypesAssignableToKind(c, u, kind))
146
+ return false;
147
+ return true;
148
+ }
149
+ return isTypeAssignableToKind(c, t, kind);
150
+ }
151
+ function maybeTypeOfKindConsideringBaseConstraint(c, t, kind) {
152
+ return maybeTypeOfKind(t, kind) || maybeTypeOfKind(getBaseConstraintOrType(c, t), kind);
153
+ }
154
+ function isTypeAny(t) {
155
+ return (t.flags & 1 /* TypeFlags.Any */) !== 0;
156
+ }
157
+ export function errorAndMaybeSuggestAwait(c, location, maybeMissingAwait, message, args) {
158
+ const diagnostic = createDiagnosticForNode(location, message, args);
159
+ if (maybeMissingAwait)
160
+ diagnostic.addRelatedInfo(createDiagnosticForNode(location, 905 /* Diagnostics.Did_you_forget_to_use_await */, []));
161
+ c.addDiagnostic(diagnostic);
162
+ return diagnostic;
163
+ }
164
+ function checkArithmeticOperandType(c, operand, t, message, isAwaitValid) {
165
+ if (isTypeAssignableTo(c, t, c.numberOrBigIntType))
166
+ return true;
167
+ const awaitedType = isAwaitValid ? getAwaitedTypeOfPromise(c, t) : undefined;
168
+ errorAndMaybeSuggestAwait(c, operand, awaitedType !== undefined && isTypeAssignableTo(c, awaitedType, c.numberOrBigIntType), message, []);
169
+ return false;
170
+ }
171
+ /** Whether `expr` can be assigned to; reports `invalidReference` or `invalidOptionalChain` otherwise. */
172
+ export function checkReferenceExpression(c, expr, invalidReference, invalidOptionalChain) {
173
+ const node = skipAssertionsAndParentheses(expr);
174
+ if (node.kind !== 79 /* SyntaxKind.Identifier */ && !isAccessExpression(node)) {
175
+ c.error(expr, invalidReference);
176
+ return false;
177
+ }
178
+ if ((node.flags & 32 /* NodeFlags.OptionalChain */) !== 0) {
179
+ c.error(expr, invalidOptionalChain);
180
+ return false;
181
+ }
182
+ return true;
183
+ }
184
+ function skipAssertionsAndParentheses(nodeIn) {
185
+ let node = nodeIn;
186
+ while (node.kind === 218 /* SyntaxKind.ParenthesizedExpression */ ||
187
+ node.kind === 217 /* SyntaxKind.TypeAssertionExpression */ ||
188
+ node.kind === 235 /* SyntaxKind.AsExpression */ ||
189
+ node.kind === 239 /* SyntaxKind.SatisfiesExpression */ ||
190
+ node.kind === 236 /* SyntaxKind.NonNullExpression */)
191
+ node = getExpression(node);
192
+ return node;
193
+ }
194
+ /** `node` without parentheses, type assertions, `satisfies` and non-null assertions. */
195
+ export function skipOuterExpressions(nodeIn) {
196
+ let node = nodeIn;
197
+ while (node.kind === 218 /* SyntaxKind.ParenthesizedExpression */ ||
198
+ node.kind === 217 /* SyntaxKind.TypeAssertionExpression */ ||
199
+ node.kind === 235 /* SyntaxKind.AsExpression */ ||
200
+ node.kind === 239 /* SyntaxKind.SatisfiesExpression */ ||
201
+ node.kind === 236 /* SyntaxKind.NonNullExpression */ ||
202
+ node.kind === 234 /* SyntaxKind.ExpressionWithTypeArguments */ ||
203
+ node.kind === 348 /* SyntaxKind.PartiallyEmittedExpression */)
204
+ node = getExpression(node);
205
+ return node;
206
+ }
207
+ // ---- Binary operators
208
+ export function checkBinaryExpression(c, node, checkMode) {
209
+ const left = node.left;
210
+ const right = node.right;
211
+ const operator = node.operatorToken.kind;
212
+ if (operator === 63 /* SyntaxKind.EqualsToken */ &&
213
+ (left.kind === 211 /* SyntaxKind.ObjectLiteralExpression */ || left.kind === 210 /* SyntaxKind.ArrayLiteralExpression */))
214
+ return checkDestructuringAssignment(c, left, checkExpressionEx(c, right, checkMode), checkMode, right.kind === 109 /* SyntaxKind.ThisKeyword */);
215
+ const leftType = checkExpressionEx(c, left, checkMode);
216
+ const rightType = checkExpressionEx(c, right, checkMode);
217
+ if (isLogicalOrCoalescingOperator(operator)) {
218
+ let parent = node.parent;
219
+ while (parent.kind === 218 /* SyntaxKind.ParenthesizedExpression */ ||
220
+ (parent.kind === 227 /* SyntaxKind.BinaryExpression */ &&
221
+ isLogicalOrCoalescingOperator(parent.operatorToken.kind)))
222
+ parent = parent.parent;
223
+ if (operator === 55 /* SyntaxKind.AmpersandAmpersandToken */ || parent.kind === 246 /* SyntaxKind.IfStatement */)
224
+ checkTestingKnownTruthyType(c, left, leftType, parent.kind === 246 /* SyntaxKind.IfStatement */ ? parent.thenStatement : undefined);
225
+ if (operator !== 60 /* SyntaxKind.QuestionQuestionToken */)
226
+ checkTruthinessOfType(c, leftType, left);
227
+ }
228
+ return checkBinaryLikeExpressionWorker(c, node, left, operator, right, leftType, rightType, checkMode);
229
+ }
230
+ function isLogicalOrCoalescingOperator(operator) {
231
+ return (operator === 55 /* SyntaxKind.AmpersandAmpersandToken */ ||
232
+ operator === 56 /* SyntaxKind.BarBarToken */ ||
233
+ operator === 60 /* SyntaxKind.QuestionQuestionToken */);
234
+ }
235
+ function checkBinaryLikeExpressionWorker(c, errorNode, left, operator, right, leftTypeIn, rightTypeIn, checkMode) {
236
+ let leftType = leftTypeIn;
237
+ let rightType = rightTypeIn;
238
+ switch (operator) {
239
+ case 41 /* SyntaxKind.AsteriskToken */:
240
+ case 42 /* SyntaxKind.AsteriskAsteriskToken */:
241
+ case 66 /* SyntaxKind.AsteriskEqualsToken */:
242
+ case 67 /* SyntaxKind.AsteriskAsteriskEqualsToken */:
243
+ case 43 /* SyntaxKind.SlashToken */:
244
+ case 68 /* SyntaxKind.SlashEqualsToken */:
245
+ case 44 /* SyntaxKind.PercentToken */:
246
+ case 69 /* SyntaxKind.PercentEqualsToken */:
247
+ case 40 /* SyntaxKind.MinusToken */:
248
+ case 65 /* SyntaxKind.MinusEqualsToken */:
249
+ case 47 /* SyntaxKind.LessThanLessThanToken */:
250
+ case 70 /* SyntaxKind.LessThanLessThanEqualsToken */:
251
+ case 48 /* SyntaxKind.GreaterThanGreaterThanToken */:
252
+ case 71 /* SyntaxKind.GreaterThanGreaterThanEqualsToken */:
253
+ case 49 /* SyntaxKind.GreaterThanGreaterThanGreaterThanToken */:
254
+ case 72 /* SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken */:
255
+ case 51 /* SyntaxKind.BarToken */:
256
+ case 74 /* SyntaxKind.BarEqualsToken */:
257
+ case 52 /* SyntaxKind.CaretToken */:
258
+ case 78 /* SyntaxKind.CaretEqualsToken */:
259
+ case 50 /* SyntaxKind.AmpersandToken */:
260
+ case 73 /* SyntaxKind.AmpersandEqualsToken */: {
261
+ if (leftType === c.silentNeverType || rightType === c.silentNeverType)
262
+ return c.silentNeverType;
263
+ leftType = checkNonNullType(c, leftType, left);
264
+ rightType = checkNonNullType(c, rightType, right);
265
+ // Bitwise operators on two booleans suggest the logical operator.
266
+ if ((leftType.flags & 8448 /* TypeFlags.BooleanLike */) !== 0 && (rightType.flags & 8448 /* TypeFlags.BooleanLike */) !== 0) {
267
+ const suggested = getSuggestedBooleanOperator(operator);
268
+ if (suggested !== 0 /* SyntaxKind.Unknown */) {
269
+ c.error(errorNode.operatorToken, 615 /* Diagnostics.The_0_operator_is_not_allowed_for_boolean_types_Consider_using_1_instead */, tokenToString(operator), tokenToString(suggested));
270
+ return c.numberType;
271
+ }
272
+ }
273
+ const leftOk = checkArithmeticOperandType(c, left, leftType, 536 /* Diagnostics.The_left_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_bigint_or_an_enum_type */, true);
274
+ const rightOk = checkArithmeticOperandType(c, right, rightType, 537 /* Diagnostics.The_right_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_bigint_or_an_enum_type */, true);
275
+ let resultType;
276
+ if ((isTypeAssignableToKind(c, leftType, 3 /* TypeFlags.AnyOrUnknown */) &&
277
+ isTypeAssignableToKind(c, rightType, 3 /* TypeFlags.AnyOrUnknown */)) ||
278
+ (!maybeTypeOfKind(leftType, 4224 /* TypeFlags.BigIntLike */) && !maybeTypeOfKind(rightType, 4224 /* TypeFlags.BigIntLike */)))
279
+ resultType = c.numberType;
280
+ else if (bothAreBigIntLike(c, leftType, rightType)) {
281
+ if (operator === 49 /* SyntaxKind.GreaterThanGreaterThanGreaterThanToken */ ||
282
+ operator === 72 /* SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken */)
283
+ reportOperatorError(c, leftType, operator, rightType, errorNode, 0 /* RelatedCheck.None */);
284
+ else if ((operator === 42 /* SyntaxKind.AsteriskAsteriskToken */ || operator === 67 /* SyntaxKind.AsteriskAsteriskEqualsToken */) &&
285
+ c.languageVersion < ScriptTarget.ES2016)
286
+ c.error(errorNode, 923 /* Diagnostics.Exponentiation_cannot_be_performed_on_bigint_values_unless_the_target_option_is_set_to_es2016_or_later */);
287
+ resultType = c.bigintType;
288
+ }
289
+ else {
290
+ reportOperatorError(c, leftType, operator, rightType, errorNode, 1 /* RelatedCheck.BothBigIntLike */);
291
+ resultType = c.errorType;
292
+ }
293
+ if (leftOk && rightOk) {
294
+ checkAssignmentOperator(c, left, operator, right, leftType, resultType);
295
+ if (isShiftOperator(operator))
296
+ checkShiftAmount(c, left, operator, right, errorNode);
297
+ }
298
+ return resultType;
299
+ }
300
+ case 39 /* SyntaxKind.PlusToken */:
301
+ case 64 /* SyntaxKind.PlusEqualsToken */: {
302
+ if (leftType === c.silentNeverType || rightType === c.silentNeverType)
303
+ return c.silentNeverType;
304
+ if (!isTypeAssignableToKind(c, leftType, 12583968 /* TypeFlags.StringLike */) &&
305
+ !isTypeAssignableToKind(c, rightType, 12583968 /* TypeFlags.StringLike */)) {
306
+ leftType = checkNonNullType(c, leftType, left);
307
+ rightType = checkNonNullType(c, rightType, right);
308
+ }
309
+ let resultType = undefined;
310
+ if (isTypeAssignableToKindEx(c, leftType, 67648 /* TypeFlags.NumberLike */, true) &&
311
+ isTypeAssignableToKindEx(c, rightType, 67648 /* TypeFlags.NumberLike */, true))
312
+ resultType = c.numberType;
313
+ else if (isTypeAssignableToKindEx(c, leftType, 4224 /* TypeFlags.BigIntLike */, true) &&
314
+ isTypeAssignableToKindEx(c, rightType, 4224 /* TypeFlags.BigIntLike */, true))
315
+ resultType = c.bigintType;
316
+ else if (isTypeAssignableToKindEx(c, leftType, 12583968 /* TypeFlags.StringLike */, true) ||
317
+ isTypeAssignableToKindEx(c, rightType, 12583968 /* TypeFlags.StringLike */, true))
318
+ resultType = c.stringType;
319
+ else if (isTypeAny(leftType) || isTypeAny(rightType))
320
+ resultType = isErrorType(c, leftType) || isErrorType(c, rightType) ? c.errorType : c.anyType;
321
+ // Symbols are not allowed at all in arithmetic expressions.
322
+ if (resultType !== undefined && !checkForDisallowedESSymbolOperand(c, left, right, leftType, rightType, operator))
323
+ return resultType;
324
+ if (resultType === undefined) {
325
+ reportOperatorError(c, leftType, operator, rightType, errorNode, 2 /* RelatedCheck.CloseEnoughForPlus */);
326
+ return c.anyType;
327
+ }
328
+ if (operator === 64 /* SyntaxKind.PlusEqualsToken */)
329
+ checkAssignmentOperator(c, left, operator, right, leftType, resultType);
330
+ return resultType;
331
+ }
332
+ case 29 /* SyntaxKind.LessThanToken */:
333
+ case 31 /* SyntaxKind.GreaterThanToken */:
334
+ case 32 /* SyntaxKind.LessThanEqualsToken */:
335
+ case 33 /* SyntaxKind.GreaterThanEqualsToken */:
336
+ if (checkForDisallowedESSymbolOperand(c, left, right, leftType, rightType, operator)) {
337
+ leftType = getBaseTypeOfLiteralTypeForComparison(c, checkNonNullType(c, leftType, left));
338
+ rightType = getBaseTypeOfLiteralTypeForComparison(c, checkNonNullType(c, rightType, right));
339
+ if (!isRelated(c, 3 /* RelatedCheck.Comparable */, leftType, rightType))
340
+ reportOperatorError(c, leftType, operator, rightType, errorNode, 3 /* RelatedCheck.Comparable */);
341
+ }
342
+ return c.booleanType;
343
+ case 34 /* SyntaxKind.EqualsEqualsToken */:
344
+ case 35 /* SyntaxKind.ExclamationEqualsToken */:
345
+ case 36 /* SyntaxKind.EqualsEqualsEqualsToken */:
346
+ case 37 /* SyntaxKind.ExclamationEqualsEqualsToken */:
347
+ // Flow analysis may check operands with temporarily narrower types; only report in normal checks.
348
+ if ((checkMode & 64 /* CheckMode.TypeOnly */) === 0) {
349
+ if ((isLiteralExpressionOfObject(left) || isLiteralExpressionOfObject(right)) &&
350
+ (!isInJSFile(left) ||
351
+ operator === 36 /* SyntaxKind.EqualsEqualsEqualsToken */ ||
352
+ operator === 37 /* SyntaxKind.ExclamationEqualsEqualsToken */)) {
353
+ const eqType = operator === 34 /* SyntaxKind.EqualsEqualsToken */ || operator === 36 /* SyntaxKind.EqualsEqualsEqualsToken */;
354
+ c.error(errorNode, 961 /* Diagnostics.This_condition_will_always_return_0_since_JavaScript_compares_objects_by_reference_not_value */, eqType ? 'false' : 'true');
355
+ }
356
+ checkNaNEquality(c, errorNode, operator, left, right);
357
+ if (!isRelated(c, 4 /* RelatedCheck.EqualityComparable */, leftType, rightType))
358
+ reportOperatorError(c, leftType, operator, rightType, errorNode, 4 /* RelatedCheck.EqualityComparable */);
359
+ }
360
+ return c.booleanType;
361
+ case 103 /* SyntaxKind.InstanceOfKeyword */:
362
+ return checkInstanceOfExpression(c, left, right, leftType, rightType, checkMode);
363
+ case 102 /* SyntaxKind.InKeyword */:
364
+ return checkInExpression(c, left, right, leftType, rightType);
365
+ case 55 /* SyntaxKind.AmpersandAmpersandToken */:
366
+ case 76 /* SyntaxKind.AmpersandAmpersandEqualsToken */: {
367
+ let resultType = leftType;
368
+ if (hasTypeFacts(c, leftType, 4194304 /* TypeFacts.Truthy */))
369
+ resultType = getUnionType(c, [
370
+ extractDefinitelyFalsyTypes(c, c.strictNullChecks ? leftType : getBaseTypeOfLiteralType(c, rightType)),
371
+ rightType,
372
+ ]);
373
+ if (operator === 76 /* SyntaxKind.AmpersandAmpersandEqualsToken */)
374
+ checkAssignmentOperator(c, left, operator, right, leftType, rightType);
375
+ return resultType;
376
+ }
377
+ case 56 /* SyntaxKind.BarBarToken */:
378
+ case 75 /* SyntaxKind.BarBarEqualsToken */: {
379
+ let resultType = leftType;
380
+ if (hasTypeFacts(c, leftType, 8388608 /* TypeFacts.Falsy */))
381
+ resultType = getUnionTypeEx(c, [getNonNullableType(c, removeDefinitelyFalsyTypes(c, leftType)), rightType], 2 /* UnionReduction.Subtype */, undefined, undefined);
382
+ if (operator === 75 /* SyntaxKind.BarBarEqualsToken */)
383
+ checkAssignmentOperator(c, left, operator, right, leftType, rightType);
384
+ return resultType;
385
+ }
386
+ case 60 /* SyntaxKind.QuestionQuestionToken */:
387
+ case 77 /* SyntaxKind.QuestionQuestionEqualsToken */: {
388
+ if (operator === 60 /* SyntaxKind.QuestionQuestionToken */)
389
+ checkNullishCoalesceOperands(c, left, right);
390
+ let resultType = leftType;
391
+ if (hasTypeFacts(c, leftType, 262144 /* TypeFacts.EQUndefinedOrNull */))
392
+ resultType = getUnionTypeEx(c, [getNonNullableType(c, leftType), rightType], 2 /* UnionReduction.Subtype */, undefined, undefined);
393
+ if (operator === 77 /* SyntaxKind.QuestionQuestionEqualsToken */)
394
+ checkAssignmentOperator(c, left, operator, right, leftType, rightType);
395
+ return resultType;
396
+ }
397
+ case 63 /* SyntaxKind.EqualsToken */:
398
+ checkAssignmentOperator(c, left, operator, right, leftType, rightType);
399
+ return rightType;
400
+ case 27 /* SyntaxKind.CommaToken */:
401
+ if (c.compilerOptions.allowUnreachableCode !== true &&
402
+ isSideEffectFree(left) &&
403
+ !isIndirectCall(left.parent) &&
404
+ !isInMultipleJsxRootsError(left))
405
+ c.error(left, 827 /* Diagnostics.Left_side_of_comma_operator_is_unused_and_has_no_side_effects */);
406
+ return rightType;
407
+ }
408
+ return c.errorType;
409
+ }
410
+ /** Whether `left` starts inside an "expressions must have one parent element" parse error. */
411
+ function isInMultipleJsxRootsError(left) {
412
+ const file = getSourceFileOfNode(left);
413
+ const start = skipTrivia(file.text, left.pos);
414
+ for (const d of file.diagnostics)
415
+ if (d.message === 791 /* Diagnostics.JSX_expressions_must_have_one_parent_element */ && d.pos <= start && start < d.end)
416
+ return true;
417
+ return false;
418
+ }
419
+ function getSuggestedBooleanOperator(operator) {
420
+ switch (operator) {
421
+ case 51 /* SyntaxKind.BarToken */:
422
+ case 74 /* SyntaxKind.BarEqualsToken */:
423
+ return 56 /* SyntaxKind.BarBarToken */;
424
+ case 52 /* SyntaxKind.CaretToken */:
425
+ case 78 /* SyntaxKind.CaretEqualsToken */:
426
+ return 37 /* SyntaxKind.ExclamationEqualsEqualsToken */;
427
+ case 50 /* SyntaxKind.AmpersandToken */:
428
+ case 73 /* SyntaxKind.AmpersandEqualsToken */:
429
+ return 55 /* SyntaxKind.AmpersandAmpersandToken */;
430
+ }
431
+ return 0 /* SyntaxKind.Unknown */;
432
+ }
433
+ function bothAreBigIntLike(c, left, right) {
434
+ return (isTypeAssignableToKind(c, left, 4224 /* TypeFlags.BigIntLike */) && isTypeAssignableToKind(c, right, 4224 /* TypeFlags.BigIntLike */));
435
+ }
436
+ /** Returns true when neither operand is a symbol; reports the offending one otherwise. */
437
+ function checkForDisallowedESSymbolOperand(c, left, right, leftType, rightType, operator) {
438
+ let offending = undefined;
439
+ if (maybeTypeOfKindConsideringBaseConstraint(c, leftType, 16896 /* TypeFlags.ESSymbolLike */))
440
+ offending = left;
441
+ else if (maybeTypeOfKindConsideringBaseConstraint(c, rightType, 16896 /* TypeFlags.ESSymbolLike */))
442
+ offending = right;
443
+ if (offending === undefined)
444
+ return true;
445
+ c.error(offending, 635 /* Diagnostics.The_0_operator_cannot_be_applied_to_type_symbol */, tokenToString(operator));
446
+ return false;
447
+ }
448
+ function isRelated(c, check, left, right) {
449
+ switch (check) {
450
+ case 1 /* RelatedCheck.BothBigIntLike */:
451
+ return bothAreBigIntLike(c, left, right);
452
+ case 2 /* RelatedCheck.CloseEnoughForPlus */: {
453
+ const kind = 67648 /* TypeFlags.NumberLike */ | 4224 /* TypeFlags.BigIntLike */ | 12583968 /* TypeFlags.StringLike */ | 3 /* TypeFlags.AnyOrUnknown */;
454
+ return isTypeAssignableToKind(c, left, kind) && isTypeAssignableToKind(c, right, kind);
455
+ }
456
+ case 3 /* RelatedCheck.Comparable */: {
457
+ if (isTypeAny(left) || isTypeAny(right))
458
+ return true;
459
+ const leftNumeric = isTypeAssignableTo(c, left, c.numberOrBigIntType);
460
+ const rightNumeric = isTypeAssignableTo(c, right, c.numberOrBigIntType);
461
+ return (leftNumeric && rightNumeric) || (!leftNumeric && !rightNumeric && areTypesComparable(c, left, right));
462
+ }
463
+ case 4 /* RelatedCheck.EqualityComparable */:
464
+ return isTypeEqualityComparableTo(c, left, right) || isTypeEqualityComparableTo(c, right, left);
465
+ }
466
+ return false;
467
+ }
468
+ export function isTypeEqualityComparableTo(c, source, target) {
469
+ return (target.flags & 12 /* TypeFlags.Nullable */) !== 0 || isTypeComparableTo(c, source, target);
470
+ }
471
+ function reportOperatorError(c, leftType, operator, rightType, errorNode, check) {
472
+ let wouldWorkWithAwait = false;
473
+ let effectiveLeft = leftType;
474
+ let effectiveRight = rightType;
475
+ if (check !== 0 /* RelatedCheck.None */) {
476
+ const awaitedLeft = getAwaitedTypeNoAlias(c, leftType);
477
+ const awaitedRight = getAwaitedTypeNoAlias(c, rightType);
478
+ wouldWorkWithAwait =
479
+ !(awaitedLeft === leftType && awaitedRight === rightType) &&
480
+ awaitedLeft !== undefined &&
481
+ awaitedRight !== undefined &&
482
+ isRelated(c, check, awaitedLeft, awaitedRight);
483
+ if (!wouldWorkWithAwait) {
484
+ // Literal operands display as their base types when those are unrelated too.
485
+ const leftBase = getBaseTypeOfLiteralType(c, leftType);
486
+ const rightBase = getBaseTypeOfLiteralType(c, rightType);
487
+ if (!isRelated(c, check, leftBase, rightBase)) {
488
+ effectiveLeft = leftBase;
489
+ effectiveRight = rightBase;
490
+ }
491
+ }
492
+ }
493
+ const [leftStr, rightStr] = getTypeNamesForErrorDisplay(c, effectiveLeft, effectiveRight);
494
+ switch (operator) {
495
+ case 36 /* SyntaxKind.EqualsEqualsEqualsToken */:
496
+ case 34 /* SyntaxKind.EqualsEqualsToken */:
497
+ case 37 /* SyntaxKind.ExclamationEqualsEqualsToken */:
498
+ case 35 /* SyntaxKind.ExclamationEqualsToken */:
499
+ errorAndMaybeSuggestAwait(c, errorNode, wouldWorkWithAwait, 541 /* Diagnostics.This_comparison_appears_to_be_unintentional_because_the_types_0_and_1_have_no_overlap */, [leftStr, rightStr]);
500
+ return;
501
+ }
502
+ errorAndMaybeSuggestAwait(c, errorNode, wouldWorkWithAwait, 539 /* Diagnostics.Operator_0_cannot_be_applied_to_types_1_and_2 */, [tokenToString(operator), leftStr, rightStr]);
503
+ }
504
+ function checkAssignmentOperator(c, left, operator, right, leftType, rightType) {
505
+ if (!isAssignmentOperator(operator))
506
+ return;
507
+ if (isUndefinedAssignmentToCommonJSExport(c, left, rightType))
508
+ return;
509
+ // A getter's type can be a subtype of its setter's, so compound assignments check against the setter.
510
+ let targetType = leftType;
511
+ if (operator >= 64 /* SyntaxKind.FirstCompoundAssignment */ &&
512
+ operator <= 78 /* SyntaxKind.LastCompoundAssignment */ &&
513
+ left.kind === 212 /* SyntaxKind.PropertyAccessExpression */)
514
+ targetType = checkPropertyAccessExpression(c, left, true);
515
+ // Assignability is only checked when the target is a reference, to avoid cascading errors.
516
+ if (checkReferenceExpression(c, left, 538 /* Diagnostics.The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access */, 911 /* Diagnostics.The_left_hand_side_of_an_assignment_expression_may_not_be_an_optional_property_access */)) {
517
+ let headMessage = undefined;
518
+ if (c.exactOptionalPropertyTypes &&
519
+ left.kind === 212 /* SyntaxKind.PropertyAccessExpression */ &&
520
+ maybeTypeOfKind(rightType, 4 /* TypeFlags.Undefined */)) {
521
+ const access = left;
522
+ const target = getTypeOfPropertyOfType(c, getTypeOfExpression(c, access.expression), getText(access.name));
523
+ if (isExactOptionalPropertyMismatch(c, rightType, target))
524
+ headMessage =
525
+ 583 /* Diagnostics.Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_type_of_the_target */;
526
+ }
527
+ checkTypeRelatedToAndOptionallyElaborate(c, rightType, targetType, c.assignableRelation, left, right, headMessage, undefined);
528
+ }
529
+ }
530
+ function isLiteralExpressionOfObject(node) {
531
+ switch (node.kind) {
532
+ case 211 /* SyntaxKind.ObjectLiteralExpression */:
533
+ case 210 /* SyntaxKind.ArrayLiteralExpression */:
534
+ case 13 /* SyntaxKind.RegularExpressionLiteral */:
535
+ case 232 /* SyntaxKind.ClassExpression */:
536
+ case 219 /* SyntaxKind.FunctionExpression */:
537
+ return true;
538
+ }
539
+ return false;
540
+ }
541
+ function checkNaNEquality(c, errorNode, operator, left, right) {
542
+ const isLeftNaN = isGlobalNaN(c, skipParentheses(left));
543
+ const isRightNaN = isGlobalNaN(c, skipParentheses(right));
544
+ if (!isLeftNaN && !isRightNaN)
545
+ return;
546
+ const err = c.error(errorNode, 966 /* Diagnostics.This_condition_will_always_return_0 */, operator === 36 /* SyntaxKind.EqualsEqualsEqualsToken */ || operator === 34 /* SyntaxKind.EqualsEqualsToken */ ? 'false' : 'true');
547
+ if (isLeftNaN && isRightNaN)
548
+ return;
549
+ const operatorString = operator === 37 /* SyntaxKind.ExclamationEqualsEqualsToken */ || operator === 35 /* SyntaxKind.ExclamationEqualsToken */ ? '!' : '';
550
+ const location = isLeftNaN ? right : left;
551
+ const expression = skipParentheses(location);
552
+ const entityName = isEntityNameExpression(expression, false) ? entityNameToString(expression) : '...';
553
+ err.addRelatedInfo(createDiagnosticForNode(location, 303 /* Diagnostics.Did_you_mean_0 */, [
554
+ operatorString + 'Number.isNaN(' + entityName + ')',
555
+ ]));
556
+ }
557
+ function isGlobalNaN(c, expr) {
558
+ if (expr.kind !== 79 /* SyntaxKind.Identifier */ || getText(expr) !== 'NaN')
559
+ return false;
560
+ const globalNaNSymbol = c.globals.get('NaN');
561
+ return globalNaNSymbol !== undefined && getResolvedSymbol(c, expr) === getMergedSymbol(c, globalNaNSymbol);
562
+ }
563
+ function isShiftOperator(operator) {
564
+ switch (operator) {
565
+ case 47 /* SyntaxKind.LessThanLessThanToken */:
566
+ case 70 /* SyntaxKind.LessThanLessThanEqualsToken */:
567
+ case 48 /* SyntaxKind.GreaterThanGreaterThanToken */:
568
+ case 71 /* SyntaxKind.GreaterThanGreaterThanEqualsToken */:
569
+ case 49 /* SyntaxKind.GreaterThanGreaterThanGreaterThanToken */:
570
+ case 72 /* SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken */:
571
+ return true;
572
+ }
573
+ return false;
574
+ }
575
+ /** Shifts by 32 or more wrap around; that's an error in enum members and a suggestion elsewhere. */
576
+ function checkShiftAmount(c, left, operator, right, errorNode) {
577
+ const result = evaluate(c, right, right);
578
+ if (result.kind !== 1 /* EvaluatedKind.Number */ || Math.abs(result.numberValue) < 32)
579
+ return;
580
+ let container = right.parent.parent;
581
+ while (container.kind === 218 /* SyntaxKind.ParenthesizedExpression */)
582
+ container = container.parent;
583
+ const file = getSourceFileOfNode(left);
584
+ c.addErrorOrSuggestion(container.kind === 306 /* SyntaxKind.EnumMember */, createDiagnosticForNode(errorNode, 1644 /* Diagnostics.This_operation_can_be_simplified_This_shift_is_identical_to_0_1_2 */, [
585
+ getSourceTextOfNode(file, left),
586
+ tokenToString(operator),
587
+ String(result.numberValue % 32),
588
+ ]));
589
+ }
590
+ function checkInstanceOfExpression(c, left, right, leftType, rightType, checkMode) {
591
+ if (leftType === c.silentNeverType || rightType === c.silentNeverType)
592
+ return c.silentNeverType;
593
+ // Unknown left operands already reported an error.
594
+ if (!isTypeAny(leftType) && allTypesAssignableToKind(c, leftType, 12713980 /* TypeFlags.Primitive */))
595
+ c.error(left, 534 /* Diagnostics.The_left_hand_side_of_an_instanceof_expression_must_be_of_type_any_an_object_type_or_a_type_parameter */);
596
+ // `x instanceof C` is checked as the call `C[Symbol.hasInstance](x)`.
597
+ const signature = getResolvedSignature(c, left.parent, checkMode);
598
+ if (signature === c.resolvingSignature)
599
+ return c.silentNeverType;
600
+ checkTypeAssignableTo(c, getReturnTypeOfSignature(c, signature), c.booleanType, right, 981 /* Diagnostics.An_object_s_Symbol_hasInstance_method_must_return_a_boolean_value_for_it_to_be_used_on_the_right_hand_side_of_an_instanceof_expression */);
601
+ return c.booleanType;
602
+ }
603
+ /** The signature of `right[Symbol.hasInstance]` that `left instanceof right` calls, if any. */
604
+ export function resolveInstanceofExpression(c, node, checkMode) {
605
+ const right = node.right;
606
+ const rightType = checkExpression(c, right);
607
+ if (!isTypeAny(rightType)) {
608
+ const hasInstanceMethodType = getSymbolHasInstanceMethodOfObjectType(c, rightType);
609
+ if (hasInstanceMethodType !== undefined) {
610
+ const apparentType = getApparentType(c, hasInstanceMethodType);
611
+ if (isErrorType(c, apparentType))
612
+ return resolveErrorCall(c, node);
613
+ const callSignatures = getSignaturesOfType(c, apparentType, 0 /* SignatureKind.Call */);
614
+ const constructSignatures = getSignaturesOfType(c, apparentType, 1 /* SignatureKind.Construct */);
615
+ if (isUntypedFunctionCall(c, hasInstanceMethodType, apparentType, callSignatures.length, constructSignatures.length))
616
+ return resolveUntypedCall(c, node);
617
+ // Argument errors explain how `left instanceof right` became `right[Symbol.hasInstance](left)`.
618
+ if (callSignatures.length !== 0)
619
+ return resolveCall(c, node, callSignatures, checkMode, 0 /* SignatureFlags.None */, 980 /* Diagnostics.The_left_hand_side_of_an_instanceof_expression_must_be_assignable_to_the_first_argument_of_the_right_hand_side_s_Symbol_hasInstance_method */);
620
+ }
621
+ else if (!typeHasCallOrConstructSignatures(c, rightType) &&
622
+ !isTypeSubtypeOf(c, rightType, c.globalFunctionType)) {
623
+ c.error(right, 535 /* Diagnostics.The_right_hand_side_of_an_instanceof_expression_must_be_either_of_type_any_a_class_function_or_other_type_assignable_to_the_Function_interface_type_or_an_object_type_with_a_Symbol_hasInstance_method */);
624
+ return resolveErrorCall(c, node);
625
+ }
626
+ }
627
+ return c.anySignature;
628
+ }
629
+ function typeHasCallOrConstructSignatures(c, t) {
630
+ return (getSignaturesOfType(c, t, 0 /* SignatureKind.Call */).length !== 0 ||
631
+ getSignaturesOfType(c, t, 1 /* SignatureKind.Construct */).length !== 0);
632
+ }
633
+ export function getSymbolHasInstanceMethodOfObjectType(c, t) {
634
+ if (!allTypesAssignableToKind(c, t, 131072 /* TypeFlags.NonPrimitive */))
635
+ return undefined;
636
+ const prop = getPropertyOfType(c, t, getPropertyNameForKnownSymbolName(c, 'hasInstance'));
637
+ if (prop === undefined)
638
+ return undefined;
639
+ const propType = getTypeOfSymbol(c, prop);
640
+ return getSignaturesOfType(c, propType, 0 /* SignatureKind.Call */).length !== 0 ? propType : undefined;
641
+ }
642
+ /** The member name of a well-known symbol such as `Symbol.iterator`. */
643
+ export function getPropertyNameForKnownSymbolName(c, name) {
644
+ const ctor = getGlobalValueSymbol(c, 'Symbol', false);
645
+ if (ctor !== undefined) {
646
+ const uniqueType = getTypeOfPropertyOfType(c, getTypeOfSymbol(c, ctor), name);
647
+ if (uniqueType !== undefined && isTypeUsableAsPropertyName(uniqueType))
648
+ return getPropertyNameFromType(uniqueType);
649
+ }
650
+ return internalSymbolNamePrefix + '@' + name;
651
+ }
652
+ function checkInExpression(c, left, right, leftType, rightType) {
653
+ if (leftType === c.silentNeverType || rightType === c.silentNeverType)
654
+ return c.silentNeverType;
655
+ if (left.kind === 80 /* SyntaxKind.PrivateIdentifier */) {
656
+ if (c.languageVersion < ScriptTarget.ESNext || !getUseDefineForClassFields(c.compilerOptions))
657
+ checkExternalEmitHelpers(c, left, 32768 /* ExternalEmitHelpers.ClassPrivateFieldIn */);
658
+ // With the right side's type known, a private name that doesn't resolve is reported as missing on it.
659
+ if (c.resolvedSymbols.get(left.id) === undefined && getContainingClass(left) !== undefined)
660
+ reportNonexistentProperty(c, left, rightType);
661
+ }
662
+ else
663
+ checkTypeAssignableTo(c, checkNonNullType(c, leftType, left), c.stringNumberSymbolType, left, undefined);
664
+ if (checkTypeAssignableTo(c, checkNonNullType(c, rightType, right), c.nonPrimitiveType, right, undefined)) {
665
+ // `{}` is assignable to `object` but may stand for a primitive, as when narrowed from `unknown`.
666
+ if (hasEmptyObjectIntersection(c, rightType))
667
+ c.error(right, 781 /* Diagnostics.Type_0_may_represent_a_primitive_value_which_is_not_permitted_as_the_right_operand_of_the_in_operator */, typeToString(c, rightType));
668
+ }
669
+ return c.booleanType;
670
+ }
671
+ function hasEmptyObjectIntersection(c, t) {
672
+ return someType(t, (u) => u === c.unknownEmptyObjectType ||
673
+ ((u.flags & 268435456 /* TypeFlags.Intersection */) !== 0 && isEmptyAnonymousObjectType(c, getBaseConstraintOrType(c, u))));
674
+ }
675
+ // ---- Logical operators
676
+ export function removeDefinitelyFalsyTypes(c, t) {
677
+ return filterType(c, t, (u) => hasTypeFacts(c, u, 4194304 /* TypeFacts.Truthy */));
678
+ }
679
+ function extractDefinitelyFalsyTypes(c, t) {
680
+ if ((t.flags & 134217728 /* TypeFlags.Union */) === 0)
681
+ return getDefinitelyFalsyPartOfType(c, t);
682
+ const types = [];
683
+ for (const u of typesOf(t))
684
+ types.push(getDefinitelyFalsyPartOfType(c, u));
685
+ return getUnionType(c, types);
686
+ }
687
+ function getDefinitelyFalsyPartOfType(c, t) {
688
+ if ((t.flags & 32 /* TypeFlags.String */) !== 0)
689
+ return c.emptyStringType;
690
+ if ((t.flags & 64 /* TypeFlags.Number */) !== 0)
691
+ return c.zeroType;
692
+ if ((t.flags & 128 /* TypeFlags.BigInt */) !== 0)
693
+ return c.zeroBigIntType;
694
+ if (t === c.regularFalseType ||
695
+ t === c.falseType ||
696
+ (t.flags & (16 /* TypeFlags.Void */ | 4 /* TypeFlags.Undefined */ | 8 /* TypeFlags.Null */ | 3 /* TypeFlags.AnyOrUnknown */)) !== 0)
697
+ return t;
698
+ if ((t.flags & 1024 /* TypeFlags.StringLiteral */) !== 0 && t.stringValue === '')
699
+ return t;
700
+ if ((t.flags & 2048 /* TypeFlags.NumberLiteral */) !== 0 && t.numberValue === 0)
701
+ return t;
702
+ if ((t.flags & 4096 /* TypeFlags.BigIntLiteral */) !== 0 && t.stringValue === '0')
703
+ return t;
704
+ return c.neverType;
705
+ }
706
+ /** Reports tests of `void` and of expressions that are syntactically always truthy or falsy. */
707
+ export function checkTruthinessOfType(c, t, node) {
708
+ if ((t.flags & 16 /* TypeFlags.Void */) !== 0) {
709
+ c.error(node, 279 /* Diagnostics.An_expression_of_type_void_cannot_be_tested_for_truthiness */);
710
+ return t;
711
+ }
712
+ const semantics = getSyntacticTruthySemantics(c, node);
713
+ if (semantics !== 3 /* PredicateSemantics.Sometimes */)
714
+ c.error(node, semantics === 1 /* PredicateSemantics.Always */
715
+ ? 992 /* Diagnostics.This_kind_of_expression_is_always_truthy */
716
+ : 993 /* Diagnostics.This_kind_of_expression_is_always_falsy */);
717
+ return t;
718
+ }
719
+ function getSyntacticTruthySemantics(c, nodeIn) {
720
+ const node = skipOuterExpressions(nodeIn);
721
+ switch (node.kind) {
722
+ case 8 /* SyntaxKind.NumericLiteral */: {
723
+ // `while (0)` and `while (1)` are idioms.
724
+ const text = getText(node);
725
+ return text === '0' || text === '1' ? 3 /* PredicateSemantics.Sometimes */ : 1 /* PredicateSemantics.Always */;
726
+ }
727
+ case 210 /* SyntaxKind.ArrayLiteralExpression */:
728
+ case 220 /* SyntaxKind.ArrowFunction */:
729
+ case 9 /* SyntaxKind.BigIntLiteral */:
730
+ case 232 /* SyntaxKind.ClassExpression */:
731
+ case 219 /* SyntaxKind.FunctionExpression */:
732
+ case 285 /* SyntaxKind.JsxElement */:
733
+ case 286 /* SyntaxKind.JsxSelfClosingElement */:
734
+ case 211 /* SyntaxKind.ObjectLiteralExpression */:
735
+ case 13 /* SyntaxKind.RegularExpressionLiteral */:
736
+ return 1 /* PredicateSemantics.Always */;
737
+ case 223 /* SyntaxKind.VoidExpression */:
738
+ case 105 /* SyntaxKind.NullKeyword */:
739
+ return 2 /* PredicateSemantics.Never */;
740
+ case 14 /* SyntaxKind.NoSubstitutionTemplateLiteral */:
741
+ case 10 /* SyntaxKind.StringLiteral */:
742
+ return getText(node) !== '' ? 1 /* PredicateSemantics.Always */ : 2 /* PredicateSemantics.Never */;
743
+ case 228 /* SyntaxKind.ConditionalExpression */: {
744
+ const cond = node;
745
+ return getSyntacticTruthySemantics(c, cond.whenTrue) | getSyntacticTruthySemantics(c, cond.whenFalse);
746
+ }
747
+ case 79 /* SyntaxKind.Identifier */:
748
+ if (getResolvedSymbol(c, node) === c.undefinedSymbol)
749
+ return 2 /* PredicateSemantics.Never */;
750
+ break;
751
+ }
752
+ return 3 /* PredicateSemantics.Sometimes */;
753
+ }
754
+ function checkNullishCoalesceOperands(c, left, right) {
755
+ const grandparent = left.parent.parent;
756
+ if (grandparent.kind === 227 /* SyntaxKind.BinaryExpression */) {
757
+ const outer = grandparent;
758
+ if (outer.left.kind === 227 /* SyntaxKind.BinaryExpression */ && outer.operatorToken.kind === 56 /* SyntaxKind.BarBarToken */)
759
+ grammarErrorOnNode(c, outer.left, 1151 /* Diagnostics.X_0_and_1_operations_cannot_be_mixed_without_parentheses */, tokenToString(60 /* SyntaxKind.QuestionQuestionToken */), tokenToString(outer.operatorToken.kind));
760
+ }
761
+ else if (left.kind === 227 /* SyntaxKind.BinaryExpression */) {
762
+ const operator = left.operatorToken.kind;
763
+ if (operator === 56 /* SyntaxKind.BarBarToken */ || operator === 55 /* SyntaxKind.AmpersandAmpersandToken */)
764
+ grammarErrorOnNode(c, left, 1151 /* Diagnostics.X_0_and_1_operations_cannot_be_mixed_without_parentheses */, tokenToString(operator), tokenToString(60 /* SyntaxKind.QuestionQuestionToken */));
765
+ }
766
+ else if (right.kind === 227 /* SyntaxKind.BinaryExpression */) {
767
+ const operator = right.operatorToken.kind;
768
+ if (operator === 55 /* SyntaxKind.AmpersandAmpersandToken */)
769
+ grammarErrorOnNode(c, right, 1151 /* Diagnostics.X_0_and_1_operations_cannot_be_mixed_without_parentheses */, tokenToString(60 /* SyntaxKind.QuestionQuestionToken */), tokenToString(operator));
770
+ }
771
+ const leftTarget = skipOuterExpressions(left);
772
+ const semantics = getSyntacticNullishnessSemantics(c, leftTarget);
773
+ if (semantics === 1 /* PredicateSemantics.Always */)
774
+ c.error(leftTarget, 991 /* Diagnostics.This_expression_is_always_nullish */);
775
+ else if (semantics !== 3 /* PredicateSemantics.Sometimes */)
776
+ c.error(leftTarget, 989 /* Diagnostics.Right_operand_of_is_unreachable_because_the_left_operand_is_never_nullish */);
777
+ }
778
+ function getSyntacticNullishnessSemantics(c, nodeIn) {
779
+ const node = skipOuterExpressions(nodeIn);
780
+ switch (node.kind) {
781
+ case 224 /* SyntaxKind.AwaitExpression */:
782
+ case 214 /* SyntaxKind.CallExpression */:
783
+ case 216 /* SyntaxKind.TaggedTemplateExpression */:
784
+ case 213 /* SyntaxKind.ElementAccessExpression */:
785
+ case 237 /* SyntaxKind.MetaProperty */:
786
+ case 215 /* SyntaxKind.NewExpression */:
787
+ case 212 /* SyntaxKind.PropertyAccessExpression */:
788
+ case 230 /* SyntaxKind.YieldExpression */:
789
+ case 109 /* SyntaxKind.ThisKeyword */:
790
+ return 3 /* PredicateSemantics.Sometimes */;
791
+ case 227 /* SyntaxKind.BinaryExpression */: {
792
+ const binary = node;
793
+ switch (binary.operatorToken.kind) {
794
+ case 56 /* SyntaxKind.BarBarToken */:
795
+ case 75 /* SyntaxKind.BarBarEqualsToken */:
796
+ case 55 /* SyntaxKind.AmpersandAmpersandToken */:
797
+ case 76 /* SyntaxKind.AmpersandAmpersandEqualsToken */:
798
+ return 3 /* PredicateSemantics.Sometimes */;
799
+ // The right operand decides.
800
+ case 27 /* SyntaxKind.CommaToken */:
801
+ case 63 /* SyntaxKind.EqualsToken */:
802
+ case 60 /* SyntaxKind.QuestionQuestionToken */:
803
+ case 77 /* SyntaxKind.QuestionQuestionEqualsToken */:
804
+ return getSyntacticNullishnessSemantics(c, binary.right);
805
+ }
806
+ return 2 /* PredicateSemantics.Never */;
807
+ }
808
+ case 228 /* SyntaxKind.ConditionalExpression */: {
809
+ const cond = node;
810
+ return getSyntacticNullishnessSemantics(c, cond.whenTrue) | getSyntacticNullishnessSemantics(c, cond.whenFalse);
811
+ }
812
+ case 105 /* SyntaxKind.NullKeyword */:
813
+ return 1 /* PredicateSemantics.Always */;
814
+ case 79 /* SyntaxKind.Identifier */:
815
+ return getResolvedSymbol(c, node) === c.undefinedSymbol
816
+ ? 1 /* PredicateSemantics.Always */
817
+ : 3 /* PredicateSemantics.Sometimes */;
818
+ }
819
+ return 2 /* PredicateSemantics.Never */;
820
+ }
821
+ // ---- Conditions
822
+ export function checkConditionalExpression(c, node, checkMode) {
823
+ const t = checkTruthinessExpression(c, node.condition, checkMode);
824
+ checkTestingKnownTruthyType(c, node.condition, t, node.whenTrue);
825
+ const type1 = checkExpressionEx(c, node.whenTrue, checkMode);
826
+ const type2 = checkExpressionEx(c, node.whenFalse, checkMode);
827
+ return getUnionTypeEx(c, [type1, type2], 2 /* UnionReduction.Subtype */, undefined, undefined);
828
+ }
829
+ export function checkTruthinessExpression(c, node, checkMode) {
830
+ return checkTruthinessOfType(c, checkExpressionEx(c, node, checkMode), node);
831
+ }
832
+ /**
833
+ * Reports conditions on functions and promises that are always defined and not used in `body`,
834
+ * which usually means a missing call or `await`. Only under strictNullChecks.
835
+ */
836
+ export function checkTestingKnownTruthyType(c, condExpr, condType, body) {
837
+ if (!c.strictNullChecks)
838
+ return;
839
+ let expr = skipParentheses(condExpr);
840
+ checkTestingKnownTruthyTypeWorker(c, expr, condType, body);
841
+ while (expr.kind === 227 /* SyntaxKind.BinaryExpression */ &&
842
+ (expr.operatorToken.kind === 56 /* SyntaxKind.BarBarToken */ ||
843
+ expr.operatorToken.kind === 60 /* SyntaxKind.QuestionQuestionToken */)) {
844
+ expr = skipParentheses(expr.left);
845
+ checkTestingKnownTruthyTypeWorker(c, expr, condType, body);
846
+ }
847
+ }
848
+ function isLogicalOrCoalescingExpression(node) {
849
+ return (node.kind === 227 /* SyntaxKind.BinaryExpression */ &&
850
+ isLogicalOrCoalescingOperator(node.operatorToken.kind));
851
+ }
852
+ function checkTestingKnownTruthyTypeWorker(c, condExpr, condType, body) {
853
+ const location = isLogicalOrCoalescingExpression(condExpr)
854
+ ? skipParentheses(condExpr.right)
855
+ : condExpr;
856
+ if (isLogicalOrCoalescingExpression(location)) {
857
+ checkTestingKnownTruthyType(c, location, condType, body);
858
+ return;
859
+ }
860
+ const t = location !== condExpr ? checkExpression(c, location) : condType;
861
+ if ((t.flags & 32768 /* TypeFlags.EnumLiteral */) !== 0 && location.kind === 212 /* SyntaxKind.PropertyAccessExpression */) {
862
+ const leftSymbol = c.resolvedSymbols.get(location.expression.id);
863
+ if (leftSymbol !== undefined && (leftSymbol.flags & 384 /* SymbolFlags.Enum */) !== 0) {
864
+ // An enum member with a known value is always truthy or always falsy.
865
+ const value = t;
866
+ const truthy = (t.flags & 1024 /* TypeFlags.StringLiteral */) !== 0 ? value.stringValue !== '' : value.numberValue !== 0;
867
+ c.error(location, 966 /* Diagnostics.This_condition_will_always_return_0 */, truthy ? 'true' : 'false');
868
+ return;
869
+ }
870
+ }
871
+ const isPropertyExpressionCast = location.kind === 212 /* SyntaxKind.PropertyAccessExpression */ &&
872
+ isTypeAssertion(location.expression);
873
+ if (!hasTypeFacts(c, t, 4194304 /* TypeFacts.Truthy */) || isPropertyExpressionCast)
874
+ return;
875
+ // Known-truthy tests are only reported for functions and promises: values from declarations
876
+ // without strictNullChecks would produce too many false positives otherwise.
877
+ const isPromise = getAwaitedTypeOfPromise(c, t) !== undefined;
878
+ if (getSignaturesOfType(c, t, 0 /* SignatureKind.Call */).length === 0 && !isPromise)
879
+ return;
880
+ let testedNode = undefined;
881
+ if (location.kind === 79 /* SyntaxKind.Identifier */)
882
+ testedNode = location;
883
+ else if (location.kind === 212 /* SyntaxKind.PropertyAccessExpression */)
884
+ testedNode = location.name;
885
+ const testedSymbol = testedNode !== undefined ? getSymbolAtLocationWorker(c, testedNode, false) : undefined;
886
+ if (testedSymbol === undefined && !isPromise)
887
+ return;
888
+ const isUsed = testedSymbol !== undefined &&
889
+ ((condExpr.parent.kind === 227 /* SyntaxKind.BinaryExpression */ &&
890
+ isSymbolUsedInBinaryExpressionChain(c, condExpr.parent, testedSymbol)) ||
891
+ (body !== undefined && isSymbolUsedInConditionBody(c, condExpr, body, testedNode, testedSymbol)));
892
+ if (isUsed)
893
+ return;
894
+ if (isPromise)
895
+ errorAndMaybeSuggestAwait(c, location, true, 933 /* Diagnostics.This_condition_will_always_return_true_since_this_0_is_always_defined */, [typeToString(c, t, undefined, 64 /* TypeFormatFlags.UseFullyQualifiedType */)]);
896
+ else
897
+ c.error(location, 906 /* Diagnostics.This_condition_will_always_return_true_since_this_function_is_always_defined_Did_you_mean_to_call_it_instead */);
898
+ }
899
+ export function isTypeAssertion(node) {
900
+ const n = skipParentheses(node);
901
+ return n.kind === 217 /* SyntaxKind.TypeAssertionExpression */ || n.kind === 235 /* SyntaxKind.AsExpression */;
902
+ }
903
+ function isSymbolUsedInBinaryExpressionChain(c, nodeIn, testedSymbol) {
904
+ let node = nodeIn;
905
+ while (node.kind === 227 /* SyntaxKind.BinaryExpression */ &&
906
+ node.operatorToken.kind === 55 /* SyntaxKind.AmpersandAmpersandToken */) {
907
+ if (node.right.forEachChild(new SymbolUseFinder(c, testedSymbol)))
908
+ return true;
909
+ node = node.parent;
910
+ }
911
+ return false;
912
+ }
913
+ /** Finds an identifier referring to a symbol. */
914
+ class SymbolUseFinder extends NodeVisitor {
915
+ c;
916
+ symbol;
917
+ constructor(c, symbol) {
918
+ super();
919
+ this.c = c;
920
+ this.symbol = symbol;
921
+ }
922
+ visitNode(node) {
923
+ if (node.kind === 79 /* SyntaxKind.Identifier */ && getSymbolAtLocationWorker(this.c, node, false) === this.symbol)
924
+ return true;
925
+ return node.forEachChild(this);
926
+ }
927
+ }
928
+ function isSymbolUsedInConditionBody(c, expr, body, testedNode, testedSymbol) {
929
+ return body.forEachChild(new ConditionBodyUseFinder(c, expr, testedNode, testedSymbol));
930
+ }
931
+ /** Finds a use of the tested symbol on the same target as in the condition. */
932
+ class ConditionBodyUseFinder extends NodeVisitor {
933
+ c;
934
+ expr;
935
+ testedNode;
936
+ testedSymbol;
937
+ constructor(c, expr, testedNode, testedSymbol) {
938
+ super();
939
+ this.c = c;
940
+ this.expr = expr;
941
+ this.testedNode = testedNode;
942
+ this.testedSymbol = testedSymbol;
943
+ }
944
+ visitNode(node) {
945
+ if (node.kind === 79 /* SyntaxKind.Identifier */ && getSymbolAtLocationWorker(this.c, node, false) === this.testedSymbol) {
946
+ // A simple identifier test needs no target comparison.
947
+ if (this.expr.kind === 79 /* SyntaxKind.Identifier */ ||
948
+ (this.testedNode.kind === 79 /* SyntaxKind.Identifier */ && this.testedNode.parent.kind === 227 /* SyntaxKind.BinaryExpression */))
949
+ return true;
950
+ let tested = this.testedNode.parent;
951
+ let child = node.parent;
952
+ while (tested !== undefined && child !== undefined) {
953
+ if (tested.kind === 79 /* SyntaxKind.Identifier */ && child.kind === 79 /* SyntaxKind.Identifier */)
954
+ return getSymbolAtLocationWorker(this.c, tested, false) === getSymbolAtLocationWorker(this.c, child, false);
955
+ if (tested.kind === 109 /* SyntaxKind.ThisKeyword */ && child.kind === 109 /* SyntaxKind.ThisKeyword */)
956
+ return true;
957
+ if (tested.kind === 212 /* SyntaxKind.PropertyAccessExpression */ && child.kind === 212 /* SyntaxKind.PropertyAccessExpression */) {
958
+ if (getSymbolAtLocationWorker(this.c, tested.name, false) !==
959
+ getSymbolAtLocationWorker(this.c, child.name, false))
960
+ return false;
961
+ child = getExpression(child);
962
+ tested = getExpression(tested);
963
+ }
964
+ else if (tested.kind === 214 /* SyntaxKind.CallExpression */ && child.kind === 214 /* SyntaxKind.CallExpression */) {
965
+ child = getExpression(child);
966
+ tested = getExpression(tested);
967
+ }
968
+ else
969
+ return false;
970
+ }
971
+ }
972
+ return node.forEachChild(this);
973
+ }
974
+ }
975
+ // ---- Comma operator
976
+ /**
977
+ * Whether evaluating `expr` itself has no side effects, as a smell test for discarded values
978
+ * like the left side of a comma.
979
+ */
980
+ function isSideEffectFree(expr) {
981
+ const node = skipParentheses(expr);
982
+ switch (node.kind) {
983
+ case 79 /* SyntaxKind.Identifier */:
984
+ case 10 /* SyntaxKind.StringLiteral */:
985
+ case 13 /* SyntaxKind.RegularExpressionLiteral */:
986
+ case 216 /* SyntaxKind.TaggedTemplateExpression */:
987
+ case 229 /* SyntaxKind.TemplateExpression */:
988
+ case 14 /* SyntaxKind.NoSubstitutionTemplateLiteral */:
989
+ case 8 /* SyntaxKind.NumericLiteral */:
990
+ case 9 /* SyntaxKind.BigIntLiteral */:
991
+ case 111 /* SyntaxKind.TrueKeyword */:
992
+ case 96 /* SyntaxKind.FalseKeyword */:
993
+ case 105 /* SyntaxKind.NullKeyword */:
994
+ case 157 /* SyntaxKind.UndefinedKeyword */:
995
+ case 219 /* SyntaxKind.FunctionExpression */:
996
+ case 232 /* SyntaxKind.ClassExpression */:
997
+ case 220 /* SyntaxKind.ArrowFunction */:
998
+ case 210 /* SyntaxKind.ArrayLiteralExpression */:
999
+ case 211 /* SyntaxKind.ObjectLiteralExpression */:
1000
+ case 222 /* SyntaxKind.TypeOfExpression */:
1001
+ case 236 /* SyntaxKind.NonNullExpression */:
1002
+ case 286 /* SyntaxKind.JsxSelfClosingElement */:
1003
+ case 285 /* SyntaxKind.JsxElement */:
1004
+ return true;
1005
+ case 228 /* SyntaxKind.ConditionalExpression */: {
1006
+ const cond = node;
1007
+ return isSideEffectFree(cond.whenTrue) && isSideEffectFree(cond.whenFalse);
1008
+ }
1009
+ case 227 /* SyntaxKind.BinaryExpression */: {
1010
+ const binary = node;
1011
+ if (isAssignmentOperator(binary.operatorToken.kind))
1012
+ return false;
1013
+ return isSideEffectFree(binary.left) && isSideEffectFree(binary.right);
1014
+ }
1015
+ case 225 /* SyntaxKind.PrefixUnaryExpression */:
1016
+ switch (node.operator) {
1017
+ case 53 /* SyntaxKind.ExclamationToken */:
1018
+ case 39 /* SyntaxKind.PlusToken */:
1019
+ case 40 /* SyntaxKind.MinusToken */:
1020
+ case 54 /* SyntaxKind.TildeToken */:
1021
+ return true;
1022
+ }
1023
+ return false;
1024
+ }
1025
+ return false;
1026
+ }
1027
+ /** `(0, x.f)(...)` or `(0, eval)(...)`, which call without passing `this`. */
1028
+ function isIndirectCall(node) {
1029
+ const left = node.left;
1030
+ const right = node.right;
1031
+ const parent = node.parent;
1032
+ if (parent.kind !== 218 /* SyntaxKind.ParenthesizedExpression */ ||
1033
+ left.kind !== 8 /* SyntaxKind.NumericLiteral */ ||
1034
+ getText(left) !== '0')
1035
+ return false;
1036
+ const grand = parent.parent;
1037
+ const called = (grand.kind === 214 /* SyntaxKind.CallExpression */ && getExpression(grand) === parent) ||
1038
+ grand.kind === 216 /* SyntaxKind.TaggedTemplateExpression */;
1039
+ return called && (isAccessExpression(right) || (right.kind === 79 /* SyntaxKind.Identifier */ && getText(right) === 'eval'));
1040
+ }