tsc-ts 0.0.3 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (596) hide show
  1. package/README.md +46 -0
  2. package/dist/api/compiler/ast-utilities.d.ts +82 -0
  3. package/dist/api/compiler/ast-utilities.js +462 -0
  4. package/dist/api/compiler/ast.d.ts +2350 -0
  5. package/dist/api/compiler/ast.js +11206 -0
  6. package/dist/api/compiler/astnav.d.ts +37 -0
  7. package/dist/api/compiler/astnav.js +767 -0
  8. package/dist/api/compiler/binder-utilities.d.ts +182 -0
  9. package/dist/api/compiler/binder-utilities.js +1240 -0
  10. package/dist/api/compiler/binder.d.ts +33 -0
  11. package/dist/api/compiler/binder.js +2358 -0
  12. package/dist/api/compiler/character-codes.d.ts +161 -0
  13. package/dist/api/compiler/character-codes.js +160 -0
  14. package/dist/api/compiler/checker-calls.d.ts +46 -0
  15. package/dist/api/compiler/checker-calls.js +1640 -0
  16. package/dist/api/compiler/checker-classes.d.ts +30 -0
  17. package/dist/api/compiler/checker-classes.js +582 -0
  18. package/dist/api/compiler/checker-contextual.d.ts +77 -0
  19. package/dist/api/compiler/checker-contextual.js +1136 -0
  20. package/dist/api/compiler/checker-declaration-order.d.ts +12 -0
  21. package/dist/api/compiler/checker-declaration-order.js +356 -0
  22. package/dist/api/compiler/checker-declarations.d.ts +33 -0
  23. package/dist/api/compiler/checker-declarations.js +888 -0
  24. package/dist/api/compiler/checker-declared-types.d.ts +48 -0
  25. package/dist/api/compiler/checker-declared-types.js +787 -0
  26. package/dist/api/compiler/checker-decorators.d.ts +26 -0
  27. package/dist/api/compiler/checker-decorators.js +562 -0
  28. package/dist/api/compiler/checker-deprecation.d.ts +33 -0
  29. package/dist/api/compiler/checker-deprecation.js +315 -0
  30. package/dist/api/compiler/checker-destructuring.d.ts +34 -0
  31. package/dist/api/compiler/checker-destructuring.js +584 -0
  32. package/dist/api/compiler/checker-elaboration.d.ts +15 -0
  33. package/dist/api/compiler/checker-elaboration.js +290 -0
  34. package/dist/api/compiler/checker-emit-helpers.d.ts +58 -0
  35. package/dist/api/compiler/checker-emit-helpers.js +154 -0
  36. package/dist/api/compiler/checker-emit-resolver.d.ts +75 -0
  37. package/dist/api/compiler/checker-emit-resolver.js +579 -0
  38. package/dist/api/compiler/checker-evaluator.d.ts +27 -0
  39. package/dist/api/compiler/checker-evaluator.js +188 -0
  40. package/dist/api/compiler/checker-expressions.d.ts +67 -0
  41. package/dist/api/compiler/checker-expressions.js +1351 -0
  42. package/dist/api/compiler/checker-features.d.ts +6 -0
  43. package/dist/api/compiler/checker-features.js +354 -0
  44. package/dist/api/compiler/checker-flow.d.ts +86 -0
  45. package/dist/api/compiler/checker-flow.js +169 -0
  46. package/dist/api/compiler/checker-functions.d.ts +43 -0
  47. package/dist/api/compiler/checker-functions.js +1002 -0
  48. package/dist/api/compiler/checker-generated-code.d.ts +25 -0
  49. package/dist/api/compiler/checker-generated-code.js +168 -0
  50. package/dist/api/compiler/checker-globals.d.ts +14 -0
  51. package/dist/api/compiler/checker-globals.js +37 -0
  52. package/dist/api/compiler/checker-grammar.d.ts +35 -0
  53. package/dist/api/compiler/checker-grammar.js +2573 -0
  54. package/dist/api/compiler/checker-heritage.d.ts +28 -0
  55. package/dist/api/compiler/checker-heritage.js +900 -0
  56. package/dist/api/compiler/checker-inference.d.ts +179 -0
  57. package/dist/api/compiler/checker-inference.js +2105 -0
  58. package/dist/api/compiler/checker-iteration.d.ts +115 -0
  59. package/dist/api/compiler/checker-iteration.js +857 -0
  60. package/dist/api/compiler/checker-javascript.d.ts +42 -0
  61. package/dist/api/compiler/checker-javascript.js +441 -0
  62. package/dist/api/compiler/checker-jsdoc.d.ts +30 -0
  63. package/dist/api/compiler/checker-jsdoc.js +320 -0
  64. package/dist/api/compiler/checker-jsx.d.ts +94 -0
  65. package/dist/api/compiler/checker-jsx.js +1433 -0
  66. package/dist/api/compiler/checker-literals.d.ts +6 -0
  67. package/dist/api/compiler/checker-literals.js +43 -0
  68. package/dist/api/compiler/checker-members.d.ts +198 -0
  69. package/dist/api/compiler/checker-members.js +2126 -0
  70. package/dist/api/compiler/checker-modules.d.ts +85 -0
  71. package/dist/api/compiler/checker-modules.js +2141 -0
  72. package/dist/api/compiler/checker-narrowing.d.ts +120 -0
  73. package/dist/api/compiler/checker-narrowing.js +2797 -0
  74. package/dist/api/compiler/checker-object-literals.d.ts +14 -0
  75. package/dist/api/compiler/checker-object-literals.js +479 -0
  76. package/dist/api/compiler/checker-operators.d.ts +33 -0
  77. package/dist/api/compiler/checker-operators.js +1040 -0
  78. package/dist/api/compiler/checker-overloads.d.ts +7 -0
  79. package/dist/api/compiler/checker-overloads.js +270 -0
  80. package/dist/api/compiler/checker-property-access.d.ts +34 -0
  81. package/dist/api/compiler/checker-property-access.js +672 -0
  82. package/dist/api/compiler/checker-services.d.ts +49 -0
  83. package/dist/api/compiler/checker-services.js +995 -0
  84. package/dist/api/compiler/checker-signatures.d.ts +55 -0
  85. package/dist/api/compiler/checker-signatures.js +788 -0
  86. package/dist/api/compiler/checker-source-file.d.ts +27 -0
  87. package/dist/api/compiler/checker-source-file.js +619 -0
  88. package/dist/api/compiler/checker-statements.d.ts +18 -0
  89. package/dist/api/compiler/checker-statements.js +226 -0
  90. package/dist/api/compiler/checker-super.d.ts +13 -0
  91. package/dist/api/compiler/checker-super.js +241 -0
  92. package/dist/api/compiler/checker-symbol-types.d.ts +67 -0
  93. package/dist/api/compiler/checker-symbol-types.js +1885 -0
  94. package/dist/api/compiler/checker-symbols.d.ts +181 -0
  95. package/dist/api/compiler/checker-symbols.js +1782 -0
  96. package/dist/api/compiler/checker-type-factory.d.ts +142 -0
  97. package/dist/api/compiler/checker-type-factory.js +2501 -0
  98. package/dist/api/compiler/checker-type-nodes.d.ts +26 -0
  99. package/dist/api/compiler/checker-type-nodes.js +828 -0
  100. package/dist/api/compiler/checker-type-operators.d.ts +109 -0
  101. package/dist/api/compiler/checker-type-operators.js +1842 -0
  102. package/dist/api/compiler/checker-types.d.ts +1027 -0
  103. package/dist/api/compiler/checker-types.js +1697 -0
  104. package/dist/api/compiler/checker-unused.d.ts +19 -0
  105. package/dist/api/compiler/checker-unused.js +524 -0
  106. package/dist/api/compiler/checker-utilities.d.ts +33 -0
  107. package/dist/api/compiler/checker-utilities.js +141 -0
  108. package/dist/api/compiler/checker.d.ts +491 -0
  109. package/dist/api/compiler/checker.js +912 -0
  110. package/dist/api/compiler/command-line.d.ts +32 -0
  111. package/dist/api/compiler/command-line.js +383 -0
  112. package/dist/api/compiler/compile-program.d.ts +118 -0
  113. package/dist/api/compiler/compile-program.js +384 -0
  114. package/dist/api/compiler/diagnostic-locales.d.ts +22 -0
  115. package/dist/api/compiler/diagnostic-locales.js +64 -0
  116. package/dist/api/compiler/diagnostic-messages.d.ts +2166 -0
  117. package/dist/api/compiler/diagnostic-messages.js +184 -0
  118. package/dist/api/compiler/diagnostics.d.ts +167 -0
  119. package/dist/api/compiler/diagnostics.js +820 -0
  120. package/dist/api/compiler/emitter.d.ts +71 -0
  121. package/dist/api/compiler/emitter.js +327 -0
  122. package/dist/api/compiler/file-include.d.ts +117 -0
  123. package/dist/api/compiler/file-include.js +536 -0
  124. package/dist/api/compiler/file-loader.d.ts +261 -0
  125. package/dist/api/compiler/file-loader.js +1257 -0
  126. package/dist/api/compiler/file-system.d.ts +51 -0
  127. package/dist/api/compiler/file-system.js +132 -0
  128. package/dist/api/compiler/flow.d.ts +60 -0
  129. package/dist/api/compiler/flow.js +45 -0
  130. package/dist/api/compiler/instantiation.d.ts +74 -0
  131. package/dist/api/compiler/instantiation.js +799 -0
  132. package/dist/api/compiler/jsdoc.d.ts +75 -0
  133. package/dist/api/compiler/jsdoc.js +1229 -0
  134. package/dist/api/compiler/link-tables.d.ts +36 -0
  135. package/dist/api/compiler/link-tables.js +83 -0
  136. package/dist/api/compiler/locale-data.d.ts +24 -0
  137. package/dist/api/compiler/locale-data.js +183 -0
  138. package/dist/api/compiler/locale.d.ts +4 -0
  139. package/dist/api/compiler/locale.js +317 -0
  140. package/dist/api/compiler/locales/cs-CZ.d.ts +2 -0
  141. package/dist/api/compiler/locales/cs-CZ.js +3 -0
  142. package/dist/api/compiler/locales/de-DE.d.ts +2 -0
  143. package/dist/api/compiler/locales/de-DE.js +3 -0
  144. package/dist/api/compiler/locales/es-ES.d.ts +2 -0
  145. package/dist/api/compiler/locales/es-ES.js +3 -0
  146. package/dist/api/compiler/locales/fr-FR.d.ts +2 -0
  147. package/dist/api/compiler/locales/fr-FR.js +3 -0
  148. package/dist/api/compiler/locales/it-IT.d.ts +2 -0
  149. package/dist/api/compiler/locales/it-IT.js +3 -0
  150. package/dist/api/compiler/locales/ja-JP.d.ts +2 -0
  151. package/dist/api/compiler/locales/ja-JP.js +3 -0
  152. package/dist/api/compiler/locales/ko-KR.d.ts +2 -0
  153. package/dist/api/compiler/locales/ko-KR.js +3 -0
  154. package/dist/api/compiler/locales/pl-PL.d.ts +2 -0
  155. package/dist/api/compiler/locales/pl-PL.js +3 -0
  156. package/dist/api/compiler/locales/pt-BR.d.ts +2 -0
  157. package/dist/api/compiler/locales/pt-BR.js +3 -0
  158. package/dist/api/compiler/locales/ru-RU.d.ts +2 -0
  159. package/dist/api/compiler/locales/ru-RU.js +3 -0
  160. package/dist/api/compiler/locales/tr-TR.d.ts +2 -0
  161. package/dist/api/compiler/locales/tr-TR.js +3 -0
  162. package/dist/api/compiler/locales/zh-CN.d.ts +2 -0
  163. package/dist/api/compiler/locales/zh-CN.js +3 -0
  164. package/dist/api/compiler/locales/zh-TW.d.ts +2 -0
  165. package/dist/api/compiler/locales/zh-TW.js +3 -0
  166. package/dist/api/compiler/module-resolution-types.d.ts +83 -0
  167. package/dist/api/compiler/module-resolution-types.js +176 -0
  168. package/dist/api/compiler/module-resolution.d.ts +71 -0
  169. package/dist/api/compiler/module-resolution.js +1598 -0
  170. package/dist/api/compiler/module-specifiers.d.ts +64 -0
  171. package/dist/api/compiler/module-specifiers.js +1101 -0
  172. package/dist/api/compiler/name-resolver.d.ts +43 -0
  173. package/dist/api/compiler/name-resolver.js +509 -0
  174. package/dist/api/compiler/node-builder-names.d.ts +32 -0
  175. package/dist/api/compiler/node-builder-names.js +854 -0
  176. package/dist/api/compiler/node-builder-pseudo.d.ts +36 -0
  177. package/dist/api/compiler/node-builder-pseudo.js +744 -0
  178. package/dist/api/compiler/node-builder-reuse.d.ts +4 -0
  179. package/dist/api/compiler/node-builder-reuse.js +647 -0
  180. package/dist/api/compiler/node-builder.d.ts +270 -0
  181. package/dist/api/compiler/node-builder.js +2645 -0
  182. package/dist/api/compiler/option-declarations.d.ts +90 -0
  183. package/dist/api/compiler/option-declarations.js +1460 -0
  184. package/dist/api/compiler/options.d.ts +289 -0
  185. package/dist/api/compiler/options.js +1197 -0
  186. package/dist/api/compiler/output-paths.d.ts +42 -0
  187. package/dist/api/compiler/output-paths.js +195 -0
  188. package/dist/api/compiler/package-json.d.ts +175 -0
  189. package/dist/api/compiler/package-json.js +1015 -0
  190. package/dist/api/compiler/parallel-parse.d.ts +219 -0
  191. package/dist/api/compiler/parallel-parse.js +537 -0
  192. package/dist/api/compiler/parser.d.ts +587 -0
  193. package/dist/api/compiler/parser.js +6407 -0
  194. package/dist/api/compiler/path.d.ts +91 -0
  195. package/dist/api/compiler/path.js +705 -0
  196. package/dist/api/compiler/printer/async-helpers.d.ts +22 -0
  197. package/dist/api/compiler/printer/async-helpers.js +91 -0
  198. package/dist/api/compiler/printer/auto-generate.d.ts +13 -0
  199. package/dist/api/compiler/printer/auto-generate.js +20 -0
  200. package/dist/api/compiler/printer/decorator-helpers.d.ts +24 -0
  201. package/dist/api/compiler/printer/decorator-helpers.js +118 -0
  202. package/dist/api/compiler/printer/emit-context.d.ts +154 -0
  203. package/dist/api/compiler/printer/emit-context.js +576 -0
  204. package/dist/api/compiler/printer/emit-flags.d.ts +60 -0
  205. package/dist/api/compiler/printer/emit-flags.js +2 -0
  206. package/dist/api/compiler/printer/factory-base.d.ts +171 -0
  207. package/dist/api/compiler/printer/factory-base.js +1505 -0
  208. package/dist/api/compiler/printer/factory.d.ts +147 -0
  209. package/dist/api/compiler/printer/factory.js +542 -0
  210. package/dist/api/compiler/printer/helpers.d.ts +27 -0
  211. package/dist/api/compiler/printer/helpers.js +164 -0
  212. package/dist/api/compiler/printer/name-generator.d.ts +41 -0
  213. package/dist/api/compiler/printer/name-generator.js +283 -0
  214. package/dist/api/compiler/printer/printer.d.ts +411 -0
  215. package/dist/api/compiler/printer/printer.js +4517 -0
  216. package/dist/api/compiler/printer/text-writer.d.ts +46 -0
  217. package/dist/api/compiler/printer/text-writer.js +172 -0
  218. package/dist/api/compiler/printer/utilities.d.ts +82 -0
  219. package/dist/api/compiler/printer/utilities.js +817 -0
  220. package/dist/api/compiler/program-checker.d.ts +156 -0
  221. package/dist/api/compiler/program-checker.js +526 -0
  222. package/dist/api/compiler/program-utilities.d.ts +52 -0
  223. package/dist/api/compiler/program-utilities.js +365 -0
  224. package/dist/api/compiler/program.d.ts +180 -0
  225. package/dist/api/compiler/program.js +1011 -0
  226. package/dist/api/compiler/pseudo-bigint.d.ts +5 -0
  227. package/dist/api/compiler/pseudo-bigint.js +61 -0
  228. package/dist/api/compiler/regexp-checker.d.ts +38 -0
  229. package/dist/api/compiler/regexp-checker.js +942 -0
  230. package/dist/api/compiler/relations.d.ts +263 -0
  231. package/dist/api/compiler/relations.js +4002 -0
  232. package/dist/api/compiler/reparser.d.ts +48 -0
  233. package/dist/api/compiler/reparser.js +1323 -0
  234. package/dist/api/compiler/scanner.d.ts +256 -0
  235. package/dist/api/compiler/scanner.js +2853 -0
  236. package/dist/api/compiler/side-state.d.ts +16 -0
  237. package/dist/api/compiler/side-state.js +89 -0
  238. package/dist/api/compiler/sourcemap.d.ts +55 -0
  239. package/dist/api/compiler/sourcemap.js +340 -0
  240. package/dist/api/compiler/spelling.d.ts +14 -0
  241. package/dist/api/compiler/spelling.js +128 -0
  242. package/dist/api/compiler/symbol-accessibility.d.ts +57 -0
  243. package/dist/api/compiler/symbol-accessibility.js +894 -0
  244. package/dist/api/compiler/symbol.d.ts +240 -0
  245. package/dist/api/compiler/symbol.js +228 -0
  246. package/dist/api/compiler/symlinks.d.ts +32 -0
  247. package/dist/api/compiler/symlinks.js +114 -0
  248. package/dist/api/compiler/syntax-kind.d.ts +389 -0
  249. package/dist/api/compiler/syntax-kind.js +2 -0
  250. package/dist/api/compiler/timeline.d.ts +9 -0
  251. package/dist/api/compiler/timeline.js +54 -0
  252. package/dist/api/compiler/transformers/alias-references.d.ts +39 -0
  253. package/dist/api/compiler/transformers/alias-references.js +676 -0
  254. package/dist/api/compiler/transformers/async-utilities.d.ts +51 -0
  255. package/dist/api/compiler/transformers/async-utilities.js +260 -0
  256. package/dist/api/compiler/transformers/async.d.ts +53 -0
  257. package/dist/api/compiler/transformers/async.js +645 -0
  258. package/dist/api/compiler/transformers/class-fields.d.ts +206 -0
  259. package/dist/api/compiler/transformers/class-fields.js +2418 -0
  260. package/dist/api/compiler/transformers/class-utilities.d.ts +46 -0
  261. package/dist/api/compiler/transformers/class-utilities.js +261 -0
  262. package/dist/api/compiler/transformers/commonjs-module.d.ts +103 -0
  263. package/dist/api/compiler/transformers/commonjs-module.js +1180 -0
  264. package/dist/api/compiler/transformers/const-enum-inliner.d.ts +11 -0
  265. package/dist/api/compiler/transformers/const-enum-inliner.js +36 -0
  266. package/dist/api/compiler/transformers/declarations-diagnostics.d.ts +52 -0
  267. package/dist/api/compiler/transformers/declarations-diagnostics.js +538 -0
  268. package/dist/api/compiler/transformers/declarations-pseudo.d.ts +160 -0
  269. package/dist/api/compiler/transformers/declarations-pseudo.js +797 -0
  270. package/dist/api/compiler/transformers/declarations-resolver.d.ts +152 -0
  271. package/dist/api/compiler/transformers/declarations-resolver.js +35 -0
  272. package/dist/api/compiler/transformers/declarations-syntactic.d.ts +119 -0
  273. package/dist/api/compiler/transformers/declarations-syntactic.js +1582 -0
  274. package/dist/api/compiler/transformers/declarations-tracker.d.ts +46 -0
  275. package/dist/api/compiler/transformers/declarations-tracker.js +197 -0
  276. package/dist/api/compiler/transformers/declarations.d.ts +175 -0
  277. package/dist/api/compiler/transformers/declarations.js +2380 -0
  278. package/dist/api/compiler/transformers/decorator-metadata.d.ts +54 -0
  279. package/dist/api/compiler/transformers/decorator-metadata.js +554 -0
  280. package/dist/api/compiler/transformers/decorator-utilities.d.ts +38 -0
  281. package/dist/api/compiler/transformers/decorator-utilities.js +238 -0
  282. package/dist/api/compiler/transformers/destructuring.d.ts +25 -0
  283. package/dist/api/compiler/transformers/destructuring.js +626 -0
  284. package/dist/api/compiler/transformers/downlevel.d.ts +6 -0
  285. package/dist/api/compiler/transformers/downlevel.js +45 -0
  286. package/dist/api/compiler/transformers/emit-resolver.d.ts +61 -0
  287. package/dist/api/compiler/transformers/emit-resolver.js +197 -0
  288. package/dist/api/compiler/transformers/es-decorators.d.ts +118 -0
  289. package/dist/api/compiler/transformers/es-decorators.js +1901 -0
  290. package/dist/api/compiler/transformers/exponentiation.d.ts +11 -0
  291. package/dist/api/compiler/transformers/exponentiation.js +76 -0
  292. package/dist/api/compiler/transformers/external-module-info.d.ts +35 -0
  293. package/dist/api/compiler/transformers/external-module-info.js +351 -0
  294. package/dist/api/compiler/transformers/for-await.d.ts +43 -0
  295. package/dist/api/compiler/transformers/for-await.js +469 -0
  296. package/dist/api/compiler/transformers/import-elision.d.ts +16 -0
  297. package/dist/api/compiler/transformers/import-elision.js +124 -0
  298. package/dist/api/compiler/transformers/jsx-entities.d.ts +1 -0
  299. package/dist/api/compiler/transformers/jsx-entities.js +256 -0
  300. package/dist/api/compiler/transformers/jsx.d.ts +71 -0
  301. package/dist/api/compiler/transformers/jsx.js +700 -0
  302. package/dist/api/compiler/transformers/legacy-decorators.d.ts +56 -0
  303. package/dist/api/compiler/transformers/legacy-decorators.js +564 -0
  304. package/dist/api/compiler/transformers/logical-assignment.d.ts +14 -0
  305. package/dist/api/compiler/transformers/logical-assignment.js +62 -0
  306. package/dist/api/compiler/transformers/module-utilities.d.ts +9 -0
  307. package/dist/api/compiler/transformers/module-utilities.js +36 -0
  308. package/dist/api/compiler/transformers/module.d.ts +49 -0
  309. package/dist/api/compiler/transformers/module.js +296 -0
  310. package/dist/api/compiler/transformers/named-evaluation.d.ts +26 -0
  311. package/dist/api/compiler/transformers/named-evaluation.js +266 -0
  312. package/dist/api/compiler/transformers/nullish-coalescing.d.ts +9 -0
  313. package/dist/api/compiler/transformers/nullish-coalescing.js +26 -0
  314. package/dist/api/compiler/transformers/object-rest-spread.d.ts +34 -0
  315. package/dist/api/compiler/transformers/object-rest-spread.js +411 -0
  316. package/dist/api/compiler/transformers/optional-catch.d.ts +9 -0
  317. package/dist/api/compiler/transformers/optional-catch.js +20 -0
  318. package/dist/api/compiler/transformers/optional-chain.d.ts +14 -0
  319. package/dist/api/compiler/transformers/optional-chain.js +188 -0
  320. package/dist/api/compiler/transformers/reference-resolver.d.ts +128 -0
  321. package/dist/api/compiler/transformers/reference-resolver.js +1155 -0
  322. package/dist/api/compiler/transformers/runtime-syntax.d.ts +71 -0
  323. package/dist/api/compiler/transformers/runtime-syntax.js +753 -0
  324. package/dist/api/compiler/transformers/subtree-facts.d.ts +9 -0
  325. package/dist/api/compiler/transformers/subtree-facts.js +203 -0
  326. package/dist/api/compiler/transformers/syntax-facts.d.ts +51 -0
  327. package/dist/api/compiler/transformers/syntax-facts.js +254 -0
  328. package/dist/api/compiler/transformers/tagged-template.d.ts +17 -0
  329. package/dist/api/compiler/transformers/tagged-template.js +148 -0
  330. package/dist/api/compiler/transformers/transformer.d.ts +17 -0
  331. package/dist/api/compiler/transformers/transformer.js +54 -0
  332. package/dist/api/compiler/transformers/type-eraser.d.ts +21 -0
  333. package/dist/api/compiler/transformers/type-eraser.js +346 -0
  334. package/dist/api/compiler/transformers/type-serialization.d.ts +20 -0
  335. package/dist/api/compiler/transformers/type-serialization.js +347 -0
  336. package/dist/api/compiler/transformers/using.d.ts +56 -0
  337. package/dist/api/compiler/transformers/using.js +453 -0
  338. package/dist/api/compiler/transformers/utilities.d.ts +50 -0
  339. package/dist/api/compiler/transformers/utilities.js +347 -0
  340. package/dist/api/compiler/transformers/visitor-base.d.ts +6 -0
  341. package/dist/api/compiler/transformers/visitor-base.js +817 -0
  342. package/dist/api/compiler/transformers/visitor-hooks.d.ts +29 -0
  343. package/dist/api/compiler/transformers/visitor-hooks.js +189 -0
  344. package/dist/api/compiler/tsconfig.d.ts +177 -0
  345. package/dist/api/compiler/tsconfig.js +1311 -0
  346. package/dist/api/compiler/type-printer.d.ts +15 -0
  347. package/dist/api/compiler/type-printer.js +74 -0
  348. package/dist/api/compiler/types.d.ts +87 -0
  349. package/dist/api/compiler/types.js +23 -0
  350. package/dist/api/compiler/unicode-identifiers.d.ts +2 -0
  351. package/dist/api/compiler/unicode-identifiers.js +209 -0
  352. package/dist/api/compiler/unicode-properties.d.ts +8 -0
  353. package/dist/api/compiler/unicode-properties.js +531 -0
  354. package/dist/api/compiler/vfs-match.d.ts +24 -0
  355. package/dist/api/compiler/vfs-match.js +587 -0
  356. package/dist/api/library/ast.d.ts +74 -0
  357. package/dist/api/library/ast.generated.d.ts +1145 -0
  358. package/dist/api/library/ast.generated.js +3 -0
  359. package/dist/api/library/ast.js +5 -0
  360. package/dist/api/library/checker.d.ts +51 -0
  361. package/dist/api/library/checker.js +318 -0
  362. package/dist/api/library/compiler-options.generated.d.ts +108 -0
  363. package/dist/api/library/compiler-options.generated.js +3 -0
  364. package/dist/api/library/diagnostics.d.ts +13 -0
  365. package/dist/api/library/diagnostics.js +50 -0
  366. package/dist/api/library/disk.d.ts +13 -0
  367. package/dist/api/library/disk.js +66 -0
  368. package/dist/api/library/enums.generated.d.ts +891 -0
  369. package/dist/api/library/enums.generated.js +916 -0
  370. package/dist/api/library/errors.d.ts +13 -0
  371. package/dist/api/library/errors.js +24 -0
  372. package/dist/api/library/host.d.ts +24 -0
  373. package/dist/api/library/host.js +52 -0
  374. package/dist/api/library/index.d.ts +14 -0
  375. package/dist/api/library/index.js +15 -0
  376. package/dist/api/library/nodes.d.ts +51 -0
  377. package/dist/api/library/nodes.js +196 -0
  378. package/dist/api/library/options.d.ts +144 -0
  379. package/dist/api/library/options.js +308 -0
  380. package/dist/api/library/parse.d.ts +19 -0
  381. package/dist/api/library/parse.js +41 -0
  382. package/dist/api/library/program.d.ts +21 -0
  383. package/dist/api/library/program.js +234 -0
  384. package/dist/api/library/symbols.d.ts +8 -0
  385. package/dist/api/library/symbols.js +11 -0
  386. package/dist/api/library/types.d.ts +313 -0
  387. package/dist/api/library/types.js +6 -0
  388. package/package.json +22 -8
  389. package/src/compiler/ast-utilities.ts +548 -0
  390. package/src/compiler/ast.ts +12862 -0
  391. package/src/compiler/astnav.ts +799 -0
  392. package/src/compiler/binder-utilities.ts +1392 -0
  393. package/src/compiler/binder.ts +2703 -0
  394. package/src/compiler/build-info.ts +1197 -0
  395. package/src/compiler/character-codes.ts +323 -0
  396. package/src/compiler/checker-calls.ts +2155 -0
  397. package/src/compiler/checker-classes.ts +706 -0
  398. package/src/compiler/checker-contextual.ts +1457 -0
  399. package/src/compiler/checker-declaration-order.ts +438 -0
  400. package/src/compiler/checker-declarations.ts +1194 -0
  401. package/src/compiler/checker-declared-types.ts +919 -0
  402. package/src/compiler/checker-decorators.ts +694 -0
  403. package/src/compiler/checker-deprecation.ts +359 -0
  404. package/src/compiler/checker-destructuring.ts +805 -0
  405. package/src/compiler/checker-elaboration.ts +477 -0
  406. package/src/compiler/checker-emit-helpers.ts +224 -0
  407. package/src/compiler/checker-emit-resolver.ts +769 -0
  408. package/src/compiler/checker-evaluator.ts +243 -0
  409. package/src/compiler/checker-expressions.ts +1831 -0
  410. package/src/compiler/checker-features.ts +361 -0
  411. package/src/compiler/checker-flow.ts +394 -0
  412. package/src/compiler/checker-functions.ts +1296 -0
  413. package/src/compiler/checker-generated-code.ts +227 -0
  414. package/src/compiler/checker-globals.ts +52 -0
  415. package/src/compiler/checker-grammar.ts +3584 -0
  416. package/src/compiler/checker-heritage.ts +1233 -0
  417. package/src/compiler/checker-inference.ts +2576 -0
  418. package/src/compiler/checker-iteration.ts +1206 -0
  419. package/src/compiler/checker-javascript.ts +502 -0
  420. package/src/compiler/checker-jsdoc.ts +360 -0
  421. package/src/compiler/checker-jsx.ts +1924 -0
  422. package/src/compiler/checker-literals.ts +61 -0
  423. package/src/compiler/checker-members.ts +2436 -0
  424. package/src/compiler/checker-modules.ts +2886 -0
  425. package/src/compiler/checker-narrowing.ts +3230 -0
  426. package/src/compiler/checker-object-literals.ts +575 -0
  427. package/src/compiler/checker-operators.ts +1422 -0
  428. package/src/compiler/checker-overloads.ts +328 -0
  429. package/src/compiler/checker-property-access.ts +906 -0
  430. package/src/compiler/checker-services.ts +1149 -0
  431. package/src/compiler/checker-signatures.ts +1032 -0
  432. package/src/compiler/checker-source-file.ts +732 -0
  433. package/src/compiler/checker-statements.ts +292 -0
  434. package/src/compiler/checker-super.ts +261 -0
  435. package/src/compiler/checker-symbol-types.ts +2107 -0
  436. package/src/compiler/checker-symbols.ts +2150 -0
  437. package/src/compiler/checker-type-factory.ts +2579 -0
  438. package/src/compiler/checker-type-nodes.ts +1033 -0
  439. package/src/compiler/checker-type-operators.ts +2502 -0
  440. package/src/compiler/checker-types.ts +2340 -0
  441. package/src/compiler/checker-unused.ts +642 -0
  442. package/src/compiler/checker-utilities.ts +161 -0
  443. package/src/compiler/checker.ts +1116 -0
  444. package/src/compiler/command-line.ts +436 -0
  445. package/src/compiler/compile-program.ts +439 -0
  446. package/src/compiler/decoder.ts +1209 -0
  447. package/src/compiler/diagnostic-locales.ts +86 -0
  448. package/src/compiler/diagnostic-messages.ts +2349 -0
  449. package/src/compiler/diagnostics.ts +897 -0
  450. package/src/compiler/emitter.ts +434 -0
  451. package/src/compiler/encoder.ts +1945 -0
  452. package/src/compiler/file-include.ts +673 -0
  453. package/src/compiler/file-loader.ts +1528 -0
  454. package/src/compiler/file-system.ts +143 -0
  455. package/src/compiler/flow.ts +89 -0
  456. package/src/compiler/help.ts +473 -0
  457. package/src/compiler/incremental.ts +2784 -0
  458. package/src/compiler/init.ts +141 -0
  459. package/src/compiler/instantiation.ts +894 -0
  460. package/src/compiler/jsdoc.ts +1386 -0
  461. package/src/compiler/link-tables.ts +98 -0
  462. package/src/compiler/locale-data.ts +203 -0
  463. package/src/compiler/locale.ts +307 -0
  464. package/src/compiler/locales/cs-CZ.ts +5 -0
  465. package/src/compiler/locales/de-DE.ts +5 -0
  466. package/src/compiler/locales/es-ES.ts +5 -0
  467. package/src/compiler/locales/fr-FR.ts +5 -0
  468. package/src/compiler/locales/it-IT.ts +5 -0
  469. package/src/compiler/locales/ja-JP.ts +5 -0
  470. package/src/compiler/locales/ko-KR.ts +5 -0
  471. package/src/compiler/locales/pl-PL.ts +5 -0
  472. package/src/compiler/locales/pt-BR.ts +5 -0
  473. package/src/compiler/locales/ru-RU.ts +5 -0
  474. package/src/compiler/locales/tr-TR.ts +5 -0
  475. package/src/compiler/locales/zh-CN.ts +5 -0
  476. package/src/compiler/locales/zh-TW.ts +5 -0
  477. package/src/compiler/module-resolution-types.ts +243 -0
  478. package/src/compiler/module-resolution.ts +2072 -0
  479. package/src/compiler/module-specifiers.ts +1491 -0
  480. package/src/compiler/name-resolver.ts +646 -0
  481. package/src/compiler/node-builder-names.ts +1069 -0
  482. package/src/compiler/node-builder-pseudo.ts +892 -0
  483. package/src/compiler/node-builder-reuse.ts +764 -0
  484. package/src/compiler/node-builder.ts +3425 -0
  485. package/src/compiler/option-declarations.ts +1560 -0
  486. package/src/compiler/options.ts +1576 -0
  487. package/src/compiler/output-paths.ts +334 -0
  488. package/src/compiler/package-json.ts +1083 -0
  489. package/src/compiler/parallel-check.ts +1951 -0
  490. package/src/compiler/parallel-parse.ts +590 -0
  491. package/src/compiler/parse-thread.ts +140 -0
  492. package/src/compiler/parser.ts +7716 -0
  493. package/src/compiler/path.ts +717 -0
  494. package/src/compiler/printer/async-helpers.ts +183 -0
  495. package/src/compiler/printer/auto-generate.ts +27 -0
  496. package/src/compiler/printer/decorator-helpers.ts +218 -0
  497. package/src/compiler/printer/emit-context.ts +679 -0
  498. package/src/compiler/printer/emit-flags.ts +64 -0
  499. package/src/compiler/printer/factory-base.ts +2577 -0
  500. package/src/compiler/printer/factory.ts +764 -0
  501. package/src/compiler/printer/helpers.ts +291 -0
  502. package/src/compiler/printer/name-generator.ts +372 -0
  503. package/src/compiler/printer/printer.ts +5072 -0
  504. package/src/compiler/printer/text-writer.ts +183 -0
  505. package/src/compiler/printer/utilities.ts +884 -0
  506. package/src/compiler/program-checker.ts +592 -0
  507. package/src/compiler/program-utilities.ts +435 -0
  508. package/src/compiler/program.ts +1419 -0
  509. package/src/compiler/pseudo-bigint.ts +62 -0
  510. package/src/compiler/regexp-checker.ts +1142 -0
  511. package/src/compiler/relations.ts +5149 -0
  512. package/src/compiler/reparser.ts +1566 -0
  513. package/src/compiler/scanner.ts +2951 -0
  514. package/src/compiler/show-config.ts +239 -0
  515. package/src/compiler/side-state.ts +125 -0
  516. package/src/compiler/sourcemap.ts +366 -0
  517. package/src/compiler/spelling.ts +122 -0
  518. package/src/compiler/symbol-accessibility.ts +1071 -0
  519. package/src/compiler/symbol.ts +439 -0
  520. package/src/compiler/symlinks.ts +137 -0
  521. package/src/compiler/syntax-kind.ts +391 -0
  522. package/src/compiler/thread-entry.ts +191 -0
  523. package/src/compiler/timeline.ts +53 -0
  524. package/src/compiler/transformers/alias-references.ts +757 -0
  525. package/src/compiler/transformers/async-utilities.ts +335 -0
  526. package/src/compiler/transformers/async.ts +838 -0
  527. package/src/compiler/transformers/class-fields.ts +2967 -0
  528. package/src/compiler/transformers/class-utilities.ts +324 -0
  529. package/src/compiler/transformers/commonjs-module.ts +1621 -0
  530. package/src/compiler/transformers/const-enum-inliner.ts +50 -0
  531. package/src/compiler/transformers/declarations-diagnostics.ts +832 -0
  532. package/src/compiler/transformers/declarations-pseudo.ts +966 -0
  533. package/src/compiler/transformers/declarations-resolver.ts +249 -0
  534. package/src/compiler/transformers/declarations-syntactic.ts +1859 -0
  535. package/src/compiler/transformers/declarations-tracker.ts +269 -0
  536. package/src/compiler/transformers/declarations.ts +3120 -0
  537. package/src/compiler/transformers/decorator-metadata.ts +697 -0
  538. package/src/compiler/transformers/decorator-utilities.ts +283 -0
  539. package/src/compiler/transformers/destructuring.ts +708 -0
  540. package/src/compiler/transformers/downlevel.ts +50 -0
  541. package/src/compiler/transformers/emit-resolver.ts +258 -0
  542. package/src/compiler/transformers/es-decorators.ts +2682 -0
  543. package/src/compiler/transformers/exponentiation.ts +80 -0
  544. package/src/compiler/transformers/external-module-info.ts +412 -0
  545. package/src/compiler/transformers/for-await.ts +687 -0
  546. package/src/compiler/transformers/import-elision.ts +152 -0
  547. package/src/compiler/transformers/jsx-entities.ts +256 -0
  548. package/src/compiler/transformers/jsx.ts +824 -0
  549. package/src/compiler/transformers/legacy-decorators.ts +726 -0
  550. package/src/compiler/transformers/logical-assignment.ts +75 -0
  551. package/src/compiler/transformers/module-utilities.ts +42 -0
  552. package/src/compiler/transformers/module.ts +474 -0
  553. package/src/compiler/transformers/named-evaluation.ts +389 -0
  554. package/src/compiler/transformers/nullish-coalescing.ts +35 -0
  555. package/src/compiler/transformers/object-rest-spread.ts +577 -0
  556. package/src/compiler/transformers/optional-catch.ts +29 -0
  557. package/src/compiler/transformers/optional-chain.ts +246 -0
  558. package/src/compiler/transformers/reference-resolver.ts +1201 -0
  559. package/src/compiler/transformers/runtime-syntax.ts +942 -0
  560. package/src/compiler/transformers/subtree-facts.ts +245 -0
  561. package/src/compiler/transformers/syntax-facts.ts +353 -0
  562. package/src/compiler/transformers/tagged-template.ts +167 -0
  563. package/src/compiler/transformers/transformer.ts +56 -0
  564. package/src/compiler/transformers/type-eraser.ts +520 -0
  565. package/src/compiler/transformers/type-serialization.ts +374 -0
  566. package/src/compiler/transformers/using.ts +613 -0
  567. package/src/compiler/transformers/utilities.ts +419 -0
  568. package/src/compiler/transformers/visitor-base.ts +1601 -0
  569. package/src/compiler/transformers/visitor-hooks.ts +252 -0
  570. package/src/compiler/tsc-build.ts +1418 -0
  571. package/src/compiler/tsc-cli.ts +666 -0
  572. package/src/compiler/tsc-compile.ts +437 -0
  573. package/src/compiler/tsc-watch.ts +854 -0
  574. package/src/compiler/tsconfig.ts +1574 -0
  575. package/src/compiler/type-printer.ts +110 -0
  576. package/src/compiler/types.ts +115 -0
  577. package/src/compiler/unicode-identifiers.ts +212 -0
  578. package/src/compiler/unicode-properties.ts +537 -0
  579. package/src/compiler/vfs-match.ts +597 -0
  580. package/src/compiler/xxh3.ts +650 -0
  581. package/src/library/ast.generated.ts +1685 -0
  582. package/src/library/ast.ts +104 -0
  583. package/src/library/checker.ts +384 -0
  584. package/src/library/compiler-options.generated.ts +114 -0
  585. package/src/library/diagnostics.ts +72 -0
  586. package/src/library/disk.ts +73 -0
  587. package/src/library/enums.generated.ts +1024 -0
  588. package/src/library/errors.ts +26 -0
  589. package/src/library/host.ts +63 -0
  590. package/src/library/index.ts +71 -0
  591. package/src/library/nodes.ts +232 -0
  592. package/src/library/options.ts +449 -0
  593. package/src/library/parse.ts +63 -0
  594. package/src/library/program.ts +293 -0
  595. package/src/library/symbols.ts +15 -0
  596. package/src/library/types.ts +359 -0
@@ -0,0 +1,1142 @@
1
+ import {
2
+ CharacterCodes,
3
+ charSize,
4
+ codePointAt,
5
+ isASCIILetter,
6
+ isDigit,
7
+ isIdentifierPart,
8
+ isWordCharacter,
9
+ } from './character-codes.js';
10
+ import { Diagnostics } from './diagnostic-messages.js';
11
+ import type { DiagnosticMessage } from './diagnostics.js';
12
+ import type { Scanner } from './scanner.js';
13
+ import { getSpellingSuggestion } from './spelling.js';
14
+ import { ScriptTarget } from './types.js';
15
+ import {
16
+ binaryUnicodeProperties,
17
+ binaryUnicodePropertiesOfStrings,
18
+ generalCategoryValues,
19
+ nonBinaryUnicodeProperties,
20
+ valuesOfNonBinaryUnicodeProperty,
21
+ } from './unicode-properties.js';
22
+
23
+ /** Special results of `Scanner.scanEscapeCodePoint`. */
24
+ export const enum EscapeValue {
25
+ /** A line continuation, which has no value. */
26
+ Empty = -1,
27
+ /** An invalid escape whose value is its source text. */
28
+ Raw = -2,
29
+ }
30
+
31
+ export const enum EscapeSequenceScanningFlags {
32
+ String = 1 << 0,
33
+ ReportErrors = 1 << 1,
34
+ RegularExpression = 1 << 2,
35
+ AnnexB = 1 << 3,
36
+ AnyUnicodeMode = 1 << 4,
37
+ AtomEscape = 1 << 5,
38
+ ReportInvalidEscapeErrors = RegularExpression | ReportErrors,
39
+ AllowExtendedUnicodeEscape = String | AnyUnicodeMode,
40
+ }
41
+
42
+ export const enum RegularExpressionFlags {
43
+ None = 0,
44
+ HasIndices = 1 << 0, // d
45
+ Global = 1 << 1, // g
46
+ IgnoreCase = 1 << 2, // i
47
+ Multiline = 1 << 3, // m
48
+ DotAll = 1 << 4, // s
49
+ Unicode = 1 << 5, // u
50
+ UnicodeSets = 1 << 6, // v
51
+ Sticky = 1 << 7, // y
52
+ AnyUnicodeMode = Unicode | UnicodeSets,
53
+ Modifiers = IgnoreCase | Multiline | DotAll,
54
+ }
55
+
56
+ /** The flag for a regular expression flag character, or `None`. */
57
+ export function regularExpressionFlag(ch: number): RegularExpressionFlags {
58
+ switch (ch) {
59
+ case CharacterCodes.d:
60
+ return RegularExpressionFlags.HasIndices;
61
+ case CharacterCodes.g:
62
+ return RegularExpressionFlags.Global;
63
+ case CharacterCodes.i:
64
+ return RegularExpressionFlags.IgnoreCase;
65
+ case CharacterCodes.m:
66
+ return RegularExpressionFlags.Multiline;
67
+ case CharacterCodes.s:
68
+ return RegularExpressionFlags.DotAll;
69
+ case CharacterCodes.u:
70
+ return RegularExpressionFlags.Unicode;
71
+ case CharacterCodes.v:
72
+ return RegularExpressionFlags.UnicodeSets;
73
+ case CharacterCodes.y:
74
+ return RegularExpressionFlags.Sticky;
75
+ default:
76
+ return RegularExpressionFlags.None;
77
+ }
78
+ }
79
+
80
+ const enum ClassSetExpressionType {
81
+ Unknown,
82
+ ClassUnion,
83
+ ClassIntersection,
84
+ ClassSubtraction,
85
+ }
86
+
87
+ class GroupNameReference {
88
+ readonly pos: number;
89
+ readonly end: number;
90
+ readonly name: string;
91
+
92
+ constructor(pos: number, end: number, name: string) {
93
+ this.pos = pos;
94
+ this.end = end;
95
+ this.name = name;
96
+ }
97
+ }
98
+
99
+ class DecimalEscape {
100
+ readonly pos: number;
101
+ readonly end: number;
102
+ readonly value: number;
103
+
104
+ constructor(pos: number, end: number, value: number) {
105
+ this.pos = pos;
106
+ this.end = end;
107
+ this.value = value;
108
+ }
109
+ }
110
+
111
+ const noArgs: readonly string[] = [];
112
+
113
+ /**
114
+ * Checks the body of a regular expression literal, which the scanner has bounded
115
+ * to `[scanner.pos, end)`, and reports syntax errors through the scanner.
116
+ */
117
+ export function checkRegularExpression(
118
+ scanner: Scanner,
119
+ end: number,
120
+ flags: RegularExpressionFlags,
121
+ namedCaptureGroups: boolean,
122
+ ): void {
123
+ new RegularExpressionChecker(scanner, end, flags, namedCaptureGroups).check();
124
+ }
125
+
126
+ // Class atoms and operands evaluate to a code point, or to one of these.
127
+ const enum ClassValue {
128
+ /** A character class escape or nested class, which can't bound a range. */
129
+ None = -1,
130
+ /** More than one character, which isn't compared as a range bound. */
131
+ String = -2,
132
+ }
133
+
134
+ function compareDecimalStrings(a: string, b: string): number {
135
+ let i = 0;
136
+ while (i < a.length && a.charCodeAt(i) === CharacterCodes._0) i++;
137
+ let j = 0;
138
+ while (j < b.length && b.charCodeAt(j) === CharacterCodes._0) j++;
139
+ const x = i === a.length ? '0' : a.substring(i);
140
+ const y = j === b.length ? '0' : b.substring(j);
141
+ if (x.length !== y.length) return x.length < y.length ? -1 : 1;
142
+ return x < y ? -1 : x > y ? 1 : 0;
143
+ }
144
+
145
+ function mapKeys(map: Map<string, string>): string[] {
146
+ const result: string[] = [];
147
+ for (const key of map.keys()) result.push(key);
148
+ return result;
149
+ }
150
+
151
+ function setToArray(set: Set<string>): string[] {
152
+ const result: string[] = [];
153
+ for (const value of set) result.push(value);
154
+ return result;
155
+ }
156
+
157
+ class RegularExpressionChecker {
158
+ private readonly scanner: Scanner;
159
+ private readonly text: string;
160
+ private readonly end: number;
161
+ private readonly anyUnicodeMode: boolean;
162
+ private readonly unicodeSetsMode: boolean;
163
+ private readonly annexB: boolean;
164
+ // Checked strictly in Unicode modes or without Annex B's looser grammar.
165
+ private readonly anyUnicodeModeOrNonAnnexB: boolean;
166
+ private readonly namedCaptureGroups: boolean;
167
+ // See scanClassSetExpression.
168
+ private mayContainStrings: boolean;
169
+ private numberOfCapturingGroups: number;
170
+ private readonly groupSpecifiers: Set<string>;
171
+ private readonly groupNameReferences: GroupNameReference[];
172
+ private readonly decimalEscapes: DecimalEscape[];
173
+ // Scopes of named capturing groups; see scanGroupName.
174
+ private readonly namedCapturingGroups: Set<string>[];
175
+
176
+ constructor(scanner: Scanner, end: number, flags: RegularExpressionFlags, namedCaptureGroups: boolean) {
177
+ this.scanner = scanner;
178
+ this.text = scanner.text;
179
+ this.end = end;
180
+ this.anyUnicodeMode = (flags & RegularExpressionFlags.AnyUnicodeMode) !== 0;
181
+ this.unicodeSetsMode = (flags & RegularExpressionFlags.UnicodeSets) !== 0;
182
+ this.annexB = true;
183
+ this.anyUnicodeModeOrNonAnnexB = this.anyUnicodeMode || !this.annexB;
184
+ this.namedCaptureGroups = namedCaptureGroups;
185
+ this.mayContainStrings = false;
186
+ this.numberOfCapturingGroups = 0;
187
+ this.groupSpecifiers = new Set<string>();
188
+ this.groupNameReferences = [];
189
+ this.decimalEscapes = [];
190
+ this.namedCapturingGroups = [];
191
+ }
192
+
193
+ private char(): number {
194
+ return this.scanner.char();
195
+ }
196
+
197
+ /** The code unit at absolute position `pos`, or -1 past the body. */
198
+ private charAt(pos: number): number {
199
+ return pos < this.end ? this.text.charCodeAt(pos) : CharacterCodes.EOF;
200
+ }
201
+
202
+ private error(message: DiagnosticMessage, start: number, length: number, args: readonly string[]): void {
203
+ this.scanner.errorAt(message, start, length, args);
204
+ }
205
+
206
+ /** Checks the expression and returns its number of capturing groups. */
207
+ check(): number {
208
+ this.scanDisjunction(false);
209
+ for (const reference of this.groupNameReferences) {
210
+ if (this.groupSpecifiers.has(reference.name)) continue;
211
+ this.error(
212
+ Diagnostics.There_is_no_capturing_group_named_0_in_this_regular_expression,
213
+ reference.pos,
214
+ reference.end - reference.pos,
215
+ [reference.name],
216
+ );
217
+ if (this.groupSpecifiers.size > 0) {
218
+ const suggestion = getSpellingSuggestion(reference.name, setToArray(this.groupSpecifiers));
219
+ if (suggestion !== '')
220
+ this.error(Diagnostics.Did_you_mean_0, reference.pos, reference.end - reference.pos, [suggestion]);
221
+ }
222
+ }
223
+ // Annex B reads such escapes as octal or identity escapes, but they are most likely mistakes.
224
+ for (const escape of this.decimalEscapes) {
225
+ if (escape.value <= this.numberOfCapturingGroups) continue;
226
+ if (this.numberOfCapturingGroups > 0)
227
+ this.error(
228
+ Diagnostics.This_backreference_refers_to_a_group_that_does_not_exist_There_are_only_0_capturing_groups_in_this_regular_expression,
229
+ escape.pos,
230
+ escape.end - escape.pos,
231
+ [String(this.numberOfCapturingGroups)],
232
+ );
233
+ else
234
+ this.error(
235
+ Diagnostics.This_backreference_refers_to_a_group_that_does_not_exist_There_are_no_capturing_groups_in_this_regular_expression,
236
+ escape.pos,
237
+ escape.end - escape.pos,
238
+ noArgs,
239
+ );
240
+ }
241
+ return this.numberOfCapturingGroups;
242
+ }
243
+
244
+ // Disjunction ::= Alternative ('|' Alternative)*
245
+ private scanDisjunction(isInGroup: boolean): void {
246
+ for (;;) {
247
+ this.namedCapturingGroups.push(new Set<string>());
248
+ this.scanAlternative(isInGroup);
249
+ this.namedCapturingGroups.pop();
250
+ if (this.char() !== CharacterCodes.bar) return;
251
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
252
+ }
253
+ }
254
+
255
+ // Alternative ::= Term*
256
+ // Term ::= Assertion | Atom Quantifier?
257
+ private scanAlternative(isInGroup: boolean): void {
258
+ let isPreviousTermQuantifiable = false;
259
+ while (this.scanner.pos < this.end) {
260
+ const start = this.scanner.pos;
261
+ const ch = this.char();
262
+ switch (ch) {
263
+ case CharacterCodes.caret:
264
+ case CharacterCodes.$:
265
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
266
+ isPreviousTermQuantifiable = false;
267
+ continue;
268
+ case CharacterCodes.backslash:
269
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
270
+ if (this.char() === CharacterCodes.b || this.char() === CharacterCodes.B) {
271
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
272
+ isPreviousTermQuantifiable = false;
273
+ } else {
274
+ this.scanAtomEscape(this.char());
275
+ isPreviousTermQuantifiable = true;
276
+ }
277
+ continue;
278
+ case CharacterCodes.openParen:
279
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
280
+ if (this.char() === CharacterCodes.question) {
281
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
282
+ const next = this.char();
283
+ if (next === CharacterCodes.equals || next === CharacterCodes.exclamation) {
284
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
285
+ // Annex B makes `(?=…)` and `(?!…)` quantifiable.
286
+ isPreviousTermQuantifiable = !this.anyUnicodeModeOrNonAnnexB;
287
+ } else if (next === CharacterCodes.lessThan) {
288
+ const groupNameStart = this.scanner.pos;
289
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
290
+ if (this.char() === CharacterCodes.equals || this.char() === CharacterCodes.exclamation) {
291
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
292
+ isPreviousTermQuantifiable = false;
293
+ } else {
294
+ this.scanGroupName(false);
295
+ this.scanExpectedChar(CharacterCodes.greaterThan);
296
+ if (this.scanner.languageVersion() < ScriptTarget.ES2018)
297
+ this.error(
298
+ Diagnostics.Named_capturing_groups_are_only_available_when_targeting_ES2018_or_later,
299
+ groupNameStart,
300
+ this.scanner.pos - groupNameStart,
301
+ noArgs,
302
+ );
303
+ this.numberOfCapturingGroups++;
304
+ isPreviousTermQuantifiable = true;
305
+ }
306
+ } else {
307
+ const flagsStart = this.scanner.pos;
308
+ const setFlags = this.scanPatternModifiers(RegularExpressionFlags.None);
309
+ if (this.char() === CharacterCodes.minus) {
310
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
311
+ this.scanPatternModifiers(setFlags);
312
+ if (this.scanner.pos === flagsStart + 1)
313
+ this.error(
314
+ Diagnostics.Subpattern_flags_must_be_present_when_there_is_a_minus_sign,
315
+ flagsStart,
316
+ this.scanner.pos - flagsStart,
317
+ noArgs,
318
+ );
319
+ }
320
+ this.scanExpectedChar(CharacterCodes.colon);
321
+ isPreviousTermQuantifiable = true;
322
+ }
323
+ } else {
324
+ this.numberOfCapturingGroups++;
325
+ isPreviousTermQuantifiable = true;
326
+ }
327
+ this.scanDisjunction(true);
328
+ this.scanExpectedChar(CharacterCodes.closeParen);
329
+ continue;
330
+ case CharacterCodes.openBrace: {
331
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
332
+ const digitsStart = this.scanner.pos;
333
+ const min = this.scanDigits();
334
+ if (!this.anyUnicodeModeOrNonAnnexB && min === '') {
335
+ isPreviousTermQuantifiable = true;
336
+ continue;
337
+ }
338
+ if (this.char() === CharacterCodes.comma) {
339
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
340
+ const max = this.scanDigits();
341
+ if (min === '') {
342
+ if (max !== '' || this.char() === CharacterCodes.closeBrace) {
343
+ this.error(Diagnostics.Incomplete_quantifier_Digit_expected, digitsStart, 0, noArgs);
344
+ } else {
345
+ this.error(Diagnostics.Unexpected_0_Did_you_mean_to_escape_it_with_backslash, start, 1, [
346
+ String.fromCharCode(ch),
347
+ ]);
348
+ isPreviousTermQuantifiable = true;
349
+ continue;
350
+ }
351
+ } else if (
352
+ max !== '' &&
353
+ compareDecimalStrings(min, max) > 0 &&
354
+ (this.anyUnicodeModeOrNonAnnexB || this.char() === CharacterCodes.closeBrace)
355
+ ) {
356
+ this.error(
357
+ Diagnostics.Numbers_out_of_order_in_quantifier,
358
+ digitsStart,
359
+ this.scanner.pos - digitsStart,
360
+ noArgs,
361
+ );
362
+ }
363
+ } else if (min === '') {
364
+ if (this.anyUnicodeModeOrNonAnnexB)
365
+ this.error(Diagnostics.Unexpected_0_Did_you_mean_to_escape_it_with_backslash, start, 1, [
366
+ String.fromCharCode(ch),
367
+ ]);
368
+ isPreviousTermQuantifiable = true;
369
+ continue;
370
+ }
371
+ if (this.char() !== CharacterCodes.closeBrace) {
372
+ if (!this.anyUnicodeModeOrNonAnnexB) {
373
+ isPreviousTermQuantifiable = true;
374
+ continue;
375
+ }
376
+ this.error(Diagnostics.X_0_expected, this.scanner.pos, 0, ['}']);
377
+ this.scanner.pos = (this.scanner.pos - 1) | 0;
378
+ }
379
+ isPreviousTermQuantifiable = this.scanQuantifier(start, isPreviousTermQuantifiable);
380
+ continue;
381
+ }
382
+ case CharacterCodes.asterisk:
383
+ case CharacterCodes.plus:
384
+ case CharacterCodes.question:
385
+ isPreviousTermQuantifiable = this.scanQuantifier(start, isPreviousTermQuantifiable);
386
+ continue;
387
+ case CharacterCodes.dot:
388
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
389
+ isPreviousTermQuantifiable = true;
390
+ continue;
391
+ case CharacterCodes.openBracket:
392
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
393
+ if (this.unicodeSetsMode) this.scanClassSetExpression();
394
+ else this.scanClassRanges();
395
+ this.scanExpectedChar(CharacterCodes.closeBracket);
396
+ isPreviousTermQuantifiable = true;
397
+ continue;
398
+ case CharacterCodes.closeParen:
399
+ case CharacterCodes.closeBracket:
400
+ case CharacterCodes.closeBrace:
401
+ if (ch === CharacterCodes.closeParen && isInGroup) return;
402
+ if (this.anyUnicodeModeOrNonAnnexB || ch === CharacterCodes.closeParen)
403
+ this.error(Diagnostics.Unexpected_0_Did_you_mean_to_escape_it_with_backslash, this.scanner.pos, 1, [
404
+ String.fromCharCode(ch),
405
+ ]);
406
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
407
+ isPreviousTermQuantifiable = true;
408
+ continue;
409
+ case CharacterCodes.slash:
410
+ case CharacterCodes.bar:
411
+ return;
412
+ default:
413
+ this.scanSourceCharacter();
414
+ isPreviousTermQuantifiable = true;
415
+ continue;
416
+ }
417
+ }
418
+ }
419
+
420
+ /** Scans the last character of a quantifier and an optional `?`; returns false. */
421
+ private scanQuantifier(start: number, isPreviousTermQuantifiable: boolean): boolean {
422
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
423
+ if (this.char() === CharacterCodes.question) this.scanner.pos = (this.scanner.pos + 1) | 0; // non-greedy
424
+ if (!isPreviousTermQuantifiable)
425
+ this.error(Diagnostics.There_is_nothing_available_for_repetition, start, this.scanner.pos - start, noArgs);
426
+ return false;
427
+ }
428
+
429
+ private scanPatternModifiers(currentFlags: RegularExpressionFlags): RegularExpressionFlags {
430
+ while (this.scanner.pos < this.end) {
431
+ const ch = codePointAt(this.text, this.scanner.pos, this.end);
432
+ if (ch === CharacterCodes.replacementCharacter || !isIdentifierPart(ch)) break;
433
+ const size = charSize(ch);
434
+ const flag = regularExpressionFlag(ch);
435
+ if (flag === RegularExpressionFlags.None)
436
+ this.error(Diagnostics.Unknown_regular_expression_flag, this.scanner.pos, size, noArgs);
437
+ else if ((currentFlags & flag) !== 0)
438
+ this.error(Diagnostics.Duplicate_regular_expression_flag, this.scanner.pos, size, noArgs);
439
+ else if ((flag & RegularExpressionFlags.Modifiers) === 0)
440
+ this.error(
441
+ Diagnostics.This_regular_expression_flag_cannot_be_toggled_within_a_subpattern,
442
+ this.scanner.pos,
443
+ size,
444
+ noArgs,
445
+ );
446
+ else {
447
+ currentFlags |= flag;
448
+ this.scanner.checkRegularExpressionFlagAvailability(flag, this.scanner.pos, size);
449
+ }
450
+ this.scanner.pos = (this.scanner.pos + size) | 0;
451
+ }
452
+ return currentFlags;
453
+ }
454
+
455
+ // AtomEscape ::= DecimalEscape | CharacterClassEscape | CharacterEscape | 'k<' RegExpIdentifierName '>'
456
+ private scanAtomEscape(ch: number): void {
457
+ switch (ch) {
458
+ case CharacterCodes.k:
459
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
460
+ if (this.char() === CharacterCodes.lessThan) {
461
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
462
+ this.scanGroupName(true);
463
+ this.scanExpectedChar(CharacterCodes.greaterThan);
464
+ } else if (this.anyUnicodeModeOrNonAnnexB || this.namedCaptureGroups) {
465
+ this.error(
466
+ Diagnostics.X_k_must_be_followed_by_a_capturing_group_name_enclosed_in_angle_brackets,
467
+ this.scanner.pos - 2,
468
+ 2,
469
+ noArgs,
470
+ );
471
+ }
472
+ return;
473
+ case CharacterCodes.q:
474
+ if (this.unicodeSetsMode) {
475
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
476
+ this.error(Diagnostics.X_q_is_only_available_inside_character_class, this.scanner.pos - 2, 2, noArgs);
477
+ return;
478
+ }
479
+ break;
480
+ }
481
+ // Regex literals cannot contain line breaks, so a character escape always consumes something.
482
+ if (!this.scanCharacterClassEscape() && !this.scanDecimalEscape()) this.scanCharacterEscape(true);
483
+ }
484
+
485
+ // DecimalEscape ::= [1-9] [0-9]*
486
+ private scanDecimalEscape(): boolean {
487
+ const ch = this.char();
488
+ if (ch < CharacterCodes._1 || ch > CharacterCodes._9) return false;
489
+ const start = this.scanner.pos;
490
+ const digits = this.scanDigits();
491
+ this.decimalEscapes.push(new DecimalEscape(start, this.scanner.pos, Number(digits)));
492
+ return true;
493
+ }
494
+
495
+ // CharacterEscape ::= 'c' ControlLetter | IdentityEscape | (sequences handled by scanEscapeSequence)
496
+ private scanCharacterEscape(atomEscape: boolean): number {
497
+ let ch = this.char();
498
+ switch (ch) {
499
+ case CharacterCodes.EOF:
500
+ this.error(Diagnostics.Undetermined_character_escape, this.scanner.pos - 1, 1, noArgs);
501
+ return CharacterCodes.backslash;
502
+ case CharacterCodes.c:
503
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
504
+ ch = this.char();
505
+ if (isASCIILetter(ch)) {
506
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
507
+ return ch & 0x1f;
508
+ }
509
+ if (this.anyUnicodeModeOrNonAnnexB) {
510
+ this.error(Diagnostics.X_c_must_be_followed_by_an_ASCII_letter, this.scanner.pos - 2, 2, noArgs);
511
+ } else if (atomEscape) {
512
+ this.scanner.pos = (this.scanner.pos - 1) | 0;
513
+ return CharacterCodes.backslash;
514
+ }
515
+ return ch < 0 ? CharacterCodes.replacementCharacter : ch;
516
+ case CharacterCodes.caret:
517
+ case CharacterCodes.$:
518
+ case CharacterCodes.slash:
519
+ case CharacterCodes.backslash:
520
+ case CharacterCodes.dot:
521
+ case CharacterCodes.asterisk:
522
+ case CharacterCodes.plus:
523
+ case CharacterCodes.question:
524
+ case CharacterCodes.openParen:
525
+ case CharacterCodes.closeParen:
526
+ case CharacterCodes.openBracket:
527
+ case CharacterCodes.closeBracket:
528
+ case CharacterCodes.openBrace:
529
+ case CharacterCodes.closeBrace:
530
+ case CharacterCodes.bar:
531
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
532
+ return ch;
533
+ default: {
534
+ this.scanner.pos = (this.scanner.pos - 1) | 0; // include the backslash
535
+ let flags = EscapeSequenceScanningFlags.RegularExpression;
536
+ if (this.annexB) flags |= EscapeSequenceScanningFlags.AnnexB;
537
+ if (this.anyUnicodeMode) flags |= EscapeSequenceScanningFlags.AnyUnicodeMode;
538
+ if (atomEscape) flags |= EscapeSequenceScanningFlags.AtomEscape;
539
+ const value = this.scanner.scanEscapeCodePoint(flags);
540
+ return value === EscapeValue.Raw ? ClassValue.String : value;
541
+ }
542
+ }
543
+ }
544
+
545
+ private scanGroupName(isReference: boolean): void {
546
+ const scanner = this.scanner;
547
+ scanner.tokenStart = this.scanner.pos | 0;
548
+ scanner.scanIdentifier(0);
549
+ const start = scanner.tokenStart;
550
+ if (this.scanner.pos === start) {
551
+ this.error(Diagnostics.Expected_a_capturing_group_name, this.scanner.pos, 0, noArgs);
552
+ return;
553
+ }
554
+ const name = scanner.getTokenValue();
555
+ if (isReference) {
556
+ this.groupNameReferences.push(new GroupNameReference(start, this.scanner.pos, name));
557
+ } else if (this.namedCapturingGroupsContains(name)) {
558
+ this.error(
559
+ Diagnostics.Named_capturing_groups_with_the_same_name_must_be_mutually_exclusive_to_each_other,
560
+ start,
561
+ this.scanner.pos - start,
562
+ noArgs,
563
+ );
564
+ } else {
565
+ if (this.namedCapturingGroups.length > 0)
566
+ this.namedCapturingGroups[this.namedCapturingGroups.length - 1]!.add(name);
567
+ this.groupSpecifiers.add(name);
568
+ }
569
+ }
570
+
571
+ private namedCapturingGroupsContains(name: string): boolean {
572
+ for (const group of this.namedCapturingGroups) if (group.has(name)) return true;
573
+ return false;
574
+ }
575
+
576
+ private isClassContentExit(ch: number): boolean {
577
+ return ch === CharacterCodes.closeBracket || this.scanner.pos >= this.end;
578
+ }
579
+
580
+ // ClassRanges ::= '^'? (ClassAtom ('-' ClassAtom)?)*
581
+ // Returns MayContainStrings, which is false for class ranges.
582
+ private scanClassRanges(): boolean {
583
+ if (this.char() === CharacterCodes.caret) this.scanner.pos = (this.scanner.pos + 1) | 0;
584
+ while (this.scanner.pos < this.end) {
585
+ if (this.isClassContentExit(this.char())) return false;
586
+ const minStart = this.scanner.pos;
587
+ const min = this.scanClassAtom();
588
+ if (this.char() !== CharacterCodes.minus) continue;
589
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
590
+ if (this.isClassContentExit(this.char())) return false;
591
+ if (min === ClassValue.None && this.anyUnicodeModeOrNonAnnexB)
592
+ this.error(
593
+ Diagnostics.A_character_class_range_must_not_be_bounded_by_another_character_class,
594
+ minStart,
595
+ this.scanner.pos - 1 - minStart,
596
+ noArgs,
597
+ );
598
+ const maxStart = this.scanner.pos;
599
+ const max = this.scanClassAtom();
600
+ if (max === ClassValue.None && this.anyUnicodeModeOrNonAnnexB) {
601
+ this.error(
602
+ Diagnostics.A_character_class_range_must_not_be_bounded_by_another_character_class,
603
+ maxStart,
604
+ this.scanner.pos - maxStart,
605
+ noArgs,
606
+ );
607
+ continue;
608
+ }
609
+ if (min >= 0 && max >= 0 && min > max)
610
+ this.error(Diagnostics.Range_out_of_order_in_character_class, minStart, this.scanner.pos - minStart, noArgs);
611
+ }
612
+ return false;
613
+ }
614
+
615
+ // ClassSetExpression ::= '^'? (ClassUnion | ClassIntersection | ClassSubtraction)
616
+ // ClassUnion ::= (ClassSetRange | ClassSetOperand)*
617
+ // ClassIntersection ::= ClassSetOperand ('&&' ClassSetOperand)+
618
+ // ClassSubtraction ::= ClassSetOperand ('--' ClassSetOperand)+
619
+ // ClassSetRange ::= ClassSetCharacter '-' ClassSetCharacter
620
+ //
621
+ // mayContainStrings tracks the MayContainStrings static semantics: some operand of a
622
+ // union, every operand of an intersection, or the first operand of a subtraction.
623
+ private scanClassSetExpression(): boolean {
624
+ let isCharacterComplement = false;
625
+ if (this.char() === CharacterCodes.caret) {
626
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
627
+ isCharacterComplement = true;
628
+ }
629
+ let expressionMayContainStrings = false;
630
+ let ch = this.char();
631
+ if (this.isClassContentExit(ch)) return this.mayContainStrings;
632
+ let start = this.scanner.pos;
633
+ let operand: number = ClassValue.None;
634
+ if (this.isDoublePunctuatorOperator()) {
635
+ this.error(Diagnostics.Expected_a_class_set_operand, this.scanner.pos, 0, noArgs);
636
+ this.mayContainStrings = false;
637
+ } else {
638
+ operand = this.scanClassSetOperand();
639
+ }
640
+ switch (this.char()) {
641
+ case CharacterCodes.minus:
642
+ if (this.scanner.pos + 1 < this.end && this.charAt(this.scanner.pos + 1) === CharacterCodes.minus) {
643
+ if (isCharacterComplement && this.mayContainStrings)
644
+ this.error(
645
+ Diagnostics.Anything_that_would_possibly_match_more_than_a_single_character_is_invalid_inside_a_negated_character_class,
646
+ start,
647
+ this.scanner.pos - start,
648
+ noArgs,
649
+ );
650
+ expressionMayContainStrings = this.mayContainStrings;
651
+ this.scanClassSetSubExpression(ClassSetExpressionType.ClassSubtraction);
652
+ this.mayContainStrings = !isCharacterComplement && expressionMayContainStrings;
653
+ return this.mayContainStrings;
654
+ }
655
+ break;
656
+ case CharacterCodes.ampersand:
657
+ if (this.scanner.pos + 1 < this.end && this.charAt(this.scanner.pos + 1) === CharacterCodes.ampersand) {
658
+ this.scanClassSetSubExpression(ClassSetExpressionType.ClassIntersection);
659
+ if (isCharacterComplement && this.mayContainStrings)
660
+ this.error(
661
+ Diagnostics.Anything_that_would_possibly_match_more_than_a_single_character_is_invalid_inside_a_negated_character_class,
662
+ start,
663
+ this.scanner.pos - start,
664
+ noArgs,
665
+ );
666
+ expressionMayContainStrings = this.mayContainStrings;
667
+ this.mayContainStrings = !isCharacterComplement && expressionMayContainStrings;
668
+ return this.mayContainStrings;
669
+ }
670
+ this.error(Diagnostics.Unexpected_0_Did_you_mean_to_escape_it_with_backslash, this.scanner.pos, 1, [
671
+ String.fromCharCode(ch),
672
+ ]);
673
+ break;
674
+ default:
675
+ if (isCharacterComplement && this.mayContainStrings)
676
+ this.error(
677
+ Diagnostics.Anything_that_would_possibly_match_more_than_a_single_character_is_invalid_inside_a_negated_character_class,
678
+ start,
679
+ this.scanner.pos - start,
680
+ noArgs,
681
+ );
682
+ expressionMayContainStrings = this.mayContainStrings;
683
+ break;
684
+ }
685
+ while (this.scanner.pos < this.end) {
686
+ ch = this.char();
687
+ if (ch === CharacterCodes.minus) {
688
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
689
+ ch = this.char();
690
+ if (this.isClassContentExit(ch)) {
691
+ this.mayContainStrings = !isCharacterComplement && expressionMayContainStrings;
692
+ return this.mayContainStrings;
693
+ }
694
+ if (ch === CharacterCodes.minus) {
695
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
696
+ this.error(
697
+ Diagnostics.Operators_must_not_be_mixed_within_a_character_class_Wrap_it_in_a_nested_class_instead,
698
+ this.scanner.pos - 2,
699
+ 2,
700
+ noArgs,
701
+ );
702
+ start = this.scanner.pos - 2;
703
+ operand = ClassValue.String;
704
+ continue;
705
+ }
706
+ if (operand === ClassValue.None)
707
+ this.error(
708
+ Diagnostics.A_character_class_range_must_not_be_bounded_by_another_character_class,
709
+ start,
710
+ this.scanner.pos - 1 - start,
711
+ noArgs,
712
+ );
713
+ const secondStart = this.scanner.pos;
714
+ const secondOperand = this.scanClassSetOperand();
715
+ if (isCharacterComplement && this.mayContainStrings)
716
+ this.error(
717
+ Diagnostics.Anything_that_would_possibly_match_more_than_a_single_character_is_invalid_inside_a_negated_character_class,
718
+ secondStart,
719
+ this.scanner.pos - secondStart,
720
+ noArgs,
721
+ );
722
+ expressionMayContainStrings = expressionMayContainStrings || this.mayContainStrings;
723
+ if (secondOperand === ClassValue.None) {
724
+ this.error(
725
+ Diagnostics.A_character_class_range_must_not_be_bounded_by_another_character_class,
726
+ secondStart,
727
+ this.scanner.pos - secondStart,
728
+ noArgs,
729
+ );
730
+ } else if (operand >= 0 && secondOperand >= 0 && operand > secondOperand) {
731
+ this.error(Diagnostics.Range_out_of_order_in_character_class, start, this.scanner.pos - start, noArgs);
732
+ }
733
+ } else if (ch === CharacterCodes.ampersand) {
734
+ start = this.scanner.pos;
735
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
736
+ if (this.char() === CharacterCodes.ampersand) {
737
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
738
+ this.error(
739
+ Diagnostics.Operators_must_not_be_mixed_within_a_character_class_Wrap_it_in_a_nested_class_instead,
740
+ this.scanner.pos - 2,
741
+ 2,
742
+ noArgs,
743
+ );
744
+ if (this.char() === CharacterCodes.ampersand) {
745
+ this.error(Diagnostics.Unexpected_0_Did_you_mean_to_escape_it_with_backslash, this.scanner.pos, 1, [
746
+ String.fromCharCode(ch),
747
+ ]);
748
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
749
+ }
750
+ } else {
751
+ this.error(Diagnostics.Unexpected_0_Did_you_mean_to_escape_it_with_backslash, this.scanner.pos - 1, 1, [
752
+ String.fromCharCode(ch),
753
+ ]);
754
+ }
755
+ operand = this.scanner.pos - start === 1 ? CharacterCodes.ampersand : ClassValue.String;
756
+ continue;
757
+ }
758
+ if (this.isClassContentExit(this.char())) break;
759
+ start = this.scanner.pos;
760
+ if (this.isDoublePunctuatorOperator()) {
761
+ this.error(
762
+ Diagnostics.Operators_must_not_be_mixed_within_a_character_class_Wrap_it_in_a_nested_class_instead,
763
+ this.scanner.pos,
764
+ 2,
765
+ noArgs,
766
+ );
767
+ this.scanner.pos = (this.scanner.pos + 2) | 0;
768
+ operand = ClassValue.String;
769
+ } else {
770
+ operand = this.scanClassSetOperand();
771
+ }
772
+ }
773
+ this.mayContainStrings = !isCharacterComplement && expressionMayContainStrings;
774
+ return this.mayContainStrings;
775
+ }
776
+
777
+ /** Whether `--` or `&&` starts at the current position. */
778
+ private isDoublePunctuatorOperator(): boolean {
779
+ if (this.scanner.pos + 1 >= this.end) return false;
780
+ const ch = this.text.charCodeAt(this.scanner.pos);
781
+ return (
782
+ (ch === CharacterCodes.minus || ch === CharacterCodes.ampersand) &&
783
+ this.text.charCodeAt(this.scanner.pos + 1) === ch
784
+ );
785
+ }
786
+
787
+ private scanClassSetSubExpression(expressionType: ClassSetExpressionType): void {
788
+ let expressionMayContainStrings = this.mayContainStrings;
789
+ while (this.scanner.pos < this.end) {
790
+ let ch = this.char();
791
+ if (this.isClassContentExit(ch)) break;
792
+ if (ch === CharacterCodes.minus) {
793
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
794
+ if (this.char() === CharacterCodes.minus) {
795
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
796
+ if (expressionType !== ClassSetExpressionType.ClassSubtraction)
797
+ this.error(
798
+ Diagnostics.Operators_must_not_be_mixed_within_a_character_class_Wrap_it_in_a_nested_class_instead,
799
+ this.scanner.pos - 2,
800
+ 2,
801
+ noArgs,
802
+ );
803
+ } else {
804
+ this.error(
805
+ Diagnostics.Operators_must_not_be_mixed_within_a_character_class_Wrap_it_in_a_nested_class_instead,
806
+ this.scanner.pos - 1,
807
+ 1,
808
+ noArgs,
809
+ );
810
+ }
811
+ } else if (ch === CharacterCodes.ampersand) {
812
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
813
+ if (this.char() === CharacterCodes.ampersand) {
814
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
815
+ if (expressionType !== ClassSetExpressionType.ClassIntersection)
816
+ this.error(
817
+ Diagnostics.Operators_must_not_be_mixed_within_a_character_class_Wrap_it_in_a_nested_class_instead,
818
+ this.scanner.pos - 2,
819
+ 2,
820
+ noArgs,
821
+ );
822
+ if (this.char() === CharacterCodes.ampersand) {
823
+ this.error(Diagnostics.Unexpected_0_Did_you_mean_to_escape_it_with_backslash, this.scanner.pos, 1, [
824
+ String.fromCharCode(ch),
825
+ ]);
826
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
827
+ }
828
+ } else {
829
+ this.error(Diagnostics.Unexpected_0_Did_you_mean_to_escape_it_with_backslash, this.scanner.pos - 1, 1, [
830
+ String.fromCharCode(ch),
831
+ ]);
832
+ }
833
+ } else if (expressionType === ClassSetExpressionType.ClassSubtraction) {
834
+ this.error(Diagnostics.X_0_expected, this.scanner.pos, 0, ['--']);
835
+ } else if (expressionType === ClassSetExpressionType.ClassIntersection) {
836
+ this.error(Diagnostics.X_0_expected, this.scanner.pos, 0, ['&&']);
837
+ }
838
+ ch = this.char();
839
+ if (this.isClassContentExit(ch)) {
840
+ this.error(Diagnostics.Expected_a_class_set_operand, this.scanner.pos, 0, noArgs);
841
+ break;
842
+ }
843
+ this.scanClassSetOperand();
844
+ if (expressionType === ClassSetExpressionType.ClassIntersection)
845
+ expressionMayContainStrings = expressionMayContainStrings && this.mayContainStrings;
846
+ }
847
+ this.mayContainStrings = expressionMayContainStrings;
848
+ }
849
+
850
+ // ClassSetOperand ::= '[' ClassSetExpression ']' | '\' CharacterClassEscape | '\q{' ClassStringDisjunctionContents '}' | ClassSetCharacter
851
+ private scanClassSetOperand(): number {
852
+ this.mayContainStrings = false;
853
+ const ch = this.char();
854
+ if (ch === CharacterCodes.openBracket) {
855
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
856
+ this.scanClassSetExpression();
857
+ this.scanExpectedChar(CharacterCodes.closeBracket);
858
+ return ClassValue.None;
859
+ }
860
+ if (ch === CharacterCodes.backslash) {
861
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
862
+ if (this.scanCharacterClassEscape()) return ClassValue.None;
863
+ if (this.char() === CharacterCodes.q) {
864
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
865
+ if (this.char() === CharacterCodes.openBrace) {
866
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
867
+ this.scanClassStringDisjunctionContents();
868
+ this.scanExpectedChar(CharacterCodes.closeBrace);
869
+ return ClassValue.None;
870
+ }
871
+ this.error(
872
+ Diagnostics.X_q_must_be_followed_by_string_alternatives_enclosed_in_braces,
873
+ this.scanner.pos - 2,
874
+ 2,
875
+ noArgs,
876
+ );
877
+ return CharacterCodes.q;
878
+ }
879
+ this.scanner.pos = (this.scanner.pos - 1) | 0;
880
+ }
881
+ return this.scanClassSetCharacter();
882
+ }
883
+
884
+ // ClassStringDisjunctionContents ::= ClassSetCharacter* ('|' ClassSetCharacter*)*
885
+ private scanClassStringDisjunctionContents(): boolean {
886
+ let characterCount = 0;
887
+ while (this.scanner.pos < this.end) {
888
+ const ch = this.char();
889
+ if (ch === CharacterCodes.closeBrace) {
890
+ if (characterCount !== 1) this.mayContainStrings = true;
891
+ return this.mayContainStrings;
892
+ }
893
+ if (ch === CharacterCodes.bar) {
894
+ if (characterCount !== 1) this.mayContainStrings = true;
895
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
896
+ characterCount = 0;
897
+ } else {
898
+ this.scanClassSetCharacter();
899
+ characterCount++;
900
+ }
901
+ }
902
+ return this.mayContainStrings;
903
+ }
904
+
905
+ // ClassSetCharacter ::= SourceCharacter -- ClassSetSyntaxCharacter -- ClassSetReservedDoublePunctuator
906
+ // | '\' (CharacterEscape | ClassSetReservedPunctuator | 'b')
907
+ private scanClassSetCharacter(): number {
908
+ const ch = this.char();
909
+ if (ch === CharacterCodes.backslash) {
910
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
911
+ const inner = this.char();
912
+ switch (inner) {
913
+ case CharacterCodes.b:
914
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
915
+ return CharacterCodes.backspace;
916
+ case CharacterCodes.ampersand:
917
+ case CharacterCodes.minus:
918
+ case CharacterCodes.exclamation:
919
+ case CharacterCodes.hash:
920
+ case CharacterCodes.percent:
921
+ case CharacterCodes.comma:
922
+ case CharacterCodes.colon:
923
+ case CharacterCodes.semicolon:
924
+ case CharacterCodes.lessThan:
925
+ case CharacterCodes.equals:
926
+ case CharacterCodes.greaterThan:
927
+ case CharacterCodes.at:
928
+ case CharacterCodes.backtick:
929
+ case CharacterCodes.tilde:
930
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
931
+ return inner;
932
+ default:
933
+ return this.scanCharacterEscape(false);
934
+ }
935
+ }
936
+ if (this.scanner.pos + 1 < this.end && ch === this.charAt(this.scanner.pos + 1)) {
937
+ switch (ch) {
938
+ case CharacterCodes.ampersand:
939
+ case CharacterCodes.exclamation:
940
+ case CharacterCodes.hash:
941
+ case CharacterCodes.percent:
942
+ case CharacterCodes.asterisk:
943
+ case CharacterCodes.plus:
944
+ case CharacterCodes.comma:
945
+ case CharacterCodes.dot:
946
+ case CharacterCodes.colon:
947
+ case CharacterCodes.semicolon:
948
+ case CharacterCodes.lessThan:
949
+ case CharacterCodes.equals:
950
+ case CharacterCodes.greaterThan:
951
+ case CharacterCodes.question:
952
+ case CharacterCodes.at:
953
+ case CharacterCodes.backtick:
954
+ case CharacterCodes.tilde:
955
+ this.error(
956
+ Diagnostics.A_character_class_must_not_contain_a_reserved_double_punctuator_Did_you_mean_to_escape_it_with_backslash,
957
+ this.scanner.pos,
958
+ 2,
959
+ noArgs,
960
+ );
961
+ this.scanner.pos = (this.scanner.pos + 2) | 0;
962
+ return ClassValue.String;
963
+ }
964
+ }
965
+ switch (ch) {
966
+ case CharacterCodes.slash:
967
+ case CharacterCodes.openParen:
968
+ case CharacterCodes.closeParen:
969
+ case CharacterCodes.openBracket:
970
+ case CharacterCodes.closeBracket:
971
+ case CharacterCodes.openBrace:
972
+ case CharacterCodes.closeBrace:
973
+ case CharacterCodes.minus:
974
+ case CharacterCodes.bar:
975
+ this.error(Diagnostics.Unexpected_0_Did_you_mean_to_escape_it_with_backslash, this.scanner.pos, 1, [
976
+ String.fromCharCode(ch),
977
+ ]);
978
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
979
+ return ch;
980
+ }
981
+ return this.scanSourceCharacter();
982
+ }
983
+
984
+ // ClassAtom ::= SourceCharacter but not '\' or ']' | '\' ClassEscape
985
+ // ClassEscape ::= 'b' | '-' | CharacterClassEscape | CharacterEscape
986
+ private scanClassAtom(): number {
987
+ if (this.char() !== CharacterCodes.backslash) return this.scanSourceCharacter();
988
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
989
+ const ch = this.char();
990
+ if (ch === CharacterCodes.b) {
991
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
992
+ return CharacterCodes.backspace;
993
+ }
994
+ if (ch === CharacterCodes.minus) {
995
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
996
+ return CharacterCodes.minus;
997
+ }
998
+ if (this.scanCharacterClassEscape()) return ClassValue.None;
999
+ return this.scanCharacterEscape(false);
1000
+ }
1001
+
1002
+ // CharacterClassEscape ::= 'd' | 'D' | 's' | 'S' | 'w' | 'W'
1003
+ // | [+AnyUnicodeMode] ('P' | 'p') '{' UnicodePropertyValueExpression '}'
1004
+ private scanCharacterClassEscape(): boolean {
1005
+ const start = this.scanner.pos - 1;
1006
+ const ch = this.char();
1007
+ switch (ch) {
1008
+ case CharacterCodes.d:
1009
+ case CharacterCodes.D:
1010
+ case CharacterCodes.s:
1011
+ case CharacterCodes.S:
1012
+ case CharacterCodes.w:
1013
+ case CharacterCodes.W:
1014
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
1015
+ return true;
1016
+ case CharacterCodes.P:
1017
+ case CharacterCodes.p:
1018
+ break;
1019
+ default:
1020
+ return false;
1021
+ }
1022
+ const isCharacterComplement = ch === CharacterCodes.P;
1023
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
1024
+ if (this.char() !== CharacterCodes.openBrace) {
1025
+ if (!this.anyUnicodeModeOrNonAnnexB) {
1026
+ this.scanner.pos = (this.scanner.pos - 1) | 0;
1027
+ return false;
1028
+ }
1029
+ this.error(
1030
+ Diagnostics.X_0_must_be_followed_by_a_Unicode_property_value_expression_enclosed_in_braces,
1031
+ this.scanner.pos - 2,
1032
+ 2,
1033
+ [String.fromCharCode(ch)],
1034
+ );
1035
+ return true;
1036
+ }
1037
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
1038
+ const nameOrValueStart = this.scanner.pos;
1039
+ const nameOrValue = this.scanWordCharacters();
1040
+ if (this.char() === CharacterCodes.equals) {
1041
+ const propertyName = nonBinaryUnicodeProperties.get(nameOrValue) ?? '';
1042
+ if (this.scanner.pos === nameOrValueStart) {
1043
+ this.error(Diagnostics.Expected_a_Unicode_property_name, this.scanner.pos, 0, noArgs);
1044
+ } else if (propertyName === '') {
1045
+ this.error(
1046
+ Diagnostics.Unknown_Unicode_property_name,
1047
+ nameOrValueStart,
1048
+ this.scanner.pos - nameOrValueStart,
1049
+ noArgs,
1050
+ );
1051
+ const suggestion = getSpellingSuggestion(nameOrValue, mapKeys(nonBinaryUnicodeProperties));
1052
+ if (suggestion !== '')
1053
+ this.error(Diagnostics.Did_you_mean_0, nameOrValueStart, this.scanner.pos - nameOrValueStart, [suggestion]);
1054
+ }
1055
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
1056
+ const valueStart = this.scanner.pos;
1057
+ const value = this.scanWordCharacters();
1058
+ if (this.scanner.pos === valueStart) {
1059
+ this.error(Diagnostics.Expected_a_Unicode_property_value, this.scanner.pos, 0, noArgs);
1060
+ } else if (propertyName !== '') {
1061
+ const values = valuesOfNonBinaryUnicodeProperty(propertyName);
1062
+ if (!values.has(value)) {
1063
+ this.error(Diagnostics.Unknown_Unicode_property_value, valueStart, this.scanner.pos - valueStart, noArgs);
1064
+ const suggestion = getSpellingSuggestion(value, setToArray(values));
1065
+ if (suggestion !== '')
1066
+ this.error(Diagnostics.Did_you_mean_0, valueStart, this.scanner.pos - valueStart, [suggestion]);
1067
+ }
1068
+ }
1069
+ } else if (this.scanner.pos === nameOrValueStart) {
1070
+ this.error(Diagnostics.Expected_a_Unicode_property_name_or_value, this.scanner.pos, 0, noArgs);
1071
+ } else if (binaryUnicodePropertiesOfStrings.has(nameOrValue)) {
1072
+ if (!this.unicodeSetsMode)
1073
+ this.error(
1074
+ Diagnostics.Any_Unicode_property_that_would_possibly_match_more_than_a_single_character_is_only_available_when_the_Unicode_Sets_v_flag_is_set,
1075
+ nameOrValueStart,
1076
+ this.scanner.pos - nameOrValueStart,
1077
+ noArgs,
1078
+ );
1079
+ else if (isCharacterComplement)
1080
+ this.error(
1081
+ Diagnostics.Anything_that_would_possibly_match_more_than_a_single_character_is_invalid_inside_a_negated_character_class,
1082
+ nameOrValueStart,
1083
+ this.scanner.pos - nameOrValueStart,
1084
+ noArgs,
1085
+ );
1086
+ else this.mayContainStrings = true;
1087
+ } else if (!generalCategoryValues.has(nameOrValue) && !binaryUnicodeProperties.has(nameOrValue)) {
1088
+ this.error(
1089
+ Diagnostics.Unknown_Unicode_property_name_or_value,
1090
+ nameOrValueStart,
1091
+ this.scanner.pos - nameOrValueStart,
1092
+ noArgs,
1093
+ );
1094
+ const candidates = setToArray(generalCategoryValues);
1095
+ for (const name of binaryUnicodeProperties) candidates.push(name);
1096
+ for (const name of binaryUnicodePropertiesOfStrings) candidates.push(name);
1097
+ const suggestion = getSpellingSuggestion(nameOrValue, candidates);
1098
+ if (suggestion !== '')
1099
+ this.error(Diagnostics.Did_you_mean_0, nameOrValueStart, this.scanner.pos - nameOrValueStart, [suggestion]);
1100
+ }
1101
+ this.scanExpectedChar(CharacterCodes.closeBrace);
1102
+ if (!this.anyUnicodeMode)
1103
+ this.error(
1104
+ Diagnostics.Unicode_property_value_expressions_are_only_available_when_the_Unicode_u_flag_or_the_Unicode_Sets_v_flag_is_set,
1105
+ start,
1106
+ this.scanner.pos - start,
1107
+ noArgs,
1108
+ );
1109
+ return true;
1110
+ }
1111
+
1112
+ private scanWordCharacters(): string {
1113
+ const start = this.scanner.pos;
1114
+ while (this.scanner.pos < this.end && isWordCharacter(this.char())) this.scanner.pos = (this.scanner.pos + 1) | 0;
1115
+ return this.text.substring(start, this.scanner.pos);
1116
+ }
1117
+
1118
+ /** One code point in Unicode modes, otherwise one UTF-16 code unit. */
1119
+ private scanSourceCharacter(): number {
1120
+ if (this.scanner.pos >= this.end) return ClassValue.None;
1121
+ if (!this.anyUnicodeMode) {
1122
+ const ch = this.scanner.chars[this.scanner.pos];
1123
+ this.scanner.pos = (this.scanner.pos + 1) | 0;
1124
+ return ch;
1125
+ }
1126
+ const ch = this.scanner.codePointAt(this.scanner.pos, this.end);
1127
+ this.scanner.pos = (this.scanner.pos + charSize(ch)) | 0;
1128
+ // Like TypeScript 7, treat U+FFFD as an undecodable character.
1129
+ return ch === CharacterCodes.replacementCharacter ? ClassValue.None : ch;
1130
+ }
1131
+
1132
+ private scanExpectedChar(ch: number): void {
1133
+ if (this.char() === ch) this.scanner.pos = (this.scanner.pos + 1) | 0;
1134
+ else this.error(Diagnostics.X_0_expected, this.scanner.pos, 0, [String.fromCharCode(ch)]);
1135
+ }
1136
+
1137
+ private scanDigits(): string {
1138
+ const start = this.scanner.pos;
1139
+ while (this.scanner.pos < this.end && isDigit(this.char())) this.scanner.pos = (this.scanner.pos + 1) | 0;
1140
+ return this.text.substring(start, this.scanner.pos);
1141
+ }
1142
+ }