tsc-ts 0.0.10 → 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 +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 +20 -15
- package/dist/api/compiler/ast.js +1023 -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 +173 -123
- 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 +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 +105 -88
- 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 +137 -34
- 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 +93 -31
- package/dist/api/compiler/checker.js +143 -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 +19 -4
- package/dist/api/compiler/compile-program.js +45 -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/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/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/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 +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 +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 +1 -0
- package/dist/api/compiler/printer/printer.js +303 -281
- 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 +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 +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 +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 +55 -26
- package/src/compiler/binder.ts +39 -4
- package/src/compiler/character-codes.ts +2 -2
- package/src/compiler/checker-calls.ts +76 -8
- 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 +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 +26 -4
- 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 +120 -21
- 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 +168 -41
- package/src/compiler/command-line.ts +28 -28
- package/src/compiler/compile-program.ts +51 -25
- package/src/compiler/decoder.ts +13 -4
- package/src/compiler/diagnostic-messages.ts +1973 -1892
- 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 +139 -32
- package/src/compiler/help.ts +10 -14
- 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 +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 +197 -8
- package/src/compiler/parallel-emit.ts +1 -1
- package/src/compiler/parser.ts +156 -39
- 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 +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 +35 -14
- 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 +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 +31 -14
- package/src/compiler/syntax-kind.ts +188 -187
- package/src/compiler/thread-entry.ts +19 -2
- 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 +3 -0
- package/src/compiler/tsc-cli.ts +2 -0
- package/src/compiler/tsc-compile.ts +7 -2
- 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/emitter.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Emits JavaScript and declarations for source files: runs the transforms, prints, and writes
|
|
2
2
|
// the output, source map and `//# sourceMappingURL` comment.
|
|
3
3
|
import { ScriptKind, type SourceFile } from './ast.js';
|
|
4
|
-
import { compareDiagnostics, type Diagnostic } from './diagnostics.js';
|
|
4
|
+
import { compareDiagnostics, equalDiagnostics, type Diagnostic } from './diagnostics.js';
|
|
5
5
|
import { type CompilerOptions, JsxEmit, NewLineKind, getEmitScriptTarget, getIsolatedModules } from './options.js';
|
|
6
6
|
import { LanguageVariant } from './types.js';
|
|
7
7
|
import { type OutputPathsHost, getOutputPathsFor } from './output-paths.js';
|
|
@@ -33,7 +33,7 @@ import { RuntimeSyntax } from './transformers/runtime-syntax.js';
|
|
|
33
33
|
import { ConstEnumInliner } from './transformers/const-enum-inliner.js';
|
|
34
34
|
import { addDownlevelTransformers } from './transformers/downlevel.js';
|
|
35
35
|
import { JsxTransformer } from './transformers/jsx.js';
|
|
36
|
-
import { SyntaxFacts } from './transformers/syntax-facts.js';
|
|
36
|
+
import { SubtreeFacts, SyntaxFacts } from './transformers/syntax-facts.js';
|
|
37
37
|
import { LegacyDecorators } from './transformers/legacy-decorators.js';
|
|
38
38
|
import { DecoratorMetadata } from './transformers/decorator-metadata.js';
|
|
39
39
|
|
|
@@ -143,6 +143,12 @@ export const enum EmitOnly {
|
|
|
143
143
|
* signature of incremental builds; it is written with its errors and without a map.
|
|
144
144
|
*/
|
|
145
145
|
ForcedDts,
|
|
146
|
+
/**
|
|
147
|
+
* The declaration file of a file whose JavaScript this build emits in a separate request, such as on another
|
|
148
|
+
* thread. tsgo emits both with one emit context, so the emit flags its JavaScript transforms set on the file's
|
|
149
|
+
* own nodes also apply to its declarations; this replays those transforms first.
|
|
150
|
+
*/
|
|
151
|
+
DtsAfterJs,
|
|
146
152
|
}
|
|
147
153
|
|
|
148
154
|
export function emitFiles(host: EmitHost, files: readonly SourceFile[], emitOnly: EmitOnly = EmitOnly.All): EmitResult {
|
|
@@ -157,21 +163,44 @@ export function emitFiles(host: EmitHost, files: readonly SourceFile[], emitOnly
|
|
|
157
163
|
const file = files[i];
|
|
158
164
|
if (!sourceFileMayBeEmitted(file, options) || host.isSourceFileFromExternalLibrary(file)) continue;
|
|
159
165
|
const paths = getOutputPathsFor(file.fileName, file.scriptKind === ScriptKind.JSON, options, host, forced);
|
|
166
|
+
// As in tsgo, a file's JavaScript and declarations share one emit context: emit flags that JavaScript
|
|
167
|
+
// transforms set on the file's own nodes, such as a decorated parameter's name, also apply to its declarations.
|
|
168
|
+
const context = new EmitContext();
|
|
160
169
|
if (paths.jsFilePath !== '' && (emitOnly === EmitOnly.All || emitOnly === EmitOnly.Js)) {
|
|
161
170
|
if (host.isEmitBlocked(paths.jsFilePath)) result.emitSkipped = true;
|
|
162
|
-
else emitJSFile(host, file, paths.jsFilePath, paths.sourceMapFilePath, result);
|
|
171
|
+
else emitJSFile(host, context, file, paths.jsFilePath, paths.sourceMapFilePath, result);
|
|
163
172
|
}
|
|
164
173
|
if (paths.declarationFilePath !== '' && emitOnly !== EmitOnly.Js) {
|
|
165
174
|
if (!forced && host.isEmitBlocked(paths.declarationFilePath)) result.emitSkipped = true;
|
|
166
|
-
else
|
|
175
|
+
else {
|
|
176
|
+
if (emitOnly === EmitOnly.DtsAfterJs && paths.jsFilePath !== '') replayScriptTransforms(host, context, file);
|
|
177
|
+
emitDeclarationFile(host, context, file, paths.declarationFilePath, paths.declarationMapPath, result, forced);
|
|
178
|
+
}
|
|
167
179
|
}
|
|
168
180
|
}
|
|
169
181
|
return result;
|
|
170
182
|
}
|
|
171
183
|
|
|
184
|
+
/**
|
|
185
|
+
* Runs the JavaScript transforms of `file` in `context` without printing, for the emit flags they set on the
|
|
186
|
+
* file's own nodes. Only the decorator transforms set any that declaration emit prints (on decorated parameters'
|
|
187
|
+
* names), so files without decorators are skipped.
|
|
188
|
+
*/
|
|
189
|
+
function replayScriptTransforms(host: EmitHost, context: EmitContext, file: SourceFile): void {
|
|
190
|
+
if (!new SyntaxFacts().has(file, SubtreeFacts.ContainsDecorators)) return;
|
|
191
|
+
let transformed = file;
|
|
192
|
+
const transformers = getScriptTransformers(host, context, file);
|
|
193
|
+
for (let i = 0; i < transformers.length; i++) {
|
|
194
|
+
const transformer = transformers[i];
|
|
195
|
+
if (transformer.unsupported !== '') return;
|
|
196
|
+
transformed = transformer.transformSourceFile(transformed);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
172
200
|
/** Emits a declaration file; the host's resolver must be a `DeclarationEmitResolver`. */
|
|
173
201
|
function emitDeclarationFile(
|
|
174
202
|
host: EmitHost,
|
|
203
|
+
context: EmitContext,
|
|
175
204
|
file: SourceFile,
|
|
176
205
|
declarationFilePath: string,
|
|
177
206
|
declarationMapPath: string,
|
|
@@ -184,7 +213,6 @@ function emitDeclarationFile(
|
|
|
184
213
|
return false;
|
|
185
214
|
}
|
|
186
215
|
const options = host.options;
|
|
187
|
-
const context = new EmitContext();
|
|
188
216
|
const transformer = new DeclarationTransformer(context, host, options, resolver, declarationFilePath);
|
|
189
217
|
const transformed = transformer.transformSourceFile(file);
|
|
190
218
|
result.declarationTransformed = true;
|
|
@@ -214,11 +242,32 @@ function emitDeclarationFile(
|
|
|
214
242
|
emitSourceMaps,
|
|
215
243
|
false,
|
|
216
244
|
result,
|
|
217
|
-
|
|
218
|
-
diagnostics.length > 1 ? diagnostics.toSorted(compareDiagnostics) : diagnostics,
|
|
245
|
+
emitterDiagnostics(diagnostics),
|
|
219
246
|
);
|
|
220
247
|
}
|
|
221
248
|
|
|
249
|
+
/**
|
|
250
|
+
* Declaration diagnostics as tsgo's emitter collects them: sorted, without repeats of an equal
|
|
251
|
+
* diagnostic. They are part of the file's signature in build info.
|
|
252
|
+
*/
|
|
253
|
+
function emitterDiagnostics(diagnostics: readonly Diagnostic[]): readonly Diagnostic[] {
|
|
254
|
+
if (diagnostics.length < 2) return diagnostics;
|
|
255
|
+
const sorted = diagnostics.toSorted(compareDiagnostics);
|
|
256
|
+
const result: Diagnostic[] = [];
|
|
257
|
+
for (const diagnostic of sorted) {
|
|
258
|
+
// Equal diagnostics compare as 0, so a repeat is among the last ones kept that compare as 0.
|
|
259
|
+
let repeated = false;
|
|
260
|
+
for (let i = result.length - 1; i >= 0 && compareDiagnostics(result[i], diagnostic) === 0; i--) {
|
|
261
|
+
if (equalDiagnostics(result[i], diagnostic)) {
|
|
262
|
+
repeated = true;
|
|
263
|
+
break;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
if (!repeated) result.push(diagnostic);
|
|
267
|
+
}
|
|
268
|
+
return result;
|
|
269
|
+
}
|
|
270
|
+
|
|
222
271
|
function getScriptTransformers(host: EmitHost, context: EmitContext, file: SourceFile): Transformer[] {
|
|
223
272
|
const options = host.options;
|
|
224
273
|
const facts = new TypeScriptFacts();
|
|
@@ -248,13 +297,13 @@ function isJsxTransformEnabled(options: CompilerOptions): boolean {
|
|
|
248
297
|
|
|
249
298
|
function emitJSFile(
|
|
250
299
|
host: EmitHost,
|
|
300
|
+
context: EmitContext,
|
|
251
301
|
file: SourceFile,
|
|
252
302
|
jsFilePath: string,
|
|
253
303
|
sourceMapFilePath: string,
|
|
254
304
|
result: EmitResult,
|
|
255
305
|
): boolean {
|
|
256
306
|
const options = host.options;
|
|
257
|
-
const context = new EmitContext();
|
|
258
307
|
let transformed = file;
|
|
259
308
|
const transformers = getScriptTransformers(host, context, file);
|
|
260
309
|
for (let i = 0; i < transformers.length; i++) {
|
package/src/compiler/encoder.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
// Encodes a source file in TypeScript 7's binary AST format (protocol version
|
|
1
|
+
// Encodes a source file in TypeScript 7.1's binary AST format (protocol version 9), the
|
|
2
2
|
// `getSourceFile` payload of the API.
|
|
3
3
|
//
|
|
4
|
-
// Layout: a
|
|
4
|
+
// Layout: a 64-byte header, string offsets (UTF-8 start/end pairs), string data (the
|
|
5
5
|
// UTF-8 file text, then strings that aren't slices of it), extended node data,
|
|
6
6
|
// msgpack structured data, and 28-byte node records in visit order. Node positions are
|
|
7
7
|
// UTF-16 offsets.
|
|
@@ -197,10 +197,10 @@ import { SyntaxKind } from './syntax-kind.js';
|
|
|
197
197
|
import { hash128 } from './xxh3.js';
|
|
198
198
|
import { utf8Offsets } from './character-codes.js';
|
|
199
199
|
|
|
200
|
-
export const protocolVersion =
|
|
200
|
+
export const protocolVersion = 9;
|
|
201
201
|
|
|
202
202
|
const nodeSize = 28;
|
|
203
|
-
const headerSize =
|
|
203
|
+
const headerSize = 64;
|
|
204
204
|
const nodeListKind = 0xffffffff;
|
|
205
205
|
const noStructuredData = 0xffffffff;
|
|
206
206
|
|
|
@@ -210,6 +210,11 @@ const dataTypeExtended = 2 << 30;
|
|
|
210
210
|
|
|
211
211
|
const utf8Encoder = new TextEncoder();
|
|
212
212
|
|
|
213
|
+
/** A node list record's last word: 1 when the list ends with a comma. */
|
|
214
|
+
function trailingComma(list: NodeList): number {
|
|
215
|
+
return list.hasTrailingComma() ? 1 : 0;
|
|
216
|
+
}
|
|
217
|
+
|
|
213
218
|
/** A growable little-endian byte buffer. */
|
|
214
219
|
class ByteWriter {
|
|
215
220
|
bytes: Uint8Array;
|
|
@@ -1261,7 +1266,8 @@ function childrenPropertyMask(node: Node): number {
|
|
|
1261
1266
|
return node instanceof ModuleDeclaration
|
|
1262
1267
|
? (hasModifiers((node as ModuleDeclaration).modifiers) ? 1 : 0) |
|
|
1263
1268
|
((node as ModuleDeclaration).name !== undefined ? 2 : 0) |
|
|
1264
|
-
((node as ModuleDeclaration).
|
|
1269
|
+
((node as ModuleDeclaration).attributes !== undefined ? 4 : 0) |
|
|
1270
|
+
((node as ModuleDeclaration).body !== undefined ? 8 : 0)
|
|
1265
1271
|
: 0;
|
|
1266
1272
|
case SyntaxKind.ImportEqualsDeclaration:
|
|
1267
1273
|
return node instanceof ImportEqualsDeclaration
|
|
@@ -1381,6 +1387,7 @@ function commonData(node: Node): number {
|
|
|
1381
1387
|
if (!(node instanceof ImportClause)) return 0;
|
|
1382
1388
|
if ((node as ImportClause).phaseModifier === SyntaxKind.TypeKeyword) return 1 << 24;
|
|
1383
1389
|
if ((node as ImportClause).phaseModifier === SyntaxKind.DeferKeyword) return 2 << 24;
|
|
1390
|
+
if ((node as ImportClause).phaseModifier === SyntaxKind.SourceKeyword) return 3 << 24;
|
|
1384
1391
|
return 0;
|
|
1385
1392
|
case SyntaxKind.ImportSpecifier:
|
|
1386
1393
|
return node instanceof ImportSpecifier ? bit((node as ImportSpecifier).isTypeOnly) << 24 : 0;
|
|
@@ -1577,7 +1584,7 @@ class Encoder extends NodeVisitor {
|
|
|
1577
1584
|
this.linkSibling(index);
|
|
1578
1585
|
const positions = this.positions;
|
|
1579
1586
|
if (positions === undefined)
|
|
1580
|
-
this.nodes.push(nodeListKind, list.pos, list.end, this.parentIndex, list.nodes.length,
|
|
1587
|
+
this.nodes.push(nodeListKind, list.pos, list.end, this.parentIndex, list.nodes.length, trailingComma(list));
|
|
1581
1588
|
else
|
|
1582
1589
|
this.nodes.push(
|
|
1583
1590
|
nodeListKind,
|
|
@@ -1585,7 +1592,7 @@ class Encoder extends NodeVisitor {
|
|
|
1585
1592
|
positions.of(list.end),
|
|
1586
1593
|
this.parentIndex,
|
|
1587
1594
|
list.nodes.length,
|
|
1588
|
-
|
|
1595
|
+
trailingComma(list),
|
|
1589
1596
|
);
|
|
1590
1597
|
const saveParent = this.parentIndex;
|
|
1591
1598
|
this.prevIndex = 0;
|
|
@@ -1659,6 +1666,8 @@ class Encoder extends NodeVisitor {
|
|
|
1659
1666
|
out.u32(offsetExtended);
|
|
1660
1667
|
out.u32(offsetStructured);
|
|
1661
1668
|
out.u32(offsetNodes);
|
|
1669
|
+
// Source file ID and lease ID (u64 each) and binder data offset: 0, none.
|
|
1670
|
+
for (let i = 0; i < 5; i++) out.u32(0);
|
|
1662
1671
|
out.append(strings.offsets.view());
|
|
1663
1672
|
out.append(fileText);
|
|
1664
1673
|
out.append(strings.others.view());
|
|
@@ -1787,7 +1796,8 @@ class Encoder extends NodeVisitor {
|
|
|
1787
1796
|
);
|
|
1788
1797
|
out.u32((node as TemplateTail).templateFlags);
|
|
1789
1798
|
} else if (node instanceof SourceFile) {
|
|
1790
|
-
|
|
1799
|
+
const text = strings.addFileText((node as SourceFile).pos, (node as SourceFile).end);
|
|
1800
|
+
out.u32(text);
|
|
1791
1801
|
out.u32(strings.add((node as SourceFile).fileName, SyntaxKind.Unknown, 0, 0));
|
|
1792
1802
|
out.u32(strings.add((node as SourceFile).path, SyntaxKind.Unknown, 0, 0));
|
|
1793
1803
|
out.u32((node as SourceFile).languageVariant);
|
|
@@ -1801,6 +1811,11 @@ class Encoder extends NodeVisitor {
|
|
|
1801
1811
|
out.u32(noStructuredData);
|
|
1802
1812
|
out.u32(noStructuredData);
|
|
1803
1813
|
out.u32(0);
|
|
1814
|
+
// The original text is the text, and the content mapper fields (span map, supplemental
|
|
1815
|
+
// file names, canonical file name, mapper, virtual file name, diagnostic directives) are
|
|
1816
|
+
// empty: tsc-ts maps no file contents.
|
|
1817
|
+
out.u32(text);
|
|
1818
|
+
for (let i = 0; i < 6; i++) out.u32(noStructuredData);
|
|
1804
1819
|
} else throw new Error(`no extended data for kind ${node.kind}`);
|
|
1805
1820
|
return offset;
|
|
1806
1821
|
}
|
|
@@ -597,10 +597,16 @@ export class IncludeProcessor {
|
|
|
597
597
|
return this.fileIncludeReasons.get(path) ?? [];
|
|
598
598
|
}
|
|
599
599
|
|
|
600
|
-
|
|
600
|
+
/** Adds an include reason of the file at `path`; returns the file's reasons. */
|
|
601
|
+
addReason(path: string, reason: FileIncludeReason): FileIncludeReason[] {
|
|
601
602
|
const reasons = this.fileIncludeReasons.get(path);
|
|
602
|
-
if (reasons === undefined)
|
|
603
|
-
|
|
603
|
+
if (reasons === undefined) {
|
|
604
|
+
const added = [reason];
|
|
605
|
+
this.fileIncludeReasons.set(path, added);
|
|
606
|
+
return added;
|
|
607
|
+
}
|
|
608
|
+
reasons.push(reason);
|
|
609
|
+
return reasons;
|
|
604
610
|
}
|
|
605
611
|
|
|
606
612
|
addProcessingDiagnostic(diagnostic: ProcessingDiagnostic): void {
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
type Node,
|
|
14
14
|
type SourceFile,
|
|
15
15
|
} from './ast.js';
|
|
16
|
-
import { Diagnostics, type DiagnosticMessage, type MessageWithArgs } from './diagnostics.js';
|
|
16
|
+
import { Diagnostics, type DiagnosticMessage, type MessageWithArgs, messageWithArgs } from './diagnostics.js';
|
|
17
17
|
import { FileIncludeKind, FileIncludeReason, IncludeProcessor, ProcessingDiagnostic } from './file-include.js';
|
|
18
18
|
import type { FileSystem } from './file-system.js';
|
|
19
19
|
import { ModuleResolutionHost, Resolver, getAutomaticTypeDirectiveNames } from './module-resolution.js';
|
|
@@ -42,7 +42,7 @@ import {
|
|
|
42
42
|
takePreparedFile,
|
|
43
43
|
} from './parallel-parse.js';
|
|
44
44
|
import type { PackageJsonLookup } from './package-json.js';
|
|
45
|
-
import { parseSourceFile } from './parser.js';
|
|
45
|
+
import { parseSourceFile, getScriptKindFromFileName } from './parser.js';
|
|
46
46
|
import { mark } from './timeline.js';
|
|
47
47
|
import {
|
|
48
48
|
combinePaths,
|
|
@@ -59,6 +59,7 @@ import {
|
|
|
59
59
|
supportedTSExtensionsWithJsonFlat,
|
|
60
60
|
toFileNameLowerCase,
|
|
61
61
|
toPath,
|
|
62
|
+
isNetworkPath,
|
|
62
63
|
} from './path.js';
|
|
63
64
|
import {
|
|
64
65
|
getDefaultLibFileName,
|
|
@@ -76,6 +77,7 @@ import {
|
|
|
76
77
|
SourceFileMetadata,
|
|
77
78
|
} from './program-utilities.js';
|
|
78
79
|
import { SyntaxKind } from './syntax-kind.js';
|
|
80
|
+
import { isSourcePhaseImport } from './ast-utilities.js';
|
|
79
81
|
import { hasExtension } from './vfs-match.js';
|
|
80
82
|
import { TokenFlags } from './types.js';
|
|
81
83
|
import {
|
|
@@ -140,7 +142,10 @@ export class CompilerHost extends ModuleResolutionHost {
|
|
|
140
142
|
if (prepared !== undefined) return prepared;
|
|
141
143
|
const text = this.fs.readFile(fileName);
|
|
142
144
|
if (text === undefined) return undefined;
|
|
143
|
-
|
|
145
|
+
// A file without a known extension (with allowNonTsExtensions) parses as TypeScript.
|
|
146
|
+
const kind = getScriptKindFromFileName(fileName);
|
|
147
|
+
const scriptKind = kind === ScriptKind.Unknown ? ScriptKind.TS : kind;
|
|
148
|
+
return parseSourceFile(fileName, text, new ParseOptions(path, scriptKind, externalModuleIndicatorOptions));
|
|
144
149
|
}
|
|
145
150
|
|
|
146
151
|
/** The config of a referenced project, or `undefined` if it can't be read. */
|
|
@@ -246,6 +251,8 @@ class ParseTask {
|
|
|
246
251
|
subTasks: ParseTask[] | undefined = undefined;
|
|
247
252
|
loaded = false;
|
|
248
253
|
startedSubTasks = false;
|
|
254
|
+
/** A root file name that resolved to no supported file: the task only carries its processing diagnostic. */
|
|
255
|
+
failedLookup = false;
|
|
249
256
|
metadata: SourceFileMetadata = libFileMetadata;
|
|
250
257
|
resolutionsInFile: ModeAwareCache<ResolvedModule> | undefined = undefined;
|
|
251
258
|
resolutionsTrace: MessageWithArgs[] | undefined = undefined;
|
|
@@ -256,6 +263,8 @@ class ParseTask {
|
|
|
256
263
|
jsxRuntimeImport: JsxRuntimeImport | undefined = undefined;
|
|
257
264
|
/** The task of the same file name that was loaded instead of this one. */
|
|
258
265
|
loadedTask: ParseTask | undefined = undefined;
|
|
266
|
+
/** The index in `FileLoader.taskData` of the tasks of this task's path, once known; -1 before. */
|
|
267
|
+
dataIndex = -1;
|
|
259
268
|
/** Whether an import or a type reference directive adds the file (`ProcessedFiles.addedFiles`). */
|
|
260
269
|
readonly byImport: boolean;
|
|
261
270
|
|
|
@@ -303,9 +312,30 @@ class ParseTask {
|
|
|
303
312
|
|
|
304
313
|
const noData: readonly ParseTaskData[] = [];
|
|
305
314
|
|
|
315
|
+
/** The resolution of a module the importing file declares itself: none. */
|
|
316
|
+
const locallyDeclaredModule: ResolvedModule = {
|
|
317
|
+
resolvedFileName: '',
|
|
318
|
+
originalPath: '',
|
|
319
|
+
extension: '',
|
|
320
|
+
resolvedUsingTsExtension: false,
|
|
321
|
+
packageId: undefined,
|
|
322
|
+
isExternalLibraryImport: false,
|
|
323
|
+
alternateResult: '',
|
|
324
|
+
resolutionDiagnostics: [],
|
|
325
|
+
};
|
|
326
|
+
|
|
306
327
|
/** The tasks of one path, by file name casing. */
|
|
307
328
|
class ParseTaskData {
|
|
308
329
|
readonly tasks = new Map<string, ParseTask>();
|
|
330
|
+
/** Whether a task of the path is queued (`start`). */
|
|
331
|
+
queued = false;
|
|
332
|
+
/** The path's first queued task, the first of `tasks`. */
|
|
333
|
+
first: ParseTask | undefined = undefined;
|
|
334
|
+
/**
|
|
335
|
+
* Whether every task of `tasks` is loaded (`run`): then more work of the path does nothing unless it
|
|
336
|
+
* reaches the path at a lower depth.
|
|
337
|
+
*/
|
|
338
|
+
settled = false;
|
|
309
339
|
lowestDepth = Number.MAX_SAFE_INTEGER;
|
|
310
340
|
startedSubTasks = false;
|
|
311
341
|
packageId: PackageId | undefined = undefined;
|
|
@@ -315,10 +345,10 @@ class ParseTaskData {
|
|
|
315
345
|
keptCopy: ParseTaskData | undefined = undefined;
|
|
316
346
|
/** The paths the file's imports and type reference directives add, once collected. */
|
|
317
347
|
added: readonly ParseTaskData[] = noData;
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
348
|
+
/** The file name `collect` reached the path by first, once it did. */
|
|
349
|
+
collectedName: string | undefined = undefined;
|
|
350
|
+
/** The path's include reasons, once `collect` found one: the list in `IncludeProcessor.fileIncludeReasons`. */
|
|
351
|
+
reasons: FileIncludeReason[] | undefined = undefined;
|
|
322
352
|
}
|
|
323
353
|
|
|
324
354
|
/** Pending processing of `tasks[index]`. */
|
|
@@ -477,7 +507,7 @@ export function needsImportHelpersImportSpecifier(file: SourceFile, options: Com
|
|
|
477
507
|
|
|
478
508
|
/** The module `file` imports the JSX runtime from under `options`, or '' if it imports none. */
|
|
479
509
|
export function jsxRuntimeImportOf(file: SourceFile, options: CompilerOptions): string {
|
|
480
|
-
if (file
|
|
510
|
+
if (!isSourceFileJS(file) && file.scriptKind !== ScriptKind.TSX) return '';
|
|
481
511
|
return getJSXRuntimeImport(getJSXImplicitImportBase(options, file), options);
|
|
482
512
|
}
|
|
483
513
|
|
|
@@ -557,7 +587,10 @@ export class FileLoader {
|
|
|
557
587
|
private readonly supportedExtensionsWithJson: readonly (readonly string[])[];
|
|
558
588
|
private readonly maxNodeModuleJsDepth: number;
|
|
559
589
|
private readonly rootTasks: ParseTask[] = [];
|
|
560
|
-
|
|
590
|
+
/** The tasks of each path, created when a task of the path is first queued or built ahead. */
|
|
591
|
+
private readonly taskData: ParseTaskData[] = [];
|
|
592
|
+
/** The index in `taskData` of each path's tasks. */
|
|
593
|
+
private readonly taskDataByPath = new Map<string, number>();
|
|
561
594
|
/** Work queued by `start`, run last-in first-out like tsgo's single-threaded work group. */
|
|
562
595
|
private readonly work: ParseWork[] = [];
|
|
563
596
|
private readonly libFileCache = new Map<string, LibFile>();
|
|
@@ -627,7 +660,11 @@ export class FileLoader {
|
|
|
627
660
|
const loaded = prepared.loaded;
|
|
628
661
|
if (loaded === undefined) continue;
|
|
629
662
|
const subTasks = this.subTasksOf(loaded);
|
|
630
|
-
|
|
663
|
+
// Their paths and tasks, found here while threads parse rather than when the walk reaches them.
|
|
664
|
+
for (const task of subTasks) {
|
|
665
|
+
task.path = this.toPath(task.normalizedFilePath);
|
|
666
|
+
task.dataIndex = this.dataIndexOf(task.path);
|
|
667
|
+
}
|
|
631
668
|
this.subTasksAhead.set(prepared.fileName, new SubTasksAhead(loaded, subTasks));
|
|
632
669
|
}
|
|
633
670
|
}
|
|
@@ -705,7 +742,7 @@ export class FileLoader {
|
|
|
705
742
|
|
|
706
743
|
private walk(): void {
|
|
707
744
|
for (let work = this.work.pop(); work !== undefined; work = this.work.pop()) {
|
|
708
|
-
if (this.walkingAhead && this.parsesUnprepared(work.tasks[work.index], work.data)) {
|
|
745
|
+
if (this.walkingAhead && !this.elides(work) && this.parsesUnprepared(work.tasks[work.index], work.data)) {
|
|
709
746
|
this.work.push(work);
|
|
710
747
|
return;
|
|
711
748
|
}
|
|
@@ -721,6 +758,7 @@ export class FileLoader {
|
|
|
721
758
|
*/
|
|
722
759
|
release(): void {
|
|
723
760
|
this.rootTasks.length = 0;
|
|
761
|
+
this.taskData.length = 0;
|
|
724
762
|
this.taskDataByPath.clear();
|
|
725
763
|
this.work.length = 0;
|
|
726
764
|
this.subTasksAhead.clear();
|
|
@@ -900,6 +938,7 @@ export class FileLoader {
|
|
|
900
938
|
return;
|
|
901
939
|
}
|
|
902
940
|
const task = new ParseTask(absolute, undefined, reason, false, false, false, undefined);
|
|
941
|
+
task.failedLookup = true;
|
|
903
942
|
task.addProcessingDiagnostic(
|
|
904
943
|
ProcessingDiagnostic.explainingFileInclude('', reason, resolved.message, resolved.args),
|
|
905
944
|
);
|
|
@@ -926,6 +965,8 @@ export class FileLoader {
|
|
|
926
965
|
): string | ReferenceDiagnostic {
|
|
927
966
|
const allowNonTsExtensions = this.options.allowNonTsExtensions === true;
|
|
928
967
|
const diagnosticFileName = normalizeSlashes(referenceText);
|
|
968
|
+
if (isNetworkPath(fileName))
|
|
969
|
+
return new ReferenceDiagnostic(Diagnostics.Network_path_0_is_not_supported, [diagnosticFileName]);
|
|
929
970
|
const fs = this.host.fs;
|
|
930
971
|
if (hasExtension(fileName)) {
|
|
931
972
|
const canonicalFileName = getCanonicalFileName(fileName, fs.useCaseSensitiveFileNames);
|
|
@@ -1026,43 +1067,67 @@ export class FileLoader {
|
|
|
1026
1067
|
// ---- Loading
|
|
1027
1068
|
|
|
1028
1069
|
private start(tasks: ParseTask[], depth: number): void {
|
|
1070
|
+
const taskData = this.taskData;
|
|
1029
1071
|
for (let i = 0; i < tasks.length; i++) {
|
|
1030
1072
|
const task = tasks[i];
|
|
1031
|
-
// Sub-tasks built ahead have their paths.
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1073
|
+
// Sub-tasks built ahead have their paths and tasks.
|
|
1074
|
+
let k = task.dataIndex;
|
|
1075
|
+
if (k < 0) {
|
|
1076
|
+
if (task.path === '') task.path = this.toPath(task.normalizedFilePath);
|
|
1077
|
+
k = this.dataIndexOf(task.path);
|
|
1078
|
+
task.dataIndex = k;
|
|
1079
|
+
}
|
|
1080
|
+
const data = taskData[k];
|
|
1081
|
+
const loaded = data.queued;
|
|
1082
|
+
if (!loaded) {
|
|
1083
|
+
data.queued = true;
|
|
1084
|
+
data.first = task;
|
|
1085
|
+
data.tasks.set(task.normalizedFilePath, task);
|
|
1038
1086
|
}
|
|
1039
1087
|
this.work.push(new ParseWork(tasks, i, data, loaded, depth));
|
|
1040
1088
|
}
|
|
1041
1089
|
}
|
|
1042
1090
|
|
|
1091
|
+
/** The index in `taskData` of the tasks of `path`, created if needed. */
|
|
1092
|
+
private dataIndexOf(path: string): number {
|
|
1093
|
+
let k = this.taskDataByPath.get(path);
|
|
1094
|
+
if (k === undefined) {
|
|
1095
|
+
k = this.taskData.length;
|
|
1096
|
+
this.taskData.push(new ParseTaskData());
|
|
1097
|
+
this.taskDataByPath.set(path, k);
|
|
1098
|
+
}
|
|
1099
|
+
return k;
|
|
1100
|
+
}
|
|
1101
|
+
|
|
1043
1102
|
private run(work: ParseWork): void {
|
|
1044
1103
|
const task = work.tasks[work.index];
|
|
1045
1104
|
const data = work.data;
|
|
1046
1105
|
let startSubTasks = false;
|
|
1047
1106
|
if (work.loaded) {
|
|
1048
|
-
const
|
|
1107
|
+
const name = task.normalizedFilePath;
|
|
1108
|
+
const first = data.first;
|
|
1109
|
+
const existing = first !== undefined && first.normalizedFilePath === name ? first : data.tasks.get(name);
|
|
1049
1110
|
if (existing !== undefined) {
|
|
1050
1111
|
task.loadedTask = existing;
|
|
1051
1112
|
} else {
|
|
1052
|
-
data.tasks.set(
|
|
1113
|
+
data.tasks.set(name, task);
|
|
1114
|
+
data.settled = false;
|
|
1053
1115
|
// A new casing of a file: load its references if another casing's were.
|
|
1054
1116
|
startSubTasks = data.startedSubTasks;
|
|
1055
1117
|
}
|
|
1056
1118
|
}
|
|
1057
1119
|
if (data.packageId === undefined && task.packageId !== undefined) data.packageId = task.packageId;
|
|
1058
1120
|
const depth = task.increaseDepth ? work.depth + 1 : work.depth;
|
|
1059
|
-
|
|
1121
|
+
const lowered = depth < data.lowestDepth;
|
|
1122
|
+
if (lowered) {
|
|
1060
1123
|
// Reached at a lower depth than before: load references again.
|
|
1061
1124
|
data.lowestDepth = depth;
|
|
1062
1125
|
startSubTasks = true;
|
|
1063
1126
|
data.startedSubTasks = true;
|
|
1064
1127
|
}
|
|
1065
1128
|
if (task.elideOnDepth && depth > this.maxNodeModuleJsDepth) return;
|
|
1129
|
+
// Most work reaches a path already loaded, at no lower depth.
|
|
1130
|
+
if (data.settled && !startSubTasks) return;
|
|
1066
1131
|
for (const taskByFileName of data.tasks.values()) {
|
|
1067
1132
|
let loadSubTasks = startSubTasks;
|
|
1068
1133
|
if (!taskByFileName.loaded) {
|
|
@@ -1072,11 +1137,23 @@ export class FileLoader {
|
|
|
1072
1137
|
data.startedSubTasks = true;
|
|
1073
1138
|
}
|
|
1074
1139
|
}
|
|
1075
|
-
|
|
1140
|
+
// A lower depth restarts references already started, which may now be loaded past `maxNodeModuleJsDepth`.
|
|
1141
|
+
// Every file reached from them is at least as deep, so a depth past it changes nothing they load.
|
|
1142
|
+
if (loadSubTasks && ((lowered && depth <= this.maxNodeModuleJsDepth) || !taskByFileName.startedSubTasks)) {
|
|
1076
1143
|
taskByFileName.startedSubTasks = true;
|
|
1077
1144
|
if (taskByFileName.subTasks !== undefined) this.start(taskByFileName.subTasks, data.lowestDepth);
|
|
1078
1145
|
}
|
|
1079
1146
|
}
|
|
1147
|
+
data.settled = true;
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
/**
|
|
1151
|
+
* Whether `run` drops `work` without loading its file: a JavaScript file past `maxNodeModuleJsDepth`,
|
|
1152
|
+
* which no parse thread prepares, so the walk ahead does not wait for it.
|
|
1153
|
+
*/
|
|
1154
|
+
private elides(work: ParseWork): boolean {
|
|
1155
|
+
const task = work.tasks[work.index];
|
|
1156
|
+
return task.elideOnDepth && (task.increaseDepth ? work.depth + 1 : work.depth) > this.maxNodeModuleJsDepth;
|
|
1080
1157
|
}
|
|
1081
1158
|
|
|
1082
1159
|
/**
|
|
@@ -1096,6 +1173,7 @@ export class FileLoader {
|
|
|
1096
1173
|
this.loadAutomaticTypeDirectives(task);
|
|
1097
1174
|
return;
|
|
1098
1175
|
}
|
|
1176
|
+
if (task.failedLookup) return;
|
|
1099
1177
|
const redirect = this.mapper.getParseFileRedirect(task.path);
|
|
1100
1178
|
if (redirect !== '') {
|
|
1101
1179
|
const redirected = new ParseTask(
|
|
@@ -1344,8 +1422,24 @@ export class FileLoader {
|
|
|
1344
1422
|
for (let index = 0; index < moduleNames.length; index++) {
|
|
1345
1423
|
const entry = moduleNames[index];
|
|
1346
1424
|
const moduleName = getText(entry);
|
|
1347
|
-
|
|
1425
|
+
// A source phase import loads no module declarations.
|
|
1426
|
+
if (moduleName === '' || isSourcePhaseImport(entry.parent!)) continue;
|
|
1348
1427
|
const mode = getModeForUsageLocation(file.fileName, task.metadata, entry, options);
|
|
1428
|
+
// A module the file declares itself (`declare module "m"`) isn't resolved.
|
|
1429
|
+
if (file.ambientModuleNames.includes(moduleName)) {
|
|
1430
|
+
if (options.traceResolution === true)
|
|
1431
|
+
task
|
|
1432
|
+
.moduleTraces(true)!
|
|
1433
|
+
.push(
|
|
1434
|
+
messageWithArgs(
|
|
1435
|
+
Diagnostics.Module_0_was_resolved_as_locally_declared_ambient_module_in_file_1,
|
|
1436
|
+
moduleName,
|
|
1437
|
+
file.fileName,
|
|
1438
|
+
),
|
|
1439
|
+
);
|
|
1440
|
+
resolutions.set(modeAwareKey(moduleName, mode), locallyDeclaredModule);
|
|
1441
|
+
continue;
|
|
1442
|
+
}
|
|
1349
1443
|
const resolved = this.resolver.resolveModuleName(
|
|
1350
1444
|
moduleName,
|
|
1351
1445
|
containingFile,
|
|
@@ -1412,7 +1506,7 @@ export class FileLoader {
|
|
|
1412
1506
|
const redirectFilesByPath = new Map<string, RedirectFile>();
|
|
1413
1507
|
const packageIdToSourceFile = new Map<string, SourceFile>();
|
|
1414
1508
|
const checkCasing = this.options.forceConsistentCasingInFileNames !== false;
|
|
1415
|
-
const
|
|
1509
|
+
const taskData = this.taskData;
|
|
1416
1510
|
// The paths each file's imports and type reference directives add (the tasks of each path), for
|
|
1417
1511
|
// `ProcessedFiles.addedFiles`: recorded while collecting visits them, as their files are only known
|
|
1418
1512
|
// once every file is collected.
|
|
@@ -1427,13 +1521,13 @@ export class FileLoader {
|
|
|
1427
1521
|
// Automatic type directive tasks are an implementation detail, not a reason.
|
|
1428
1522
|
if (task.redirectedParseTask === undefined && !task.isForAutomaticTypeDirective) {
|
|
1429
1523
|
if (task.loadedTask !== undefined) task = task.loadedTask;
|
|
1430
|
-
if (includeReason !== undefined) addIncludeReason(includeProcessor, task, includeReason);
|
|
1524
|
+
if (includeReason !== undefined) addIncludeReason(includeProcessor, taskData, task, includeReason);
|
|
1431
1525
|
}
|
|
1432
|
-
const data =
|
|
1526
|
+
const data = task.dataIndex >= 0 ? taskData[task.dataIndex] : undefined;
|
|
1433
1527
|
if (added !== undefined && data !== undefined && byImport) added.push(data);
|
|
1434
1528
|
if (!task.loaded || data === undefined) continue;
|
|
1435
1529
|
|
|
1436
|
-
const checkedName =
|
|
1530
|
+
const checkedName = data.collectedName;
|
|
1437
1531
|
if (checkedName !== undefined) {
|
|
1438
1532
|
// The same name normalizes the same: only another spelling needs comparing.
|
|
1439
1533
|
if (
|
|
@@ -1446,7 +1540,7 @@ export class FileLoader {
|
|
|
1446
1540
|
}
|
|
1447
1541
|
continue;
|
|
1448
1542
|
}
|
|
1449
|
-
|
|
1543
|
+
data.collectedName = task.normalizedFilePath;
|
|
1450
1544
|
|
|
1451
1545
|
if (tasksSeenByNameIgnoreCase !== undefined) {
|
|
1452
1546
|
const lowerCasePath = toFileNameLowerCase(task.path);
|
|
@@ -1509,13 +1603,15 @@ export class FileLoader {
|
|
|
1509
1603
|
includeProcessor.addProcessingDiagnostic(diagnostic);
|
|
1510
1604
|
continue;
|
|
1511
1605
|
}
|
|
1512
|
-
const path = task.path;
|
|
1513
1606
|
for (const diagnostic of task.processingDiagnostics ?? noProcessingDiagnostics)
|
|
1514
1607
|
includeProcessor.addProcessingDiagnostic(diagnostic);
|
|
1515
1608
|
if (file === undefined) {
|
|
1516
1609
|
missingFiles.push(task.normalizedFilePath);
|
|
1517
1610
|
continue;
|
|
1518
1611
|
}
|
|
1612
|
+
// The program's maps of the file are keyed by the file's own path: lookups by `file.path` then find
|
|
1613
|
+
// the same string, also for a file a parse thread created, whose path is another string than the task's.
|
|
1614
|
+
const path = file.path === task.path ? file.path : task.path;
|
|
1519
1615
|
if (task.libFile !== undefined) {
|
|
1520
1616
|
libFiles.push(file);
|
|
1521
1617
|
libData.set(file, data);
|
|
@@ -1599,10 +1695,21 @@ export function releaseLater(loader: FileLoader): void {
|
|
|
1599
1695
|
setImmediate(() => loader.release());
|
|
1600
1696
|
}
|
|
1601
1697
|
|
|
1602
|
-
function addIncludeReason(
|
|
1698
|
+
function addIncludeReason(
|
|
1699
|
+
processor: IncludeProcessor,
|
|
1700
|
+
taskData: readonly ParseTaskData[],
|
|
1701
|
+
task: ParseTask,
|
|
1702
|
+
reason: FileIncludeReason,
|
|
1703
|
+
): void {
|
|
1603
1704
|
const redirected = task.redirectedParseTask;
|
|
1604
|
-
if (redirected !== undefined) addIncludeReason(processor, redirected, reason);
|
|
1605
|
-
else if (task.loaded)
|
|
1705
|
+
if (redirected !== undefined) addIncludeReason(processor, taskData, redirected, reason);
|
|
1706
|
+
else if (task.loaded) {
|
|
1707
|
+
// The path's list, without looking the path up for each reference to the file.
|
|
1708
|
+
const data = task.dataIndex >= 0 ? taskData[task.dataIndex] : undefined;
|
|
1709
|
+
if (data === undefined) processor.addReason(task.path, reason);
|
|
1710
|
+
else if (data.reasons !== undefined) data.reasons.push(reason);
|
|
1711
|
+
else data.reasons = processor.addReason(task.path, reason);
|
|
1712
|
+
}
|
|
1606
1713
|
}
|
|
1607
1714
|
|
|
1608
1715
|
function createProjectReferenceTasks(paths: readonly string[]): ProjectReferenceTask[] {
|