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
|
@@ -33,7 +33,14 @@ import {
|
|
|
33
33
|
type OutputWriter,
|
|
34
34
|
ProgramEmitter,
|
|
35
35
|
} from './compile-program.js';
|
|
36
|
-
import {
|
|
36
|
+
import {
|
|
37
|
+
Diagnostic,
|
|
38
|
+
DiagnosticFile,
|
|
39
|
+
type DiagnosticFormatOptions,
|
|
40
|
+
formatDiagnostic,
|
|
41
|
+
formattedReports,
|
|
42
|
+
RepopulateInfo,
|
|
43
|
+
} from './diagnostics.js';
|
|
37
44
|
import { EmitOnly, EmitResult } from './emitter.js';
|
|
38
45
|
import { getEmitDeclarations, isIncremental } from './options.js';
|
|
39
46
|
import { DeclarationSignatureWriter } from './incremental.js';
|
|
@@ -45,6 +52,17 @@ import { lastSymbolIdValue } from './symbol.js';
|
|
|
45
52
|
import { shareMergedGlobals } from './checker-symbols.js';
|
|
46
53
|
import { readFileSync } from 'node:fs';
|
|
47
54
|
import { availableParallelism, totalmem } from 'node:os';
|
|
55
|
+
import {
|
|
56
|
+
forbiddenWords,
|
|
57
|
+
isForbidden,
|
|
58
|
+
maxSharingCheckers,
|
|
59
|
+
numberLogSize,
|
|
60
|
+
recordTableSize,
|
|
61
|
+
resultTableSize,
|
|
62
|
+
shareThreads,
|
|
63
|
+
stringLogSize,
|
|
64
|
+
type ThreadSharingData,
|
|
65
|
+
} from './shared-results.js';
|
|
48
66
|
|
|
49
67
|
/** With TSC_TS_CHECKERS_TRACE: the process's resident and peak resident set in MB (Linux), else 0. */
|
|
50
68
|
export function residentMB(): number[] {
|
|
@@ -66,7 +84,8 @@ export function residentMB(): number[] {
|
|
|
66
84
|
* the main thread emits the program (`checkersEmit`). `emitKinds`, by file index, is what the emit of
|
|
67
85
|
* each file includes (an `EmitOnly`, or -1 for none) where not every output of every file is emitted
|
|
68
86
|
* (an incremental program's rebuild); `undefined` for all of them. `units` are the statement ranges of
|
|
69
|
-
* declaration files the order has positions for (`CheckPlan.units`).
|
|
87
|
+
* declaration files the order has positions for (`CheckPlan.units`). `globalsInFileDiagnostics` is the main
|
|
88
|
+
* thread's `CheckedProgram.globalsInFileDiagnostics`.
|
|
70
89
|
*/
|
|
71
90
|
export type CheckerSpawn = (
|
|
72
91
|
program: Program | undefined,
|
|
@@ -80,6 +99,8 @@ export type CheckerSpawn = (
|
|
|
80
99
|
emitKinds: number[] | undefined,
|
|
81
100
|
checking: boolean,
|
|
82
101
|
units: number[],
|
|
102
|
+
globalsInFileDiagnostics: boolean,
|
|
103
|
+
sharing: ThreadSharingData | undefined,
|
|
83
104
|
) => Worker;
|
|
84
105
|
|
|
85
106
|
export class ParallelCheck {
|
|
@@ -144,10 +165,13 @@ export const recycleFiles: number = Math.max(0, Number(process.env.TSC_TS_RECYCL
|
|
|
144
165
|
* text (index, -1 when the program has the file), pos, end, code, category, message,
|
|
145
166
|
* skippedOnNoEmit, the argument count and indices, its repopulate kind (0 for none) followed by the
|
|
146
167
|
* module reference (index), mode and package name (index) of other kinds, then its message chain and
|
|
147
|
-
* related information as lists.
|
|
148
|
-
*
|
|
149
|
-
*
|
|
150
|
-
*
|
|
168
|
+
* related information as lists. A diagnostic of a reported list (the files' diagnostic and declaration
|
|
169
|
+
* diagnostic lists, the global diagnostics and an emit result's diagnostics) is followed by its text in
|
|
170
|
+
* the main thread's report format (`Diagnostic.formatted`, an index, -1 for none). An emit result is
|
|
171
|
+
* emitSkipped, the emitted files, errors and unsupported files as lists of indices, then its
|
|
172
|
+
* diagnostics and its declaration signatures as a list of indices. `files` and `nums` are typed
|
|
173
|
+
* arrays, which postMessage copies as one block of memory each; it copies an array of numbers element
|
|
174
|
+
* by element.
|
|
151
175
|
*/
|
|
152
176
|
export type PackedResult = {
|
|
153
177
|
readonly index: number;
|
|
@@ -167,7 +191,11 @@ class ResultPacker {
|
|
|
167
191
|
readonly strs: string[] = [];
|
|
168
192
|
private readonly indices = new Map<string, number>();
|
|
169
193
|
|
|
170
|
-
constructor(
|
|
194
|
+
constructor(
|
|
195
|
+
private readonly program: Program,
|
|
196
|
+
/** The main thread's report format, which this thread formats the reported diagnostics in. */
|
|
197
|
+
private readonly format: DiagnosticFormatOptions | undefined,
|
|
198
|
+
) {}
|
|
171
199
|
|
|
172
200
|
private str(text: string): number {
|
|
173
201
|
let k = this.indices.get(text);
|
|
@@ -184,6 +212,21 @@ class ResultPacker {
|
|
|
184
212
|
for (const d of diagnostics) this.diagnostic(d);
|
|
185
213
|
}
|
|
186
214
|
|
|
215
|
+
/** A list the main thread reports: each diagnostic with its text in the report format. */
|
|
216
|
+
reported(diagnostics: readonly Diagnostic[]): void {
|
|
217
|
+
const nums = this.nums;
|
|
218
|
+
const format = this.format;
|
|
219
|
+
nums.push(diagnostics.length);
|
|
220
|
+
for (const d of diagnostics) {
|
|
221
|
+
this.diagnostic(d);
|
|
222
|
+
if (format === undefined) nums.push(-1);
|
|
223
|
+
else {
|
|
224
|
+
nums.push(this.strs.length);
|
|
225
|
+
this.strs.push(formatDiagnostic(d, format));
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
187
230
|
private strList(texts: readonly string[]): void {
|
|
188
231
|
this.nums.push(texts.length);
|
|
189
232
|
for (const text of texts) this.nums.push(this.str(text));
|
|
@@ -194,7 +237,7 @@ class ResultPacker {
|
|
|
194
237
|
this.strList(result.emittedFiles);
|
|
195
238
|
this.strList(result.errors);
|
|
196
239
|
this.strList(result.unsupported);
|
|
197
|
-
this.
|
|
240
|
+
this.reported(result.diagnostics);
|
|
198
241
|
this.strList(result.declarationSignatures);
|
|
199
242
|
this.strList(result.heldOutputs);
|
|
200
243
|
}
|
|
@@ -226,11 +269,11 @@ class ResultPacker {
|
|
|
226
269
|
|
|
227
270
|
/** Packs `result` (on the checker thread) for `postMessage`. */
|
|
228
271
|
export function packResult(result: CheckerResult, program: Program): PackedResult {
|
|
229
|
-
const packer = new ResultPacker(program);
|
|
230
|
-
for (const list of result.diagnostics) packer.
|
|
272
|
+
const packer = new ResultPacker(program, formattedReports.format);
|
|
273
|
+
for (const list of result.diagnostics) packer.reported(list);
|
|
231
274
|
packer.nums.push(result.declarations.length);
|
|
232
|
-
for (const list of result.declarations) packer.
|
|
233
|
-
packer.
|
|
275
|
+
for (const list of result.declarations) packer.reported(list);
|
|
276
|
+
packer.reported(result.globals);
|
|
234
277
|
packer.nums.push(result.emits.length);
|
|
235
278
|
for (const emit of result.emits) packer.emit(emit);
|
|
236
279
|
return {
|
|
@@ -272,6 +315,19 @@ class ResultUnpacker {
|
|
|
272
315
|
return result;
|
|
273
316
|
}
|
|
274
317
|
|
|
318
|
+
/** A list `ResultPacker.reported` packed. */
|
|
319
|
+
reported(): Diagnostic[] {
|
|
320
|
+
const n = this.next();
|
|
321
|
+
const result: Diagnostic[] = [];
|
|
322
|
+
for (let k = 0; k < n; k++) {
|
|
323
|
+
const d = this.diagnostic();
|
|
324
|
+
const text = this.next();
|
|
325
|
+
if (text >= 0) d.formatted = this.packed.strs[text]!;
|
|
326
|
+
result.push(d);
|
|
327
|
+
}
|
|
328
|
+
return result;
|
|
329
|
+
}
|
|
330
|
+
|
|
275
331
|
private diagnostic(): Diagnostic {
|
|
276
332
|
const strs = this.packed.strs;
|
|
277
333
|
const name = this.next();
|
|
@@ -325,7 +381,7 @@ class ResultUnpacker {
|
|
|
325
381
|
this.strList(result.emittedFiles);
|
|
326
382
|
this.strList(result.errors);
|
|
327
383
|
this.strList(result.unsupported);
|
|
328
|
-
for (const d of this.
|
|
384
|
+
for (const d of this.reported()) result.diagnostics.push(d);
|
|
329
385
|
this.strList(result.declarationSignatures);
|
|
330
386
|
this.strList(result.heldOutputs);
|
|
331
387
|
return result;
|
|
@@ -339,11 +395,11 @@ export function unpackResult(
|
|
|
339
395
|
): CheckerResult {
|
|
340
396
|
const unpacker = new ResultUnpacker(packed, program, files);
|
|
341
397
|
const diagnostics: Diagnostic[][] = [];
|
|
342
|
-
for (let k = 0; k < packed.files.length; k++) diagnostics.push(unpacker.
|
|
398
|
+
for (let k = 0; k < packed.files.length; k++) diagnostics.push(unpacker.reported());
|
|
343
399
|
const declarations: Diagnostic[][] = [];
|
|
344
400
|
const nd = unpacker.count();
|
|
345
|
-
for (let k = 0; k < nd; k++) declarations.push(unpacker.
|
|
346
|
-
const globals = unpacker.
|
|
401
|
+
for (let k = 0; k < nd; k++) declarations.push(unpacker.reported());
|
|
402
|
+
const globals = unpacker.reported();
|
|
347
403
|
const emits: EmitResult[] = [];
|
|
348
404
|
const ne = unpacker.count();
|
|
349
405
|
for (let k = 0; k < ne; k++) emits.push(unpacker.emit());
|
|
@@ -650,8 +706,8 @@ class CheckCosts {
|
|
|
650
706
|
readonly libraries: number[][],
|
|
651
707
|
/** What resolving a library costs a checker the first time (`libraryFirstUseShare` of the text it reaches), by index. */
|
|
652
708
|
readonly libraryCost: number[],
|
|
653
|
-
/** The program files (indices) each file
|
|
654
|
-
readonly imports: (number[]
|
|
709
|
+
/** The program files (indices) each file imports (`ProcessedFiles.addedFiles`), by index. */
|
|
710
|
+
readonly imports: readonly (readonly number[])[],
|
|
655
711
|
) {}
|
|
656
712
|
}
|
|
657
713
|
|
|
@@ -696,34 +752,18 @@ function checkCosts(checked: CheckedProgram, order: number[]): CheckCosts {
|
|
|
696
752
|
}
|
|
697
753
|
const length = textLengths(program);
|
|
698
754
|
for (const i of order) cost[i] = length[i]!;
|
|
699
|
-
const indexOf = new Map<SourceFile, number>();
|
|
700
|
-
for (let i = 0; i < files.length; i++) indexOf.set(files[i]!, i);
|
|
701
|
-
// A file resolved by its own file name is that file (its path is the path of that name).
|
|
702
|
-
const byFileName = new Map<string, SourceFile>();
|
|
703
|
-
for (const file of files) byFileName.set(file.fileName, file);
|
|
704
755
|
const checkedFile: boolean[] = [];
|
|
705
756
|
for (let i = 0; i < files.length; i++) checkedFile.push(false);
|
|
706
757
|
for (const i of order) checkedFile[i] = true;
|
|
707
758
|
// Libraries: unchecked modules that are not default libraries (globals every checker has).
|
|
708
759
|
const isLibrary = (i: number): boolean =>
|
|
709
760
|
!checkedFile[i]! && !program.isSourceFileDefaultLibrary(files[i]!.path) && isExternalModuleFile(files[i]!);
|
|
710
|
-
|
|
711
|
-
const
|
|
712
|
-
let result = edges[i];
|
|
713
|
-
if (result === undefined) {
|
|
714
|
-
result = [];
|
|
715
|
-
for (const target of program.getResolvedFilesOf(files[i]!, byFileName)) {
|
|
716
|
-
const k = indexOf.get(target);
|
|
717
|
-
if (k !== undefined && k !== i) result.push(k);
|
|
718
|
-
}
|
|
719
|
-
edges[i] = result;
|
|
720
|
-
}
|
|
721
|
-
return result;
|
|
722
|
-
};
|
|
761
|
+
// The files each file imports: those it added to the program (`ProcessedFiles.addedFiles`).
|
|
762
|
+
const edges = program.addedFiles();
|
|
723
763
|
const importers = new Map<number, number>();
|
|
724
764
|
for (const i of order) {
|
|
725
765
|
const libraries: number[] = [];
|
|
726
|
-
for (const k of
|
|
766
|
+
for (const k of edges[i]!) if (isLibrary(k) && libraries.indexOf(k) < 0) libraries.push(k);
|
|
727
767
|
librariesOf[i] = libraries;
|
|
728
768
|
for (const k of libraries) importers.set(k, (importers.get(k) ?? 0) + 1);
|
|
729
769
|
}
|
|
@@ -738,7 +778,7 @@ function checkCosts(checked: CheckedProgram, order: number[]): CheckCosts {
|
|
|
738
778
|
while (stack.length > 0) {
|
|
739
779
|
const k = stack.pop()!;
|
|
740
780
|
total += length[k]!;
|
|
741
|
-
for (const t of
|
|
781
|
+
for (const t of edges[k]!)
|
|
742
782
|
if (!seen.has(t) && isLibrary(t)) {
|
|
743
783
|
seen.add(t);
|
|
744
784
|
stack.push(t);
|
|
@@ -1523,6 +1563,137 @@ export function traceSingleChecker(checked: CheckedProgram): void {
|
|
|
1523
1563
|
);
|
|
1524
1564
|
}
|
|
1525
1565
|
|
|
1566
|
+
/** The file a position of the order checks: a file index, or for a statement range, its file's. */
|
|
1567
|
+
function fileOfPosition(order: readonly number[], units: readonly number[], k: number): number {
|
|
1568
|
+
const i = order[k]!;
|
|
1569
|
+
return i >= 0 ? i : units[3 * (-1 - i)]!;
|
|
1570
|
+
}
|
|
1571
|
+
|
|
1572
|
+
/**
|
|
1573
|
+
* Hands position `k` of the order on to another checker (TSC_TS_SHARE). The handed-on positions are a list in
|
|
1574
|
+
* `handoff`: a lock, their number, the number of checkers that may still hand positions on, then the positions.
|
|
1575
|
+
*/
|
|
1576
|
+
function handOff(handoff: Int32Array, k: number): void {
|
|
1577
|
+
while (Atomics.compareExchange(handoff, 0, 0, 1) !== 0) {
|
|
1578
|
+
// Another checker hands a position on or takes one.
|
|
1579
|
+
}
|
|
1580
|
+
const n = handoff[1]!;
|
|
1581
|
+
handoff[3 + n] = k;
|
|
1582
|
+
Atomics.store(handoff, 1, n + 1);
|
|
1583
|
+
Atomics.store(handoff, 0, 0);
|
|
1584
|
+
// Checkers with nothing else to check wait for handed-on positions.
|
|
1585
|
+
Atomics.notify(handoff, 1);
|
|
1586
|
+
}
|
|
1587
|
+
|
|
1588
|
+
/**
|
|
1589
|
+
* Once checker `index` has no more positions of its own: a handed-on position it may check, waiting while other
|
|
1590
|
+
* checkers may still hand some on; -1 when none is left for it.
|
|
1591
|
+
*/
|
|
1592
|
+
function waitForHandedOff(
|
|
1593
|
+
handoff: Int32Array,
|
|
1594
|
+
forbidden: Int32Array,
|
|
1595
|
+
count: number,
|
|
1596
|
+
order: readonly number[],
|
|
1597
|
+
units: readonly number[],
|
|
1598
|
+
index: number,
|
|
1599
|
+
): number {
|
|
1600
|
+
Atomics.sub(handoff, 2, 1);
|
|
1601
|
+
const start = performance.now();
|
|
1602
|
+
for (;;) {
|
|
1603
|
+
const n = Atomics.load(handoff, 1);
|
|
1604
|
+
const k = takeHandedOff(handoff, forbidden, count, order, units, index);
|
|
1605
|
+
if (k >= 0) {
|
|
1606
|
+
// Checking it, this checker may hand positions on again.
|
|
1607
|
+
Atomics.add(handoff, 2, 1);
|
|
1608
|
+
return k;
|
|
1609
|
+
}
|
|
1610
|
+
// The main thread checks what is handed on later, as it does the files of a thread that failed.
|
|
1611
|
+
if (Atomics.load(handoff, 2) === 0 || performance.now() - start > 2000) return -1;
|
|
1612
|
+
Atomics.wait(handoff, 1, n, 1);
|
|
1613
|
+
}
|
|
1614
|
+
}
|
|
1615
|
+
|
|
1616
|
+
/**
|
|
1617
|
+
* A handed-on position checker `index` of `count` may check, removed from the handed-on positions; -1 if there is
|
|
1618
|
+
* none.
|
|
1619
|
+
*/
|
|
1620
|
+
function takeHandedOff(
|
|
1621
|
+
handoff: Int32Array,
|
|
1622
|
+
forbidden: Int32Array,
|
|
1623
|
+
count: number,
|
|
1624
|
+
order: readonly number[],
|
|
1625
|
+
units: readonly number[],
|
|
1626
|
+
index: number,
|
|
1627
|
+
): number {
|
|
1628
|
+
if (Atomics.load(handoff, 1) === 0) return -1;
|
|
1629
|
+
while (Atomics.compareExchange(handoff, 0, 0, 1) !== 0) {
|
|
1630
|
+
// Another checker hands a position on or takes one.
|
|
1631
|
+
}
|
|
1632
|
+
const n = handoff[1]!;
|
|
1633
|
+
let found = -1;
|
|
1634
|
+
for (let j = 0; j < n; j++) {
|
|
1635
|
+
const k = handoff[3 + j]!;
|
|
1636
|
+
if (!isForbidden(forbidden, count, fileOfPosition(order, units, k), index)) {
|
|
1637
|
+
found = k;
|
|
1638
|
+
handoff[3 + j] = handoff[3 + n - 1]!;
|
|
1639
|
+
Atomics.store(handoff, 1, n - 1);
|
|
1640
|
+
break;
|
|
1641
|
+
}
|
|
1642
|
+
}
|
|
1643
|
+
Atomics.store(handoff, 0, 0);
|
|
1644
|
+
return found;
|
|
1645
|
+
}
|
|
1646
|
+
|
|
1647
|
+
/** TSC_TS_SHARE: the sharing data of each of `count` checker threads. */
|
|
1648
|
+
function threadSharingOf(
|
|
1649
|
+
count: number,
|
|
1650
|
+
order: readonly number[],
|
|
1651
|
+
units: readonly number[],
|
|
1652
|
+
files: number,
|
|
1653
|
+
): ThreadSharingData[] {
|
|
1654
|
+
const takers = new SharedArrayBuffer(4 * files);
|
|
1655
|
+
const forbidden = new SharedArrayBuffer(4 * files * forbiddenWords(count));
|
|
1656
|
+
const handoff = new SharedArrayBuffer(4 * (3 + order.length));
|
|
1657
|
+
new Int32Array(handoff)[2] = count;
|
|
1658
|
+
const taken = new Int32Array(takers);
|
|
1659
|
+
taken.fill(-2);
|
|
1660
|
+
for (let k = 0; k < order.length; k++) {
|
|
1661
|
+
const i = order[k]!;
|
|
1662
|
+
if (i >= 0) {
|
|
1663
|
+
if (taken[i] === -2) taken[i] = 0;
|
|
1664
|
+
} else taken[units[3 * (-1 - i)]!] = -1;
|
|
1665
|
+
}
|
|
1666
|
+
const typeTable = new SharedArrayBuffer(8 * resultTableSize);
|
|
1667
|
+
const returnTable = new SharedArrayBuffer(8 * resultTableSize);
|
|
1668
|
+
const numberLogs: SharedArrayBuffer[] = [];
|
|
1669
|
+
const recordTables: SharedArrayBuffer[] = [];
|
|
1670
|
+
const stringLogs: SharedArrayBuffer[] = [];
|
|
1671
|
+
for (let i = 0; i < count; i++) {
|
|
1672
|
+
numberLogs.push(new SharedArrayBuffer(4 * numberLogSize));
|
|
1673
|
+
recordTables.push(new SharedArrayBuffer(8 * recordTableSize));
|
|
1674
|
+
stringLogs.push(new SharedArrayBuffer(2 * stringLogSize));
|
|
1675
|
+
}
|
|
1676
|
+
const used = new SharedArrayBuffer(8 * count);
|
|
1677
|
+
const data: ThreadSharingData[] = [];
|
|
1678
|
+
for (let i = 0; i < count; i++)
|
|
1679
|
+
data.push({
|
|
1680
|
+
index: i,
|
|
1681
|
+
count,
|
|
1682
|
+
takers,
|
|
1683
|
+
forbidden,
|
|
1684
|
+
handoff,
|
|
1685
|
+
typeTable,
|
|
1686
|
+
returnTable,
|
|
1687
|
+
nodeIds: lastNodeIdValue(),
|
|
1688
|
+
symbolIds: lastSymbolIdValue(),
|
|
1689
|
+
numberLogs,
|
|
1690
|
+
recordTables,
|
|
1691
|
+
stringLogs,
|
|
1692
|
+
used,
|
|
1693
|
+
});
|
|
1694
|
+
return data;
|
|
1695
|
+
}
|
|
1696
|
+
|
|
1526
1697
|
/**
|
|
1527
1698
|
* Checks files from the shared queue until it is empty; the main thread and checker threads alike.
|
|
1528
1699
|
* A checker thread (`onMainThread` false) also sends back its global diagnostics. At `limit` files
|
|
@@ -1544,8 +1715,14 @@ export function checkFromQueue(
|
|
|
1544
1715
|
emitKinds: readonly number[] | undefined = undefined,
|
|
1545
1716
|
checking: boolean = true,
|
|
1546
1717
|
units: readonly number[] = [],
|
|
1718
|
+
sharing: ThreadSharingData | undefined = undefined,
|
|
1547
1719
|
): CheckerResult {
|
|
1548
1720
|
const start = performance.now();
|
|
1721
|
+
// TSC_TS_SHARE: each file's taker, which other checkers then take the results of its declarations from.
|
|
1722
|
+
const takers = sharing === undefined ? undefined : new Int32Array(sharing.takers);
|
|
1723
|
+
const forbidden = sharing === undefined ? undefined : new Int32Array(sharing.forbidden);
|
|
1724
|
+
const handoff = sharing === undefined ? undefined : new Int32Array(sharing.handoff);
|
|
1725
|
+
const sharingCount = sharing === undefined ? 0 : sharing.count;
|
|
1549
1726
|
const readyAt = Date.now();
|
|
1550
1727
|
const verbose = process.env.TSC_TS_CHECKERS_TRACE === '3';
|
|
1551
1728
|
mark('checking');
|
|
@@ -1587,16 +1764,29 @@ export function checkFromQueue(
|
|
|
1587
1764
|
if (limit > 0 && done.length >= limit) {
|
|
1588
1765
|
more = true;
|
|
1589
1766
|
left = reservedBy(index).splice(0);
|
|
1767
|
+
// The thread that continues doesn't share results, so it hands nothing on.
|
|
1768
|
+
if (handoff !== undefined) Atomics.sub(handoff, 2, 1);
|
|
1590
1769
|
break;
|
|
1591
1770
|
}
|
|
1592
1771
|
// Except on checker 0, read the process's memory every 20 ms at most.
|
|
1593
1772
|
if (retirement > 0 && performance.now() - memoryReadAt >= 20) {
|
|
1594
1773
|
memoryReadAt = performance.now();
|
|
1595
|
-
if (retires(counter, index, retirement))
|
|
1774
|
+
if (retires(counter, index, retirement)) {
|
|
1775
|
+
if (handoff !== undefined) Atomics.sub(handoff, 2, 1);
|
|
1776
|
+
break;
|
|
1777
|
+
}
|
|
1596
1778
|
}
|
|
1597
|
-
|
|
1779
|
+
let k = handoff !== undefined ? takeHandedOff(handoff, forbidden!, sharingCount, order, units, index) : -1;
|
|
1780
|
+
if (k < 0) k = takePosition(counter, order.length, index, plan);
|
|
1781
|
+
if (k < 0 && handoff !== undefined) k = waitForHandedOff(handoff, forbidden!, sharingCount, order, units, index);
|
|
1598
1782
|
if (k < 0) break;
|
|
1599
1783
|
const i = order[k]!;
|
|
1784
|
+
// A file this checker took results for before anyone took it goes to another checker.
|
|
1785
|
+
if (forbidden !== undefined && i >= 0 && isForbidden(forbidden, sharingCount, i, index)) {
|
|
1786
|
+
handOff(handoff!, k);
|
|
1787
|
+
continue;
|
|
1788
|
+
}
|
|
1789
|
+
if (takers !== undefined && i >= 0) Atomics.store(takers, i, index + 1);
|
|
1600
1790
|
if (i < 0) {
|
|
1601
1791
|
// A statement range of a declaration file, which has nothing to emit.
|
|
1602
1792
|
const u = -1 - i;
|
|
@@ -1642,24 +1832,39 @@ export function checkFromQueue(
|
|
|
1642
1832
|
} else if (writer !== undefined) {
|
|
1643
1833
|
const emitStart = timeline ? performance.now() : 0;
|
|
1644
1834
|
const kind = (emitKinds === undefined ? EmitOnly.All : emitKinds[i]!) as EmitOnly;
|
|
1835
|
+
// Global diagnostics found while emitting are not reported: the program collects them
|
|
1836
|
+
// before it emits.
|
|
1837
|
+
const checker = checked.checker;
|
|
1645
1838
|
if (kind < 0) emits.push(new EmitResult());
|
|
1646
1839
|
else if (signatures !== undefined) {
|
|
1647
1840
|
signatures.file = files[i]!;
|
|
1648
|
-
const result = emitter!.emit([files[i]!], kind, signatures);
|
|
1841
|
+
const result = checker.withoutGlobalDiagnostics(() => emitter!.emit([files[i]!], kind, signatures));
|
|
1649
1842
|
for (const s of signatures.take()) result.declarationSignatures.push(s);
|
|
1650
1843
|
if (holding !== undefined) for (const o of holding.take()) result.heldOutputs.push(o);
|
|
1651
1844
|
emits.push(result);
|
|
1652
1845
|
} else {
|
|
1653
|
-
const result = emitter!.emit([files[i]!], kind, writer);
|
|
1846
|
+
const result = checker.withoutGlobalDiagnostics(() => emitter!.emit([files[i]!], kind, writer));
|
|
1654
1847
|
if (holding !== undefined) for (const o of holding.take()) result.heldOutputs.push(o);
|
|
1655
1848
|
emits.push(result);
|
|
1656
1849
|
}
|
|
1657
1850
|
if (timeline) markAt(emitStart, `emit ${(performance.now() - emitStart).toFixed(1)} ${files[i]!.fileName}`);
|
|
1658
|
-
} else if (emitter !== undefined)
|
|
1851
|
+
} else if (emitter !== undefined)
|
|
1852
|
+
declarations.push(
|
|
1853
|
+
checked.checker.withoutGlobalDiagnostics(() => declarationDiagnosticsOfFile(emitter, files[i]!)),
|
|
1854
|
+
);
|
|
1855
|
+
// What emitting found and forgot can stay cached in this checker (a missing global type, an
|
|
1856
|
+
// instantiation too deep), where checking a later file would report it: a new checker continues
|
|
1857
|
+
// the schedule, as at the file limit.
|
|
1858
|
+
if (checked.checker.forgottenGlobalDiagnostics() > 0) {
|
|
1859
|
+
more = true;
|
|
1860
|
+
left = reservedBy(index).splice(0);
|
|
1861
|
+
break;
|
|
1862
|
+
}
|
|
1659
1863
|
}
|
|
1660
1864
|
mark(`checked ${done.length} files, ${unitsDone.length} ranges`);
|
|
1661
|
-
//
|
|
1662
|
-
|
|
1865
|
+
// On the main thread, those from before checking are the program's own (`ownGlobalDiagnostics`), and
|
|
1866
|
+
// CheckedProgram.getGlobalDiagnostics deduplicates them with these.
|
|
1867
|
+
const globals = (onMainThread ? checked.checker.getGlobalDiagnostics() : checked.getGlobalDiagnostics()).slice();
|
|
1663
1868
|
let stats: number[] = [];
|
|
1664
1869
|
if (process.env.TSC_TS_CHECKERS_TRACE !== undefined) {
|
|
1665
1870
|
const cpu = process.threadCpuUsage();
|
|
@@ -1828,7 +2033,11 @@ export function shareWithCheckers(checked: CheckedProgram): void {
|
|
|
1828
2033
|
/**
|
|
1829
2034
|
* Checks `checked` on `checkers` threads and calls `done` once they are done. With `emits`, each thread
|
|
1830
2035
|
* emits the files it checks (`emitKinds` limits what). With `checking` false, the threads only emit:
|
|
1831
|
-
* for a program whose report has no semantic diagnostics, so that no file is checked in full.
|
|
2036
|
+
* for a program whose report has no semantic diagnostics, so that no file is checked in full. With
|
|
2037
|
+
* `emitsTo`, the emit results go only there, by file index, and nothing else the threads find reaches
|
|
2038
|
+
* the program: a declaration thread (parallel-emit.ts), while this thread's checker checks. With
|
|
2039
|
+
* `declarationsTo`, the same holds for the declaration errors of a `noEmit` program
|
|
2040
|
+
* (`checkersReportDeclarations`).
|
|
1832
2041
|
*/
|
|
1833
2042
|
export function startParallelCheck(
|
|
1834
2043
|
checked: CheckedProgram,
|
|
@@ -1837,6 +2046,8 @@ export function startParallelCheck(
|
|
|
1837
2046
|
emits: boolean = true,
|
|
1838
2047
|
emitKinds: number[] | undefined = undefined,
|
|
1839
2048
|
checking: boolean = true,
|
|
2049
|
+
emitsTo: (EmitResult | undefined)[] | undefined = undefined,
|
|
2050
|
+
declarationsTo: (Diagnostic[] | undefined)[] | undefined = undefined,
|
|
1840
2051
|
): void {
|
|
1841
2052
|
let count = checkers;
|
|
1842
2053
|
const start = performance.now();
|
|
@@ -1899,11 +2110,22 @@ export function startParallelCheck(
|
|
|
1899
2110
|
let remaining = count - firstThread;
|
|
1900
2111
|
let ownDone = false;
|
|
1901
2112
|
const finish = (): void => {
|
|
2113
|
+
if (emitsTo !== undefined || declarationsTo !== undefined) {
|
|
2114
|
+
mark('emitted on checker threads');
|
|
2115
|
+
done(performance.now() - start);
|
|
2116
|
+
return;
|
|
2117
|
+
}
|
|
1902
2118
|
if (checking) {
|
|
1903
2119
|
joinRanges(checked, units, perUnit, perFile);
|
|
1904
|
-
// A thread that failed may have taken files it never checked
|
|
2120
|
+
// A thread that failed may have taken files it never checked, and with TSC_TS_SHARE every checker left may
|
|
2121
|
+
// have taken results for declarations of a file handed on: check them here.
|
|
2122
|
+
let left = 0;
|
|
1905
2123
|
for (const i of order)
|
|
1906
|
-
if (i >= 0 && perFile[i] === undefined)
|
|
2124
|
+
if (i >= 0 && perFile[i] === undefined) {
|
|
2125
|
+
perFile[i] = checked.unfilteredDiagnosticsOfFile(files[i]!);
|
|
2126
|
+
left++;
|
|
2127
|
+
}
|
|
2128
|
+
if (trace && left > 0) process.stderr.write(`checkers: the main thread checked ${left} files\n`);
|
|
1907
2129
|
checked.checkedInParallel = perFile;
|
|
1908
2130
|
}
|
|
1909
2131
|
mark('all checked');
|
|
@@ -1929,6 +2151,22 @@ export function startParallelCheck(
|
|
|
1929
2151
|
done(performance.now() - start);
|
|
1930
2152
|
};
|
|
1931
2153
|
const record = (result: CheckerResult): void => {
|
|
2154
|
+
if (declarationsTo !== undefined) {
|
|
2155
|
+
for (let k = 0; k < result.declarations.length; k++) declarationsTo[result.files[k]!] = result.declarations[k]!;
|
|
2156
|
+
if (trace)
|
|
2157
|
+
process.stderr.write(
|
|
2158
|
+
`checkers: emit-only thread ${result.index} found the declaration errors of ${result.declarations.length} files in ${result.checkTime.toFixed(1)}ms, done at ${(performance.now() - start).toFixed(1)}ms rss ${result.stats[7] ?? '?'}MB\n`,
|
|
2159
|
+
);
|
|
2160
|
+
return;
|
|
2161
|
+
}
|
|
2162
|
+
if (emitsTo !== undefined) {
|
|
2163
|
+
for (let k = 0; k < result.emits.length; k++) emitsTo[result.files[k]!] = result.emits[k]!;
|
|
2164
|
+
if (trace)
|
|
2165
|
+
process.stderr.write(
|
|
2166
|
+
`checkers: emit-only thread ${result.index} emitted ${result.emits.length} files in ${result.checkTime.toFixed(1)}ms, done at ${(performance.now() - start).toFixed(1)}ms rss ${result.stats[7] ?? '?'}MB\n`,
|
|
2167
|
+
);
|
|
2168
|
+
return;
|
|
2169
|
+
}
|
|
1932
2170
|
for (let k = 0; k < result.files.length; k++) perFile[result.files[k]!] = result.diagnostics[k]!;
|
|
1933
2171
|
for (let k = 0; k < result.declarations.length; k++)
|
|
1934
2172
|
perFileDeclarations[result.files[k]!] = result.declarations[k]!;
|
|
@@ -1950,6 +2188,17 @@ export function startParallelCheck(
|
|
|
1950
2188
|
if (remaining === 0 && ownDone) finish();
|
|
1951
2189
|
};
|
|
1952
2190
|
const diagnosticFiles = new Map<string, DiagnosticFile>();
|
|
2191
|
+
// TSC_TS_SHARE: checker threads share results (shared-results.ts).
|
|
2192
|
+
const sharing =
|
|
2193
|
+
shareThreads && shared && !mainChecks && count > 1 && count <= maxSharingCheckers
|
|
2194
|
+
? threadSharingOf(count, order, units, files.length)
|
|
2195
|
+
: undefined;
|
|
2196
|
+
const sharingStarted: boolean[] = [];
|
|
2197
|
+
for (let i = 0; i < count; i++) sharingStarted.push(false);
|
|
2198
|
+
const startSharingOf = (i: number): ThreadSharingData => {
|
|
2199
|
+
sharingStarted[i] = true;
|
|
2200
|
+
return sharing![i]!;
|
|
2201
|
+
};
|
|
1953
2202
|
const spawn = (i: number, reserved: number[]): void => {
|
|
1954
2203
|
const worker = parallelCheck.spawn!(
|
|
1955
2204
|
shared ? program : undefined,
|
|
@@ -1963,6 +2212,9 @@ export function startParallelCheck(
|
|
|
1963
2212
|
emitKinds,
|
|
1964
2213
|
checking,
|
|
1965
2214
|
units,
|
|
2215
|
+
checked.globalsInFileDiagnostics,
|
|
2216
|
+
// A thread that continues another's index doesn't share.
|
|
2217
|
+
reserved.length === 0 && sharing !== undefined && !sharingStarted[i] ? startSharingOf(i) : undefined,
|
|
1966
2218
|
);
|
|
1967
2219
|
worker.on('message', (message: unknown) => {
|
|
1968
2220
|
mark(`result from c${i}`);
|
|
@@ -1979,7 +2231,8 @@ export function startParallelCheck(
|
|
|
1979
2231
|
else threadDone();
|
|
1980
2232
|
});
|
|
1981
2233
|
worker.on('error', (error: unknown) => {
|
|
1982
|
-
|
|
2234
|
+
// Sharing results (TSC_TS_SHARE) is still checked for such failures, which the main thread hides otherwise.
|
|
2235
|
+
if (trace || shareThreads) process.stderr.write(`checkers: thread ${i} failed: ${String(error)}\n`);
|
|
1983
2236
|
threadDone();
|
|
1984
2237
|
});
|
|
1985
2238
|
};
|
|
@@ -1991,10 +2244,31 @@ export function startParallelCheck(
|
|
|
1991
2244
|
mark('reporting checker created');
|
|
1992
2245
|
const emittedHere =
|
|
1993
2246
|
!mainChecks && emitKinds === undefined ? emitUncheckedFiles(checked, order, emits) : new Map<number, EmitResult>();
|
|
1994
|
-
if (mainChecks)
|
|
1995
|
-
|
|
1996
|
-
|
|
2247
|
+
if (mainChecks) {
|
|
2248
|
+
// The program reports the global diagnostics this checker has before checking files as found before
|
|
2249
|
+
// checking; those it finds checking them come with the threads' (`record`).
|
|
2250
|
+
checked.ownGlobalDiagnostics = checked.checker.getGlobalDiagnostics().slice();
|
|
2251
|
+
const own = checkFromQueue(
|
|
2252
|
+
checked,
|
|
2253
|
+
0,
|
|
2254
|
+
new Int32Array(counter),
|
|
2255
|
+
order,
|
|
2256
|
+
epoch,
|
|
2257
|
+
true,
|
|
2258
|
+
0,
|
|
2259
|
+
[],
|
|
2260
|
+
emits,
|
|
2261
|
+
emitKinds,
|
|
2262
|
+
checking,
|
|
2263
|
+
units,
|
|
1997
2264
|
);
|
|
2265
|
+
record(own);
|
|
2266
|
+
// A thread continues where this checker stopped (`checkFromQueue`).
|
|
2267
|
+
if (own.more) {
|
|
2268
|
+
remaining++;
|
|
2269
|
+
spawn(0, own.reserved);
|
|
2270
|
+
}
|
|
2271
|
+
}
|
|
1998
2272
|
ownDone = true;
|
|
1999
2273
|
if (remaining === 0) finish();
|
|
2000
2274
|
}
|