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.
- package/README.md +1 -1
- 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 +29 -18
- package/dist/api/compiler/ast.js +1040 -1007
- 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 +173 -123
- package/dist/api/compiler/checker-classes.d.ts +14 -3
- package/dist/api/compiler/checker-classes.js +136 -91
- package/dist/api/compiler/checker-contextual.d.ts +20 -0
- package/dist/api/compiler/checker-contextual.js +175 -62
- 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 +258 -212
- 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 +469 -438
- 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 -113
- 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 +107 -89
- package/dist/api/compiler/checker-members.d.ts +9 -2
- package/dist/api/compiler/checker-members.js +210 -74
- 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 +190 -46
- 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 +97 -31
- package/dist/api/compiler/checker.js +149 -35
- 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 +24 -4
- package/dist/api/compiler/compile-program.js +53 -26
- package/dist/api/compiler/diagnostic-messages.d.ts +1849 -1774
- package/dist/api/compiler/diagnostic-messages.js +128 -122
- package/dist/api/compiler/diagnostics.js +7 -7
- package/dist/api/compiler/emitter.d.ts +7 -1
- package/dist/api/compiler/emitter.js +53 -11
- package/dist/api/compiler/expr-record.d.ts +11 -0
- package/dist/api/compiler/expr-record.js +53 -0
- 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 +10 -0
- package/dist/api/compiler/file-loader.js +138 -41
- package/dist/api/compiler/identifier-name.d.ts +9 -0
- package/dist/api/compiler/identifier-name.js +10 -0
- package/dist/api/compiler/instantiation.d.ts +7 -0
- package/dist/api/compiler/instantiation.js +101 -49
- package/dist/api/compiler/jsdoc.js +27 -25
- 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/parser.d.ts +42 -20
- package/dist/api/compiler/parser.js +318 -224
- 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 +3 -1
- package/dist/api/compiler/printer/emit-context.js +16 -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 +6 -3
- 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 +1 -0
- package/dist/api/compiler/printer/printer.js +306 -283
- package/dist/api/compiler/printer/utilities.js +149 -147
- package/dist/api/compiler/program-checker.d.ts +8 -2
- package/dist/api/compiler/program-checker.js +84 -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 +2 -0
- package/dist/api/compiler/program.js +69 -57
- 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 +337 -180
- package/dist/api/compiler/reparser.js +64 -59
- package/dist/api/compiler/scanner.d.ts +27 -2
- package/dist/api/compiler/scanner.js +181 -150
- package/dist/api/compiler/shared-results.d.ts +696 -0
- package/dist/api/compiler/shared-results.js +2905 -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 +22 -13
- package/dist/api/compiler/symbol.js +15 -1
- 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 +307 -239
- 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 +74 -38
- package/src/compiler/binder.ts +39 -4
- package/src/compiler/cgroup.ts +157 -0
- package/src/compiler/character-codes.ts +2 -2
- package/src/compiler/checker-calls.ts +76 -8
- package/src/compiler/checker-classes.ts +80 -25
- package/src/compiler/checker-contextual.ts +110 -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 +95 -47
- package/src/compiler/checker-functions.ts +21 -6
- package/src/compiler/checker-generated-code.ts +2 -22
- package/src/compiler/checker-grammar.ts +133 -60
- package/src/compiler/checker-heritage.ts +22 -21
- package/src/compiler/checker-inference.ts +514 -87
- 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 +28 -5
- package/src/compiler/checker-members.ts +197 -55
- 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 +173 -35
- 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 +175 -41
- package/src/compiler/command-line.ts +28 -28
- package/src/compiler/compile-program.ts +59 -25
- package/src/compiler/decoder.ts +15 -5
- package/src/compiler/diagnostic-messages.ts +1973 -1892
- package/src/compiler/doctor-report.ts +133 -0
- package/src/compiler/emitter.ts +57 -8
- package/src/compiler/encoder.ts +23 -8
- package/src/compiler/expr-record.ts +59 -0
- package/src/compiler/file-include.ts +9 -3
- package/src/compiler/file-loader.ts +139 -32
- package/src/compiler/help.ts +10 -14
- package/src/compiler/identifier-name.ts +13 -0
- package/src/compiler/incremental.ts +86 -18
- package/src/compiler/init.ts +2 -7
- package/src/compiler/instantiation.ts +77 -22
- package/src/compiler/jsdoc.ts +7 -3
- 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 +543 -147
- package/src/compiler/parallel-emit.ts +4 -4
- package/src/compiler/parser.ts +166 -47
- package/src/compiler/path.ts +22 -2
- package/src/compiler/printer/emit-context.ts +16 -0
- package/src/compiler/printer/factory-base.ts +10 -3
- package/src/compiler/printer/factory.ts +7 -3
- package/src/compiler/printer/helpers.ts +10 -1
- package/src/compiler/printer/name-generator.ts +24 -2
- package/src/compiler/printer/printer.ts +39 -16
- package/src/compiler/printer/utilities.ts +8 -2
- package/src/compiler/program-checker.ts +53 -5
- package/src/compiler/program-utilities.ts +23 -10
- package/src/compiler/program.ts +13 -1
- package/src/compiler/pseudo-bigint.ts +17 -0
- package/src/compiler/regexp-checker.ts +63 -30
- package/src/compiler/relations.ts +233 -77
- package/src/compiler/reparser.ts +14 -5
- package/src/compiler/run-config.ts +1383 -0
- package/src/compiler/run-record-read.ts +87 -0
- package/src/compiler/run-records.ts +575 -0
- package/src/compiler/scanner.ts +166 -120
- package/src/compiler/shared-results.ts +3144 -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 +31 -14
- package/src/compiler/syntax-kind.ts +188 -187
- package/src/compiler/thread-entry.ts +22 -3
- 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 +136 -49
- 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 +67 -6
- package/src/compiler/tsc-cli.ts +35 -4
- package/src/compiler/tsc-compile.ts +220 -10
- package/src/compiler/tsc-watch.ts +97 -47
- 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
|
@@ -15,12 +15,12 @@
|
|
|
15
15
|
* thread's checker finds every diagnostic but those of declaration emit.
|
|
16
16
|
*/
|
|
17
17
|
import type { Worker } from 'node:worker_threads';
|
|
18
|
-
import { availableParallelism } from 'node:os';
|
|
19
18
|
import { publish } from '@scriptc/threads';
|
|
20
19
|
import { lastNodeIdValue, type SourceFile } from './ast.js';
|
|
21
20
|
import { JavaScriptEmitter, type OutputWriter } from './compile-program.js';
|
|
22
21
|
import type { Diagnostic, DiagnosticFile } from './diagnostics.js';
|
|
23
22
|
import { EmitOnly, EmitResult, sourceFileMayBeEmitted } from './emitter.js';
|
|
23
|
+
import { availableCpus } from './cgroup.js';
|
|
24
24
|
import {
|
|
25
25
|
CheckerResult,
|
|
26
26
|
packResult,
|
|
@@ -78,7 +78,7 @@ export function emitThreads(
|
|
|
78
78
|
emitKinds: readonly number[] | undefined = undefined,
|
|
79
79
|
): number {
|
|
80
80
|
if (parallelEmit.spawn === undefined || singleThreaded === true) return 0;
|
|
81
|
-
const cpus =
|
|
81
|
+
const cpus = availableCpus();
|
|
82
82
|
if (cpus < 2) return 0;
|
|
83
83
|
const files = program.getSourceFiles();
|
|
84
84
|
let text = 0;
|
|
@@ -220,7 +220,7 @@ const maxDeclarationThreadCheckers = 8;
|
|
|
220
220
|
* from 1 to 8 checkers, about even at 12, and 32-38% slower at 16. It also needs a CPU of its own.
|
|
221
221
|
*/
|
|
222
222
|
export function declarationThreadPays(checkers: number): boolean {
|
|
223
|
-
return checkers <= maxDeclarationThreadCheckers && checkers <
|
|
223
|
+
return checkers <= maxDeclarationThreadCheckers && checkers < availableCpus();
|
|
224
224
|
}
|
|
225
225
|
|
|
226
226
|
/**
|
|
@@ -247,7 +247,7 @@ export function startDeclarationThread(
|
|
|
247
247
|
let declarations: boolean;
|
|
248
248
|
if (emitKinds === undefined) declarations = sourceFileMayBeEmitted(files[i]!, options);
|
|
249
249
|
else declarations = emitKinds[i] === EmitOnly.All || emitKinds[i] === EmitOnly.Dts;
|
|
250
|
-
kinds.push(declarations ? EmitOnly.Dts : -1);
|
|
250
|
+
kinds.push(declarations ? (emitsJavaScript(program, emitKinds, i) ? EmitOnly.DtsAfterJs : EmitOnly.Dts) : -1);
|
|
251
251
|
results.push(undefined);
|
|
252
252
|
}
|
|
253
253
|
for (const i of metadata) kinds[i] = emitKinds === undefined ? EmitOnly.All : emitKinds[i]!;
|
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
|
|
@@ -202,6 +202,7 @@ import {
|
|
|
202
202
|
newCallExpression,
|
|
203
203
|
newPropertyAssignment,
|
|
204
204
|
} from './ast.js';
|
|
205
|
+
import { IdentifierName } from './identifier-name.js';
|
|
205
206
|
import {
|
|
206
207
|
OperatorPrecedence,
|
|
207
208
|
canHaveDecorators,
|
|
@@ -218,6 +219,7 @@ import {
|
|
|
218
219
|
isFunctionLike,
|
|
219
220
|
isImportCall,
|
|
220
221
|
isImportMeta,
|
|
222
|
+
isImportPhaseMetaProperty,
|
|
221
223
|
isInJSFile,
|
|
222
224
|
isKeyword,
|
|
223
225
|
isKeywordOrPunctuation,
|
|
@@ -293,7 +295,11 @@ const enum ListElement {
|
|
|
293
295
|
ObjectBindingElement,
|
|
294
296
|
ClassElement,
|
|
295
297
|
HeritageClause,
|
|
298
|
+
/** A heritage clause of an interface declaration. */
|
|
299
|
+
InterfaceHeritageClause,
|
|
296
300
|
ExpressionWithTypeArguments,
|
|
301
|
+
/** An element of a type heritage clause: `implements` of a class, `extends` of an interface. */
|
|
302
|
+
TypeHeritageClauseElement,
|
|
297
303
|
EnumMember,
|
|
298
304
|
ImportSpecifier,
|
|
299
305
|
ExportSpecifier,
|
|
@@ -340,6 +346,18 @@ export const enum JSDocScannerInfo {
|
|
|
340
346
|
|
|
341
347
|
const noArgs: readonly string[] = [];
|
|
342
348
|
|
|
349
|
+
/** Whether `operator` binds before an operator of `currentPrecedence`: at equal precedence, only the right-associative `**`. */
|
|
350
|
+
function shouldConsumeBinaryOperator(
|
|
351
|
+
operator: SyntaxKind,
|
|
352
|
+
operatorPrecedence: OperatorPrecedence,
|
|
353
|
+
currentPrecedence: OperatorPrecedence,
|
|
354
|
+
): boolean {
|
|
355
|
+
return (
|
|
356
|
+
operatorPrecedence > currentPrecedence ||
|
|
357
|
+
(operatorPrecedence === currentPrecedence && operator === SyntaxKind.AsteriskAsteriskToken)
|
|
358
|
+
);
|
|
359
|
+
}
|
|
360
|
+
|
|
343
361
|
/** Parser state saved by `mark` for speculative parsing. */
|
|
344
362
|
export class ParserState extends ScannerState {
|
|
345
363
|
contextFlags: NodeFlags;
|
|
@@ -430,7 +448,7 @@ export function parseSourceFile(fileName: string, text: string, options?: ParseO
|
|
|
430
448
|
export function parseIsolatedEntityName(text: string): EntityName | undefined {
|
|
431
449
|
const p = new Parser('/', '/', text, ScriptKind.JS, new ExternalModuleIndicatorOptions(false, false));
|
|
432
450
|
p.nextToken();
|
|
433
|
-
const entityName = p.parseEntityName(true, undefined);
|
|
451
|
+
const entityName = p.parseEntityName(true, false, undefined);
|
|
434
452
|
return p.token() === SyntaxKind.EndOfFile && p.diagnostics.length === 0 ? entityName : undefined;
|
|
435
453
|
}
|
|
436
454
|
|
|
@@ -981,9 +999,13 @@ export class Parser extends ScannerErrorReporter {
|
|
|
981
999
|
case ListElement.ClassElement:
|
|
982
1000
|
return this.parseClassElement();
|
|
983
1001
|
case ListElement.HeritageClause:
|
|
984
|
-
return this.parseHeritageClause();
|
|
1002
|
+
return this.parseHeritageClause(false);
|
|
1003
|
+
case ListElement.InterfaceHeritageClause:
|
|
1004
|
+
return this.parseHeritageClause(true);
|
|
985
1005
|
case ListElement.ExpressionWithTypeArguments:
|
|
986
1006
|
return this.parseExpressionWithTypeArguments();
|
|
1007
|
+
case ListElement.TypeHeritageClauseElement:
|
|
1008
|
+
return this.parseTypeHeritageClauseElement();
|
|
987
1009
|
case ListElement.EnumMember:
|
|
988
1010
|
return this.parseEnumMember();
|
|
989
1011
|
case ListElement.ImportSpecifier:
|
|
@@ -2204,9 +2226,18 @@ export class Parser extends ScannerErrorReporter {
|
|
|
2204
2226
|
// The name isn't parsed in an await context; the checker reports `await` names.
|
|
2205
2227
|
const name = this.parseNameOfClassDeclarationOrExpression();
|
|
2206
2228
|
const typeParameters = this.parseTypeParameters();
|
|
2207
|
-
|
|
2229
|
+
// An exported class at the top level of a module, not one nested in a block or a namespace, has its
|
|
2230
|
+
// heritage clauses and members parsed in an await context.
|
|
2231
|
+
if (
|
|
2232
|
+
modifiers !== undefined &&
|
|
2233
|
+
(this.parsingContexts & (1 << ParsingContext.SourceElements)) !== 0 &&
|
|
2234
|
+
(this.parsingContexts &
|
|
2235
|
+
((1 << ParsingContext.BlockStatements) | (1 << ParsingContext.SwitchClauseStatements))) ===
|
|
2236
|
+
0 &&
|
|
2237
|
+
hasModifierOfKind(modifiers, SyntaxKind.ExportKeyword)
|
|
2238
|
+
)
|
|
2208
2239
|
this.setContextFlags(NodeFlags.AwaitContext, true);
|
|
2209
|
-
const heritageClauses = this.parseHeritageClauses();
|
|
2240
|
+
const heritageClauses = this.parseHeritageClauses(false);
|
|
2210
2241
|
let members: NodeList;
|
|
2211
2242
|
if (this.parseExpected(SyntaxKind.OpenBraceToken)) {
|
|
2212
2243
|
members = this.parseList(ParsingContext.ClassMembers, ListElement.ClassElement);
|
|
@@ -2248,23 +2279,47 @@ export class Parser extends ScannerErrorReporter {
|
|
|
2248
2279
|
return this.token() === SyntaxKind.ImplementsKeyword && this.lookAhead(nextTokenIsIdentifierOrKeyword);
|
|
2249
2280
|
}
|
|
2250
2281
|
|
|
2251
|
-
parseHeritageClauses(): NodeList | undefined {
|
|
2282
|
+
parseHeritageClauses(isInterface: boolean): NodeList | undefined {
|
|
2252
2283
|
return this.isHeritageClause()
|
|
2253
|
-
? this.parseList(
|
|
2284
|
+
? this.parseList(
|
|
2285
|
+
ParsingContext.HeritageClauses,
|
|
2286
|
+
isInterface ? ListElement.InterfaceHeritageClause : ListElement.HeritageClause,
|
|
2287
|
+
)
|
|
2254
2288
|
: undefined;
|
|
2255
2289
|
}
|
|
2256
2290
|
|
|
2257
|
-
parseHeritageClause(): Node {
|
|
2291
|
+
parseHeritageClause(isInterface: boolean): Node {
|
|
2258
2292
|
const pos = this.nodePos();
|
|
2259
2293
|
const kind = this.token();
|
|
2260
2294
|
this.nextToken();
|
|
2295
|
+
// A class's `implements` and an interface's `extends` name types: their elements are type references.
|
|
2296
|
+
const isTypeClause = isInterface ? kind === SyntaxKind.ExtendsKeyword : kind === SyntaxKind.ImplementsKeyword;
|
|
2261
2297
|
const types = this.parseDelimitedList(
|
|
2262
2298
|
ParsingContext.HeritageClauseElement,
|
|
2263
|
-
ListElement.ExpressionWithTypeArguments,
|
|
2299
|
+
isTypeClause ? ListElement.TypeHeritageClauseElement : ListElement.ExpressionWithTypeArguments,
|
|
2264
2300
|
)!;
|
|
2265
2301
|
return this.checkJSSyntax(this.finishNode(new HeritageClause(kind, types), pos));
|
|
2266
2302
|
}
|
|
2267
2303
|
|
|
2304
|
+
/** A type reference when the element is an entity name with optional type arguments, otherwise the
|
|
2305
|
+
* `ExpressionWithTypeArguments`, which the checker reports. */
|
|
2306
|
+
parseTypeHeritageClauseElement(): Node {
|
|
2307
|
+
const pos = this.nodePos();
|
|
2308
|
+
const element = this.parseExpressionWithTypeArguments() as ExpressionWithTypeArguments;
|
|
2309
|
+
if (!isValidHeritageTypeReferenceExpression(element.expression)) return element;
|
|
2310
|
+
const typeName = this.convertEntityNameExpressionToEntityName(element.expression);
|
|
2311
|
+
return this.finishNode(new TypeReferenceNode(typeName, element.typeArguments), pos);
|
|
2312
|
+
}
|
|
2313
|
+
|
|
2314
|
+
/** The `QualifiedName` chain for an identifier or a chain of property accesses, spanning the same text. */
|
|
2315
|
+
convertEntityNameExpressionToEntityName(node: Node): Node {
|
|
2316
|
+
if (node instanceof Identifier) return node;
|
|
2317
|
+
const access = node as PropertyAccessExpression;
|
|
2318
|
+
// The name can be a private name, as upstream's.
|
|
2319
|
+
const result = new QualifiedName(this.convertEntityNameExpressionToEntityName(access.expression), access.name);
|
|
2320
|
+
return this.finishNodeWithEnd(result, node.pos, node.end);
|
|
2321
|
+
}
|
|
2322
|
+
|
|
2268
2323
|
parseExpressionWithTypeArguments(): Node {
|
|
2269
2324
|
const pos = this.nodePos();
|
|
2270
2325
|
const expression = this.parseLeftHandSideExpressionOrHigher();
|
|
@@ -2556,7 +2611,7 @@ export class Parser extends ScannerErrorReporter {
|
|
|
2556
2611
|
this.parseExpected(SyntaxKind.InterfaceKeyword);
|
|
2557
2612
|
const name = this.parseIdentifier(IdentifierUse.Name);
|
|
2558
2613
|
const typeParameters = this.parseTypeParameters();
|
|
2559
|
-
const heritageClauses = this.parseHeritageClauses();
|
|
2614
|
+
const heritageClauses = this.parseHeritageClauses(true);
|
|
2560
2615
|
const members = this.parseObjectTypeMembers();
|
|
2561
2616
|
const result = this.finishWithJSDoc(
|
|
2562
2617
|
new InterfaceDeclaration(modifiers, name, typeParameters, heritageClauses, members),
|
|
@@ -2650,10 +2705,15 @@ export class Parser extends ScannerErrorReporter {
|
|
|
2650
2705
|
} else {
|
|
2651
2706
|
name = this.parseLiteralExpression(true);
|
|
2652
2707
|
}
|
|
2708
|
+
// `declare module "*.ext" with { type: "..." }`: the import attributes the module matches.
|
|
2709
|
+
const attributes =
|
|
2710
|
+
keyword === SyntaxKind.ModuleKeyword && this.parseOptional(SyntaxKind.WithKeyword)
|
|
2711
|
+
? (this.parseTypeLiteral() as TypeLiteralNode)
|
|
2712
|
+
: undefined;
|
|
2653
2713
|
let body: Node | undefined;
|
|
2654
2714
|
if (this.token() === SyntaxKind.OpenBraceToken) body = this.parseModuleBlock();
|
|
2655
2715
|
else this.parseSemicolon();
|
|
2656
|
-
const result = this.finishWithJSDoc(new ModuleDeclaration(modifiers, keyword, name, body), pos, jsdoc);
|
|
2716
|
+
const result = this.finishWithJSDoc(new ModuleDeclaration(modifiers, keyword, name, attributes, body), pos, jsdoc);
|
|
2657
2717
|
this.statementHasAwaitIdentifier = saveHasAwaitIdentifier;
|
|
2658
2718
|
return result;
|
|
2659
2719
|
}
|
|
@@ -2696,7 +2756,7 @@ export class Parser extends ScannerErrorReporter {
|
|
|
2696
2756
|
} else {
|
|
2697
2757
|
body = this.parseModuleBlock();
|
|
2698
2758
|
}
|
|
2699
|
-
const result = this.finishWithJSDoc(new ModuleDeclaration(modifiers, keyword, name, body), pos, jsdoc);
|
|
2759
|
+
const result = this.finishWithJSDoc(new ModuleDeclaration(modifiers, keyword, name, undefined, body), pos, jsdoc);
|
|
2700
2760
|
this.checkJSSyntax(result);
|
|
2701
2761
|
this.statementHasAwaitIdentifier = saveHasAwaitIdentifier;
|
|
2702
2762
|
return result;
|
|
@@ -2711,6 +2771,7 @@ export class Parser extends ScannerErrorReporter {
|
|
|
2711
2771
|
const afterImportPos = this.nodePos();
|
|
2712
2772
|
// The identifier isn't parsed in an await context; the checker reports `await`.
|
|
2713
2773
|
const saveHasAwaitIdentifier = this.statementHasAwaitIdentifier;
|
|
2774
|
+
const phaseModifierCandidate = this.currentImportPhaseModifier();
|
|
2714
2775
|
let identifier = this.isIdentifier() ? this.parseIdentifier(IdentifierUse.Name) : undefined;
|
|
2715
2776
|
let phaseModifier = SyntaxKind.Unknown;
|
|
2716
2777
|
if (
|
|
@@ -2722,20 +2783,19 @@ export class Parser extends ScannerErrorReporter {
|
|
|
2722
2783
|
) {
|
|
2723
2784
|
phaseModifier = SyntaxKind.TypeKeyword;
|
|
2724
2785
|
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
|
-
}
|
|
2786
|
+
} else if (
|
|
2787
|
+
identifier !== undefined &&
|
|
2788
|
+
phaseModifierCandidate !== SyntaxKind.Unknown &&
|
|
2789
|
+
this.shouldParseImportPhaseModifier()
|
|
2790
|
+
) {
|
|
2791
|
+
phaseModifier = phaseModifierCandidate;
|
|
2792
|
+
identifier = this.isIdentifier() ? this.parseIdentifier(IdentifierUse.Name) : undefined;
|
|
2734
2793
|
}
|
|
2735
2794
|
if (
|
|
2736
2795
|
identifier !== undefined &&
|
|
2737
2796
|
!this.tokenAfterImportedIdentifierDefinitelyProducesImportDeclaration() &&
|
|
2738
|
-
phaseModifier !== SyntaxKind.DeferKeyword
|
|
2797
|
+
phaseModifier !== SyntaxKind.DeferKeyword &&
|
|
2798
|
+
phaseModifier !== SyntaxKind.SourceKeyword
|
|
2739
2799
|
) {
|
|
2740
2800
|
const importEquals = this.checkJSSyntax(
|
|
2741
2801
|
this.parseImportEqualsDeclaration(pos, jsdoc, modifiers, identifier, phaseModifier === SyntaxKind.TypeKeyword),
|
|
@@ -2763,6 +2823,30 @@ export class Parser extends ScannerErrorReporter {
|
|
|
2763
2823
|
return this.token() === SyntaxKind.AsteriskToken || this.token() === SyntaxKind.OpenBraceToken;
|
|
2764
2824
|
}
|
|
2765
2825
|
|
|
2826
|
+
/** In `import defer ___` or `import source ___`, whether `defer` or `source` is a phase modifier rather than the
|
|
2827
|
+
* default import's name. */
|
|
2828
|
+
shouldParseImportPhaseModifier(): boolean {
|
|
2829
|
+
switch (this.token()) {
|
|
2830
|
+
case SyntaxKind.CommaToken:
|
|
2831
|
+
case SyntaxKind.EqualsToken:
|
|
2832
|
+
return false;
|
|
2833
|
+
case SyntaxKind.FromKeyword:
|
|
2834
|
+
return !this.lookAhead(nextTokenIsTokenStringLiteral);
|
|
2835
|
+
}
|
|
2836
|
+
return true;
|
|
2837
|
+
}
|
|
2838
|
+
|
|
2839
|
+
/** The phase modifier the current token's text spells, written without escapes, or `Unknown`. */
|
|
2840
|
+
currentImportPhaseModifier(): SyntaxKind {
|
|
2841
|
+
switch (this.scanner.getTokenText()) {
|
|
2842
|
+
case 'defer':
|
|
2843
|
+
return SyntaxKind.DeferKeyword;
|
|
2844
|
+
case 'source':
|
|
2845
|
+
return SyntaxKind.SourceKeyword;
|
|
2846
|
+
}
|
|
2847
|
+
return SyntaxKind.Unknown;
|
|
2848
|
+
}
|
|
2849
|
+
|
|
2766
2850
|
/** In `import id ___`, whether the token makes this an ImportDeclaration rather than ImportEqualsDeclaration. */
|
|
2767
2851
|
tokenAfterImportedIdentifierDefinitelyProducesImportDeclaration(): boolean {
|
|
2768
2852
|
return this.token() === SyntaxKind.CommaToken || this.token() === SyntaxKind.FromKeyword;
|
|
@@ -2788,7 +2872,7 @@ export class Parser extends ScannerErrorReporter {
|
|
|
2788
2872
|
parseModuleReference(): Node {
|
|
2789
2873
|
if (this.token() === SyntaxKind.RequireKeyword && this.lookAhead(nextTokenIsOpenParen))
|
|
2790
2874
|
return this.parseExternalModuleReference();
|
|
2791
|
-
return this.parseEntityName(false, undefined);
|
|
2875
|
+
return this.parseEntityName(false, false, undefined);
|
|
2792
2876
|
}
|
|
2793
2877
|
|
|
2794
2878
|
parseExternalModuleReference(): Node {
|
|
@@ -2826,6 +2910,9 @@ export class Parser extends ScannerErrorReporter {
|
|
|
2826
2910
|
this.parseExpected(SyntaxKind.FromKeyword);
|
|
2827
2911
|
return importClause;
|
|
2828
2912
|
}
|
|
2913
|
+
// A phase modifier without bindings still makes an import clause; the checker reports it.
|
|
2914
|
+
if (phaseModifier === SyntaxKind.DeferKeyword || phaseModifier === SyntaxKind.SourceKeyword)
|
|
2915
|
+
return this.finishNode(new ImportClause(phaseModifier, undefined, undefined), pos) as ImportClause;
|
|
2829
2916
|
return undefined;
|
|
2830
2917
|
}
|
|
2831
2918
|
|
|
@@ -2952,7 +3039,7 @@ export class Parser extends ScannerErrorReporter {
|
|
|
2952
3039
|
identifierName = name;
|
|
2953
3040
|
} else {
|
|
2954
3041
|
this.parseErrorAt(skipTrivia(this.sourceText, name.pos), name.end, Diagnostics.Identifier_expected);
|
|
2955
|
-
identifierName = this.newIdentifier('');
|
|
3042
|
+
identifierName = this.newIdentifier(new IdentifierName(''));
|
|
2956
3043
|
this.finishNode(identifierName, name.pos);
|
|
2957
3044
|
}
|
|
2958
3045
|
return this.checkJSSyntax(this.finishNode(new ImportSpecifier(isTypeOnly, propertyName, identifierName), pos));
|
|
@@ -3391,12 +3478,16 @@ export class Parser extends ScannerErrorReporter {
|
|
|
3391
3478
|
}
|
|
3392
3479
|
|
|
3393
3480
|
parseEntityNameOfTypeReference(): EntityName {
|
|
3394
|
-
return this.parseEntityName(true, Diagnostics.Type_expected);
|
|
3481
|
+
return this.parseEntityName(true, false, Diagnostics.Type_expected);
|
|
3395
3482
|
}
|
|
3396
3483
|
|
|
3397
|
-
/**
|
|
3484
|
+
/**
|
|
3485
|
+
* An entity name; `use` is for its first identifier, the qualified names' right sides are names.
|
|
3486
|
+
* Only a type query allows private names on the right (`typeof this.#x`).
|
|
3487
|
+
*/
|
|
3398
3488
|
parseEntityName(
|
|
3399
3489
|
allowReservedWords: boolean,
|
|
3490
|
+
allowPrivateName: boolean,
|
|
3400
3491
|
diagnosticMessage: DiagnosticMessage | undefined,
|
|
3401
3492
|
use: IdentifierUse = IdentifierUse.Name,
|
|
3402
3493
|
): EntityName {
|
|
@@ -3408,7 +3499,7 @@ export class Parser extends ScannerErrorReporter {
|
|
|
3408
3499
|
// A JSDoc-style generic; the checker reports the gap between the name and the type arguments.
|
|
3409
3500
|
if (this.token() === SyntaxKind.LessThanToken) break;
|
|
3410
3501
|
entity = this.finishNode(
|
|
3411
|
-
new QualifiedName(entity, this.
|
|
3502
|
+
new QualifiedName(entity, this.parseRightSideOfDot(allowReservedWords, allowPrivateName, true)),
|
|
3412
3503
|
pos,
|
|
3413
3504
|
);
|
|
3414
3505
|
}
|
|
@@ -3469,12 +3560,12 @@ export class Parser extends ScannerErrorReporter {
|
|
|
3469
3560
|
* A new identifier of the class `use` calls for. Callers create it after the identifier's token, so
|
|
3470
3561
|
* for an element name the current token tells a shorthand property from an assignment or a method.
|
|
3471
3562
|
*/
|
|
3472
|
-
newIdentifier(
|
|
3563
|
+
newIdentifier(name: IdentifierName, use: IdentifierUse = IdentifierUse.Reference): Identifier {
|
|
3473
3564
|
this.identifierCount++;
|
|
3474
|
-
if (text === 'await') this.statementHasAwaitIdentifier = true;
|
|
3565
|
+
if (name.text === 'await') this.statementHasAwaitIdentifier = true;
|
|
3475
3566
|
if (use === IdentifierUse.Name || (use === IdentifierUse.ElementName && this.isElementNameEnd()))
|
|
3476
|
-
return new Identifier(
|
|
3477
|
-
return new ReferenceIdentifier(
|
|
3567
|
+
return new Identifier(name);
|
|
3568
|
+
return new ReferenceIdentifier(name);
|
|
3478
3569
|
}
|
|
3479
3570
|
|
|
3480
3571
|
/** Whether the current token ends an object literal element name that is not a shorthand property. */
|
|
@@ -3484,7 +3575,7 @@ export class Parser extends ScannerErrorReporter {
|
|
|
3484
3575
|
}
|
|
3485
3576
|
|
|
3486
3577
|
createMissingIdentifier(use: IdentifierUse = IdentifierUse.Reference): Identifier {
|
|
3487
|
-
const result = this.newIdentifier('', use);
|
|
3578
|
+
const result = this.newIdentifier(new IdentifierName(''), use);
|
|
3488
3579
|
this.finishNode(result, this.nodePos());
|
|
3489
3580
|
return result;
|
|
3490
3581
|
}
|
|
@@ -3614,7 +3705,7 @@ export class Parser extends ScannerErrorReporter {
|
|
|
3614
3705
|
parseTypeQuery(): TypeNode {
|
|
3615
3706
|
const pos = this.nodePos();
|
|
3616
3707
|
this.parseExpected(SyntaxKind.TypeOfKeyword);
|
|
3617
|
-
const entityName = this.parseEntityName(true, undefined, IdentifierUse.Reference);
|
|
3708
|
+
const entityName = this.parseEntityName(true, true, undefined, IdentifierUse.Reference);
|
|
3618
3709
|
// ASI: don't parse the next line's type arguments as part of an instantiation expression.
|
|
3619
3710
|
const typeArguments = this.hasPrecedingLineBreak() ? undefined : this.parseTypeArguments();
|
|
3620
3711
|
return this.finishNode(new TypeQueryNode(entityName, typeArguments), pos);
|
|
@@ -4736,15 +4827,13 @@ export class Parser extends ScannerErrorReporter {
|
|
|
4736
4827
|
// Take a left-associative operator when its precedence is higher than the current one (so
|
|
4737
4828
|
// `a - b - c` returns `b` as the right operand of the first `-`), and `**` (right
|
|
4738
4829
|
// associative) when it is at least as high.
|
|
4739
|
-
|
|
4740
|
-
operator === SyntaxKind.AsteriskAsteriskToken ? newPrecedence >= precedence : newPrecedence > precedence;
|
|
4741
|
-
if (!consumeCurrentOperator) break;
|
|
4830
|
+
if (!shouldConsumeBinaryOperator(operator, newPrecedence, precedence)) break;
|
|
4742
4831
|
if (operator === SyntaxKind.InKeyword && this.inDisallowInContext()) break;
|
|
4743
4832
|
if (operator === SyntaxKind.AsKeyword || operator === SyntaxKind.SatisfiesKeyword) {
|
|
4744
4833
|
// ASI applies before `as`: `var x = foo \n as (Bar)` is a declaration and a call to `as`.
|
|
4745
4834
|
if (this.hasPrecedingLineBreak()) break;
|
|
4746
4835
|
this.nextToken();
|
|
4747
|
-
// In `a ## b as T`, stop
|
|
4836
|
+
// In `a ## b as T $$ c`, stop when `$$` would bind before `##` once the `as` is erased: the
|
|
4748
4837
|
// `as` couldn't be erased without changing the meaning (TypeScript#63527).
|
|
4749
4838
|
const lastPrecedence =
|
|
4750
4839
|
lastOperand instanceof BinaryExpression
|
|
@@ -4754,7 +4843,8 @@ export class Parser extends ScannerErrorReporter {
|
|
|
4754
4843
|
operator === SyntaxKind.SatisfiesKeyword
|
|
4755
4844
|
? this.makeSatisfiesExpression(leftOperand, this.parseType())
|
|
4756
4845
|
: this.makeAsExpression(leftOperand, this.parseType());
|
|
4757
|
-
|
|
4846
|
+
const nextOperator = this.reScanGreaterThanToken();
|
|
4847
|
+
if (shouldConsumeBinaryOperator(nextOperator, getBinaryOperatorPrecedence(nextOperator), lastPrecedence)) break;
|
|
4758
4848
|
} else {
|
|
4759
4849
|
leftOperand = this.makeBinaryExpression(
|
|
4760
4850
|
leftOperand,
|
|
@@ -4882,7 +4972,7 @@ export class Parser extends ScannerErrorReporter {
|
|
|
4882
4972
|
// An unclosed opening element took its parent's closing element: restructure
|
|
4883
4973
|
// (<div>(...<span>...</div>)) into (<div>(...<span>...</>)</div>). The parent reports it.
|
|
4884
4974
|
const end = (lastChild as JsxElement).children.end;
|
|
4885
|
-
const missingIdentifier = this.finishNodeWithEnd(this.newIdentifier(''), end, end);
|
|
4975
|
+
const missingIdentifier = this.finishNodeWithEnd(this.newIdentifier(new IdentifierName('')), end, end);
|
|
4886
4976
|
const newClosingElement = new JsxClosingElement(missingIdentifier);
|
|
4887
4977
|
this.finishNodeWithEnd(newClosingElement, end, end);
|
|
4888
4978
|
const newLast = new JsxElement(
|
|
@@ -5170,8 +5260,9 @@ export class Parser extends ScannerErrorReporter {
|
|
|
5170
5260
|
if (this.token() === SyntaxKind.EqualsToken) {
|
|
5171
5261
|
if (this.scanJsxAttributeValue() === SyntaxKind.StringLiteral) return this.parseLiteralExpression(false);
|
|
5172
5262
|
if (this.token() === SyntaxKind.OpenBraceToken) return this.parseJsxExpression(true);
|
|
5263
|
+
// An attribute value is a single element: sibling-element recovery must not wrap it in a binary expression.
|
|
5173
5264
|
if (this.token() === SyntaxKind.LessThanToken)
|
|
5174
|
-
return this.parseJsxElementOrSelfClosingElementOrFragment(true, -1, undefined,
|
|
5265
|
+
return this.parseJsxElementOrSelfClosingElementOrFragment(true, -1, undefined, true);
|
|
5175
5266
|
this.parseErrorAtCurrentToken(Diagnostics.X_or_JSX_element_expected);
|
|
5176
5267
|
}
|
|
5177
5268
|
return undefined;
|
|
@@ -5290,9 +5381,9 @@ export class Parser extends ScannerErrorReporter {
|
|
|
5290
5381
|
// An `import.*` meta property, such as `import.meta`.
|
|
5291
5382
|
this.nextToken();
|
|
5292
5383
|
this.nextToken();
|
|
5293
|
-
const name = this.
|
|
5384
|
+
const name = this.parseImportMetaPropertyName();
|
|
5294
5385
|
expression = this.finishNode(new MetaProperty(SyntaxKind.ImportKeyword, name), pos);
|
|
5295
|
-
if (
|
|
5386
|
+
if (isImportPhaseMetaProperty(expression)) {
|
|
5296
5387
|
if (this.token() === SyntaxKind.OpenParenToken || this.token() === SyntaxKind.LessThanToken)
|
|
5297
5388
|
this.sourceFlags |= NodeFlags.PossiblyContainsDynamicImport;
|
|
5298
5389
|
} else {
|
|
@@ -5310,6 +5401,16 @@ export class Parser extends ScannerErrorReporter {
|
|
|
5310
5401
|
return this.parseCallExpressionRest(pos, expression);
|
|
5311
5402
|
}
|
|
5312
5403
|
|
|
5404
|
+
/** The name after `import.`; `defer` and `source` written with escapes are reported. */
|
|
5405
|
+
parseImportMetaPropertyName(): Identifier {
|
|
5406
|
+
if (
|
|
5407
|
+
(this.token() === SyntaxKind.DeferKeyword || this.token() === SyntaxKind.SourceKeyword) &&
|
|
5408
|
+
this.currentImportPhaseModifier() === SyntaxKind.Unknown
|
|
5409
|
+
)
|
|
5410
|
+
this.parseErrorAtCurrentToken(Diagnostics.Keywords_cannot_contain_escape_characters);
|
|
5411
|
+
return this.parseIdentifierName(IdentifierUse.Name);
|
|
5412
|
+
}
|
|
5413
|
+
|
|
5313
5414
|
parseSuperExpression(): Expression {
|
|
5314
5415
|
const pos = this.nodePos();
|
|
5315
5416
|
let expression = this.parseKeywordExpression();
|
|
@@ -5504,13 +5605,18 @@ export class Parser extends ScannerErrorReporter {
|
|
|
5504
5605
|
): Expression {
|
|
5505
5606
|
let argumentExpression: Expression;
|
|
5506
5607
|
if (this.token() === SyntaxKind.CloseBracketToken) {
|
|
5608
|
+
// The missing argument is created before the error, so the error marks the element access.
|
|
5609
|
+
argumentExpression = this.createMissingIdentifier();
|
|
5507
5610
|
this.parseErrorAt(
|
|
5508
5611
|
this.nodePos(),
|
|
5509
5612
|
this.nodePos(),
|
|
5510
5613
|
Diagnostics.An_element_access_expression_should_take_an_argument,
|
|
5511
5614
|
);
|
|
5512
|
-
argumentExpression = this.createMissingIdentifier();
|
|
5513
5615
|
} else {
|
|
5616
|
+
// tsgo creates the missing argument first and drops it when there is one. Finishing that node takes the
|
|
5617
|
+
// error flag of an error before the argument (`i[01]`), so the argument doesn't get it.
|
|
5618
|
+
this.identifierCount++;
|
|
5619
|
+
this.hasParseError = false;
|
|
5514
5620
|
const argument = this.parseExpressionAllowIn();
|
|
5515
5621
|
if (
|
|
5516
5622
|
argument.kind === SyntaxKind.StringLiteral ||
|
|
@@ -5986,10 +6092,11 @@ export class Parser extends ScannerErrorReporter {
|
|
|
5986
6092
|
if (isIdentifier) {
|
|
5987
6093
|
const pos = this.scanner.hasPrecedingJSDocLeadingAsterisks() ? this.scanner.getTokenStart() : this.nodePos();
|
|
5988
6094
|
const text = this.scanner.getIdentifierValue();
|
|
6095
|
+
const name = this.scanner.getIdentifierName();
|
|
5989
6096
|
const record = this.scanner.recordIdentifierValue(text);
|
|
5990
6097
|
this.nextTokenWithoutCheck();
|
|
5991
6098
|
if (record) this.identifierTexts.push(text);
|
|
5992
|
-
const result = this.newIdentifier(
|
|
6099
|
+
const result = this.newIdentifier(name, use);
|
|
5993
6100
|
this.finishNode(result, pos);
|
|
5994
6101
|
return result;
|
|
5995
6102
|
}
|
|
@@ -6794,7 +6901,9 @@ export class Parser extends ScannerErrorReporter {
|
|
|
6794
6901
|
}
|
|
6795
6902
|
|
|
6796
6903
|
jsonError(node: Node, message: DiagnosticMessage): void {
|
|
6797
|
-
|
|
6904
|
+
// A missing node (a property without a value) keeps its position: trivia after it isn't its own.
|
|
6905
|
+
const pos = nodeIsMissing(node) ? node.pos : skipTrivia(this.sourceText, node.pos);
|
|
6906
|
+
this.diagnostics.push(new Diagnostic(undefined, pos, node.end, message, noArgs));
|
|
6798
6907
|
}
|
|
6799
6908
|
|
|
6800
6909
|
validateJsonValue(sourceFile: SourceFile, value: Node): void {
|
|
@@ -7168,6 +7277,16 @@ function nextTokenIsOpenParen(p: Parser): boolean {
|
|
|
7168
7277
|
return p.nextToken() === SyntaxKind.OpenParenToken;
|
|
7169
7278
|
}
|
|
7170
7279
|
|
|
7280
|
+
/** An identifier or a chain of property accesses without optional chaining, each name present. */
|
|
7281
|
+
function isValidHeritageTypeReferenceExpression(node: Node): boolean {
|
|
7282
|
+
if (node instanceof Identifier) return nodeIsPresent(node);
|
|
7283
|
+
if (!(node instanceof PropertyAccessExpression) || (node.flags & NodeFlags.OptionalChain) !== 0) return false;
|
|
7284
|
+
return (
|
|
7285
|
+
nodeIsPresent((node as PropertyAccessExpression).name) &&
|
|
7286
|
+
isValidHeritageTypeReferenceExpression((node as PropertyAccessExpression).expression)
|
|
7287
|
+
);
|
|
7288
|
+
}
|
|
7289
|
+
|
|
7171
7290
|
function nextTokenIsOpenBrace(p: Parser): boolean {
|
|
7172
7291
|
return p.nextToken() === SyntaxKind.OpenBraceToken;
|
|
7173
7292
|
}
|
|
@@ -7753,7 +7872,7 @@ export function isNodeCoreModule(moduleName: string): boolean {
|
|
|
7753
7872
|
}
|
|
7754
7873
|
|
|
7755
7874
|
// `require('module').builtinModules`, without and with only the `node:` prefix.
|
|
7756
|
-
const unprefixedNodeCoreModules = new Set<string>([
|
|
7875
|
+
export const unprefixedNodeCoreModules = new Set<string>([
|
|
7757
7876
|
'assert',
|
|
7758
7877
|
'assert/strict',
|
|
7759
7878
|
'async_hooks',
|
|
@@ -7810,7 +7929,7 @@ const unprefixedNodeCoreModules = new Set<string>([
|
|
|
7810
7929
|
'zlib',
|
|
7811
7930
|
]);
|
|
7812
7931
|
|
|
7813
|
-
const exclusivelyPrefixedNodeCoreModules = new Set<string>([
|
|
7932
|
+
export const exclusivelyPrefixedNodeCoreModules = new Set<string>([
|
|
7814
7933
|
'node:quic',
|
|
7815
7934
|
'node:sea',
|
|
7816
7935
|
'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,
|
|
@@ -599,6 +600,21 @@ export class EmitContext extends NodeFactory {
|
|
|
599
600
|
return node;
|
|
600
601
|
}
|
|
601
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
|
+
|
|
602
618
|
/** Marks the current variable scope as visiting parameters; returns the previous flags. */
|
|
603
619
|
enterParameters(): number {
|
|
604
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);
|
|
@@ -70,6 +70,7 @@ import {
|
|
|
70
70
|
} from './helpers.js';
|
|
71
71
|
import { formatGeneratedName, isMemberName, nodeIsSynthesized } from './utilities.js';
|
|
72
72
|
import { OuterExpressionKinds, isOuterExpression, outerExpressionOperand } from '../transformers/utilities.js';
|
|
73
|
+
import { IdentifierName } from '../identifier-name.js';
|
|
73
74
|
|
|
74
75
|
/**
|
|
75
76
|
* The node factory of an emit context. The context is the factory (`EmitContext` extends it), so the two are one
|
|
@@ -108,7 +109,7 @@ export abstract class NodeFactory extends NodeFactoryBase {
|
|
|
108
109
|
}
|
|
109
110
|
|
|
110
111
|
cloneIdentifier(node: Identifier): Identifier {
|
|
111
|
-
return this.cloneNode(node, new Identifier(node.
|
|
112
|
+
return this.cloneNode(node, new Identifier(node.identifierName));
|
|
112
113
|
}
|
|
113
114
|
|
|
114
115
|
createNodeList(nodes: Node[]): NodeList {
|
|
@@ -132,7 +133,7 @@ export abstract class NodeFactory extends NodeFactoryBase {
|
|
|
132
133
|
}
|
|
133
134
|
|
|
134
135
|
createIdentifier(text: string): Identifier {
|
|
135
|
-
return this.created(new Identifier(text));
|
|
136
|
+
return this.created(new Identifier(new IdentifierName(text)));
|
|
136
137
|
}
|
|
137
138
|
|
|
138
139
|
createKeywordExpression(kind: SyntaxKind): KeywordExpression {
|
|
@@ -318,7 +319,10 @@ export abstract class NodeFactory extends NodeFactoryBase {
|
|
|
318
319
|
createExpressionFromEntityName(node: Node): Node {
|
|
319
320
|
if (node instanceof QualifiedName) {
|
|
320
321
|
const left = this.createExpressionFromEntityName(node.left);
|
|
321
|
-
const right =
|
|
322
|
+
const right =
|
|
323
|
+
node.right instanceof PrivateIdentifier
|
|
324
|
+
? this.cloneNode(node.right, new PrivateIdentifier(node.right.text))
|
|
325
|
+
: this.cloneIdentifier(node.right as Identifier);
|
|
322
326
|
right.pos = node.right.pos;
|
|
323
327
|
right.end = node.right.end;
|
|
324
328
|
right.parent = node.right.parent;
|