tsc-ts 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (584) hide show
  1. package/README.md +33 -1
  2. package/dist/api/compiler/ast-utilities.d.ts +82 -0
  3. package/dist/api/compiler/ast-utilities.js +462 -0
  4. package/dist/api/compiler/ast.d.ts +2350 -0
  5. package/dist/api/compiler/ast.js +11206 -0
  6. package/dist/api/compiler/astnav.d.ts +37 -0
  7. package/dist/api/compiler/astnav.js +767 -0
  8. package/dist/api/compiler/binder-utilities.d.ts +182 -0
  9. package/dist/api/compiler/binder-utilities.js +1240 -0
  10. package/dist/api/compiler/binder.d.ts +33 -0
  11. package/dist/api/compiler/binder.js +2358 -0
  12. package/dist/api/compiler/character-codes.d.ts +161 -0
  13. package/dist/api/compiler/character-codes.js +160 -0
  14. package/dist/api/compiler/checker-calls.d.ts +46 -0
  15. package/dist/api/compiler/checker-calls.js +1640 -0
  16. package/dist/api/compiler/checker-classes.d.ts +30 -0
  17. package/dist/api/compiler/checker-classes.js +582 -0
  18. package/dist/api/compiler/checker-contextual.d.ts +77 -0
  19. package/dist/api/compiler/checker-contextual.js +1136 -0
  20. package/dist/api/compiler/checker-declaration-order.d.ts +12 -0
  21. package/dist/api/compiler/checker-declaration-order.js +356 -0
  22. package/dist/api/compiler/checker-declarations.d.ts +33 -0
  23. package/dist/api/compiler/checker-declarations.js +888 -0
  24. package/dist/api/compiler/checker-declared-types.d.ts +48 -0
  25. package/dist/api/compiler/checker-declared-types.js +787 -0
  26. package/dist/api/compiler/checker-decorators.d.ts +26 -0
  27. package/dist/api/compiler/checker-decorators.js +562 -0
  28. package/dist/api/compiler/checker-deprecation.d.ts +33 -0
  29. package/dist/api/compiler/checker-deprecation.js +315 -0
  30. package/dist/api/compiler/checker-destructuring.d.ts +34 -0
  31. package/dist/api/compiler/checker-destructuring.js +584 -0
  32. package/dist/api/compiler/checker-elaboration.d.ts +15 -0
  33. package/dist/api/compiler/checker-elaboration.js +290 -0
  34. package/dist/api/compiler/checker-emit-helpers.d.ts +58 -0
  35. package/dist/api/compiler/checker-emit-helpers.js +154 -0
  36. package/dist/api/compiler/checker-emit-resolver.d.ts +75 -0
  37. package/dist/api/compiler/checker-emit-resolver.js +579 -0
  38. package/dist/api/compiler/checker-evaluator.d.ts +27 -0
  39. package/dist/api/compiler/checker-evaluator.js +188 -0
  40. package/dist/api/compiler/checker-expressions.d.ts +67 -0
  41. package/dist/api/compiler/checker-expressions.js +1351 -0
  42. package/dist/api/compiler/checker-features.d.ts +6 -0
  43. package/dist/api/compiler/checker-features.js +354 -0
  44. package/dist/api/compiler/checker-flow.d.ts +86 -0
  45. package/dist/api/compiler/checker-flow.js +169 -0
  46. package/dist/api/compiler/checker-functions.d.ts +43 -0
  47. package/dist/api/compiler/checker-functions.js +1002 -0
  48. package/dist/api/compiler/checker-generated-code.d.ts +25 -0
  49. package/dist/api/compiler/checker-generated-code.js +168 -0
  50. package/dist/api/compiler/checker-globals.d.ts +14 -0
  51. package/dist/api/compiler/checker-globals.js +37 -0
  52. package/dist/api/compiler/checker-grammar.d.ts +35 -0
  53. package/dist/api/compiler/checker-grammar.js +2573 -0
  54. package/dist/api/compiler/checker-heritage.d.ts +28 -0
  55. package/dist/api/compiler/checker-heritage.js +900 -0
  56. package/dist/api/compiler/checker-inference.d.ts +179 -0
  57. package/dist/api/compiler/checker-inference.js +2105 -0
  58. package/dist/api/compiler/checker-iteration.d.ts +115 -0
  59. package/dist/api/compiler/checker-iteration.js +857 -0
  60. package/dist/api/compiler/checker-javascript.d.ts +42 -0
  61. package/dist/api/compiler/checker-javascript.js +441 -0
  62. package/dist/api/compiler/checker-jsdoc.d.ts +30 -0
  63. package/dist/api/compiler/checker-jsdoc.js +320 -0
  64. package/dist/api/compiler/checker-jsx.d.ts +94 -0
  65. package/dist/api/compiler/checker-jsx.js +1433 -0
  66. package/dist/api/compiler/checker-literals.d.ts +6 -0
  67. package/dist/api/compiler/checker-literals.js +43 -0
  68. package/dist/api/compiler/checker-members.d.ts +198 -0
  69. package/dist/api/compiler/checker-members.js +2126 -0
  70. package/dist/api/compiler/checker-modules.d.ts +85 -0
  71. package/dist/api/compiler/checker-modules.js +2141 -0
  72. package/dist/api/compiler/checker-narrowing.d.ts +120 -0
  73. package/dist/api/compiler/checker-narrowing.js +2797 -0
  74. package/dist/api/compiler/checker-object-literals.d.ts +14 -0
  75. package/dist/api/compiler/checker-object-literals.js +479 -0
  76. package/dist/api/compiler/checker-operators.d.ts +33 -0
  77. package/dist/api/compiler/checker-operators.js +1040 -0
  78. package/dist/api/compiler/checker-overloads.d.ts +7 -0
  79. package/dist/api/compiler/checker-overloads.js +270 -0
  80. package/dist/api/compiler/checker-property-access.d.ts +34 -0
  81. package/dist/api/compiler/checker-property-access.js +672 -0
  82. package/dist/api/compiler/checker-services.d.ts +49 -0
  83. package/dist/api/compiler/checker-services.js +995 -0
  84. package/dist/api/compiler/checker-signatures.d.ts +55 -0
  85. package/dist/api/compiler/checker-signatures.js +788 -0
  86. package/dist/api/compiler/checker-source-file.d.ts +27 -0
  87. package/dist/api/compiler/checker-source-file.js +619 -0
  88. package/dist/api/compiler/checker-statements.d.ts +18 -0
  89. package/dist/api/compiler/checker-statements.js +226 -0
  90. package/dist/api/compiler/checker-super.d.ts +13 -0
  91. package/dist/api/compiler/checker-super.js +241 -0
  92. package/dist/api/compiler/checker-symbol-types.d.ts +67 -0
  93. package/dist/api/compiler/checker-symbol-types.js +1885 -0
  94. package/dist/api/compiler/checker-symbols.d.ts +181 -0
  95. package/dist/api/compiler/checker-symbols.js +1782 -0
  96. package/dist/api/compiler/checker-type-factory.d.ts +142 -0
  97. package/dist/api/compiler/checker-type-factory.js +2501 -0
  98. package/dist/api/compiler/checker-type-nodes.d.ts +26 -0
  99. package/dist/api/compiler/checker-type-nodes.js +828 -0
  100. package/dist/api/compiler/checker-type-operators.d.ts +109 -0
  101. package/dist/api/compiler/checker-type-operators.js +1842 -0
  102. package/dist/api/compiler/checker-types.d.ts +1027 -0
  103. package/dist/api/compiler/checker-types.js +1697 -0
  104. package/dist/api/compiler/checker-unused.d.ts +19 -0
  105. package/dist/api/compiler/checker-unused.js +524 -0
  106. package/dist/api/compiler/checker-utilities.d.ts +33 -0
  107. package/dist/api/compiler/checker-utilities.js +141 -0
  108. package/dist/api/compiler/checker.d.ts +491 -0
  109. package/dist/api/compiler/checker.js +912 -0
  110. package/dist/api/compiler/command-line.d.ts +32 -0
  111. package/dist/api/compiler/command-line.js +383 -0
  112. package/dist/api/compiler/compile-program.d.ts +118 -0
  113. package/dist/api/compiler/compile-program.js +384 -0
  114. package/dist/api/compiler/diagnostic-locales.d.ts +22 -0
  115. package/dist/api/compiler/diagnostic-locales.js +64 -0
  116. package/dist/api/compiler/diagnostic-messages.d.ts +2166 -0
  117. package/dist/api/compiler/diagnostic-messages.js +184 -0
  118. package/dist/api/compiler/diagnostics.d.ts +167 -0
  119. package/dist/api/compiler/diagnostics.js +820 -0
  120. package/dist/api/compiler/emitter.d.ts +71 -0
  121. package/dist/api/compiler/emitter.js +327 -0
  122. package/dist/api/compiler/file-include.d.ts +117 -0
  123. package/dist/api/compiler/file-include.js +536 -0
  124. package/dist/api/compiler/file-loader.d.ts +261 -0
  125. package/dist/api/compiler/file-loader.js +1257 -0
  126. package/dist/api/compiler/file-system.d.ts +51 -0
  127. package/dist/api/compiler/file-system.js +132 -0
  128. package/dist/api/compiler/flow.d.ts +60 -0
  129. package/dist/api/compiler/flow.js +45 -0
  130. package/dist/api/compiler/instantiation.d.ts +74 -0
  131. package/dist/api/compiler/instantiation.js +799 -0
  132. package/dist/api/compiler/jsdoc.d.ts +75 -0
  133. package/dist/api/compiler/jsdoc.js +1229 -0
  134. package/dist/api/compiler/link-tables.d.ts +36 -0
  135. package/dist/api/compiler/link-tables.js +83 -0
  136. package/dist/api/compiler/locale-data.d.ts +24 -0
  137. package/dist/api/compiler/locale-data.js +183 -0
  138. package/dist/api/compiler/locale.d.ts +4 -0
  139. package/dist/api/compiler/locale.js +317 -0
  140. package/dist/api/compiler/locales/cs-CZ.d.ts +2 -0
  141. package/dist/api/compiler/locales/cs-CZ.js +3 -0
  142. package/dist/api/compiler/locales/de-DE.d.ts +2 -0
  143. package/dist/api/compiler/locales/de-DE.js +3 -0
  144. package/dist/api/compiler/locales/es-ES.d.ts +2 -0
  145. package/dist/api/compiler/locales/es-ES.js +3 -0
  146. package/dist/api/compiler/locales/fr-FR.d.ts +2 -0
  147. package/dist/api/compiler/locales/fr-FR.js +3 -0
  148. package/dist/api/compiler/locales/it-IT.d.ts +2 -0
  149. package/dist/api/compiler/locales/it-IT.js +3 -0
  150. package/dist/api/compiler/locales/ja-JP.d.ts +2 -0
  151. package/dist/api/compiler/locales/ja-JP.js +3 -0
  152. package/dist/api/compiler/locales/ko-KR.d.ts +2 -0
  153. package/dist/api/compiler/locales/ko-KR.js +3 -0
  154. package/dist/api/compiler/locales/pl-PL.d.ts +2 -0
  155. package/dist/api/compiler/locales/pl-PL.js +3 -0
  156. package/dist/api/compiler/locales/pt-BR.d.ts +2 -0
  157. package/dist/api/compiler/locales/pt-BR.js +3 -0
  158. package/dist/api/compiler/locales/ru-RU.d.ts +2 -0
  159. package/dist/api/compiler/locales/ru-RU.js +3 -0
  160. package/dist/api/compiler/locales/tr-TR.d.ts +2 -0
  161. package/dist/api/compiler/locales/tr-TR.js +3 -0
  162. package/dist/api/compiler/locales/zh-CN.d.ts +2 -0
  163. package/dist/api/compiler/locales/zh-CN.js +3 -0
  164. package/dist/api/compiler/locales/zh-TW.d.ts +2 -0
  165. package/dist/api/compiler/locales/zh-TW.js +3 -0
  166. package/dist/api/compiler/module-resolution-types.d.ts +83 -0
  167. package/dist/api/compiler/module-resolution-types.js +176 -0
  168. package/dist/api/compiler/module-resolution.d.ts +71 -0
  169. package/dist/api/compiler/module-resolution.js +1598 -0
  170. package/dist/api/compiler/module-specifiers.d.ts +64 -0
  171. package/dist/api/compiler/module-specifiers.js +1101 -0
  172. package/dist/api/compiler/name-resolver.d.ts +43 -0
  173. package/dist/api/compiler/name-resolver.js +509 -0
  174. package/dist/api/compiler/node-builder-names.d.ts +32 -0
  175. package/dist/api/compiler/node-builder-names.js +854 -0
  176. package/dist/api/compiler/node-builder-pseudo.d.ts +36 -0
  177. package/dist/api/compiler/node-builder-pseudo.js +744 -0
  178. package/dist/api/compiler/node-builder-reuse.d.ts +4 -0
  179. package/dist/api/compiler/node-builder-reuse.js +647 -0
  180. package/dist/api/compiler/node-builder.d.ts +270 -0
  181. package/dist/api/compiler/node-builder.js +2645 -0
  182. package/dist/api/compiler/option-declarations.d.ts +90 -0
  183. package/dist/api/compiler/option-declarations.js +1460 -0
  184. package/dist/api/compiler/options.d.ts +289 -0
  185. package/dist/api/compiler/options.js +1197 -0
  186. package/dist/api/compiler/output-paths.d.ts +42 -0
  187. package/dist/api/compiler/output-paths.js +195 -0
  188. package/dist/api/compiler/package-json.d.ts +175 -0
  189. package/dist/api/compiler/package-json.js +1015 -0
  190. package/dist/api/compiler/parallel-parse.d.ts +219 -0
  191. package/dist/api/compiler/parallel-parse.js +537 -0
  192. package/dist/api/compiler/parser.d.ts +587 -0
  193. package/dist/api/compiler/parser.js +6407 -0
  194. package/dist/api/compiler/path.d.ts +91 -0
  195. package/dist/api/compiler/path.js +705 -0
  196. package/dist/api/compiler/printer/async-helpers.d.ts +22 -0
  197. package/dist/api/compiler/printer/async-helpers.js +91 -0
  198. package/dist/api/compiler/printer/auto-generate.d.ts +13 -0
  199. package/dist/api/compiler/printer/auto-generate.js +20 -0
  200. package/dist/api/compiler/printer/decorator-helpers.d.ts +24 -0
  201. package/dist/api/compiler/printer/decorator-helpers.js +118 -0
  202. package/dist/api/compiler/printer/emit-context.d.ts +154 -0
  203. package/dist/api/compiler/printer/emit-context.js +576 -0
  204. package/dist/api/compiler/printer/emit-flags.d.ts +60 -0
  205. package/dist/api/compiler/printer/emit-flags.js +2 -0
  206. package/dist/api/compiler/printer/factory-base.d.ts +171 -0
  207. package/dist/api/compiler/printer/factory-base.js +1505 -0
  208. package/dist/api/compiler/printer/factory.d.ts +147 -0
  209. package/dist/api/compiler/printer/factory.js +542 -0
  210. package/dist/api/compiler/printer/helpers.d.ts +27 -0
  211. package/dist/api/compiler/printer/helpers.js +164 -0
  212. package/dist/api/compiler/printer/name-generator.d.ts +41 -0
  213. package/dist/api/compiler/printer/name-generator.js +283 -0
  214. package/dist/api/compiler/printer/printer.d.ts +411 -0
  215. package/dist/api/compiler/printer/printer.js +4517 -0
  216. package/dist/api/compiler/printer/text-writer.d.ts +46 -0
  217. package/dist/api/compiler/printer/text-writer.js +172 -0
  218. package/dist/api/compiler/printer/utilities.d.ts +82 -0
  219. package/dist/api/compiler/printer/utilities.js +817 -0
  220. package/dist/api/compiler/program-checker.d.ts +156 -0
  221. package/dist/api/compiler/program-checker.js +526 -0
  222. package/dist/api/compiler/program-utilities.d.ts +52 -0
  223. package/dist/api/compiler/program-utilities.js +365 -0
  224. package/dist/api/compiler/program.d.ts +180 -0
  225. package/dist/api/compiler/program.js +1011 -0
  226. package/dist/api/compiler/pseudo-bigint.d.ts +5 -0
  227. package/dist/api/compiler/pseudo-bigint.js +61 -0
  228. package/dist/api/compiler/regexp-checker.d.ts +38 -0
  229. package/dist/api/compiler/regexp-checker.js +942 -0
  230. package/dist/api/compiler/relations.d.ts +263 -0
  231. package/dist/api/compiler/relations.js +4002 -0
  232. package/dist/api/compiler/reparser.d.ts +48 -0
  233. package/dist/api/compiler/reparser.js +1323 -0
  234. package/dist/api/compiler/scanner.d.ts +256 -0
  235. package/dist/api/compiler/scanner.js +2853 -0
  236. package/dist/api/compiler/side-state.d.ts +16 -0
  237. package/dist/api/compiler/side-state.js +89 -0
  238. package/dist/api/compiler/sourcemap.d.ts +55 -0
  239. package/dist/api/compiler/sourcemap.js +340 -0
  240. package/dist/api/compiler/spelling.d.ts +14 -0
  241. package/dist/api/compiler/spelling.js +128 -0
  242. package/dist/api/compiler/symbol-accessibility.d.ts +57 -0
  243. package/dist/api/compiler/symbol-accessibility.js +894 -0
  244. package/dist/api/compiler/symbol.d.ts +240 -0
  245. package/dist/api/compiler/symbol.js +228 -0
  246. package/dist/api/compiler/symlinks.d.ts +32 -0
  247. package/dist/api/compiler/symlinks.js +114 -0
  248. package/dist/api/compiler/syntax-kind.d.ts +389 -0
  249. package/dist/api/compiler/syntax-kind.js +2 -0
  250. package/dist/api/compiler/timeline.d.ts +9 -0
  251. package/dist/api/compiler/timeline.js +54 -0
  252. package/dist/api/compiler/transformers/alias-references.d.ts +39 -0
  253. package/dist/api/compiler/transformers/alias-references.js +676 -0
  254. package/dist/api/compiler/transformers/async-utilities.d.ts +51 -0
  255. package/dist/api/compiler/transformers/async-utilities.js +260 -0
  256. package/dist/api/compiler/transformers/async.d.ts +53 -0
  257. package/dist/api/compiler/transformers/async.js +645 -0
  258. package/dist/api/compiler/transformers/class-fields.d.ts +206 -0
  259. package/dist/api/compiler/transformers/class-fields.js +2418 -0
  260. package/dist/api/compiler/transformers/class-utilities.d.ts +46 -0
  261. package/dist/api/compiler/transformers/class-utilities.js +261 -0
  262. package/dist/api/compiler/transformers/commonjs-module.d.ts +103 -0
  263. package/dist/api/compiler/transformers/commonjs-module.js +1180 -0
  264. package/dist/api/compiler/transformers/const-enum-inliner.d.ts +11 -0
  265. package/dist/api/compiler/transformers/const-enum-inliner.js +36 -0
  266. package/dist/api/compiler/transformers/declarations-diagnostics.d.ts +52 -0
  267. package/dist/api/compiler/transformers/declarations-diagnostics.js +538 -0
  268. package/dist/api/compiler/transformers/declarations-pseudo.d.ts +160 -0
  269. package/dist/api/compiler/transformers/declarations-pseudo.js +797 -0
  270. package/dist/api/compiler/transformers/declarations-resolver.d.ts +152 -0
  271. package/dist/api/compiler/transformers/declarations-resolver.js +35 -0
  272. package/dist/api/compiler/transformers/declarations-syntactic.d.ts +119 -0
  273. package/dist/api/compiler/transformers/declarations-syntactic.js +1582 -0
  274. package/dist/api/compiler/transformers/declarations-tracker.d.ts +46 -0
  275. package/dist/api/compiler/transformers/declarations-tracker.js +197 -0
  276. package/dist/api/compiler/transformers/declarations.d.ts +175 -0
  277. package/dist/api/compiler/transformers/declarations.js +2380 -0
  278. package/dist/api/compiler/transformers/decorator-metadata.d.ts +54 -0
  279. package/dist/api/compiler/transformers/decorator-metadata.js +554 -0
  280. package/dist/api/compiler/transformers/decorator-utilities.d.ts +38 -0
  281. package/dist/api/compiler/transformers/decorator-utilities.js +238 -0
  282. package/dist/api/compiler/transformers/destructuring.d.ts +25 -0
  283. package/dist/api/compiler/transformers/destructuring.js +626 -0
  284. package/dist/api/compiler/transformers/downlevel.d.ts +6 -0
  285. package/dist/api/compiler/transformers/downlevel.js +45 -0
  286. package/dist/api/compiler/transformers/emit-resolver.d.ts +61 -0
  287. package/dist/api/compiler/transformers/emit-resolver.js +197 -0
  288. package/dist/api/compiler/transformers/es-decorators.d.ts +118 -0
  289. package/dist/api/compiler/transformers/es-decorators.js +1901 -0
  290. package/dist/api/compiler/transformers/exponentiation.d.ts +11 -0
  291. package/dist/api/compiler/transformers/exponentiation.js +76 -0
  292. package/dist/api/compiler/transformers/external-module-info.d.ts +35 -0
  293. package/dist/api/compiler/transformers/external-module-info.js +351 -0
  294. package/dist/api/compiler/transformers/for-await.d.ts +43 -0
  295. package/dist/api/compiler/transformers/for-await.js +469 -0
  296. package/dist/api/compiler/transformers/import-elision.d.ts +16 -0
  297. package/dist/api/compiler/transformers/import-elision.js +124 -0
  298. package/dist/api/compiler/transformers/jsx-entities.d.ts +1 -0
  299. package/dist/api/compiler/transformers/jsx-entities.js +256 -0
  300. package/dist/api/compiler/transformers/jsx.d.ts +71 -0
  301. package/dist/api/compiler/transformers/jsx.js +700 -0
  302. package/dist/api/compiler/transformers/legacy-decorators.d.ts +56 -0
  303. package/dist/api/compiler/transformers/legacy-decorators.js +564 -0
  304. package/dist/api/compiler/transformers/logical-assignment.d.ts +14 -0
  305. package/dist/api/compiler/transformers/logical-assignment.js +62 -0
  306. package/dist/api/compiler/transformers/module-utilities.d.ts +9 -0
  307. package/dist/api/compiler/transformers/module-utilities.js +36 -0
  308. package/dist/api/compiler/transformers/module.d.ts +49 -0
  309. package/dist/api/compiler/transformers/module.js +296 -0
  310. package/dist/api/compiler/transformers/named-evaluation.d.ts +26 -0
  311. package/dist/api/compiler/transformers/named-evaluation.js +266 -0
  312. package/dist/api/compiler/transformers/nullish-coalescing.d.ts +9 -0
  313. package/dist/api/compiler/transformers/nullish-coalescing.js +26 -0
  314. package/dist/api/compiler/transformers/object-rest-spread.d.ts +34 -0
  315. package/dist/api/compiler/transformers/object-rest-spread.js +411 -0
  316. package/dist/api/compiler/transformers/optional-catch.d.ts +9 -0
  317. package/dist/api/compiler/transformers/optional-catch.js +20 -0
  318. package/dist/api/compiler/transformers/optional-chain.d.ts +14 -0
  319. package/dist/api/compiler/transformers/optional-chain.js +188 -0
  320. package/dist/api/compiler/transformers/reference-resolver.d.ts +128 -0
  321. package/dist/api/compiler/transformers/reference-resolver.js +1155 -0
  322. package/dist/api/compiler/transformers/runtime-syntax.d.ts +71 -0
  323. package/dist/api/compiler/transformers/runtime-syntax.js +753 -0
  324. package/dist/api/compiler/transformers/subtree-facts.d.ts +9 -0
  325. package/dist/api/compiler/transformers/subtree-facts.js +203 -0
  326. package/dist/api/compiler/transformers/syntax-facts.d.ts +51 -0
  327. package/dist/api/compiler/transformers/syntax-facts.js +254 -0
  328. package/dist/api/compiler/transformers/tagged-template.d.ts +17 -0
  329. package/dist/api/compiler/transformers/tagged-template.js +148 -0
  330. package/dist/api/compiler/transformers/transformer.d.ts +17 -0
  331. package/dist/api/compiler/transformers/transformer.js +54 -0
  332. package/dist/api/compiler/transformers/type-eraser.d.ts +21 -0
  333. package/dist/api/compiler/transformers/type-eraser.js +346 -0
  334. package/dist/api/compiler/transformers/type-serialization.d.ts +20 -0
  335. package/dist/api/compiler/transformers/type-serialization.js +347 -0
  336. package/dist/api/compiler/transformers/using.d.ts +56 -0
  337. package/dist/api/compiler/transformers/using.js +453 -0
  338. package/dist/api/compiler/transformers/utilities.d.ts +50 -0
  339. package/dist/api/compiler/transformers/utilities.js +347 -0
  340. package/dist/api/compiler/transformers/visitor-base.d.ts +6 -0
  341. package/dist/api/compiler/transformers/visitor-base.js +817 -0
  342. package/dist/api/compiler/transformers/visitor-hooks.d.ts +29 -0
  343. package/dist/api/compiler/transformers/visitor-hooks.js +189 -0
  344. package/dist/api/compiler/tsconfig.d.ts +177 -0
  345. package/dist/api/compiler/tsconfig.js +1311 -0
  346. package/dist/api/compiler/type-printer.d.ts +15 -0
  347. package/dist/api/compiler/type-printer.js +74 -0
  348. package/dist/api/compiler/types.d.ts +87 -0
  349. package/dist/api/compiler/types.js +23 -0
  350. package/dist/api/compiler/unicode-identifiers.d.ts +2 -0
  351. package/dist/api/compiler/unicode-identifiers.js +209 -0
  352. package/dist/api/compiler/unicode-properties.d.ts +8 -0
  353. package/dist/api/compiler/unicode-properties.js +531 -0
  354. package/dist/api/compiler/vfs-match.d.ts +24 -0
  355. package/dist/api/compiler/vfs-match.js +587 -0
  356. package/dist/api/library/ast.d.ts +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 +12862 -0
  382. package/src/compiler/astnav.ts +799 -0
  383. package/src/compiler/binder-utilities.ts +1392 -0
  384. package/src/compiler/binder.ts +2703 -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 +1194 -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 +359 -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 +3584 -0
  407. package/src/compiler/checker-heritage.ts +1233 -0
  408. package/src/compiler/checker-inference.ts +2576 -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 +1924 -0
  413. package/src/compiler/checker-literals.ts +61 -0
  414. package/src/compiler/checker-members.ts +2436 -0
  415. package/src/compiler/checker-modules.ts +2886 -0
  416. package/src/compiler/checker-narrowing.ts +3230 -0
  417. package/src/compiler/checker-object-literals.ts +575 -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 +2107 -0
  427. package/src/compiler/checker-symbols.ts +2150 -0
  428. package/src/compiler/checker-type-factory.ts +2579 -0
  429. package/src/compiler/checker-type-nodes.ts +1033 -0
  430. package/src/compiler/checker-type-operators.ts +2502 -0
  431. package/src/compiler/checker-types.ts +2340 -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 +1116 -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 +897 -0
  441. package/src/compiler/emitter.ts +434 -0
  442. package/src/compiler/encoder.ts +1945 -0
  443. package/src/compiler/file-include.ts +673 -0
  444. package/src/compiler/file-loader.ts +1528 -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 +2784 -0
  449. package/src/compiler/init.ts +141 -0
  450. package/src/compiler/instantiation.ts +894 -0
  451. package/src/compiler/jsdoc.ts +1386 -0
  452. package/src/compiler/link-tables.ts +98 -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 +1069 -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 +3425 -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 +1951 -0
  481. package/src/compiler/parallel-parse.ts +590 -0
  482. package/src/compiler/parse-thread.ts +140 -0
  483. package/src/compiler/parser.ts +7716 -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 +679 -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 +592 -0
  498. package/src/compiler/program-utilities.ts +435 -0
  499. package/src/compiler/program.ts +1419 -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 +1071 -0
  510. package/src/compiler/symbol.ts +439 -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 +832 -0
  523. package/src/compiler/transformers/declarations-pseudo.ts +966 -0
  524. package/src/compiler/transformers/declarations-resolver.ts +249 -0
  525. package/src/compiler/transformers/declarations-syntactic.ts +1859 -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 +1201 -0
  550. package/src/compiler/transformers/runtime-syntax.ts +942 -0
  551. package/src/compiler/transformers/subtree-facts.ts +245 -0
  552. package/src/compiler/transformers/syntax-facts.ts +353 -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 +1418 -0
  562. package/src/compiler/tsc-cli.ts +666 -0
  563. package/src/compiler/tsc-compile.ts +437 -0
  564. package/src/compiler/tsc-watch.ts +854 -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,1233 @@
1
+ // Class and interface heritage: base class and implemented interface conformance, member overrides,
2
+ // index signature constraints and duplicate members.
3
+ import {
4
+ type HeritageClause,
5
+ ModifierFlags,
6
+ type Node,
7
+ NodeFlags,
8
+ type TypeParameterDeclaration,
9
+ getExpression,
10
+ getHeritageClauses,
11
+ getInitializer,
12
+ getMembers,
13
+ getName,
14
+ getParameters,
15
+ getPostfixToken,
16
+ getText,
17
+ getType,
18
+ getTypeParameters,
19
+ getTypeArguments,
20
+ } from './ast.js';
21
+ import {
22
+ findConstructorDeclaration,
23
+ getNameOfDeclaration,
24
+ getDeclarationOfKind,
25
+ hasStaticModifier,
26
+ hasSyntacticModifier,
27
+ isClassLike,
28
+ isOptionalChain,
29
+ isParameterPropertyDeclaration,
30
+ isStatic,
31
+ } from './binder-utilities.js';
32
+ import { type Diagnostic, type DiagnosticMessage, Diagnostics, chainDiagnostic } from './diagnostics.js';
33
+ import { getUseDefineForClassFields } from './options.js';
34
+ import { CheckFlags, InternalSymbolName, type Symbol, SymbolFlags } from './symbol.js';
35
+ import { SyntaxKind } from './syntax-kind.js';
36
+ import { type Checker, createDiagnosticForNode } from './checker.js';
37
+ import {
38
+ type IndexInfo,
39
+ type InterfaceType,
40
+ ObjectFlags,
41
+ SignatureFlags,
42
+ SignatureKind,
43
+ type Type,
44
+ TypeFlags,
45
+ emptyIndexInfos,
46
+ emptySignatures,
47
+ type Signature,
48
+ type TypeMapper,
49
+ newTypeMapper,
50
+ } from './checker-types.js';
51
+ import { createAnonymousType, getIntersectionType, isErrorType, typesOf } from './checker-type-factory.js';
52
+ import {
53
+ getBaseConstructorTypeOfClass,
54
+ getBaseTypes,
55
+ getClassLikeDeclarationOfSymbol,
56
+ getConstraintOfTypeParameter,
57
+ getDeclaredTypeOfSymbol,
58
+ getDefaultFromTypeParameter,
59
+ getExtendsHeritageClauseElement,
60
+ getExtendsHeritageClauseElements,
61
+ getMinTypeArgumentCount,
62
+ isEntityNameExpression,
63
+ isMixinConstructorType,
64
+ isValidBaseType,
65
+ getDeclaredTypeOfTypeParameter,
66
+ fillMissingTypeArguments,
67
+ getInstantiatedConstructorsForTypeArguments,
68
+ } from './checker-declared-types.js';
69
+ import { getReturnTypeOfSignature } from './checker-signatures.js';
70
+ import { instantiateType } from './instantiation.js';
71
+ import { checkSourceElement } from './checker-source-file.js';
72
+ import { isInJSFile } from './ast-utilities.js';
73
+ import {
74
+ getFullyQualifiedName,
75
+ getParentOfSymbol,
76
+ getSpellingSuggestionForName,
77
+ getSymbolOfDeclaration,
78
+ } from './checker-symbols.js';
79
+ import { getNonMissingTypeOfSymbol, getTypeOfSymbol } from './checker-symbol-types.js';
80
+ import {
81
+ getApparentType,
82
+ getDeclarationModifierFlagsFromSymbol,
83
+ getIndexInfoOfType,
84
+ getIndexInfosOfType,
85
+ getIndexSymbol,
86
+ getIndexTypeOfType,
87
+ getPropertiesOfObjectType,
88
+ getPropertiesOfType,
89
+ getPropertyOfObjectType,
90
+ getPropertyOfType,
91
+ getReducedType,
92
+ getSignaturesOfType,
93
+ getTargetSymbol,
94
+ getTypeWithThisArgument,
95
+ isApplicableIndexType,
96
+ isNamedMember,
97
+ isPrototypeProperty,
98
+ resolveDeclaredMembers,
99
+ resolveStructuredTypeMembers,
100
+ } from './checker-members.js';
101
+ import { getLiteralTypeFromProperty } from './checker-type-operators.js';
102
+ import { getTypeFromTypeNode } from './checker-type-nodes.js';
103
+ import { getTypeOfExpression } from './checker-expressions.js';
104
+ import { tryGetNameFromType } from './checker-narrowing.js';
105
+ import { hasDynamicName, hasLateBindableName, isBindingPattern } from './checker-utilities.js';
106
+ import {
107
+ checkTypeAssignableTo,
108
+ checkTypeRelatedTo,
109
+ compareProperties,
110
+ ComparerKind,
111
+ isTypeAssignableTo,
112
+ isTypeIdenticalTo,
113
+ } from './relations.js';
114
+ import { Ternary } from './checker-types.js';
115
+ import { symbolToString, typeToString } from './type-printer.js';
116
+ import { checkFunctionOrConstructorSymbol } from './checker-overloads.js';
117
+ import { isPropertyInitializedInConstructor } from './checker-classes.js';
118
+
119
+ // ---- Classes
120
+
121
+ /** Checks a class's merged declarations, members, base class, implemented types and index signatures. */
122
+ export function checkClassHeritage(c: Checker, node: Node): void {
123
+ const symbol = getSymbolOfDeclaration(c, node);
124
+ if (symbol === undefined) return;
125
+ const classType = getDeclaredTypeOfSymbol(c, symbol) as InterfaceType;
126
+ if ((classType.flags & TypeFlags.Object) === 0) return;
127
+ const typeWithThis = getTypeWithThisArgument(c, classType, undefined, false);
128
+ const staticType = getTypeOfSymbol(c, symbol);
129
+ checkTypeParameterListsIdentical(c, symbol);
130
+ checkFunctionOrConstructorSymbol(c, symbol);
131
+ checkObjectTypeForDuplicateDeclarations(c, node, true);
132
+ if ((node.flags & NodeFlags.Ambient) === 0) checkClassForStaticPropertyNameConflicts(c, node);
133
+ const baseTypeNode = getExtendsHeritageClauseElement(node);
134
+ if (baseTypeNode !== undefined) {
135
+ const baseTypes = getBaseTypes(c, classType);
136
+ if (baseTypes.length !== 0) checkBaseClass(c, node, classType, typeWithThis, staticType, baseTypes[0]!);
137
+ }
138
+ checkMembersForOverrideModifier(c, node, classType, typeWithThis, staticType);
139
+ for (const typeRefNode of getImplementsHeritageClauseElements(node)) {
140
+ const expr = getExpression(typeRefNode)!;
141
+ if (!isEntityNameExpression(expr) || isOptionalChain(expr))
142
+ c.error(
143
+ expr,
144
+ Diagnostics.A_class_can_only_implement_an_identifier_Slashqualified_name_with_optional_type_arguments,
145
+ );
146
+ const t = getReducedType(c, getTypeFromTypeNode(c, typeRefNode));
147
+ if (isErrorType(c, t)) continue;
148
+ if (!isValidBaseType(c, t)) {
149
+ c.error(
150
+ typeRefNode,
151
+ Diagnostics.A_class_can_only_implement_an_object_type_or_intersection_of_object_types_with_statically_known_members,
152
+ );
153
+ continue;
154
+ }
155
+ const message =
156
+ t.symbol !== undefined && (t.symbol.flags & SymbolFlags.Class) !== 0
157
+ ? Diagnostics.Class_0_incorrectly_implements_class_1_Did_you_mean_to_extend_1_and_inherit_its_members_as_a_subclass
158
+ : Diagnostics.Class_0_incorrectly_implements_interface_1;
159
+ const baseWithThis = getTypeWithThisArgument(c, t, classType.thisType, false);
160
+ if (!checkTypeAssignableTo(c, typeWithThis, baseWithThis, undefined, undefined))
161
+ issueMemberSpecificError(c, node, typeWithThis, baseWithThis, message);
162
+ }
163
+ checkIndexConstraints(c, classType, symbol, false);
164
+ checkIndexConstraints(c, staticType, symbol, true);
165
+ checkClassOrInterfaceForDuplicateIndexSignatures(c, node);
166
+ }
167
+
168
+ function checkBaseClass(
169
+ c: Checker,
170
+ node: Node,
171
+ classType: InterfaceType,
172
+ typeWithThis: Type,
173
+ staticType: Type,
174
+ baseType: Type,
175
+ ): void {
176
+ const baseConstructorType = getBaseConstructorTypeOfClass(c, classType);
177
+ const staticBaseType = getApparentType(c, baseConstructorType);
178
+ const baseTypeNode = getExtendsHeritageClauseElement(node)!;
179
+ checkBaseTypeAccessibility(c, staticBaseType, baseTypeNode);
180
+ const typeArgumentNodes = getTypeArguments(baseTypeNode);
181
+ if (typeArgumentNodes !== undefined && typeArgumentNodes.nodes.length !== 0) {
182
+ for (const n of typeArgumentNodes.nodes) checkSourceElement(c, n);
183
+ for (const constructor of getConstructorsForTypeArguments(c, staticBaseType, typeArgumentNodes.nodes))
184
+ if (!checkTypeArgumentConstraints(c, baseTypeNode, constructor.typeParameters)) break;
185
+ }
186
+ const baseWithThis = getTypeWithThisArgument(c, baseType, classType.thisType, false);
187
+ const errorNode = getName(node) ?? node;
188
+ if (!checkTypeAssignableTo(c, typeWithThis, baseWithThis, undefined, undefined))
189
+ issueMemberSpecificError(c, node, typeWithThis, baseWithThis, Diagnostics.Class_0_incorrectly_extends_base_class_1);
190
+ // The static side is checked only when the instance side is assignable.
191
+ else
192
+ checkTypeAssignableTo(
193
+ c,
194
+ staticType,
195
+ getTypeWithoutSignatures(c, staticBaseType),
196
+ errorNode,
197
+ Diagnostics.Class_static_side_0_incorrectly_extends_base_class_static_side_1,
198
+ );
199
+ if ((baseConstructorType.flags & TypeFlags.TypeVariable) !== 0) {
200
+ if (!isMixinConstructorType(c, staticType))
201
+ c.error(errorNode, Diagnostics.A_mixin_class_must_have_a_constructor_with_a_single_rest_parameter_of_type_any);
202
+ else if (
203
+ hasAbstractSignature(getSignaturesOfType(c, baseConstructorType, SignatureKind.Construct)) &&
204
+ !hasSyntacticModifier(node, ModifierFlags.Abstract)
205
+ )
206
+ c.error(
207
+ errorNode,
208
+ Diagnostics.A_mixin_class_that_extends_from_a_type_variable_containing_an_abstract_construct_signature_must_also_be_declared_abstract,
209
+ );
210
+ }
211
+ // A class-like constructor function that isn't a class must return the same type from every
212
+ // instantiated construct signature.
213
+ if (
214
+ !(staticBaseType.symbol !== undefined && (staticBaseType.symbol.flags & SymbolFlags.Class) !== 0) &&
215
+ (baseConstructorType.flags & TypeFlags.TypeVariable) === 0
216
+ ) {
217
+ const constructors = getInstantiatedConstructorsForTypeArguments(
218
+ c,
219
+ staticBaseType,
220
+ getTypeArguments(baseTypeNode)?.nodes,
221
+ baseTypeNode,
222
+ );
223
+ for (const sig of constructors) {
224
+ if (!isTypeIdenticalTo(c, getReturnTypeOfSignature(c, sig), baseType)) {
225
+ c.error(getExpression(baseTypeNode), Diagnostics.Base_constructors_must_all_have_the_same_return_type);
226
+ break;
227
+ }
228
+ }
229
+ }
230
+ checkKindsOfPropertyMemberOverrides(c, classType, baseType);
231
+ }
232
+
233
+ function hasAbstractSignature(signatures: readonly Signature[]): boolean {
234
+ for (const s of signatures) if ((s.flags & SignatureFlags.Abstract) !== 0) return true;
235
+ return false;
236
+ }
237
+
238
+ function getConstructorsForTypeArguments(c: Checker, t: Type, typeArgumentNodes: readonly Node[]): Signature[] {
239
+ const count = typeArgumentNodes.length;
240
+ const result: Signature[] = [];
241
+ for (const sig of getSignaturesOfType(c, t, SignatureKind.Construct))
242
+ if (count >= getMinTypeArgumentCount(c, sig.typeParameters) && count <= sig.typeParameters.length) result.push(sig);
243
+ return result;
244
+ }
245
+
246
+ /**
247
+ * Checks the type arguments of `node` against the constraints of `typeParameters`, defaults included, up to
248
+ * the first that does not satisfy its constraint.
249
+ */
250
+ export function checkTypeArgumentConstraints(c: Checker, node: Node, typeParameters: readonly Type[]): boolean {
251
+ let typeArguments: Type[] | undefined = undefined;
252
+ let mapper: TypeMapper | undefined = undefined;
253
+ const typeArgumentNodes = getTypeArguments(node)?.nodes ?? [];
254
+ let result = true;
255
+ for (let i = 0; i < typeParameters.length; i++) {
256
+ const constraint = getConstraintOfTypeParameter(c, typeParameters[i]!);
257
+ if (constraint === undefined) continue;
258
+ if (typeArguments === undefined) {
259
+ const explicit: Type[] = [];
260
+ for (const n of typeArgumentNodes) explicit.push(getTypeFromTypeNode(c, n));
261
+ typeArguments = fillMissingTypeArguments(
262
+ c,
263
+ explicit,
264
+ typeParameters,
265
+ getMinTypeArgumentCount(c, typeParameters),
266
+ isInJSFile(node),
267
+ );
268
+ mapper = newTypeMapper(typeParameters.slice(), typeArguments);
269
+ }
270
+ result =
271
+ result &&
272
+ checkTypeAssignableTo(
273
+ c,
274
+ typeArguments![i]!,
275
+ instantiateType(c, constraint, mapper),
276
+ i < typeArgumentNodes.length ? typeArgumentNodes[i]! : undefined,
277
+ Diagnostics.Type_0_does_not_satisfy_the_constraint_1,
278
+ );
279
+ }
280
+ return result;
281
+ }
282
+
283
+ function getImplementsHeritageClauseElements(node: Node): Node[] {
284
+ const result: Node[] = [];
285
+ const clauses = getHeritageClauses(node);
286
+ if (clauses === undefined) return result;
287
+ // Only the first `implements` clause counts; others are syntax errors.
288
+ for (const clause of clauses.nodes) {
289
+ const heritage = clause as HeritageClause;
290
+ if (heritage.token === SyntaxKind.ImplementsKeyword) {
291
+ for (const t of heritage.types.nodes) result.push(t);
292
+ break;
293
+ }
294
+ }
295
+ return result;
296
+ }
297
+
298
+ function checkBaseTypeAccessibility(c: Checker, t: Type, node: Node): void {
299
+ const signatures = getSignaturesOfType(c, t, SignatureKind.Construct);
300
+ if (signatures.length === 0) return;
301
+ const declaration = signatures[0]!.declaration;
302
+ if (declaration === undefined || !hasSyntacticModifier(declaration, ModifierFlags.Private)) return;
303
+ const typeClassDeclaration = t.symbol !== undefined ? getClassLikeDeclarationOfSymbol(t.symbol) : undefined;
304
+ if (!isNodeWithinClass(node, typeClassDeclaration))
305
+ c.error(
306
+ node,
307
+ Diagnostics.Cannot_extend_a_class_0_Class_constructor_is_marked_as_private,
308
+ getFullyQualifiedName(c, t.symbol!),
309
+ );
310
+ }
311
+
312
+ function isNodeWithinClass(node: Node, classDeclaration: Node | undefined): boolean {
313
+ for (let n: Node | undefined = node; n !== undefined; n = n.parent) if (n === classDeclaration) return true;
314
+ return false;
315
+ }
316
+
317
+ /** Reports each incompatible member, or the class as a whole when no member is to blame. */
318
+ function issueMemberSpecificError(
319
+ c: Checker,
320
+ node: Node,
321
+ typeWithThis: Type,
322
+ baseWithThis: Type,
323
+ broadMessage: DiagnosticMessage,
324
+ ): void {
325
+ let issuedMemberError = false;
326
+ for (const member of getMembers(node)!.nodes) {
327
+ if (isStatic(member)) continue;
328
+ const declaredProp = getSymbolOfDeclaration(c, member);
329
+ if (declaredProp === undefined || declaredProp.name === InternalSymbolName.Computed) continue;
330
+ const prop = getPropertyOfType(c, typeWithThis, declaredProp.name);
331
+ const baseProp = getPropertyOfType(c, baseWithThis, declaredProp.name);
332
+ if (prop === undefined || baseProp === undefined) continue;
333
+ const diagnostics: Diagnostic[] = [];
334
+ if (
335
+ !checkTypeRelatedTo(
336
+ c,
337
+ getTypeOfSymbol(c, prop),
338
+ getTypeOfSymbol(c, baseProp),
339
+ c.assignableRelation,
340
+ getName(member) ?? member,
341
+ undefined,
342
+ diagnostics,
343
+ )
344
+ ) {
345
+ c.addDiagnostic(
346
+ chainDiagnostic(
347
+ diagnostics[0]!,
348
+ Diagnostics.Property_0_in_type_1_is_not_assignable_to_the_same_property_in_base_type_2,
349
+ symbolToString(c, declaredProp),
350
+ typeToString(c, typeWithThis),
351
+ typeToString(c, baseWithThis),
352
+ ),
353
+ );
354
+ issuedMemberError = true;
355
+ }
356
+ }
357
+ if (!issuedMemberError) checkTypeAssignableTo(c, typeWithThis, baseWithThis, getName(node) ?? node, broadMessage);
358
+ }
359
+
360
+ function getTypeWithoutSignatures(c: Checker, t: Type): Type {
361
+ if ((t.flags & TypeFlags.Object) !== 0) {
362
+ const resolved = resolveStructuredTypeMembers(c, t);
363
+ if (resolved.callSignatures.length !== 0 || resolved.constructSignatures.length !== 0)
364
+ return createAnonymousType(c, t.symbol, resolved.members, emptySignatures, emptySignatures, emptyIndexInfos);
365
+ } else if ((t.flags & TypeFlags.Intersection) !== 0) {
366
+ const types: Type[] = [];
367
+ for (const u of typesOf(t)) types.push(getTypeWithoutSignatures(c, u));
368
+ return getIntersectionType(c, types);
369
+ }
370
+ return t;
371
+ }
372
+
373
+ function checkClassForStaticPropertyNameConflicts(c: Checker, node: Node): void {
374
+ if (getUseDefineForClassFields(c.compilerOptions)) return;
375
+ for (const member of getMembers(node)!.nodes) {
376
+ const name = getName(member);
377
+ if (name === undefined || !isStatic(member)) continue;
378
+ const memberName = getEffectivePropertyName(c, name);
379
+ if (memberName === 'name' || memberName === 'length' || memberName === 'caller' || memberName === 'arguments')
380
+ c.error(
381
+ name,
382
+ Diagnostics.Static_property_0_conflicts_with_built_in_property_Function_0_of_constructor_function_1,
383
+ memberName,
384
+ symbolToString(c, getSymbolOfDeclaration(c, node)!),
385
+ );
386
+ }
387
+ }
388
+
389
+ /** The property name a name denotes: a literal name, or the literal type of a computed name's expression. */
390
+ function getEffectivePropertyName(c: Checker, name: Node): string | undefined {
391
+ switch (name.kind) {
392
+ case SyntaxKind.Identifier:
393
+ case SyntaxKind.StringLiteral:
394
+ case SyntaxKind.NumericLiteral:
395
+ case SyntaxKind.NoSubstitutionTemplateLiteral:
396
+ return getText(name);
397
+ case SyntaxKind.ComputedPropertyName: {
398
+ const e = getExpression(name)!;
399
+ if (
400
+ e.kind === SyntaxKind.StringLiteral ||
401
+ e.kind === SyntaxKind.NumericLiteral ||
402
+ e.kind === SyntaxKind.NoSubstitutionTemplateLiteral
403
+ )
404
+ return getText(e);
405
+ return tryGetNameFromType(getTypeOfExpression(c, e));
406
+ }
407
+ }
408
+ return undefined;
409
+ }
410
+
411
+ // ---- Member overrides
412
+
413
+ class MissingAbstractMembers {
414
+ readonly baseTypeName: string;
415
+ readonly typeName: string;
416
+ readonly properties: string[] = [];
417
+
418
+ constructor(baseTypeName: string, typeName: string) {
419
+ this.baseTypeName = baseTypeName;
420
+ this.typeName = typeName;
421
+ }
422
+ }
423
+
424
+ /**
425
+ * Checks that derived members override base members of the same kind, and that abstract members
426
+ * are implemented. Assignability is checked by `checkBaseClass`.
427
+ */
428
+ function checkKindsOfPropertyMemberOverrides(c: Checker, t: InterfaceType, baseType: Type): void {
429
+ let missing: MissingAbstractMembers | undefined = undefined;
430
+ let missingNode: Node | undefined = undefined;
431
+ for (const baseProperty of getPropertiesOfType(c, baseType)) {
432
+ const base = getTargetSymbol(c, baseProperty);
433
+ if ((base.flags & SymbolFlags.Prototype) !== 0) continue;
434
+ const baseSymbol = getPropertyOfObjectType(c, t, base.name);
435
+ if (baseSymbol === undefined) continue;
436
+ const derived = getTargetSymbol(c, baseSymbol);
437
+ const baseDeclarationFlags = getDeclarationModifierFlagsFromSymbol(c, base, false);
438
+ // Uninstantiated targets: an inherited member of a generic class resolves to the same symbol.
439
+ if (derived === base) {
440
+ // An inherited abstract member must be implemented, or the class declared abstract.
441
+ if ((baseDeclarationFlags & ModifierFlags.Abstract) === 0) continue;
442
+ const derivedClassDecl = getClassLikeDeclarationOfSymbol(t.symbol!);
443
+ if (derivedClassDecl !== undefined && hasSyntacticModifier(derivedClassDecl, ModifierFlags.Abstract)) continue;
444
+ // Another base type (from a merged interface) may implement it.
445
+ if (isImplementedByOtherBaseType(c, t, baseType, base)) continue;
446
+ if (missing === undefined) {
447
+ missing = new MissingAbstractMembers(typeToString(c, baseType), typeToString(c, t));
448
+ missingNode = derivedClassDecl;
449
+ }
450
+ missing.properties.push(symbolToString(c, baseProperty));
451
+ continue;
452
+ }
453
+ const derivedDeclarationFlags = getDeclarationModifierFlagsFromSymbol(c, derived, false);
454
+ // Private members aren't overridden.
455
+ if (((baseDeclarationFlags | derivedDeclarationFlags) & ModifierFlags.Private) !== 0) continue;
456
+ const basePropertyFlags = base.flags & SymbolFlags.PropertyOrAccessor;
457
+ const derivedPropertyFlags = derived.flags & SymbolFlags.PropertyOrAccessor;
458
+ const derivedName = getNameOfDeclaration(derived.valueDeclaration) ?? derived.valueDeclaration;
459
+ if (basePropertyFlags !== 0 && derivedPropertyFlags !== 0) {
460
+ // Abstract and interface members, and assignment-declared overrides, may change kind.
461
+ if (
462
+ (base.checkFlags & CheckFlags.Mapped) !== 0 ||
463
+ (derived.valueDeclaration !== undefined && derived.valueDeclaration.kind === SyntaxKind.BinaryExpression) ||
464
+ arePropertiesAbstractOrInterface(base, baseDeclarationFlags)
465
+ )
466
+ continue;
467
+ const overriddenInstanceProperty =
468
+ basePropertyFlags !== SymbolFlags.Property && derivedPropertyFlags === SymbolFlags.Property;
469
+ const overriddenInstanceAccessor =
470
+ basePropertyFlags === SymbolFlags.Property && derivedPropertyFlags !== SymbolFlags.Property;
471
+ if (overriddenInstanceProperty || overriddenInstanceAccessor)
472
+ c.error(
473
+ derivedName,
474
+ overriddenInstanceProperty
475
+ ? Diagnostics.X_0_is_defined_as_an_accessor_in_class_1_but_is_overridden_here_in_2_as_an_instance_property
476
+ : Diagnostics.X_0_is_defined_as_a_property_in_class_1_but_is_overridden_here_in_2_as_an_accessor,
477
+ symbolToString(c, base),
478
+ typeToString(c, baseType),
479
+ typeToString(c, t),
480
+ );
481
+ else if (getUseDefineForClassFields(c.compilerOptions))
482
+ checkPropertyOverwritesBase(c, t, baseType, base, derived, baseDeclarationFlags, derivedDeclarationFlags);
483
+ continue;
484
+ }
485
+ let message: DiagnosticMessage;
486
+ if (isPrototypeProperty(base)) {
487
+ // A method may be overridden by a method or property.
488
+ if (isPrototypeProperty(derived) || (derived.flags & SymbolFlags.Property) !== 0) continue;
489
+ message =
490
+ Diagnostics.Class_0_defines_instance_member_function_1_but_extended_class_2_defines_it_as_instance_member_accessor;
491
+ } else if ((base.flags & SymbolFlags.Accessor) !== 0)
492
+ message =
493
+ Diagnostics.Class_0_defines_instance_member_accessor_1_but_extended_class_2_defines_it_as_instance_member_function;
494
+ else
495
+ message =
496
+ Diagnostics.Class_0_defines_instance_member_property_1_but_extended_class_2_defines_it_as_instance_member_function;
497
+ c.error(derivedName, message, typeToString(c, baseType), symbolToString(c, base), typeToString(c, t));
498
+ }
499
+ if (missing !== undefined) reportMissingAbstractMembers(c, missingNode!, missing);
500
+ }
501
+
502
+ function isImplementedByOtherBaseType(c: Checker, t: InterfaceType, baseType: Type, base: Symbol): boolean {
503
+ for (const otherBaseType of getBaseTypes(c, t)) {
504
+ if (otherBaseType === baseType) continue;
505
+ const baseSymbol = getPropertyOfObjectType(c, otherBaseType, base.name);
506
+ if (baseSymbol !== undefined && getTargetSymbol(c, baseSymbol) !== base) return true;
507
+ }
508
+ return false;
509
+ }
510
+
511
+ /** With `useDefineForClassFields`, a redeclared property without an initializer resets the base value. */
512
+ function checkPropertyOverwritesBase(
513
+ c: Checker,
514
+ t: InterfaceType,
515
+ baseType: Type,
516
+ base: Symbol,
517
+ derived: Symbol,
518
+ baseDeclarationFlags: ModifierFlags,
519
+ derivedDeclarationFlags: ModifierFlags,
520
+ ): void {
521
+ let uninitialized: Node | undefined;
522
+ for (const d of derived.declarations) {
523
+ if (d.kind === SyntaxKind.PropertyDeclaration && getInitializer(d) === undefined) {
524
+ uninitialized = d;
525
+ break;
526
+ }
527
+ }
528
+ if (
529
+ uninitialized === undefined ||
530
+ (derived.flags & SymbolFlags.Transient) !== 0 ||
531
+ (baseDeclarationFlags & ModifierFlags.Abstract) !== 0 ||
532
+ (derivedDeclarationFlags & ModifierFlags.Abstract) !== 0
533
+ )
534
+ return;
535
+ for (const d of derived.declarations) if ((d.flags & NodeFlags.Ambient) !== 0) return;
536
+ const constructor = findConstructorDeclaration(getClassLikeDeclarationOfSymbol(t.symbol!)!);
537
+ const propName = getName(uninitialized)!;
538
+ const postfix = getPostfixToken(uninitialized);
539
+ if (
540
+ (postfix !== undefined && postfix.kind === SyntaxKind.ExclamationToken) ||
541
+ constructor === undefined ||
542
+ propName.kind !== SyntaxKind.Identifier ||
543
+ !c.strictNullChecks ||
544
+ !isPropertyInitializedInConstructor(c, propName, t, constructor)
545
+ )
546
+ c.error(
547
+ getNameOfDeclaration(derived.valueDeclaration) ?? derived.valueDeclaration,
548
+ Diagnostics.Property_0_will_overwrite_the_base_property_in_1_If_this_is_intentional_add_an_initializer_Otherwise_add_a_declare_modifier_or_remove_the_redundant_declaration,
549
+ symbolToString(c, base),
550
+ typeToString(c, baseType),
551
+ );
552
+ }
553
+
554
+ function reportMissingAbstractMembers(c: Checker, node: Node | undefined, missing: MissingAbstractMembers): void {
555
+ const isExpression = node !== undefined && node.kind === SyntaxKind.ClassExpression;
556
+ const properties = missing.properties;
557
+ if (properties.length === 1) {
558
+ if (isExpression)
559
+ c.error(
560
+ node,
561
+ Diagnostics.Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1,
562
+ properties[0]!,
563
+ missing.baseTypeName,
564
+ );
565
+ else
566
+ c.error(
567
+ node,
568
+ Diagnostics.Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2,
569
+ missing.typeName,
570
+ properties[0]!,
571
+ missing.baseTypeName,
572
+ );
573
+ return;
574
+ }
575
+ if (properties.length > 5) {
576
+ const listed = properties
577
+ .slice(0, 4)
578
+ .map((p) => "'" + p + "'")
579
+ .join(', ');
580
+ const remaining = String(properties.length - 4);
581
+ if (isExpression)
582
+ c.error(
583
+ node,
584
+ Diagnostics.Non_abstract_class_expression_is_missing_implementations_for_the_following_members_of_0_Colon_1_and_2_more,
585
+ missing.baseTypeName,
586
+ listed,
587
+ remaining,
588
+ );
589
+ else
590
+ c.error(
591
+ node,
592
+ Diagnostics.Non_abstract_class_0_is_missing_implementations_for_the_following_members_of_1_Colon_2_and_3_more,
593
+ missing.typeName,
594
+ missing.baseTypeName,
595
+ listed,
596
+ remaining,
597
+ );
598
+ return;
599
+ }
600
+ const listed = properties.map((p) => "'" + p + "'").join(', ');
601
+ if (isExpression)
602
+ c.error(
603
+ node,
604
+ Diagnostics.Non_abstract_class_expression_is_missing_implementations_for_the_following_members_of_0_Colon_1,
605
+ missing.baseTypeName,
606
+ listed,
607
+ );
608
+ else
609
+ c.error(
610
+ node,
611
+ Diagnostics.Non_abstract_class_0_is_missing_implementations_for_the_following_members_of_1_Colon_2,
612
+ missing.typeName,
613
+ missing.baseTypeName,
614
+ listed,
615
+ );
616
+ }
617
+
618
+ function arePropertiesAbstractOrInterface(base: Symbol, baseDeclarationFlags: ModifierFlags): boolean {
619
+ // Synthetic (intersection) properties need any declaration to qualify; others need all.
620
+ if ((base.checkFlags & CheckFlags.Synthetic) !== 0) {
621
+ for (const d of base.declarations) if (isPropertyAbstractOrInterface(d, baseDeclarationFlags)) return true;
622
+ return false;
623
+ }
624
+ for (const d of base.declarations) if (!isPropertyAbstractOrInterface(d, baseDeclarationFlags)) return false;
625
+ return true;
626
+ }
627
+
628
+ function isPropertyAbstractOrInterface(declaration: Node, baseDeclarationFlags: ModifierFlags): boolean {
629
+ return (
630
+ declaration.parent!.kind === SyntaxKind.InterfaceDeclaration ||
631
+ ((baseDeclarationFlags & ModifierFlags.Abstract) !== 0 &&
632
+ (declaration.kind !== SyntaxKind.PropertyDeclaration || getInitializer(declaration) === undefined))
633
+ );
634
+ }
635
+
636
+ // ---- `override`
637
+
638
+ function checkMembersForOverrideModifier(
639
+ c: Checker,
640
+ node: Node,
641
+ t: InterfaceType,
642
+ typeWithThis: Type,
643
+ staticType: Type,
644
+ ): void {
645
+ let baseWithThis: Type | undefined = undefined;
646
+ if (getExtendsHeritageClauseElement(node) !== undefined) {
647
+ const baseTypes = getBaseTypes(c, t);
648
+ if (baseTypes.length > 0) baseWithThis = getTypeWithThisArgument(c, baseTypes[0]!, t.thisType, false);
649
+ }
650
+ const baseStaticType = getBaseConstructorTypeOfClass(c, t);
651
+ for (const member of getMembers(node)!.nodes) {
652
+ if (hasSyntacticModifier(member, ModifierFlags.Ambient)) continue;
653
+ if (member.kind === SyntaxKind.Constructor) {
654
+ for (const param of getParameters(member)!.nodes)
655
+ if (isParameterPropertyDeclaration(param, member))
656
+ checkMemberForOverrideModifier(c, node, staticType, baseStaticType, baseWithThis, t, typeWithThis, param);
657
+ } else checkMemberForOverrideModifier(c, node, staticType, baseStaticType, baseWithThis, t, typeWithThis, member);
658
+ }
659
+ }
660
+
661
+ function checkMemberForOverrideModifier(
662
+ c: Checker,
663
+ node: Node,
664
+ staticType: Type,
665
+ baseStaticType: Type,
666
+ baseWithThis: Type | undefined,
667
+ t: Type,
668
+ typeWithThis: Type,
669
+ member: Node,
670
+ ): void {
671
+ const isJs = (node.flags & NodeFlags.JavaScriptFile) !== 0;
672
+ const memberHasOverrideModifier = hasSyntacticModifier(member, ModifierFlags.Override);
673
+ if (baseWithThis === undefined) {
674
+ if (memberHasOverrideModifier)
675
+ c.error(
676
+ member,
677
+ isJs
678
+ ? Diagnostics.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_its_containing_class_0_does_not_extend_another_class
679
+ : Diagnostics.This_member_cannot_have_an_override_modifier_because_its_containing_class_0_does_not_extend_another_class,
680
+ typeToString(c, t),
681
+ );
682
+ return;
683
+ }
684
+ const memberSymbol = getSymbolOfDeclaration(c, member);
685
+ if (
686
+ memberHasOverrideModifier &&
687
+ memberSymbol !== undefined &&
688
+ memberSymbol.valueDeclaration !== undefined &&
689
+ member.kind !== SyntaxKind.Parameter &&
690
+ hasDynamicName(member) &&
691
+ !hasLateBindableName(c, member)
692
+ ) {
693
+ c.error(
694
+ member,
695
+ isJs
696
+ ? Diagnostics.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_its_name_is_dynamic
697
+ : Diagnostics.This_member_cannot_have_an_override_modifier_because_its_name_is_dynamic,
698
+ );
699
+ return;
700
+ }
701
+ if (!memberHasOverrideModifier && c.compilerOptions.noImplicitOverride !== true) return;
702
+ if (memberSymbol === undefined) return;
703
+ const memberIsStatic = isStatic(member);
704
+ const prop = getPropertyOfType(c, memberIsStatic ? staticType : typeWithThis, memberSymbol.name);
705
+ if (prop === undefined) return;
706
+ const baseType = memberIsStatic ? baseStaticType : baseWithThis;
707
+ const baseProp = getPropertyOfType(c, baseType, memberSymbol.name);
708
+ if (baseProp === undefined && memberHasOverrideModifier) {
709
+ const suggestion = getSpellingSuggestionForName(
710
+ c,
711
+ memberSymbol.name,
712
+ getPropertiesOfType(c, baseType),
713
+ SymbolFlags.ClassMember,
714
+ );
715
+ if (suggestion !== undefined)
716
+ c.error(
717
+ member,
718
+ isJs
719
+ ? Diagnostics.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base_class_0_Did_you_mean_1
720
+ : Diagnostics.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0_Did_you_mean_1,
721
+ typeToString(c, baseWithThis),
722
+ symbolToString(c, suggestion),
723
+ );
724
+ else
725
+ c.error(
726
+ member,
727
+ isJs
728
+ ? Diagnostics.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base_class_0
729
+ : Diagnostics.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0,
730
+ typeToString(c, baseWithThis),
731
+ );
732
+ return;
733
+ }
734
+ if (
735
+ baseProp === undefined ||
736
+ baseProp.declarations.length === 0 ||
737
+ memberHasOverrideModifier ||
738
+ c.compilerOptions.noImplicitOverride !== true ||
739
+ (node.flags & NodeFlags.Ambient) !== 0
740
+ )
741
+ return;
742
+ let baseHasAbstract = false;
743
+ for (const d of baseProp.declarations) {
744
+ if (hasSyntacticModifier(d, ModifierFlags.Abstract)) {
745
+ baseHasAbstract = true;
746
+ break;
747
+ }
748
+ }
749
+ if (!baseHasAbstract) {
750
+ let message: DiagnosticMessage;
751
+ if (member.kind === SyntaxKind.Parameter)
752
+ message = isJs
753
+ ? Diagnostics.This_parameter_property_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_class_0
754
+ : Diagnostics.This_parameter_property_must_have_an_override_modifier_because_it_overrides_a_member_in_base_class_0;
755
+ else
756
+ message = isJs
757
+ ? Diagnostics.This_member_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_class_0
758
+ : Diagnostics.This_member_must_have_an_override_modifier_because_it_overrides_a_member_in_the_base_class_0;
759
+ c.error(member, message, typeToString(c, baseWithThis));
760
+ return;
761
+ }
762
+ if (hasSyntacticModifier(member, ModifierFlags.Abstract))
763
+ c.error(
764
+ member,
765
+ Diagnostics.This_member_must_have_an_override_modifier_because_it_overrides_an_abstract_method_that_is_declared_in_the_base_class_0,
766
+ typeToString(c, baseWithThis),
767
+ );
768
+ }
769
+
770
+ // ---- Interfaces
771
+
772
+ /** Checks an interface's merged declarations, base interfaces and index signatures, once per symbol. */
773
+ export function checkInterfaceHeritage(c: Checker, node: Node): void {
774
+ const symbol = getSymbolOfDeclaration(c, node);
775
+ if (symbol === undefined) return;
776
+ checkTypeParameterListsIdentical(c, symbol);
777
+ const links = c.symbolLinks(symbol);
778
+ if (!links.interfaceChecked) {
779
+ links.interfaceChecked = true;
780
+ const t = getDeclaredTypeOfSymbol(c, symbol) as InterfaceType;
781
+ if ((t.flags & TypeFlags.Object) !== 0) {
782
+ const typeWithThis = getTypeWithThisArgument(c, t, undefined, false);
783
+ // Later checks run only when inherited properties agree.
784
+ if (checkInheritedPropertiesAreIdentical(c, t, getName(node)!)) {
785
+ for (const baseType of getBaseTypes(c, t))
786
+ checkTypeAssignableTo(
787
+ c,
788
+ typeWithThis,
789
+ getTypeWithThisArgument(c, baseType, t.thisType, false),
790
+ getName(node),
791
+ Diagnostics.Interface_0_incorrectly_extends_interface_1,
792
+ );
793
+ checkIndexConstraints(c, t, symbol, false);
794
+ }
795
+ }
796
+ }
797
+ checkObjectTypeForDuplicateDeclarations(c, node, false);
798
+ for (const element of getExtendsHeritageClauseElements(node)) {
799
+ const expr = getExpression(element)!;
800
+ if (!isEntityNameExpression(expr) || isOptionalChain(expr))
801
+ c.error(
802
+ expr,
803
+ Diagnostics.An_interface_can_only_extend_an_identifier_Slashqualified_name_with_optional_type_arguments,
804
+ );
805
+ }
806
+ }
807
+
808
+ /** Checks a type literal's index signatures and members after its members are checked. */
809
+ export function checkTypeLiteralMembers(c: Checker, node: Node): void {
810
+ const t = getTypeFromTypeNode(c, node);
811
+ if (t.symbol !== undefined) checkIndexConstraints(c, t, t.symbol, false);
812
+ checkTypeForDuplicateIndexSignatures(c, node);
813
+ checkObjectTypeForDuplicateDeclarations(c, node, false);
814
+ }
815
+
816
+ class InheritanceInfo {
817
+ readonly prop: Symbol;
818
+ readonly containingType: Type;
819
+
820
+ constructor(prop: Symbol, containingType: Type) {
821
+ this.prop = prop;
822
+ this.containingType = containingType;
823
+ }
824
+ }
825
+
826
+ function checkInheritedPropertiesAreIdentical(c: Checker, t: InterfaceType, typeNode: Node): boolean {
827
+ const baseTypes = getBaseTypes(c, t);
828
+ if (baseTypes.length < 2) return true;
829
+ const seen = new Map<string, InheritanceInfo>();
830
+ const declaredMembers = resolveDeclaredMembers(c, t).declaredMembers;
831
+ if (declaredMembers !== undefined)
832
+ for (const [id, p] of declaredMembers) if (isNamedMember(c, p, id)) seen.set(p.name, new InheritanceInfo(p, t));
833
+ let identical = true;
834
+ for (const base of baseTypes) {
835
+ for (const prop of getPropertiesOfType(c, getTypeWithThisArgument(c, base, t.thisType, false))) {
836
+ const existing = seen.get(prop.name);
837
+ if (existing === undefined) {
838
+ seen.set(prop.name, new InheritanceInfo(prop, base));
839
+ continue;
840
+ }
841
+ if (
842
+ existing.containingType !== t &&
843
+ compareProperties(c, existing.prop, prop, ComparerKind.Identical) === Ternary.False
844
+ ) {
845
+ identical = false;
846
+ const typeName1 = typeToString(c, existing.containingType);
847
+ const typeName2 = typeToString(c, base);
848
+ const errorInfo = createDiagnosticForNode(
849
+ typeNode,
850
+ Diagnostics.Named_property_0_of_types_1_and_2_are_not_identical,
851
+ [symbolToString(c, prop), typeName1, typeName2],
852
+ );
853
+ c.addDiagnostic(
854
+ chainDiagnostic(
855
+ errorInfo,
856
+ Diagnostics.Interface_0_cannot_simultaneously_extend_types_1_and_2,
857
+ typeToString(c, t),
858
+ typeName1,
859
+ typeName2,
860
+ ),
861
+ );
862
+ }
863
+ }
864
+ }
865
+ return identical;
866
+ }
867
+
868
+ // ---- Type parameters of merged declarations
869
+
870
+ /** Reports class and interface declarations of one symbol whose type parameters differ. */
871
+ export function checkTypeParameterListsIdentical(c: Checker, symbol: Symbol): void {
872
+ if (symbol.declarations.length === 1) return;
873
+ const links = c.symbolLinks(symbol);
874
+ if (links.typeParametersChecked) return;
875
+ links.typeParametersChecked = true;
876
+ const declarations: Node[] = [];
877
+ for (const d of symbol.declarations)
878
+ if (d.kind === SyntaxKind.ClassDeclaration || d.kind === SyntaxKind.InterfaceDeclaration) declarations.push(d);
879
+ if (declarations.length <= 1) return;
880
+ const t = getDeclaredTypeOfSymbol(c, symbol) as InterfaceType;
881
+ if ((t.flags & TypeFlags.Object) === 0) return;
882
+ const lists: (readonly Node[])[] = [];
883
+ for (const d of declarations) {
884
+ const list = getTypeParameters(d);
885
+ lists.push(list !== undefined ? list.nodes : []);
886
+ }
887
+ if (areTypeParametersIdentical(c, lists, t.localTypeParameters())) return;
888
+ const name = symbolToString(c, symbol);
889
+ for (const d of declarations)
890
+ c.error(getName(d), Diagnostics.All_declarations_of_0_must_have_identical_type_parameters, name);
891
+ }
892
+
893
+ /** Reports the declarations of an `infer` type parameter declared more than once with different constraints. */
894
+ export function checkInferTypeParameterDeclarations(c: Checker, symbol: Symbol): void {
895
+ if (symbol.declarations.length <= 1) return;
896
+ const links = c.symbolLinks(symbol);
897
+ if (links.typeParametersChecked) return;
898
+ links.typeParametersChecked = true;
899
+ const declarations: Node[] = [];
900
+ const typeParameterLists: Node[][] = [];
901
+ for (const d of symbol.declarations) {
902
+ if (d.kind === SyntaxKind.TypeParameter) {
903
+ declarations.push(d);
904
+ typeParameterLists.push([d]);
905
+ }
906
+ }
907
+ if (areTypeParametersIdentical(c, typeParameterLists, [getDeclaredTypeOfTypeParameter(c, symbol)])) return;
908
+ const name = symbolToString(c, symbol);
909
+ for (const d of declarations)
910
+ c.error(getName(d), Diagnostics.All_declarations_of_0_must_have_identical_constraints, name);
911
+ }
912
+
913
+ function areTypeParametersIdentical(
914
+ c: Checker,
915
+ lists: readonly (readonly Node[])[],
916
+ targetParameters: readonly Type[],
917
+ ): boolean {
918
+ const maxTypeArgumentCount = targetParameters.length;
919
+ const minTypeArgumentCount = getMinTypeArgumentCount(c, targetParameters);
920
+ for (const sourceParameters of lists) {
921
+ if (sourceParameters.length < minTypeArgumentCount || sourceParameters.length > maxTypeArgumentCount) return false;
922
+ for (let i = 0; i < sourceParameters.length; i++) {
923
+ const source = sourceParameters[i]! as TypeParameterDeclaration;
924
+ const target = targetParameters[i]!;
925
+ if (getText(source.name) !== target.symbol!.name) return false;
926
+ // A later declaration without a constraint may merge with a constrained one.
927
+ const targetConstraint = getConstraintOfTypeParameter(c, target);
928
+ if (
929
+ source.constraint !== undefined &&
930
+ targetConstraint !== undefined &&
931
+ !isTypeIdenticalTo(c, getTypeFromTypeNode(c, source.constraint), targetConstraint)
932
+ )
933
+ return false;
934
+ const targetDefault = getDefaultFromTypeParameter(c, target);
935
+ if (
936
+ source.defaultType !== undefined &&
937
+ targetDefault !== undefined &&
938
+ !isTypeIdenticalTo(c, getTypeFromTypeNode(c, source.defaultType), targetDefault)
939
+ )
940
+ return false;
941
+ }
942
+ }
943
+ return true;
944
+ }
945
+
946
+ // ---- Duplicate members
947
+
948
+ const enum MemberKind {
949
+ None = 0,
950
+ Property = 1,
951
+ Accessor = 2,
952
+ Reported = 3,
953
+ }
954
+
955
+ /**
956
+ * Reports properties declared twice, properties combined with accessors, `static prototype`, and
957
+ * (with `checkPrivateNames`) private names shared by static and instance members.
958
+ */
959
+ export function checkObjectTypeForDuplicateDeclarations(c: Checker, node: Node, checkPrivateNames: boolean): void {
960
+ const instanceNames = new Map<string, MemberKind>();
961
+ const staticNames = new Map<string, MemberKind>();
962
+ const privateNames = new Map<string, number>();
963
+ const nodeInAmbientContext = (node.flags & NodeFlags.Ambient) !== 0;
964
+ for (const member of getMembers(node)!.nodes) {
965
+ if (member.kind === SyntaxKind.Constructor) {
966
+ for (const param of getParameters(member)!.nodes)
967
+ if (isParameterPropertyDeclaration(param, member) && !isBindingPattern(getName(param))) {
968
+ const symbol = getSymbolOfDeclaration(c, param);
969
+ if (symbol !== undefined) checkPropertyOrAccessor(c, node, instanceNames, symbol, MemberKind.Property, false);
970
+ }
971
+ continue;
972
+ }
973
+ const symbol = getSymbolOfDeclaration(c, member);
974
+ if (symbol === undefined) continue;
975
+ const memberIsStatic = hasStaticModifier(member);
976
+ if (!nodeInAmbientContext && memberIsStatic && symbol.name === 'prototype')
977
+ c.error(
978
+ getName(member),
979
+ Diagnostics.Static_property_0_conflicts_with_built_in_property_Function_0_of_constructor_function_1,
980
+ symbol.name,
981
+ symbolToString(c, getSymbolOfDeclaration(c, node)!),
982
+ );
983
+ const names = memberIsStatic ? staticNames : instanceNames;
984
+ const hasAccessorModifier = hasSyntacticModifier(member, ModifierFlags.Accessor);
985
+ if (
986
+ (member.kind === SyntaxKind.PropertyDeclaration && !hasAccessorModifier) ||
987
+ member.kind === SyntaxKind.PropertySignature
988
+ )
989
+ checkPropertyOrAccessor(c, node, names, symbol, MemberKind.Property, memberIsStatic);
990
+ else if (
991
+ member.kind === SyntaxKind.GetAccessor ||
992
+ member.kind === SyntaxKind.SetAccessor ||
993
+ (member.kind === SyntaxKind.PropertyDeclaration && hasAccessorModifier)
994
+ )
995
+ checkPropertyOrAccessor(c, node, names, symbol, MemberKind.Accessor, memberIsStatic);
996
+ const name = getName(member);
997
+ if (checkPrivateNames && name !== undefined && name.kind === SyntaxKind.PrivateIdentifier) {
998
+ let flags = privateNames.get(symbol.name) ?? 0;
999
+ if (flags === 3) continue;
1000
+ flags |= isStatic(member) ? 2 : 1;
1001
+ privateNames.set(symbol.name, flags);
1002
+ if (flags === 3)
1003
+ reportDuplicateMemberErrors(
1004
+ c,
1005
+ node,
1006
+ symbol.name,
1007
+ false,
1008
+ false,
1009
+ Diagnostics.Duplicate_identifier_0_Static_and_instance_elements_cannot_share_the_same_private_name,
1010
+ );
1011
+ }
1012
+ }
1013
+ }
1014
+
1015
+ function checkPropertyOrAccessor(
1016
+ c: Checker,
1017
+ node: Node,
1018
+ names: Map<string, MemberKind>,
1019
+ symbol: Symbol,
1020
+ kind: MemberKind,
1021
+ isStaticMember: boolean,
1022
+ ): void {
1023
+ if (symbol.declarations.length <= 1) return;
1024
+ const state = names.get(symbol.name) ?? MemberKind.None;
1025
+ if (state === MemberKind.None) names.set(symbol.name, kind);
1026
+ // A second property, or a property combined with an accessor.
1027
+ else if (state === MemberKind.Property || (state === MemberKind.Accessor && kind !== MemberKind.Accessor)) {
1028
+ reportDuplicateMemberErrors(c, node, symbol.name, true, isStaticMember, Diagnostics.Duplicate_identifier_0);
1029
+ names.set(symbol.name, MemberKind.Reported);
1030
+ }
1031
+ }
1032
+
1033
+ function reportDuplicateMemberErrors(
1034
+ c: Checker,
1035
+ node: Node,
1036
+ name: string,
1037
+ checkStatic: boolean,
1038
+ isStaticMember: boolean,
1039
+ message: DiagnosticMessage,
1040
+ ): void {
1041
+ for (const member of getMembers(node)!.nodes) {
1042
+ if (member.kind === SyntaxKind.Constructor) {
1043
+ for (const param of getParameters(member)!.nodes) {
1044
+ if (!isParameterPropertyDeclaration(param, member) || isBindingPattern(getName(param))) continue;
1045
+ const symbol = getSymbolOfDeclaration(c, param);
1046
+ if (symbol !== undefined && symbol.name === name) c.error(getName(param), message, symbolToString(c, symbol));
1047
+ }
1048
+ continue;
1049
+ }
1050
+ const symbol = getSymbolOfDeclaration(c, member);
1051
+ if (symbol !== undefined && symbol.name === name && (!checkStatic || isStaticMember === isStatic(member)))
1052
+ c.error(getName(member), message, symbolToString(c, symbol));
1053
+ }
1054
+ }
1055
+
1056
+ // ---- Index signatures
1057
+
1058
+ /** Checks properties and index signatures of `t` against its applicable index signatures. */
1059
+ export function checkIndexConstraints(c: Checker, t: Type, symbol: Symbol, isStaticIndex: boolean): void {
1060
+ const indexInfos = getIndexInfosOfType(c, t);
1061
+ if (indexInfos.length === 0) return;
1062
+ for (const prop of getPropertiesOfObjectType(c, t)) {
1063
+ if (isStaticIndex && (prop.flags & SymbolFlags.Prototype) !== 0) continue;
1064
+ checkIndexConstraintForProperty(
1065
+ c,
1066
+ t,
1067
+ prop,
1068
+ getLiteralTypeFromProperty(c, prop, TypeFlags.StringOrNumberLiteralOrUnique, true),
1069
+ getNonMissingTypeOfSymbol(c, prop),
1070
+ );
1071
+ }
1072
+ const typeDeclaration = symbol.valueDeclaration;
1073
+ if (typeDeclaration !== undefined && isClassLike(typeDeclaration)) {
1074
+ // Members with dynamic names aren't properties of the type.
1075
+ for (const member of getMembers(typeDeclaration)!.nodes) {
1076
+ if (isStatic(member) !== isStaticIndex || !hasDynamicName(member) || hasLateBindableName(c, member)) continue;
1077
+ const memberSymbol = getSymbolOfDeclaration(c, member);
1078
+ if (memberSymbol === undefined) continue;
1079
+ checkIndexConstraintForProperty(
1080
+ c,
1081
+ t,
1082
+ memberSymbol,
1083
+ getTypeOfExpression(c, getExpression(getName(member)!)!),
1084
+ getNonMissingTypeOfSymbol(c, memberSymbol),
1085
+ );
1086
+ }
1087
+ }
1088
+ if (indexInfos.length > 1) for (const info of indexInfos) checkIndexConstraintForIndexSignature(c, t, info);
1089
+ }
1090
+
1091
+ function getApplicableIndexInfos(c: Checker, t: Type, keyType: Type): IndexInfo[] {
1092
+ const result: IndexInfo[] = [];
1093
+ for (const info of getIndexInfosOfType(c, t)) if (isApplicableIndexType(c, keyType, info.keyType)) result.push(info);
1094
+ return result;
1095
+ }
1096
+
1097
+ function getLocalIndexDeclaration(c: Checker, t: Type, info: IndexInfo): Node | undefined {
1098
+ const declaration = info.declaration;
1099
+ if (declaration === undefined) return undefined;
1100
+ const symbol = getSymbolOfDeclaration(c, declaration);
1101
+ return symbol !== undefined && getParentOfSymbol(c, symbol) === t.symbol ? declaration : undefined;
1102
+ }
1103
+
1104
+ function checkIndexConstraintForProperty(c: Checker, t: Type, prop: Symbol, propNameType: Type, propType: Type): void {
1105
+ const declaration = prop.valueDeclaration;
1106
+ const name = getNameOfDeclaration(declaration);
1107
+ if (name !== undefined && name.kind === SyntaxKind.PrivateIdentifier) return;
1108
+ const indexInfos = getApplicableIndexInfos(c, t, propNameType);
1109
+ if (indexInfos.length === 0) return;
1110
+ const interfaceDeclaration =
1111
+ (t.objectFlags & ObjectFlags.Interface) !== 0
1112
+ ? getDeclarationOfKind(t.symbol!, SyntaxKind.InterfaceDeclaration)
1113
+ : undefined;
1114
+ const propDeclaration =
1115
+ (declaration !== undefined && declaration.kind === SyntaxKind.BinaryExpression) ||
1116
+ (name !== undefined && name.kind === SyntaxKind.ComputedPropertyName)
1117
+ ? declaration
1118
+ : undefined;
1119
+ const localPropDeclaration = getParentOfSymbol(c, prop) === t.symbol ? declaration : undefined;
1120
+ for (const info of indexInfos) {
1121
+ // Only check a property or index signature declared here, or, in an interface, ones inherited
1122
+ // from different bases.
1123
+ let errorNode = localPropDeclaration ?? getLocalIndexDeclaration(c, t, info);
1124
+ if (
1125
+ errorNode === undefined &&
1126
+ interfaceDeclaration !== undefined &&
1127
+ !someBaseHasPropertyAndIndexType(c, t, prop.name, info.keyType)
1128
+ )
1129
+ errorNode = interfaceDeclaration;
1130
+ if (errorNode === undefined || isTypeAssignableTo(c, propType, info.valueType)) continue;
1131
+ const diagnostic = createDiagnosticForNode(
1132
+ errorNode,
1133
+ Diagnostics.Property_0_of_type_1_is_not_assignable_to_2_index_type_3,
1134
+ [
1135
+ symbolToString(c, prop),
1136
+ typeToString(c, propType),
1137
+ typeToString(c, info.keyType),
1138
+ typeToString(c, info.valueType),
1139
+ ],
1140
+ );
1141
+ if (propDeclaration !== undefined && errorNode !== propDeclaration)
1142
+ diagnostic.addRelatedInfo(
1143
+ createDiagnosticForNode(propDeclaration, Diagnostics.X_0_is_declared_here, [symbolToString(c, prop)]),
1144
+ );
1145
+ c.addDiagnostic(diagnostic);
1146
+ }
1147
+ }
1148
+
1149
+ function someBaseHasPropertyAndIndexType(c: Checker, t: Type, name: string, keyType: Type): boolean {
1150
+ for (const base of getBaseTypes(c, t))
1151
+ if (getPropertyOfObjectType(c, base, name) !== undefined && getIndexTypeOfType(c, base, keyType) !== undefined)
1152
+ return true;
1153
+ return false;
1154
+ }
1155
+
1156
+ function someBaseHasIndexTypes(c: Checker, t: Type, checkKeyType: Type, keyType: Type): boolean {
1157
+ for (const base of getBaseTypes(c, t))
1158
+ if (getIndexInfoOfType(c, base, checkKeyType) !== undefined && getIndexTypeOfType(c, base, keyType) !== undefined)
1159
+ return true;
1160
+ return false;
1161
+ }
1162
+
1163
+ function checkIndexConstraintForIndexSignature(c: Checker, t: Type, checkInfo: IndexInfo): void {
1164
+ const indexInfos = getApplicableIndexInfos(c, t, checkInfo.keyType);
1165
+ if (indexInfos.length === 0) return;
1166
+ const interfaceDeclaration =
1167
+ (t.objectFlags & ObjectFlags.Interface) !== 0
1168
+ ? getDeclarationOfKind(t.symbol!, SyntaxKind.InterfaceDeclaration)
1169
+ : undefined;
1170
+ const localCheckDeclaration = getLocalIndexDeclaration(c, t, checkInfo);
1171
+ for (const info of indexInfos) {
1172
+ if (info === checkInfo) continue;
1173
+ let errorNode = localCheckDeclaration ?? getLocalIndexDeclaration(c, t, info);
1174
+ if (
1175
+ errorNode === undefined &&
1176
+ interfaceDeclaration !== undefined &&
1177
+ !someBaseHasIndexTypes(c, t, checkInfo.keyType, info.keyType)
1178
+ )
1179
+ errorNode = interfaceDeclaration;
1180
+ if (errorNode !== undefined && !isTypeAssignableTo(c, checkInfo.valueType, info.valueType))
1181
+ c.error(
1182
+ errorNode,
1183
+ Diagnostics.X_0_index_type_1_is_not_assignable_to_2_index_type_3,
1184
+ typeToString(c, checkInfo.keyType),
1185
+ typeToString(c, checkInfo.valueType),
1186
+ typeToString(c, info.keyType),
1187
+ typeToString(c, info.valueType),
1188
+ );
1189
+ }
1190
+ }
1191
+
1192
+ /** Reports duplicate index signatures of a class or interface, once per symbol. */
1193
+ export function checkClassOrInterfaceForDuplicateIndexSignatures(c: Checker, node: Node): void {
1194
+ const symbol = getSymbolOfDeclaration(c, node);
1195
+ if (symbol === undefined) return;
1196
+ const links = c.symbolLinks(symbol);
1197
+ if (links.indexSignaturesChecked) return;
1198
+ links.indexSignaturesChecked = true;
1199
+ checkTypeForDuplicateIndexSignatures(c, node);
1200
+ }
1201
+
1202
+ function checkTypeForDuplicateIndexSignatures(c: Checker, node: Node): void {
1203
+ const symbol = getSymbolOfDeclaration(c, node);
1204
+ if (symbol === undefined) return;
1205
+ const indexSymbol = getIndexSymbol(c, symbol);
1206
+ if (indexSymbol === undefined || indexSymbol.declarations.length <= 1) return;
1207
+ // Late-bound index signatures may duplicate each other and explicit ones.
1208
+ const keyTypes: Type[] = [];
1209
+ const declarationsByKey: Node[][] = [];
1210
+ for (const declaration of indexSymbol.declarations) {
1211
+ if (declaration.kind !== SyntaxKind.IndexSignature) continue;
1212
+ const parameters = getParameters(declaration)!.nodes;
1213
+ if (parameters.length !== 1) continue;
1214
+ const typeNode = getType(parameters[0]!);
1215
+ if (typeNode === undefined) continue;
1216
+ const keyType = getTypeFromTypeNode(c, typeNode);
1217
+ const distributed = (keyType.flags & TypeFlags.Union) !== 0 ? typesOf(keyType) : [keyType];
1218
+ for (const k of distributed) {
1219
+ let index = keyTypes.indexOf(k);
1220
+ if (index < 0) {
1221
+ index = keyTypes.length;
1222
+ keyTypes.push(k);
1223
+ declarationsByKey.push([]);
1224
+ }
1225
+ declarationsByKey[index]!.push(declaration);
1226
+ }
1227
+ }
1228
+ for (let i = 0; i < keyTypes.length; i++) {
1229
+ if (declarationsByKey[i]!.length <= 1) continue;
1230
+ for (const declaration of declarationsByKey[i]!)
1231
+ c.error(declaration, Diagnostics.Duplicate_index_signature_for_type_0, typeToString(c, keyTypes[i]!));
1232
+ }
1233
+ }