tsc-ts 0.0.9 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/bin/tsc-ts.js +70 -1
- package/dist/api/compiler/ast-utilities.d.ts +19 -1
- package/dist/api/compiler/ast-utilities.js +180 -95
- package/dist/api/compiler/ast.d.ts +22 -15
- package/dist/api/compiler/ast.js +1026 -995
- package/dist/api/compiler/astnav.js +15 -15
- package/dist/api/compiler/binder-utilities.js +186 -186
- package/dist/api/compiler/binder.js +290 -263
- package/dist/api/compiler/character-codes.js +2 -2
- package/dist/api/compiler/checker-calls.js +178 -124
- package/dist/api/compiler/checker-classes.d.ts +14 -3
- package/dist/api/compiler/checker-classes.js +134 -90
- package/dist/api/compiler/checker-contextual.js +64 -61
- package/dist/api/compiler/checker-declaration-order.js +79 -79
- package/dist/api/compiler/checker-declarations.d.ts +1 -0
- package/dist/api/compiler/checker-declarations.js +160 -136
- package/dist/api/compiler/checker-declared-types.js +67 -65
- package/dist/api/compiler/checker-decorators.js +77 -77
- package/dist/api/compiler/checker-deprecation.d.ts +8 -3
- package/dist/api/compiler/checker-deprecation.js +76 -55
- package/dist/api/compiler/checker-destructuring.js +47 -45
- package/dist/api/compiler/checker-elaboration.js +24 -24
- package/dist/api/compiler/checker-emit-helpers.js +4 -4
- package/dist/api/compiler/checker-emit-resolver.d.ts +4 -2
- package/dist/api/compiler/checker-emit-resolver.js +25 -13
- package/dist/api/compiler/checker-evaluator.js +9 -9
- package/dist/api/compiler/checker-expressions.js +244 -211
- package/dist/api/compiler/checker-functions.js +113 -107
- package/dist/api/compiler/checker-generated-code.d.ts +0 -11
- package/dist/api/compiler/checker-generated-code.js +28 -52
- package/dist/api/compiler/checker-grammar.d.ts +1 -0
- package/dist/api/compiler/checker-grammar.js +472 -440
- package/dist/api/compiler/checker-heritage.js +91 -93
- package/dist/api/compiler/checker-inference.d.ts +77 -5
- package/dist/api/compiler/checker-inference.js +487 -107
- package/dist/api/compiler/checker-iteration.d.ts +0 -10
- package/dist/api/compiler/checker-iteration.js +35 -52
- package/dist/api/compiler/checker-javascript.js +14 -14
- package/dist/api/compiler/checker-jsdoc.d.ts +8 -10
- package/dist/api/compiler/checker-jsdoc.js +67 -58
- package/dist/api/compiler/checker-jsx.js +105 -88
- package/dist/api/compiler/checker-members.d.ts +9 -2
- package/dist/api/compiler/checker-members.js +212 -75
- package/dist/api/compiler/checker-modules.d.ts +15 -6
- package/dist/api/compiler/checker-modules.js +469 -309
- package/dist/api/compiler/checker-narrowing.js +273 -189
- package/dist/api/compiler/checker-object-literals.js +25 -22
- package/dist/api/compiler/checker-operators.js +126 -118
- package/dist/api/compiler/checker-overloads.js +27 -27
- package/dist/api/compiler/checker-property-access.js +59 -55
- package/dist/api/compiler/checker-services.d.ts +1 -0
- package/dist/api/compiler/checker-services.js +222 -210
- package/dist/api/compiler/checker-signatures.js +65 -49
- package/dist/api/compiler/checker-source-file.d.ts +5 -0
- package/dist/api/compiler/checker-source-file.js +154 -130
- package/dist/api/compiler/checker-statements.js +33 -32
- package/dist/api/compiler/checker-super.js +50 -50
- package/dist/api/compiler/checker-symbol-types.js +109 -93
- package/dist/api/compiler/checker-symbols.d.ts +13 -1
- package/dist/api/compiler/checker-symbols.js +264 -149
- package/dist/api/compiler/checker-type-factory.d.ts +5 -0
- package/dist/api/compiler/checker-type-factory.js +145 -36
- package/dist/api/compiler/checker-type-nodes.d.ts +1 -0
- package/dist/api/compiler/checker-type-nodes.js +179 -141
- package/dist/api/compiler/checker-type-operators.d.ts +2 -0
- package/dist/api/compiler/checker-type-operators.js +110 -63
- package/dist/api/compiler/checker-types.d.ts +80 -3
- package/dist/api/compiler/checker-types.js +121 -2
- package/dist/api/compiler/checker-unused.js +114 -118
- package/dist/api/compiler/checker-utilities.js +11 -11
- package/dist/api/compiler/checker.d.ts +104 -31
- package/dist/api/compiler/checker.js +181 -33
- package/dist/api/compiler/command-line.d.ts +1 -3
- package/dist/api/compiler/command-line.js +47 -44
- package/dist/api/compiler/compile-program.d.ts +42 -3
- package/dist/api/compiler/compile-program.js +139 -27
- package/dist/api/compiler/diagnostic-messages.d.ts +1849 -1774
- package/dist/api/compiler/diagnostic-messages.js +128 -122
- package/dist/api/compiler/diagnostics.d.ts +22 -0
- package/dist/api/compiler/diagnostics.js +93 -11
- package/dist/api/compiler/emitter.d.ts +7 -1
- package/dist/api/compiler/emitter.js +53 -11
- package/dist/api/compiler/file-include.d.ts +2 -1
- package/dist/api/compiler/file-include.js +11 -7
- package/dist/api/compiler/file-loader.d.ts +21 -1
- package/dist/api/compiler/file-loader.js +201 -48
- package/dist/api/compiler/instantiation.d.ts +7 -0
- package/dist/api/compiler/instantiation.js +101 -49
- package/dist/api/compiler/jsdoc.js +23 -23
- package/dist/api/compiler/link-tables.d.ts +48 -18
- package/dist/api/compiler/link-tables.js +80 -37
- package/dist/api/compiler/locales/cs-CZ.d.ts +1 -1
- package/dist/api/compiler/locales/cs-CZ.js +1 -1
- package/dist/api/compiler/locales/de-DE.d.ts +1 -1
- package/dist/api/compiler/locales/de-DE.js +1 -1
- package/dist/api/compiler/locales/es-ES.d.ts +1 -1
- package/dist/api/compiler/locales/es-ES.js +1 -1
- package/dist/api/compiler/locales/fr-FR.d.ts +1 -1
- package/dist/api/compiler/locales/fr-FR.js +1 -1
- package/dist/api/compiler/locales/it-IT.d.ts +1 -1
- package/dist/api/compiler/locales/it-IT.js +1 -1
- package/dist/api/compiler/locales/ja-JP.d.ts +1 -1
- package/dist/api/compiler/locales/ja-JP.js +1 -1
- package/dist/api/compiler/locales/ko-KR.d.ts +1 -1
- package/dist/api/compiler/locales/ko-KR.js +1 -1
- package/dist/api/compiler/locales/pl-PL.d.ts +1 -1
- package/dist/api/compiler/locales/pl-PL.js +1 -1
- package/dist/api/compiler/locales/pt-BR.d.ts +1 -1
- package/dist/api/compiler/locales/pt-BR.js +1 -1
- package/dist/api/compiler/locales/ru-RU.d.ts +1 -1
- package/dist/api/compiler/locales/ru-RU.js +1 -1
- package/dist/api/compiler/locales/tr-TR.d.ts +1 -1
- package/dist/api/compiler/locales/tr-TR.js +1 -1
- package/dist/api/compiler/locales/zh-CN.d.ts +1 -1
- package/dist/api/compiler/locales/zh-CN.js +1 -1
- package/dist/api/compiler/locales/zh-TW.d.ts +1 -1
- package/dist/api/compiler/locales/zh-TW.js +1 -1
- package/dist/api/compiler/module-resolution-types.js +6 -6
- package/dist/api/compiler/module-resolution.d.ts +10 -1
- package/dist/api/compiler/module-resolution.js +115 -84
- package/dist/api/compiler/module-specifiers.d.ts +15 -0
- package/dist/api/compiler/module-specifiers.js +24 -18
- package/dist/api/compiler/name-resolver.js +74 -65
- package/dist/api/compiler/node-builder-names.d.ts +11 -3
- package/dist/api/compiler/node-builder-names.js +210 -90
- package/dist/api/compiler/node-builder-pseudo.js +29 -31
- package/dist/api/compiler/node-builder-reuse.js +23 -22
- package/dist/api/compiler/node-builder.d.ts +18 -1
- package/dist/api/compiler/node-builder.js +191 -102
- package/dist/api/compiler/option-declarations.d.ts +2 -6
- package/dist/api/compiler/option-declarations.js +315 -375
- package/dist/api/compiler/options.d.ts +15 -33
- package/dist/api/compiler/options.js +21 -54
- package/dist/api/compiler/output-paths.d.ts +4 -1
- package/dist/api/compiler/output-paths.js +6 -11
- package/dist/api/compiler/package-json.d.ts +3 -3
- package/dist/api/compiler/package-json.js +11 -10
- package/dist/api/compiler/parallel-parse.d.ts +3 -2
- package/dist/api/compiler/parallel-parse.js +17 -5
- package/dist/api/compiler/parser.d.ts +40 -19
- package/dist/api/compiler/parser.js +308 -216
- package/dist/api/compiler/path.d.ts +9 -0
- package/dist/api/compiler/path.js +20 -3
- package/dist/api/compiler/printer/emit-context.d.ts +5 -1
- package/dist/api/compiler/printer/emit-context.js +20 -1
- package/dist/api/compiler/printer/factory-base.d.ts +2 -2
- package/dist/api/compiler/printer/factory-base.js +7 -3
- package/dist/api/compiler/printer/factory.js +3 -1
- package/dist/api/compiler/printer/helpers.js +10 -1
- package/dist/api/compiler/printer/name-generator.d.ts +1 -1
- package/dist/api/compiler/printer/name-generator.js +35 -16
- package/dist/api/compiler/printer/printer.d.ts +49 -2
- package/dist/api/compiler/printer/printer.js +539 -293
- package/dist/api/compiler/printer/utilities.js +149 -147
- package/dist/api/compiler/program-checker.d.ts +12 -2
- package/dist/api/compiler/program-checker.js +88 -34
- package/dist/api/compiler/program-utilities.d.ts +3 -1
- package/dist/api/compiler/program-utilities.js +28 -15
- package/dist/api/compiler/program.d.ts +4 -6
- package/dist/api/compiler/program.js +74 -87
- package/dist/api/compiler/pseudo-bigint.d.ts +2 -0
- package/dist/api/compiler/pseudo-bigint.js +18 -0
- package/dist/api/compiler/regexp-checker.d.ts +1 -1
- package/dist/api/compiler/regexp-checker.js +93 -76
- package/dist/api/compiler/relations.d.ts +27 -4
- package/dist/api/compiler/relations.js +347 -180
- package/dist/api/compiler/reparser.js +60 -56
- package/dist/api/compiler/scanner.d.ts +19 -2
- package/dist/api/compiler/scanner.js +123 -108
- package/dist/api/compiler/shared-results.d.ts +463 -0
- package/dist/api/compiler/shared-results.js +2128 -0
- package/dist/api/compiler/sourcemap.js +2 -2
- package/dist/api/compiler/symbol-accessibility.js +87 -74
- package/dist/api/compiler/symbol.d.ts +23 -14
- package/dist/api/compiler/symbol.js +23 -11
- package/dist/api/compiler/syntax-kind.d.ts +198 -197
- package/dist/api/compiler/transformers/alias-references.js +247 -139
- package/dist/api/compiler/transformers/async-utilities.js +25 -25
- package/dist/api/compiler/transformers/async.d.ts +0 -1
- package/dist/api/compiler/transformers/async.js +64 -77
- package/dist/api/compiler/transformers/class-fields.d.ts +1 -0
- package/dist/api/compiler/transformers/class-fields.js +81 -78
- package/dist/api/compiler/transformers/commonjs-module.js +18 -15
- package/dist/api/compiler/transformers/const-enum-inliner.js +1 -1
- package/dist/api/compiler/transformers/declarations-diagnostics.js +247 -244
- package/dist/api/compiler/transformers/declarations-pseudo.js +100 -100
- package/dist/api/compiler/transformers/declarations-resolver.d.ts +0 -3
- package/dist/api/compiler/transformers/declarations-syntactic.d.ts +1 -2
- package/dist/api/compiler/transformers/declarations-syntactic.js +134 -156
- package/dist/api/compiler/transformers/declarations-tracker.js +18 -18
- package/dist/api/compiler/transformers/declarations.d.ts +4 -1
- package/dist/api/compiler/transformers/declarations.js +305 -238
- package/dist/api/compiler/transformers/decorator-metadata.d.ts +1 -1
- package/dist/api/compiler/transformers/decorator-metadata.js +53 -45
- package/dist/api/compiler/transformers/decorator-utilities.js +24 -24
- package/dist/api/compiler/transformers/destructuring.js +19 -18
- package/dist/api/compiler/transformers/emit-resolver.js +1 -1
- package/dist/api/compiler/transformers/es-decorators.js +55 -55
- package/dist/api/compiler/transformers/external-module-info.js +3 -3
- package/dist/api/compiler/transformers/for-await.js +25 -25
- package/dist/api/compiler/transformers/import-elision.js +14 -14
- package/dist/api/compiler/transformers/jsx.js +12 -12
- package/dist/api/compiler/transformers/legacy-decorators.js +17 -17
- package/dist/api/compiler/transformers/module.js +8 -8
- package/dist/api/compiler/transformers/named-evaluation.js +4 -4
- package/dist/api/compiler/transformers/object-rest-spread.js +20 -20
- package/dist/api/compiler/transformers/optional-chain.js +10 -10
- package/dist/api/compiler/transformers/reference-resolver.d.ts +12 -1
- package/dist/api/compiler/transformers/reference-resolver.js +131 -69
- package/dist/api/compiler/transformers/runtime-syntax.js +35 -31
- package/dist/api/compiler/transformers/subtree-facts.js +47 -47
- package/dist/api/compiler/transformers/syntax-facts.js +56 -58
- package/dist/api/compiler/transformers/type-eraser.js +73 -66
- package/dist/api/compiler/transformers/type-serialization.js +24 -24
- package/dist/api/compiler/transformers/using.js +12 -12
- package/dist/api/compiler/transformers/utilities.js +77 -77
- package/dist/api/compiler/transformers/visitor-base.js +172 -172
- package/dist/api/compiler/transformers/visitor-hooks.js +6 -2
- package/dist/api/compiler/tsconfig.d.ts +10 -2
- package/dist/api/compiler/tsconfig.js +136 -48
- package/dist/api/compiler/type-printer.js +40 -3
- package/dist/api/compiler/types.d.ts +2 -1
- package/dist/api/library/ast.generated.d.ts +42 -39
- package/dist/api/library/ast.generated.js +1 -1
- package/dist/api/library/compiler-options.generated.d.ts +111 -100
- package/dist/api/library/compiler-options.generated.js +1 -1
- package/dist/api/library/disk.js +12 -1
- package/dist/api/library/enums.generated.d.ts +206 -206
- package/dist/api/library/enums.generated.js +206 -206
- package/dist/api/library/nodes.js +26 -26
- package/package.json +9 -9
- package/src/compiler/ast-utilities.ts +99 -7
- package/src/compiler/ast.ts +58 -26
- package/src/compiler/binder.ts +39 -4
- package/src/compiler/character-codes.ts +2 -2
- package/src/compiler/checker-calls.ts +79 -9
- package/src/compiler/checker-classes.ts +78 -24
- package/src/compiler/checker-contextual.ts +6 -1
- package/src/compiler/checker-declarations.ts +31 -4
- package/src/compiler/checker-declared-types.ts +8 -5
- package/src/compiler/checker-decorators.ts +1 -1
- package/src/compiler/checker-deprecation.ts +29 -8
- package/src/compiler/checker-destructuring.ts +10 -3
- package/src/compiler/checker-emit-helpers.ts +1 -0
- package/src/compiler/checker-emit-resolver.ts +16 -6
- package/src/compiler/checker-expressions.ts +79 -46
- package/src/compiler/checker-functions.ts +21 -6
- package/src/compiler/checker-generated-code.ts +2 -22
- package/src/compiler/checker-grammar.ts +136 -62
- package/src/compiler/checker-heritage.ts +22 -21
- package/src/compiler/checker-inference.ts +514 -82
- package/src/compiler/checker-iteration.ts +18 -31
- package/src/compiler/checker-javascript.ts +1 -1
- package/src/compiler/checker-jsdoc.ts +50 -27
- package/src/compiler/checker-jsx.ts +26 -4
- package/src/compiler/checker-members.ts +200 -56
- package/src/compiler/checker-modules.ts +332 -65
- package/src/compiler/checker-narrowing.ts +98 -19
- package/src/compiler/checker-object-literals.ts +3 -0
- package/src/compiler/checker-operators.ts +11 -4
- package/src/compiler/checker-property-access.ts +7 -2
- package/src/compiler/checker-services.ts +39 -12
- package/src/compiler/checker-signatures.ts +15 -1
- package/src/compiler/checker-source-file.ts +39 -13
- package/src/compiler/checker-statements.ts +3 -2
- package/src/compiler/checker-symbol-types.ts +29 -6
- package/src/compiler/checker-symbols.ts +158 -15
- package/src/compiler/checker-type-factory.ts +124 -23
- package/src/compiler/checker-type-nodes.ts +46 -3
- package/src/compiler/checker-type-operators.ts +83 -26
- package/src/compiler/checker-types.ts +147 -4
- package/src/compiler/checker-unused.ts +9 -14
- package/src/compiler/checker.ts +203 -39
- package/src/compiler/command-line.ts +28 -28
- package/src/compiler/compile-program.ts +167 -27
- package/src/compiler/decoder.ts +13 -4
- package/src/compiler/diagnostic-messages.ts +1973 -1892
- package/src/compiler/diagnostics.ts +84 -3
- package/src/compiler/emitter.ts +57 -8
- package/src/compiler/encoder.ts +23 -8
- package/src/compiler/file-include.ts +9 -3
- package/src/compiler/file-loader.ts +197 -38
- package/src/compiler/help.ts +10 -14
- package/src/compiler/incremental.ts +165 -30
- package/src/compiler/init.ts +2 -7
- package/src/compiler/instantiation.ts +77 -22
- package/src/compiler/jsdoc.ts +3 -1
- package/src/compiler/link-tables.ts +82 -37
- package/src/compiler/locales/cs-CZ.ts +1 -1
- package/src/compiler/locales/de-DE.ts +1 -1
- package/src/compiler/locales/es-ES.ts +1 -1
- package/src/compiler/locales/fr-FR.ts +1 -1
- package/src/compiler/locales/it-IT.ts +1 -1
- package/src/compiler/locales/ja-JP.ts +1 -1
- package/src/compiler/locales/ko-KR.ts +1 -1
- package/src/compiler/locales/pl-PL.ts +1 -1
- package/src/compiler/locales/pt-BR.ts +1 -1
- package/src/compiler/locales/ru-RU.ts +1 -1
- package/src/compiler/locales/tr-TR.ts +1 -1
- package/src/compiler/locales/zh-CN.ts +1 -1
- package/src/compiler/locales/zh-TW.ts +1 -1
- package/src/compiler/module-resolution.ts +44 -8
- package/src/compiler/module-specifiers.ts +62 -20
- package/src/compiler/name-resolver.ts +9 -1
- package/src/compiler/node-builder-names.ts +236 -54
- package/src/compiler/node-builder-pseudo.ts +4 -7
- package/src/compiler/node-builder-reuse.ts +5 -4
- package/src/compiler/node-builder.ts +130 -31
- package/src/compiler/option-declarations.ts +33 -103
- package/src/compiler/options.ts +23 -62
- package/src/compiler/output-paths.ts +5 -18
- package/src/compiler/package-entrypoints.ts +345 -0
- package/src/compiler/package-json.ts +4 -4
- package/src/compiler/parallel-check.ts +326 -52
- package/src/compiler/parallel-emit.ts +320 -0
- package/src/compiler/parallel-parse.ts +16 -5
- package/src/compiler/parse-thread.ts +3 -0
- package/src/compiler/parser.ts +156 -39
- package/src/compiler/path.ts +22 -2
- package/src/compiler/printer/emit-context.ts +21 -0
- package/src/compiler/printer/factory-base.ts +10 -3
- package/src/compiler/printer/factory.ts +4 -1
- package/src/compiler/printer/helpers.ts +10 -1
- package/src/compiler/printer/name-generator.ts +24 -2
- package/src/compiler/printer/printer.ts +266 -30
- package/src/compiler/printer/utilities.ts +8 -2
- package/src/compiler/program-checker.ts +57 -5
- package/src/compiler/program-utilities.ts +23 -10
- package/src/compiler/program.ts +18 -26
- package/src/compiler/pseudo-bigint.ts +17 -0
- package/src/compiler/regexp-checker.ts +63 -30
- package/src/compiler/relations.ts +240 -77
- package/src/compiler/reparser.ts +7 -2
- package/src/compiler/scanner.ts +109 -79
- package/src/compiler/shared-results.ts +2414 -0
- package/src/compiler/show-config.ts +18 -1
- package/src/compiler/sourcemap.ts +2 -2
- package/src/compiler/symbol-accessibility.ts +26 -3
- package/src/compiler/symbol.ts +46 -24
- package/src/compiler/syntax-kind.ts +188 -187
- package/src/compiler/thread-entry.ts +64 -4
- package/src/compiler/transformers/alias-references.ts +123 -4
- package/src/compiler/transformers/async.ts +2 -17
- package/src/compiler/transformers/class-fields.ts +13 -12
- package/src/compiler/transformers/commonjs-module.ts +11 -7
- package/src/compiler/transformers/declarations-diagnostics.ts +5 -3
- package/src/compiler/transformers/declarations-pseudo.ts +2 -4
- package/src/compiler/transformers/declarations-resolver.ts +0 -3
- package/src/compiler/transformers/declarations-syntactic.ts +1 -21
- package/src/compiler/transformers/declarations.ts +134 -48
- package/src/compiler/transformers/decorator-metadata.ts +9 -1
- package/src/compiler/transformers/destructuring.ts +4 -3
- package/src/compiler/transformers/external-module-info.ts +1 -1
- package/src/compiler/transformers/jsx.ts +2 -1
- package/src/compiler/transformers/reference-resolver.ts +83 -19
- package/src/compiler/transformers/runtime-syntax.ts +6 -1
- package/src/compiler/transformers/syntax-facts.ts +2 -7
- package/src/compiler/transformers/type-eraser.ts +10 -1
- package/src/compiler/transformers/type-serialization.ts +3 -2
- package/src/compiler/transformers/visitor-base.ts +2 -1
- package/src/compiler/transformers/visitor-hooks.ts +9 -4
- package/src/compiler/tsc-build.ts +66 -9
- package/src/compiler/tsc-cli.ts +7 -0
- package/src/compiler/tsc-compile.ts +284 -4
- package/src/compiler/tsc-watch.ts +74 -45
- package/src/compiler/tsconfig.ts +176 -19
- package/src/compiler/type-printer.ts +36 -2
- package/src/compiler/types.ts +2 -1
- package/src/library/ast.generated.ts +57 -41
- package/src/library/compiler-options.generated.ts +117 -103
- package/src/library/disk.ts +10 -1
- package/src/library/enums.generated.ts +196 -196
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Emitting a program's JavaScript on threads while the main thread checks it (`--checkers 1` in
|
|
3
|
+
* scriptc builds).
|
|
4
|
+
*
|
|
5
|
+
* JavaScript emit needs nothing of a checker but how decorator metadata serializes a type: import
|
|
6
|
+
* elision, export names and const enum values come from syntax, the binder's symbols and the other
|
|
7
|
+
* files of the program (`SyntacticEmitResolver`, `ReferenceResolver`). So emit threads create no
|
|
8
|
+
* checker. They receive the published program, emit with a `JavaScriptEmitter` the files the main
|
|
9
|
+
* thread hands out through a shared counter, write the outputs and send back their emit results.
|
|
10
|
+
* The main thread checks meanwhile, and so does the declaration thread, a checker thread that only
|
|
11
|
+
* emits declarations (`startDeclarationThread`): `--checkers` counts the checkers that check. Then the
|
|
12
|
+
* main thread records how its checker serializes the types of the decorator metadata of the files that
|
|
13
|
+
* have it (`recordMetadataKinds`), which a second wave of emit threads emits with those answers as plain
|
|
14
|
+
* data (`startMetadataEmit`). Which thread emits a file doesn't change its output, and the main
|
|
15
|
+
* thread's checker finds every diagnostic but those of declaration emit.
|
|
16
|
+
*/
|
|
17
|
+
import type { Worker } from 'node:worker_threads';
|
|
18
|
+
import { availableParallelism } from 'node:os';
|
|
19
|
+
import { publish } from '@scriptc/threads';
|
|
20
|
+
import { lastNodeIdValue, type SourceFile } from './ast.js';
|
|
21
|
+
import { JavaScriptEmitter, type OutputWriter } from './compile-program.js';
|
|
22
|
+
import type { Diagnostic, DiagnosticFile } from './diagnostics.js';
|
|
23
|
+
import { EmitOnly, EmitResult, sourceFileMayBeEmitted } from './emitter.js';
|
|
24
|
+
import {
|
|
25
|
+
CheckerResult,
|
|
26
|
+
packResult,
|
|
27
|
+
packsResults,
|
|
28
|
+
type PackedResult,
|
|
29
|
+
startParallelCheck,
|
|
30
|
+
unpackResult,
|
|
31
|
+
} from './parallel-check.js';
|
|
32
|
+
import type { CheckedProgram } from './program-checker.js';
|
|
33
|
+
import type { Program } from './program.js';
|
|
34
|
+
import { lastSymbolIdValue } from './symbol.js';
|
|
35
|
+
import { mark } from './timeline.js';
|
|
36
|
+
import { SubtreeFacts, SyntaxFacts } from './transformers/syntax-facts.js';
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Starts emit thread `index` (main.ts owns the worker entry point) on the shared, published
|
|
40
|
+
* `program`: it emits the files of `files` at the positions it takes from `counter`, with the decorator
|
|
41
|
+
* metadata `kinds` the main thread recorded (`startMetadataEmit`); ids continue above `nodeIds` and
|
|
42
|
+
* `symbolIds`.
|
|
43
|
+
*/
|
|
44
|
+
export type EmitSpawn = (
|
|
45
|
+
program: Program,
|
|
46
|
+
index: number,
|
|
47
|
+
counter: SharedArrayBuffer,
|
|
48
|
+
files: number[],
|
|
49
|
+
kinds: number[],
|
|
50
|
+
nodeIds: number,
|
|
51
|
+
symbolIds: number,
|
|
52
|
+
) => Worker;
|
|
53
|
+
|
|
54
|
+
export class ParallelEmit {
|
|
55
|
+
/** Set where emit threads can be started. */
|
|
56
|
+
spawn: EmitSpawn | undefined = undefined;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export const parallelEmit = new ParallelEmit();
|
|
60
|
+
|
|
61
|
+
/** The most emit threads: four emitted VS Code's JavaScript as fast as 15 did while one thread checked it. */
|
|
62
|
+
const maxEmitThreads = 4;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* The least text of the files to emit, in characters, for emit threads: starting them and sharing
|
|
66
|
+
* the program takes about as long as emitting this much.
|
|
67
|
+
*/
|
|
68
|
+
const littleEmitText = 50_000;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* The number of threads to emit the JavaScript of `program` on, or 0 to emit it on this thread:
|
|
72
|
+
* where threads can start and the program emits enough, one fewer than the CPUs, at most
|
|
73
|
+
* `maxEmitThreads`. `emitKinds` are what the emit of each file includes (`emitsJavaScript`).
|
|
74
|
+
*/
|
|
75
|
+
export function emitThreads(
|
|
76
|
+
program: Program,
|
|
77
|
+
singleThreaded: boolean | undefined,
|
|
78
|
+
emitKinds: readonly number[] | undefined = undefined,
|
|
79
|
+
): number {
|
|
80
|
+
if (parallelEmit.spawn === undefined || singleThreaded === true) return 0;
|
|
81
|
+
const cpus = availableParallelism();
|
|
82
|
+
if (cpus < 2) return 0;
|
|
83
|
+
const files = program.getSourceFiles();
|
|
84
|
+
let text = 0;
|
|
85
|
+
for (let i = 0; i < files.length; i++)
|
|
86
|
+
if (emitsJavaScript(program, emitKinds, i)) {
|
|
87
|
+
text += files[i]!.end;
|
|
88
|
+
if (text >= littleEmitText) return Math.min(cpus - 1, maxEmitThreads);
|
|
89
|
+
}
|
|
90
|
+
return 0;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Whether the emit of file `index` of `program` includes its JavaScript. `emitKinds` are what the emit of
|
|
95
|
+
* each file includes, by file index: an `EmitOnly`, or -1 for nothing, as an incremental program's pending
|
|
96
|
+
* emit selects (`IncrementalProgram.emitKindsOnCheckers`); `undefined` where every file that may be emitted
|
|
97
|
+
* is emitted in full.
|
|
98
|
+
*/
|
|
99
|
+
function emitsJavaScript(program: Program, emitKinds: readonly number[] | undefined, index: number): boolean {
|
|
100
|
+
if (emitKinds === undefined) return sourceFileMayBeEmitted(program.getSourceFiles()[index]!, program.options);
|
|
101
|
+
const kind = emitKinds[index]!;
|
|
102
|
+
return kind === EmitOnly.All || kind === EmitOnly.Js;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Whether the JavaScript of `file` needs decorator metadata kinds from the checker (`emitDecoratorMetadata`
|
|
107
|
+
* asks it how the types of decorated declarations serialize): a file with decorators is emitted by the second
|
|
108
|
+
* wave of emit threads, with the kinds the main thread's checker recorded after checking (`startMetadataEmit`).
|
|
109
|
+
*/
|
|
110
|
+
function needsMetadataKinds(file: SourceFile, program: Program): boolean {
|
|
111
|
+
return program.options.emitDecoratorMetadata === true && new SyntaxFacts().has(file, SubtreeFacts.ContainsDecorators);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Emits the JavaScript of the files of `checked` whose emit includes it (`emitKinds`) on `threads` threads
|
|
116
|
+
* and calls `done` once they are emitted; the program must be shared (`shareWithCheckers`). The emit results
|
|
117
|
+
* go to `checked.emittedInParallel`, which the program's emit (`PlainProgram`, `IncrementalProgram`) completes
|
|
118
|
+
* on this thread. Returns at once, with the indexes of the files left for `startMetadataEmit`: the results
|
|
119
|
+
* arrive on this thread's event loop.
|
|
120
|
+
*/
|
|
121
|
+
export function startParallelEmit(
|
|
122
|
+
checked: CheckedProgram,
|
|
123
|
+
threads: number,
|
|
124
|
+
done: () => void,
|
|
125
|
+
emitKinds: readonly number[] | undefined = undefined,
|
|
126
|
+
): number[] {
|
|
127
|
+
const program = checked.program;
|
|
128
|
+
const files = program.getSourceFiles();
|
|
129
|
+
const order: number[] = [];
|
|
130
|
+
const metadata: number[] = [];
|
|
131
|
+
for (let i = 0; i < files.length; i++) {
|
|
132
|
+
const file = files[i]!;
|
|
133
|
+
if (!emitsJavaScript(program, emitKinds, i)) continue;
|
|
134
|
+
if (needsMetadataKinds(file, program)) metadata.push(i);
|
|
135
|
+
else order.push(i);
|
|
136
|
+
}
|
|
137
|
+
const perFileEmits: (EmitResult | undefined)[] = [];
|
|
138
|
+
for (let i = 0; i < files.length; i++) perFileEmits.push(undefined);
|
|
139
|
+
checked.emittedInParallel = perFileEmits;
|
|
140
|
+
checked.javaScriptEmittedOnThreads = true;
|
|
141
|
+
spawnEmitThreads(checked, threads, order, [], done);
|
|
142
|
+
return metadata;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Emits the JavaScript of `files` (indexes, from `startParallelEmit`), whose decorator metadata asks the
|
|
147
|
+
* checker, on `threads` threads with the kinds that this thread's checker gave (`recordMetadataKinds`), and
|
|
148
|
+
* calls `done` once they are emitted. Called once this thread has checked the program, so that asking for the
|
|
149
|
+
* kinds doesn't change what checking finds.
|
|
150
|
+
*/
|
|
151
|
+
export function startMetadataEmit(
|
|
152
|
+
checked: CheckedProgram,
|
|
153
|
+
threads: number,
|
|
154
|
+
files: number[],
|
|
155
|
+
kinds: number[],
|
|
156
|
+
done: () => void,
|
|
157
|
+
): void {
|
|
158
|
+
spawnEmitThreads(checked, Math.min(threads, files.length), files, kinds, done);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function spawnEmitThreads(
|
|
162
|
+
checked: CheckedProgram,
|
|
163
|
+
threads: number,
|
|
164
|
+
files: number[],
|
|
165
|
+
kinds: number[],
|
|
166
|
+
done: () => void,
|
|
167
|
+
): void {
|
|
168
|
+
const program = checked.program;
|
|
169
|
+
const sourceFiles = program.getSourceFiles();
|
|
170
|
+
const perFileEmits = checked.emittedInParallel!;
|
|
171
|
+
const order = files.slice();
|
|
172
|
+
// The longest files first, so that the threads finish together.
|
|
173
|
+
order.sort((a, b) => sourceFiles[b]!.end - sourceFiles[a]!.end || a - b);
|
|
174
|
+
publish(order);
|
|
175
|
+
publish(kinds);
|
|
176
|
+
mark(`planned ${order.length} files to emit`);
|
|
177
|
+
const trace = process.env.TSC_TS_CHECKERS_TRACE !== undefined;
|
|
178
|
+
const start = performance.now();
|
|
179
|
+
const counter = new SharedArrayBuffer(4);
|
|
180
|
+
const diagnosticFiles = new Map<string, DiagnosticFile>();
|
|
181
|
+
let remaining = threads;
|
|
182
|
+
if (remaining === 0) done();
|
|
183
|
+
for (let i = 0; i < threads; i++) {
|
|
184
|
+
const worker = parallelEmit.spawn!(program, i, counter, order, kinds, lastNodeIdValue(), lastSymbolIdValue());
|
|
185
|
+
let ended = false;
|
|
186
|
+
const end = (): void => {
|
|
187
|
+
if (ended) return;
|
|
188
|
+
ended = true;
|
|
189
|
+
remaining--;
|
|
190
|
+
if (remaining === 0) done();
|
|
191
|
+
};
|
|
192
|
+
worker.on('message', (message: unknown) => {
|
|
193
|
+
mark(`result from e${i}`);
|
|
194
|
+
const result = packsResults
|
|
195
|
+
? unpackResult(message as PackedResult, program, diagnosticFiles)
|
|
196
|
+
: publish((message as { result: CheckerResult }).result);
|
|
197
|
+
for (let k = 0; k < result.files.length; k++) perFileEmits[result.files[k]!] = result.emits[k]!;
|
|
198
|
+
if (trace)
|
|
199
|
+
process.stderr.write(
|
|
200
|
+
`emit threads: thread ${i} emitted ${result.files.length} files${kinds.length > 0 ? ` with metadata kinds (${result.stats[0] ?? 0} missed a kind)` : ''} in ${result.checkTime.toFixed(1)}ms, done at ${(performance.now() - start).toFixed(1)}ms\n`,
|
|
201
|
+
);
|
|
202
|
+
end();
|
|
203
|
+
});
|
|
204
|
+
// The files a failed thread took and did not send back are emitted on this thread (`PlainProgram.emit`).
|
|
205
|
+
worker.on('error', (error: unknown) => {
|
|
206
|
+
if (trace) process.stderr.write(`emit threads: thread ${i} failed: ${String(error)}\n`);
|
|
207
|
+
end();
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
mark('emit threads spawned');
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/** The most checkers that a declaration thread makes faster (`declarationThreadPays`). */
|
|
214
|
+
const maxDeclarationThreadCheckers = 8;
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Whether a declaration thread (`startDeclarationThread`) shortens a compile with `checkers` checkers: it
|
|
218
|
+
* takes the declaration emit off the checkers, but a checker that only emits declarations takes about as long
|
|
219
|
+
* as the whole check of VS Code or typeorm at 16 checkers. Measured with declarations on both: 6-16% faster
|
|
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
|
+
*/
|
|
222
|
+
export function declarationThreadPays(checkers: number): boolean {
|
|
223
|
+
return checkers <= maxDeclarationThreadCheckers && checkers < availableParallelism();
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Starts the declaration thread: one checker thread that only emits, while the program is checked on this
|
|
228
|
+
* thread (`--checkers 1`) or on checker threads that emit only JavaScript, and calls `done` once it is done. It
|
|
229
|
+
* emits the declarations of every file of `checked` whose emit includes them (`emitKinds`), and also the
|
|
230
|
+
* JavaScript of `metadata` (file indexes, from `startParallelEmit`), whose decorator metadata asks a checker. Its
|
|
231
|
+
* checker checks only what emit asks; it reports nothing but the emit results, which it writes and which the
|
|
232
|
+
* returned array receives by file index (undefined for a file it didn't emit, which the program's emit then
|
|
233
|
+
* emits here). Declaration files and decorator metadata are the same with any checker that emits them.
|
|
234
|
+
*/
|
|
235
|
+
export function startDeclarationThread(
|
|
236
|
+
checked: CheckedProgram,
|
|
237
|
+
metadata: readonly number[],
|
|
238
|
+
done: () => void,
|
|
239
|
+
emitKinds: readonly number[] | undefined = undefined,
|
|
240
|
+
): (EmitResult | undefined)[] {
|
|
241
|
+
const program = checked.program;
|
|
242
|
+
const options = program.options;
|
|
243
|
+
const files = program.getSourceFiles();
|
|
244
|
+
const kinds: number[] = [];
|
|
245
|
+
const results: (EmitResult | undefined)[] = [];
|
|
246
|
+
for (let i = 0; i < files.length; i++) {
|
|
247
|
+
let declarations: boolean;
|
|
248
|
+
if (emitKinds === undefined) declarations = sourceFileMayBeEmitted(files[i]!, options);
|
|
249
|
+
else declarations = emitKinds[i] === EmitOnly.All || emitKinds[i] === EmitOnly.Dts;
|
|
250
|
+
kinds.push(declarations ? (emitsJavaScript(program, emitKinds, i) ? EmitOnly.DtsAfterJs : EmitOnly.Dts) : -1);
|
|
251
|
+
results.push(undefined);
|
|
252
|
+
}
|
|
253
|
+
for (const i of metadata) kinds[i] = emitKinds === undefined ? EmitOnly.All : emitKinds[i]!;
|
|
254
|
+
startParallelCheck(checked, 1, () => done(), true, kinds, false, results);
|
|
255
|
+
mark('declaration thread spawned');
|
|
256
|
+
return results;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Starts the declaration thread of a `noEmit` program that reports the errors of declaration emit
|
|
261
|
+
* (`checkersReportDeclarations`): one checker thread that finds the declaration errors of every file of
|
|
262
|
+
* `checked` while the program is checked on this thread, and calls `done` once it is done. Its checker
|
|
263
|
+
* checks only what declaration emit asks; it reports nothing but the declaration errors, which `done`
|
|
264
|
+
* receives by file index (undefined for a file it didn't reach, whose errors
|
|
265
|
+
* `PlainProgram.getDeclarationDiagnostics` then finds here).
|
|
266
|
+
*/
|
|
267
|
+
export function startDeclarationErrorThread(
|
|
268
|
+
checked: CheckedProgram,
|
|
269
|
+
done: (declarations: (Diagnostic[] | undefined)[]) => void,
|
|
270
|
+
): void {
|
|
271
|
+
const results: (Diagnostic[] | undefined)[] = [];
|
|
272
|
+
for (let i = 0; i < checked.program.getSourceFiles().length; i++) results.push(undefined);
|
|
273
|
+
startParallelCheck(checked, 1, () => done(results), true, undefined, false, undefined, results);
|
|
274
|
+
mark('declaration thread spawned');
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* On emit thread `index`: emits the JavaScript of the files of `order` at the positions it takes
|
|
279
|
+
* from `counter` until none are left, writing it with `writer`; `kinds` are the decorator metadata kinds
|
|
280
|
+
* the main thread recorded for them (`recordMetadataKinds`), if any. `stats` has the number of files that
|
|
281
|
+
* missed a kind.
|
|
282
|
+
*/
|
|
283
|
+
export function emitFromQueue(
|
|
284
|
+
program: Program,
|
|
285
|
+
index: number,
|
|
286
|
+
counter: Int32Array,
|
|
287
|
+
order: readonly number[],
|
|
288
|
+
kinds: readonly number[],
|
|
289
|
+
writer: OutputWriter,
|
|
290
|
+
): CheckerResult {
|
|
291
|
+
const start = performance.now();
|
|
292
|
+
const files = program.getSourceFiles();
|
|
293
|
+
const emitter = new JavaScriptEmitter(program, kinds);
|
|
294
|
+
mark('emitter ready');
|
|
295
|
+
const done: number[] = [];
|
|
296
|
+
const diagnostics: Diagnostic[][] = [];
|
|
297
|
+
const emits: EmitResult[] = [];
|
|
298
|
+
let missed = 0;
|
|
299
|
+
for (;;) {
|
|
300
|
+
const position = Atomics.add(counter, 0, 1);
|
|
301
|
+
if (position >= order.length) break;
|
|
302
|
+
const i = order[position]!;
|
|
303
|
+
const result = emitter.emit(files[i]!, writer);
|
|
304
|
+
// A file whose emit missed a kind isn't sent back: the main thread emits it again, with its checker.
|
|
305
|
+
if (result === undefined) {
|
|
306
|
+
missed++;
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
done.push(i);
|
|
310
|
+
diagnostics.push([]);
|
|
311
|
+
emits.push(result);
|
|
312
|
+
}
|
|
313
|
+
mark(`emitted ${done.length} files`);
|
|
314
|
+
return new CheckerResult(index, done, diagnostics, [], [], performance.now() - start, [missed], false, [], emits);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/** What an emit thread posts back: `result`, packed for `postMessage` where results are packed. */
|
|
318
|
+
export function postedEmitResult(result: CheckerResult, program: Program): PackedResult | { result: CheckerResult } {
|
|
319
|
+
return packsResults ? packResult(result, program) : { result: publish(result) };
|
|
320
|
+
}
|
|
@@ -226,6 +226,13 @@ const maxChunk = 16;
|
|
|
226
226
|
/** Files from this size (bytes) on take a parse thread 25 ms or more, and go out ahead of others. */
|
|
227
227
|
const largeFile = 256 * 1024;
|
|
228
228
|
|
|
229
|
+
/**
|
|
230
|
+
* The most text (bytes) a chunk of other files holds, about one large file's: a chunk ends with the file
|
|
231
|
+
* that reaches it. Sixteen of tsc-ts's own compiler sources, 50-200 KB each, made one chunk that kept its
|
|
232
|
+
* thread busy for 30-45 ms after the others were done.
|
|
233
|
+
*/
|
|
234
|
+
const maxChunkBytes = largeFile;
|
|
235
|
+
|
|
229
236
|
/**
|
|
230
237
|
* The files to hand out to parse threads, each queued once. Library files go out first, one per
|
|
231
238
|
* chunk, also those found later through `/// <reference lib>`: a large one (`lib.dom.d.ts`) takes a
|
|
@@ -233,7 +240,7 @@ const largeFile = 256 * 1024;
|
|
|
233
240
|
* Then, for the same reason, large files, one per chunk: root files (TypeScript's 3 MB `checker.ts`,
|
|
234
241
|
* which in a chunk of root files kept one thread busy after the others were done) and the files the
|
|
235
242
|
* parse threads found (`csstype`'s 0.9 MB of declarations, found through React's). The other files go
|
|
236
|
-
* out in program order, in chunks of up to `maxChunk
|
|
243
|
+
* out in program order, in chunks of up to `maxChunk` files and about `maxChunkBytes` of text.
|
|
237
244
|
*/
|
|
238
245
|
export class ParseQueue {
|
|
239
246
|
private readonly libraries = new LoadJobs();
|
|
@@ -281,7 +288,8 @@ export class ParseQueue {
|
|
|
281
288
|
|
|
282
289
|
/**
|
|
283
290
|
* The next chunk for one of `threads` parse threads, or `undefined` when nothing is left. With
|
|
284
|
-
* `full`, other files only go out `maxChunk`
|
|
291
|
+
* `full`, other files only go out in full chunks, `maxChunk` files or `maxChunkBytes` of text, and stay
|
|
292
|
+
* queued until there are as many.
|
|
285
293
|
*/
|
|
286
294
|
next(threads: number, full = false): LoadMessage | undefined {
|
|
287
295
|
const libraries = this.libraries;
|
|
@@ -306,10 +314,13 @@ export class ParseQueue {
|
|
|
306
314
|
}
|
|
307
315
|
const queue = this.others;
|
|
308
316
|
const left = queue.names.length - this.head;
|
|
309
|
-
if (left <= 0
|
|
310
|
-
const
|
|
317
|
+
if (left <= 0) return undefined;
|
|
318
|
+
const most = full ? maxChunk : Math.min(maxChunk, Math.max(1, Math.floor(left / threads)));
|
|
311
319
|
const start = this.head;
|
|
312
|
-
|
|
320
|
+
let end = start;
|
|
321
|
+
let bytes = 0;
|
|
322
|
+
while (end < queue.names.length && end - start < most && bytes < maxChunkBytes) bytes += queue.sizes[end++]!;
|
|
323
|
+
if (full && end - start < maxChunk && bytes < maxChunkBytes) return undefined;
|
|
313
324
|
this.head = end;
|
|
314
325
|
return {
|
|
315
326
|
stop: false,
|
|
@@ -49,6 +49,9 @@ class PreparingHost extends CompilerHost {
|
|
|
49
49
|
);
|
|
50
50
|
const t2 = timeline ? performance.now() : 0;
|
|
51
51
|
bindSourceFile(file);
|
|
52
|
+
// Published now, while its nodes are in cache: the chunk's publish (`ParseThread.load`) then skips
|
|
53
|
+
// them, where walking the whole chunk's files at once reads each node from memory again.
|
|
54
|
+
publish(file);
|
|
52
55
|
if (timeline) {
|
|
53
56
|
const t3 = performance.now();
|
|
54
57
|
this.readMs += t1 - t0;
|