tsc-ts 0.0.9 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/bin/tsc-ts.js +70 -1
- package/dist/api/compiler/ast-utilities.d.ts +19 -1
- package/dist/api/compiler/ast-utilities.js +180 -95
- package/dist/api/compiler/ast.d.ts +22 -15
- package/dist/api/compiler/ast.js +1026 -995
- package/dist/api/compiler/astnav.js +15 -15
- package/dist/api/compiler/binder-utilities.js +186 -186
- package/dist/api/compiler/binder.js +290 -263
- package/dist/api/compiler/character-codes.js +2 -2
- package/dist/api/compiler/checker-calls.js +178 -124
- package/dist/api/compiler/checker-classes.d.ts +14 -3
- package/dist/api/compiler/checker-classes.js +134 -90
- package/dist/api/compiler/checker-contextual.js +64 -61
- package/dist/api/compiler/checker-declaration-order.js +79 -79
- package/dist/api/compiler/checker-declarations.d.ts +1 -0
- package/dist/api/compiler/checker-declarations.js +160 -136
- package/dist/api/compiler/checker-declared-types.js +67 -65
- package/dist/api/compiler/checker-decorators.js +77 -77
- package/dist/api/compiler/checker-deprecation.d.ts +8 -3
- package/dist/api/compiler/checker-deprecation.js +76 -55
- package/dist/api/compiler/checker-destructuring.js +47 -45
- package/dist/api/compiler/checker-elaboration.js +24 -24
- package/dist/api/compiler/checker-emit-helpers.js +4 -4
- package/dist/api/compiler/checker-emit-resolver.d.ts +4 -2
- package/dist/api/compiler/checker-emit-resolver.js +25 -13
- package/dist/api/compiler/checker-evaluator.js +9 -9
- package/dist/api/compiler/checker-expressions.js +244 -211
- package/dist/api/compiler/checker-functions.js +113 -107
- package/dist/api/compiler/checker-generated-code.d.ts +0 -11
- package/dist/api/compiler/checker-generated-code.js +28 -52
- package/dist/api/compiler/checker-grammar.d.ts +1 -0
- package/dist/api/compiler/checker-grammar.js +472 -440
- package/dist/api/compiler/checker-heritage.js +91 -93
- package/dist/api/compiler/checker-inference.d.ts +77 -5
- package/dist/api/compiler/checker-inference.js +487 -107
- package/dist/api/compiler/checker-iteration.d.ts +0 -10
- package/dist/api/compiler/checker-iteration.js +35 -52
- package/dist/api/compiler/checker-javascript.js +14 -14
- package/dist/api/compiler/checker-jsdoc.d.ts +8 -10
- package/dist/api/compiler/checker-jsdoc.js +67 -58
- package/dist/api/compiler/checker-jsx.js +105 -88
- package/dist/api/compiler/checker-members.d.ts +9 -2
- package/dist/api/compiler/checker-members.js +212 -75
- package/dist/api/compiler/checker-modules.d.ts +15 -6
- package/dist/api/compiler/checker-modules.js +469 -309
- package/dist/api/compiler/checker-narrowing.js +273 -189
- package/dist/api/compiler/checker-object-literals.js +25 -22
- package/dist/api/compiler/checker-operators.js +126 -118
- package/dist/api/compiler/checker-overloads.js +27 -27
- package/dist/api/compiler/checker-property-access.js +59 -55
- package/dist/api/compiler/checker-services.d.ts +1 -0
- package/dist/api/compiler/checker-services.js +222 -210
- package/dist/api/compiler/checker-signatures.js +65 -49
- package/dist/api/compiler/checker-source-file.d.ts +5 -0
- package/dist/api/compiler/checker-source-file.js +154 -130
- package/dist/api/compiler/checker-statements.js +33 -32
- package/dist/api/compiler/checker-super.js +50 -50
- package/dist/api/compiler/checker-symbol-types.js +109 -93
- package/dist/api/compiler/checker-symbols.d.ts +13 -1
- package/dist/api/compiler/checker-symbols.js +264 -149
- package/dist/api/compiler/checker-type-factory.d.ts +5 -0
- package/dist/api/compiler/checker-type-factory.js +145 -36
- package/dist/api/compiler/checker-type-nodes.d.ts +1 -0
- package/dist/api/compiler/checker-type-nodes.js +179 -141
- package/dist/api/compiler/checker-type-operators.d.ts +2 -0
- package/dist/api/compiler/checker-type-operators.js +110 -63
- package/dist/api/compiler/checker-types.d.ts +80 -3
- package/dist/api/compiler/checker-types.js +121 -2
- package/dist/api/compiler/checker-unused.js +114 -118
- package/dist/api/compiler/checker-utilities.js +11 -11
- package/dist/api/compiler/checker.d.ts +104 -31
- package/dist/api/compiler/checker.js +181 -33
- package/dist/api/compiler/command-line.d.ts +1 -3
- package/dist/api/compiler/command-line.js +47 -44
- package/dist/api/compiler/compile-program.d.ts +42 -3
- package/dist/api/compiler/compile-program.js +139 -27
- package/dist/api/compiler/diagnostic-messages.d.ts +1849 -1774
- package/dist/api/compiler/diagnostic-messages.js +128 -122
- package/dist/api/compiler/diagnostics.d.ts +22 -0
- package/dist/api/compiler/diagnostics.js +93 -11
- package/dist/api/compiler/emitter.d.ts +7 -1
- package/dist/api/compiler/emitter.js +53 -11
- package/dist/api/compiler/file-include.d.ts +2 -1
- package/dist/api/compiler/file-include.js +11 -7
- package/dist/api/compiler/file-loader.d.ts +21 -1
- package/dist/api/compiler/file-loader.js +201 -48
- package/dist/api/compiler/instantiation.d.ts +7 -0
- package/dist/api/compiler/instantiation.js +101 -49
- package/dist/api/compiler/jsdoc.js +23 -23
- package/dist/api/compiler/link-tables.d.ts +48 -18
- package/dist/api/compiler/link-tables.js +80 -37
- package/dist/api/compiler/locales/cs-CZ.d.ts +1 -1
- package/dist/api/compiler/locales/cs-CZ.js +1 -1
- package/dist/api/compiler/locales/de-DE.d.ts +1 -1
- package/dist/api/compiler/locales/de-DE.js +1 -1
- package/dist/api/compiler/locales/es-ES.d.ts +1 -1
- package/dist/api/compiler/locales/es-ES.js +1 -1
- package/dist/api/compiler/locales/fr-FR.d.ts +1 -1
- package/dist/api/compiler/locales/fr-FR.js +1 -1
- package/dist/api/compiler/locales/it-IT.d.ts +1 -1
- package/dist/api/compiler/locales/it-IT.js +1 -1
- package/dist/api/compiler/locales/ja-JP.d.ts +1 -1
- package/dist/api/compiler/locales/ja-JP.js +1 -1
- package/dist/api/compiler/locales/ko-KR.d.ts +1 -1
- package/dist/api/compiler/locales/ko-KR.js +1 -1
- package/dist/api/compiler/locales/pl-PL.d.ts +1 -1
- package/dist/api/compiler/locales/pl-PL.js +1 -1
- package/dist/api/compiler/locales/pt-BR.d.ts +1 -1
- package/dist/api/compiler/locales/pt-BR.js +1 -1
- package/dist/api/compiler/locales/ru-RU.d.ts +1 -1
- package/dist/api/compiler/locales/ru-RU.js +1 -1
- package/dist/api/compiler/locales/tr-TR.d.ts +1 -1
- package/dist/api/compiler/locales/tr-TR.js +1 -1
- package/dist/api/compiler/locales/zh-CN.d.ts +1 -1
- package/dist/api/compiler/locales/zh-CN.js +1 -1
- package/dist/api/compiler/locales/zh-TW.d.ts +1 -1
- package/dist/api/compiler/locales/zh-TW.js +1 -1
- package/dist/api/compiler/module-resolution-types.js +6 -6
- package/dist/api/compiler/module-resolution.d.ts +10 -1
- package/dist/api/compiler/module-resolution.js +115 -84
- package/dist/api/compiler/module-specifiers.d.ts +15 -0
- package/dist/api/compiler/module-specifiers.js +24 -18
- package/dist/api/compiler/name-resolver.js +74 -65
- package/dist/api/compiler/node-builder-names.d.ts +11 -3
- package/dist/api/compiler/node-builder-names.js +210 -90
- package/dist/api/compiler/node-builder-pseudo.js +29 -31
- package/dist/api/compiler/node-builder-reuse.js +23 -22
- package/dist/api/compiler/node-builder.d.ts +18 -1
- package/dist/api/compiler/node-builder.js +191 -102
- package/dist/api/compiler/option-declarations.d.ts +2 -6
- package/dist/api/compiler/option-declarations.js +315 -375
- package/dist/api/compiler/options.d.ts +15 -33
- package/dist/api/compiler/options.js +21 -54
- package/dist/api/compiler/output-paths.d.ts +4 -1
- package/dist/api/compiler/output-paths.js +6 -11
- package/dist/api/compiler/package-json.d.ts +3 -3
- package/dist/api/compiler/package-json.js +11 -10
- package/dist/api/compiler/parallel-parse.d.ts +3 -2
- package/dist/api/compiler/parallel-parse.js +17 -5
- package/dist/api/compiler/parser.d.ts +40 -19
- package/dist/api/compiler/parser.js +308 -216
- package/dist/api/compiler/path.d.ts +9 -0
- package/dist/api/compiler/path.js +20 -3
- package/dist/api/compiler/printer/emit-context.d.ts +5 -1
- package/dist/api/compiler/printer/emit-context.js +20 -1
- package/dist/api/compiler/printer/factory-base.d.ts +2 -2
- package/dist/api/compiler/printer/factory-base.js +7 -3
- package/dist/api/compiler/printer/factory.js +3 -1
- package/dist/api/compiler/printer/helpers.js +10 -1
- package/dist/api/compiler/printer/name-generator.d.ts +1 -1
- package/dist/api/compiler/printer/name-generator.js +35 -16
- package/dist/api/compiler/printer/printer.d.ts +49 -2
- package/dist/api/compiler/printer/printer.js +539 -293
- package/dist/api/compiler/printer/utilities.js +149 -147
- package/dist/api/compiler/program-checker.d.ts +12 -2
- package/dist/api/compiler/program-checker.js +88 -34
- package/dist/api/compiler/program-utilities.d.ts +3 -1
- package/dist/api/compiler/program-utilities.js +28 -15
- package/dist/api/compiler/program.d.ts +4 -6
- package/dist/api/compiler/program.js +74 -87
- package/dist/api/compiler/pseudo-bigint.d.ts +2 -0
- package/dist/api/compiler/pseudo-bigint.js +18 -0
- package/dist/api/compiler/regexp-checker.d.ts +1 -1
- package/dist/api/compiler/regexp-checker.js +93 -76
- package/dist/api/compiler/relations.d.ts +27 -4
- package/dist/api/compiler/relations.js +347 -180
- package/dist/api/compiler/reparser.js +60 -56
- package/dist/api/compiler/scanner.d.ts +19 -2
- package/dist/api/compiler/scanner.js +123 -108
- package/dist/api/compiler/shared-results.d.ts +463 -0
- package/dist/api/compiler/shared-results.js +2128 -0
- package/dist/api/compiler/sourcemap.js +2 -2
- package/dist/api/compiler/symbol-accessibility.js +87 -74
- package/dist/api/compiler/symbol.d.ts +23 -14
- package/dist/api/compiler/symbol.js +23 -11
- package/dist/api/compiler/syntax-kind.d.ts +198 -197
- package/dist/api/compiler/transformers/alias-references.js +247 -139
- package/dist/api/compiler/transformers/async-utilities.js +25 -25
- package/dist/api/compiler/transformers/async.d.ts +0 -1
- package/dist/api/compiler/transformers/async.js +64 -77
- package/dist/api/compiler/transformers/class-fields.d.ts +1 -0
- package/dist/api/compiler/transformers/class-fields.js +81 -78
- package/dist/api/compiler/transformers/commonjs-module.js +18 -15
- package/dist/api/compiler/transformers/const-enum-inliner.js +1 -1
- package/dist/api/compiler/transformers/declarations-diagnostics.js +247 -244
- package/dist/api/compiler/transformers/declarations-pseudo.js +100 -100
- package/dist/api/compiler/transformers/declarations-resolver.d.ts +0 -3
- package/dist/api/compiler/transformers/declarations-syntactic.d.ts +1 -2
- package/dist/api/compiler/transformers/declarations-syntactic.js +134 -156
- package/dist/api/compiler/transformers/declarations-tracker.js +18 -18
- package/dist/api/compiler/transformers/declarations.d.ts +4 -1
- package/dist/api/compiler/transformers/declarations.js +305 -238
- package/dist/api/compiler/transformers/decorator-metadata.d.ts +1 -1
- package/dist/api/compiler/transformers/decorator-metadata.js +53 -45
- package/dist/api/compiler/transformers/decorator-utilities.js +24 -24
- package/dist/api/compiler/transformers/destructuring.js +19 -18
- package/dist/api/compiler/transformers/emit-resolver.js +1 -1
- package/dist/api/compiler/transformers/es-decorators.js +55 -55
- package/dist/api/compiler/transformers/external-module-info.js +3 -3
- package/dist/api/compiler/transformers/for-await.js +25 -25
- package/dist/api/compiler/transformers/import-elision.js +14 -14
- package/dist/api/compiler/transformers/jsx.js +12 -12
- package/dist/api/compiler/transformers/legacy-decorators.js +17 -17
- package/dist/api/compiler/transformers/module.js +8 -8
- package/dist/api/compiler/transformers/named-evaluation.js +4 -4
- package/dist/api/compiler/transformers/object-rest-spread.js +20 -20
- package/dist/api/compiler/transformers/optional-chain.js +10 -10
- package/dist/api/compiler/transformers/reference-resolver.d.ts +12 -1
- package/dist/api/compiler/transformers/reference-resolver.js +131 -69
- package/dist/api/compiler/transformers/runtime-syntax.js +35 -31
- package/dist/api/compiler/transformers/subtree-facts.js +47 -47
- package/dist/api/compiler/transformers/syntax-facts.js +56 -58
- package/dist/api/compiler/transformers/type-eraser.js +73 -66
- package/dist/api/compiler/transformers/type-serialization.js +24 -24
- package/dist/api/compiler/transformers/using.js +12 -12
- package/dist/api/compiler/transformers/utilities.js +77 -77
- package/dist/api/compiler/transformers/visitor-base.js +172 -172
- package/dist/api/compiler/transformers/visitor-hooks.js +6 -2
- package/dist/api/compiler/tsconfig.d.ts +10 -2
- package/dist/api/compiler/tsconfig.js +136 -48
- package/dist/api/compiler/type-printer.js +40 -3
- package/dist/api/compiler/types.d.ts +2 -1
- package/dist/api/library/ast.generated.d.ts +42 -39
- package/dist/api/library/ast.generated.js +1 -1
- package/dist/api/library/compiler-options.generated.d.ts +111 -100
- package/dist/api/library/compiler-options.generated.js +1 -1
- package/dist/api/library/disk.js +12 -1
- package/dist/api/library/enums.generated.d.ts +206 -206
- package/dist/api/library/enums.generated.js +206 -206
- package/dist/api/library/nodes.js +26 -26
- package/package.json +9 -9
- package/src/compiler/ast-utilities.ts +99 -7
- package/src/compiler/ast.ts +58 -26
- package/src/compiler/binder.ts +39 -4
- package/src/compiler/character-codes.ts +2 -2
- package/src/compiler/checker-calls.ts +79 -9
- package/src/compiler/checker-classes.ts +78 -24
- package/src/compiler/checker-contextual.ts +6 -1
- package/src/compiler/checker-declarations.ts +31 -4
- package/src/compiler/checker-declared-types.ts +8 -5
- package/src/compiler/checker-decorators.ts +1 -1
- package/src/compiler/checker-deprecation.ts +29 -8
- package/src/compiler/checker-destructuring.ts +10 -3
- package/src/compiler/checker-emit-helpers.ts +1 -0
- package/src/compiler/checker-emit-resolver.ts +16 -6
- package/src/compiler/checker-expressions.ts +79 -46
- package/src/compiler/checker-functions.ts +21 -6
- package/src/compiler/checker-generated-code.ts +2 -22
- package/src/compiler/checker-grammar.ts +136 -62
- package/src/compiler/checker-heritage.ts +22 -21
- package/src/compiler/checker-inference.ts +514 -82
- package/src/compiler/checker-iteration.ts +18 -31
- package/src/compiler/checker-javascript.ts +1 -1
- package/src/compiler/checker-jsdoc.ts +50 -27
- package/src/compiler/checker-jsx.ts +26 -4
- package/src/compiler/checker-members.ts +200 -56
- package/src/compiler/checker-modules.ts +332 -65
- package/src/compiler/checker-narrowing.ts +98 -19
- package/src/compiler/checker-object-literals.ts +3 -0
- package/src/compiler/checker-operators.ts +11 -4
- package/src/compiler/checker-property-access.ts +7 -2
- package/src/compiler/checker-services.ts +39 -12
- package/src/compiler/checker-signatures.ts +15 -1
- package/src/compiler/checker-source-file.ts +39 -13
- package/src/compiler/checker-statements.ts +3 -2
- package/src/compiler/checker-symbol-types.ts +29 -6
- package/src/compiler/checker-symbols.ts +158 -15
- package/src/compiler/checker-type-factory.ts +124 -23
- package/src/compiler/checker-type-nodes.ts +46 -3
- package/src/compiler/checker-type-operators.ts +83 -26
- package/src/compiler/checker-types.ts +147 -4
- package/src/compiler/checker-unused.ts +9 -14
- package/src/compiler/checker.ts +203 -39
- package/src/compiler/command-line.ts +28 -28
- package/src/compiler/compile-program.ts +167 -27
- package/src/compiler/decoder.ts +13 -4
- package/src/compiler/diagnostic-messages.ts +1973 -1892
- package/src/compiler/diagnostics.ts +84 -3
- package/src/compiler/emitter.ts +57 -8
- package/src/compiler/encoder.ts +23 -8
- package/src/compiler/file-include.ts +9 -3
- package/src/compiler/file-loader.ts +197 -38
- package/src/compiler/help.ts +10 -14
- package/src/compiler/incremental.ts +165 -30
- package/src/compiler/init.ts +2 -7
- package/src/compiler/instantiation.ts +77 -22
- package/src/compiler/jsdoc.ts +3 -1
- package/src/compiler/link-tables.ts +82 -37
- package/src/compiler/locales/cs-CZ.ts +1 -1
- package/src/compiler/locales/de-DE.ts +1 -1
- package/src/compiler/locales/es-ES.ts +1 -1
- package/src/compiler/locales/fr-FR.ts +1 -1
- package/src/compiler/locales/it-IT.ts +1 -1
- package/src/compiler/locales/ja-JP.ts +1 -1
- package/src/compiler/locales/ko-KR.ts +1 -1
- package/src/compiler/locales/pl-PL.ts +1 -1
- package/src/compiler/locales/pt-BR.ts +1 -1
- package/src/compiler/locales/ru-RU.ts +1 -1
- package/src/compiler/locales/tr-TR.ts +1 -1
- package/src/compiler/locales/zh-CN.ts +1 -1
- package/src/compiler/locales/zh-TW.ts +1 -1
- package/src/compiler/module-resolution.ts +44 -8
- package/src/compiler/module-specifiers.ts +62 -20
- package/src/compiler/name-resolver.ts +9 -1
- package/src/compiler/node-builder-names.ts +236 -54
- package/src/compiler/node-builder-pseudo.ts +4 -7
- package/src/compiler/node-builder-reuse.ts +5 -4
- package/src/compiler/node-builder.ts +130 -31
- package/src/compiler/option-declarations.ts +33 -103
- package/src/compiler/options.ts +23 -62
- package/src/compiler/output-paths.ts +5 -18
- package/src/compiler/package-entrypoints.ts +345 -0
- package/src/compiler/package-json.ts +4 -4
- package/src/compiler/parallel-check.ts +326 -52
- package/src/compiler/parallel-emit.ts +320 -0
- package/src/compiler/parallel-parse.ts +16 -5
- package/src/compiler/parse-thread.ts +3 -0
- package/src/compiler/parser.ts +156 -39
- package/src/compiler/path.ts +22 -2
- package/src/compiler/printer/emit-context.ts +21 -0
- package/src/compiler/printer/factory-base.ts +10 -3
- package/src/compiler/printer/factory.ts +4 -1
- package/src/compiler/printer/helpers.ts +10 -1
- package/src/compiler/printer/name-generator.ts +24 -2
- package/src/compiler/printer/printer.ts +266 -30
- package/src/compiler/printer/utilities.ts +8 -2
- package/src/compiler/program-checker.ts +57 -5
- package/src/compiler/program-utilities.ts +23 -10
- package/src/compiler/program.ts +18 -26
- package/src/compiler/pseudo-bigint.ts +17 -0
- package/src/compiler/regexp-checker.ts +63 -30
- package/src/compiler/relations.ts +240 -77
- package/src/compiler/reparser.ts +7 -2
- package/src/compiler/scanner.ts +109 -79
- package/src/compiler/shared-results.ts +2414 -0
- package/src/compiler/show-config.ts +18 -1
- package/src/compiler/sourcemap.ts +2 -2
- package/src/compiler/symbol-accessibility.ts +26 -3
- package/src/compiler/symbol.ts +46 -24
- package/src/compiler/syntax-kind.ts +188 -187
- package/src/compiler/thread-entry.ts +64 -4
- package/src/compiler/transformers/alias-references.ts +123 -4
- package/src/compiler/transformers/async.ts +2 -17
- package/src/compiler/transformers/class-fields.ts +13 -12
- package/src/compiler/transformers/commonjs-module.ts +11 -7
- package/src/compiler/transformers/declarations-diagnostics.ts +5 -3
- package/src/compiler/transformers/declarations-pseudo.ts +2 -4
- package/src/compiler/transformers/declarations-resolver.ts +0 -3
- package/src/compiler/transformers/declarations-syntactic.ts +1 -21
- package/src/compiler/transformers/declarations.ts +134 -48
- package/src/compiler/transformers/decorator-metadata.ts +9 -1
- package/src/compiler/transformers/destructuring.ts +4 -3
- package/src/compiler/transformers/external-module-info.ts +1 -1
- package/src/compiler/transformers/jsx.ts +2 -1
- package/src/compiler/transformers/reference-resolver.ts +83 -19
- package/src/compiler/transformers/runtime-syntax.ts +6 -1
- package/src/compiler/transformers/syntax-facts.ts +2 -7
- package/src/compiler/transformers/type-eraser.ts +10 -1
- package/src/compiler/transformers/type-serialization.ts +3 -2
- package/src/compiler/transformers/visitor-base.ts +2 -1
- package/src/compiler/transformers/visitor-hooks.ts +9 -4
- package/src/compiler/tsc-build.ts +66 -9
- package/src/compiler/tsc-cli.ts +7 -0
- package/src/compiler/tsc-compile.ts +284 -4
- package/src/compiler/tsc-watch.ts +74 -45
- package/src/compiler/tsconfig.ts +176 -19
- package/src/compiler/type-printer.ts +36 -2
- package/src/compiler/types.ts +2 -1
- package/src/library/ast.generated.ts +57 -41
- package/src/library/compiler-options.generated.ts +117 -103
- package/src/library/disk.ts +10 -1
- package/src/library/enums.generated.ts +196 -196
package/src/compiler/parser.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// The TypeScript/JavaScript/JSX/JSON parser, a port of TypeScript 7.
|
|
1
|
+
// The TypeScript/JavaScript/JSX/JSON parser, a port of TypeScript 7.1's (tsgo) parser with its
|
|
2
2
|
// error recovery, parse diagnostics and JavaScript-specific reparsing.
|
|
3
3
|
//
|
|
4
4
|
// ```ts
|
|
@@ -218,6 +218,7 @@ import {
|
|
|
218
218
|
isFunctionLike,
|
|
219
219
|
isImportCall,
|
|
220
220
|
isImportMeta,
|
|
221
|
+
isImportPhaseMetaProperty,
|
|
221
222
|
isInJSFile,
|
|
222
223
|
isKeyword,
|
|
223
224
|
isKeywordOrPunctuation,
|
|
@@ -293,7 +294,11 @@ const enum ListElement {
|
|
|
293
294
|
ObjectBindingElement,
|
|
294
295
|
ClassElement,
|
|
295
296
|
HeritageClause,
|
|
297
|
+
/** A heritage clause of an interface declaration. */
|
|
298
|
+
InterfaceHeritageClause,
|
|
296
299
|
ExpressionWithTypeArguments,
|
|
300
|
+
/** An element of a type heritage clause: `implements` of a class, `extends` of an interface. */
|
|
301
|
+
TypeHeritageClauseElement,
|
|
297
302
|
EnumMember,
|
|
298
303
|
ImportSpecifier,
|
|
299
304
|
ExportSpecifier,
|
|
@@ -340,6 +345,18 @@ export const enum JSDocScannerInfo {
|
|
|
340
345
|
|
|
341
346
|
const noArgs: readonly string[] = [];
|
|
342
347
|
|
|
348
|
+
/** Whether `operator` binds before an operator of `currentPrecedence`: at equal precedence, only the right-associative `**`. */
|
|
349
|
+
function shouldConsumeBinaryOperator(
|
|
350
|
+
operator: SyntaxKind,
|
|
351
|
+
operatorPrecedence: OperatorPrecedence,
|
|
352
|
+
currentPrecedence: OperatorPrecedence,
|
|
353
|
+
): boolean {
|
|
354
|
+
return (
|
|
355
|
+
operatorPrecedence > currentPrecedence ||
|
|
356
|
+
(operatorPrecedence === currentPrecedence && operator === SyntaxKind.AsteriskAsteriskToken)
|
|
357
|
+
);
|
|
358
|
+
}
|
|
359
|
+
|
|
343
360
|
/** Parser state saved by `mark` for speculative parsing. */
|
|
344
361
|
export class ParserState extends ScannerState {
|
|
345
362
|
contextFlags: NodeFlags;
|
|
@@ -430,7 +447,7 @@ export function parseSourceFile(fileName: string, text: string, options?: ParseO
|
|
|
430
447
|
export function parseIsolatedEntityName(text: string): EntityName | undefined {
|
|
431
448
|
const p = new Parser('/', '/', text, ScriptKind.JS, new ExternalModuleIndicatorOptions(false, false));
|
|
432
449
|
p.nextToken();
|
|
433
|
-
const entityName = p.parseEntityName(true, undefined);
|
|
450
|
+
const entityName = p.parseEntityName(true, false, undefined);
|
|
434
451
|
return p.token() === SyntaxKind.EndOfFile && p.diagnostics.length === 0 ? entityName : undefined;
|
|
435
452
|
}
|
|
436
453
|
|
|
@@ -981,9 +998,13 @@ export class Parser extends ScannerErrorReporter {
|
|
|
981
998
|
case ListElement.ClassElement:
|
|
982
999
|
return this.parseClassElement();
|
|
983
1000
|
case ListElement.HeritageClause:
|
|
984
|
-
return this.parseHeritageClause();
|
|
1001
|
+
return this.parseHeritageClause(false);
|
|
1002
|
+
case ListElement.InterfaceHeritageClause:
|
|
1003
|
+
return this.parseHeritageClause(true);
|
|
985
1004
|
case ListElement.ExpressionWithTypeArguments:
|
|
986
1005
|
return this.parseExpressionWithTypeArguments();
|
|
1006
|
+
case ListElement.TypeHeritageClauseElement:
|
|
1007
|
+
return this.parseTypeHeritageClauseElement();
|
|
987
1008
|
case ListElement.EnumMember:
|
|
988
1009
|
return this.parseEnumMember();
|
|
989
1010
|
case ListElement.ImportSpecifier:
|
|
@@ -2204,9 +2225,18 @@ export class Parser extends ScannerErrorReporter {
|
|
|
2204
2225
|
// The name isn't parsed in an await context; the checker reports `await` names.
|
|
2205
2226
|
const name = this.parseNameOfClassDeclarationOrExpression();
|
|
2206
2227
|
const typeParameters = this.parseTypeParameters();
|
|
2207
|
-
|
|
2228
|
+
// An exported class at the top level of a module, not one nested in a block or a namespace, has its
|
|
2229
|
+
// heritage clauses and members parsed in an await context.
|
|
2230
|
+
if (
|
|
2231
|
+
modifiers !== undefined &&
|
|
2232
|
+
(this.parsingContexts & (1 << ParsingContext.SourceElements)) !== 0 &&
|
|
2233
|
+
(this.parsingContexts &
|
|
2234
|
+
((1 << ParsingContext.BlockStatements) | (1 << ParsingContext.SwitchClauseStatements))) ===
|
|
2235
|
+
0 &&
|
|
2236
|
+
hasModifierOfKind(modifiers, SyntaxKind.ExportKeyword)
|
|
2237
|
+
)
|
|
2208
2238
|
this.setContextFlags(NodeFlags.AwaitContext, true);
|
|
2209
|
-
const heritageClauses = this.parseHeritageClauses();
|
|
2239
|
+
const heritageClauses = this.parseHeritageClauses(false);
|
|
2210
2240
|
let members: NodeList;
|
|
2211
2241
|
if (this.parseExpected(SyntaxKind.OpenBraceToken)) {
|
|
2212
2242
|
members = this.parseList(ParsingContext.ClassMembers, ListElement.ClassElement);
|
|
@@ -2248,23 +2278,47 @@ export class Parser extends ScannerErrorReporter {
|
|
|
2248
2278
|
return this.token() === SyntaxKind.ImplementsKeyword && this.lookAhead(nextTokenIsIdentifierOrKeyword);
|
|
2249
2279
|
}
|
|
2250
2280
|
|
|
2251
|
-
parseHeritageClauses(): NodeList | undefined {
|
|
2281
|
+
parseHeritageClauses(isInterface: boolean): NodeList | undefined {
|
|
2252
2282
|
return this.isHeritageClause()
|
|
2253
|
-
? this.parseList(
|
|
2283
|
+
? this.parseList(
|
|
2284
|
+
ParsingContext.HeritageClauses,
|
|
2285
|
+
isInterface ? ListElement.InterfaceHeritageClause : ListElement.HeritageClause,
|
|
2286
|
+
)
|
|
2254
2287
|
: undefined;
|
|
2255
2288
|
}
|
|
2256
2289
|
|
|
2257
|
-
parseHeritageClause(): Node {
|
|
2290
|
+
parseHeritageClause(isInterface: boolean): Node {
|
|
2258
2291
|
const pos = this.nodePos();
|
|
2259
2292
|
const kind = this.token();
|
|
2260
2293
|
this.nextToken();
|
|
2294
|
+
// A class's `implements` and an interface's `extends` name types: their elements are type references.
|
|
2295
|
+
const isTypeClause = isInterface ? kind === SyntaxKind.ExtendsKeyword : kind === SyntaxKind.ImplementsKeyword;
|
|
2261
2296
|
const types = this.parseDelimitedList(
|
|
2262
2297
|
ParsingContext.HeritageClauseElement,
|
|
2263
|
-
ListElement.ExpressionWithTypeArguments,
|
|
2298
|
+
isTypeClause ? ListElement.TypeHeritageClauseElement : ListElement.ExpressionWithTypeArguments,
|
|
2264
2299
|
)!;
|
|
2265
2300
|
return this.checkJSSyntax(this.finishNode(new HeritageClause(kind, types), pos));
|
|
2266
2301
|
}
|
|
2267
2302
|
|
|
2303
|
+
/** A type reference when the element is an entity name with optional type arguments, otherwise the
|
|
2304
|
+
* `ExpressionWithTypeArguments`, which the checker reports. */
|
|
2305
|
+
parseTypeHeritageClauseElement(): Node {
|
|
2306
|
+
const pos = this.nodePos();
|
|
2307
|
+
const element = this.parseExpressionWithTypeArguments() as ExpressionWithTypeArguments;
|
|
2308
|
+
if (!isValidHeritageTypeReferenceExpression(element.expression)) return element;
|
|
2309
|
+
const typeName = this.convertEntityNameExpressionToEntityName(element.expression);
|
|
2310
|
+
return this.finishNode(new TypeReferenceNode(typeName, element.typeArguments), pos);
|
|
2311
|
+
}
|
|
2312
|
+
|
|
2313
|
+
/** The `QualifiedName` chain for an identifier or a chain of property accesses, spanning the same text. */
|
|
2314
|
+
convertEntityNameExpressionToEntityName(node: Node): Node {
|
|
2315
|
+
if (node instanceof Identifier) return node;
|
|
2316
|
+
const access = node as PropertyAccessExpression;
|
|
2317
|
+
// The name can be a private name, as upstream's.
|
|
2318
|
+
const result = new QualifiedName(this.convertEntityNameExpressionToEntityName(access.expression), access.name);
|
|
2319
|
+
return this.finishNodeWithEnd(result, node.pos, node.end);
|
|
2320
|
+
}
|
|
2321
|
+
|
|
2268
2322
|
parseExpressionWithTypeArguments(): Node {
|
|
2269
2323
|
const pos = this.nodePos();
|
|
2270
2324
|
const expression = this.parseLeftHandSideExpressionOrHigher();
|
|
@@ -2556,7 +2610,7 @@ export class Parser extends ScannerErrorReporter {
|
|
|
2556
2610
|
this.parseExpected(SyntaxKind.InterfaceKeyword);
|
|
2557
2611
|
const name = this.parseIdentifier(IdentifierUse.Name);
|
|
2558
2612
|
const typeParameters = this.parseTypeParameters();
|
|
2559
|
-
const heritageClauses = this.parseHeritageClauses();
|
|
2613
|
+
const heritageClauses = this.parseHeritageClauses(true);
|
|
2560
2614
|
const members = this.parseObjectTypeMembers();
|
|
2561
2615
|
const result = this.finishWithJSDoc(
|
|
2562
2616
|
new InterfaceDeclaration(modifiers, name, typeParameters, heritageClauses, members),
|
|
@@ -2650,10 +2704,15 @@ export class Parser extends ScannerErrorReporter {
|
|
|
2650
2704
|
} else {
|
|
2651
2705
|
name = this.parseLiteralExpression(true);
|
|
2652
2706
|
}
|
|
2707
|
+
// `declare module "*.ext" with { type: "..." }`: the import attributes the module matches.
|
|
2708
|
+
const attributes =
|
|
2709
|
+
keyword === SyntaxKind.ModuleKeyword && this.parseOptional(SyntaxKind.WithKeyword)
|
|
2710
|
+
? (this.parseTypeLiteral() as TypeLiteralNode)
|
|
2711
|
+
: undefined;
|
|
2653
2712
|
let body: Node | undefined;
|
|
2654
2713
|
if (this.token() === SyntaxKind.OpenBraceToken) body = this.parseModuleBlock();
|
|
2655
2714
|
else this.parseSemicolon();
|
|
2656
|
-
const result = this.finishWithJSDoc(new ModuleDeclaration(modifiers, keyword, name, body), pos, jsdoc);
|
|
2715
|
+
const result = this.finishWithJSDoc(new ModuleDeclaration(modifiers, keyword, name, attributes, body), pos, jsdoc);
|
|
2657
2716
|
this.statementHasAwaitIdentifier = saveHasAwaitIdentifier;
|
|
2658
2717
|
return result;
|
|
2659
2718
|
}
|
|
@@ -2696,7 +2755,7 @@ export class Parser extends ScannerErrorReporter {
|
|
|
2696
2755
|
} else {
|
|
2697
2756
|
body = this.parseModuleBlock();
|
|
2698
2757
|
}
|
|
2699
|
-
const result = this.finishWithJSDoc(new ModuleDeclaration(modifiers, keyword, name, body), pos, jsdoc);
|
|
2758
|
+
const result = this.finishWithJSDoc(new ModuleDeclaration(modifiers, keyword, name, undefined, body), pos, jsdoc);
|
|
2700
2759
|
this.checkJSSyntax(result);
|
|
2701
2760
|
this.statementHasAwaitIdentifier = saveHasAwaitIdentifier;
|
|
2702
2761
|
return result;
|
|
@@ -2711,6 +2770,7 @@ export class Parser extends ScannerErrorReporter {
|
|
|
2711
2770
|
const afterImportPos = this.nodePos();
|
|
2712
2771
|
// The identifier isn't parsed in an await context; the checker reports `await`.
|
|
2713
2772
|
const saveHasAwaitIdentifier = this.statementHasAwaitIdentifier;
|
|
2773
|
+
const phaseModifierCandidate = this.currentImportPhaseModifier();
|
|
2714
2774
|
let identifier = this.isIdentifier() ? this.parseIdentifier(IdentifierUse.Name) : undefined;
|
|
2715
2775
|
let phaseModifier = SyntaxKind.Unknown;
|
|
2716
2776
|
if (
|
|
@@ -2722,20 +2782,19 @@ export class Parser extends ScannerErrorReporter {
|
|
|
2722
2782
|
) {
|
|
2723
2783
|
phaseModifier = SyntaxKind.TypeKeyword;
|
|
2724
2784
|
identifier = this.isIdentifier() ? this.parseIdentifier(IdentifierUse.Name) : undefined;
|
|
2725
|
-
} else if (
|
|
2726
|
-
|
|
2727
|
-
|
|
2728
|
-
|
|
2729
|
-
|
|
2730
|
-
|
|
2731
|
-
|
|
2732
|
-
identifier = this.isIdentifier() ? this.parseIdentifier(IdentifierUse.Name) : undefined;
|
|
2733
|
-
}
|
|
2785
|
+
} else if (
|
|
2786
|
+
identifier !== undefined &&
|
|
2787
|
+
phaseModifierCandidate !== SyntaxKind.Unknown &&
|
|
2788
|
+
this.shouldParseImportPhaseModifier()
|
|
2789
|
+
) {
|
|
2790
|
+
phaseModifier = phaseModifierCandidate;
|
|
2791
|
+
identifier = this.isIdentifier() ? this.parseIdentifier(IdentifierUse.Name) : undefined;
|
|
2734
2792
|
}
|
|
2735
2793
|
if (
|
|
2736
2794
|
identifier !== undefined &&
|
|
2737
2795
|
!this.tokenAfterImportedIdentifierDefinitelyProducesImportDeclaration() &&
|
|
2738
|
-
phaseModifier !== SyntaxKind.DeferKeyword
|
|
2796
|
+
phaseModifier !== SyntaxKind.DeferKeyword &&
|
|
2797
|
+
phaseModifier !== SyntaxKind.SourceKeyword
|
|
2739
2798
|
) {
|
|
2740
2799
|
const importEquals = this.checkJSSyntax(
|
|
2741
2800
|
this.parseImportEqualsDeclaration(pos, jsdoc, modifiers, identifier, phaseModifier === SyntaxKind.TypeKeyword),
|
|
@@ -2763,6 +2822,30 @@ export class Parser extends ScannerErrorReporter {
|
|
|
2763
2822
|
return this.token() === SyntaxKind.AsteriskToken || this.token() === SyntaxKind.OpenBraceToken;
|
|
2764
2823
|
}
|
|
2765
2824
|
|
|
2825
|
+
/** In `import defer ___` or `import source ___`, whether `defer` or `source` is a phase modifier rather than the
|
|
2826
|
+
* default import's name. */
|
|
2827
|
+
shouldParseImportPhaseModifier(): boolean {
|
|
2828
|
+
switch (this.token()) {
|
|
2829
|
+
case SyntaxKind.CommaToken:
|
|
2830
|
+
case SyntaxKind.EqualsToken:
|
|
2831
|
+
return false;
|
|
2832
|
+
case SyntaxKind.FromKeyword:
|
|
2833
|
+
return !this.lookAhead(nextTokenIsTokenStringLiteral);
|
|
2834
|
+
}
|
|
2835
|
+
return true;
|
|
2836
|
+
}
|
|
2837
|
+
|
|
2838
|
+
/** The phase modifier the current token's text spells, written without escapes, or `Unknown`. */
|
|
2839
|
+
currentImportPhaseModifier(): SyntaxKind {
|
|
2840
|
+
switch (this.scanner.getTokenText()) {
|
|
2841
|
+
case 'defer':
|
|
2842
|
+
return SyntaxKind.DeferKeyword;
|
|
2843
|
+
case 'source':
|
|
2844
|
+
return SyntaxKind.SourceKeyword;
|
|
2845
|
+
}
|
|
2846
|
+
return SyntaxKind.Unknown;
|
|
2847
|
+
}
|
|
2848
|
+
|
|
2766
2849
|
/** In `import id ___`, whether the token makes this an ImportDeclaration rather than ImportEqualsDeclaration. */
|
|
2767
2850
|
tokenAfterImportedIdentifierDefinitelyProducesImportDeclaration(): boolean {
|
|
2768
2851
|
return this.token() === SyntaxKind.CommaToken || this.token() === SyntaxKind.FromKeyword;
|
|
@@ -2788,7 +2871,7 @@ export class Parser extends ScannerErrorReporter {
|
|
|
2788
2871
|
parseModuleReference(): Node {
|
|
2789
2872
|
if (this.token() === SyntaxKind.RequireKeyword && this.lookAhead(nextTokenIsOpenParen))
|
|
2790
2873
|
return this.parseExternalModuleReference();
|
|
2791
|
-
return this.parseEntityName(false, undefined);
|
|
2874
|
+
return this.parseEntityName(false, false, undefined);
|
|
2792
2875
|
}
|
|
2793
2876
|
|
|
2794
2877
|
parseExternalModuleReference(): Node {
|
|
@@ -2826,6 +2909,9 @@ export class Parser extends ScannerErrorReporter {
|
|
|
2826
2909
|
this.parseExpected(SyntaxKind.FromKeyword);
|
|
2827
2910
|
return importClause;
|
|
2828
2911
|
}
|
|
2912
|
+
// A phase modifier without bindings still makes an import clause; the checker reports it.
|
|
2913
|
+
if (phaseModifier === SyntaxKind.DeferKeyword || phaseModifier === SyntaxKind.SourceKeyword)
|
|
2914
|
+
return this.finishNode(new ImportClause(phaseModifier, undefined, undefined), pos) as ImportClause;
|
|
2829
2915
|
return undefined;
|
|
2830
2916
|
}
|
|
2831
2917
|
|
|
@@ -3391,12 +3477,16 @@ export class Parser extends ScannerErrorReporter {
|
|
|
3391
3477
|
}
|
|
3392
3478
|
|
|
3393
3479
|
parseEntityNameOfTypeReference(): EntityName {
|
|
3394
|
-
return this.parseEntityName(true, Diagnostics.Type_expected);
|
|
3480
|
+
return this.parseEntityName(true, false, Diagnostics.Type_expected);
|
|
3395
3481
|
}
|
|
3396
3482
|
|
|
3397
|
-
/**
|
|
3483
|
+
/**
|
|
3484
|
+
* An entity name; `use` is for its first identifier, the qualified names' right sides are names.
|
|
3485
|
+
* Only a type query allows private names on the right (`typeof this.#x`).
|
|
3486
|
+
*/
|
|
3398
3487
|
parseEntityName(
|
|
3399
3488
|
allowReservedWords: boolean,
|
|
3489
|
+
allowPrivateName: boolean,
|
|
3400
3490
|
diagnosticMessage: DiagnosticMessage | undefined,
|
|
3401
3491
|
use: IdentifierUse = IdentifierUse.Name,
|
|
3402
3492
|
): EntityName {
|
|
@@ -3408,7 +3498,7 @@ export class Parser extends ScannerErrorReporter {
|
|
|
3408
3498
|
// A JSDoc-style generic; the checker reports the gap between the name and the type arguments.
|
|
3409
3499
|
if (this.token() === SyntaxKind.LessThanToken) break;
|
|
3410
3500
|
entity = this.finishNode(
|
|
3411
|
-
new QualifiedName(entity, this.
|
|
3501
|
+
new QualifiedName(entity, this.parseRightSideOfDot(allowReservedWords, allowPrivateName, true)),
|
|
3412
3502
|
pos,
|
|
3413
3503
|
);
|
|
3414
3504
|
}
|
|
@@ -3614,7 +3704,7 @@ export class Parser extends ScannerErrorReporter {
|
|
|
3614
3704
|
parseTypeQuery(): TypeNode {
|
|
3615
3705
|
const pos = this.nodePos();
|
|
3616
3706
|
this.parseExpected(SyntaxKind.TypeOfKeyword);
|
|
3617
|
-
const entityName = this.parseEntityName(true, undefined, IdentifierUse.Reference);
|
|
3707
|
+
const entityName = this.parseEntityName(true, true, undefined, IdentifierUse.Reference);
|
|
3618
3708
|
// ASI: don't parse the next line's type arguments as part of an instantiation expression.
|
|
3619
3709
|
const typeArguments = this.hasPrecedingLineBreak() ? undefined : this.parseTypeArguments();
|
|
3620
3710
|
return this.finishNode(new TypeQueryNode(entityName, typeArguments), pos);
|
|
@@ -4736,15 +4826,13 @@ export class Parser extends ScannerErrorReporter {
|
|
|
4736
4826
|
// Take a left-associative operator when its precedence is higher than the current one (so
|
|
4737
4827
|
// `a - b - c` returns `b` as the right operand of the first `-`), and `**` (right
|
|
4738
4828
|
// associative) when it is at least as high.
|
|
4739
|
-
|
|
4740
|
-
operator === SyntaxKind.AsteriskAsteriskToken ? newPrecedence >= precedence : newPrecedence > precedence;
|
|
4741
|
-
if (!consumeCurrentOperator) break;
|
|
4829
|
+
if (!shouldConsumeBinaryOperator(operator, newPrecedence, precedence)) break;
|
|
4742
4830
|
if (operator === SyntaxKind.InKeyword && this.inDisallowInContext()) break;
|
|
4743
4831
|
if (operator === SyntaxKind.AsKeyword || operator === SyntaxKind.SatisfiesKeyword) {
|
|
4744
4832
|
// ASI applies before `as`: `var x = foo \n as (Bar)` is a declaration and a call to `as`.
|
|
4745
4833
|
if (this.hasPrecedingLineBreak()) break;
|
|
4746
4834
|
this.nextToken();
|
|
4747
|
-
// In `a ## b as T`, stop
|
|
4835
|
+
// In `a ## b as T $$ c`, stop when `$$` would bind before `##` once the `as` is erased: the
|
|
4748
4836
|
// `as` couldn't be erased without changing the meaning (TypeScript#63527).
|
|
4749
4837
|
const lastPrecedence =
|
|
4750
4838
|
lastOperand instanceof BinaryExpression
|
|
@@ -4754,7 +4842,8 @@ export class Parser extends ScannerErrorReporter {
|
|
|
4754
4842
|
operator === SyntaxKind.SatisfiesKeyword
|
|
4755
4843
|
? this.makeSatisfiesExpression(leftOperand, this.parseType())
|
|
4756
4844
|
: this.makeAsExpression(leftOperand, this.parseType());
|
|
4757
|
-
|
|
4845
|
+
const nextOperator = this.reScanGreaterThanToken();
|
|
4846
|
+
if (shouldConsumeBinaryOperator(nextOperator, getBinaryOperatorPrecedence(nextOperator), lastPrecedence)) break;
|
|
4758
4847
|
} else {
|
|
4759
4848
|
leftOperand = this.makeBinaryExpression(
|
|
4760
4849
|
leftOperand,
|
|
@@ -5170,8 +5259,9 @@ export class Parser extends ScannerErrorReporter {
|
|
|
5170
5259
|
if (this.token() === SyntaxKind.EqualsToken) {
|
|
5171
5260
|
if (this.scanJsxAttributeValue() === SyntaxKind.StringLiteral) return this.parseLiteralExpression(false);
|
|
5172
5261
|
if (this.token() === SyntaxKind.OpenBraceToken) return this.parseJsxExpression(true);
|
|
5262
|
+
// An attribute value is a single element: sibling-element recovery must not wrap it in a binary expression.
|
|
5173
5263
|
if (this.token() === SyntaxKind.LessThanToken)
|
|
5174
|
-
return this.parseJsxElementOrSelfClosingElementOrFragment(true, -1, undefined,
|
|
5264
|
+
return this.parseJsxElementOrSelfClosingElementOrFragment(true, -1, undefined, true);
|
|
5175
5265
|
this.parseErrorAtCurrentToken(Diagnostics.X_or_JSX_element_expected);
|
|
5176
5266
|
}
|
|
5177
5267
|
return undefined;
|
|
@@ -5290,9 +5380,9 @@ export class Parser extends ScannerErrorReporter {
|
|
|
5290
5380
|
// An `import.*` meta property, such as `import.meta`.
|
|
5291
5381
|
this.nextToken();
|
|
5292
5382
|
this.nextToken();
|
|
5293
|
-
const name = this.
|
|
5383
|
+
const name = this.parseImportMetaPropertyName();
|
|
5294
5384
|
expression = this.finishNode(new MetaProperty(SyntaxKind.ImportKeyword, name), pos);
|
|
5295
|
-
if (
|
|
5385
|
+
if (isImportPhaseMetaProperty(expression)) {
|
|
5296
5386
|
if (this.token() === SyntaxKind.OpenParenToken || this.token() === SyntaxKind.LessThanToken)
|
|
5297
5387
|
this.sourceFlags |= NodeFlags.PossiblyContainsDynamicImport;
|
|
5298
5388
|
} else {
|
|
@@ -5310,6 +5400,16 @@ export class Parser extends ScannerErrorReporter {
|
|
|
5310
5400
|
return this.parseCallExpressionRest(pos, expression);
|
|
5311
5401
|
}
|
|
5312
5402
|
|
|
5403
|
+
/** The name after `import.`; `defer` and `source` written with escapes are reported. */
|
|
5404
|
+
parseImportMetaPropertyName(): Identifier {
|
|
5405
|
+
if (
|
|
5406
|
+
(this.token() === SyntaxKind.DeferKeyword || this.token() === SyntaxKind.SourceKeyword) &&
|
|
5407
|
+
this.currentImportPhaseModifier() === SyntaxKind.Unknown
|
|
5408
|
+
)
|
|
5409
|
+
this.parseErrorAtCurrentToken(Diagnostics.Keywords_cannot_contain_escape_characters);
|
|
5410
|
+
return this.parseIdentifierName(IdentifierUse.Name);
|
|
5411
|
+
}
|
|
5412
|
+
|
|
5313
5413
|
parseSuperExpression(): Expression {
|
|
5314
5414
|
const pos = this.nodePos();
|
|
5315
5415
|
let expression = this.parseKeywordExpression();
|
|
@@ -5504,13 +5604,18 @@ export class Parser extends ScannerErrorReporter {
|
|
|
5504
5604
|
): Expression {
|
|
5505
5605
|
let argumentExpression: Expression;
|
|
5506
5606
|
if (this.token() === SyntaxKind.CloseBracketToken) {
|
|
5607
|
+
// The missing argument is created before the error, so the error marks the element access.
|
|
5608
|
+
argumentExpression = this.createMissingIdentifier();
|
|
5507
5609
|
this.parseErrorAt(
|
|
5508
5610
|
this.nodePos(),
|
|
5509
5611
|
this.nodePos(),
|
|
5510
5612
|
Diagnostics.An_element_access_expression_should_take_an_argument,
|
|
5511
5613
|
);
|
|
5512
|
-
argumentExpression = this.createMissingIdentifier();
|
|
5513
5614
|
} else {
|
|
5615
|
+
// tsgo creates the missing argument first and drops it when there is one. Finishing that node takes the
|
|
5616
|
+
// error flag of an error before the argument (`i[01]`), so the argument doesn't get it.
|
|
5617
|
+
this.identifierCount++;
|
|
5618
|
+
this.hasParseError = false;
|
|
5514
5619
|
const argument = this.parseExpressionAllowIn();
|
|
5515
5620
|
if (
|
|
5516
5621
|
argument.kind === SyntaxKind.StringLiteral ||
|
|
@@ -6794,7 +6899,9 @@ export class Parser extends ScannerErrorReporter {
|
|
|
6794
6899
|
}
|
|
6795
6900
|
|
|
6796
6901
|
jsonError(node: Node, message: DiagnosticMessage): void {
|
|
6797
|
-
|
|
6902
|
+
// A missing node (a property without a value) keeps its position: trivia after it isn't its own.
|
|
6903
|
+
const pos = nodeIsMissing(node) ? node.pos : skipTrivia(this.sourceText, node.pos);
|
|
6904
|
+
this.diagnostics.push(new Diagnostic(undefined, pos, node.end, message, noArgs));
|
|
6798
6905
|
}
|
|
6799
6906
|
|
|
6800
6907
|
validateJsonValue(sourceFile: SourceFile, value: Node): void {
|
|
@@ -7168,6 +7275,16 @@ function nextTokenIsOpenParen(p: Parser): boolean {
|
|
|
7168
7275
|
return p.nextToken() === SyntaxKind.OpenParenToken;
|
|
7169
7276
|
}
|
|
7170
7277
|
|
|
7278
|
+
/** An identifier or a chain of property accesses without optional chaining, each name present. */
|
|
7279
|
+
function isValidHeritageTypeReferenceExpression(node: Node): boolean {
|
|
7280
|
+
if (node instanceof Identifier) return nodeIsPresent(node);
|
|
7281
|
+
if (!(node instanceof PropertyAccessExpression) || (node.flags & NodeFlags.OptionalChain) !== 0) return false;
|
|
7282
|
+
return (
|
|
7283
|
+
nodeIsPresent((node as PropertyAccessExpression).name) &&
|
|
7284
|
+
isValidHeritageTypeReferenceExpression((node as PropertyAccessExpression).expression)
|
|
7285
|
+
);
|
|
7286
|
+
}
|
|
7287
|
+
|
|
7171
7288
|
function nextTokenIsOpenBrace(p: Parser): boolean {
|
|
7172
7289
|
return p.nextToken() === SyntaxKind.OpenBraceToken;
|
|
7173
7290
|
}
|
|
@@ -7753,7 +7870,7 @@ export function isNodeCoreModule(moduleName: string): boolean {
|
|
|
7753
7870
|
}
|
|
7754
7871
|
|
|
7755
7872
|
// `require('module').builtinModules`, without and with only the `node:` prefix.
|
|
7756
|
-
const unprefixedNodeCoreModules = new Set<string>([
|
|
7873
|
+
export const unprefixedNodeCoreModules = new Set<string>([
|
|
7757
7874
|
'assert',
|
|
7758
7875
|
'assert/strict',
|
|
7759
7876
|
'async_hooks',
|
|
@@ -7810,7 +7927,7 @@ const unprefixedNodeCoreModules = new Set<string>([
|
|
|
7810
7927
|
'zlib',
|
|
7811
7928
|
]);
|
|
7812
7929
|
|
|
7813
|
-
const exclusivelyPrefixedNodeCoreModules = new Set<string>([
|
|
7930
|
+
export const exclusivelyPrefixedNodeCoreModules = new Set<string>([
|
|
7814
7931
|
'node:quic',
|
|
7815
7932
|
'node:sea',
|
|
7816
7933
|
'node:sqlite',
|
package/src/compiler/path.ts
CHANGED
|
@@ -139,6 +139,28 @@ export function isRootedDiskPath(path: string): boolean {
|
|
|
139
139
|
return getEncodedRootLength(path) > 0;
|
|
140
140
|
}
|
|
141
141
|
|
|
142
|
+
/**
|
|
143
|
+
* Whether Windows may resolve `path` over the network: a UNC path (`//server/share`), a Win32 device path
|
|
144
|
+
* (`//?/…`, `//./…`) or an NT object path (`/??/…`), with either separator. Device and object paths count even
|
|
145
|
+
* for local volumes, since their `UNC` and `GLOBALROOT` forms reach the network redirector. Accessing one can
|
|
146
|
+
* make Windows authenticate to an arbitrary host, so such paths are never accessed on any platform.
|
|
147
|
+
*/
|
|
148
|
+
export function isNetworkPath(path: string): boolean {
|
|
149
|
+
if (path.length < 2 || !isAnyDirectorySeparator(path.charCodeAt(0))) return false;
|
|
150
|
+
if (isAnyDirectorySeparator(path.charCodeAt(1))) return true;
|
|
151
|
+
return (
|
|
152
|
+
path.length >= 3 &&
|
|
153
|
+
path.charCodeAt(1) === 0x3f &&
|
|
154
|
+
path.charCodeAt(2) === 0x3f &&
|
|
155
|
+
(path.length === 3 || isAnyDirectorySeparator(path.charCodeAt(3)))
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** Whether a path written in a config or on the command line names a network location once resolved. */
|
|
160
|
+
export function isNetworkPathValue(value: string, basePath: string): boolean {
|
|
161
|
+
return isNetworkPath(getNormalizedAbsolutePath(value, basePath));
|
|
162
|
+
}
|
|
163
|
+
|
|
142
164
|
export function pathIsAbsolute(path: string): boolean {
|
|
143
165
|
return getEncodedRootLength(path) !== 0;
|
|
144
166
|
}
|
|
@@ -370,8 +392,6 @@ function isNonDotDotPrefix(normalized: string, rootLength: number): boolean {
|
|
|
370
392
|
/** Removes `.`, `..` and duplicate separators, keeping a trailing separator. */
|
|
371
393
|
export function normalizePath(path: string): string {
|
|
372
394
|
path = normalizeSlashes(path);
|
|
373
|
-
const simple = simpleNormalizePath(path);
|
|
374
|
-
if (simple !== undefined) return simple;
|
|
375
395
|
const normalized = getNormalizedAbsolutePath(path, '');
|
|
376
396
|
return normalized !== '' && hasTrailingDirectorySeparator(path)
|
|
377
397
|
? ensureTrailingDirectorySeparator(normalized)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Side tables that transforms fill in and the printer reads: original nodes, emit flags,
|
|
2
2
|
// comment and source map ranges, synthesized comments, generated names and emit helpers.
|
|
3
3
|
import {
|
|
4
|
+
Block,
|
|
4
5
|
ExpressionStatement,
|
|
5
6
|
FunctionDeclaration,
|
|
6
7
|
Identifier,
|
|
@@ -287,6 +288,11 @@ export class EmitContext extends NodeFactory {
|
|
|
287
288
|
|
|
288
289
|
// Emit data
|
|
289
290
|
|
|
291
|
+
/** Whether `node` has emit data: flags, ranges, helpers or synthesized comments. */
|
|
292
|
+
hasEmitNode(node: Node): boolean {
|
|
293
|
+
return this.lookup(node) !== undefined;
|
|
294
|
+
}
|
|
295
|
+
|
|
290
296
|
getEmitFlags(node: Node): EmitFlags {
|
|
291
297
|
const emitNode = this.lookup(node);
|
|
292
298
|
return emitNode === undefined ? EmitFlags.None : emitNode.emitFlags;
|
|
@@ -594,6 +600,21 @@ export class EmitContext extends NodeFactory {
|
|
|
594
600
|
return node;
|
|
595
601
|
}
|
|
596
602
|
|
|
603
|
+
/** `node` as a function body: a block as it is, an expression as `{ return node; }` with the expression's range. */
|
|
604
|
+
convertToFunctionBlock(node: Node, multiLine: boolean): Block {
|
|
605
|
+
if (node instanceof Block) return node as Block;
|
|
606
|
+
const factory = this.factory;
|
|
607
|
+
const statement = factory.createReturnStatement(node);
|
|
608
|
+
statement.pos = node.pos;
|
|
609
|
+
statement.end = node.end;
|
|
610
|
+
const block = factory.createBlock([statement], multiLine);
|
|
611
|
+
block.statements.pos = node.pos;
|
|
612
|
+
block.statements.end = node.end;
|
|
613
|
+
block.pos = node.pos;
|
|
614
|
+
block.end = node.end;
|
|
615
|
+
return block;
|
|
616
|
+
}
|
|
617
|
+
|
|
597
618
|
/** Marks the current variable scope as visiting parameters; returns the previous flags. */
|
|
598
619
|
enterParameters(): number {
|
|
599
620
|
const scope = this.varScopes[this.varScopes.length - 1]!;
|
|
@@ -1831,10 +1831,17 @@ export abstract class NodeFactoryBase {
|
|
|
1831
1831
|
modifiers: ModifierList | undefined,
|
|
1832
1832
|
keyword: SyntaxKind,
|
|
1833
1833
|
name: ModuleName,
|
|
1834
|
+
attributes: TypeLiteralNode | undefined,
|
|
1834
1835
|
body: ModuleBody | undefined,
|
|
1835
1836
|
): ModuleDeclaration {
|
|
1836
|
-
if (
|
|
1837
|
-
|
|
1837
|
+
if (
|
|
1838
|
+
modifiers !== node.modifiers ||
|
|
1839
|
+
keyword !== node.keyword ||
|
|
1840
|
+
name !== node.name ||
|
|
1841
|
+
attributes !== node.attributes ||
|
|
1842
|
+
body !== node.body
|
|
1843
|
+
) {
|
|
1844
|
+
const updated = new ModuleDeclaration(modifiers, keyword, name, attributes, body);
|
|
1838
1845
|
this.finishUpdate(updated, node);
|
|
1839
1846
|
return updated;
|
|
1840
1847
|
}
|
|
@@ -2121,7 +2128,7 @@ export abstract class NodeFactoryBase {
|
|
|
2121
2128
|
return node;
|
|
2122
2129
|
}
|
|
2123
2130
|
|
|
2124
|
-
updateQualifiedName(node: QualifiedName, left: EntityName, right:
|
|
2131
|
+
updateQualifiedName(node: QualifiedName, left: EntityName, right: MemberName): QualifiedName {
|
|
2125
2132
|
if (left !== node.left || right !== node.right) {
|
|
2126
2133
|
const updated = new QualifiedName(left, right);
|
|
2127
2134
|
this.finishUpdate(updated, node);
|
|
@@ -318,7 +318,10 @@ export abstract class NodeFactory extends NodeFactoryBase {
|
|
|
318
318
|
createExpressionFromEntityName(node: Node): Node {
|
|
319
319
|
if (node instanceof QualifiedName) {
|
|
320
320
|
const left = this.createExpressionFromEntityName(node.left);
|
|
321
|
-
const right =
|
|
321
|
+
const right =
|
|
322
|
+
node.right instanceof PrivateIdentifier
|
|
323
|
+
? this.cloneNode(node.right, new PrivateIdentifier(node.right.text))
|
|
324
|
+
: this.cloneIdentifier(node.right as Identifier);
|
|
322
325
|
right.pos = node.right.pos;
|
|
323
326
|
right.end = node.right.end;
|
|
324
327
|
right.parent = node.right.parent;
|
|
@@ -127,8 +127,17 @@ export const exportStarHelper = new EmitHelper(
|
|
|
127
127
|
export const rewriteRelativeImportExtensionsHelper = new EmitHelper(
|
|
128
128
|
'typescript:rewriteRelativeImportExtensions',
|
|
129
129
|
false,
|
|
130
|
-
`var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
130
|
+
`var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx, extraExtensions, ignoreCase) {
|
|
131
131
|
if (typeof path === "string" && /^\\.\\.?\\//.test(path)) {
|
|
132
|
+
if (extraExtensions) {
|
|
133
|
+
for (var extension in extraExtensions) {
|
|
134
|
+
var suffix = path.slice(-extension.length);
|
|
135
|
+
if (suffix === extension || ignoreCase && suffix.toLowerCase() === extension.toLowerCase()) {
|
|
136
|
+
var output = extraExtensions[extension];
|
|
137
|
+
return output === extension ? path : path.slice(0, -extension.length) + output;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
132
141
|
return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
133
142
|
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
134
143
|
});
|
|
@@ -3,6 +3,7 @@ import {
|
|
|
3
3
|
ClassExpression,
|
|
4
4
|
ExportAssignment,
|
|
5
5
|
type Node,
|
|
6
|
+
NodeVisitor,
|
|
6
7
|
PrivateIdentifier,
|
|
7
8
|
SourceFile,
|
|
8
9
|
StringLiteral,
|
|
@@ -360,12 +361,33 @@ export function forgetIdentifierSets(): void {
|
|
|
360
361
|
identifierSets.clear();
|
|
361
362
|
}
|
|
362
363
|
|
|
363
|
-
/**
|
|
364
|
+
/** Collects the texts of a file's identifiers, private names and literals: the names its generated names avoid. */
|
|
365
|
+
class NameTextCollector extends NodeVisitor {
|
|
366
|
+
readonly texts = new Set<string>();
|
|
367
|
+
|
|
368
|
+
visitNode(node: Node): boolean {
|
|
369
|
+
switch (node.kind) {
|
|
370
|
+
case SyntaxKind.Identifier:
|
|
371
|
+
case SyntaxKind.PrivateIdentifier:
|
|
372
|
+
case SyntaxKind.StringLiteral:
|
|
373
|
+
case SyntaxKind.NumericLiteral:
|
|
374
|
+
case SyntaxKind.BigIntLiteral:
|
|
375
|
+
case SyntaxKind.NoSubstitutionTemplateLiteral:
|
|
376
|
+
this.texts.add(getText(node));
|
|
377
|
+
}
|
|
378
|
+
node.forEachChild(this);
|
|
379
|
+
return false;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/** Whether no identifier, private name or literal in `file` has the text `name`. */
|
|
364
384
|
export function isFileLevelUniqueName(file: SourceFile, name: string): boolean {
|
|
365
385
|
let set = identifierSets.get(file);
|
|
366
386
|
if (set === undefined) {
|
|
367
387
|
if (identifierSets.size >= 16) identifierSets.clear();
|
|
368
|
-
|
|
388
|
+
const collector = new NameTextCollector();
|
|
389
|
+
file.forEachChild(collector);
|
|
390
|
+
set = collector.texts;
|
|
369
391
|
identifierSets.set(file, set);
|
|
370
392
|
}
|
|
371
393
|
return !set.has(name);
|