tsc-ts 0.0.10 → 0.1.1

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 (379) hide show
  1. package/README.md +1 -1
  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 +29 -18
  6. package/dist/api/compiler/ast.js +1040 -1007
  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 +173 -123
  12. package/dist/api/compiler/checker-classes.d.ts +14 -3
  13. package/dist/api/compiler/checker-classes.js +136 -91
  14. package/dist/api/compiler/checker-contextual.d.ts +20 -0
  15. package/dist/api/compiler/checker-contextual.js +175 -62
  16. package/dist/api/compiler/checker-declaration-order.js +79 -79
  17. package/dist/api/compiler/checker-declarations.d.ts +1 -0
  18. package/dist/api/compiler/checker-declarations.js +160 -136
  19. package/dist/api/compiler/checker-declared-types.js +67 -65
  20. package/dist/api/compiler/checker-decorators.js +77 -77
  21. package/dist/api/compiler/checker-deprecation.d.ts +8 -3
  22. package/dist/api/compiler/checker-deprecation.js +76 -55
  23. package/dist/api/compiler/checker-destructuring.js +47 -45
  24. package/dist/api/compiler/checker-elaboration.js +24 -24
  25. package/dist/api/compiler/checker-emit-helpers.js +4 -4
  26. package/dist/api/compiler/checker-emit-resolver.d.ts +4 -2
  27. package/dist/api/compiler/checker-emit-resolver.js +25 -13
  28. package/dist/api/compiler/checker-evaluator.js +9 -9
  29. package/dist/api/compiler/checker-expressions.js +258 -212
  30. package/dist/api/compiler/checker-functions.js +113 -107
  31. package/dist/api/compiler/checker-generated-code.d.ts +0 -11
  32. package/dist/api/compiler/checker-generated-code.js +28 -52
  33. package/dist/api/compiler/checker-grammar.d.ts +1 -0
  34. package/dist/api/compiler/checker-grammar.js +469 -438
  35. package/dist/api/compiler/checker-heritage.js +91 -93
  36. package/dist/api/compiler/checker-inference.d.ts +77 -5
  37. package/dist/api/compiler/checker-inference.js +487 -113
  38. package/dist/api/compiler/checker-iteration.d.ts +0 -10
  39. package/dist/api/compiler/checker-iteration.js +35 -52
  40. package/dist/api/compiler/checker-javascript.js +14 -14
  41. package/dist/api/compiler/checker-jsdoc.d.ts +8 -10
  42. package/dist/api/compiler/checker-jsdoc.js +67 -58
  43. package/dist/api/compiler/checker-jsx.js +107 -89
  44. package/dist/api/compiler/checker-members.d.ts +9 -2
  45. package/dist/api/compiler/checker-members.js +210 -74
  46. package/dist/api/compiler/checker-modules.d.ts +15 -6
  47. package/dist/api/compiler/checker-modules.js +469 -309
  48. package/dist/api/compiler/checker-narrowing.js +273 -189
  49. package/dist/api/compiler/checker-object-literals.js +25 -22
  50. package/dist/api/compiler/checker-operators.js +126 -118
  51. package/dist/api/compiler/checker-overloads.js +27 -27
  52. package/dist/api/compiler/checker-property-access.js +59 -55
  53. package/dist/api/compiler/checker-services.d.ts +1 -0
  54. package/dist/api/compiler/checker-services.js +222 -210
  55. package/dist/api/compiler/checker-signatures.js +65 -49
  56. package/dist/api/compiler/checker-source-file.d.ts +5 -0
  57. package/dist/api/compiler/checker-source-file.js +154 -130
  58. package/dist/api/compiler/checker-statements.js +33 -32
  59. package/dist/api/compiler/checker-super.js +50 -50
  60. package/dist/api/compiler/checker-symbol-types.js +109 -93
  61. package/dist/api/compiler/checker-symbols.d.ts +13 -1
  62. package/dist/api/compiler/checker-symbols.js +264 -149
  63. package/dist/api/compiler/checker-type-factory.d.ts +5 -0
  64. package/dist/api/compiler/checker-type-factory.js +190 -46
  65. package/dist/api/compiler/checker-type-nodes.d.ts +1 -0
  66. package/dist/api/compiler/checker-type-nodes.js +179 -141
  67. package/dist/api/compiler/checker-type-operators.d.ts +2 -0
  68. package/dist/api/compiler/checker-type-operators.js +110 -63
  69. package/dist/api/compiler/checker-types.d.ts +80 -3
  70. package/dist/api/compiler/checker-types.js +121 -2
  71. package/dist/api/compiler/checker-unused.js +114 -118
  72. package/dist/api/compiler/checker-utilities.js +11 -11
  73. package/dist/api/compiler/checker.d.ts +97 -31
  74. package/dist/api/compiler/checker.js +149 -35
  75. package/dist/api/compiler/command-line.d.ts +1 -3
  76. package/dist/api/compiler/command-line.js +47 -44
  77. package/dist/api/compiler/compile-program.d.ts +24 -4
  78. package/dist/api/compiler/compile-program.js +53 -26
  79. package/dist/api/compiler/diagnostic-messages.d.ts +1849 -1774
  80. package/dist/api/compiler/diagnostic-messages.js +128 -122
  81. package/dist/api/compiler/diagnostics.js +7 -7
  82. package/dist/api/compiler/emitter.d.ts +7 -1
  83. package/dist/api/compiler/emitter.js +53 -11
  84. package/dist/api/compiler/expr-record.d.ts +11 -0
  85. package/dist/api/compiler/expr-record.js +53 -0
  86. package/dist/api/compiler/file-include.d.ts +2 -1
  87. package/dist/api/compiler/file-include.js +11 -7
  88. package/dist/api/compiler/file-loader.d.ts +10 -0
  89. package/dist/api/compiler/file-loader.js +138 -41
  90. package/dist/api/compiler/identifier-name.d.ts +9 -0
  91. package/dist/api/compiler/identifier-name.js +10 -0
  92. package/dist/api/compiler/instantiation.d.ts +7 -0
  93. package/dist/api/compiler/instantiation.js +101 -49
  94. package/dist/api/compiler/jsdoc.js +27 -25
  95. package/dist/api/compiler/link-tables.d.ts +48 -18
  96. package/dist/api/compiler/link-tables.js +80 -37
  97. package/dist/api/compiler/locales/cs-CZ.d.ts +1 -1
  98. package/dist/api/compiler/locales/cs-CZ.js +1 -1
  99. package/dist/api/compiler/locales/de-DE.d.ts +1 -1
  100. package/dist/api/compiler/locales/de-DE.js +1 -1
  101. package/dist/api/compiler/locales/es-ES.d.ts +1 -1
  102. package/dist/api/compiler/locales/es-ES.js +1 -1
  103. package/dist/api/compiler/locales/fr-FR.d.ts +1 -1
  104. package/dist/api/compiler/locales/fr-FR.js +1 -1
  105. package/dist/api/compiler/locales/it-IT.d.ts +1 -1
  106. package/dist/api/compiler/locales/it-IT.js +1 -1
  107. package/dist/api/compiler/locales/ja-JP.d.ts +1 -1
  108. package/dist/api/compiler/locales/ja-JP.js +1 -1
  109. package/dist/api/compiler/locales/ko-KR.d.ts +1 -1
  110. package/dist/api/compiler/locales/ko-KR.js +1 -1
  111. package/dist/api/compiler/locales/pl-PL.d.ts +1 -1
  112. package/dist/api/compiler/locales/pl-PL.js +1 -1
  113. package/dist/api/compiler/locales/pt-BR.d.ts +1 -1
  114. package/dist/api/compiler/locales/pt-BR.js +1 -1
  115. package/dist/api/compiler/locales/ru-RU.d.ts +1 -1
  116. package/dist/api/compiler/locales/ru-RU.js +1 -1
  117. package/dist/api/compiler/locales/tr-TR.d.ts +1 -1
  118. package/dist/api/compiler/locales/tr-TR.js +1 -1
  119. package/dist/api/compiler/locales/zh-CN.d.ts +1 -1
  120. package/dist/api/compiler/locales/zh-CN.js +1 -1
  121. package/dist/api/compiler/locales/zh-TW.d.ts +1 -1
  122. package/dist/api/compiler/locales/zh-TW.js +1 -1
  123. package/dist/api/compiler/module-resolution-types.js +6 -6
  124. package/dist/api/compiler/module-resolution.d.ts +10 -1
  125. package/dist/api/compiler/module-resolution.js +115 -84
  126. package/dist/api/compiler/module-specifiers.d.ts +15 -0
  127. package/dist/api/compiler/module-specifiers.js +24 -18
  128. package/dist/api/compiler/name-resolver.js +74 -65
  129. package/dist/api/compiler/node-builder-names.d.ts +11 -3
  130. package/dist/api/compiler/node-builder-names.js +210 -90
  131. package/dist/api/compiler/node-builder-pseudo.js +29 -31
  132. package/dist/api/compiler/node-builder-reuse.js +23 -22
  133. package/dist/api/compiler/node-builder.d.ts +18 -1
  134. package/dist/api/compiler/node-builder.js +191 -102
  135. package/dist/api/compiler/option-declarations.d.ts +2 -6
  136. package/dist/api/compiler/option-declarations.js +315 -375
  137. package/dist/api/compiler/options.d.ts +15 -33
  138. package/dist/api/compiler/options.js +21 -54
  139. package/dist/api/compiler/output-paths.d.ts +4 -1
  140. package/dist/api/compiler/output-paths.js +6 -11
  141. package/dist/api/compiler/package-json.d.ts +3 -3
  142. package/dist/api/compiler/package-json.js +11 -10
  143. package/dist/api/compiler/parser.d.ts +42 -20
  144. package/dist/api/compiler/parser.js +318 -224
  145. package/dist/api/compiler/path.d.ts +9 -0
  146. package/dist/api/compiler/path.js +20 -3
  147. package/dist/api/compiler/printer/emit-context.d.ts +3 -1
  148. package/dist/api/compiler/printer/emit-context.js +16 -1
  149. package/dist/api/compiler/printer/factory-base.d.ts +2 -2
  150. package/dist/api/compiler/printer/factory-base.js +7 -3
  151. package/dist/api/compiler/printer/factory.js +6 -3
  152. package/dist/api/compiler/printer/helpers.js +10 -1
  153. package/dist/api/compiler/printer/name-generator.d.ts +1 -1
  154. package/dist/api/compiler/printer/name-generator.js +35 -16
  155. package/dist/api/compiler/printer/printer.d.ts +1 -0
  156. package/dist/api/compiler/printer/printer.js +306 -283
  157. package/dist/api/compiler/printer/utilities.js +149 -147
  158. package/dist/api/compiler/program-checker.d.ts +8 -2
  159. package/dist/api/compiler/program-checker.js +84 -34
  160. package/dist/api/compiler/program-utilities.d.ts +3 -1
  161. package/dist/api/compiler/program-utilities.js +28 -15
  162. package/dist/api/compiler/program.d.ts +2 -0
  163. package/dist/api/compiler/program.js +69 -57
  164. package/dist/api/compiler/pseudo-bigint.d.ts +2 -0
  165. package/dist/api/compiler/pseudo-bigint.js +18 -0
  166. package/dist/api/compiler/regexp-checker.d.ts +1 -1
  167. package/dist/api/compiler/regexp-checker.js +93 -76
  168. package/dist/api/compiler/relations.d.ts +27 -4
  169. package/dist/api/compiler/relations.js +337 -180
  170. package/dist/api/compiler/reparser.js +64 -59
  171. package/dist/api/compiler/scanner.d.ts +27 -2
  172. package/dist/api/compiler/scanner.js +181 -150
  173. package/dist/api/compiler/shared-results.d.ts +696 -0
  174. package/dist/api/compiler/shared-results.js +2905 -0
  175. package/dist/api/compiler/sourcemap.js +2 -2
  176. package/dist/api/compiler/symbol-accessibility.js +87 -74
  177. package/dist/api/compiler/symbol.d.ts +22 -13
  178. package/dist/api/compiler/symbol.js +15 -1
  179. package/dist/api/compiler/syntax-kind.d.ts +198 -197
  180. package/dist/api/compiler/transformers/alias-references.js +247 -139
  181. package/dist/api/compiler/transformers/async-utilities.js +25 -25
  182. package/dist/api/compiler/transformers/async.d.ts +0 -1
  183. package/dist/api/compiler/transformers/async.js +64 -77
  184. package/dist/api/compiler/transformers/class-fields.d.ts +1 -0
  185. package/dist/api/compiler/transformers/class-fields.js +81 -78
  186. package/dist/api/compiler/transformers/commonjs-module.js +18 -15
  187. package/dist/api/compiler/transformers/const-enum-inliner.js +1 -1
  188. package/dist/api/compiler/transformers/declarations-diagnostics.js +247 -244
  189. package/dist/api/compiler/transformers/declarations-pseudo.js +100 -100
  190. package/dist/api/compiler/transformers/declarations-resolver.d.ts +0 -3
  191. package/dist/api/compiler/transformers/declarations-syntactic.d.ts +1 -2
  192. package/dist/api/compiler/transformers/declarations-syntactic.js +134 -156
  193. package/dist/api/compiler/transformers/declarations-tracker.js +18 -18
  194. package/dist/api/compiler/transformers/declarations.d.ts +4 -1
  195. package/dist/api/compiler/transformers/declarations.js +307 -239
  196. package/dist/api/compiler/transformers/decorator-metadata.d.ts +1 -1
  197. package/dist/api/compiler/transformers/decorator-metadata.js +53 -45
  198. package/dist/api/compiler/transformers/decorator-utilities.js +24 -24
  199. package/dist/api/compiler/transformers/destructuring.js +19 -18
  200. package/dist/api/compiler/transformers/emit-resolver.js +1 -1
  201. package/dist/api/compiler/transformers/es-decorators.js +55 -55
  202. package/dist/api/compiler/transformers/external-module-info.js +3 -3
  203. package/dist/api/compiler/transformers/for-await.js +25 -25
  204. package/dist/api/compiler/transformers/import-elision.js +14 -14
  205. package/dist/api/compiler/transformers/jsx.js +12 -12
  206. package/dist/api/compiler/transformers/legacy-decorators.js +17 -17
  207. package/dist/api/compiler/transformers/module.js +8 -8
  208. package/dist/api/compiler/transformers/named-evaluation.js +4 -4
  209. package/dist/api/compiler/transformers/object-rest-spread.js +20 -20
  210. package/dist/api/compiler/transformers/optional-chain.js +10 -10
  211. package/dist/api/compiler/transformers/reference-resolver.d.ts +12 -1
  212. package/dist/api/compiler/transformers/reference-resolver.js +131 -69
  213. package/dist/api/compiler/transformers/runtime-syntax.js +35 -31
  214. package/dist/api/compiler/transformers/subtree-facts.js +47 -47
  215. package/dist/api/compiler/transformers/syntax-facts.js +56 -58
  216. package/dist/api/compiler/transformers/type-eraser.js +73 -66
  217. package/dist/api/compiler/transformers/type-serialization.js +24 -24
  218. package/dist/api/compiler/transformers/using.js +12 -12
  219. package/dist/api/compiler/transformers/utilities.js +77 -77
  220. package/dist/api/compiler/transformers/visitor-base.js +172 -172
  221. package/dist/api/compiler/transformers/visitor-hooks.js +6 -2
  222. package/dist/api/compiler/tsconfig.d.ts +10 -2
  223. package/dist/api/compiler/tsconfig.js +136 -48
  224. package/dist/api/compiler/type-printer.js +40 -3
  225. package/dist/api/compiler/types.d.ts +2 -1
  226. package/dist/api/library/ast.generated.d.ts +42 -39
  227. package/dist/api/library/ast.generated.js +1 -1
  228. package/dist/api/library/compiler-options.generated.d.ts +111 -100
  229. package/dist/api/library/compiler-options.generated.js +1 -1
  230. package/dist/api/library/disk.js +12 -1
  231. package/dist/api/library/enums.generated.d.ts +206 -206
  232. package/dist/api/library/enums.generated.js +206 -206
  233. package/dist/api/library/nodes.js +26 -26
  234. package/package.json +9 -9
  235. package/src/compiler/ast-utilities.ts +99 -7
  236. package/src/compiler/ast.ts +74 -38
  237. package/src/compiler/binder.ts +39 -4
  238. package/src/compiler/cgroup.ts +157 -0
  239. package/src/compiler/character-codes.ts +2 -2
  240. package/src/compiler/checker-calls.ts +76 -8
  241. package/src/compiler/checker-classes.ts +80 -25
  242. package/src/compiler/checker-contextual.ts +110 -1
  243. package/src/compiler/checker-declarations.ts +31 -4
  244. package/src/compiler/checker-declared-types.ts +8 -5
  245. package/src/compiler/checker-decorators.ts +1 -1
  246. package/src/compiler/checker-deprecation.ts +29 -8
  247. package/src/compiler/checker-destructuring.ts +10 -3
  248. package/src/compiler/checker-emit-helpers.ts +1 -0
  249. package/src/compiler/checker-emit-resolver.ts +16 -6
  250. package/src/compiler/checker-expressions.ts +95 -47
  251. package/src/compiler/checker-functions.ts +21 -6
  252. package/src/compiler/checker-generated-code.ts +2 -22
  253. package/src/compiler/checker-grammar.ts +133 -60
  254. package/src/compiler/checker-heritage.ts +22 -21
  255. package/src/compiler/checker-inference.ts +514 -87
  256. package/src/compiler/checker-iteration.ts +18 -31
  257. package/src/compiler/checker-javascript.ts +1 -1
  258. package/src/compiler/checker-jsdoc.ts +50 -27
  259. package/src/compiler/checker-jsx.ts +28 -5
  260. package/src/compiler/checker-members.ts +197 -55
  261. package/src/compiler/checker-modules.ts +332 -65
  262. package/src/compiler/checker-narrowing.ts +98 -19
  263. package/src/compiler/checker-object-literals.ts +3 -0
  264. package/src/compiler/checker-operators.ts +11 -4
  265. package/src/compiler/checker-property-access.ts +7 -2
  266. package/src/compiler/checker-services.ts +39 -12
  267. package/src/compiler/checker-signatures.ts +15 -1
  268. package/src/compiler/checker-source-file.ts +39 -13
  269. package/src/compiler/checker-statements.ts +3 -2
  270. package/src/compiler/checker-symbol-types.ts +29 -6
  271. package/src/compiler/checker-symbols.ts +158 -15
  272. package/src/compiler/checker-type-factory.ts +173 -35
  273. package/src/compiler/checker-type-nodes.ts +46 -3
  274. package/src/compiler/checker-type-operators.ts +83 -26
  275. package/src/compiler/checker-types.ts +147 -4
  276. package/src/compiler/checker-unused.ts +9 -14
  277. package/src/compiler/checker.ts +175 -41
  278. package/src/compiler/command-line.ts +28 -28
  279. package/src/compiler/compile-program.ts +59 -25
  280. package/src/compiler/decoder.ts +15 -5
  281. package/src/compiler/diagnostic-messages.ts +1973 -1892
  282. package/src/compiler/doctor-report.ts +133 -0
  283. package/src/compiler/emitter.ts +57 -8
  284. package/src/compiler/encoder.ts +23 -8
  285. package/src/compiler/expr-record.ts +59 -0
  286. package/src/compiler/file-include.ts +9 -3
  287. package/src/compiler/file-loader.ts +139 -32
  288. package/src/compiler/help.ts +10 -14
  289. package/src/compiler/identifier-name.ts +13 -0
  290. package/src/compiler/incremental.ts +86 -18
  291. package/src/compiler/init.ts +2 -7
  292. package/src/compiler/instantiation.ts +77 -22
  293. package/src/compiler/jsdoc.ts +7 -3
  294. package/src/compiler/link-tables.ts +82 -37
  295. package/src/compiler/locales/cs-CZ.ts +1 -1
  296. package/src/compiler/locales/de-DE.ts +1 -1
  297. package/src/compiler/locales/es-ES.ts +1 -1
  298. package/src/compiler/locales/fr-FR.ts +1 -1
  299. package/src/compiler/locales/it-IT.ts +1 -1
  300. package/src/compiler/locales/ja-JP.ts +1 -1
  301. package/src/compiler/locales/ko-KR.ts +1 -1
  302. package/src/compiler/locales/pl-PL.ts +1 -1
  303. package/src/compiler/locales/pt-BR.ts +1 -1
  304. package/src/compiler/locales/ru-RU.ts +1 -1
  305. package/src/compiler/locales/tr-TR.ts +1 -1
  306. package/src/compiler/locales/zh-CN.ts +1 -1
  307. package/src/compiler/locales/zh-TW.ts +1 -1
  308. package/src/compiler/module-resolution.ts +44 -8
  309. package/src/compiler/module-specifiers.ts +62 -20
  310. package/src/compiler/name-resolver.ts +9 -1
  311. package/src/compiler/node-builder-names.ts +236 -54
  312. package/src/compiler/node-builder-pseudo.ts +4 -7
  313. package/src/compiler/node-builder-reuse.ts +5 -4
  314. package/src/compiler/node-builder.ts +130 -31
  315. package/src/compiler/option-declarations.ts +33 -103
  316. package/src/compiler/options.ts +23 -62
  317. package/src/compiler/output-paths.ts +5 -18
  318. package/src/compiler/package-entrypoints.ts +345 -0
  319. package/src/compiler/package-json.ts +4 -4
  320. package/src/compiler/parallel-check.ts +543 -147
  321. package/src/compiler/parallel-emit.ts +4 -4
  322. package/src/compiler/parser.ts +166 -47
  323. package/src/compiler/path.ts +22 -2
  324. package/src/compiler/printer/emit-context.ts +16 -0
  325. package/src/compiler/printer/factory-base.ts +10 -3
  326. package/src/compiler/printer/factory.ts +7 -3
  327. package/src/compiler/printer/helpers.ts +10 -1
  328. package/src/compiler/printer/name-generator.ts +24 -2
  329. package/src/compiler/printer/printer.ts +39 -16
  330. package/src/compiler/printer/utilities.ts +8 -2
  331. package/src/compiler/program-checker.ts +53 -5
  332. package/src/compiler/program-utilities.ts +23 -10
  333. package/src/compiler/program.ts +13 -1
  334. package/src/compiler/pseudo-bigint.ts +17 -0
  335. package/src/compiler/regexp-checker.ts +63 -30
  336. package/src/compiler/relations.ts +233 -77
  337. package/src/compiler/reparser.ts +14 -5
  338. package/src/compiler/run-config.ts +1383 -0
  339. package/src/compiler/run-record-read.ts +87 -0
  340. package/src/compiler/run-records.ts +575 -0
  341. package/src/compiler/scanner.ts +166 -120
  342. package/src/compiler/shared-results.ts +3144 -0
  343. package/src/compiler/show-config.ts +18 -1
  344. package/src/compiler/sourcemap.ts +2 -2
  345. package/src/compiler/symbol-accessibility.ts +26 -3
  346. package/src/compiler/symbol.ts +31 -14
  347. package/src/compiler/syntax-kind.ts +188 -187
  348. package/src/compiler/thread-entry.ts +22 -3
  349. package/src/compiler/transformers/alias-references.ts +123 -4
  350. package/src/compiler/transformers/async.ts +2 -17
  351. package/src/compiler/transformers/class-fields.ts +13 -12
  352. package/src/compiler/transformers/commonjs-module.ts +11 -7
  353. package/src/compiler/transformers/declarations-diagnostics.ts +5 -3
  354. package/src/compiler/transformers/declarations-pseudo.ts +2 -4
  355. package/src/compiler/transformers/declarations-resolver.ts +0 -3
  356. package/src/compiler/transformers/declarations-syntactic.ts +1 -21
  357. package/src/compiler/transformers/declarations.ts +136 -49
  358. package/src/compiler/transformers/decorator-metadata.ts +9 -1
  359. package/src/compiler/transformers/destructuring.ts +4 -3
  360. package/src/compiler/transformers/external-module-info.ts +1 -1
  361. package/src/compiler/transformers/jsx.ts +2 -1
  362. package/src/compiler/transformers/reference-resolver.ts +83 -19
  363. package/src/compiler/transformers/runtime-syntax.ts +6 -1
  364. package/src/compiler/transformers/syntax-facts.ts +2 -7
  365. package/src/compiler/transformers/type-eraser.ts +10 -1
  366. package/src/compiler/transformers/type-serialization.ts +3 -2
  367. package/src/compiler/transformers/visitor-base.ts +2 -1
  368. package/src/compiler/transformers/visitor-hooks.ts +9 -4
  369. package/src/compiler/tsc-build.ts +67 -6
  370. package/src/compiler/tsc-cli.ts +35 -4
  371. package/src/compiler/tsc-compile.ts +220 -10
  372. package/src/compiler/tsc-watch.ts +97 -47
  373. package/src/compiler/tsconfig.ts +176 -19
  374. package/src/compiler/type-printer.ts +36 -2
  375. package/src/compiler/types.ts +2 -1
  376. package/src/library/ast.generated.ts +57 -41
  377. package/src/library/compiler-options.generated.ts +117 -103
  378. package/src/library/disk.ts +10 -1
  379. package/src/library/enums.generated.ts +196 -196
@@ -13,6 +13,7 @@ import {
13
13
  isWhiteSpaceSingleLine,
14
14
  } from './character-codes.js';
15
15
  import { Diagnostics } from './diagnostic-messages.js';
16
+ import { IdentifierName } from './identifier-name.js';
16
17
  import type { DiagnosticMessage } from './diagnostics.js';
17
18
  import { parsePseudoBigInt } from './pseudo-bigint.js';
18
19
  import {
@@ -98,6 +99,7 @@ const textToKeyword: Map<string, SyntaxKind> = new Map<string, SyntaxKind>([
98
99
  ['return', SyntaxKind.ReturnKeyword],
99
100
  ['satisfies', SyntaxKind.SatisfiesKeyword],
100
101
  ['set', SyntaxKind.SetKeyword],
102
+ ['source', SyntaxKind.SourceKeyword],
101
103
  ['static', SyntaxKind.StaticKeyword],
102
104
  ['string', SyntaxKind.StringKeyword],
103
105
  ['super', SyntaxKind.SuperKeyword],
@@ -357,59 +359,60 @@ function finishHash(hash: number): number {
357
359
  return hash ^ (hash >>> 15);
358
360
  }
359
361
 
360
- /** Strings for ranges of one text, keyed by their code units: equal identifiers share one string. */
362
+ /**
363
+ * Names for ranges of one text, keyed by their code units: equal identifiers share one
364
+ * `IdentifierName`.
365
+ */
361
366
  class IdentifierTable {
362
- private text: string;
363
367
  // Pairs of (entry index + 1, hash) per slot, (0, 0) when empty; linear probing.
364
368
  private slots: Int32Array;
365
369
  // Each entry's length in code units.
366
370
  private lengths: Int32Array;
367
- private texts: string[];
371
+ private names: IdentifierName[];
368
372
  private count: number;
369
- // Per entry: 1 once its text was recorded among the file's identifier texts (`markRecorded`).
373
+ // Per entry: 1 once its name was recorded among the file's identifier texts (`markRecorded`).
370
374
  private recorded: Uint8Array;
371
- // The entry the last `intern` returned.
372
- private lastEntry: number;
373
375
 
374
- constructor(text: string) {
375
- this.text = text;
376
+ constructor() {
376
377
  this.slots = new Int32Array(512);
377
378
  this.lengths = new Int32Array(128);
378
- this.texts = [];
379
+ this.names = [];
379
380
  this.count = 0;
380
381
  this.recorded = new Uint8Array(128);
381
- this.lastEntry = -1;
382
+ }
383
+
384
+ /** Empties the table for a new text. */
385
+ clear(): void {
386
+ if (this.count === 0) return;
387
+ this.slots.fill(0);
388
+ this.names.length = 0;
389
+ this.recorded.fill(0, 0, this.count);
390
+ this.count = 0;
382
391
  }
383
392
 
384
393
  /**
385
- * Whether `text`, just returned by `intern`, still needs recording among the file's identifier
386
- * texts; marks it recorded. Texts the table doesn't know are always recorded.
394
+ * Whether `text`, the text of the entry `entry` that `intern` returned (-1 for none), still needs
395
+ * recording among the file's identifier texts; marks it recorded. Texts the table doesn't know are
396
+ * always recorded.
387
397
  */
388
- markRecorded(text: string): boolean {
389
- const entry = this.lastEntry;
390
- if (entry < 0 || this.texts[entry] !== text) return true;
398
+ markRecorded(entry: number, text: string): boolean {
399
+ if (entry < 0 || this.names[entry]!.text !== text) return true;
391
400
  if (this.recorded[entry] !== 0) return false;
392
401
  this.recorded[entry] = 1;
393
402
  return true;
394
403
  }
395
404
 
396
- /** Empties the table for a new text. */
397
- setText(text: string): void {
398
- this.text = text;
399
- if (this.count === 0) return;
400
- this.slots.fill(0);
401
- this.recorded.fill(0, 0, this.count);
402
- this.texts.length = 0;
403
- this.count = 0;
404
- this.lastEntry = -1;
405
+ /** The name of the entry `intern` returned. */
406
+ name(entry: number): IdentifierName {
407
+ return this.names[entry]!;
405
408
  }
406
409
 
407
410
  /**
408
- * `text.substring(start, end)`, or the string interned for an equal range; `hash` is its `rangeHash`.
409
- * A candidate of the same hash and length is compared with `startsWith`, which natively compares
410
- * the bytes of both strings at once.
411
+ * The entry of `text.substring(start, end)`, added when the table has no equal range; `hash` is its
412
+ * `rangeHash`. A candidate of the same hash and length is compared with `startsWith`, which natively
413
+ * compares the bytes of both strings at once.
411
414
  */
412
- intern(start: number, end: number, hash: number): string {
415
+ intern(text: string, start: number, end: number, hash: number): number {
413
416
  start = start | 0;
414
417
  end = end | 0;
415
418
  hash = hash | 0;
@@ -421,15 +424,10 @@ class IdentifierTable {
421
424
  const entry = slots[(slot * 2) | 0] | 0;
422
425
  if (entry === 0) break;
423
426
  if ((slots[(slot * 2 + 1) | 0] | 0) === hash && (this.lengths[(entry - 1) | 0] | 0) === length) {
424
- const candidate = this.texts[(entry - 1) | 0]!;
425
- if (this.text.startsWith(candidate, start)) {
426
- this.lastEntry = (entry - 1) | 0;
427
- return candidate;
428
- }
427
+ if (text.startsWith(this.names[(entry - 1) | 0]!.text, start)) return (entry - 1) | 0;
429
428
  }
430
429
  slot = (slot + 1) & mask;
431
430
  }
432
- const value = this.text.substring(start, end);
433
431
  const index = this.count | 0;
434
432
  if (index === this.lengths.length) {
435
433
  const lengths = new Int32Array(index * 2);
@@ -440,13 +438,12 @@ class IdentifierTable {
440
438
  this.recorded = recorded;
441
439
  }
442
440
  this.lengths[index] = length;
443
- this.texts.push(value);
441
+ this.names.push(new IdentifierName(text.substring(start, end)));
444
442
  this.count = (index + 1) | 0;
445
- this.lastEntry = index;
446
443
  slots[(slot * 2) | 0] = (index + 1) | 0;
447
444
  slots[(slot * 2 + 1) | 0] = hash;
448
445
  if (this.count * 2 > mask + 1) this.slots = rehash(slots);
449
- return value;
446
+ return index;
450
447
  }
451
448
  }
452
449
 
@@ -618,6 +615,8 @@ export class Scanner {
618
615
  // so identifiers and keywords don't allocate until their value is read.
619
616
  /** @internal */ tokenValue: string;
620
617
  /** @internal */ valueStart: number;
618
+ // The name `getIdentifierValue` last interned, whose text `tokenValue` then holds.
619
+ private tokenName: IdentifierName | undefined;
621
620
  /** @internal */ valueEnd: number;
622
621
  // `rangeHash` of `chars[hashStart, hashEnd)`, which the ASCII identifier scan computes as it goes.
623
622
  private valueHash: number;
@@ -628,6 +627,8 @@ export class Scanner {
628
627
  // The code units zeroed by `setTextEnd`.
629
628
  private readonly cutUnits: Uint16Array;
630
629
  private readonly identifiers: IdentifierTable;
630
+ // The entry `getIdentifierValue` last interned, -1 for none.
631
+ private lastEntry: number;
631
632
  // With code units on demand: per block of `unitBlockSize` code units, 1 once `chars` holds them
632
633
  // (`loadUnits`); `chars` is zero elsewhere.
633
634
  private loadedBlocks: Uint8Array | undefined;
@@ -666,6 +667,7 @@ export class Scanner {
666
667
  this.tokenFlags = TokenFlags.None;
667
668
  this.tokenValue = '';
668
669
  this.valueStart = -1;
670
+ this.tokenName = undefined;
669
671
  this.valueEnd = -1;
670
672
  this.valueHash = 0;
671
673
  this.hashStart = -1;
@@ -673,7 +675,8 @@ export class Scanner {
673
675
  this.commentDirectives = [];
674
676
  this.skipJSDocLeadingAsterisks = 0;
675
677
  this.cutUnits = new Uint16Array(4);
676
- this.identifiers = new IdentifierTable(text);
678
+ this.identifiers = new IdentifierTable();
679
+ this.lastEntry = -1;
677
680
  this.textKind = TextKind.Unknown;
678
681
  this.lineFeedFrom = -1;
679
682
  this.lineFeedAt = -1;
@@ -686,7 +689,8 @@ export class Scanner {
686
689
  this.text = text;
687
690
  this.chars = toCodeUnits(text);
688
691
  this.loadedBlocks = undefined;
689
- this.identifiers.setText(text);
692
+ this.identifiers.clear();
693
+ this.lastEntry = -1;
690
694
  this.textKind = TextKind.Unknown;
691
695
  this.lineFeedFrom = -1;
692
696
  this.lineFeedAt = -1;
@@ -819,7 +823,7 @@ export class Scanner {
819
823
  * file to be recorded; files record each identifier text once.
820
824
  */
821
825
  recordIdentifierValue(text: string): boolean {
822
- return this.identifiers.markRecorded(text);
826
+ return this.identifiers.markRecorded(this.lastEntry, text);
823
827
  }
824
828
 
825
829
  /** @internal Like `getTokenValue`, but identifiers with the same text share one string. */
@@ -829,12 +833,25 @@ export class Scanner {
829
833
  const end = this.valueEnd;
830
834
  const hash =
831
835
  start === this.hashStart && end === this.hashEnd ? this.valueHash : rangeHash(this.chars, start, end);
832
- this.tokenValue = this.identifiers.intern(start, end, hash);
836
+ const entry = this.identifiers.intern(this.text, start, end, hash);
837
+ this.lastEntry = entry;
838
+ this.tokenName = this.identifiers.name(entry);
839
+ this.tokenValue = this.tokenName.text;
833
840
  this.valueStart = -1;
834
841
  }
835
842
  return this.tokenValue;
836
843
  }
837
844
 
845
+ /**
846
+ * The identifier value as a name that identifiers with the same text share, after
847
+ * `getIdentifierValue`; a cooked value (with escapes) gets a name of its own.
848
+ */
849
+ getIdentifierName(): IdentifierName {
850
+ const name = this.tokenName;
851
+ if (name !== undefined && name.text === this.tokenValue) return name;
852
+ return new IdentifierName(this.tokenValue);
853
+ }
854
+
838
855
  getCommentDirectives(): readonly CommentDirective[] {
839
856
  return this.commentDirectives;
840
857
  }
@@ -1316,15 +1333,10 @@ export class Scanner {
1316
1333
  case CharacterCodes.at:
1317
1334
  this.pos = (this.pos + 1) | 0;
1318
1335
  return (this.token = SyntaxKind.AtToken);
1319
- case CharacterCodes.backslash: {
1320
- const codePoint = this.peekUnicodeEscape();
1321
- if (codePoint >= 0 && isIdentifierStart(codePoint)) {
1322
- const head = String.fromCodePoint(this.scanUnicodeEscape(true));
1323
- this.setValue(head + this.scanIdentifierParts());
1336
+ case CharacterCodes.backslash:
1337
+ if (this.scanIdentifier(0, IdentifierVariant.Standard))
1324
1338
  return (this.token = getIdentifierToken(this.tokenValue));
1325
- }
1326
1339
  return this.scanInvalidCharacter();
1327
- }
1328
1340
  case CharacterCodes.hash:
1329
1341
  if ((chars[this.pos + 1] | 0) === CharacterCodes.exclamation) {
1330
1342
  if (this.pos === 0) {
@@ -1332,27 +1344,17 @@ export class Scanner {
1332
1344
  continue;
1333
1345
  }
1334
1346
  this.errorAt(Diagnostics.X_can_only_be_used_at_the_start_of_a_file, this.pos, 2, noArgs);
1335
- this.pos = (this.pos + 1) | 0;
1347
+ this.pos = (this.pos + 2) | 0;
1336
1348
  return (this.token = SyntaxKind.Unknown);
1337
1349
  }
1338
- if ((chars[this.pos + 1] | 0) === CharacterCodes.backslash) {
1339
- this.pos = (this.pos + 1) | 0;
1340
- const codePoint = this.peekUnicodeEscape();
1341
- if (codePoint >= 0 && isIdentifierStart(codePoint)) {
1342
- const head = '#' + String.fromCodePoint(this.scanUnicodeEscape(true));
1343
- this.setValue(head + this.scanIdentifierParts());
1344
- return (this.token = SyntaxKind.PrivateIdentifier);
1345
- }
1346
- this.pos = (this.pos - 1) | 0;
1347
- }
1348
- if (!this.scanIdentifier(1)) {
1350
+ if (!this.scanIdentifier(1, IdentifierVariant.Standard)) {
1349
1351
  this.errorAt(Diagnostics.Invalid_character, this.pos - 1, 1, noArgs);
1350
1352
  this.setValue('#');
1351
1353
  }
1352
1354
  return (this.token = SyntaxKind.PrivateIdentifier);
1353
1355
  default: {
1354
1356
  if (ch < 0) return (this.token = SyntaxKind.EndOfFile);
1355
- if (this.scanIdentifier(0)) return (this.token = this.identifierKind());
1357
+ if (this.scanIdentifier(0, IdentifierVariant.Standard)) return (this.token = this.identifierKind());
1356
1358
  const codePoint = this.codePoint();
1357
1359
  if (codePoint === CharacterCodes.replacementCharacter) {
1358
1360
  this.errorAt(Diagnostics.File_appears_to_be_binary, 0, 0, noArgs);
@@ -1534,14 +1536,36 @@ export class Scanner {
1534
1536
  this.commentDirectives.push(new CommentDirective(start, end, kind));
1535
1537
  }
1536
1538
 
1537
- /** @internal Scans an identifier after `prefixLength` units; sets the token value. */
1538
- scanIdentifier(prefixLength: number): boolean {
1539
+ /**
1540
+ * @internal Scans an identifier after `prefixLength` units; sets the token value. `variant`
1541
+ * decides the identifier parts: JSX and JSDoc names also take `-`, and regular expression group
1542
+ * names take a surrogate pair written as two `\u` escapes.
1543
+ */
1544
+ scanIdentifier(prefixLength: number, variant: IdentifierVariant): boolean {
1539
1545
  const text = this.text;
1540
1546
  const chars = this.chars;
1541
1547
  const start = this.pos;
1542
1548
  this.pos = (this.pos + prefixLength) | 0;
1549
+ const identifierStart = this.pos;
1543
1550
  let ch = this.char();
1544
- if (isASCIILetter(ch) || ch === CharacterCodes._ || ch === CharacterCodes.$) {
1551
+ if (variant === IdentifierVariant.JSX) {
1552
+ if (isASCIILetter(ch) || ch === CharacterCodes._ || ch === CharacterCodes.$) {
1553
+ // ASCII names, as the general loop below scans them.
1554
+ let pos = (this.pos + 1) | 0;
1555
+ const end = this.end;
1556
+ while (pos < end) {
1557
+ const c = chars[pos] | 0;
1558
+ if (!isASCIIIdentifierPart(c) && c !== CharacterCodes.minus) break;
1559
+ pos = (pos + 1) | 0;
1560
+ }
1561
+ const next = pos < end ? chars[pos] | 0 : CharacterCodes.EOF;
1562
+ if (next <= CharacterCodes.maxAsciiCharacter && next !== CharacterCodes.backslash) {
1563
+ this.pos = pos;
1564
+ this.setValueSlice(start, pos);
1565
+ return true;
1566
+ }
1567
+ }
1568
+ } else if (isASCIILetter(ch) || ch === CharacterCodes._ || ch === CharacterCodes.$) {
1545
1569
  // Fast path for ASCII identifiers, which also hashes the units for interning.
1546
1570
  let pos = (this.pos + 1) | 0;
1547
1571
  const end = this.end;
@@ -1563,33 +1587,47 @@ export class Scanner {
1563
1587
  this.hashEnd = pos;
1564
1588
  return true;
1565
1589
  }
1566
- this.pos = (start + prefixLength) | 0;
1567
1590
  }
1591
+ this.pos = identifierStart;
1592
+ const languageVariant = variant === IdentifierVariant.JSX ? LanguageVariant.JSX : LanguageVariant.Standard;
1568
1593
  ch = this.codePoint();
1569
- if (!isIdentifierStart(ch)) return false;
1570
- do {
1571
- this.pos = (this.pos + charSize(ch)) | 0;
1572
- ch = this.codePoint();
1573
- } while (isIdentifierPart(ch));
1574
- if (ch === CharacterCodes.backslash) this.setValue(text.substring(start, this.pos) + this.scanIdentifierParts());
1575
- else this.setValueSlice(start, this.pos);
1576
- return true;
1594
+ if (isIdentifierStart(ch)) {
1595
+ do {
1596
+ this.pos = (this.pos + charSize(ch)) | 0;
1597
+ ch = this.codePoint();
1598
+ } while (isIdentifierPart(ch, languageVariant));
1599
+ if (ch === CharacterCodes.backslash)
1600
+ this.setValue(text.substring(start, this.pos) + this.scanIdentifierParts(variant));
1601
+ else this.setValueSlice(start, this.pos);
1602
+ return true;
1603
+ }
1604
+ if (ch === CharacterCodes.backslash) {
1605
+ const escaped = this.scanIdentifierEscape(true, variant);
1606
+ if (escaped >= 0) {
1607
+ const head = text.substring(start, identifierStart) + String.fromCodePoint(escaped);
1608
+ this.setValue(head + this.scanIdentifierParts(variant));
1609
+ return true;
1610
+ }
1611
+ }
1612
+ return false;
1577
1613
  }
1578
1614
 
1579
1615
  /** Scans identifier parts including `\u` escapes and returns their cooked text. */
1580
- private scanIdentifierParts(): string {
1616
+ private scanIdentifierParts(variant: IdentifierVariant): string {
1617
+ const languageVariant = variant === IdentifierVariant.JSX ? LanguageVariant.JSX : LanguageVariant.Standard;
1581
1618
  let result = '';
1582
1619
  let start = this.pos;
1583
1620
  for (;;) {
1584
1621
  const ch = this.codePoint();
1585
- if (isIdentifierPart(ch)) {
1622
+ if (isIdentifierPart(ch, languageVariant)) {
1586
1623
  this.pos = (this.pos + charSize(ch)) | 0;
1587
1624
  continue;
1588
1625
  }
1589
1626
  if (ch === CharacterCodes.backslash) {
1590
- const escaped = this.peekUnicodeEscape();
1591
- if (escaped >= 0 && isIdentifierPart(escaped)) {
1592
- result += this.text.substring(start, this.pos) + String.fromCodePoint(this.scanUnicodeEscape(true));
1627
+ const escapeStart = this.pos;
1628
+ const escaped = this.scanIdentifierEscape(false, variant);
1629
+ if (escaped >= 0) {
1630
+ result += this.text.substring(start, escapeStart) + String.fromCodePoint(escaped);
1593
1631
  start = this.pos;
1594
1632
  continue;
1595
1633
  }
@@ -1599,6 +1637,39 @@ export class Scanner {
1599
1637
  return start === this.pos ? result : result + this.text.substring(start, this.pos);
1600
1638
  }
1601
1639
 
1640
+ /**
1641
+ * At `\`: scans a `\u` escape of an identifier start (`isStart`) or part and returns its code point,
1642
+ * or returns -1 and leaves the scanner unchanged.
1643
+ */
1644
+ private scanIdentifierEscape(isStart: boolean, variant: IdentifierVariant): number {
1645
+ const languageVariant = variant === IdentifierVariant.JSX ? LanguageVariant.JSX : LanguageVariant.Standard;
1646
+ const escaped = this.peekUnicodeEscape();
1647
+ if (escaped >= 0 && (isStart ? isIdentifierStart(escaped) : isIdentifierPart(escaped, languageVariant)))
1648
+ return this.scanUnicodeEscape(true);
1649
+ // Group names in regular expressions, in Unicode mode or not, take `\u` HexLeadSurrogate `\u`
1650
+ // HexTrailSurrogate as part of RegExpIdentifierName (tc39/ecma262#1869), but not the braced form.
1651
+ if (
1652
+ variant === IdentifierVariant.RegExpGroupName &&
1653
+ this.peek(2) !== CharacterCodes.openBrace &&
1654
+ escaped >= 0xd800 &&
1655
+ escaped <= 0xdbff
1656
+ ) {
1657
+ const pos = this.pos;
1658
+ const flags = this.tokenFlags;
1659
+ this.scanUnicodeEscape(false);
1660
+ if (this.peek(2) !== CharacterCodes.openBrace) {
1661
+ const low = this.scanLowSurrogateEscape();
1662
+ if (low >= 0) {
1663
+ const codePoint = (escaped - 0xd800) * 0x400 + (low - 0xdc00) + 0x10000;
1664
+ if (isStart ? isIdentifierStart(codePoint) : isIdentifierPart(codePoint, languageVariant)) return codePoint;
1665
+ }
1666
+ }
1667
+ this.pos = pos | 0;
1668
+ this.tokenFlags = flags;
1669
+ }
1670
+ return -1;
1671
+ }
1672
+
1602
1673
  private scanInvalidCharacter(): SyntaxKind {
1603
1674
  const size = charSize(this.codePoint());
1604
1675
  this.errorAt(Diagnostics.Invalid_character, this.pos, size, noArgs);
@@ -2080,7 +2151,7 @@ export class Scanner {
2080
2151
  }
2081
2152
  if (isIdentifierStart(this.codePoint())) {
2082
2153
  const idStart = this.pos;
2083
- const id = this.scanIdentifierParts();
2154
+ const id = this.scanIdentifierParts(IdentifierVariant.Standard);
2084
2155
  if (result !== SyntaxKind.BigIntLiteral && id.length === 1 && this.chars[idStart] === CharacterCodes.n) {
2085
2156
  if ((this.tokenFlags & TokenFlags.Scientific) !== 0) {
2086
2157
  this.errorAt(Diagnostics.A_bigint_literal_cannot_use_exponential_notation, start, this.pos - start, noArgs);
@@ -2472,17 +2543,8 @@ export class Scanner {
2472
2543
  /** Extends an identifier or keyword with `-` and further parts, as JSX names allow. */
2473
2544
  scanJsxIdentifier(): SyntaxKind {
2474
2545
  if (!tokenIsIdentifierOrKeyword(this.token)) return this.token;
2475
- let value = this.getTokenValue();
2476
- while (this.pos < this.end) {
2477
- if (this.char() === CharacterCodes.minus) {
2478
- value += '-';
2479
- this.pos = (this.pos + 1) | 0;
2480
- continue;
2481
- }
2482
- const pos = this.pos;
2483
- value += this.scanIdentifierParts();
2484
- if (this.pos === pos) break;
2485
- }
2546
+ // An identifier or keyword is scanned: append a following `-` and the rest of the name.
2547
+ const value = this.getTokenValue() + this.scanIdentifierParts(IdentifierVariant.JSX);
2486
2548
  this.setValue(value);
2487
2549
  return (this.token = getIdentifierToken(value));
2488
2550
  }
@@ -2556,7 +2618,6 @@ export class Scanner {
2556
2618
  scanJSDocToken(): SyntaxKind {
2557
2619
  this.fullStartPos = this.pos | 0;
2558
2620
  this.tokenFlags = TokenFlags.None;
2559
- const text = this.text;
2560
2621
  const chars = this.chars;
2561
2622
  if (this.pos >= this.end) return (this.token = SyntaxKind.EndOfFile);
2562
2623
  this.tokenStart = this.pos | 0;
@@ -2605,39 +2666,24 @@ export class Scanner {
2605
2666
  return (this.token = SyntaxKind.BacktickToken);
2606
2667
  case CharacterCodes.hash:
2607
2668
  return (this.token = SyntaxKind.HashToken);
2608
- case CharacterCodes.backslash: {
2609
- this.pos = (this.pos - 1) | 0;
2610
- const codePoint = this.peekUnicodeEscape();
2611
- if (codePoint >= 0 && isIdentifierStart(codePoint)) {
2612
- const head = String.fromCodePoint(this.scanUnicodeEscape(true));
2613
- this.setValue(head + this.scanIdentifierParts());
2614
- return (this.token = getIdentifierToken(this.tokenValue));
2615
- }
2616
- this.pos = (this.pos + 1) | 0;
2617
- return (this.token = SyntaxKind.Unknown);
2618
- }
2619
2669
  }
2620
- if (!isIdentifierStart(ch)) return (this.token = SyntaxKind.Unknown);
2621
- let last = ch;
2622
- while (this.pos < this.end) {
2623
- const unit = this.chars[this.pos] | 0;
2624
- if (unit < 0x80) {
2625
- last = unit;
2626
- if (!isASCIIIdentifierPart(unit) && unit !== CharacterCodes.minus) break;
2627
- this.pos = (this.pos + 1) | 0;
2628
- continue;
2629
- }
2630
- last = this.codePointAt(this.pos, this.end);
2631
- if (!isIdentifierPart(last) && last !== CharacterCodes.minus) break;
2632
- this.pos = (this.pos + charSize(last)) | 0;
2633
- }
2634
- if (last === CharacterCodes.backslash)
2635
- this.setValue(text.substring(this.tokenStart, this.pos) + this.scanIdentifierParts());
2636
- else this.setValueSlice(this.tokenStart, this.pos);
2637
- return (this.token = this.identifierKind());
2670
+ // JSDoc names take `-`, as JSX names do.
2671
+ this.pos = this.tokenStart;
2672
+ if (this.scanIdentifier(0, IdentifierVariant.JSX)) return (this.token = this.identifierKind());
2673
+ this.pos = (this.tokenStart + charSize(ch)) | 0;
2674
+ return (this.token = SyntaxKind.Unknown);
2638
2675
  }
2639
2676
  }
2640
2677
 
2678
+ /** Which characters an identifier scan takes after its start. */
2679
+ export const enum IdentifierVariant {
2680
+ Standard,
2681
+ /** JSX and JSDoc names, which take `-`. */
2682
+ JSX,
2683
+ /** Regular expression group names, which take a surrogate pair written as two `\u` escapes. */
2684
+ RegExpGroupName,
2685
+ }
2686
+
2641
2687
  const mergeConflictMarkerLength = 7;
2642
2688
 
2643
2689
  function utf8Length(ch: number): number {