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,1867 @@
1
+ // Answers declaration emit's queries from syntax and the binder: visibility, aliases to keep,
2
+ // overloads and enum values exactly; types from annotations and the isolatedDeclarations
3
+ // rules (literals, `as const`, annotated function expressions). Types that need inference
4
+ // are reported to the tracker and written as `any`.
5
+ import {
6
+ AsExpression,
7
+ BigIntLiteral,
8
+ ObjectLiteralExpression,
9
+ BindingElement,
10
+ BindingPattern,
11
+ ComputedPropertyName,
12
+ ElementAccessExpression,
13
+ ExportDeclaration,
14
+ ExportSpecifier,
15
+ ExternalModuleReference,
16
+ FileReference,
17
+ FunctionTypeNode,
18
+ Identifier,
19
+ ImportAttribute,
20
+ ImportAttributes,
21
+ type ImportDeclaration,
22
+ ImportEqualsDeclaration,
23
+ KeywordTypeNode,
24
+ LiteralTypeNode,
25
+ MethodSignatureDeclaration,
26
+ ModifierFlags,
27
+ ModuleDeclaration,
28
+ type Node,
29
+ NodeFlags,
30
+ NodeList,
31
+ NodeVisitor,
32
+ NumericLiteral,
33
+ ParameterDeclaration,
34
+ PrefixUnaryExpression,
35
+ PrivateIdentifier,
36
+ PropertyAccessExpression,
37
+ PropertySignatureDeclaration,
38
+ QualifiedName,
39
+ SetAccessorDeclaration,
40
+ GetAccessorDeclaration,
41
+ HeritageClause,
42
+ SourceFile,
43
+ StringLiteral,
44
+ NoSubstitutionTemplateLiteral,
45
+ TemplateMiddle,
46
+ TemplateTail,
47
+ TypePredicateNode,
48
+ TupleTypeNode,
49
+ TypeLiteralNode,
50
+ TypeOperatorNode,
51
+ TypeQueryNode,
52
+ TypeReferenceNode,
53
+ UnionTypeNode,
54
+ VariableDeclaration,
55
+ type ExpressionWithTypeArguments,
56
+ getAsteriskToken,
57
+ getBody,
58
+ getExpression,
59
+ getInitializer,
60
+ getMembers,
61
+ getName,
62
+ getText,
63
+ getParameters,
64
+ getSymbol,
65
+ getType,
66
+ type EntityName,
67
+ } from '../ast.js';
68
+ import { isAmbientModule, isFunctionLike, nodeIsPresent } from '../ast-utilities.js';
69
+ import { ContainerFlags, getContainerFlags } from '../binder.js';
70
+ import {
71
+ getCombinedModifierFlags,
72
+ getCombinedNodeFlags,
73
+ getRootDeclaration,
74
+ getSourceFileOfNode,
75
+ hasSyntacticModifier,
76
+ isEntityNameExpression,
77
+ isExternalOrCommonJSModule,
78
+ isGlobalSourceFile,
79
+ isIdentifierNamed,
80
+ isModuleAugmentationExternal,
81
+ isParameterPropertyDeclaration,
82
+ isStringOrNumericLiteralLike,
83
+ skipParentheses,
84
+ } from '../binder-utilities.js';
85
+ import { NameResolver } from '../name-resolver.js';
86
+ import type { CompilerOptions, ModuleKind } from '../options.js';
87
+ import { ModuleKind as ModuleKinds } from '../options.js';
88
+ import { combinePaths, getDirectoryPath, getNormalizedAbsolutePath, normalizePath } from '../path.js';
89
+ import type { EmitContext } from '../printer/emit-context.js';
90
+ import { EmitFlags } from '../printer/emit-flags.js';
91
+ import { isIdentifierText } from '../scanner.js';
92
+ import { SyntaxKind } from '../syntax-kind.js';
93
+ import { TokenFlags } from '../types.js';
94
+ import type { SyntacticEmitResolver } from './emit-resolver.js';
95
+ import type { TypeReferenceSerializationKind } from './type-serialization.js';
96
+ import type { Evaluation } from './reference-resolver.js';
97
+ import {
98
+ DeclarationEmitResolver,
99
+ NodeBuilderFlags,
100
+ SymbolAccessibility,
101
+ SymbolAccessibilityResult,
102
+ type SymbolTracker,
103
+ accessible,
104
+ } from './declarations-resolver.js';
105
+ import {
106
+ DirectType,
107
+ InferredType,
108
+ LiteralType,
109
+ MaybeConstType,
110
+ NoResultType,
111
+ ObjectLiteralType,
112
+ PseudoChecker,
113
+ PseudoMemberKind,
114
+ type PseudoParameter,
115
+ type PseudoType,
116
+ PseudoTypeKind,
117
+ SignatureType,
118
+ TupleType,
119
+ UnionType,
120
+ collectReturnStatements,
121
+ couldAlreadyReferToUndefined,
122
+ isConstTypeReference,
123
+ isInConstContext,
124
+ lastRequiredParameterIndex,
125
+ typesOf,
126
+ undefinedType,
127
+ } from './declarations-pseudo.js';
128
+ import {
129
+ addDeclaration,
130
+ declarationCount,
131
+ getDeclarations,
132
+ setDeclarations,
133
+ Symbol,
134
+ SymbolFlags,
135
+ type SymbolTable,
136
+ } from '../symbol.js';
137
+
138
+ const emptyTable: SymbolTable = new Map<string, Symbol>();
139
+
140
+ /** Name resolution without module resolution: an import may name anything. */
141
+ class DeclarationNameResolver extends NameResolver {
142
+ /** Global symbols merged across files, by each file's symbol. */
143
+ readonly mergedSymbols: Map<Symbol, Symbol>;
144
+
145
+ constructor(options: CompilerOptions, mergedSymbols: Map<Symbol, Symbol>) {
146
+ super(options);
147
+ this.mergedSymbols = mergedSymbols;
148
+ }
149
+
150
+ getSymbolOfDeclaration(node: Node): Symbol | undefined {
151
+ const symbol = getSymbol(node);
152
+ return symbol === undefined ? undefined : (this.mergedSymbols.get(symbol) ?? symbol);
153
+ }
154
+
155
+ lookup(symbols: SymbolTable, name: string, meaning: SymbolFlags): Symbol | undefined {
156
+ if ((meaning & SymbolFlags.All) === 0) return undefined;
157
+ const symbol = symbols.get(name);
158
+ if (symbol === undefined) return undefined;
159
+ if ((symbol.flags & meaning) !== 0) return symbol;
160
+ // The checker resolves the alias; an unresolvable one matches every meaning.
161
+ return (symbol.flags & SymbolFlags.Alias) !== 0 ? symbol : undefined;
162
+ }
163
+ }
164
+
165
+ /** How much of a file's declaration types needed inference. */
166
+ export class InferenceCounts {
167
+ /** Types without annotations or literal initializers. */
168
+ fallbacks: number;
169
+ /** Of those, the ones written as `any` because only the checker knows them. */
170
+ unresolved: number;
171
+
172
+ constructor() {
173
+ this.fallbacks = 0;
174
+ this.unresolved = 0;
175
+ }
176
+ }
177
+
178
+ /**
179
+ * The files of a program by path and its globals merged across script files, as declaration emit
180
+ * without the checker resolves names. Read-only once built, so checker threads can share one.
181
+ */
182
+ export class DeclarationGlobals {
183
+ readonly filesByPath: Map<string, SourceFile>;
184
+ readonly globals: Map<string, Symbol>;
185
+ /** Global symbols merged across files, by each file's symbol. */
186
+ readonly mergedSymbols: Map<Symbol, Symbol>;
187
+
188
+ constructor(files: readonly SourceFile[], currentDirectory: string) {
189
+ this.filesByPath = new Map<string, SourceFile>();
190
+ this.globals = new Map<string, Symbol>();
191
+ this.mergedSymbols = new Map<Symbol, Symbol>();
192
+ for (const file of files) {
193
+ this.filesByPath.set(getNormalizedAbsolutePath(file.fileName, currentDirectory), file);
194
+ if (!isExternalOrCommonJSModule(file) && file.locals !== undefined)
195
+ mergeInto(this.globals, file.locals, this.mergedSymbols);
196
+ }
197
+ }
198
+ }
199
+
200
+ export class SyntacticDeclarationEmitResolver extends DeclarationEmitResolver {
201
+ readonly options: CompilerOptions;
202
+ readonly strictNullChecks: boolean;
203
+ private readonly emitResolver: SyntacticEmitResolver;
204
+ private readonly names: DeclarationNameResolver;
205
+ private readonly pseudo: PseudoChecker;
206
+ private readonly filesByPath: Map<string, SourceFile>;
207
+ private readonly visibility: Map<Node, boolean>;
208
+ private readonly aliasesMarked: Set<SourceFile>;
209
+ /** Inference counts by file. */
210
+ readonly inference: Map<SourceFile, InferenceCounts>;
211
+
212
+ /**
213
+ * `emitResolver` answers the queries of JavaScript emit and enum values. `indexed` is the program's
214
+ * `DeclarationGlobals` if they were built before; otherwise they are built from `files`.
215
+ */
216
+ constructor(
217
+ options: CompilerOptions,
218
+ files: readonly SourceFile[],
219
+ currentDirectory: string,
220
+ emitResolver: SyntacticEmitResolver,
221
+ indexed: DeclarationGlobals | undefined = undefined,
222
+ ) {
223
+ super();
224
+ this.options = options;
225
+ this.strictNullChecks =
226
+ options.strictNullChecks !== undefined ? options.strictNullChecks : options.strict !== false;
227
+ this.emitResolver = emitResolver;
228
+ const index = indexed !== undefined ? indexed : new DeclarationGlobals(files, currentDirectory);
229
+ this.names = new DeclarationNameResolver(options, index.mergedSymbols);
230
+ this.pseudo = new PseudoChecker(this.strictNullChecks, index.mergedSymbols, this.names);
231
+ this.filesByPath = index.filesByPath;
232
+ this.visibility = new Map<Node, boolean>();
233
+ this.aliasesMarked = new Set<SourceFile>();
234
+ this.inference = new Map<SourceFile, InferenceCounts>();
235
+ this.names.globals = index.globals;
236
+ }
237
+
238
+ // Emit queries
239
+
240
+ markLinkedReferences(file: SourceFile): boolean {
241
+ return this.emitResolver.markLinkedReferences(file);
242
+ }
243
+
244
+ isReferencedAliasDeclaration(node: Node): boolean {
245
+ return this.emitResolver.isReferencedAliasDeclaration(node);
246
+ }
247
+
248
+ isValueAliasDeclaration(node: Node): boolean {
249
+ return this.emitResolver.isValueAliasDeclaration(node);
250
+ }
251
+
252
+ isTopLevelValueImportEqualsWithEntityName(node: Node): boolean {
253
+ return this.emitResolver.isTopLevelValueImportEqualsWithEntityName(node);
254
+ }
255
+
256
+ // Visibility
257
+
258
+ precalculateDeclarationEmitVisibility(file: SourceFile): boolean {
259
+ if (this.aliasesMarked.has(file)) return false;
260
+ this.aliasesMarked.add(file);
261
+ file.forEachChild(new AliasMarker(this));
262
+ return true;
263
+ }
264
+
265
+ /** Marks the declarations an export names visible, following `import x = a.b` chains. */
266
+ markLinkedAliases(node: Node): boolean {
267
+ const meaning = SymbolFlags.Value | SymbolFlags.Type | SymbolFlags.Namespace | SymbolFlags.Alias;
268
+ const parent = node.parent!;
269
+ let symbol: Symbol | undefined = undefined;
270
+ if (node.kind !== SyntaxKind.StringLiteral && parent.kind === SyntaxKind.ExportAssignment)
271
+ symbol = this.resolveName(node, getIdentifierText(node), meaning);
272
+ else if (parent instanceof ExportSpecifier) {
273
+ const declaration = parent.parent!.parent!;
274
+ if (
275
+ declaration instanceof ExportDeclaration &&
276
+ declaration.moduleSpecifier === undefined &&
277
+ node instanceof Identifier &&
278
+ node.text !== 'default'
279
+ )
280
+ symbol = this.resolveName(node, node.text, meaning);
281
+ }
282
+ const visited = new Set<Symbol>();
283
+ while (symbol !== undefined && !visited.has(symbol)) {
284
+ visited.add(symbol);
285
+ let next: Symbol | undefined = undefined;
286
+ for (const declaration of getDeclarations(symbol)) {
287
+ this.visibility.set(declaration, true);
288
+ if (
289
+ declaration instanceof ImportEqualsDeclaration &&
290
+ !(declaration.moduleReference instanceof ExternalModuleReference)
291
+ ) {
292
+ const first = getFirstIdentifier(declaration.moduleReference);
293
+ next = this.resolveName(declaration, getIdentifierText(first), meaning);
294
+ }
295
+ }
296
+ symbol = next;
297
+ }
298
+ return true;
299
+ }
300
+
301
+ isDeclarationVisible(node: Node): boolean {
302
+ if ((node.flags & NodeFlags.Synthesized) !== 0) return false;
303
+ const cached = this.visibility.get(node);
304
+ if (cached !== undefined) return cached;
305
+ const visible = this.determineIfDeclarationIsVisible(node);
306
+ this.visibility.set(node, visible);
307
+ return visible;
308
+ }
309
+
310
+ private determineIfDeclarationIsVisible(node: Node): boolean {
311
+ switch (node.kind) {
312
+ case SyntaxKind.JSDocCallbackTag:
313
+ case SyntaxKind.JSDocTypedefTag: {
314
+ // Top-level JSDoc type aliases are exported.
315
+ const host = node.parent?.parent?.parent;
316
+ return host !== undefined && host.kind === SyntaxKind.SourceFile;
317
+ }
318
+ case SyntaxKind.BindingElement:
319
+ return this.isDeclarationVisible(node.parent!.parent!);
320
+ case SyntaxKind.VariableDeclaration:
321
+ case SyntaxKind.ModuleDeclaration:
322
+ case SyntaxKind.ClassDeclaration:
323
+ case SyntaxKind.InterfaceDeclaration:
324
+ case SyntaxKind.TypeAliasDeclaration:
325
+ case SyntaxKind.JSTypeAliasDeclaration:
326
+ case SyntaxKind.FunctionDeclaration:
327
+ case SyntaxKind.EnumDeclaration:
328
+ case SyntaxKind.ImportEqualsDeclaration: {
329
+ if (
330
+ node instanceof VariableDeclaration &&
331
+ node.name instanceof BindingPattern &&
332
+ node.name.elements.nodes.length === 0
333
+ )
334
+ return false;
335
+ if (isExternalModuleAugmentation(node) || isImplicitlyExportedJSDocDeclaration(node)) return true;
336
+ const parent = getDeclarationContainer(node);
337
+ // Unexported declarations are visible only in global files; ambient module members are exported.
338
+ if (
339
+ (getCombinedModifierFlags(node) & ModifierFlags.Export) === 0 &&
340
+ !(
341
+ node.kind !== SyntaxKind.ImportEqualsDeclaration &&
342
+ parent.kind !== SyntaxKind.SourceFile &&
343
+ (parent.flags & NodeFlags.Ambient) !== 0
344
+ )
345
+ )
346
+ return isGlobalSourceFile(parent);
347
+ return this.isDeclarationVisible(parent);
348
+ }
349
+ case SyntaxKind.PropertyDeclaration:
350
+ case SyntaxKind.PropertySignature:
351
+ case SyntaxKind.GetAccessor:
352
+ case SyntaxKind.SetAccessor:
353
+ case SyntaxKind.MethodDeclaration:
354
+ case SyntaxKind.MethodSignature:
355
+ if (this.getEffectiveDeclarationFlags(node, ModifierFlags.Private | ModifierFlags.Protected) !== 0)
356
+ return false;
357
+ return this.isDeclarationVisible(node.parent!);
358
+ case SyntaxKind.Constructor:
359
+ case SyntaxKind.ConstructSignature:
360
+ case SyntaxKind.CallSignature:
361
+ case SyntaxKind.IndexSignature:
362
+ case SyntaxKind.Parameter:
363
+ case SyntaxKind.ModuleBlock:
364
+ case SyntaxKind.FunctionType:
365
+ case SyntaxKind.ConstructorType:
366
+ case SyntaxKind.TypeLiteral:
367
+ case SyntaxKind.TypeReference:
368
+ case SyntaxKind.ArrayType:
369
+ case SyntaxKind.TupleType:
370
+ case SyntaxKind.UnionType:
371
+ case SyntaxKind.IntersectionType:
372
+ case SyntaxKind.ParenthesizedType:
373
+ case SyntaxKind.NamedTupleMember:
374
+ return this.isDeclarationVisible(node.parent!);
375
+ // Imports are visible only once something refers to them.
376
+ case SyntaxKind.ImportClause:
377
+ case SyntaxKind.NamespaceImport:
378
+ case SyntaxKind.ImportSpecifier:
379
+ return false;
380
+ case SyntaxKind.TypeParameter:
381
+ case SyntaxKind.SourceFile:
382
+ case SyntaxKind.NamespaceExportDeclaration:
383
+ return true;
384
+ case SyntaxKind.ExportAssignment:
385
+ return false;
386
+ case SyntaxKind.ExportSpecifier: {
387
+ const declaration = node.parent!.parent!;
388
+ if (declaration instanceof ExportDeclaration && declaration.moduleSpecifier === undefined)
389
+ return this.isDeclarationVisible(declaration.parent!);
390
+ return false;
391
+ }
392
+ }
393
+ return false;
394
+ }
395
+
396
+ isEntityNameVisible(entityName: Node, enclosingDeclaration: Node): SymbolAccessibilityResult {
397
+ if ((entityName.flags & NodeFlags.Synthesized) !== 0)
398
+ return new SymbolAccessibilityResult(SymbolAccessibility.NotAccessible, [], '', undefined, '');
399
+ const meaning = getMeaningOfEntityNameReference(entityName);
400
+ const first = getFirstIdentifier(entityName);
401
+ const text = getIdentifierText(first);
402
+ const symbol = this.resolveName(enclosingDeclaration, text, meaning);
403
+ if (symbol !== undefined && (symbol.flags & SymbolFlags.TypeParameter) !== 0 && (meaning & SymbolFlags.Type) !== 0)
404
+ return accessible([]);
405
+ if (symbol === undefined && (first.kind === SyntaxKind.ThisKeyword || text === 'this')) return accessible([]);
406
+ if (symbol === undefined)
407
+ return new SymbolAccessibilityResult(SymbolAccessibility.NotResolved, [], text, first, '');
408
+ const visible = this.hasVisibleDeclarations(symbol, true);
409
+ if (visible !== undefined) return visible;
410
+ return new SymbolAccessibilityResult(SymbolAccessibility.NotAccessible, [], text, first, '');
411
+ }
412
+
413
+ isSymbolAccessible(
414
+ symbol: Symbol,
415
+ _enclosingDeclaration: Node,
416
+ _meaning: SymbolFlags,
417
+ shouldComputeAliasesToMakeVisible: boolean,
418
+ ): SymbolAccessibilityResult {
419
+ if ((symbol.flags & SymbolFlags.TypeParameter) !== 0) return accessible([]);
420
+ const visible = this.hasVisibleDeclarations(symbol, shouldComputeAliasesToMakeVisible);
421
+ if (visible !== undefined) return visible;
422
+ return new SymbolAccessibilityResult(SymbolAccessibility.NotAccessible, [], symbol.name, undefined, '');
423
+ }
424
+
425
+ /** Accessible if every declaration is visible or can be made so by keeping an unexported statement. */
426
+ private hasVisibleDeclarations(
427
+ symbol: Symbol,
428
+ shouldComputeAliasesToMakeVisible: boolean,
429
+ ): SymbolAccessibilityResult | undefined {
430
+ const aliases: Node[] = [];
431
+ for (const declaration of getDeclarations(symbol)) {
432
+ if (declaration.kind === SyntaxKind.Identifier || this.isDeclarationVisible(declaration)) continue;
433
+ let statement: Node | undefined = undefined;
434
+ // Imports and unexported declarations can name types if their parent is visible.
435
+ const anyImport = getAnyImportSyntax(declaration);
436
+ if (
437
+ anyImport !== undefined &&
438
+ !hasSyntacticModifier(anyImport, ModifierFlags.Export) &&
439
+ this.isDeclarationVisible(anyImport.parent!)
440
+ )
441
+ statement = anyImport;
442
+ else if (
443
+ declaration instanceof VariableDeclaration &&
444
+ declaration.parent!.parent!.kind === SyntaxKind.VariableStatement &&
445
+ !hasSyntacticModifier(declaration.parent!.parent!, ModifierFlags.Export) &&
446
+ this.isDeclarationVisible(declaration.parent!.parent!.parent!)
447
+ )
448
+ statement = declaration.parent!.parent!;
449
+ else if (
450
+ isLateVisibilityPaintedStatement(declaration) &&
451
+ !hasSyntacticModifier(declaration, ModifierFlags.Export) &&
452
+ this.isDeclarationVisible(declaration.parent!)
453
+ )
454
+ statement = declaration;
455
+ else if (declaration instanceof BindingElement && (symbol.flags & SymbolFlags.BlockScopedVariable) !== 0) {
456
+ const root = getRootDeclaration(declaration);
457
+ if (root.kind === SyntaxKind.Parameter) return undefined;
458
+ const variableStatement = root.parent?.parent;
459
+ if (variableStatement === undefined || variableStatement.kind !== SyntaxKind.VariableStatement)
460
+ return undefined;
461
+ // Already exported: nothing to keep.
462
+ if (hasSyntacticModifier(variableStatement, ModifierFlags.Export)) continue;
463
+ if (!this.isDeclarationVisible(variableStatement.parent!)) return undefined;
464
+ statement = variableStatement;
465
+ }
466
+ if (statement === undefined) return undefined;
467
+ if (shouldComputeAliasesToMakeVisible) {
468
+ this.visibility.set(declaration, true);
469
+ if (aliases.indexOf(statement) < 0) aliases.push(statement);
470
+ }
471
+ }
472
+ return accessible(aliases);
473
+ }
474
+
475
+ isNameResolvable(location: Node, name: string): boolean {
476
+ return this.resolveName(location, name, SymbolFlags.Value | SymbolFlags.Type | SymbolFlags.Namespace) !== undefined;
477
+ }
478
+
479
+ // Modules aren't resolved, so no import is known to be needed by an augmentation.
480
+ isImportRequiredByAugmentation(_node: ImportDeclaration): boolean {
481
+ return false;
482
+ }
483
+
484
+ // Declarations
485
+
486
+ getEffectiveDeclarationFlags(node: Node, flags: ModifierFlags): ModifierFlags {
487
+ let result = getCombinedModifierFlags(node);
488
+ const parent = node.parent;
489
+ // Class and interface members are never implicitly exported or ambient.
490
+ if (
491
+ parent !== undefined &&
492
+ parent.kind !== SyntaxKind.InterfaceDeclaration &&
493
+ parent.kind !== SyntaxKind.ClassDeclaration &&
494
+ parent.kind !== SyntaxKind.ClassExpression &&
495
+ (node.flags & NodeFlags.Ambient) !== 0
496
+ ) {
497
+ const container = getEnclosingContainer(node);
498
+ if (
499
+ container !== undefined &&
500
+ (container.flags & NodeFlags.ExportContext) !== 0 &&
501
+ (result & ModifierFlags.Ambient) === 0 &&
502
+ !(parent.kind === SyntaxKind.ModuleBlock && isGlobalScopeAugmentation(parent.parent!))
503
+ )
504
+ result |= ModifierFlags.Export;
505
+ result |= ModifierFlags.Ambient;
506
+ }
507
+ return result & flags;
508
+ }
509
+
510
+ isImplementationOfOverload(node: Node): boolean {
511
+ if ((node.flags & NodeFlags.Synthesized) !== 0 || !nodeIsPresent(getBody(node))) return false;
512
+ if (node.kind === SyntaxKind.GetAccessor || node.kind === SyntaxKind.SetAccessor) return false;
513
+ const symbol = this.getSymbolOfDeclaration(node);
514
+ if (symbol === undefined) return false;
515
+ const signatures: Node[] = [];
516
+ const declarations = getDeclarations(symbol);
517
+ for (let i = 0; i < declarations.length; i++) {
518
+ const declaration = declarations[i]!;
519
+ if (!isFunctionLike(declaration)) continue;
520
+ // An implementation directly after an overload of the same kind isn't a signature.
521
+ if (i > 0 && getBody(declaration) !== undefined) {
522
+ const previous = declarations[i - 1]!;
523
+ if (
524
+ declaration.parent === previous.parent &&
525
+ declaration.kind === previous.kind &&
526
+ declaration.pos === previous.end
527
+ )
528
+ continue;
529
+ }
530
+ signatures.push(declaration);
531
+ }
532
+ if (signatures.length > 1) return true;
533
+ return signatures.length === 1 && signatures[0] !== node && (signatures[0].flags & NodeFlags.JSDoc) === 0;
534
+ }
535
+
536
+ isLateBound(node: Node): boolean {
537
+ const name = getName(node);
538
+ if (!(name instanceof ComputedPropertyName)) return false;
539
+ return this.isLateBindableExpression(name.expression);
540
+ }
541
+
542
+ /** Whether a computed name's expression has a unique symbol or literal type, as far as declarations say. */
543
+ private isLateBindableExpression(expression: Node): boolean {
544
+ if (!isEntityNameExpression(expression, false)) return false;
545
+ const declaration = this.getEntityDeclaration(expression);
546
+ return declaration !== undefined && hasLiteralOrUniqueSymbolType(declaration);
547
+ }
548
+
549
+ /** The declaration `a` or `a.b.c` names: a variable, a member of a namespace, class or enum, or of an object type or literal. */
550
+ private getEntityDeclaration(node: Node): Node | undefined {
551
+ if (node instanceof Identifier) {
552
+ const symbol = this.resolveName(node, node.text, SymbolFlags.Value | SymbolFlags.ExportValue);
553
+ if (symbol === undefined) return undefined;
554
+ const resolved = symbol.exportSymbol ?? symbol;
555
+ return resolved.valueDeclaration ?? (declarationCount(resolved) > 0 ? resolved.declaration! : undefined);
556
+ }
557
+ if (!(node instanceof PropertyAccessExpression) || !(node.name instanceof Identifier)) return undefined;
558
+ const name = node.name.text;
559
+ const left = node.expression;
560
+ if (left.kind === SyntaxKind.Identifier || left.kind === SyntaxKind.PropertyAccessExpression) {
561
+ const symbol = this.resolveEntityNameExpression(left, SymbolFlags.Value | SymbolFlags.Namespace);
562
+ if (symbol !== undefined && (symbol.flags & SymbolFlags.Alias) === 0) {
563
+ const member = (symbol.exports ?? emptyTable).get(name);
564
+ if (member !== undefined) return member.valueDeclaration;
565
+ }
566
+ }
567
+ // A member of a variable's object type or object literal.
568
+ const container = this.getEntityDeclaration(left);
569
+ if (!(container instanceof VariableDeclaration)) return undefined;
570
+ const members =
571
+ container.type instanceof TypeLiteralNode
572
+ ? container.type.members.nodes
573
+ : container.initializer !== undefined
574
+ ? objectLiteralProperties(container.initializer)
575
+ : [];
576
+ for (const member of members) {
577
+ const memberName = getName(member);
578
+ if (memberName !== undefined && tryGetTextOfPropertyName(memberName) === name) return member;
579
+ }
580
+ return undefined;
581
+ }
582
+
583
+ isDefinitelyReferenceToGlobalSymbolObject(node: Node): boolean {
584
+ if (!(node instanceof PropertyAccessExpression) || !(node.name instanceof Identifier)) return false;
585
+ const expression = node.expression;
586
+ if (expression instanceof Identifier)
587
+ return expression.text === 'Symbol' && this.isGlobalValue(expression, 'Symbol');
588
+ if (!(expression instanceof PropertyAccessExpression) || !(expression.expression instanceof Identifier))
589
+ return false;
590
+ return (
591
+ expression.expression.text === 'globalThis' &&
592
+ isIdentifierNamed(expression.name, 'Symbol') &&
593
+ this.resolveName(expression.expression, 'globalThis', SymbolFlags.Value) === undefined
594
+ );
595
+ }
596
+
597
+ /** Whether `name` at `location` resolves to a declaration of a global file. */
598
+ private isGlobalValue(location: Node, name: string): boolean {
599
+ const symbol = this.resolveName(location, name, SymbolFlags.Value);
600
+ return symbol !== undefined && this.pseudo.getMergedSymbol(symbol) === this.names.globals.get(name);
601
+ }
602
+
603
+ isLiteralConstDeclaration(node: Node): boolean {
604
+ if ((node.flags & NodeFlags.Synthesized) !== 0) return false;
605
+ const isConst =
606
+ node instanceof VariableDeclaration
607
+ ? (getCombinedNodeFlags(node) & NodeFlags.Const) !== 0
608
+ : (getCombinedModifierFlags(node) & ModifierFlags.Readonly) !== 0 &&
609
+ !isParameterPropertyDeclaration(node, node.parent!);
610
+ if (!isConst || getType(node) !== undefined) return false;
611
+ const initializer = getInitializer(node);
612
+ // A fresh literal type; enum members are too, but need the checker to tell apart.
613
+ return initializer !== undefined && literalOf(skipParentheses(initializer)) !== undefined;
614
+ }
615
+
616
+ isOptionalParameter(node: Node): boolean {
617
+ if (!(node instanceof ParameterDeclaration)) return false;
618
+ if (node.questionToken !== undefined) return true;
619
+ if (node.initializer === undefined) return false;
620
+ const parameters = getParameters(node.parent!)!.nodes;
621
+ return parameters.indexOf(node) >= lastRequiredParameterIndex(parameters);
622
+ }
623
+
624
+ requiresAddingImplicitUndefined(node: Node, enclosingDeclaration: Node | undefined): boolean {
625
+ if (node === undefined || !(node instanceof ParameterDeclaration) || (node.flags & NodeFlags.Synthesized) !== 0)
626
+ return false;
627
+ const required =
628
+ this.isRequiredInitializedParameter(node, enclosingDeclaration) ||
629
+ this.isOptionalUninitializedParameterProperty(node);
630
+ return required && !this.declaredTypeContainsUndefined(node);
631
+ }
632
+
633
+ private isRequiredInitializedParameter(node: ParameterDeclaration, enclosingDeclaration: Node | undefined): boolean {
634
+ if (!this.strictNullChecks || this.isOptionalParameter(node) || node.initializer === undefined) return false;
635
+ if (hasSyntacticModifier(node, ModifierFlags.ParameterPropertyModifier))
636
+ return enclosingDeclaration !== undefined && isFunctionLike(enclosingDeclaration);
637
+ return true;
638
+ }
639
+
640
+ private isOptionalUninitializedParameterProperty(node: ParameterDeclaration): boolean {
641
+ return (
642
+ this.strictNullChecks &&
643
+ this.isOptionalParameter(node) &&
644
+ node.initializer === undefined &&
645
+ hasSyntacticModifier(node, ModifierFlags.ParameterPropertyModifier)
646
+ );
647
+ }
648
+
649
+ /** Whether an annotation includes `undefined`, or names something unresolved (an error type). */
650
+ private declaredTypeContainsUndefined(node: ParameterDeclaration): boolean {
651
+ const type = node.type;
652
+ return type !== undefined && this.typeContainsUndefined(type, node);
653
+ }
654
+
655
+ private typeContainsUndefined(type: Node, location: Node): boolean {
656
+ switch (type.kind) {
657
+ case SyntaxKind.UndefinedKeyword:
658
+ case SyntaxKind.AnyKeyword:
659
+ case SyntaxKind.UnknownKeyword:
660
+ return true;
661
+ case SyntaxKind.ParenthesizedType:
662
+ return this.typeContainsUndefined(getType(type)!, location);
663
+ case SyntaxKind.UnionType:
664
+ for (const member of typesOf(type)) if (this.typeContainsUndefined(member, location)) return true;
665
+ return false;
666
+ case SyntaxKind.TypeReference: {
667
+ // An unresolved name or import is an error type, which counts as containing `undefined`.
668
+ const symbol = this.resolveName(
669
+ location,
670
+ getIdentifierText(getFirstIdentifier((type as TypeReferenceNode).typeName)),
671
+ SymbolFlags.Type | SymbolFlags.Namespace,
672
+ );
673
+ return symbol === undefined || (symbol.flags & SymbolFlags.Alias) !== 0;
674
+ }
675
+ }
676
+ return false;
677
+ }
678
+
679
+ isExpandoFunctionDeclaration(node: Node): boolean {
680
+ return this.getExpandoPropertyDeclarations(node).length > 0;
681
+ }
682
+
683
+ getExpandoPropertyDeclarations(node: Node): Node[] {
684
+ const result: Node[] = [];
685
+ let host: Node | undefined = node;
686
+ // Properties assigned to a function-valued variable are bound to the function.
687
+ if (node instanceof VariableDeclaration) host = node.initializer;
688
+ else if (node.kind !== SyntaxKind.FunctionDeclaration) host = undefined;
689
+ if (host === undefined || !isFunctionLike(host)) return result;
690
+ const symbol = getSymbol(host);
691
+ if (symbol === undefined || symbol.exports === undefined) return result;
692
+ for (const property of symbol.exports.values())
693
+ if ((property.flags & SymbolFlags.Assignment) !== 0 && property.valueDeclaration !== undefined)
694
+ result.push(property.valueDeclaration);
695
+ return result;
696
+ }
697
+
698
+ // Emit queries answered by the reference resolver.
699
+
700
+ getReferencedExportContainer(node: Identifier, prefixLocals: boolean): Node | undefined {
701
+ return this.emitResolver.getReferencedExportContainer(node, prefixLocals);
702
+ }
703
+
704
+ getReferencedImportDeclaration(node: Identifier): Node | undefined {
705
+ return this.emitResolver.getReferencedImportDeclaration(node);
706
+ }
707
+
708
+ getReferencedValueDeclaration(node: Identifier): Node | undefined {
709
+ return this.emitResolver.getReferencedValueDeclaration(node);
710
+ }
711
+
712
+ getReferencedValueDeclarations(node: Identifier): Node[] | undefined {
713
+ return this.emitResolver.getReferencedValueDeclarations(node);
714
+ }
715
+
716
+ getEnumMemberValue(member: Node): Evaluation {
717
+ return this.emitResolver.getEnumMemberValue(member);
718
+ }
719
+
720
+ getConstantValue(node: Node): Evaluation {
721
+ return this.emitResolver.getConstantValue(node);
722
+ }
723
+
724
+ setReferencedImportDeclaration(name: Identifier, declaration: Node): void {
725
+ this.emitResolver.setReferencedImportDeclaration(name, declaration);
726
+ }
727
+
728
+ getJsxFactoryEntity(file: SourceFile): EntityName | undefined {
729
+ return this.emitResolver.getJsxFactoryEntity(file);
730
+ }
731
+
732
+ getJsxFragmentFactoryEntity(file: SourceFile): EntityName | undefined {
733
+ return this.emitResolver.getJsxFragmentFactoryEntity(file);
734
+ }
735
+
736
+ getTypeReferenceSerializationKind(typeName: Node, location: Node | undefined): TypeReferenceSerializationKind {
737
+ return this.emitResolver.getTypeReferenceSerializationKind(typeName, location);
738
+ }
739
+
740
+ getResolutionModeOverride(node: Node): ModuleKind | undefined {
741
+ if (!(node instanceof ImportAttributes)) return undefined;
742
+ for (const element of node.attributes.nodes) {
743
+ if (!(element instanceof ImportAttribute)) continue;
744
+ const name = element.name;
745
+ if (name === undefined || (name.kind !== SyntaxKind.StringLiteral && name.kind !== SyntaxKind.Identifier))
746
+ continue;
747
+ if (getText(name) !== 'resolution-mode') continue;
748
+ const value = element.value;
749
+ if (!(value instanceof StringLiteral)) return undefined;
750
+ if (value.text === 'import') return ModuleKinds.ESNext;
751
+ if (value.text === 'require') return ModuleKinds.CommonJS;
752
+ }
753
+ return undefined;
754
+ }
755
+
756
+ getSourceFileFromReference(file: SourceFile, reference: FileReference): SourceFile | undefined {
757
+ const path = normalizePath(combinePaths(getDirectoryPath(file.fileName), reference.fileName));
758
+ for (const candidate of [path, path + '.ts', path + '.tsx', path + '.d.ts']) {
759
+ const found = this.filesByPath.get(candidate);
760
+ if (found !== undefined) return found;
761
+ }
762
+ return undefined;
763
+ }
764
+
765
+ // JavaScript members need the checker.
766
+
767
+ getReferencedMemberValueDeclaration(node: Node): Node | undefined {
768
+ const symbol = getSymbol(node);
769
+ return symbol === undefined ? undefined : symbol.valueDeclaration;
770
+ }
771
+
772
+ isThisPropertyAssignmentDeclarationRedundant(_node: Node): boolean {
773
+ return false;
774
+ }
775
+
776
+ getElementAccessExpressionName(node: Node): string {
777
+ if (!(node instanceof ElementAccessExpression)) return '';
778
+ const argument = node.argumentExpression;
779
+ return isStringOrNumericLiteralLike(argument) ? literalText(argument) : '';
780
+ }
781
+
782
+ // Type nodes
783
+
784
+ createTypeOfDeclaration(
785
+ context: EmitContext,
786
+ declaration: Node,
787
+ enclosingDeclaration: Node,
788
+ flags: NodeBuilderFlags,
789
+ tracker: SymbolTracker,
790
+ ): Node | undefined {
791
+ if ((declaration.flags & NodeFlags.Synthesized) !== 0) return undefined;
792
+ const writer = new PseudoTypeWriter(this, context, tracker, enclosingDeclaration, flags);
793
+ const isAccessor = declaration.kind === SyntaxKind.GetAccessor || declaration.kind === SyntaxKind.SetAccessor;
794
+ this.pseudo.uncertain = 0;
795
+ let type = isAccessor ? this.pseudo.getTypeOfAccessor(declaration) : this.pseudo.getTypeOfDeclaration(declaration);
796
+ if (
797
+ declaration.kind === SyntaxKind.Parameter &&
798
+ this.requiresAddingImplicitUndefined(declaration, enclosingDeclaration) &&
799
+ !this.pseudoContainsUndefined(type)
800
+ )
801
+ type = new UnionType([type, undefinedType]);
802
+ const result = writer.write(type);
803
+ // Declarations merged across files have the type of their first declaration.
804
+ if (this.pseudo.uncertain > 0 || this.hasMergedDeclarations(declaration)) this.countFallback(declaration, true);
805
+ return result;
806
+ }
807
+
808
+ private hasMergedDeclarations(declaration: Node): boolean {
809
+ const symbol = getSymbol(declaration);
810
+ return symbol !== undefined && declarationCount(this.pseudo.getMergedSymbol(symbol)) > declarationCount(symbol);
811
+ }
812
+
813
+ /** Whether a parameter's pseudo-type already has `undefined`, so none is added. */
814
+ private pseudoContainsUndefined(type: PseudoType): boolean {
815
+ if (type instanceof UnionType) {
816
+ for (const member of type.types) if (this.pseudoContainsUndefined(member)) return true;
817
+ return false;
818
+ }
819
+ if (type instanceof DirectType)
820
+ return couldAlreadyReferToUndefined(type) && type.typeNode.kind !== SyntaxKind.TypeReference;
821
+ return type.kind === PseudoTypeKind.Undefined;
822
+ }
823
+
824
+ createReturnTypeOfSignatureDeclaration(
825
+ context: EmitContext,
826
+ signature: Node,
827
+ enclosingDeclaration: Node,
828
+ flags: NodeBuilderFlags,
829
+ tracker: SymbolTracker,
830
+ ): Node | undefined {
831
+ if ((signature.flags & NodeFlags.Synthesized) !== 0) return undefined;
832
+ const type = this.pseudo.getReturnTypeOfSignature(signature);
833
+ const writer = new PseudoTypeWriter(this, context, tracker, enclosingDeclaration, flags);
834
+ if (type instanceof InferredType && type.isSignatureReturn && type.errorNodes.length === 0) {
835
+ // A body without returned values is `void`, as the checker infers.
836
+ const inferredVoid = isTriviallyVoid(signature);
837
+ if (inferredVoid) {
838
+ writer.reportFallback(type, false);
839
+ return context.factory.created(new KeywordTypeNode(SyntaxKind.VoidKeyword));
840
+ }
841
+ }
842
+ if (type instanceof NoResultType && getBody(signature) === undefined && signature.kind !== SyntaxKind.GetAccessor) {
843
+ // A signature without a body or annotation returns `any`.
844
+ writer.reportFallback(type, false);
845
+ return undefined;
846
+ }
847
+ return writer.write(type);
848
+ }
849
+
850
+ createTypeParametersOfSignatureDeclaration(
851
+ _context: EmitContext,
852
+ signature: Node,
853
+ _enclosingDeclaration: Node,
854
+ _flags: NodeBuilderFlags,
855
+ _tracker: SymbolTracker,
856
+ ): Node[] | undefined {
857
+ this.countFallback(signature, true);
858
+ return undefined;
859
+ }
860
+
861
+ createLiteralConstValue(context: EmitContext, node: Node, _tracker: SymbolTracker): Node | undefined {
862
+ const initializer = node.kind === SyntaxKind.ExportAssignment ? getExpression(node) : getInitializer(node);
863
+ if (initializer === undefined) return undefined;
864
+ const literal = literalOf(skipParentheses(initializer));
865
+ if (literal === undefined) {
866
+ this.countFallback(node, true);
867
+ return undefined;
868
+ }
869
+ const factory = context.factory;
870
+ switch (literal.kind) {
871
+ case SyntaxKind.TrueKeyword:
872
+ case SyntaxKind.FalseKeyword:
873
+ return factory.createKeywordExpression(literal.kind);
874
+ case SyntaxKind.StringLiteral:
875
+ case SyntaxKind.NoSubstitutionTemplateLiteral:
876
+ return factory.createStringLiteral(literalText(literal), TokenFlags.None);
877
+ case SyntaxKind.BigIntLiteral:
878
+ return factory.created(new BigIntLiteral((literal as BigIntLiteral).text, TokenFlags.None));
879
+ case SyntaxKind.NumericLiteral:
880
+ return createNumberExpression(context, Number((literal as NumericLiteral).text));
881
+ case SyntaxKind.PrefixUnaryExpression: {
882
+ const unary = literal as PrefixUnaryExpression;
883
+ const operand = unary.operand;
884
+ if (operand instanceof BigIntLiteral)
885
+ return factory.created(
886
+ new BigIntLiteral(
887
+ unary.operator === SyntaxKind.MinusToken ? '-' + operand.text : operand.text,
888
+ TokenFlags.None,
889
+ ),
890
+ );
891
+ const value = Number((operand as NumericLiteral).text);
892
+ return createNumberExpression(context, unary.operator === SyntaxKind.MinusToken ? -value : value);
893
+ }
894
+ }
895
+ return undefined;
896
+ }
897
+
898
+ createTypeOfExpression(
899
+ context: EmitContext,
900
+ expression: Node,
901
+ enclosingDeclaration: Node,
902
+ flags: NodeBuilderFlags,
903
+ tracker: SymbolTracker,
904
+ ): Node | undefined {
905
+ const writer = new PseudoTypeWriter(this, context, tracker, enclosingDeclaration, flags);
906
+ this.countFallback(expression, true);
907
+ // An expression's own type: literals aren't widened.
908
+ const type = this.pseudo.getTypeOfExpression(expression);
909
+ return writer.write(type instanceof MaybeConstType ? type.constType : type);
910
+ }
911
+
912
+ createLateBoundIndexSignatures(
913
+ context: EmitContext,
914
+ container: Node,
915
+ enclosingDeclaration: Node,
916
+ flags: NodeBuilderFlags,
917
+ tracker: SymbolTracker,
918
+ ): Node[] {
919
+ // These come from computed names whose types aren't literals or unique symbols; only the
920
+ // checker knows them. Writing them reports their members' types that need inference.
921
+ const members = getMembers(container);
922
+ if (members === undefined) return [];
923
+ const writer = new PseudoTypeWriter(this, context, tracker, enclosingDeclaration, flags);
924
+ for (const member of members.nodes) {
925
+ const name = getName(member);
926
+ if (!(name instanceof ComputedPropertyName) || !isEntityNameExpression(name.expression, false)) continue;
927
+ if (this.isLateBindableExpression(name.expression)) continue;
928
+ this.countFallback(member, true);
929
+ if (isFunctionLike(member) && getType(member) === undefined && member.kind !== SyntaxKind.SetAccessor)
930
+ writer.write(this.pseudo.getReturnTypeOfSignature(member));
931
+ else if (member.kind === SyntaxKind.PropertyDeclaration && getType(member) === undefined)
932
+ writer.write(this.pseudo.getTypeOfDeclaration(member));
933
+ }
934
+ return [];
935
+ }
936
+
937
+ tryJSTypeNodeToTypeNode(
938
+ _context: EmitContext,
939
+ typeNode: Node,
940
+ _enclosingDeclaration: Node,
941
+ _flags: NodeBuilderFlags,
942
+ _tracker: SymbolTracker,
943
+ ): Node | undefined {
944
+ // JSDoc types are rewritten with their meaning (`String` is `string`), which needs symbols.
945
+ this.countFallback(typeNode, true);
946
+ return undefined;
947
+ }
948
+
949
+ // Helpers
950
+
951
+ /** The symbol of a declaration, merged with same-named globals of other files. */
952
+ getSymbolOfDeclaration(node: Node): Symbol | undefined {
953
+ const symbol = getSymbol(node);
954
+ return symbol === undefined ? undefined : this.pseudo.getMergedSymbol(symbol);
955
+ }
956
+
957
+ resolveName(location: Node, name: string, meaning: SymbolFlags): Symbol | undefined {
958
+ return this.names.resolve(location, name, meaning, undefined, false, false);
959
+ }
960
+
961
+ /** The symbol of `a` or `a.b.c`, looking members up in namespace and enum exports. */
962
+ resolveEntityNameExpression(node: Node, meaning: SymbolFlags): Symbol | undefined {
963
+ if (node instanceof Identifier) return this.resolveName(node, node.text, meaning);
964
+ let left: Node | undefined = undefined;
965
+ let right: Node | undefined = undefined;
966
+ if (node instanceof PropertyAccessExpression) {
967
+ left = node.expression;
968
+ right = node.name;
969
+ } else if (node instanceof QualifiedName) {
970
+ left = node.left;
971
+ right = node.right;
972
+ }
973
+ if (left !== undefined && right !== undefined) {
974
+ const namespace = this.resolveEntityNameExpression(left, SymbolFlags.Namespace);
975
+ if (namespace === undefined || (namespace.flags & SymbolFlags.Alias) !== 0 || !(right instanceof Identifier))
976
+ return undefined;
977
+ const member = (namespace.exports ?? emptyTable).get(right.text);
978
+ return member !== undefined && (member.flags & meaning) !== 0 ? member : undefined;
979
+ }
980
+ return undefined;
981
+ }
982
+
983
+ /** Records a type that needed inference; `unresolved` if it's written as `any`. */
984
+ countFallback(node: Node, unresolved: boolean): boolean {
985
+ const file = getSourceFileOfNode(node);
986
+ let counts = this.inference.get(file);
987
+ if (counts === undefined) {
988
+ counts = new InferenceCounts();
989
+ this.inference.set(file, counts);
990
+ }
991
+ counts.fallbacks++;
992
+ if (unresolved) counts.unresolved++;
993
+ return true;
994
+ }
995
+ }
996
+
997
+ /** Writes pseudo-types as type nodes; types that need inference make the result undefined. */
998
+ class PseudoTypeWriter {
999
+ readonly resolver: SyntacticDeclarationEmitResolver;
1000
+ readonly context: EmitContext;
1001
+ readonly tracker: SymbolTracker;
1002
+ readonly enclosingDeclaration: Node;
1003
+ readonly flags: NodeBuilderFlags;
1004
+ /** Whether a reused node names something that can't be named where it's written. */
1005
+ private reuseFailed: boolean;
1006
+
1007
+ constructor(
1008
+ resolver: SyntacticDeclarationEmitResolver,
1009
+ context: EmitContext,
1010
+ tracker: SymbolTracker,
1011
+ enclosingDeclaration: Node,
1012
+ flags: NodeBuilderFlags,
1013
+ ) {
1014
+ this.resolver = resolver;
1015
+ this.context = context;
1016
+ this.tracker = tracker;
1017
+ this.enclosingDeclaration = enclosingDeclaration;
1018
+ this.flags = flags;
1019
+ this.reuseFailed = false;
1020
+ }
1021
+
1022
+ /** Reports where inference was needed, as the checker's node builder does. */
1023
+ reportFallback(type: PseudoType, unresolved: boolean): boolean {
1024
+ let location: Node;
1025
+ if (type instanceof InferredType) {
1026
+ if (type.errorNodes.length > 0) {
1027
+ for (const node of type.errorNodes) this.tracker.reportInferenceFallback(node);
1028
+ return this.resolver.countFallback(type.errorNodes[0]!, unresolved);
1029
+ }
1030
+ const expression = type.expression;
1031
+ const parent = expression.parent;
1032
+ location =
1033
+ isEntityNameExpression(expression, false) && parent !== undefined && isDeclarationKind(parent.kind)
1034
+ ? parent
1035
+ : expression;
1036
+ } else if (type instanceof NoResultType) location = type.declaration;
1037
+ else return false;
1038
+ this.tracker.reportInferenceFallback(location);
1039
+ return this.resolver.countFallback(location, unresolved);
1040
+ }
1041
+
1042
+ write(type: PseudoType): Node | undefined {
1043
+ const factory = this.context.factory;
1044
+ switch (type.kind) {
1045
+ case PseudoTypeKind.Direct:
1046
+ return this.reuseTypeNode((type as DirectType).typeNode);
1047
+ case PseudoTypeKind.Inferred: {
1048
+ const inferred = type as InferredType;
1049
+ // A body without returned values is `void`, as the checker infers.
1050
+ if (inferred.isSignatureReturn && inferred.errorNodes.length === 0 && isTriviallyVoid(inferred.expression)) {
1051
+ this.reportFallback(type, false);
1052
+ return this.keyword(SyntaxKind.VoidKeyword);
1053
+ }
1054
+ this.reportFallback(type, true);
1055
+ return undefined;
1056
+ }
1057
+ case PseudoTypeKind.NoResult:
1058
+ this.reportFallback(type, true);
1059
+ return undefined;
1060
+ case PseudoTypeKind.MaybeConstLocation: {
1061
+ const maybe = type as MaybeConstType;
1062
+ return this.write(isInConstContext(maybe.node) ? maybe.constType : maybe.regularType);
1063
+ }
1064
+ case PseudoTypeKind.Union:
1065
+ if (type instanceof UnionType) {
1066
+ const narrowed: UnionType = type;
1067
+ return this.writeUnion(narrowed);
1068
+ }
1069
+ break;
1070
+ case PseudoTypeKind.Undefined:
1071
+ return this.keyword(this.resolver.strictNullChecks ? SyntaxKind.UndefinedKeyword : SyntaxKind.AnyKeyword);
1072
+ case PseudoTypeKind.Null:
1073
+ if (!this.resolver.strictNullChecks) return this.keyword(SyntaxKind.AnyKeyword);
1074
+ return factory.created(new LiteralTypeNode(factory.createKeywordExpression(SyntaxKind.NullKeyword)));
1075
+ case PseudoTypeKind.Any:
1076
+ return this.keyword(SyntaxKind.AnyKeyword);
1077
+ case PseudoTypeKind.String:
1078
+ return this.keyword(SyntaxKind.StringKeyword);
1079
+ case PseudoTypeKind.Number:
1080
+ return this.keyword(SyntaxKind.NumberKeyword);
1081
+ case PseudoTypeKind.BigInt:
1082
+ return this.keyword(SyntaxKind.BigIntKeyword);
1083
+ case PseudoTypeKind.Boolean:
1084
+ return this.keyword(SyntaxKind.BooleanKeyword);
1085
+ case PseudoTypeKind.False:
1086
+ return factory.created(new LiteralTypeNode(factory.createKeywordExpression(SyntaxKind.FalseKeyword)));
1087
+ case PseudoTypeKind.True:
1088
+ return factory.created(new LiteralTypeNode(factory.createKeywordExpression(SyntaxKind.TrueKeyword)));
1089
+ case PseudoTypeKind.SingleCallSignature:
1090
+ if (type instanceof SignatureType) {
1091
+ const narrowed: SignatureType = type;
1092
+ return this.writeSignature(narrowed);
1093
+ }
1094
+ break;
1095
+ case PseudoTypeKind.Tuple:
1096
+ if (type instanceof TupleType) {
1097
+ const narrowed: TupleType = type;
1098
+ return this.writeTuple(narrowed);
1099
+ }
1100
+ break;
1101
+ case PseudoTypeKind.ObjectLiteral:
1102
+ if (type instanceof ObjectLiteralType) {
1103
+ const narrowed: ObjectLiteralType = type;
1104
+ return this.writeObjectLiteral(narrowed);
1105
+ }
1106
+ break;
1107
+ case PseudoTypeKind.StringLiteral:
1108
+ case PseudoTypeKind.NumericLiteral:
1109
+ case PseudoTypeKind.BigIntLiteral:
1110
+ return factory.created(new LiteralTypeNode(this.reuseNode((type as LiteralType).node)));
1111
+ }
1112
+ return undefined;
1113
+ }
1114
+
1115
+ private keyword(kind: SyntaxKind): Node {
1116
+ return this.context.factory.created(new KeywordTypeNode(kind));
1117
+ }
1118
+
1119
+ private writeUnion(type: UnionType): Node | undefined {
1120
+ const result: Node[] = [];
1121
+ let hasElided = false;
1122
+ let failed = false;
1123
+ for (const member of type.types) {
1124
+ if (
1125
+ !this.resolver.strictNullChecks &&
1126
+ (member.kind === PseudoTypeKind.Undefined || member.kind === PseudoTypeKind.Null)
1127
+ ) {
1128
+ hasElided = true;
1129
+ continue;
1130
+ }
1131
+ const node = this.write(member);
1132
+ if (node === undefined) failed = true;
1133
+ else appendUnionMember(result, node);
1134
+ }
1135
+ if (failed) return undefined;
1136
+ if (result.length === 1) return result[0]!;
1137
+ if (result.length === 0) return this.keyword(hasElided ? SyntaxKind.AnyKeyword : SyntaxKind.NeverKeyword);
1138
+ return this.context.factory.created(new UnionTypeNode(this.context.factory.createNodeList(result)));
1139
+ }
1140
+
1141
+ private writeSignature(type: SignatureType): Node | undefined {
1142
+ const factory = this.context.factory;
1143
+ const typeParameters: Node[] = [];
1144
+ for (const parameter of type.typeParameters) typeParameters.push(this.reuseNode(parameter));
1145
+ const parameters = this.writeParameters(type.parameters);
1146
+ const returnType = this.write(type.returnType);
1147
+ if (parameters === undefined || returnType === undefined) return undefined;
1148
+ return factory.created(
1149
+ new FunctionTypeNode(
1150
+ typeParameters.length > 0 ? factory.createNodeList(typeParameters) : undefined,
1151
+ parameters,
1152
+ returnType,
1153
+ ),
1154
+ );
1155
+ }
1156
+
1157
+ // Writers of composite types write every part, so each part needing inference is reported.
1158
+
1159
+ private writeParameters(parameters: PseudoParameter[]): NodeList | undefined {
1160
+ const result: Node[] = [];
1161
+ let failed = false;
1162
+ for (const parameter of parameters) {
1163
+ const node = this.writeParameter(parameter);
1164
+ if (node === undefined) failed = true;
1165
+ else result.push(node);
1166
+ }
1167
+ return failed ? undefined : this.context.factory.createNodeList(result);
1168
+ }
1169
+
1170
+ private writeParameter(parameter: PseudoParameter): Node | undefined {
1171
+ const factory = this.context.factory;
1172
+ const type = this.write(parameter.type);
1173
+ if (type === undefined) return undefined;
1174
+ const result = factory.created(
1175
+ new ParameterDeclaration(
1176
+ undefined,
1177
+ parameter.rest ? factory.createToken(SyntaxKind.DotDotDotToken) : undefined,
1178
+ this.cloneParameterName(parameter.name),
1179
+ parameter.optional ? factory.createToken(SyntaxKind.QuestionToken) : undefined,
1180
+ type,
1181
+ undefined,
1182
+ ),
1183
+ );
1184
+ const original = parameter.name.parent;
1185
+ if (original !== undefined && original.kind === SyntaxKind.Parameter)
1186
+ this.context.assignCommentRange(result, original);
1187
+ return result;
1188
+ }
1189
+
1190
+ /** Parameter names are rewritten from scratch: identifiers as is, binding patterns without initializers. */
1191
+ private cloneParameterName(name: Node): Node {
1192
+ // Rewritten names have no source positions.
1193
+ const clone = name.deepClone();
1194
+ clearPositions(clone);
1195
+ if (clone instanceof BindingPattern) {
1196
+ stripBindingInitializers(clone);
1197
+ this.context.setEmitFlags(clone, EmitFlags.SingleLine | EmitFlags.NoAsciiEscaping);
1198
+ } else this.context.setEmitFlags(clone, EmitFlags.NoAsciiEscaping);
1199
+ return clone;
1200
+ }
1201
+
1202
+ private writeTuple(type: TupleType): Node | undefined {
1203
+ const factory = this.context.factory;
1204
+ const elements: Node[] = [];
1205
+ let failed = false;
1206
+ for (const element of type.elements) {
1207
+ const node = this.write(element);
1208
+ if (node === undefined) failed = true;
1209
+ else elements.push(node);
1210
+ }
1211
+ if (failed) return undefined;
1212
+ const tuple = factory.created(new TupleTypeNode(factory.createNodeList(elements)));
1213
+ this.context.addEmitFlags(tuple, EmitFlags.SingleLine);
1214
+ // `as const` arrays are readonly.
1215
+ return factory.created(new TypeOperatorNode(SyntaxKind.ReadonlyKeyword, tuple));
1216
+ }
1217
+
1218
+ private writeObjectLiteral(type: ObjectLiteralType): Node | undefined {
1219
+ const factory = this.context.factory;
1220
+ const members = type.members;
1221
+ if (members.length === 0) {
1222
+ const empty = factory.created(new TypeLiteralNode(factory.createNodeList([])));
1223
+ this.context.addEmitFlags(empty, EmitFlags.SingleLine);
1224
+ return empty;
1225
+ }
1226
+ const isConst = isInConstContext(members[0].name.parent!.parent!);
1227
+ const result: Node[] = [];
1228
+ let failed = false;
1229
+ for (const member of members) {
1230
+ const modifiers =
1231
+ isConst || (member.kind === PseudoMemberKind.Property && member.readonly)
1232
+ ? factory.createModifierList([factory.createToken(SyntaxKind.ReadonlyKeyword)])
1233
+ : undefined;
1234
+ let node: Node | undefined = undefined;
1235
+ switch (member.kind) {
1236
+ case PseudoMemberKind.Method: {
1237
+ const typeParameters: Node[] = [];
1238
+ for (const parameter of member.typeParameters) typeParameters.push(this.reuseNode(parameter));
1239
+ const typeParameterList = typeParameters.length > 0 ? factory.createNodeList(typeParameters) : undefined;
1240
+ const parameters = this.writeParameters(member.parameters);
1241
+ const returnType = this.write(member.type);
1242
+ if (parameters === undefined || returnType === undefined) break;
1243
+ node = isConst
1244
+ ? factory.created(
1245
+ new PropertySignatureDeclaration(
1246
+ modifiers,
1247
+ this.reuseName(member.name, false),
1248
+ undefined,
1249
+ factory.created(new FunctionTypeNode(typeParameterList, parameters, returnType)),
1250
+ undefined,
1251
+ ),
1252
+ )
1253
+ : factory.created(
1254
+ new MethodSignatureDeclaration(
1255
+ modifiers,
1256
+ this.reuseName(member.name, true),
1257
+ undefined,
1258
+ typeParameterList,
1259
+ parameters,
1260
+ returnType,
1261
+ ),
1262
+ );
1263
+ break;
1264
+ }
1265
+ case PseudoMemberKind.Property: {
1266
+ const propertyType = this.write(member.type);
1267
+ if (propertyType === undefined) break;
1268
+ node = factory.created(
1269
+ new PropertySignatureDeclaration(
1270
+ modifiers,
1271
+ this.reuseName(member.name, false),
1272
+ undefined,
1273
+ propertyType,
1274
+ undefined,
1275
+ ),
1276
+ );
1277
+ break;
1278
+ }
1279
+ case PseudoMemberKind.SetAccessor: {
1280
+ const parameters = this.writeParameters(member.parameters);
1281
+ if (parameters === undefined) break;
1282
+ node = factory.created(
1283
+ new SetAccessorDeclaration(
1284
+ undefined,
1285
+ this.reuseName(member.name, false),
1286
+ undefined,
1287
+ parameters,
1288
+ undefined,
1289
+ undefined,
1290
+ undefined,
1291
+ ),
1292
+ );
1293
+ break;
1294
+ }
1295
+ case PseudoMemberKind.GetAccessor: {
1296
+ const accessorType = this.write(member.type);
1297
+ if (accessorType === undefined) break;
1298
+ node = factory.created(
1299
+ new GetAccessorDeclaration(
1300
+ undefined,
1301
+ this.reuseName(member.name, false),
1302
+ undefined,
1303
+ factory.createNodeList([]),
1304
+ accessorType,
1305
+ undefined,
1306
+ undefined,
1307
+ ),
1308
+ );
1309
+ break;
1310
+ }
1311
+ }
1312
+ if (node === undefined) {
1313
+ failed = true;
1314
+ continue;
1315
+ }
1316
+ const declaration = member.name.parent!;
1317
+ this.context.setCommentRange(node, declaration.pos, declaration.end);
1318
+ result.push(node);
1319
+ }
1320
+ if (failed) return undefined;
1321
+ const literal = factory.created(new TypeLiteralNode(factory.createNodeList(result)));
1322
+ if ((this.flags & NodeBuilderFlags.MultilineObjectLiterals) === 0)
1323
+ this.context.addEmitFlags(literal, EmitFlags.SingleLine);
1324
+ return literal;
1325
+ }
1326
+
1327
+ /** A property name, as an identifier when it can be one. */
1328
+ private reuseName(name: Node, isMethod: boolean): Node {
1329
+ const result = this.reuseNode(name);
1330
+ const text = tryGetTextOfPropertyName(result);
1331
+ if (text === undefined) return result;
1332
+ const kind = classifyPropertyName(text, result.kind === SyntaxKind.StringLiteral, isMethod);
1333
+ if (result.kind === SyntaxKind.Identifier && kind === PropertyNameKind.Identifier) return result;
1334
+ if (result.kind === SyntaxKind.StringLiteral && kind === PropertyNameKind.StringLiteral) return result;
1335
+ let renamed: Node;
1336
+ if (kind === PropertyNameKind.Identifier) renamed = this.context.factory.createIdentifier(text);
1337
+ else if (kind === PropertyNameKind.StringLiteral)
1338
+ renamed = this.context.factory.createStringLiteral(text, TokenFlags.None);
1339
+ else return result;
1340
+ this.context.setOriginal(renamed, result);
1341
+ renamed.pos = result.pos;
1342
+ renamed.end = result.end;
1343
+ return renamed;
1344
+ }
1345
+
1346
+ /** A copy of an expression or type parameter from the source. */
1347
+ private reuseNode(node: Node): Node {
1348
+ this.trackEntityNames(node);
1349
+ const clone = node.deepClone();
1350
+ styleReusedNodes(this.context, clone);
1351
+ return clone;
1352
+ }
1353
+
1354
+ /** A copy of an annotation, with the names it uses checked and their imports kept; undefined if one can't be named. */
1355
+ reuseTypeNode(node: Node): Node | undefined {
1356
+ const failed = this.reuseFailed;
1357
+ this.reuseFailed = false;
1358
+ const result = this.reuseNode(node);
1359
+ const reused = !this.reuseFailed;
1360
+ this.reuseFailed = failed || !reused;
1361
+ if (reused) return result;
1362
+ // The checker writes the type the annotation denotes instead.
1363
+ this.tracker.reportInferenceFallback(node);
1364
+ this.resolver.countFallback(node, true);
1365
+ return undefined;
1366
+ }
1367
+
1368
+ private trackEntityNames(node: Node): boolean {
1369
+ this.markJSDocType(node);
1370
+ node.forEachChild(new EntityNameTracker(this));
1371
+ return this.trackEntityName(node);
1372
+ }
1373
+
1374
+ /** JSDoc types such as `?T` can't be reused as written. */
1375
+ markJSDocType(node: Node): boolean {
1376
+ if (node.kind >= SyntaxKind.FirstJSDocNode && node.kind <= SyntaxKind.LastJSDocNode) this.reuseFailed = true;
1377
+ return true;
1378
+ }
1379
+
1380
+ trackEntityName(node: Node): boolean {
1381
+ let name: Node | undefined = undefined;
1382
+ if (node instanceof TypeReferenceNode) name = node.typeName;
1383
+ else if (node instanceof TypeQueryNode) name = node.exprName;
1384
+ else if (node.kind === SyntaxKind.ExpressionWithTypeArguments)
1385
+ name = (node as ExpressionWithTypeArguments).expression;
1386
+ if (name === undefined || !(isEntityNameExpression(name, false) || name instanceof QualifiedName)) return false;
1387
+ const first = getFirstIdentifier(name);
1388
+ if (!(first instanceof Identifier)) return false;
1389
+ const meaning = getMeaningOfEntityNameReference(name);
1390
+ const symbol = this.resolver.resolveName(first, first.text, meaning);
1391
+ if (symbol === undefined || isSignatureLocal(symbol)) return false;
1392
+ // `typeof x` in the declaration of `x` is circular.
1393
+ const declaration = symbol.valueDeclaration;
1394
+ if (
1395
+ node instanceof TypeQueryNode &&
1396
+ declaration !== undefined &&
1397
+ declaration.pos <= node.pos &&
1398
+ node.end <= declaration.end &&
1399
+ getSourceFileOfNode(declaration) === getSourceFileOfNode(node)
1400
+ ) {
1401
+ this.reuseFailed = true;
1402
+ return false;
1403
+ }
1404
+ const result = this.resolver.isSymbolAccessible(symbol, this.enclosingDeclaration, meaning, false);
1405
+ if (result.accessibility !== SymbolAccessibility.Accessible) {
1406
+ this.reuseFailed = true;
1407
+ return false;
1408
+ }
1409
+ return this.tracker.trackSymbol(symbol, this.enclosingDeclaration, meaning);
1410
+ }
1411
+ }
1412
+
1413
+ /** Parameters and type parameters are in scope where the signature's types are written. */
1414
+ function isSignatureLocal(symbol: Symbol): boolean {
1415
+ const declaration = symbol.valueDeclaration ?? (declarationCount(symbol) > 0 ? symbol.declaration : undefined);
1416
+ return (
1417
+ declaration !== undefined &&
1418
+ (declaration.kind === SyntaxKind.Parameter || declaration.kind === SyntaxKind.TypeParameter)
1419
+ );
1420
+ }
1421
+
1422
+ class EntityNameTracker extends NodeVisitor {
1423
+ readonly writer: PseudoTypeWriter;
1424
+
1425
+ constructor(writer: PseudoTypeWriter) {
1426
+ super();
1427
+ this.writer = writer;
1428
+ }
1429
+
1430
+ visitNode(node: Node): boolean {
1431
+ this.writer.markJSDocType(node);
1432
+ this.writer.trackEntityName(node);
1433
+ return node.forEachChild(this);
1434
+ }
1435
+ }
1436
+
1437
+ /** Single-line tuples and mapped types, and string literals without escapes, as tsgo's node reuse. */
1438
+ function styleReusedNodes(context: EmitContext, node: Node): boolean {
1439
+ const kind = node.kind;
1440
+ if (kind === SyntaxKind.TupleType || kind === SyntaxKind.MappedType) context.addEmitFlags(node, EmitFlags.SingleLine);
1441
+ else if (kind === SyntaxKind.StringLiteral || kind === SyntaxKind.NoSubstitutionTemplateLiteral)
1442
+ context.addEmitFlags(node, EmitFlags.NoAsciiEscaping);
1443
+ node.forEachChild(new ReusedNodeStyler(context));
1444
+ return true;
1445
+ }
1446
+
1447
+ class ReusedNodeStyler extends NodeVisitor {
1448
+ readonly context: EmitContext;
1449
+
1450
+ constructor(context: EmitContext) {
1451
+ super();
1452
+ this.context = context;
1453
+ }
1454
+
1455
+ visitNode(node: Node): boolean {
1456
+ styleReusedNodes(this.context, node);
1457
+ return false;
1458
+ }
1459
+ }
1460
+
1461
+ function clearPositions(node: Node): boolean {
1462
+ node.pos = -1;
1463
+ node.end = -1;
1464
+ node.forEachChild(new PositionClearer());
1465
+ return true;
1466
+ }
1467
+
1468
+ class PositionClearer extends NodeVisitor {
1469
+ visitNode(node: Node): boolean {
1470
+ clearPositions(node);
1471
+ return false;
1472
+ }
1473
+ }
1474
+
1475
+ function stripBindingInitializers(pattern: BindingPattern): boolean {
1476
+ for (const element of pattern.elements.nodes) {
1477
+ if (!(element instanceof BindingElement)) continue;
1478
+ element.initializer = undefined;
1479
+ if (element.name instanceof BindingPattern) stripBindingInitializers(element.name);
1480
+ }
1481
+ return true;
1482
+ }
1483
+
1484
+ function appendUnionMember(result: Node[], node: Node): boolean {
1485
+ if (node instanceof UnionTypeNode) {
1486
+ for (const member of node.types.nodes) appendUnionMember(result, member);
1487
+ return true;
1488
+ }
1489
+ if (node.kind === SyntaxKind.UndefinedKeyword)
1490
+ for (const existing of result) if (existing.kind === SyntaxKind.UndefinedKeyword) return false;
1491
+ result.push(node);
1492
+ return true;
1493
+ }
1494
+
1495
+ const enum PropertyNameKind {
1496
+ Identifier,
1497
+ NumericLiteral,
1498
+ StringLiteral,
1499
+ }
1500
+
1501
+ function classifyPropertyName(name: string, stringNamed: boolean, isMethod: boolean): PropertyNameKind {
1502
+ if (isMethod && name === 'new') return PropertyNameKind.StringLiteral;
1503
+ if (isIdentifierText(name)) return PropertyNameKind.Identifier;
1504
+ return !stringNamed && String(Number(name)) === name && Number(name) >= 0
1505
+ ? PropertyNameKind.NumericLiteral
1506
+ : PropertyNameKind.StringLiteral;
1507
+ }
1508
+
1509
+ export function tryGetTextOfPropertyName(name: Node): string | undefined {
1510
+ switch (name.kind) {
1511
+ case SyntaxKind.Identifier:
1512
+ case SyntaxKind.PrivateIdentifier:
1513
+ case SyntaxKind.StringLiteral:
1514
+ case SyntaxKind.NumericLiteral:
1515
+ case SyntaxKind.NoSubstitutionTemplateLiteral:
1516
+ return literalText(name);
1517
+ case SyntaxKind.ComputedPropertyName: {
1518
+ const expression = (name as ComputedPropertyName).expression;
1519
+ return isStringOrNumericLiteralLike(expression) ? literalText(expression) : undefined;
1520
+ }
1521
+ }
1522
+ return undefined;
1523
+ }
1524
+
1525
+ /** Whether a declaration's type is a literal or `unique symbol`: a computed name it names is late-bound. */
1526
+ function hasLiteralOrUniqueSymbolType(declaration: Node): boolean {
1527
+ if (declaration.kind === SyntaxKind.EnumMember) return true;
1528
+ const type = getType(declaration);
1529
+ if (type !== undefined)
1530
+ return (
1531
+ (type instanceof TypeOperatorNode && type.operator === SyntaxKind.UniqueKeyword) ||
1532
+ type.kind === SyntaxKind.LiteralType
1533
+ );
1534
+ const initializer = getInitializer(declaration);
1535
+ if (initializer === undefined) return false;
1536
+ const value = skipParentheses(initializer);
1537
+ // `x as const` has a literal type wherever it is.
1538
+ if (value instanceof AsExpression && isConstTypeReference(value.type))
1539
+ return isStringOrNumericLiteralLike(skipParentheses(value.expression));
1540
+ if (declaration instanceof VariableDeclaration) {
1541
+ if ((getCombinedNodeFlags(declaration) & NodeFlags.Const) === 0) return false;
1542
+ // `const sym = Symbol()` is a unique symbol.
1543
+ if (value.kind === SyntaxKind.CallExpression && isIdentifierNamed(getExpression(value)!, 'Symbol')) return true;
1544
+ return isStringOrNumericLiteralLike(value);
1545
+ }
1546
+ if (declaration.kind === SyntaxKind.PropertyDeclaration)
1547
+ return hasSyntacticModifier(declaration, ModifierFlags.Readonly) && isStringOrNumericLiteralLike(value);
1548
+ if (declaration.kind === SyntaxKind.PropertyAssignment)
1549
+ return isInConstContext(value) && isStringOrNumericLiteralLike(value);
1550
+ return false;
1551
+ }
1552
+
1553
+ /** The properties of an object literal, through `as const`. */
1554
+ function objectLiteralProperties(node: Node): Node[] {
1555
+ let current = skipParentheses(node);
1556
+ if (current instanceof AsExpression && isConstTypeReference(current.type))
1557
+ current = skipParentheses(current.expression);
1558
+ return current instanceof ObjectLiteralExpression ? current.properties.nodes : [];
1559
+ }
1560
+
1561
+ /** Whether a function's body returns no values, so its inferred return type is `void`. */
1562
+ function isTriviallyVoid(fn: Node): boolean {
1563
+ const body = getBody(fn);
1564
+ if (body === undefined || body.kind !== SyntaxKind.Block) return false;
1565
+ if (hasSyntacticModifier(fn, ModifierFlags.Async) || getAsteriskToken(fn) !== undefined) return false;
1566
+ for (const statement of collectReturnStatements(body)) if (statement.expression !== undefined) return false;
1567
+ switch (fn.kind) {
1568
+ case SyntaxKind.FunctionDeclaration:
1569
+ case SyntaxKind.MethodDeclaration:
1570
+ return true;
1571
+ case SyntaxKind.FunctionExpression:
1572
+ case SyntaxKind.ArrowFunction:
1573
+ // Without an implicit return, function expressions return `never`.
1574
+ return (fn.flags & NodeFlags.HasImplicitReturn) !== 0;
1575
+ }
1576
+ return false;
1577
+ }
1578
+
1579
+ function createNumberExpression(context: EmitContext, value: number): Node {
1580
+ const factory = context.factory;
1581
+ if (value !== value) return factory.createIdentifier('NaN');
1582
+ if (value === Infinity) return factory.createIdentifier('Infinity');
1583
+ if (value === -Infinity)
1584
+ return factory.created(new PrefixUnaryExpression(SyntaxKind.MinusToken, factory.createIdentifier('Infinity')));
1585
+ if (value < 0)
1586
+ return factory.created(
1587
+ new PrefixUnaryExpression(SyntaxKind.MinusToken, factory.createNumericLiteral(String(-value))),
1588
+ );
1589
+ return factory.createNumericLiteral(String(value));
1590
+ }
1591
+
1592
+ /** The literal a const declaration's initializer is, if it has a literal type. */
1593
+ function literalOf(node: Node): Node | undefined {
1594
+ switch (node.kind) {
1595
+ case SyntaxKind.TrueKeyword:
1596
+ case SyntaxKind.FalseKeyword:
1597
+ case SyntaxKind.NumericLiteral:
1598
+ case SyntaxKind.StringLiteral:
1599
+ case SyntaxKind.NoSubstitutionTemplateLiteral:
1600
+ case SyntaxKind.BigIntLiteral:
1601
+ return node;
1602
+ case SyntaxKind.PrefixUnaryExpression: {
1603
+ const unary = node as PrefixUnaryExpression;
1604
+ const operand = unary.operand.kind;
1605
+ if (
1606
+ unary.operator === SyntaxKind.MinusToken &&
1607
+ (operand === SyntaxKind.NumericLiteral || operand === SyntaxKind.BigIntLiteral)
1608
+ )
1609
+ return node;
1610
+ if (unary.operator === SyntaxKind.PlusToken && operand === SyntaxKind.NumericLiteral) return node;
1611
+ return undefined;
1612
+ }
1613
+ }
1614
+ return undefined;
1615
+ }
1616
+
1617
+ function literalText(node: Node): string {
1618
+ if (node instanceof Identifier) return node.text;
1619
+ if (node instanceof PrivateIdentifier) return node.text;
1620
+ if (node instanceof StringLiteral) return node.text;
1621
+ if (node instanceof NumericLiteral) return node.text;
1622
+ if (node instanceof NoSubstitutionTemplateLiteral) return node.text;
1623
+ if (node instanceof BigIntLiteral) return node.text;
1624
+ if (node instanceof TemplateMiddle) return node.text;
1625
+ if (node instanceof TemplateTail) return node.text;
1626
+ return '';
1627
+ }
1628
+
1629
+ function getIdentifierText(node: Node): string {
1630
+ return node instanceof Identifier ? node.text : '';
1631
+ }
1632
+
1633
+ function getFirstIdentifier(node: Node): Node {
1634
+ let current = node;
1635
+ for (;;) {
1636
+ if (current instanceof QualifiedName) current = current.left;
1637
+ else if (current instanceof PropertyAccessExpression) current = current.expression;
1638
+ else return current;
1639
+ }
1640
+ }
1641
+
1642
+ /** What a reference to an entity name means: a value, a namespace or a type. */
1643
+ export function getMeaningOfEntityNameReference(entityName: Node): SymbolFlags {
1644
+ const parent = entityName.parent!;
1645
+ if (
1646
+ parent.kind === SyntaxKind.TypeQuery ||
1647
+ (parent.kind === SyntaxKind.ExpressionWithTypeArguments && !isPartOfTypeNode(parent)) ||
1648
+ parent.kind === SyntaxKind.ComputedPropertyName ||
1649
+ (parent.kind === SyntaxKind.TypePredicate && getTypePredicateParameterName(parent) === entityName) ||
1650
+ parent.kind === SyntaxKind.BinaryExpression
1651
+ )
1652
+ return SymbolFlags.Value | SymbolFlags.ExportValue;
1653
+ if (
1654
+ entityName.kind === SyntaxKind.QualifiedName ||
1655
+ entityName.kind === SyntaxKind.PropertyAccessExpression ||
1656
+ parent.kind === SyntaxKind.ImportEqualsDeclaration ||
1657
+ (parent instanceof QualifiedName && parent.left === entityName) ||
1658
+ (parent instanceof PropertyAccessExpression && parent.expression === entityName) ||
1659
+ (parent instanceof ElementAccessExpression && parent.expression === entityName)
1660
+ )
1661
+ return SymbolFlags.Namespace;
1662
+ return SymbolFlags.Type;
1663
+ }
1664
+
1665
+ function getTypePredicateParameterName(node: Node): Node | undefined {
1666
+ return node instanceof TypePredicateNode ? node.parameterName : undefined;
1667
+ }
1668
+
1669
+ /** Whether a heritage clause element is a type: an interface's `extends` or a class's `implements`. */
1670
+ function isPartOfTypeNode(node: Node): boolean {
1671
+ const parent = node.parent;
1672
+ if (parent === undefined) return false;
1673
+ if (parent instanceof HeritageClause)
1674
+ return (
1675
+ !(parent.parent!.kind === SyntaxKind.ClassDeclaration || parent.parent!.kind === SyntaxKind.ClassExpression) ||
1676
+ parent.token === SyntaxKind.ImplementsKeyword
1677
+ );
1678
+ return (
1679
+ parent !== undefined &&
1680
+ (parent.kind === SyntaxKind.JSDocImplementsTag || parent.kind === SyntaxKind.JSDocAugmentsTag)
1681
+ );
1682
+ }
1683
+
1684
+ function isDeclarationKind(kind: SyntaxKind): boolean {
1685
+ switch (kind) {
1686
+ case SyntaxKind.VariableDeclaration:
1687
+ case SyntaxKind.Parameter:
1688
+ case SyntaxKind.PropertyDeclaration:
1689
+ case SyntaxKind.PropertySignature:
1690
+ case SyntaxKind.PropertyAssignment:
1691
+ case SyntaxKind.ShorthandPropertyAssignment:
1692
+ case SyntaxKind.BindingElement:
1693
+ case SyntaxKind.ExportAssignment:
1694
+ case SyntaxKind.EnumMember:
1695
+ return true;
1696
+ }
1697
+ return false;
1698
+ }
1699
+
1700
+ export function getAnyImportSyntax(node: Node): Node | undefined {
1701
+ switch (node.kind) {
1702
+ case SyntaxKind.ImportEqualsDeclaration:
1703
+ return node;
1704
+ case SyntaxKind.ImportClause:
1705
+ return node.parent;
1706
+ case SyntaxKind.NamespaceImport:
1707
+ return node.parent?.parent;
1708
+ case SyntaxKind.ImportSpecifier:
1709
+ return node.parent?.parent?.parent;
1710
+ }
1711
+ return undefined;
1712
+ }
1713
+
1714
+ export function isLateVisibilityPaintedStatement(node: Node): boolean {
1715
+ switch (node.kind) {
1716
+ case SyntaxKind.ImportDeclaration:
1717
+ case SyntaxKind.JSImportDeclaration:
1718
+ case SyntaxKind.ImportEqualsDeclaration:
1719
+ case SyntaxKind.VariableStatement:
1720
+ case SyntaxKind.ClassDeclaration:
1721
+ case SyntaxKind.FunctionDeclaration:
1722
+ case SyntaxKind.ModuleDeclaration:
1723
+ case SyntaxKind.TypeAliasDeclaration:
1724
+ case SyntaxKind.JSTypeAliasDeclaration:
1725
+ case SyntaxKind.InterfaceDeclaration:
1726
+ case SyntaxKind.EnumDeclaration:
1727
+ return true;
1728
+ }
1729
+ return false;
1730
+ }
1731
+
1732
+ /** The node whose scope holds a declaration: a source file, module block or other container. */
1733
+ export function getDeclarationContainer(node: Node): Node {
1734
+ let current: Node | undefined = getRootDeclaration(node);
1735
+ while (current !== undefined) {
1736
+ switch (current.kind) {
1737
+ case SyntaxKind.VariableDeclaration:
1738
+ case SyntaxKind.VariableDeclarationList:
1739
+ case SyntaxKind.ImportSpecifier:
1740
+ case SyntaxKind.NamedImports:
1741
+ case SyntaxKind.NamespaceImport:
1742
+ case SyntaxKind.ImportClause:
1743
+ current = current.parent;
1744
+ continue;
1745
+ }
1746
+ return current.parent!;
1747
+ }
1748
+ throw new Error('A declaration has no container');
1749
+ }
1750
+
1751
+ function getEnclosingContainer(node: Node): Node | undefined {
1752
+ for (let current = node.parent; current !== undefined; current = current.parent)
1753
+ if ((getContainerFlags(current) & ContainerFlags.IsContainer) !== 0) return current;
1754
+ return undefined;
1755
+ }
1756
+
1757
+ function isGlobalScopeAugmentation(node: Node): boolean {
1758
+ return node instanceof ModuleDeclaration && node.keyword === SyntaxKind.GlobalKeyword;
1759
+ }
1760
+
1761
+ export function isExternalModuleAugmentation(node: Node): boolean {
1762
+ return isAmbientModule(node) && isModuleAugmentationExternal(node);
1763
+ }
1764
+
1765
+ function isImplicitlyExportedJSDocDeclaration(node: Node): boolean {
1766
+ const parent = node.parent;
1767
+ if (parent === undefined || parent.kind !== SyntaxKind.SourceFile) return false;
1768
+ if (!isExternalOrCommonJSModule(parent as SourceFile)) return false;
1769
+ if (node.kind === SyntaxKind.JSTypeAliasDeclaration) return true;
1770
+ return node.kind === SyntaxKind.ModuleDeclaration && (node.flags & NodeFlags.Reparsed) !== 0;
1771
+ }
1772
+
1773
+ /** Merges global symbol tables as the checker does; conflicting declarations stay apart. */
1774
+ function mergeInto(target: Map<string, Symbol>, source: SymbolTable, mergedSymbols: Map<Symbol, Symbol>): boolean {
1775
+ for (const [name, symbol] of source) {
1776
+ const existing = target.get(name);
1777
+ if (existing === undefined) {
1778
+ target.set(name, symbol);
1779
+ continue;
1780
+ }
1781
+ if (
1782
+ (existing.flags & getExcludedSymbolFlags(symbol.flags)) !== 0 &&
1783
+ ((existing.flags | symbol.flags) & SymbolFlags.Assignment) === 0
1784
+ )
1785
+ continue;
1786
+ let merged = existing;
1787
+ if (mergedSymbols.get(existing) !== existing) {
1788
+ // The first merge replaces the first file's symbol with a copy.
1789
+ merged = new Symbol(existing.flags, name);
1790
+ setDeclarations(merged, getDeclarations(existing).slice());
1791
+ merged.valueDeclaration = existing.valueDeclaration;
1792
+ merged.exports = copyTable(existing.exports);
1793
+ merged.members = copyTable(existing.members);
1794
+ mergedSymbols.set(existing, merged);
1795
+ mergedSymbols.set(merged, merged);
1796
+ target.set(name, merged);
1797
+ }
1798
+ merged.flags |= symbol.flags;
1799
+ for (const declaration of getDeclarations(symbol)) addDeclaration(merged, declaration);
1800
+ merged.valueDeclaration ??= symbol.valueDeclaration;
1801
+ if (symbol.exports !== undefined) {
1802
+ merged.exports ??= new Map<string, Symbol>();
1803
+ mergeInto(merged.exports, symbol.exports, mergedSymbols);
1804
+ }
1805
+ if (symbol.members !== undefined) {
1806
+ merged.members ??= new Map<string, Symbol>();
1807
+ mergeInto(merged.members, symbol.members, mergedSymbols);
1808
+ }
1809
+ mergedSymbols.set(symbol, merged);
1810
+ }
1811
+ return true;
1812
+ }
1813
+
1814
+ function copyTable(table: SymbolTable | undefined): SymbolTable | undefined {
1815
+ return table === undefined ? undefined : new Map<string, Symbol>(table);
1816
+ }
1817
+
1818
+ /** The flags a declaration with `flags` conflicts with. */
1819
+ function getExcludedSymbolFlags(flags: SymbolFlags): SymbolFlags {
1820
+ let result = SymbolFlags.None;
1821
+ if ((flags & SymbolFlags.BlockScopedVariable) !== 0) result |= SymbolFlags.BlockScopedVariableExcludes;
1822
+ if ((flags & SymbolFlags.FunctionScopedVariable) !== 0) result |= SymbolFlags.FunctionScopedVariableExcludes;
1823
+ if ((flags & SymbolFlags.Property) !== 0) result |= SymbolFlags.PropertyExcludes;
1824
+ if ((flags & SymbolFlags.EnumMember) !== 0) result |= SymbolFlags.EnumMemberExcludes;
1825
+ if ((flags & SymbolFlags.Function) !== 0) result |= SymbolFlags.FunctionExcludes;
1826
+ if ((flags & SymbolFlags.Class) !== 0) result |= SymbolFlags.ClassExcludes;
1827
+ if ((flags & SymbolFlags.Interface) !== 0) result |= SymbolFlags.InterfaceExcludes;
1828
+ if ((flags & SymbolFlags.RegularEnum) !== 0) result |= SymbolFlags.RegularEnumExcludes;
1829
+ if ((flags & SymbolFlags.ConstEnum) !== 0) result |= SymbolFlags.ConstEnumExcludes;
1830
+ if ((flags & SymbolFlags.ValueModule) !== 0) result |= SymbolFlags.ValueModuleExcludes;
1831
+ if ((flags & SymbolFlags.Method) !== 0) result |= SymbolFlags.MethodExcludes;
1832
+ if ((flags & SymbolFlags.GetAccessor) !== 0) result |= SymbolFlags.GetAccessorExcludes;
1833
+ if ((flags & SymbolFlags.SetAccessor) !== 0) result |= SymbolFlags.SetAccessorExcludes;
1834
+ if ((flags & SymbolFlags.TypeParameter) !== 0) result |= SymbolFlags.TypeParameterExcludes;
1835
+ if ((flags & SymbolFlags.TypeAlias) !== 0) result |= SymbolFlags.TypeAliasExcludes;
1836
+ if ((flags & SymbolFlags.Alias) !== 0) result |= SymbolFlags.AliasExcludes;
1837
+ return result;
1838
+ }
1839
+
1840
+ class AliasMarker extends NodeVisitor {
1841
+ readonly resolver: SyntacticDeclarationEmitResolver;
1842
+
1843
+ constructor(resolver: SyntacticDeclarationEmitResolver) {
1844
+ super();
1845
+ this.resolver = resolver;
1846
+ }
1847
+
1848
+ visitNode(node: Node): boolean {
1849
+ switch (node.kind) {
1850
+ case SyntaxKind.ExportAssignment: {
1851
+ const expression = getExpression(node)!;
1852
+ if (expression instanceof Identifier) this.resolver.markLinkedAliases(expression);
1853
+ return false;
1854
+ }
1855
+ case SyntaxKind.ExportSpecifier:
1856
+ if (node instanceof ExportSpecifier) this.resolver.markLinkedAliases(node.propertyName ?? node.name);
1857
+ return false;
1858
+ // Exports are statements of files and namespaces.
1859
+ case SyntaxKind.ModuleDeclaration:
1860
+ case SyntaxKind.ModuleBlock:
1861
+ case SyntaxKind.ExportDeclaration:
1862
+ case SyntaxKind.NamedExports:
1863
+ return node.forEachChild(this);
1864
+ }
1865
+ return false;
1866
+ }
1867
+ }