tsc-ts 0.0.9 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (373) hide show
  1. package/README.md +2 -2
  2. package/bin/tsc-ts.js +70 -1
  3. package/dist/api/compiler/ast-utilities.d.ts +19 -1
  4. package/dist/api/compiler/ast-utilities.js +180 -95
  5. package/dist/api/compiler/ast.d.ts +22 -15
  6. package/dist/api/compiler/ast.js +1026 -995
  7. package/dist/api/compiler/astnav.js +15 -15
  8. package/dist/api/compiler/binder-utilities.js +186 -186
  9. package/dist/api/compiler/binder.js +290 -263
  10. package/dist/api/compiler/character-codes.js +2 -2
  11. package/dist/api/compiler/checker-calls.js +178 -124
  12. package/dist/api/compiler/checker-classes.d.ts +14 -3
  13. package/dist/api/compiler/checker-classes.js +134 -90
  14. package/dist/api/compiler/checker-contextual.js +64 -61
  15. package/dist/api/compiler/checker-declaration-order.js +79 -79
  16. package/dist/api/compiler/checker-declarations.d.ts +1 -0
  17. package/dist/api/compiler/checker-declarations.js +160 -136
  18. package/dist/api/compiler/checker-declared-types.js +67 -65
  19. package/dist/api/compiler/checker-decorators.js +77 -77
  20. package/dist/api/compiler/checker-deprecation.d.ts +8 -3
  21. package/dist/api/compiler/checker-deprecation.js +76 -55
  22. package/dist/api/compiler/checker-destructuring.js +47 -45
  23. package/dist/api/compiler/checker-elaboration.js +24 -24
  24. package/dist/api/compiler/checker-emit-helpers.js +4 -4
  25. package/dist/api/compiler/checker-emit-resolver.d.ts +4 -2
  26. package/dist/api/compiler/checker-emit-resolver.js +25 -13
  27. package/dist/api/compiler/checker-evaluator.js +9 -9
  28. package/dist/api/compiler/checker-expressions.js +244 -211
  29. package/dist/api/compiler/checker-functions.js +113 -107
  30. package/dist/api/compiler/checker-generated-code.d.ts +0 -11
  31. package/dist/api/compiler/checker-generated-code.js +28 -52
  32. package/dist/api/compiler/checker-grammar.d.ts +1 -0
  33. package/dist/api/compiler/checker-grammar.js +472 -440
  34. package/dist/api/compiler/checker-heritage.js +91 -93
  35. package/dist/api/compiler/checker-inference.d.ts +77 -5
  36. package/dist/api/compiler/checker-inference.js +487 -107
  37. package/dist/api/compiler/checker-iteration.d.ts +0 -10
  38. package/dist/api/compiler/checker-iteration.js +35 -52
  39. package/dist/api/compiler/checker-javascript.js +14 -14
  40. package/dist/api/compiler/checker-jsdoc.d.ts +8 -10
  41. package/dist/api/compiler/checker-jsdoc.js +67 -58
  42. package/dist/api/compiler/checker-jsx.js +105 -88
  43. package/dist/api/compiler/checker-members.d.ts +9 -2
  44. package/dist/api/compiler/checker-members.js +212 -75
  45. package/dist/api/compiler/checker-modules.d.ts +15 -6
  46. package/dist/api/compiler/checker-modules.js +469 -309
  47. package/dist/api/compiler/checker-narrowing.js +273 -189
  48. package/dist/api/compiler/checker-object-literals.js +25 -22
  49. package/dist/api/compiler/checker-operators.js +126 -118
  50. package/dist/api/compiler/checker-overloads.js +27 -27
  51. package/dist/api/compiler/checker-property-access.js +59 -55
  52. package/dist/api/compiler/checker-services.d.ts +1 -0
  53. package/dist/api/compiler/checker-services.js +222 -210
  54. package/dist/api/compiler/checker-signatures.js +65 -49
  55. package/dist/api/compiler/checker-source-file.d.ts +5 -0
  56. package/dist/api/compiler/checker-source-file.js +154 -130
  57. package/dist/api/compiler/checker-statements.js +33 -32
  58. package/dist/api/compiler/checker-super.js +50 -50
  59. package/dist/api/compiler/checker-symbol-types.js +109 -93
  60. package/dist/api/compiler/checker-symbols.d.ts +13 -1
  61. package/dist/api/compiler/checker-symbols.js +264 -149
  62. package/dist/api/compiler/checker-type-factory.d.ts +5 -0
  63. package/dist/api/compiler/checker-type-factory.js +145 -36
  64. package/dist/api/compiler/checker-type-nodes.d.ts +1 -0
  65. package/dist/api/compiler/checker-type-nodes.js +179 -141
  66. package/dist/api/compiler/checker-type-operators.d.ts +2 -0
  67. package/dist/api/compiler/checker-type-operators.js +110 -63
  68. package/dist/api/compiler/checker-types.d.ts +80 -3
  69. package/dist/api/compiler/checker-types.js +121 -2
  70. package/dist/api/compiler/checker-unused.js +114 -118
  71. package/dist/api/compiler/checker-utilities.js +11 -11
  72. package/dist/api/compiler/checker.d.ts +104 -31
  73. package/dist/api/compiler/checker.js +181 -33
  74. package/dist/api/compiler/command-line.d.ts +1 -3
  75. package/dist/api/compiler/command-line.js +47 -44
  76. package/dist/api/compiler/compile-program.d.ts +42 -3
  77. package/dist/api/compiler/compile-program.js +139 -27
  78. package/dist/api/compiler/diagnostic-messages.d.ts +1849 -1774
  79. package/dist/api/compiler/diagnostic-messages.js +128 -122
  80. package/dist/api/compiler/diagnostics.d.ts +22 -0
  81. package/dist/api/compiler/diagnostics.js +93 -11
  82. package/dist/api/compiler/emitter.d.ts +7 -1
  83. package/dist/api/compiler/emitter.js +53 -11
  84. package/dist/api/compiler/file-include.d.ts +2 -1
  85. package/dist/api/compiler/file-include.js +11 -7
  86. package/dist/api/compiler/file-loader.d.ts +21 -1
  87. package/dist/api/compiler/file-loader.js +201 -48
  88. package/dist/api/compiler/instantiation.d.ts +7 -0
  89. package/dist/api/compiler/instantiation.js +101 -49
  90. package/dist/api/compiler/jsdoc.js +23 -23
  91. package/dist/api/compiler/link-tables.d.ts +48 -18
  92. package/dist/api/compiler/link-tables.js +80 -37
  93. package/dist/api/compiler/locales/cs-CZ.d.ts +1 -1
  94. package/dist/api/compiler/locales/cs-CZ.js +1 -1
  95. package/dist/api/compiler/locales/de-DE.d.ts +1 -1
  96. package/dist/api/compiler/locales/de-DE.js +1 -1
  97. package/dist/api/compiler/locales/es-ES.d.ts +1 -1
  98. package/dist/api/compiler/locales/es-ES.js +1 -1
  99. package/dist/api/compiler/locales/fr-FR.d.ts +1 -1
  100. package/dist/api/compiler/locales/fr-FR.js +1 -1
  101. package/dist/api/compiler/locales/it-IT.d.ts +1 -1
  102. package/dist/api/compiler/locales/it-IT.js +1 -1
  103. package/dist/api/compiler/locales/ja-JP.d.ts +1 -1
  104. package/dist/api/compiler/locales/ja-JP.js +1 -1
  105. package/dist/api/compiler/locales/ko-KR.d.ts +1 -1
  106. package/dist/api/compiler/locales/ko-KR.js +1 -1
  107. package/dist/api/compiler/locales/pl-PL.d.ts +1 -1
  108. package/dist/api/compiler/locales/pl-PL.js +1 -1
  109. package/dist/api/compiler/locales/pt-BR.d.ts +1 -1
  110. package/dist/api/compiler/locales/pt-BR.js +1 -1
  111. package/dist/api/compiler/locales/ru-RU.d.ts +1 -1
  112. package/dist/api/compiler/locales/ru-RU.js +1 -1
  113. package/dist/api/compiler/locales/tr-TR.d.ts +1 -1
  114. package/dist/api/compiler/locales/tr-TR.js +1 -1
  115. package/dist/api/compiler/locales/zh-CN.d.ts +1 -1
  116. package/dist/api/compiler/locales/zh-CN.js +1 -1
  117. package/dist/api/compiler/locales/zh-TW.d.ts +1 -1
  118. package/dist/api/compiler/locales/zh-TW.js +1 -1
  119. package/dist/api/compiler/module-resolution-types.js +6 -6
  120. package/dist/api/compiler/module-resolution.d.ts +10 -1
  121. package/dist/api/compiler/module-resolution.js +115 -84
  122. package/dist/api/compiler/module-specifiers.d.ts +15 -0
  123. package/dist/api/compiler/module-specifiers.js +24 -18
  124. package/dist/api/compiler/name-resolver.js +74 -65
  125. package/dist/api/compiler/node-builder-names.d.ts +11 -3
  126. package/dist/api/compiler/node-builder-names.js +210 -90
  127. package/dist/api/compiler/node-builder-pseudo.js +29 -31
  128. package/dist/api/compiler/node-builder-reuse.js +23 -22
  129. package/dist/api/compiler/node-builder.d.ts +18 -1
  130. package/dist/api/compiler/node-builder.js +191 -102
  131. package/dist/api/compiler/option-declarations.d.ts +2 -6
  132. package/dist/api/compiler/option-declarations.js +315 -375
  133. package/dist/api/compiler/options.d.ts +15 -33
  134. package/dist/api/compiler/options.js +21 -54
  135. package/dist/api/compiler/output-paths.d.ts +4 -1
  136. package/dist/api/compiler/output-paths.js +6 -11
  137. package/dist/api/compiler/package-json.d.ts +3 -3
  138. package/dist/api/compiler/package-json.js +11 -10
  139. package/dist/api/compiler/parallel-parse.d.ts +3 -2
  140. package/dist/api/compiler/parallel-parse.js +17 -5
  141. package/dist/api/compiler/parser.d.ts +40 -19
  142. package/dist/api/compiler/parser.js +308 -216
  143. package/dist/api/compiler/path.d.ts +9 -0
  144. package/dist/api/compiler/path.js +20 -3
  145. package/dist/api/compiler/printer/emit-context.d.ts +5 -1
  146. package/dist/api/compiler/printer/emit-context.js +20 -1
  147. package/dist/api/compiler/printer/factory-base.d.ts +2 -2
  148. package/dist/api/compiler/printer/factory-base.js +7 -3
  149. package/dist/api/compiler/printer/factory.js +3 -1
  150. package/dist/api/compiler/printer/helpers.js +10 -1
  151. package/dist/api/compiler/printer/name-generator.d.ts +1 -1
  152. package/dist/api/compiler/printer/name-generator.js +35 -16
  153. package/dist/api/compiler/printer/printer.d.ts +49 -2
  154. package/dist/api/compiler/printer/printer.js +539 -293
  155. package/dist/api/compiler/printer/utilities.js +149 -147
  156. package/dist/api/compiler/program-checker.d.ts +12 -2
  157. package/dist/api/compiler/program-checker.js +88 -34
  158. package/dist/api/compiler/program-utilities.d.ts +3 -1
  159. package/dist/api/compiler/program-utilities.js +28 -15
  160. package/dist/api/compiler/program.d.ts +4 -6
  161. package/dist/api/compiler/program.js +74 -87
  162. package/dist/api/compiler/pseudo-bigint.d.ts +2 -0
  163. package/dist/api/compiler/pseudo-bigint.js +18 -0
  164. package/dist/api/compiler/regexp-checker.d.ts +1 -1
  165. package/dist/api/compiler/regexp-checker.js +93 -76
  166. package/dist/api/compiler/relations.d.ts +27 -4
  167. package/dist/api/compiler/relations.js +347 -180
  168. package/dist/api/compiler/reparser.js +60 -56
  169. package/dist/api/compiler/scanner.d.ts +19 -2
  170. package/dist/api/compiler/scanner.js +123 -108
  171. package/dist/api/compiler/shared-results.d.ts +463 -0
  172. package/dist/api/compiler/shared-results.js +2128 -0
  173. package/dist/api/compiler/sourcemap.js +2 -2
  174. package/dist/api/compiler/symbol-accessibility.js +87 -74
  175. package/dist/api/compiler/symbol.d.ts +23 -14
  176. package/dist/api/compiler/symbol.js +23 -11
  177. package/dist/api/compiler/syntax-kind.d.ts +198 -197
  178. package/dist/api/compiler/transformers/alias-references.js +247 -139
  179. package/dist/api/compiler/transformers/async-utilities.js +25 -25
  180. package/dist/api/compiler/transformers/async.d.ts +0 -1
  181. package/dist/api/compiler/transformers/async.js +64 -77
  182. package/dist/api/compiler/transformers/class-fields.d.ts +1 -0
  183. package/dist/api/compiler/transformers/class-fields.js +81 -78
  184. package/dist/api/compiler/transformers/commonjs-module.js +18 -15
  185. package/dist/api/compiler/transformers/const-enum-inliner.js +1 -1
  186. package/dist/api/compiler/transformers/declarations-diagnostics.js +247 -244
  187. package/dist/api/compiler/transformers/declarations-pseudo.js +100 -100
  188. package/dist/api/compiler/transformers/declarations-resolver.d.ts +0 -3
  189. package/dist/api/compiler/transformers/declarations-syntactic.d.ts +1 -2
  190. package/dist/api/compiler/transformers/declarations-syntactic.js +134 -156
  191. package/dist/api/compiler/transformers/declarations-tracker.js +18 -18
  192. package/dist/api/compiler/transformers/declarations.d.ts +4 -1
  193. package/dist/api/compiler/transformers/declarations.js +305 -238
  194. package/dist/api/compiler/transformers/decorator-metadata.d.ts +1 -1
  195. package/dist/api/compiler/transformers/decorator-metadata.js +53 -45
  196. package/dist/api/compiler/transformers/decorator-utilities.js +24 -24
  197. package/dist/api/compiler/transformers/destructuring.js +19 -18
  198. package/dist/api/compiler/transformers/emit-resolver.js +1 -1
  199. package/dist/api/compiler/transformers/es-decorators.js +55 -55
  200. package/dist/api/compiler/transformers/external-module-info.js +3 -3
  201. package/dist/api/compiler/transformers/for-await.js +25 -25
  202. package/dist/api/compiler/transformers/import-elision.js +14 -14
  203. package/dist/api/compiler/transformers/jsx.js +12 -12
  204. package/dist/api/compiler/transformers/legacy-decorators.js +17 -17
  205. package/dist/api/compiler/transformers/module.js +8 -8
  206. package/dist/api/compiler/transformers/named-evaluation.js +4 -4
  207. package/dist/api/compiler/transformers/object-rest-spread.js +20 -20
  208. package/dist/api/compiler/transformers/optional-chain.js +10 -10
  209. package/dist/api/compiler/transformers/reference-resolver.d.ts +12 -1
  210. package/dist/api/compiler/transformers/reference-resolver.js +131 -69
  211. package/dist/api/compiler/transformers/runtime-syntax.js +35 -31
  212. package/dist/api/compiler/transformers/subtree-facts.js +47 -47
  213. package/dist/api/compiler/transformers/syntax-facts.js +56 -58
  214. package/dist/api/compiler/transformers/type-eraser.js +73 -66
  215. package/dist/api/compiler/transformers/type-serialization.js +24 -24
  216. package/dist/api/compiler/transformers/using.js +12 -12
  217. package/dist/api/compiler/transformers/utilities.js +77 -77
  218. package/dist/api/compiler/transformers/visitor-base.js +172 -172
  219. package/dist/api/compiler/transformers/visitor-hooks.js +6 -2
  220. package/dist/api/compiler/tsconfig.d.ts +10 -2
  221. package/dist/api/compiler/tsconfig.js +136 -48
  222. package/dist/api/compiler/type-printer.js +40 -3
  223. package/dist/api/compiler/types.d.ts +2 -1
  224. package/dist/api/library/ast.generated.d.ts +42 -39
  225. package/dist/api/library/ast.generated.js +1 -1
  226. package/dist/api/library/compiler-options.generated.d.ts +111 -100
  227. package/dist/api/library/compiler-options.generated.js +1 -1
  228. package/dist/api/library/disk.js +12 -1
  229. package/dist/api/library/enums.generated.d.ts +206 -206
  230. package/dist/api/library/enums.generated.js +206 -206
  231. package/dist/api/library/nodes.js +26 -26
  232. package/package.json +9 -9
  233. package/src/compiler/ast-utilities.ts +99 -7
  234. package/src/compiler/ast.ts +58 -26
  235. package/src/compiler/binder.ts +39 -4
  236. package/src/compiler/character-codes.ts +2 -2
  237. package/src/compiler/checker-calls.ts +79 -9
  238. package/src/compiler/checker-classes.ts +78 -24
  239. package/src/compiler/checker-contextual.ts +6 -1
  240. package/src/compiler/checker-declarations.ts +31 -4
  241. package/src/compiler/checker-declared-types.ts +8 -5
  242. package/src/compiler/checker-decorators.ts +1 -1
  243. package/src/compiler/checker-deprecation.ts +29 -8
  244. package/src/compiler/checker-destructuring.ts +10 -3
  245. package/src/compiler/checker-emit-helpers.ts +1 -0
  246. package/src/compiler/checker-emit-resolver.ts +16 -6
  247. package/src/compiler/checker-expressions.ts +79 -46
  248. package/src/compiler/checker-functions.ts +21 -6
  249. package/src/compiler/checker-generated-code.ts +2 -22
  250. package/src/compiler/checker-grammar.ts +136 -62
  251. package/src/compiler/checker-heritage.ts +22 -21
  252. package/src/compiler/checker-inference.ts +514 -82
  253. package/src/compiler/checker-iteration.ts +18 -31
  254. package/src/compiler/checker-javascript.ts +1 -1
  255. package/src/compiler/checker-jsdoc.ts +50 -27
  256. package/src/compiler/checker-jsx.ts +26 -4
  257. package/src/compiler/checker-members.ts +200 -56
  258. package/src/compiler/checker-modules.ts +332 -65
  259. package/src/compiler/checker-narrowing.ts +98 -19
  260. package/src/compiler/checker-object-literals.ts +3 -0
  261. package/src/compiler/checker-operators.ts +11 -4
  262. package/src/compiler/checker-property-access.ts +7 -2
  263. package/src/compiler/checker-services.ts +39 -12
  264. package/src/compiler/checker-signatures.ts +15 -1
  265. package/src/compiler/checker-source-file.ts +39 -13
  266. package/src/compiler/checker-statements.ts +3 -2
  267. package/src/compiler/checker-symbol-types.ts +29 -6
  268. package/src/compiler/checker-symbols.ts +158 -15
  269. package/src/compiler/checker-type-factory.ts +124 -23
  270. package/src/compiler/checker-type-nodes.ts +46 -3
  271. package/src/compiler/checker-type-operators.ts +83 -26
  272. package/src/compiler/checker-types.ts +147 -4
  273. package/src/compiler/checker-unused.ts +9 -14
  274. package/src/compiler/checker.ts +203 -39
  275. package/src/compiler/command-line.ts +28 -28
  276. package/src/compiler/compile-program.ts +167 -27
  277. package/src/compiler/decoder.ts +13 -4
  278. package/src/compiler/diagnostic-messages.ts +1973 -1892
  279. package/src/compiler/diagnostics.ts +84 -3
  280. package/src/compiler/emitter.ts +57 -8
  281. package/src/compiler/encoder.ts +23 -8
  282. package/src/compiler/file-include.ts +9 -3
  283. package/src/compiler/file-loader.ts +197 -38
  284. package/src/compiler/help.ts +10 -14
  285. package/src/compiler/incremental.ts +165 -30
  286. package/src/compiler/init.ts +2 -7
  287. package/src/compiler/instantiation.ts +77 -22
  288. package/src/compiler/jsdoc.ts +3 -1
  289. package/src/compiler/link-tables.ts +82 -37
  290. package/src/compiler/locales/cs-CZ.ts +1 -1
  291. package/src/compiler/locales/de-DE.ts +1 -1
  292. package/src/compiler/locales/es-ES.ts +1 -1
  293. package/src/compiler/locales/fr-FR.ts +1 -1
  294. package/src/compiler/locales/it-IT.ts +1 -1
  295. package/src/compiler/locales/ja-JP.ts +1 -1
  296. package/src/compiler/locales/ko-KR.ts +1 -1
  297. package/src/compiler/locales/pl-PL.ts +1 -1
  298. package/src/compiler/locales/pt-BR.ts +1 -1
  299. package/src/compiler/locales/ru-RU.ts +1 -1
  300. package/src/compiler/locales/tr-TR.ts +1 -1
  301. package/src/compiler/locales/zh-CN.ts +1 -1
  302. package/src/compiler/locales/zh-TW.ts +1 -1
  303. package/src/compiler/module-resolution.ts +44 -8
  304. package/src/compiler/module-specifiers.ts +62 -20
  305. package/src/compiler/name-resolver.ts +9 -1
  306. package/src/compiler/node-builder-names.ts +236 -54
  307. package/src/compiler/node-builder-pseudo.ts +4 -7
  308. package/src/compiler/node-builder-reuse.ts +5 -4
  309. package/src/compiler/node-builder.ts +130 -31
  310. package/src/compiler/option-declarations.ts +33 -103
  311. package/src/compiler/options.ts +23 -62
  312. package/src/compiler/output-paths.ts +5 -18
  313. package/src/compiler/package-entrypoints.ts +345 -0
  314. package/src/compiler/package-json.ts +4 -4
  315. package/src/compiler/parallel-check.ts +326 -52
  316. package/src/compiler/parallel-emit.ts +320 -0
  317. package/src/compiler/parallel-parse.ts +16 -5
  318. package/src/compiler/parse-thread.ts +3 -0
  319. package/src/compiler/parser.ts +156 -39
  320. package/src/compiler/path.ts +22 -2
  321. package/src/compiler/printer/emit-context.ts +21 -0
  322. package/src/compiler/printer/factory-base.ts +10 -3
  323. package/src/compiler/printer/factory.ts +4 -1
  324. package/src/compiler/printer/helpers.ts +10 -1
  325. package/src/compiler/printer/name-generator.ts +24 -2
  326. package/src/compiler/printer/printer.ts +266 -30
  327. package/src/compiler/printer/utilities.ts +8 -2
  328. package/src/compiler/program-checker.ts +57 -5
  329. package/src/compiler/program-utilities.ts +23 -10
  330. package/src/compiler/program.ts +18 -26
  331. package/src/compiler/pseudo-bigint.ts +17 -0
  332. package/src/compiler/regexp-checker.ts +63 -30
  333. package/src/compiler/relations.ts +240 -77
  334. package/src/compiler/reparser.ts +7 -2
  335. package/src/compiler/scanner.ts +109 -79
  336. package/src/compiler/shared-results.ts +2414 -0
  337. package/src/compiler/show-config.ts +18 -1
  338. package/src/compiler/sourcemap.ts +2 -2
  339. package/src/compiler/symbol-accessibility.ts +26 -3
  340. package/src/compiler/symbol.ts +46 -24
  341. package/src/compiler/syntax-kind.ts +188 -187
  342. package/src/compiler/thread-entry.ts +64 -4
  343. package/src/compiler/transformers/alias-references.ts +123 -4
  344. package/src/compiler/transformers/async.ts +2 -17
  345. package/src/compiler/transformers/class-fields.ts +13 -12
  346. package/src/compiler/transformers/commonjs-module.ts +11 -7
  347. package/src/compiler/transformers/declarations-diagnostics.ts +5 -3
  348. package/src/compiler/transformers/declarations-pseudo.ts +2 -4
  349. package/src/compiler/transformers/declarations-resolver.ts +0 -3
  350. package/src/compiler/transformers/declarations-syntactic.ts +1 -21
  351. package/src/compiler/transformers/declarations.ts +134 -48
  352. package/src/compiler/transformers/decorator-metadata.ts +9 -1
  353. package/src/compiler/transformers/destructuring.ts +4 -3
  354. package/src/compiler/transformers/external-module-info.ts +1 -1
  355. package/src/compiler/transformers/jsx.ts +2 -1
  356. package/src/compiler/transformers/reference-resolver.ts +83 -19
  357. package/src/compiler/transformers/runtime-syntax.ts +6 -1
  358. package/src/compiler/transformers/syntax-facts.ts +2 -7
  359. package/src/compiler/transformers/type-eraser.ts +10 -1
  360. package/src/compiler/transformers/type-serialization.ts +3 -2
  361. package/src/compiler/transformers/visitor-base.ts +2 -1
  362. package/src/compiler/transformers/visitor-hooks.ts +9 -4
  363. package/src/compiler/tsc-build.ts +66 -9
  364. package/src/compiler/tsc-cli.ts +7 -0
  365. package/src/compiler/tsc-compile.ts +284 -4
  366. package/src/compiler/tsc-watch.ts +74 -45
  367. package/src/compiler/tsconfig.ts +176 -19
  368. package/src/compiler/type-printer.ts +36 -2
  369. package/src/compiler/types.ts +2 -1
  370. package/src/library/ast.generated.ts +57 -41
  371. package/src/library/compiler-options.generated.ts +117 -103
  372. package/src/library/disk.ts +10 -1
  373. package/src/library/enums.generated.ts +196 -196
@@ -17,7 +17,9 @@ import {
17
17
  type InterfaceType,
18
18
  type IntersectionType,
19
19
  type MappedType,
20
+ DeclaredMemberPlan,
20
21
  MemberNames,
22
+ NamedMemberOrder,
21
23
  ObjectFlags,
22
24
  type ObjectType,
23
25
  type Signature,
@@ -44,6 +46,7 @@ import {
44
46
  prependTypeMapping,
45
47
  LiteralType,
46
48
  PendingMembers,
49
+ getMappedType,
47
50
  } from './checker-types.js';
48
51
  import {
49
52
  UnionReduction,
@@ -79,6 +82,7 @@ import {
79
82
  getLateBoundSymbol,
80
83
  getMembersOfSymbol,
81
84
  getMergedSymbol,
85
+ getNamedMemberPositions,
82
86
  getNamedMembers,
83
87
  getSymbolOfDeclaration,
84
88
  isReservedMemberName,
@@ -104,6 +108,8 @@ import {
104
108
  instantiateSignatures,
105
109
  instantiateSymbol,
106
110
  instantiateType,
111
+ isThisless,
112
+ keepsSymbolTypeUnderInstantiation,
107
113
  keepsSymbolUnderInstantiation,
108
114
  newInstantiatedSymbol,
109
115
  instantiateTypes,
@@ -191,7 +197,7 @@ export function membersHolder(c: Checker, t: Type): StructuredType {
191
197
  return side as StructuredType;
192
198
  }
193
199
 
194
- /** The `objectFlags` of `t` that resolving its members sets (MembersResolved, UnresolvedMembers). */
200
+ /** The `objectFlags` of `t` that resolving its members sets (MembersResolved). */
195
201
  export function memberResolutionFlags(c: Checker, t: Type): ObjectFlags {
196
202
  if ((t.flags & TypeFlags.UnionOrIntersection) === 0) return lazyObjectFlags(c, t);
197
203
  const side = sideOfIfAny(c, t) as UnionOrIntersectionType | undefined;
@@ -287,8 +293,7 @@ function resolveObjectTypeMembers(
287
293
  }
288
294
  if (baseTypes.length !== 0) {
289
295
  members = !instantiated || members === undefined ? new Map(members ?? []) : members;
290
- setStructuredTypeMembers(c, t, members, callSignatures, constructSignatures, indexInfos);
291
- t.objectFlags |= ObjectFlags.UnresolvedMembers;
296
+ // The members are set once the bases are added: a recursive request for them resolves them again.
292
297
  for (const baseType of baseTypes) {
293
298
  const instantiatedBaseType =
294
299
  lastArgument !== undefined
@@ -307,7 +312,6 @@ function resolveObjectTypeMembers(
307
312
  for (const info of inherited) if (findIndexInfo(indexInfos, info.keyType) === undefined) added.push(info);
308
313
  if (added.length !== 0) indexInfos = indexInfos.concat(added);
309
314
  }
310
- t.objectFlags &= ~ObjectFlags.UnresolvedMembers;
311
315
  }
312
316
  setStructuredTypeMembers(c, t, members, callSignatures, constructSignatures, indexInfos);
313
317
  }
@@ -345,6 +349,8 @@ export class PendingInstantiatedMembers extends PendingMembers {
345
349
  readonly sourceTable: SymbolTable | undefined;
346
350
  /** Anonymous type instantiations: the properties of the target, in order. */
347
351
  readonly sourceList: Symbol[] | undefined;
352
+ /** The source's members at their positions: `sourceList`, or the declared members in table order. */
353
+ readonly sourceMembers: Symbol[];
348
354
  readonly mapper: TypeMapper;
349
355
  /** MemberState of each member of the source, in order, 16 to a word. */
350
356
  readonly states: number[];
@@ -377,6 +383,7 @@ export class PendingInstantiatedMembers extends PendingMembers {
377
383
  c: Checker,
378
384
  sourceTable: SymbolTable | undefined,
379
385
  sourceList: Symbol[] | undefined,
386
+ sourceMembers: Symbol[],
380
387
  mapper: TypeMapper,
381
388
  states: number[],
382
389
  positions: Map<string, number>,
@@ -384,6 +391,7 @@ export class PendingInstantiatedMembers extends PendingMembers {
384
391
  hasRequiredOwnMembers: boolean,
385
392
  ) {
386
393
  super();
394
+ this.sourceMembers = sourceMembers;
387
395
  this.hasOwnMembers = hasOwnMembers;
388
396
  this.hasRequiredOwnMembers = hasRequiredOwnMembers;
389
397
  this.c = c;
@@ -512,6 +520,21 @@ export class PendingInstantiatedMembers extends PendingMembers {
512
520
  materialize(t: StructuredType): void {
513
521
  const c = this.c;
514
522
  t.pendingMembers = undefined;
523
+ if (!this.hasBases) {
524
+ // The properties are the source's named members, in the order cached for the source
525
+ // (`NamedMemberOrder`), and they are all of the table, which is built only when asked for.
526
+ const order = this.namedMemberOrder(t.symbol);
527
+ if (order !== undefined) {
528
+ const sourceMembers = this.sourceMembers;
529
+ const properties: Symbol[] = [];
530
+ for (const position of order.positions) properties.push(this.memberAt(position, sourceMembers[position]!));
531
+ this.instantiated = undefined;
532
+ t.membersValue = undefined;
533
+ t.propertiesValue = properties;
534
+ t.pendingMembers = new PropertyMembers(properties, order.names);
535
+ return;
536
+ }
537
+ }
515
538
  const members = this.ownTable();
516
539
  this.instantiated = undefined;
517
540
  if (!this.hasBases) {
@@ -557,6 +580,52 @@ export class PendingInstantiatedMembers extends PendingMembers {
557
580
  const pending = t.pendingMembers;
558
581
  if (pending !== undefined) pending.materializeTable(t);
559
582
  }
583
+
584
+ /**
585
+ * The property order of the source's instantiations for `container` (computed for the first container
586
+ * asked for), or undefined.
587
+ */
588
+ private namedMemberOrder(container: Symbol | undefined): NamedMemberOrder | undefined {
589
+ const c = this.c;
590
+ const owner = this.owner;
591
+ let order = owner !== undefined ? owner.namedMemberOrder : c.namedMemberOrdersOfLists.get(this.sourceList!);
592
+ if (order === undefined) {
593
+ order = namedMemberOrderOf(c, this.sourceMembers, container, owner !== undefined);
594
+ if (owner !== undefined) owner.namedMemberOrder = order;
595
+ else c.namedMemberOrdersOfLists.set(this.sourceList!, order);
596
+ }
597
+ return order !== null && order.container === container ? order : undefined;
598
+ }
599
+ }
600
+
601
+ /**
602
+ * The `NamedMemberOrder` of instantiations of `members` for `container`; null where `getNamedMemberPositions`
603
+ * has none. With `skipsUnnamed` (declared members), an instantiation's table holds the named members, the
604
+ * others being skipped, in the order of `members`; without it, every member must be named.
605
+ */
606
+ function namedMemberOrderOf(
607
+ c: Checker,
608
+ members: Symbol[],
609
+ container: Symbol | undefined,
610
+ skipsUnnamed: boolean,
611
+ ): NamedMemberOrder | null {
612
+ const positions = getNamedMemberPositions(c, members, container);
613
+ // Members of a list are never skipped (`pendingInstantiatedList`): its table holds them all.
614
+ if (positions === undefined || (!skipsUnnamed && positions.length !== members.length)) return null;
615
+ const names: string[] = [];
616
+ const byName = new Map<string, number>();
617
+ // The index in `positions` of each member's position, or -1 for a member that isn't a property.
618
+ const indexes: number[] = [];
619
+ for (let i = 0; i < members.length; i++) indexes.push(-1);
620
+ for (let i = 0; i < positions.length; i++) {
621
+ const name = members[positions[i]!]!.name;
622
+ names.push(name);
623
+ byName.set(name, i);
624
+ indexes[positions[i]!] = i;
625
+ }
626
+ const tableOrder: number[] = [];
627
+ for (const index of indexes) if (index >= 0) tableOrder.push(index);
628
+ return new NamedMemberOrder(container, positions, new MemberNames(names, byName, tableOrder));
560
629
  }
561
630
 
562
631
  /**
@@ -658,45 +727,84 @@ function pendingInstantiatedTable(
658
727
  const declared = sideOf(c, source);
659
728
  const table = declared.declaredMembers;
660
729
  if (table === undefined || table.size === 0) return undefined;
730
+ const plan = declaredMemberPlan(c, declared, table);
731
+ if (plan.eager) return undefined;
732
+ const members = plan.members;
733
+ const named = plan.named;
734
+ const keptByType = plan.keptByType;
661
735
  const states: number[] = [];
662
736
  let word = 0;
663
- let i = 0;
664
- let hasOwnMembers = false;
665
- let hasRequiredOwnMembers = false;
666
- for (const [id, symbol] of table) {
667
- if (id !== symbol.name) return undefined;
737
+ const count = members.length;
738
+ for (let i = 0; i < count; i++) {
668
739
  let state = MemberState.Skipped;
669
- if (isNamedMember(c, symbol, id)) {
670
- // A named member without a value flag (an alias) could be replaced by an inherited one; keep
671
- // such tables eager, so that an own member always stands.
672
- if ((symbol.flags & SymbolFlags.Value) === 0) return undefined;
673
- state = keepsSymbolUnderInstantiation(c, symbol, mapper) ? MemberState.Kept : MemberState.Instantiated;
674
- // Instantiated symbols have the flags of their source.
675
- hasOwnMembers = true;
676
- if ((symbol.flags & SymbolFlags.Optional) === 0) hasRequiredOwnMembers = true;
740
+ if (named[i] !== 0) {
741
+ const bit = 1 << (i & 31);
742
+ if ((keptByType[i >> 5]! & bit) !== 0) state = MemberState.Kept;
743
+ else if (mapper.mapsThisOnly() && isThisless(members[i]!)) {
744
+ getSymbolId(members[i]!);
745
+ state = MemberState.Kept;
746
+ } else if (keepsSymbolTypeUnderInstantiation(c, members[i]!)) {
747
+ keptByType[i >> 5] = keptByType[i >> 5]! | bit;
748
+ state = MemberState.Kept;
749
+ } else state = MemberState.Instantiated;
677
750
  }
678
751
  word |= state << ((i & 15) * 2);
679
752
  if ((i & 15) === 15) {
680
753
  states.push(word);
681
754
  word = 0;
682
755
  }
683
- i++;
684
756
  }
685
- if ((i & 15) !== 0) states.push(word);
757
+ if ((count & 15) !== 0) states.push(word);
686
758
  const pending = new PendingInstantiatedMembers(
687
759
  c,
688
760
  table,
689
761
  undefined,
762
+ members,
690
763
  mapper,
691
764
  sharedStates(declared, states),
692
765
  declaredMemberPositions(declared, table),
693
- hasOwnMembers,
694
- hasRequiredOwnMembers,
766
+ plan.hasOwnMembers,
767
+ plan.hasRequiredOwnMembers,
695
768
  );
696
769
  pending.owner = declared;
697
770
  return pending;
698
771
  }
699
772
 
773
+ /** What the pending instantiations of `table`, the declared members of `declared`, share. */
774
+ function declaredMemberPlan(c: Checker, declared: InterfaceType, table: SymbolTable): DeclaredMemberPlan {
775
+ const known = declared.declaredMemberPlan;
776
+ if (known !== undefined && known.table === table) return known;
777
+ const members: Symbol[] = [];
778
+ const named: number[] = [];
779
+ let hasOwnMembers = false;
780
+ let hasRequiredOwnMembers = false;
781
+ let eager = false;
782
+ for (const [id, symbol] of table) {
783
+ if (id !== symbol.name) {
784
+ eager = true;
785
+ break;
786
+ }
787
+ members.push(symbol);
788
+ if (!isNamedMember(c, symbol, id)) {
789
+ named.push(0);
790
+ continue;
791
+ }
792
+ // A named member without a value flag (an alias) could be replaced by an inherited one; keep
793
+ // such tables eager, so that an own member always stands.
794
+ if ((symbol.flags & SymbolFlags.Value) === 0) {
795
+ eager = true;
796
+ break;
797
+ }
798
+ named.push(1);
799
+ // Instantiated symbols have the flags of their source.
800
+ hasOwnMembers = true;
801
+ if ((symbol.flags & SymbolFlags.Optional) === 0) hasRequiredOwnMembers = true;
802
+ }
803
+ const plan = new DeclaredMemberPlan(table, eager, members, named, hasOwnMembers, hasRequiredOwnMembers);
804
+ declared.declaredMemberPlan = plan;
805
+ return plan;
806
+ }
807
+
700
808
  /**
701
809
  * `states`, or the equal list the last instantiation of `source` used: most instantiations of a
702
810
  * source keep and instantiate the same members, and the lists are never changed.
@@ -731,6 +839,7 @@ function pendingInstantiatedList(c: Checker, list: Symbol[], mapper: TypeMapper)
731
839
  c,
732
840
  undefined,
733
841
  list,
842
+ list,
734
843
  mapper,
735
844
  states,
736
845
  listPositions(c, list),
@@ -845,11 +954,13 @@ function resolvePendingObjectTypeMembers(
845
954
  constructSignatures: Signature[],
846
955
  indexInfos: IndexInfo[],
847
956
  ): void {
848
- setPendingStructuredTypeMembers(c, t, pending, callSignatures, constructSignatures, indexInfos);
849
- if (baseTypes.length === 0) return;
957
+ if (baseTypes.length === 0) {
958
+ setPendingStructuredTypeMembers(c, t, pending, callSignatures, constructSignatures, indexInfos);
959
+ return;
960
+ }
961
+ // The members are set once the bases are added: a recursive request for them resolves them again.
850
962
  pending.hasBases = true;
851
963
  pending.resolving = true;
852
- t.objectFlags |= ObjectFlags.UnresolvedMembers;
853
964
  for (const baseType of baseTypes) {
854
965
  const instantiatedBaseType =
855
966
  thisArgument !== undefined
@@ -874,8 +985,7 @@ function resolvePendingObjectTypeMembers(
874
985
  lazyBase = resolved;
875
986
  }
876
987
  const baseProperties = lazyBase === undefined ? getPropertiesOfType(c, instantiatedBaseType) : undefined;
877
- if (t.pendingMembers === pending) pending.addBase(lazyBase, baseProperties);
878
- else addInheritedMembers(t.membersValue!, baseProperties ?? lazyBase!.properties);
988
+ pending.addBase(lazyBase, baseProperties);
879
989
  const baseCallSignatures = getSignaturesOfType(c, instantiatedBaseType, SignatureKind.Call);
880
990
  if (baseCallSignatures.length !== 0) callSignatures = callSignatures.concat(baseCallSignatures);
881
991
  const baseConstructSignatures = getSignaturesOfType(c, instantiatedBaseType, SignatureKind.Construct);
@@ -886,11 +996,8 @@ function resolvePendingObjectTypeMembers(
886
996
  for (const info of inherited) if (findIndexInfo(indexInfos, info.keyType) === undefined) added.push(info);
887
997
  if (added.length !== 0) indexInfos = indexInfos.concat(added);
888
998
  }
889
- t.objectFlags &= ~ObjectFlags.UnresolvedMembers;
890
999
  pending.resolving = false;
891
- if (t.pendingMembers === pending)
892
- setPendingStructuredTypeMembers(c, t, pending, callSignatures, constructSignatures, indexInfos);
893
- else setStructuredTypeMembers(c, t, t.membersValue, callSignatures, constructSignatures, indexInfos);
1000
+ setPendingStructuredTypeMembers(c, t, pending, callSignatures, constructSignatures, indexInfos);
894
1001
  }
895
1002
 
896
1003
  function setPendingStructuredTypeMembers(
@@ -1117,7 +1224,7 @@ function getArrayMemberCallSignatures(c: Checker, t: UnionType): Signature[] {
1117
1224
  }
1118
1225
  const arrayArg = mapType(c, t, (u) => {
1119
1226
  const generic = isReadonlyArraySymbol(c, u.symbol!.parent!) ? c.globalReadonlyArrayType : c.globalArrayType;
1120
- return (u as ObjectType).mapper!.map((generic as InterfaceType).typeParameters()[0]!);
1227
+ return getMappedType((generic as InterfaceType).typeParameters()[0]!, (u as ObjectType).mapper!);
1121
1228
  });
1122
1229
  const arrayType = createArrayTypeEx(
1123
1230
  c,
@@ -1574,7 +1681,9 @@ export function getPropertyOfTypeEx(
1574
1681
  ): Symbol | undefined {
1575
1682
  if (!isOwnReducedApparentType(t)) t = getReducedApparentTypeWorker(c, t);
1576
1683
  if ((t.flags & TypeFlags.Object) !== 0) {
1577
- const resolved = resolveStructuredTypeMembers(c, t);
1684
+ // The first test of resolveStructuredTypeMembers, here where most lookups find the members resolved.
1685
+ const resolved =
1686
+ (t.objectFlags & ObjectFlags.MembersResolved) !== 0 ? (t as StructuredType) : resolveStructuredTypeMembers(c, t);
1578
1687
  const symbol = getResolvedMember(resolved, name);
1579
1688
  if (symbol !== undefined && includeTypeOnlyMembers) return symbol;
1580
1689
  if (symbol !== undefined) {
@@ -1846,6 +1955,18 @@ export function getUnionOrIntersectionProperty(
1846
1955
  }
1847
1956
 
1848
1957
  export function getDeclarationModifierFlagsFromSymbol(c: Checker, s: Symbol, isWrite: boolean): ModifierFlags {
1958
+ const checkFlags = s.checkFlags;
1959
+ if ((checkFlags & CheckFlags.Synthetic) !== 0) {
1960
+ // The least restricted access of the constituents, for reading or for writing.
1961
+ let access = ModifierFlags.None;
1962
+ if ((checkFlags & (isWrite ? CheckFlags.ContainsWritePublic : CheckFlags.ContainsPublic)) !== 0)
1963
+ access = ModifierFlags.Public;
1964
+ else if ((checkFlags & (isWrite ? CheckFlags.ContainsWriteProtected : CheckFlags.ContainsProtected)) !== 0)
1965
+ access = ModifierFlags.Protected;
1966
+ else if ((checkFlags & (isWrite ? CheckFlags.ContainsWritePrivate : CheckFlags.ContainsPrivate)) !== 0)
1967
+ access = ModifierFlags.Private;
1968
+ return (checkFlags & CheckFlags.ContainsStatic) !== 0 ? access | ModifierFlags.Static : access;
1969
+ }
1849
1970
  if (s.valueDeclaration !== undefined) {
1850
1971
  let declaration: Node | undefined;
1851
1972
  if (isWrite) declaration = getDeclarationOfKind(s, SyntaxKind.SetAccessor);
@@ -1857,16 +1978,6 @@ export function getDeclarationModifierFlagsFromSymbol(c: Checker, s: Symbol, isW
1857
1978
  ? flags
1858
1979
  : flags & ~ModifierFlags.AccessibilityModifier;
1859
1980
  }
1860
- if ((s.checkFlags & CheckFlags.Synthetic) !== 0) {
1861
- const access =
1862
- (s.checkFlags & CheckFlags.ContainsPrivate) !== 0
1863
- ? ModifierFlags.Private
1864
- : (s.checkFlags & CheckFlags.ContainsPublic) !== 0
1865
- ? ModifierFlags.Public
1866
- : ModifierFlags.Protected;
1867
- const staticModifier = (s.checkFlags & CheckFlags.ContainsStatic) !== 0 ? ModifierFlags.Static : 0;
1868
- return access | staticModifier;
1869
- }
1870
1981
  if ((s.flags & SymbolFlags.Prototype) !== 0) return ModifierFlags.Public | ModifierFlags.Static;
1871
1982
  return 0;
1872
1983
  }
@@ -1893,6 +2004,7 @@ export function createUnionOrIntersectionProperty(
1893
2004
  const prop = getPropertyOfTypeEx(c, t, name, skipObjectFunctionPropertyAugment, false);
1894
2005
  if (prop !== undefined) {
1895
2006
  const modifiers = getDeclarationModifierFlagsFromSymbol(c, prop, false);
2007
+ const writeModifiers = getDeclarationModifierFlagsFromSymbol(c, prop, true);
1896
2008
  if ((prop.flags & SymbolFlags.ClassMember) !== 0) {
1897
2009
  if (isUnion) optionalFlag |= prop.flags & SymbolFlags.Optional;
1898
2010
  else optionalFlag &= prop.flags;
@@ -1920,9 +2032,16 @@ export function createUnionOrIntersectionProperty(
1920
2032
  }
1921
2033
  if (isUnion && isReadonlySymbol(c, prop)) checkFlags |= CheckFlags.Readonly;
1922
2034
  else if (!isUnion && !isReadonlySymbol(c, prop)) checkFlags &= ~CheckFlags.Readonly;
1923
- if ((modifiers & ModifierFlags.NonPublicAccessibilityModifier) === 0) checkFlags |= CheckFlags.ContainsPublic;
1924
- if ((modifiers & ModifierFlags.Protected) !== 0) checkFlags |= CheckFlags.ContainsProtected;
1925
- if ((modifiers & ModifierFlags.Private) !== 0) checkFlags |= CheckFlags.ContainsPrivate;
2035
+ if ((modifiers & (ModifierFlags.Protected | ModifierFlags.Public)) === ModifierFlags.Protected)
2036
+ checkFlags |= CheckFlags.ContainsProtected;
2037
+ else if ((modifiers & (ModifierFlags.Private | ModifierFlags.Public)) === ModifierFlags.Private)
2038
+ checkFlags |= CheckFlags.ContainsPrivate;
2039
+ else checkFlags |= CheckFlags.ContainsPublic;
2040
+ if ((writeModifiers & (ModifierFlags.Protected | ModifierFlags.Public)) === ModifierFlags.Protected)
2041
+ checkFlags |= CheckFlags.ContainsWriteProtected;
2042
+ else if ((writeModifiers & (ModifierFlags.Private | ModifierFlags.Public)) === ModifierFlags.Private)
2043
+ checkFlags |= CheckFlags.ContainsWritePrivate;
2044
+ else checkFlags |= CheckFlags.ContainsWritePublic;
1926
2045
  if ((modifiers & ModifierFlags.Static) !== 0) checkFlags |= CheckFlags.ContainsStatic;
1927
2046
  if (!isPrototypeProperty(prop)) syntheticFlag = CheckFlags.SyntheticProperty;
1928
2047
  } else if (isUnion) {
@@ -1937,15 +2056,26 @@ export function createUnionOrIntersectionProperty(
1937
2056
  } else checkFlags |= CheckFlags.ReadPartial;
1938
2057
  }
1939
2058
  }
2059
+ if (singleProp === undefined) return undefined;
1940
2060
  if (
1941
- singleProp === undefined ||
1942
- (isUnion &&
1943
- (propSet !== undefined || (checkFlags & CheckFlags.Partial) !== 0) &&
1944
- (checkFlags & (CheckFlags.ContainsPrivate | CheckFlags.ContainsProtected)) !== 0 &&
1945
- !(propSet !== undefined && hasCommonDeclaration(propSet)))
1946
- )
1947
- // Missing, or private/protected in one constituent but missing or different in another.
1948
- return undefined;
2061
+ isUnion &&
2062
+ (propSet !== undefined || (checkFlags & CheckFlags.Partial) !== 0) &&
2063
+ (checkFlags &
2064
+ (CheckFlags.ContainsPrivate |
2065
+ CheckFlags.ContainsProtected |
2066
+ CheckFlags.ContainsWritePrivate |
2067
+ CheckFlags.ContainsWriteProtected)) !==
2068
+ 0 &&
2069
+ !(propSet !== undefined && hasCommonDeclaration(propSet))
2070
+ ) {
2071
+ // The property is private or protected in one constituent but missing or different in another.
2072
+ // Private or protected reading leaves no property; private or protected writing restricts write
2073
+ // access to that of the most restricted constituent.
2074
+ if ((checkFlags & (CheckFlags.ContainsPrivate | CheckFlags.ContainsProtected)) !== 0) return undefined;
2075
+ if ((checkFlags & CheckFlags.ContainsWritePrivate) !== 0)
2076
+ checkFlags &= ~(CheckFlags.ContainsWritePublic | CheckFlags.ContainsWriteProtected);
2077
+ else if ((checkFlags & CheckFlags.ContainsWriteProtected) !== 0) checkFlags &= ~CheckFlags.ContainsWritePublic;
2078
+ }
1949
2079
  if (propSet === undefined && (checkFlags & CheckFlags.ReadPartial) === 0 && indexTypes.length === 0) {
1950
2080
  if (!mergedInstantiations) return singleProp;
1951
2081
  // Merged instantiations get a clone without a union parent, so `Array<T>.length` prints as such.
@@ -1976,7 +2106,7 @@ export function createUnionOrIntersectionProperty(
1976
2106
  if (firstValueDeclaration === undefined) firstValueDeclaration = prop.valueDeclaration;
1977
2107
  else if (prop.valueDeclaration !== undefined && prop.valueDeclaration !== firstValueDeclaration)
1978
2108
  hasNonUniformValueDeclaration = true;
1979
- for (const d of getDeclarations(prop)) declarations.push(d);
2109
+ for (const d of getDeclarations(prop)) if (!declarations.includes(d)) declarations.push(d);
1980
2110
  const t = getTypeOfSymbol(c, prop);
1981
2111
  if (firstType === undefined) {
1982
2112
  firstType = t;
@@ -2305,13 +2435,27 @@ export function getReducedType(c: Checker, t: Type): Type {
2305
2435
  const side = sideOf(c, t);
2306
2436
  if ((side.objectFlags & ObjectFlags.IsNeverIntersectionComputed) === 0) {
2307
2437
  side.objectFlags |= ObjectFlags.IsNeverIntersectionComputed;
2308
- if (hasNeverReducedProperty(c, t as IntersectionType)) side.objectFlags |= ObjectFlags.IsNeverIntersection;
2438
+ if (!isMappingOfSameObjectType(c, typesOf(t)) && hasNeverReducedProperty(c, t as IntersectionType))
2439
+ side.objectFlags |= ObjectFlags.IsNeverIntersection;
2309
2440
  }
2310
2441
  if ((side.objectFlags & ObjectFlags.IsNeverIntersection) !== 0) return c.neverType;
2311
2442
  }
2312
2443
  return t;
2313
2444
  }
2314
2445
 
2446
+ /** Whether `types` are mapped types that all map the same object type. */
2447
+ function isMappingOfSameObjectType(c: Checker, types: readonly Type[]): boolean {
2448
+ if (types.length === 0 || (types[0]!.objectFlags & ObjectFlags.Mapped) === 0) return false;
2449
+ const first = getModifiersTypeFromMappedType(c, types[0] as MappedType);
2450
+ if ((first.flags & TypeFlags.Object) === 0) return false;
2451
+ for (let i = 1; i < types.length; i++) {
2452
+ const t = types[i]!;
2453
+ if ((t.objectFlags & ObjectFlags.Mapped) === 0 || getModifiersTypeFromMappedType(c, t as MappedType) !== first)
2454
+ return false;
2455
+ }
2456
+ return true;
2457
+ }
2458
+
2315
2459
  /**
2316
2460
  * Whether a property of the intersection `t` reduces it to never, without resolving all of its
2317
2461
  * properties. Such a property is one that createUnionOrIntersectionProperty combines from different
@@ -2492,7 +2636,7 @@ export function getResolvedBaseConstraint(c: Checker, t: Type, stack?: Recursion
2492
2636
  if (!pushTypeResolution(c, t, TypeSystemPropertyName.ResolvedBaseConstraint)) return c.circularConstraintType;
2493
2637
  let constraint: Type | undefined;
2494
2638
  // At least 10 levels; up to 50 without deeply nested types on the stack.
2495
- const identity = getRecursionIdentity(t);
2639
+ const identity = getRecursionIdentity(c, t);
2496
2640
  const current = stack ?? [];
2497
2641
  if (current.length < 10 || (current.length < 50 && !current.includes(identity)))
2498
2642
  constraint = computeBaseConstraint(c, getSimplifiedType(c, t, false), current.concat([identity]));