tsc-ts 0.0.3 → 0.0.5
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 +46 -0
- package/dist/api/compiler/ast-utilities.d.ts +82 -0
- package/dist/api/compiler/ast-utilities.js +462 -0
- package/dist/api/compiler/ast.d.ts +2350 -0
- package/dist/api/compiler/ast.js +11206 -0
- package/dist/api/compiler/astnav.d.ts +37 -0
- package/dist/api/compiler/astnav.js +767 -0
- package/dist/api/compiler/binder-utilities.d.ts +182 -0
- package/dist/api/compiler/binder-utilities.js +1240 -0
- package/dist/api/compiler/binder.d.ts +33 -0
- package/dist/api/compiler/binder.js +2358 -0
- package/dist/api/compiler/character-codes.d.ts +161 -0
- package/dist/api/compiler/character-codes.js +160 -0
- package/dist/api/compiler/checker-calls.d.ts +46 -0
- package/dist/api/compiler/checker-calls.js +1640 -0
- package/dist/api/compiler/checker-classes.d.ts +30 -0
- package/dist/api/compiler/checker-classes.js +582 -0
- package/dist/api/compiler/checker-contextual.d.ts +77 -0
- package/dist/api/compiler/checker-contextual.js +1136 -0
- package/dist/api/compiler/checker-declaration-order.d.ts +12 -0
- package/dist/api/compiler/checker-declaration-order.js +356 -0
- package/dist/api/compiler/checker-declarations.d.ts +33 -0
- package/dist/api/compiler/checker-declarations.js +888 -0
- package/dist/api/compiler/checker-declared-types.d.ts +48 -0
- package/dist/api/compiler/checker-declared-types.js +787 -0
- package/dist/api/compiler/checker-decorators.d.ts +26 -0
- package/dist/api/compiler/checker-decorators.js +562 -0
- package/dist/api/compiler/checker-deprecation.d.ts +33 -0
- package/dist/api/compiler/checker-deprecation.js +315 -0
- package/dist/api/compiler/checker-destructuring.d.ts +34 -0
- package/dist/api/compiler/checker-destructuring.js +584 -0
- package/dist/api/compiler/checker-elaboration.d.ts +15 -0
- package/dist/api/compiler/checker-elaboration.js +290 -0
- package/dist/api/compiler/checker-emit-helpers.d.ts +58 -0
- package/dist/api/compiler/checker-emit-helpers.js +154 -0
- package/dist/api/compiler/checker-emit-resolver.d.ts +75 -0
- package/dist/api/compiler/checker-emit-resolver.js +579 -0
- package/dist/api/compiler/checker-evaluator.d.ts +27 -0
- package/dist/api/compiler/checker-evaluator.js +188 -0
- package/dist/api/compiler/checker-expressions.d.ts +67 -0
- package/dist/api/compiler/checker-expressions.js +1351 -0
- package/dist/api/compiler/checker-features.d.ts +6 -0
- package/dist/api/compiler/checker-features.js +354 -0
- package/dist/api/compiler/checker-flow.d.ts +86 -0
- package/dist/api/compiler/checker-flow.js +169 -0
- package/dist/api/compiler/checker-functions.d.ts +43 -0
- package/dist/api/compiler/checker-functions.js +1002 -0
- package/dist/api/compiler/checker-generated-code.d.ts +25 -0
- package/dist/api/compiler/checker-generated-code.js +168 -0
- package/dist/api/compiler/checker-globals.d.ts +14 -0
- package/dist/api/compiler/checker-globals.js +37 -0
- package/dist/api/compiler/checker-grammar.d.ts +35 -0
- package/dist/api/compiler/checker-grammar.js +2573 -0
- package/dist/api/compiler/checker-heritage.d.ts +28 -0
- package/dist/api/compiler/checker-heritage.js +900 -0
- package/dist/api/compiler/checker-inference.d.ts +179 -0
- package/dist/api/compiler/checker-inference.js +2105 -0
- package/dist/api/compiler/checker-iteration.d.ts +115 -0
- package/dist/api/compiler/checker-iteration.js +857 -0
- package/dist/api/compiler/checker-javascript.d.ts +42 -0
- package/dist/api/compiler/checker-javascript.js +441 -0
- package/dist/api/compiler/checker-jsdoc.d.ts +30 -0
- package/dist/api/compiler/checker-jsdoc.js +320 -0
- package/dist/api/compiler/checker-jsx.d.ts +94 -0
- package/dist/api/compiler/checker-jsx.js +1433 -0
- package/dist/api/compiler/checker-literals.d.ts +6 -0
- package/dist/api/compiler/checker-literals.js +43 -0
- package/dist/api/compiler/checker-members.d.ts +198 -0
- package/dist/api/compiler/checker-members.js +2126 -0
- package/dist/api/compiler/checker-modules.d.ts +85 -0
- package/dist/api/compiler/checker-modules.js +2141 -0
- package/dist/api/compiler/checker-narrowing.d.ts +120 -0
- package/dist/api/compiler/checker-narrowing.js +2797 -0
- package/dist/api/compiler/checker-object-literals.d.ts +14 -0
- package/dist/api/compiler/checker-object-literals.js +479 -0
- package/dist/api/compiler/checker-operators.d.ts +33 -0
- package/dist/api/compiler/checker-operators.js +1040 -0
- package/dist/api/compiler/checker-overloads.d.ts +7 -0
- package/dist/api/compiler/checker-overloads.js +270 -0
- package/dist/api/compiler/checker-property-access.d.ts +34 -0
- package/dist/api/compiler/checker-property-access.js +672 -0
- package/dist/api/compiler/checker-services.d.ts +49 -0
- package/dist/api/compiler/checker-services.js +995 -0
- package/dist/api/compiler/checker-signatures.d.ts +55 -0
- package/dist/api/compiler/checker-signatures.js +788 -0
- package/dist/api/compiler/checker-source-file.d.ts +27 -0
- package/dist/api/compiler/checker-source-file.js +619 -0
- package/dist/api/compiler/checker-statements.d.ts +18 -0
- package/dist/api/compiler/checker-statements.js +226 -0
- package/dist/api/compiler/checker-super.d.ts +13 -0
- package/dist/api/compiler/checker-super.js +241 -0
- package/dist/api/compiler/checker-symbol-types.d.ts +67 -0
- package/dist/api/compiler/checker-symbol-types.js +1885 -0
- package/dist/api/compiler/checker-symbols.d.ts +181 -0
- package/dist/api/compiler/checker-symbols.js +1782 -0
- package/dist/api/compiler/checker-type-factory.d.ts +142 -0
- package/dist/api/compiler/checker-type-factory.js +2501 -0
- package/dist/api/compiler/checker-type-nodes.d.ts +26 -0
- package/dist/api/compiler/checker-type-nodes.js +828 -0
- package/dist/api/compiler/checker-type-operators.d.ts +109 -0
- package/dist/api/compiler/checker-type-operators.js +1842 -0
- package/dist/api/compiler/checker-types.d.ts +1027 -0
- package/dist/api/compiler/checker-types.js +1697 -0
- package/dist/api/compiler/checker-unused.d.ts +19 -0
- package/dist/api/compiler/checker-unused.js +524 -0
- package/dist/api/compiler/checker-utilities.d.ts +33 -0
- package/dist/api/compiler/checker-utilities.js +141 -0
- package/dist/api/compiler/checker.d.ts +491 -0
- package/dist/api/compiler/checker.js +912 -0
- package/dist/api/compiler/command-line.d.ts +32 -0
- package/dist/api/compiler/command-line.js +383 -0
- package/dist/api/compiler/compile-program.d.ts +118 -0
- package/dist/api/compiler/compile-program.js +384 -0
- package/dist/api/compiler/diagnostic-locales.d.ts +22 -0
- package/dist/api/compiler/diagnostic-locales.js +64 -0
- package/dist/api/compiler/diagnostic-messages.d.ts +2166 -0
- package/dist/api/compiler/diagnostic-messages.js +184 -0
- package/dist/api/compiler/diagnostics.d.ts +167 -0
- package/dist/api/compiler/diagnostics.js +820 -0
- package/dist/api/compiler/emitter.d.ts +71 -0
- package/dist/api/compiler/emitter.js +327 -0
- package/dist/api/compiler/file-include.d.ts +117 -0
- package/dist/api/compiler/file-include.js +536 -0
- package/dist/api/compiler/file-loader.d.ts +261 -0
- package/dist/api/compiler/file-loader.js +1257 -0
- package/dist/api/compiler/file-system.d.ts +51 -0
- package/dist/api/compiler/file-system.js +132 -0
- package/dist/api/compiler/flow.d.ts +60 -0
- package/dist/api/compiler/flow.js +45 -0
- package/dist/api/compiler/instantiation.d.ts +74 -0
- package/dist/api/compiler/instantiation.js +799 -0
- package/dist/api/compiler/jsdoc.d.ts +75 -0
- package/dist/api/compiler/jsdoc.js +1229 -0
- package/dist/api/compiler/link-tables.d.ts +36 -0
- package/dist/api/compiler/link-tables.js +83 -0
- package/dist/api/compiler/locale-data.d.ts +24 -0
- package/dist/api/compiler/locale-data.js +183 -0
- package/dist/api/compiler/locale.d.ts +4 -0
- package/dist/api/compiler/locale.js +317 -0
- package/dist/api/compiler/locales/cs-CZ.d.ts +2 -0
- package/dist/api/compiler/locales/cs-CZ.js +3 -0
- package/dist/api/compiler/locales/de-DE.d.ts +2 -0
- package/dist/api/compiler/locales/de-DE.js +3 -0
- package/dist/api/compiler/locales/es-ES.d.ts +2 -0
- package/dist/api/compiler/locales/es-ES.js +3 -0
- package/dist/api/compiler/locales/fr-FR.d.ts +2 -0
- package/dist/api/compiler/locales/fr-FR.js +3 -0
- package/dist/api/compiler/locales/it-IT.d.ts +2 -0
- package/dist/api/compiler/locales/it-IT.js +3 -0
- package/dist/api/compiler/locales/ja-JP.d.ts +2 -0
- package/dist/api/compiler/locales/ja-JP.js +3 -0
- package/dist/api/compiler/locales/ko-KR.d.ts +2 -0
- package/dist/api/compiler/locales/ko-KR.js +3 -0
- package/dist/api/compiler/locales/pl-PL.d.ts +2 -0
- package/dist/api/compiler/locales/pl-PL.js +3 -0
- package/dist/api/compiler/locales/pt-BR.d.ts +2 -0
- package/dist/api/compiler/locales/pt-BR.js +3 -0
- package/dist/api/compiler/locales/ru-RU.d.ts +2 -0
- package/dist/api/compiler/locales/ru-RU.js +3 -0
- package/dist/api/compiler/locales/tr-TR.d.ts +2 -0
- package/dist/api/compiler/locales/tr-TR.js +3 -0
- package/dist/api/compiler/locales/zh-CN.d.ts +2 -0
- package/dist/api/compiler/locales/zh-CN.js +3 -0
- package/dist/api/compiler/locales/zh-TW.d.ts +2 -0
- package/dist/api/compiler/locales/zh-TW.js +3 -0
- package/dist/api/compiler/module-resolution-types.d.ts +83 -0
- package/dist/api/compiler/module-resolution-types.js +176 -0
- package/dist/api/compiler/module-resolution.d.ts +71 -0
- package/dist/api/compiler/module-resolution.js +1598 -0
- package/dist/api/compiler/module-specifiers.d.ts +64 -0
- package/dist/api/compiler/module-specifiers.js +1101 -0
- package/dist/api/compiler/name-resolver.d.ts +43 -0
- package/dist/api/compiler/name-resolver.js +509 -0
- package/dist/api/compiler/node-builder-names.d.ts +32 -0
- package/dist/api/compiler/node-builder-names.js +854 -0
- package/dist/api/compiler/node-builder-pseudo.d.ts +36 -0
- package/dist/api/compiler/node-builder-pseudo.js +744 -0
- package/dist/api/compiler/node-builder-reuse.d.ts +4 -0
- package/dist/api/compiler/node-builder-reuse.js +647 -0
- package/dist/api/compiler/node-builder.d.ts +270 -0
- package/dist/api/compiler/node-builder.js +2645 -0
- package/dist/api/compiler/option-declarations.d.ts +90 -0
- package/dist/api/compiler/option-declarations.js +1460 -0
- package/dist/api/compiler/options.d.ts +289 -0
- package/dist/api/compiler/options.js +1197 -0
- package/dist/api/compiler/output-paths.d.ts +42 -0
- package/dist/api/compiler/output-paths.js +195 -0
- package/dist/api/compiler/package-json.d.ts +175 -0
- package/dist/api/compiler/package-json.js +1015 -0
- package/dist/api/compiler/parallel-parse.d.ts +219 -0
- package/dist/api/compiler/parallel-parse.js +537 -0
- package/dist/api/compiler/parser.d.ts +587 -0
- package/dist/api/compiler/parser.js +6407 -0
- package/dist/api/compiler/path.d.ts +91 -0
- package/dist/api/compiler/path.js +705 -0
- package/dist/api/compiler/printer/async-helpers.d.ts +22 -0
- package/dist/api/compiler/printer/async-helpers.js +91 -0
- package/dist/api/compiler/printer/auto-generate.d.ts +13 -0
- package/dist/api/compiler/printer/auto-generate.js +20 -0
- package/dist/api/compiler/printer/decorator-helpers.d.ts +24 -0
- package/dist/api/compiler/printer/decorator-helpers.js +118 -0
- package/dist/api/compiler/printer/emit-context.d.ts +154 -0
- package/dist/api/compiler/printer/emit-context.js +576 -0
- package/dist/api/compiler/printer/emit-flags.d.ts +60 -0
- package/dist/api/compiler/printer/emit-flags.js +2 -0
- package/dist/api/compiler/printer/factory-base.d.ts +171 -0
- package/dist/api/compiler/printer/factory-base.js +1505 -0
- package/dist/api/compiler/printer/factory.d.ts +147 -0
- package/dist/api/compiler/printer/factory.js +542 -0
- package/dist/api/compiler/printer/helpers.d.ts +27 -0
- package/dist/api/compiler/printer/helpers.js +164 -0
- package/dist/api/compiler/printer/name-generator.d.ts +41 -0
- package/dist/api/compiler/printer/name-generator.js +283 -0
- package/dist/api/compiler/printer/printer.d.ts +411 -0
- package/dist/api/compiler/printer/printer.js +4517 -0
- package/dist/api/compiler/printer/text-writer.d.ts +46 -0
- package/dist/api/compiler/printer/text-writer.js +172 -0
- package/dist/api/compiler/printer/utilities.d.ts +82 -0
- package/dist/api/compiler/printer/utilities.js +817 -0
- package/dist/api/compiler/program-checker.d.ts +156 -0
- package/dist/api/compiler/program-checker.js +526 -0
- package/dist/api/compiler/program-utilities.d.ts +52 -0
- package/dist/api/compiler/program-utilities.js +365 -0
- package/dist/api/compiler/program.d.ts +180 -0
- package/dist/api/compiler/program.js +1011 -0
- package/dist/api/compiler/pseudo-bigint.d.ts +5 -0
- package/dist/api/compiler/pseudo-bigint.js +61 -0
- package/dist/api/compiler/regexp-checker.d.ts +38 -0
- package/dist/api/compiler/regexp-checker.js +942 -0
- package/dist/api/compiler/relations.d.ts +263 -0
- package/dist/api/compiler/relations.js +4002 -0
- package/dist/api/compiler/reparser.d.ts +48 -0
- package/dist/api/compiler/reparser.js +1323 -0
- package/dist/api/compiler/scanner.d.ts +256 -0
- package/dist/api/compiler/scanner.js +2853 -0
- package/dist/api/compiler/side-state.d.ts +16 -0
- package/dist/api/compiler/side-state.js +89 -0
- package/dist/api/compiler/sourcemap.d.ts +55 -0
- package/dist/api/compiler/sourcemap.js +340 -0
- package/dist/api/compiler/spelling.d.ts +14 -0
- package/dist/api/compiler/spelling.js +128 -0
- package/dist/api/compiler/symbol-accessibility.d.ts +57 -0
- package/dist/api/compiler/symbol-accessibility.js +894 -0
- package/dist/api/compiler/symbol.d.ts +240 -0
- package/dist/api/compiler/symbol.js +228 -0
- package/dist/api/compiler/symlinks.d.ts +32 -0
- package/dist/api/compiler/symlinks.js +114 -0
- package/dist/api/compiler/syntax-kind.d.ts +389 -0
- package/dist/api/compiler/syntax-kind.js +2 -0
- package/dist/api/compiler/timeline.d.ts +9 -0
- package/dist/api/compiler/timeline.js +54 -0
- package/dist/api/compiler/transformers/alias-references.d.ts +39 -0
- package/dist/api/compiler/transformers/alias-references.js +676 -0
- package/dist/api/compiler/transformers/async-utilities.d.ts +51 -0
- package/dist/api/compiler/transformers/async-utilities.js +260 -0
- package/dist/api/compiler/transformers/async.d.ts +53 -0
- package/dist/api/compiler/transformers/async.js +645 -0
- package/dist/api/compiler/transformers/class-fields.d.ts +206 -0
- package/dist/api/compiler/transformers/class-fields.js +2418 -0
- package/dist/api/compiler/transformers/class-utilities.d.ts +46 -0
- package/dist/api/compiler/transformers/class-utilities.js +261 -0
- package/dist/api/compiler/transformers/commonjs-module.d.ts +103 -0
- package/dist/api/compiler/transformers/commonjs-module.js +1180 -0
- package/dist/api/compiler/transformers/const-enum-inliner.d.ts +11 -0
- package/dist/api/compiler/transformers/const-enum-inliner.js +36 -0
- package/dist/api/compiler/transformers/declarations-diagnostics.d.ts +52 -0
- package/dist/api/compiler/transformers/declarations-diagnostics.js +538 -0
- package/dist/api/compiler/transformers/declarations-pseudo.d.ts +160 -0
- package/dist/api/compiler/transformers/declarations-pseudo.js +797 -0
- package/dist/api/compiler/transformers/declarations-resolver.d.ts +152 -0
- package/dist/api/compiler/transformers/declarations-resolver.js +35 -0
- package/dist/api/compiler/transformers/declarations-syntactic.d.ts +119 -0
- package/dist/api/compiler/transformers/declarations-syntactic.js +1582 -0
- package/dist/api/compiler/transformers/declarations-tracker.d.ts +46 -0
- package/dist/api/compiler/transformers/declarations-tracker.js +197 -0
- package/dist/api/compiler/transformers/declarations.d.ts +175 -0
- package/dist/api/compiler/transformers/declarations.js +2380 -0
- package/dist/api/compiler/transformers/decorator-metadata.d.ts +54 -0
- package/dist/api/compiler/transformers/decorator-metadata.js +554 -0
- package/dist/api/compiler/transformers/decorator-utilities.d.ts +38 -0
- package/dist/api/compiler/transformers/decorator-utilities.js +238 -0
- package/dist/api/compiler/transformers/destructuring.d.ts +25 -0
- package/dist/api/compiler/transformers/destructuring.js +626 -0
- package/dist/api/compiler/transformers/downlevel.d.ts +6 -0
- package/dist/api/compiler/transformers/downlevel.js +45 -0
- package/dist/api/compiler/transformers/emit-resolver.d.ts +61 -0
- package/dist/api/compiler/transformers/emit-resolver.js +197 -0
- package/dist/api/compiler/transformers/es-decorators.d.ts +118 -0
- package/dist/api/compiler/transformers/es-decorators.js +1901 -0
- package/dist/api/compiler/transformers/exponentiation.d.ts +11 -0
- package/dist/api/compiler/transformers/exponentiation.js +76 -0
- package/dist/api/compiler/transformers/external-module-info.d.ts +35 -0
- package/dist/api/compiler/transformers/external-module-info.js +351 -0
- package/dist/api/compiler/transformers/for-await.d.ts +43 -0
- package/dist/api/compiler/transformers/for-await.js +469 -0
- package/dist/api/compiler/transformers/import-elision.d.ts +16 -0
- package/dist/api/compiler/transformers/import-elision.js +124 -0
- package/dist/api/compiler/transformers/jsx-entities.d.ts +1 -0
- package/dist/api/compiler/transformers/jsx-entities.js +256 -0
- package/dist/api/compiler/transformers/jsx.d.ts +71 -0
- package/dist/api/compiler/transformers/jsx.js +700 -0
- package/dist/api/compiler/transformers/legacy-decorators.d.ts +56 -0
- package/dist/api/compiler/transformers/legacy-decorators.js +564 -0
- package/dist/api/compiler/transformers/logical-assignment.d.ts +14 -0
- package/dist/api/compiler/transformers/logical-assignment.js +62 -0
- package/dist/api/compiler/transformers/module-utilities.d.ts +9 -0
- package/dist/api/compiler/transformers/module-utilities.js +36 -0
- package/dist/api/compiler/transformers/module.d.ts +49 -0
- package/dist/api/compiler/transformers/module.js +296 -0
- package/dist/api/compiler/transformers/named-evaluation.d.ts +26 -0
- package/dist/api/compiler/transformers/named-evaluation.js +266 -0
- package/dist/api/compiler/transformers/nullish-coalescing.d.ts +9 -0
- package/dist/api/compiler/transformers/nullish-coalescing.js +26 -0
- package/dist/api/compiler/transformers/object-rest-spread.d.ts +34 -0
- package/dist/api/compiler/transformers/object-rest-spread.js +411 -0
- package/dist/api/compiler/transformers/optional-catch.d.ts +9 -0
- package/dist/api/compiler/transformers/optional-catch.js +20 -0
- package/dist/api/compiler/transformers/optional-chain.d.ts +14 -0
- package/dist/api/compiler/transformers/optional-chain.js +188 -0
- package/dist/api/compiler/transformers/reference-resolver.d.ts +128 -0
- package/dist/api/compiler/transformers/reference-resolver.js +1155 -0
- package/dist/api/compiler/transformers/runtime-syntax.d.ts +71 -0
- package/dist/api/compiler/transformers/runtime-syntax.js +753 -0
- package/dist/api/compiler/transformers/subtree-facts.d.ts +9 -0
- package/dist/api/compiler/transformers/subtree-facts.js +203 -0
- package/dist/api/compiler/transformers/syntax-facts.d.ts +51 -0
- package/dist/api/compiler/transformers/syntax-facts.js +254 -0
- package/dist/api/compiler/transformers/tagged-template.d.ts +17 -0
- package/dist/api/compiler/transformers/tagged-template.js +148 -0
- package/dist/api/compiler/transformers/transformer.d.ts +17 -0
- package/dist/api/compiler/transformers/transformer.js +54 -0
- package/dist/api/compiler/transformers/type-eraser.d.ts +21 -0
- package/dist/api/compiler/transformers/type-eraser.js +346 -0
- package/dist/api/compiler/transformers/type-serialization.d.ts +20 -0
- package/dist/api/compiler/transformers/type-serialization.js +347 -0
- package/dist/api/compiler/transformers/using.d.ts +56 -0
- package/dist/api/compiler/transformers/using.js +453 -0
- package/dist/api/compiler/transformers/utilities.d.ts +50 -0
- package/dist/api/compiler/transformers/utilities.js +347 -0
- package/dist/api/compiler/transformers/visitor-base.d.ts +6 -0
- package/dist/api/compiler/transformers/visitor-base.js +817 -0
- package/dist/api/compiler/transformers/visitor-hooks.d.ts +29 -0
- package/dist/api/compiler/transformers/visitor-hooks.js +189 -0
- package/dist/api/compiler/tsconfig.d.ts +177 -0
- package/dist/api/compiler/tsconfig.js +1311 -0
- package/dist/api/compiler/type-printer.d.ts +15 -0
- package/dist/api/compiler/type-printer.js +74 -0
- package/dist/api/compiler/types.d.ts +87 -0
- package/dist/api/compiler/types.js +23 -0
- package/dist/api/compiler/unicode-identifiers.d.ts +2 -0
- package/dist/api/compiler/unicode-identifiers.js +209 -0
- package/dist/api/compiler/unicode-properties.d.ts +8 -0
- package/dist/api/compiler/unicode-properties.js +531 -0
- package/dist/api/compiler/vfs-match.d.ts +24 -0
- package/dist/api/compiler/vfs-match.js +587 -0
- package/dist/api/library/ast.d.ts +74 -0
- package/dist/api/library/ast.generated.d.ts +1145 -0
- package/dist/api/library/ast.generated.js +3 -0
- package/dist/api/library/ast.js +5 -0
- package/dist/api/library/checker.d.ts +51 -0
- package/dist/api/library/checker.js +318 -0
- package/dist/api/library/compiler-options.generated.d.ts +108 -0
- package/dist/api/library/compiler-options.generated.js +3 -0
- package/dist/api/library/diagnostics.d.ts +13 -0
- package/dist/api/library/diagnostics.js +50 -0
- package/dist/api/library/disk.d.ts +13 -0
- package/dist/api/library/disk.js +66 -0
- package/dist/api/library/enums.generated.d.ts +891 -0
- package/dist/api/library/enums.generated.js +916 -0
- package/dist/api/library/errors.d.ts +13 -0
- package/dist/api/library/errors.js +24 -0
- package/dist/api/library/host.d.ts +24 -0
- package/dist/api/library/host.js +52 -0
- package/dist/api/library/index.d.ts +14 -0
- package/dist/api/library/index.js +15 -0
- package/dist/api/library/nodes.d.ts +51 -0
- package/dist/api/library/nodes.js +196 -0
- package/dist/api/library/options.d.ts +144 -0
- package/dist/api/library/options.js +308 -0
- package/dist/api/library/parse.d.ts +19 -0
- package/dist/api/library/parse.js +41 -0
- package/dist/api/library/program.d.ts +21 -0
- package/dist/api/library/program.js +234 -0
- package/dist/api/library/symbols.d.ts +8 -0
- package/dist/api/library/symbols.js +11 -0
- package/dist/api/library/types.d.ts +313 -0
- package/dist/api/library/types.js +6 -0
- package/package.json +22 -8
- package/src/compiler/ast-utilities.ts +548 -0
- package/src/compiler/ast.ts +12862 -0
- package/src/compiler/astnav.ts +799 -0
- package/src/compiler/binder-utilities.ts +1392 -0
- package/src/compiler/binder.ts +2703 -0
- package/src/compiler/build-info.ts +1197 -0
- package/src/compiler/character-codes.ts +323 -0
- package/src/compiler/checker-calls.ts +2155 -0
- package/src/compiler/checker-classes.ts +706 -0
- package/src/compiler/checker-contextual.ts +1457 -0
- package/src/compiler/checker-declaration-order.ts +438 -0
- package/src/compiler/checker-declarations.ts +1194 -0
- package/src/compiler/checker-declared-types.ts +919 -0
- package/src/compiler/checker-decorators.ts +694 -0
- package/src/compiler/checker-deprecation.ts +359 -0
- package/src/compiler/checker-destructuring.ts +805 -0
- package/src/compiler/checker-elaboration.ts +477 -0
- package/src/compiler/checker-emit-helpers.ts +224 -0
- package/src/compiler/checker-emit-resolver.ts +769 -0
- package/src/compiler/checker-evaluator.ts +243 -0
- package/src/compiler/checker-expressions.ts +1831 -0
- package/src/compiler/checker-features.ts +361 -0
- package/src/compiler/checker-flow.ts +394 -0
- package/src/compiler/checker-functions.ts +1296 -0
- package/src/compiler/checker-generated-code.ts +227 -0
- package/src/compiler/checker-globals.ts +52 -0
- package/src/compiler/checker-grammar.ts +3584 -0
- package/src/compiler/checker-heritage.ts +1233 -0
- package/src/compiler/checker-inference.ts +2576 -0
- package/src/compiler/checker-iteration.ts +1206 -0
- package/src/compiler/checker-javascript.ts +502 -0
- package/src/compiler/checker-jsdoc.ts +360 -0
- package/src/compiler/checker-jsx.ts +1924 -0
- package/src/compiler/checker-literals.ts +61 -0
- package/src/compiler/checker-members.ts +2436 -0
- package/src/compiler/checker-modules.ts +2886 -0
- package/src/compiler/checker-narrowing.ts +3230 -0
- package/src/compiler/checker-object-literals.ts +575 -0
- package/src/compiler/checker-operators.ts +1422 -0
- package/src/compiler/checker-overloads.ts +328 -0
- package/src/compiler/checker-property-access.ts +906 -0
- package/src/compiler/checker-services.ts +1149 -0
- package/src/compiler/checker-signatures.ts +1032 -0
- package/src/compiler/checker-source-file.ts +732 -0
- package/src/compiler/checker-statements.ts +292 -0
- package/src/compiler/checker-super.ts +261 -0
- package/src/compiler/checker-symbol-types.ts +2107 -0
- package/src/compiler/checker-symbols.ts +2150 -0
- package/src/compiler/checker-type-factory.ts +2579 -0
- package/src/compiler/checker-type-nodes.ts +1033 -0
- package/src/compiler/checker-type-operators.ts +2502 -0
- package/src/compiler/checker-types.ts +2340 -0
- package/src/compiler/checker-unused.ts +642 -0
- package/src/compiler/checker-utilities.ts +161 -0
- package/src/compiler/checker.ts +1116 -0
- package/src/compiler/command-line.ts +436 -0
- package/src/compiler/compile-program.ts +439 -0
- package/src/compiler/decoder.ts +1209 -0
- package/src/compiler/diagnostic-locales.ts +86 -0
- package/src/compiler/diagnostic-messages.ts +2349 -0
- package/src/compiler/diagnostics.ts +897 -0
- package/src/compiler/emitter.ts +434 -0
- package/src/compiler/encoder.ts +1945 -0
- package/src/compiler/file-include.ts +673 -0
- package/src/compiler/file-loader.ts +1528 -0
- package/src/compiler/file-system.ts +143 -0
- package/src/compiler/flow.ts +89 -0
- package/src/compiler/help.ts +473 -0
- package/src/compiler/incremental.ts +2784 -0
- package/src/compiler/init.ts +141 -0
- package/src/compiler/instantiation.ts +894 -0
- package/src/compiler/jsdoc.ts +1386 -0
- package/src/compiler/link-tables.ts +98 -0
- package/src/compiler/locale-data.ts +203 -0
- package/src/compiler/locale.ts +307 -0
- package/src/compiler/locales/cs-CZ.ts +5 -0
- package/src/compiler/locales/de-DE.ts +5 -0
- package/src/compiler/locales/es-ES.ts +5 -0
- package/src/compiler/locales/fr-FR.ts +5 -0
- package/src/compiler/locales/it-IT.ts +5 -0
- package/src/compiler/locales/ja-JP.ts +5 -0
- package/src/compiler/locales/ko-KR.ts +5 -0
- package/src/compiler/locales/pl-PL.ts +5 -0
- package/src/compiler/locales/pt-BR.ts +5 -0
- package/src/compiler/locales/ru-RU.ts +5 -0
- package/src/compiler/locales/tr-TR.ts +5 -0
- package/src/compiler/locales/zh-CN.ts +5 -0
- package/src/compiler/locales/zh-TW.ts +5 -0
- package/src/compiler/module-resolution-types.ts +243 -0
- package/src/compiler/module-resolution.ts +2072 -0
- package/src/compiler/module-specifiers.ts +1491 -0
- package/src/compiler/name-resolver.ts +646 -0
- package/src/compiler/node-builder-names.ts +1069 -0
- package/src/compiler/node-builder-pseudo.ts +892 -0
- package/src/compiler/node-builder-reuse.ts +764 -0
- package/src/compiler/node-builder.ts +3425 -0
- package/src/compiler/option-declarations.ts +1560 -0
- package/src/compiler/options.ts +1576 -0
- package/src/compiler/output-paths.ts +334 -0
- package/src/compiler/package-json.ts +1083 -0
- package/src/compiler/parallel-check.ts +1951 -0
- package/src/compiler/parallel-parse.ts +590 -0
- package/src/compiler/parse-thread.ts +140 -0
- package/src/compiler/parser.ts +7716 -0
- package/src/compiler/path.ts +717 -0
- package/src/compiler/printer/async-helpers.ts +183 -0
- package/src/compiler/printer/auto-generate.ts +27 -0
- package/src/compiler/printer/decorator-helpers.ts +218 -0
- package/src/compiler/printer/emit-context.ts +679 -0
- package/src/compiler/printer/emit-flags.ts +64 -0
- package/src/compiler/printer/factory-base.ts +2577 -0
- package/src/compiler/printer/factory.ts +764 -0
- package/src/compiler/printer/helpers.ts +291 -0
- package/src/compiler/printer/name-generator.ts +372 -0
- package/src/compiler/printer/printer.ts +5072 -0
- package/src/compiler/printer/text-writer.ts +183 -0
- package/src/compiler/printer/utilities.ts +884 -0
- package/src/compiler/program-checker.ts +592 -0
- package/src/compiler/program-utilities.ts +435 -0
- package/src/compiler/program.ts +1419 -0
- package/src/compiler/pseudo-bigint.ts +62 -0
- package/src/compiler/regexp-checker.ts +1142 -0
- package/src/compiler/relations.ts +5149 -0
- package/src/compiler/reparser.ts +1566 -0
- package/src/compiler/scanner.ts +2951 -0
- package/src/compiler/show-config.ts +239 -0
- package/src/compiler/side-state.ts +125 -0
- package/src/compiler/sourcemap.ts +366 -0
- package/src/compiler/spelling.ts +122 -0
- package/src/compiler/symbol-accessibility.ts +1071 -0
- package/src/compiler/symbol.ts +439 -0
- package/src/compiler/symlinks.ts +137 -0
- package/src/compiler/syntax-kind.ts +391 -0
- package/src/compiler/thread-entry.ts +191 -0
- package/src/compiler/timeline.ts +53 -0
- package/src/compiler/transformers/alias-references.ts +757 -0
- package/src/compiler/transformers/async-utilities.ts +335 -0
- package/src/compiler/transformers/async.ts +838 -0
- package/src/compiler/transformers/class-fields.ts +2967 -0
- package/src/compiler/transformers/class-utilities.ts +324 -0
- package/src/compiler/transformers/commonjs-module.ts +1621 -0
- package/src/compiler/transformers/const-enum-inliner.ts +50 -0
- package/src/compiler/transformers/declarations-diagnostics.ts +832 -0
- package/src/compiler/transformers/declarations-pseudo.ts +966 -0
- package/src/compiler/transformers/declarations-resolver.ts +249 -0
- package/src/compiler/transformers/declarations-syntactic.ts +1859 -0
- package/src/compiler/transformers/declarations-tracker.ts +269 -0
- package/src/compiler/transformers/declarations.ts +3120 -0
- package/src/compiler/transformers/decorator-metadata.ts +697 -0
- package/src/compiler/transformers/decorator-utilities.ts +283 -0
- package/src/compiler/transformers/destructuring.ts +708 -0
- package/src/compiler/transformers/downlevel.ts +50 -0
- package/src/compiler/transformers/emit-resolver.ts +258 -0
- package/src/compiler/transformers/es-decorators.ts +2682 -0
- package/src/compiler/transformers/exponentiation.ts +80 -0
- package/src/compiler/transformers/external-module-info.ts +412 -0
- package/src/compiler/transformers/for-await.ts +687 -0
- package/src/compiler/transformers/import-elision.ts +152 -0
- package/src/compiler/transformers/jsx-entities.ts +256 -0
- package/src/compiler/transformers/jsx.ts +824 -0
- package/src/compiler/transformers/legacy-decorators.ts +726 -0
- package/src/compiler/transformers/logical-assignment.ts +75 -0
- package/src/compiler/transformers/module-utilities.ts +42 -0
- package/src/compiler/transformers/module.ts +474 -0
- package/src/compiler/transformers/named-evaluation.ts +389 -0
- package/src/compiler/transformers/nullish-coalescing.ts +35 -0
- package/src/compiler/transformers/object-rest-spread.ts +577 -0
- package/src/compiler/transformers/optional-catch.ts +29 -0
- package/src/compiler/transformers/optional-chain.ts +246 -0
- package/src/compiler/transformers/reference-resolver.ts +1201 -0
- package/src/compiler/transformers/runtime-syntax.ts +942 -0
- package/src/compiler/transformers/subtree-facts.ts +245 -0
- package/src/compiler/transformers/syntax-facts.ts +353 -0
- package/src/compiler/transformers/tagged-template.ts +167 -0
- package/src/compiler/transformers/transformer.ts +56 -0
- package/src/compiler/transformers/type-eraser.ts +520 -0
- package/src/compiler/transformers/type-serialization.ts +374 -0
- package/src/compiler/transformers/using.ts +613 -0
- package/src/compiler/transformers/utilities.ts +419 -0
- package/src/compiler/transformers/visitor-base.ts +1601 -0
- package/src/compiler/transformers/visitor-hooks.ts +252 -0
- package/src/compiler/tsc-build.ts +1418 -0
- package/src/compiler/tsc-cli.ts +666 -0
- package/src/compiler/tsc-compile.ts +437 -0
- package/src/compiler/tsc-watch.ts +854 -0
- package/src/compiler/tsconfig.ts +1574 -0
- package/src/compiler/type-printer.ts +110 -0
- package/src/compiler/types.ts +115 -0
- package/src/compiler/unicode-identifiers.ts +212 -0
- package/src/compiler/unicode-properties.ts +537 -0
- package/src/compiler/vfs-match.ts +597 -0
- package/src/compiler/xxh3.ts +650 -0
- package/src/library/ast.generated.ts +1685 -0
- package/src/library/ast.ts +104 -0
- package/src/library/checker.ts +384 -0
- package/src/library/compiler-options.generated.ts +114 -0
- package/src/library/diagnostics.ts +72 -0
- package/src/library/disk.ts +73 -0
- package/src/library/enums.generated.ts +1024 -0
- package/src/library/errors.ts +26 -0
- package/src/library/host.ts +63 -0
- package/src/library/index.ts +71 -0
- package/src/library/nodes.ts +232 -0
- package/src/library/options.ts +449 -0
- package/src/library/parse.ts +63 -0
- package/src/library/program.ts +293 -0
- package/src/library/symbols.ts +15 -0
- package/src/library/types.ts +359 -0
|
@@ -0,0 +1,1033 @@
|
|
|
1
|
+
// Types from type nodes: `getTypeFromTypeNode` and the resolution of type references.
|
|
2
|
+
import {
|
|
3
|
+
type ArrayTypeNode,
|
|
4
|
+
ModifierFlags,
|
|
5
|
+
type ExpressionWithTypeArguments,
|
|
6
|
+
type IndexedAccessTypeNode,
|
|
7
|
+
type InferTypeNode,
|
|
8
|
+
type IntersectionTypeNode,
|
|
9
|
+
type LiteralTypeNode,
|
|
10
|
+
type NamedTupleMember,
|
|
11
|
+
type Node,
|
|
12
|
+
NodeFlags,
|
|
13
|
+
type OptionalTypeNode,
|
|
14
|
+
type QualifiedName,
|
|
15
|
+
type RestTypeNode,
|
|
16
|
+
type TemplateLiteralTypeNode,
|
|
17
|
+
type TemplateLiteralTypeSpan,
|
|
18
|
+
type TupleTypeNode,
|
|
19
|
+
type TypeOperatorNode,
|
|
20
|
+
type TypeReferenceNode,
|
|
21
|
+
type UnionTypeNode,
|
|
22
|
+
getExpression,
|
|
23
|
+
getName,
|
|
24
|
+
getText,
|
|
25
|
+
getType,
|
|
26
|
+
getSymbol,
|
|
27
|
+
type ConditionalTypeNode,
|
|
28
|
+
type MappedTypeNode,
|
|
29
|
+
TypePredicateNode,
|
|
30
|
+
getBody,
|
|
31
|
+
getTypeArguments,
|
|
32
|
+
} from './ast.js';
|
|
33
|
+
import {
|
|
34
|
+
declarationNameToString,
|
|
35
|
+
getSourceFileOfNode,
|
|
36
|
+
getThisContainer,
|
|
37
|
+
isClassLike,
|
|
38
|
+
isStatic,
|
|
39
|
+
isDeclarationStatementKind,
|
|
40
|
+
} from './binder-utilities.js';
|
|
41
|
+
import { Diagnostics } from './diagnostics.js';
|
|
42
|
+
import { CheckFlags, type Symbol, SymbolFlags, getSymbolId } from './symbol.js';
|
|
43
|
+
import { SyntaxKind } from './syntax-kind.js';
|
|
44
|
+
import type { Checker } from './checker.js';
|
|
45
|
+
import {
|
|
46
|
+
ElementFlags,
|
|
47
|
+
type InterfaceType,
|
|
48
|
+
type MappedType,
|
|
49
|
+
ObjectFlags,
|
|
50
|
+
TupleElementInfo,
|
|
51
|
+
type TupleType,
|
|
52
|
+
type Type,
|
|
53
|
+
TypeAlias,
|
|
54
|
+
TypeFlags,
|
|
55
|
+
UniqueESSymbolType,
|
|
56
|
+
emptyTypes,
|
|
57
|
+
newTypeMapper,
|
|
58
|
+
} from './checker-types.js';
|
|
59
|
+
import {
|
|
60
|
+
createArrayType,
|
|
61
|
+
IntersectionFlags,
|
|
62
|
+
UnionReduction,
|
|
63
|
+
aliasKey,
|
|
64
|
+
createDeferredTypeReference,
|
|
65
|
+
createNormalizedTupleType,
|
|
66
|
+
createTypeReferenceEx,
|
|
67
|
+
getIntersectionTypeEx,
|
|
68
|
+
getRegularTypeOfLiteralType,
|
|
69
|
+
getTemplateLiteralType,
|
|
70
|
+
getTupleTargetType,
|
|
71
|
+
getUnionTypeEx,
|
|
72
|
+
getIntersectionType,
|
|
73
|
+
everyType,
|
|
74
|
+
isArrayOrTupleType,
|
|
75
|
+
isPatternLiteralType,
|
|
76
|
+
newObjectType,
|
|
77
|
+
typeListKey,
|
|
78
|
+
} from './checker-type-factory.js';
|
|
79
|
+
import {
|
|
80
|
+
getMembersOfSymbol,
|
|
81
|
+
getMergedSymbol,
|
|
82
|
+
getSymbolOfDeclaration,
|
|
83
|
+
resolveAlias,
|
|
84
|
+
resolveEntityName,
|
|
85
|
+
} from './checker-symbols.js';
|
|
86
|
+
import { getTypeFromImportTypeNode } from './checker-modules.js';
|
|
87
|
+
import {
|
|
88
|
+
fillMissingTypeArguments,
|
|
89
|
+
getDeclaredTypeOfClassOrInterface,
|
|
90
|
+
getDeclaredTypeOfSymbol,
|
|
91
|
+
getDeclaredTypeOfTypeParameter,
|
|
92
|
+
getConstraintOfTypeParameter,
|
|
93
|
+
getLocalTypeParametersOfClassOrInterfaceOrTypeAlias,
|
|
94
|
+
getMinTypeArgumentCount,
|
|
95
|
+
tryGetDeclaredTypeOfSymbol,
|
|
96
|
+
} from './checker-declared-types.js';
|
|
97
|
+
import { addOptionality, getNullableType, getWidenedType } from './checker-symbol-types.js';
|
|
98
|
+
import { instantiateTypeWithAlias } from './instantiation.js';
|
|
99
|
+
import { symbolToString, typeToString } from './type-printer.js';
|
|
100
|
+
import {
|
|
101
|
+
getIndexType,
|
|
102
|
+
getIndexedAccessTypeEx,
|
|
103
|
+
getNoInferType,
|
|
104
|
+
getStringMappingType,
|
|
105
|
+
getTypeFromConditionalTypeNode,
|
|
106
|
+
getTypeFromMappedTypeNode,
|
|
107
|
+
intrinsicTypeKind,
|
|
108
|
+
IntrinsicTypeKind,
|
|
109
|
+
getSubstitutionType,
|
|
110
|
+
getActualTypeVariable,
|
|
111
|
+
getHomomorphicTypeVariable,
|
|
112
|
+
getTypeParameterFromMappedType,
|
|
113
|
+
} from './checker-type-operators.js';
|
|
114
|
+
import { checkExpression, checkExpressionCached, getResolvedSymbol } from './checker-expressions.js';
|
|
115
|
+
import { checkExpressionWithTypeArguments } from './checker-calls.js';
|
|
116
|
+
import { getIntendedTypeFromJSDocTypeReference } from './checker-jsdoc.js';
|
|
117
|
+
import { getCombinedNodeFlags, hasSyntacticModifier } from './binder-utilities.js';
|
|
118
|
+
|
|
119
|
+
export function getTypeFromTypeNode(c: Checker, node: Node): Type {
|
|
120
|
+
return getConditionalFlowTypeOfType(c, getTypeFromTypeNodeWorker(c, node), node);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* `t` with the constraints implied by enclosing conditional types, as a substitution type: in
|
|
125
|
+
* `T extends string ? X : Y`, references to T in X are known to be strings.
|
|
126
|
+
*/
|
|
127
|
+
function getConditionalFlowTypeOfType(c: Checker, t: Type, start: Node): Type {
|
|
128
|
+
let constraints: Type[] | undefined;
|
|
129
|
+
let covariant = true;
|
|
130
|
+
for (let node: Node | undefined = start; node !== undefined && !isStatementLike(node); node = node.parent) {
|
|
131
|
+
const parent: Node | undefined = node.parent;
|
|
132
|
+
if (parent === undefined) break;
|
|
133
|
+
// Only parameter positions flip variance; `keyof` is mostly used invariantly in indexed accesses.
|
|
134
|
+
if (parent.kind === SyntaxKind.Parameter) covariant = !covariant;
|
|
135
|
+
// Type variables always substitute, as even contravariant positions may rely on their constraints.
|
|
136
|
+
if (
|
|
137
|
+
(covariant || (t.flags & TypeFlags.TypeVariable) !== 0) &&
|
|
138
|
+
parent.kind === SyntaxKind.ConditionalType &&
|
|
139
|
+
node === (parent as ConditionalTypeNode).trueType
|
|
140
|
+
) {
|
|
141
|
+
const conditional = parent as ConditionalTypeNode;
|
|
142
|
+
const constraint = getImpliedConstraint(c, t, conditional.checkType, conditional.extendsType);
|
|
143
|
+
if (constraint !== undefined) (constraints ??= []).push(constraint);
|
|
144
|
+
} else if (
|
|
145
|
+
(t.flags & TypeFlags.TypeParameter) !== 0 &&
|
|
146
|
+
parent.kind === SyntaxKind.MappedType &&
|
|
147
|
+
(parent as MappedTypeNode).nameType === undefined &&
|
|
148
|
+
node === (parent as MappedTypeNode).type
|
|
149
|
+
) {
|
|
150
|
+
// Homomorphic mapped types over arrays and tuples map numeric keys only.
|
|
151
|
+
const mappedType = getTypeFromTypeNode(c, parent) as MappedType;
|
|
152
|
+
if (getTypeParameterFromMappedType(c, mappedType) === getActualTypeVariable(c, t)) {
|
|
153
|
+
const typeParameter = getHomomorphicTypeVariable(c, mappedType);
|
|
154
|
+
if (typeParameter !== undefined) {
|
|
155
|
+
const constraint = getConstraintOfTypeParameter(c, typeParameter);
|
|
156
|
+
if (constraint !== undefined && everyType(constraint, (u) => isArrayOrTupleType(c, u)))
|
|
157
|
+
(constraints ??= []).push(
|
|
158
|
+
getUnionTypeEx(c, [c.numberType, c.numericStringType], UnionReduction.Literal, undefined, undefined),
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return constraints !== undefined ? getSubstitutionType(c, t, getIntersectionType(c, constraints)) : t;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function getImpliedConstraint(c: Checker, t: Type, checkNode: Node, extendsNode: Node): Type | undefined {
|
|
168
|
+
if (isUnaryTupleTypeNode(checkNode) && isUnaryTupleTypeNode(extendsNode))
|
|
169
|
+
return getImpliedConstraint(
|
|
170
|
+
c,
|
|
171
|
+
t,
|
|
172
|
+
(checkNode as TupleTypeNode).elements.nodes[0]!,
|
|
173
|
+
(extendsNode as TupleTypeNode).elements.nodes[0]!,
|
|
174
|
+
);
|
|
175
|
+
if (getActualTypeVariable(c, getTypeFromTypeNode(c, checkNode)) === getActualTypeVariable(c, t))
|
|
176
|
+
return getTypeFromTypeNode(c, extendsNode);
|
|
177
|
+
return undefined;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function isUnaryTupleTypeNode(node: Node): boolean {
|
|
181
|
+
return node.kind === SyntaxKind.TupleType && (node as TupleTypeNode).elements.nodes.length === 1;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/** A statement, declaration statement or block, which ends the search for enclosing conditional types. */
|
|
185
|
+
function isStatementLike(node: Node): boolean {
|
|
186
|
+
switch (node.kind) {
|
|
187
|
+
case SyntaxKind.Block:
|
|
188
|
+
case SyntaxKind.BreakStatement:
|
|
189
|
+
case SyntaxKind.ContinueStatement:
|
|
190
|
+
case SyntaxKind.DebuggerStatement:
|
|
191
|
+
case SyntaxKind.DoStatement:
|
|
192
|
+
case SyntaxKind.ExpressionStatement:
|
|
193
|
+
case SyntaxKind.EmptyStatement:
|
|
194
|
+
case SyntaxKind.ForInStatement:
|
|
195
|
+
case SyntaxKind.ForOfStatement:
|
|
196
|
+
case SyntaxKind.ForStatement:
|
|
197
|
+
case SyntaxKind.IfStatement:
|
|
198
|
+
case SyntaxKind.LabeledStatement:
|
|
199
|
+
case SyntaxKind.ReturnStatement:
|
|
200
|
+
case SyntaxKind.SwitchStatement:
|
|
201
|
+
case SyntaxKind.ThrowStatement:
|
|
202
|
+
case SyntaxKind.TryStatement:
|
|
203
|
+
case SyntaxKind.VariableStatement:
|
|
204
|
+
case SyntaxKind.WhileStatement:
|
|
205
|
+
case SyntaxKind.WithStatement:
|
|
206
|
+
case SyntaxKind.NotEmittedStatement:
|
|
207
|
+
case SyntaxKind.JSDoc:
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
return isDeclarationStatementKind(node.kind);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function getTypeFromTypeNodeWorker(c: Checker, node: Node): Type {
|
|
214
|
+
switch (node.kind) {
|
|
215
|
+
case SyntaxKind.AnyKeyword:
|
|
216
|
+
case SyntaxKind.JSDocAllType:
|
|
217
|
+
return c.anyType;
|
|
218
|
+
case SyntaxKind.JSDocNonNullableType:
|
|
219
|
+
return getTypeFromTypeNode(c, getType(node)!);
|
|
220
|
+
case SyntaxKind.JSDocNullableType: {
|
|
221
|
+
const t = getTypeFromTypeNode(c, getType(node)!);
|
|
222
|
+
return c.strictNullChecks ? getNullableType(c, t, TypeFlags.Null) : t;
|
|
223
|
+
}
|
|
224
|
+
case SyntaxKind.JSDocVariadicType:
|
|
225
|
+
return createArrayType(c, getTypeFromTypeNode(c, getType(node)!));
|
|
226
|
+
case SyntaxKind.JSDocOptionalType:
|
|
227
|
+
return addOptionality(c, getTypeFromTypeNode(c, getType(node)!), false, true);
|
|
228
|
+
case SyntaxKind.UnknownKeyword:
|
|
229
|
+
return c.unknownType;
|
|
230
|
+
case SyntaxKind.StringKeyword:
|
|
231
|
+
return c.stringType;
|
|
232
|
+
case SyntaxKind.NumberKeyword:
|
|
233
|
+
return c.numberType;
|
|
234
|
+
case SyntaxKind.BigIntKeyword:
|
|
235
|
+
return c.bigintType;
|
|
236
|
+
case SyntaxKind.BooleanKeyword:
|
|
237
|
+
return c.booleanType;
|
|
238
|
+
case SyntaxKind.SymbolKeyword:
|
|
239
|
+
return c.esSymbolType;
|
|
240
|
+
case SyntaxKind.VoidKeyword:
|
|
241
|
+
return c.voidType;
|
|
242
|
+
case SyntaxKind.UndefinedKeyword:
|
|
243
|
+
return c.undefinedType;
|
|
244
|
+
case SyntaxKind.NullKeyword:
|
|
245
|
+
return c.nullType;
|
|
246
|
+
case SyntaxKind.NeverKeyword:
|
|
247
|
+
return c.neverType;
|
|
248
|
+
case SyntaxKind.ObjectKeyword:
|
|
249
|
+
return c.nonPrimitiveType;
|
|
250
|
+
case SyntaxKind.IntrinsicKeyword:
|
|
251
|
+
return c.intrinsicMarkerType;
|
|
252
|
+
case SyntaxKind.ThisType:
|
|
253
|
+
case SyntaxKind.ThisKeyword:
|
|
254
|
+
return getTypeFromThisTypeNode(c, node);
|
|
255
|
+
case SyntaxKind.LiteralType:
|
|
256
|
+
return getTypeFromLiteralTypeNode(c, node as LiteralTypeNode);
|
|
257
|
+
case SyntaxKind.TypeReference:
|
|
258
|
+
case SyntaxKind.ExpressionWithTypeArguments:
|
|
259
|
+
return getTypeFromTypeReference(c, node);
|
|
260
|
+
case SyntaxKind.TypePredicate:
|
|
261
|
+
return (node as TypePredicateNode).assertsModifier !== undefined ? c.voidType : c.booleanType;
|
|
262
|
+
case SyntaxKind.TypeQuery:
|
|
263
|
+
return getTypeFromTypeQueryNode(c, node);
|
|
264
|
+
case SyntaxKind.ArrayType:
|
|
265
|
+
case SyntaxKind.TupleType:
|
|
266
|
+
return getTypeFromArrayOrTupleTypeNode(c, node);
|
|
267
|
+
case SyntaxKind.OptionalType:
|
|
268
|
+
return addOptionality(c, getTypeFromTypeNode(c, (node as OptionalTypeNode).type), true, true);
|
|
269
|
+
case SyntaxKind.UnionType:
|
|
270
|
+
return getTypeFromUnionTypeNode(c, node as UnionTypeNode);
|
|
271
|
+
case SyntaxKind.IntersectionType:
|
|
272
|
+
return getTypeFromIntersectionTypeNode(c, node as IntersectionTypeNode);
|
|
273
|
+
case SyntaxKind.NamedTupleMember:
|
|
274
|
+
return getTypeFromNamedTupleTypeNode(c, node as NamedTupleMember);
|
|
275
|
+
case SyntaxKind.ParenthesizedType:
|
|
276
|
+
return getTypeFromTypeNode(c, getType(node)!);
|
|
277
|
+
case SyntaxKind.RestType:
|
|
278
|
+
return getTypeFromRestTypeNode(c, node);
|
|
279
|
+
case SyntaxKind.FunctionType:
|
|
280
|
+
case SyntaxKind.ConstructorType:
|
|
281
|
+
case SyntaxKind.TypeLiteral:
|
|
282
|
+
return getTypeFromTypeLiteralOrFunctionOrConstructorTypeNode(c, node);
|
|
283
|
+
case SyntaxKind.TypeOperator:
|
|
284
|
+
return getTypeFromTypeOperatorNode(c, node as TypeOperatorNode);
|
|
285
|
+
case SyntaxKind.IndexedAccessType:
|
|
286
|
+
return getTypeFromIndexedAccessTypeNode(c, node as IndexedAccessTypeNode);
|
|
287
|
+
case SyntaxKind.TemplateLiteralType:
|
|
288
|
+
return getTypeFromTemplateTypeNode(c, node as TemplateLiteralTypeNode);
|
|
289
|
+
case SyntaxKind.MappedType:
|
|
290
|
+
return getTypeFromMappedTypeNode(c, node);
|
|
291
|
+
case SyntaxKind.ConditionalType:
|
|
292
|
+
return getTypeFromConditionalTypeNode(c, node);
|
|
293
|
+
case SyntaxKind.InferType: {
|
|
294
|
+
let type = c.resolvedTypes.get(node.id);
|
|
295
|
+
if (type === undefined) {
|
|
296
|
+
type = getDeclaredTypeOfTypeParameter(c, getSymbolOfDeclaration(c, (node as InferTypeNode).typeParameter)!);
|
|
297
|
+
c.resolvedTypes.set(node.id, type);
|
|
298
|
+
}
|
|
299
|
+
return type;
|
|
300
|
+
}
|
|
301
|
+
case SyntaxKind.ImportType:
|
|
302
|
+
return getTypeFromImportTypeNode(c, node);
|
|
303
|
+
}
|
|
304
|
+
return c.errorType;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
export function getTypeFromThisTypeNode(c: Checker, node: Node): Type {
|
|
308
|
+
let type = c.resolvedTypes.get(node.id);
|
|
309
|
+
if (type === undefined) {
|
|
310
|
+
type = getThisType(c, node);
|
|
311
|
+
c.resolvedTypes.set(node.id, type);
|
|
312
|
+
}
|
|
313
|
+
return type;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
function getThisType(c: Checker, node: Node): Type {
|
|
317
|
+
const container = getThisContainer(node, false, false);
|
|
318
|
+
const parent = container.parent;
|
|
319
|
+
if (parent !== undefined && (isClassLike(parent) || parent.kind === SyntaxKind.InterfaceDeclaration)) {
|
|
320
|
+
if (!isStatic(container) && (container.kind !== SyntaxKind.Constructor || isDescendant(node, getBody(container))))
|
|
321
|
+
return getDeclaredTypeOfClassOrInterface(c, getSymbolOfDeclaration(c, parent)!).thisType ?? c.errorType;
|
|
322
|
+
}
|
|
323
|
+
c.error(node, Diagnostics.A_this_type_is_available_only_in_a_non_static_member_of_a_class_or_interface);
|
|
324
|
+
return c.errorType;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
function isDescendant(node: Node, ancestor: Node | undefined): boolean {
|
|
328
|
+
if (ancestor === undefined) return false;
|
|
329
|
+
for (let n: Node | undefined = node; n !== undefined; n = n.parent) if (n === ancestor) return true;
|
|
330
|
+
return false;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
function getTypeFromLiteralTypeNode(c: Checker, node: LiteralTypeNode): Type {
|
|
334
|
+
if (node.literal.kind === SyntaxKind.NullKeyword) return c.nullType;
|
|
335
|
+
let type = c.resolvedTypes.get(node.id);
|
|
336
|
+
if (type === undefined) {
|
|
337
|
+
type = getRegularTypeOfLiteralType(c, checkExpression(c, node.literal));
|
|
338
|
+
c.resolvedTypes.set(node.id, type);
|
|
339
|
+
}
|
|
340
|
+
return type;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
function getTypeFromTypeLiteralOrFunctionOrConstructorTypeNode(c: Checker, node: Node): Type {
|
|
344
|
+
let type = c.resolvedTypes.get(node.id);
|
|
345
|
+
if (type === undefined) {
|
|
346
|
+
// Members resolve lazily.
|
|
347
|
+
const alias = getAliasForTypeNode(c, node);
|
|
348
|
+
const symbol = getSymbol(node);
|
|
349
|
+
if (symbol === undefined || (getMembersOfSymbol(c, symbol).size === 0 && alias === undefined))
|
|
350
|
+
type = c.emptyTypeLiteralType;
|
|
351
|
+
else {
|
|
352
|
+
const t = newObjectType(c, ObjectFlags.Anonymous, symbol);
|
|
353
|
+
t.alias = alias;
|
|
354
|
+
type = t;
|
|
355
|
+
}
|
|
356
|
+
c.resolvedTypes.set(node.id, type);
|
|
357
|
+
}
|
|
358
|
+
return type;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
export function getTypeFromIndexedAccessTypeNode(c: Checker, node: IndexedAccessTypeNode): Type {
|
|
362
|
+
let type = c.resolvedTypes.get(node.id);
|
|
363
|
+
if (type === undefined) {
|
|
364
|
+
const objectType = getTypeFromTypeNode(c, node.objectType);
|
|
365
|
+
const indexType = getTypeFromTypeNode(c, node.indexType);
|
|
366
|
+
type = getIndexedAccessTypeEx(c, objectType, indexType, 0, node, getAliasForTypeNode(c, node));
|
|
367
|
+
c.resolvedTypes.set(node.id, type);
|
|
368
|
+
}
|
|
369
|
+
return type;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
function getTypeFromTypeOperatorNode(c: Checker, node: TypeOperatorNode): Type {
|
|
373
|
+
let type = c.resolvedTypes.get(node.id);
|
|
374
|
+
if (type === undefined) {
|
|
375
|
+
const argType = node.type;
|
|
376
|
+
switch (node.operator) {
|
|
377
|
+
case SyntaxKind.KeyOfKeyword:
|
|
378
|
+
type = getIndexType(c, getTypeFromTypeNode(c, argType));
|
|
379
|
+
break;
|
|
380
|
+
case SyntaxKind.UniqueKeyword:
|
|
381
|
+
type =
|
|
382
|
+
argType.kind === SyntaxKind.SymbolKeyword
|
|
383
|
+
? getESSymbolLikeTypeForNode(c, walkUpParenthesizedTypes(node.parent!))
|
|
384
|
+
: c.errorType;
|
|
385
|
+
break;
|
|
386
|
+
default:
|
|
387
|
+
type = getTypeFromTypeNode(c, argType);
|
|
388
|
+
}
|
|
389
|
+
c.resolvedTypes.set(node.id, type);
|
|
390
|
+
}
|
|
391
|
+
return type;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
function walkUpParenthesizedTypes(node: Node): Node {
|
|
395
|
+
let n = node;
|
|
396
|
+
while (n.kind === SyntaxKind.ParenthesizedType && n.parent !== undefined) n = n.parent;
|
|
397
|
+
return n;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
/** A const variable of a variable statement, a static readonly property, or a readonly property signature. */
|
|
401
|
+
function isValidESSymbolDeclaration(node: Node): boolean {
|
|
402
|
+
switch (node.kind) {
|
|
403
|
+
case SyntaxKind.VariableDeclaration: {
|
|
404
|
+
const list = node.parent!;
|
|
405
|
+
return (
|
|
406
|
+
(getCombinedNodeFlags(node) & NodeFlags.Constant) === NodeFlags.Const &&
|
|
407
|
+
getName(node)!.kind === SyntaxKind.Identifier &&
|
|
408
|
+
list.kind === SyntaxKind.VariableDeclarationList &&
|
|
409
|
+
list.parent!.kind === SyntaxKind.VariableStatement
|
|
410
|
+
);
|
|
411
|
+
}
|
|
412
|
+
case SyntaxKind.PropertyDeclaration:
|
|
413
|
+
return hasSyntacticModifier(node, ModifierFlags.Readonly) && isStatic(node);
|
|
414
|
+
case SyntaxKind.PropertySignature:
|
|
415
|
+
return hasSyntacticModifier(node, ModifierFlags.Readonly);
|
|
416
|
+
}
|
|
417
|
+
return false;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
export function getESSymbolLikeTypeForNode(c: Checker, node: Node): Type {
|
|
421
|
+
if (isValidESSymbolDeclaration(node)) {
|
|
422
|
+
const symbol = getSymbolOfDeclaration(c, node);
|
|
423
|
+
if (symbol !== undefined) {
|
|
424
|
+
let uniqueType = c.uniqueESSymbolTypes.get(symbol);
|
|
425
|
+
if (uniqueType === undefined) {
|
|
426
|
+
uniqueType = new UniqueESSymbolType(c.nextTypeId(), symbol, '@' + symbol.name + '@' + getSymbolId(symbol));
|
|
427
|
+
c.uniqueESSymbolTypes.set(symbol, uniqueType);
|
|
428
|
+
}
|
|
429
|
+
return uniqueType;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
return c.esSymbolType;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
// ---- Type references
|
|
436
|
+
|
|
437
|
+
function isConstTypeReference(node: Node): boolean {
|
|
438
|
+
if (node.kind !== SyntaxKind.TypeReference) return false;
|
|
439
|
+
const ref = node as TypeReferenceNode;
|
|
440
|
+
return (
|
|
441
|
+
ref.typeName.kind === SyntaxKind.Identifier && getText(ref.typeName) === 'const' && ref.typeArguments === undefined
|
|
442
|
+
);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
function isAssertionExpression(node: Node | undefined): boolean {
|
|
446
|
+
return (
|
|
447
|
+
node !== undefined && (node.kind === SyntaxKind.AsExpression || node.kind === SyntaxKind.TypeAssertionExpression)
|
|
448
|
+
);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
export function getTypeFromTypeReference(c: Checker, node: Node): Type {
|
|
452
|
+
let type = c.resolvedTypes.get(node.id);
|
|
453
|
+
if (type === undefined) {
|
|
454
|
+
if (isConstTypeReference(node) && isAssertionExpression(node.parent))
|
|
455
|
+
type = checkExpressionCached(c, getExpression(node.parent!)!);
|
|
456
|
+
else
|
|
457
|
+
type =
|
|
458
|
+
getIntendedTypeFromJSDocTypeReference(c, node) ??
|
|
459
|
+
getTypeReferenceType(c, node, getSymbolFromTypeReference(c, node));
|
|
460
|
+
c.resolvedTypes.set(node.id, type);
|
|
461
|
+
}
|
|
462
|
+
return type;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
export function getSymbolFromTypeReference(c: Checker, node: Node): Symbol {
|
|
466
|
+
let symbol = c.resolvedSymbols.get(node.id);
|
|
467
|
+
if (symbol === undefined) {
|
|
468
|
+
if (isConstTypeReference(node) && isAssertionExpression(node.parent)) symbol = c.unknownSymbol;
|
|
469
|
+
else symbol = resolveTypeReferenceName(c, node, SymbolFlags.Type, false);
|
|
470
|
+
c.resolvedSymbols.set(node.id, symbol);
|
|
471
|
+
}
|
|
472
|
+
return symbol;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
function getTypeReferenceName(node: Node): Node | undefined {
|
|
476
|
+
if (node.kind === SyntaxKind.TypeReference) return (node as TypeReferenceNode).typeName;
|
|
477
|
+
if (node.kind === SyntaxKind.ExpressionWithTypeArguments) {
|
|
478
|
+
const e = (node as ExpressionWithTypeArguments).expression;
|
|
479
|
+
if (isEntityNameExpression(e)) return e;
|
|
480
|
+
}
|
|
481
|
+
return undefined;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
function isEntityNameExpression(node: Node): boolean {
|
|
485
|
+
if (node.kind === SyntaxKind.Identifier) return true;
|
|
486
|
+
if (node.kind === SyntaxKind.PropertyAccessExpression) {
|
|
487
|
+
const name = getName(node);
|
|
488
|
+
return name !== undefined && name.kind === SyntaxKind.Identifier && isEntityNameExpression(getExpression(node)!);
|
|
489
|
+
}
|
|
490
|
+
return false;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
export function resolveTypeReferenceName(
|
|
494
|
+
c: Checker,
|
|
495
|
+
typeReference: Node,
|
|
496
|
+
meaning: SymbolFlags,
|
|
497
|
+
ignoreErrors: boolean,
|
|
498
|
+
): Symbol {
|
|
499
|
+
const name = getTypeReferenceName(typeReference);
|
|
500
|
+
if (name === undefined) return c.unknownSymbol;
|
|
501
|
+
const symbol = resolveEntityName(c, name, meaning, ignoreErrors, false, undefined);
|
|
502
|
+
if (symbol !== undefined && symbol !== c.unknownSymbol) return symbol;
|
|
503
|
+
if (ignoreErrors) return c.unknownSymbol;
|
|
504
|
+
return getUnresolvedSymbolForEntityName(c, name);
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
export function getUnresolvedSymbolForEntityName(c: Checker, name: Node): Symbol {
|
|
508
|
+
let identifier: Node;
|
|
509
|
+
if (name.kind === SyntaxKind.QualifiedName) identifier = (name as QualifiedName).right;
|
|
510
|
+
else if (name.kind === SyntaxKind.PropertyAccessExpression) identifier = getName(name)!;
|
|
511
|
+
else identifier = name;
|
|
512
|
+
const text = getText(identifier);
|
|
513
|
+
if (text === '') return c.unknownSymbol;
|
|
514
|
+
let parentSymbol: Symbol | undefined;
|
|
515
|
+
if (name.kind === SyntaxKind.QualifiedName)
|
|
516
|
+
parentSymbol = getUnresolvedSymbolForEntityName(c, (name as QualifiedName).left);
|
|
517
|
+
else if (name.kind === SyntaxKind.PropertyAccessExpression)
|
|
518
|
+
parentSymbol = getUnresolvedSymbolForEntityName(c, getExpression(name)!);
|
|
519
|
+
const path = parentSymbol !== undefined ? getSymbolPath(parentSymbol) + '.' + text : text;
|
|
520
|
+
let result = c.unresolvedSymbols.get(path);
|
|
521
|
+
if (result === undefined) {
|
|
522
|
+
result = c.newSymbolWithCheckFlags(SymbolFlags.TypeAlias, text, CheckFlags.Unresolved);
|
|
523
|
+
c.unresolvedSymbols.set(path, result);
|
|
524
|
+
result.parent = parentSymbol;
|
|
525
|
+
c.symbolLinks(result).declaredType = c.unresolvedType;
|
|
526
|
+
}
|
|
527
|
+
return result;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
function getSymbolPath(symbol: Symbol): string {
|
|
531
|
+
return symbol.parent !== undefined ? getSymbolPath(symbol.parent) + '.' + symbol.name : symbol.name;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
export function getTypeReferenceType(c: Checker, node: Node, symbol: Symbol): Type {
|
|
535
|
+
if (symbol === c.unknownSymbol) return c.errorType;
|
|
536
|
+
if ((symbol.flags & (SymbolFlags.Class | SymbolFlags.Interface)) !== 0)
|
|
537
|
+
return getTypeFromClassOrInterfaceReference(c, node, symbol);
|
|
538
|
+
if ((symbol.flags & SymbolFlags.TypeAlias) !== 0) return getTypeFromTypeAliasReference(c, node, symbol);
|
|
539
|
+
// Enums and type parameters can't be generic.
|
|
540
|
+
const res = tryGetDeclaredTypeOfSymbol(c, symbol);
|
|
541
|
+
if (res !== undefined && checkNoTypeArguments(c, node, symbol)) return getRegularTypeOfLiteralType(c, res);
|
|
542
|
+
return c.errorType;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
function typeArgumentNodesOf(node: Node): Node[] {
|
|
546
|
+
const list = getTypeArguments(node);
|
|
547
|
+
return list !== undefined ? list.nodes : emptyNodes;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
const emptyNodes: Node[] = [];
|
|
551
|
+
|
|
552
|
+
export function getTypeArgumentsFromNode(c: Checker, node: Node): Type[] {
|
|
553
|
+
return getTypesFromTypeNodes(c, typeArgumentNodesOf(node));
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
export function getTypesFromTypeNodes(c: Checker, nodes: readonly Node[]): Type[] {
|
|
557
|
+
const result: Type[] = [];
|
|
558
|
+
for (const n of nodes) result.push(getTypeFromTypeNode(c, n));
|
|
559
|
+
return result;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
export function getTypeFromClassOrInterfaceReference(c: Checker, node: Node, symbol: Symbol): Type {
|
|
563
|
+
const t = getDeclaredTypeOfClassOrInterface(c, getMergedSymbol(c, symbol));
|
|
564
|
+
const typeParameters = t.localTypeParameters();
|
|
565
|
+
if (typeParameters.length === 0) return checkNoTypeArguments(c, node, symbol) ? t : c.errorType;
|
|
566
|
+
const numTypeArguments = typeArgumentNodesOf(node).length;
|
|
567
|
+
const minTypeArgumentCount = getMinTypeArgumentCount(c, typeParameters);
|
|
568
|
+
const isJs = (node.flags & NodeFlags.JavaScriptFile) !== 0;
|
|
569
|
+
const isJsImplicitAny = !c.noImplicitAny && isJs;
|
|
570
|
+
if (!isJsImplicitAny && (numTypeArguments < minTypeArgumentCount || numTypeArguments > typeParameters.length)) {
|
|
571
|
+
const message =
|
|
572
|
+
minTypeArgumentCount < typeParameters.length
|
|
573
|
+
? Diagnostics.Generic_type_0_requires_between_1_and_2_type_arguments
|
|
574
|
+
: Diagnostics.Generic_type_0_requires_1_type_argument_s;
|
|
575
|
+
c.error(
|
|
576
|
+
node,
|
|
577
|
+
message,
|
|
578
|
+
typeToString(c, t, undefined, 1 << 1),
|
|
579
|
+
String(minTypeArgumentCount),
|
|
580
|
+
String(typeParameters.length),
|
|
581
|
+
);
|
|
582
|
+
if (!isJs) return c.errorType;
|
|
583
|
+
}
|
|
584
|
+
if (
|
|
585
|
+
node.kind === SyntaxKind.TypeReference &&
|
|
586
|
+
isDeferredTypeReferenceNode(c, node, numTypeArguments !== typeParameters.length)
|
|
587
|
+
)
|
|
588
|
+
return createDeferredTypeReference(c, t, node, undefined, getAliasForTypeNode(c, node));
|
|
589
|
+
// Outer type parameters are supplied automatically; the reference gives the local ones.
|
|
590
|
+
const localTypeArguments = fillMissingTypeArguments(
|
|
591
|
+
c,
|
|
592
|
+
getTypeArgumentsFromNode(c, node),
|
|
593
|
+
typeParameters,
|
|
594
|
+
minTypeArgumentCount,
|
|
595
|
+
isJs,
|
|
596
|
+
);
|
|
597
|
+
// localTypeArguments is a new list, so without outer type parameters it is the reference's own.
|
|
598
|
+
const outerCount = t.outerTypeParameterCount;
|
|
599
|
+
if (outerCount === 0) return createTypeReferenceEx(c, t, localTypeArguments, ObjectFlags.FromTypeNode);
|
|
600
|
+
const typeArguments: Type[] = [];
|
|
601
|
+
for (let i = 0; i < outerCount; i++) typeArguments.push(t.allTypeParameters[i]!);
|
|
602
|
+
for (const typeArgument of localTypeArguments) typeArguments.push(typeArgument);
|
|
603
|
+
return createTypeReferenceEx(c, t, typeArguments, ObjectFlags.FromTypeNode);
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
export function checkNoTypeArguments(c: Checker, node: Node, symbol: Symbol | undefined): boolean {
|
|
607
|
+
if (typeArgumentNodesOf(node).length === 0) return true;
|
|
608
|
+
const typeName =
|
|
609
|
+
symbol !== undefined
|
|
610
|
+
? symbolToString(c, symbol)
|
|
611
|
+
: declarationNameToString(getSourceFileOfNode(node), (node as TypeReferenceNode).typeName);
|
|
612
|
+
c.error(node, Diagnostics.Type_0_is_not_generic, typeName);
|
|
613
|
+
return false;
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
/** Directly aliased references, and those possibly in circular chains of eagerly resolved types, are deferred. */
|
|
617
|
+
function isDeferredTypeReferenceNode(c: Checker, node: Node, hasDefaultTypeArguments: boolean): boolean {
|
|
618
|
+
if (getAliasSymbolForTypeNode(c, node) !== undefined) return true;
|
|
619
|
+
if (!isResolvedByTypeAlias(node)) return false;
|
|
620
|
+
switch (node.kind) {
|
|
621
|
+
case SyntaxKind.ArrayType:
|
|
622
|
+
return mayResolveTypeAlias(c, (node as ArrayTypeNode).elementType);
|
|
623
|
+
case SyntaxKind.TupleType:
|
|
624
|
+
return someMayResolveTypeAlias(c, (node as TupleTypeNode).elements.nodes);
|
|
625
|
+
case SyntaxKind.TypeReference:
|
|
626
|
+
return hasDefaultTypeArguments || someMayResolveTypeAlias(c, typeArgumentNodesOf(node));
|
|
627
|
+
}
|
|
628
|
+
return false;
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
function isResolvedByTypeAlias(node: Node): boolean {
|
|
632
|
+
const parent = node.parent!;
|
|
633
|
+
switch (parent.kind) {
|
|
634
|
+
case SyntaxKind.ParenthesizedType:
|
|
635
|
+
case SyntaxKind.NamedTupleMember:
|
|
636
|
+
case SyntaxKind.TypeReference:
|
|
637
|
+
case SyntaxKind.UnionType:
|
|
638
|
+
case SyntaxKind.IntersectionType:
|
|
639
|
+
case SyntaxKind.IndexedAccessType:
|
|
640
|
+
case SyntaxKind.ConditionalType:
|
|
641
|
+
case SyntaxKind.TypeOperator:
|
|
642
|
+
case SyntaxKind.ArrayType:
|
|
643
|
+
case SyntaxKind.TupleType:
|
|
644
|
+
return isResolvedByTypeAlias(parent);
|
|
645
|
+
case SyntaxKind.TypeAliasDeclaration:
|
|
646
|
+
case SyntaxKind.JSTypeAliasDeclaration:
|
|
647
|
+
return true;
|
|
648
|
+
}
|
|
649
|
+
return false;
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
function mayResolveTypeAlias(c: Checker, node: Node): boolean {
|
|
653
|
+
switch (node.kind) {
|
|
654
|
+
case SyntaxKind.TypeReference:
|
|
655
|
+
return (resolveTypeReferenceName(c, node, SymbolFlags.Type, false).flags & SymbolFlags.TypeAlias) !== 0;
|
|
656
|
+
case SyntaxKind.TypeQuery:
|
|
657
|
+
return true;
|
|
658
|
+
case SyntaxKind.TypeOperator:
|
|
659
|
+
return (
|
|
660
|
+
(node as TypeOperatorNode).operator !== SyntaxKind.UniqueKeyword &&
|
|
661
|
+
mayResolveTypeAlias(c, (node as TypeOperatorNode).type)
|
|
662
|
+
);
|
|
663
|
+
case SyntaxKind.ParenthesizedType:
|
|
664
|
+
case SyntaxKind.OptionalType:
|
|
665
|
+
case SyntaxKind.NamedTupleMember:
|
|
666
|
+
return mayResolveTypeAlias(c, getType(node)!);
|
|
667
|
+
case SyntaxKind.RestType: {
|
|
668
|
+
const t = (node as RestTypeNode).type;
|
|
669
|
+
return t.kind !== SyntaxKind.ArrayType || mayResolveTypeAlias(c, (t as ArrayTypeNode).elementType);
|
|
670
|
+
}
|
|
671
|
+
case SyntaxKind.UnionType:
|
|
672
|
+
return someMayResolveTypeAlias(c, (node as UnionTypeNode).types.nodes);
|
|
673
|
+
case SyntaxKind.IntersectionType:
|
|
674
|
+
return someMayResolveTypeAlias(c, (node as IntersectionTypeNode).types.nodes);
|
|
675
|
+
case SyntaxKind.IndexedAccessType:
|
|
676
|
+
return (
|
|
677
|
+
mayResolveTypeAlias(c, (node as IndexedAccessTypeNode).objectType) ||
|
|
678
|
+
mayResolveTypeAlias(c, (node as IndexedAccessTypeNode).indexType)
|
|
679
|
+
);
|
|
680
|
+
case SyntaxKind.ConditionalType: {
|
|
681
|
+
const n = node as ConditionalTypeNode;
|
|
682
|
+
return (
|
|
683
|
+
mayResolveTypeAlias(c, n.checkType) ||
|
|
684
|
+
mayResolveTypeAlias(c, n.extendsType) ||
|
|
685
|
+
mayResolveTypeAlias(c, n.trueType) ||
|
|
686
|
+
mayResolveTypeAlias(c, n.falseType)
|
|
687
|
+
);
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
return false;
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
function someMayResolveTypeAlias(c: Checker, nodes: readonly Node[]): boolean {
|
|
694
|
+
for (const n of nodes) if (mayResolveTypeAlias(c, n)) return true;
|
|
695
|
+
return false;
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
// ---- Type aliases
|
|
699
|
+
|
|
700
|
+
export function isTypeAlias(node: Node): boolean {
|
|
701
|
+
return node.kind === SyntaxKind.TypeAliasDeclaration || node.kind === SyntaxKind.JSTypeAliasDeclaration;
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
export function getAliasForTypeNode(c: Checker, node: Node): TypeAlias | undefined {
|
|
705
|
+
const symbol = getAliasSymbolForTypeNode(c, node);
|
|
706
|
+
return symbol !== undefined
|
|
707
|
+
? new TypeAlias(symbol, getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(c, symbol))
|
|
708
|
+
: undefined;
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
export function getAliasSymbolForTypeNode(c: Checker, node: Node): Symbol | undefined {
|
|
712
|
+
let host = node.parent!;
|
|
713
|
+
while (
|
|
714
|
+
host.kind === SyntaxKind.ParenthesizedType ||
|
|
715
|
+
(host.kind === SyntaxKind.TypeOperator && (host as TypeOperatorNode).operator === SyntaxKind.ReadonlyKeyword)
|
|
716
|
+
)
|
|
717
|
+
host = host.parent!;
|
|
718
|
+
return isTypeAlias(host) ? getSymbolOfDeclaration(c, host) : undefined;
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
function isLocalTypeAlias(symbol: Symbol): boolean {
|
|
722
|
+
let declaration: Node | undefined;
|
|
723
|
+
for (const d of symbol.declarations) {
|
|
724
|
+
if (isTypeAlias(d)) {
|
|
725
|
+
declaration = d;
|
|
726
|
+
break;
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
if (declaration === undefined) return false;
|
|
730
|
+
for (let n = declaration.parent; n !== undefined; n = n.parent) {
|
|
731
|
+
switch (n.kind) {
|
|
732
|
+
case SyntaxKind.FunctionDeclaration:
|
|
733
|
+
case SyntaxKind.FunctionExpression:
|
|
734
|
+
case SyntaxKind.ArrowFunction:
|
|
735
|
+
case SyntaxKind.MethodDeclaration:
|
|
736
|
+
case SyntaxKind.Constructor:
|
|
737
|
+
case SyntaxKind.GetAccessor:
|
|
738
|
+
case SyntaxKind.SetAccessor:
|
|
739
|
+
return true;
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
return false;
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
function getTypeFromTypeAliasReference(c: Checker, node: Node, symbol: Symbol): Type {
|
|
746
|
+
const typeArgumentNodes = typeArgumentNodesOf(node);
|
|
747
|
+
if ((symbol.checkFlags & CheckFlags.Unresolved) !== 0) {
|
|
748
|
+
const alias = new TypeAlias(symbol, getTypesFromTypeNodes(c, typeArgumentNodes));
|
|
749
|
+
const key = aliasKey(alias);
|
|
750
|
+
let errorType = c.errorTypes.get(key);
|
|
751
|
+
if (errorType === undefined) {
|
|
752
|
+
errorType = c.newIntrinsicType(TypeFlags.Any, 'error', ObjectFlags.None);
|
|
753
|
+
errorType.alias = alias;
|
|
754
|
+
c.errorTypes.set(key, errorType);
|
|
755
|
+
}
|
|
756
|
+
return errorType;
|
|
757
|
+
}
|
|
758
|
+
const t = getDeclaredTypeOfSymbol(c, symbol);
|
|
759
|
+
const typeParameters = c.symbolLinks(symbol).typeParameters;
|
|
760
|
+
if (typeParameters !== undefined && typeParameters.length !== 0) {
|
|
761
|
+
const numTypeArguments = typeArgumentNodes.length;
|
|
762
|
+
const minTypeArgumentCount = getMinTypeArgumentCount(c, typeParameters);
|
|
763
|
+
if (numTypeArguments < minTypeArgumentCount || numTypeArguments > typeParameters.length) {
|
|
764
|
+
const message =
|
|
765
|
+
minTypeArgumentCount === typeParameters.length
|
|
766
|
+
? Diagnostics.Generic_type_0_requires_1_type_argument_s
|
|
767
|
+
: Diagnostics.Generic_type_0_requires_between_1_and_2_type_arguments;
|
|
768
|
+
c.error(node, message, symbolToString(c, symbol), String(minTypeArgumentCount), String(typeParameters.length));
|
|
769
|
+
return c.errorType;
|
|
770
|
+
}
|
|
771
|
+
// A local alias doesn't name an instantiation of a top-level one.
|
|
772
|
+
const aliasSymbol = getAliasSymbolForTypeNode(c, node);
|
|
773
|
+
let newAliasSymbol =
|
|
774
|
+
aliasSymbol !== undefined && (isLocalTypeAlias(symbol) || !isLocalTypeAlias(aliasSymbol))
|
|
775
|
+
? aliasSymbol
|
|
776
|
+
: undefined;
|
|
777
|
+
let aliasTypeArguments: Type[] | undefined;
|
|
778
|
+
if (newAliasSymbol !== undefined)
|
|
779
|
+
aliasTypeArguments = getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(c, newAliasSymbol);
|
|
780
|
+
else if (node.kind === SyntaxKind.TypeReference) {
|
|
781
|
+
const aliased = resolveTypeReferenceName(c, node, SymbolFlags.Alias, true);
|
|
782
|
+
if (aliased !== c.unknownSymbol) {
|
|
783
|
+
const resolved = resolveAlias(c, aliased);
|
|
784
|
+
if ((resolved.flags & SymbolFlags.TypeAlias) !== 0) {
|
|
785
|
+
newAliasSymbol = resolved;
|
|
786
|
+
aliasTypeArguments = getTypeArgumentsFromNode(c, node);
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
const newAlias =
|
|
791
|
+
newAliasSymbol !== undefined ? new TypeAlias(newAliasSymbol, aliasTypeArguments ?? emptyTypes) : undefined;
|
|
792
|
+
return getTypeAliasInstantiation(c, symbol, getTypeArgumentsFromNode(c, node), newAlias);
|
|
793
|
+
}
|
|
794
|
+
return checkNoTypeArguments(c, node, symbol) ? t : c.errorType;
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
export function getTypeAliasInstantiation(
|
|
798
|
+
c: Checker,
|
|
799
|
+
symbol: Symbol,
|
|
800
|
+
typeArguments: Type[],
|
|
801
|
+
alias: TypeAlias | undefined,
|
|
802
|
+
): Type {
|
|
803
|
+
const t = getDeclaredTypeOfSymbol(c, symbol);
|
|
804
|
+
if (t === c.intrinsicMarkerType && typeArguments.length === 1) {
|
|
805
|
+
const kind = intrinsicTypeKind(symbol.name);
|
|
806
|
+
if (kind === IntrinsicTypeKind.NoInfer) return getNoInferType(c, typeArguments[0]!);
|
|
807
|
+
if (kind !== IntrinsicTypeKind.Unknown) return getStringMappingType(c, symbol, typeArguments[0]!);
|
|
808
|
+
}
|
|
809
|
+
const links = c.symbolLinks(symbol);
|
|
810
|
+
const typeParameters = links.typeParameters ?? emptyTypes;
|
|
811
|
+
let instantiations = links.instantiations;
|
|
812
|
+
if (instantiations === undefined) {
|
|
813
|
+
instantiations = new Map<string, Type>();
|
|
814
|
+
links.instantiations = instantiations;
|
|
815
|
+
}
|
|
816
|
+
const key = typeListKey(typeArguments) + aliasKey(alias);
|
|
817
|
+
let instantiation = instantiations.get(key);
|
|
818
|
+
if (instantiation === undefined) {
|
|
819
|
+
const inJs =
|
|
820
|
+
symbol.valueDeclaration !== undefined && (symbol.valueDeclaration.flags & NodeFlags.JavaScriptFile) !== 0;
|
|
821
|
+
const mapper = newTypeMapper(
|
|
822
|
+
typeParameters,
|
|
823
|
+
fillMissingTypeArguments(c, typeArguments, typeParameters, getMinTypeArgumentCount(c, typeParameters), inJs),
|
|
824
|
+
);
|
|
825
|
+
instantiation = instantiateTypeWithAlias(c, t, mapper, alias);
|
|
826
|
+
instantiations.set(key, instantiation);
|
|
827
|
+
}
|
|
828
|
+
return instantiation;
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
// ---- Other type nodes
|
|
832
|
+
|
|
833
|
+
function getTypeFromTypeQueryNode(c: Checker, node: Node): Type {
|
|
834
|
+
let type = c.resolvedTypes.get(node.id);
|
|
835
|
+
if (type === undefined) {
|
|
836
|
+
type = getRegularTypeOfLiteralType(c, getWidenedType(c, checkExpressionWithTypeArguments(c, node)));
|
|
837
|
+
c.resolvedTypes.set(node.id, type);
|
|
838
|
+
}
|
|
839
|
+
return type;
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
export function getTupleElementFlags(c: Checker, node: Node): ElementFlags {
|
|
843
|
+
switch (node.kind) {
|
|
844
|
+
case SyntaxKind.OptionalType:
|
|
845
|
+
return ElementFlags.Optional;
|
|
846
|
+
case SyntaxKind.RestType:
|
|
847
|
+
return getArrayElementTypeNode((node as RestTypeNode).type) !== undefined
|
|
848
|
+
? ElementFlags.Rest
|
|
849
|
+
: ElementFlags.Variadic;
|
|
850
|
+
case SyntaxKind.NamedTupleMember: {
|
|
851
|
+
const named = node as NamedTupleMember;
|
|
852
|
+
if (named.questionToken !== undefined) return ElementFlags.Optional;
|
|
853
|
+
if (named.dotDotDotToken !== undefined)
|
|
854
|
+
return getArrayElementTypeNode(named.type) !== undefined ? ElementFlags.Rest : ElementFlags.Variadic;
|
|
855
|
+
return ElementFlags.Required;
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
return ElementFlags.Required;
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
function getTupleElementInfo(c: Checker, node: Node): TupleElementInfo {
|
|
862
|
+
return new TupleElementInfo(
|
|
863
|
+
getTupleElementFlags(c, node),
|
|
864
|
+
node.kind === SyntaxKind.NamedTupleMember || node.kind === SyntaxKind.Parameter ? node : undefined,
|
|
865
|
+
);
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
function getArrayElementTypeNode(node: Node): Node | undefined {
|
|
869
|
+
switch (node.kind) {
|
|
870
|
+
case SyntaxKind.ParenthesizedType:
|
|
871
|
+
return getArrayElementTypeNode(getType(node)!);
|
|
872
|
+
case SyntaxKind.TupleType: {
|
|
873
|
+
const elements = (node as TupleTypeNode).elements.nodes;
|
|
874
|
+
if (elements.length === 1) {
|
|
875
|
+
const e = elements[0]!;
|
|
876
|
+
if (e.kind === SyntaxKind.RestType) return getArrayElementTypeNode((e as RestTypeNode).type);
|
|
877
|
+
if (e.kind === SyntaxKind.NamedTupleMember && (e as NamedTupleMember).dotDotDotToken !== undefined)
|
|
878
|
+
return getArrayElementTypeNode((e as NamedTupleMember).type);
|
|
879
|
+
}
|
|
880
|
+
return undefined;
|
|
881
|
+
}
|
|
882
|
+
case SyntaxKind.ArrayType:
|
|
883
|
+
return (node as ArrayTypeNode).elementType;
|
|
884
|
+
}
|
|
885
|
+
return undefined;
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
function getArrayOrTupleTargetType(c: Checker, node: Node): Type {
|
|
889
|
+
const parent = node.parent!;
|
|
890
|
+
const readonly =
|
|
891
|
+
parent.kind === SyntaxKind.TypeOperator && (parent as TypeOperatorNode).operator === SyntaxKind.ReadonlyKeyword;
|
|
892
|
+
if (getArrayElementTypeNode(node) !== undefined) return readonly ? c.globalReadonlyArrayType : c.globalArrayType;
|
|
893
|
+
const elementInfos: TupleElementInfo[] = [];
|
|
894
|
+
for (const e of (node as TupleTypeNode).elements.nodes) elementInfos.push(getTupleElementInfo(c, e));
|
|
895
|
+
return getTupleTargetType(c, elementInfos, readonly);
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
function getTypeFromArrayOrTupleTypeNode(c: Checker, node: Node): Type {
|
|
899
|
+
const type = c.resolvedTypes.get(node.id);
|
|
900
|
+
if (type !== undefined) return type;
|
|
901
|
+
const target = getArrayOrTupleTargetType(c, node);
|
|
902
|
+
if (target === c.emptyGenericType) c.resolvedTypes.set(node.id, c.emptyObjectType);
|
|
903
|
+
else if (
|
|
904
|
+
!(node.kind === SyntaxKind.TupleType && hasVariadicTupleElement(c, node as TupleTypeNode)) &&
|
|
905
|
+
isDeferredTypeReferenceNode(c, node, false)
|
|
906
|
+
)
|
|
907
|
+
c.resolvedTypes.set(
|
|
908
|
+
node.id,
|
|
909
|
+
node.kind === SyntaxKind.TupleType && (node as TupleTypeNode).elements.nodes.length === 0
|
|
910
|
+
? target
|
|
911
|
+
: createDeferredTypeReference(c, target, node, undefined, getAliasForTypeNode(c, node)),
|
|
912
|
+
);
|
|
913
|
+
else {
|
|
914
|
+
const elementTypes =
|
|
915
|
+
node.kind === SyntaxKind.ArrayType
|
|
916
|
+
? [getTypeFromTypeNode(c, (node as ArrayTypeNode).elementType)]
|
|
917
|
+
: getTypesFromTypeNodes(c, (node as TupleTypeNode).elements.nodes);
|
|
918
|
+
c.resolvedTypes.set(
|
|
919
|
+
node.id,
|
|
920
|
+
(target.objectFlags & ObjectFlags.Tuple) !== 0
|
|
921
|
+
? createNormalizedTupleType(c, target as TupleType, elementTypes, ObjectFlags.FromTypeNode)
|
|
922
|
+
: createTypeReferenceEx(c, target, elementTypes, ObjectFlags.FromTypeNode),
|
|
923
|
+
);
|
|
924
|
+
}
|
|
925
|
+
return c.resolvedTypes.get(node.id)!;
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
function hasVariadicTupleElement(c: Checker, node: TupleTypeNode): boolean {
|
|
929
|
+
for (const e of node.elements.nodes) if ((getTupleElementFlags(c, e) & ElementFlags.Variadic) !== 0) return true;
|
|
930
|
+
return false;
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
/** Type arguments of a deferred reference from its node. */
|
|
934
|
+
export function getTypeArgumentsOfDeferredReference(c: Checker, node: Node, target: InterfaceType): Type[] {
|
|
935
|
+
switch (node.kind) {
|
|
936
|
+
case SyntaxKind.TypeReference:
|
|
937
|
+
return target
|
|
938
|
+
.outerTypeParameters()
|
|
939
|
+
.concat(
|
|
940
|
+
fillMissingTypeArguments(
|
|
941
|
+
c,
|
|
942
|
+
getTypeArgumentsFromNode(c, node),
|
|
943
|
+
target.localTypeParameters(),
|
|
944
|
+
getMinTypeArgumentCount(c, target.localTypeParameters()),
|
|
945
|
+
(node.flags & NodeFlags.JavaScriptFile) !== 0,
|
|
946
|
+
),
|
|
947
|
+
);
|
|
948
|
+
case SyntaxKind.ArrayType:
|
|
949
|
+
return [getTypeFromTypeNode(c, (node as ArrayTypeNode).elementType)];
|
|
950
|
+
case SyntaxKind.TupleType:
|
|
951
|
+
return getTypesFromTypeNodes(c, (node as TupleTypeNode).elements.nodes);
|
|
952
|
+
}
|
|
953
|
+
return [];
|
|
954
|
+
}
|
|
955
|
+
|
|
956
|
+
function getTypeFromNamedTupleTypeNode(c: Checker, node: NamedTupleMember): Type {
|
|
957
|
+
let type = c.resolvedTypes.get(node.id);
|
|
958
|
+
if (type === undefined) {
|
|
959
|
+
type =
|
|
960
|
+
node.dotDotDotToken !== undefined
|
|
961
|
+
? getTypeFromRestTypeNode(c, node)
|
|
962
|
+
: addOptionality(c, getTypeFromTypeNode(c, node.type), true, node.questionToken !== undefined);
|
|
963
|
+
c.resolvedTypes.set(node.id, type);
|
|
964
|
+
}
|
|
965
|
+
return type;
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
function getTypeFromRestTypeNode(c: Checker, node: Node): Type {
|
|
969
|
+
const typeNode = getType(node)!;
|
|
970
|
+
return getTypeFromTypeNode(c, getArrayElementTypeNode(typeNode) ?? typeNode);
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
function getTypeFromUnionTypeNode(c: Checker, node: UnionTypeNode): Type {
|
|
974
|
+
let type = c.resolvedTypes.get(node.id);
|
|
975
|
+
if (type === undefined) {
|
|
976
|
+
type = getUnionTypeEx(
|
|
977
|
+
c,
|
|
978
|
+
getTypesFromTypeNodes(c, node.types.nodes),
|
|
979
|
+
UnionReduction.Literal,
|
|
980
|
+
getAliasForTypeNode(c, node),
|
|
981
|
+
undefined,
|
|
982
|
+
);
|
|
983
|
+
c.resolvedTypes.set(node.id, type);
|
|
984
|
+
}
|
|
985
|
+
return type;
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
function getTypeFromIntersectionTypeNode(c: Checker, node: IntersectionTypeNode): Type {
|
|
989
|
+
if (c.resolvedTypes.get(node.id) === undefined) {
|
|
990
|
+
const alias = getAliasForTypeNode(c, node);
|
|
991
|
+
const types = getTypesFromTypeNodes(c, node.types.nodes);
|
|
992
|
+
// `string & {}` and friends keep literal completions in unions.
|
|
993
|
+
let noSupertypeReduction = false;
|
|
994
|
+
if (types.length === 2) {
|
|
995
|
+
const emptyIndex = types.indexOf(c.emptyTypeLiteralType);
|
|
996
|
+
if (emptyIndex >= 0) {
|
|
997
|
+
const t = types[1 - emptyIndex]!;
|
|
998
|
+
noSupertypeReduction =
|
|
999
|
+
(t.flags & (TypeFlags.String | TypeFlags.Number | TypeFlags.BigInt)) !== 0 ||
|
|
1000
|
+
((t.flags & TypeFlags.TemplateLiteral) !== 0 && isPatternLiteralType(c, t));
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
c.resolvedTypes.set(
|
|
1004
|
+
node.id,
|
|
1005
|
+
getIntersectionTypeEx(
|
|
1006
|
+
c,
|
|
1007
|
+
types,
|
|
1008
|
+
noSupertypeReduction ? IntersectionFlags.NoSupertypeReduction : IntersectionFlags.None,
|
|
1009
|
+
alias,
|
|
1010
|
+
),
|
|
1011
|
+
);
|
|
1012
|
+
}
|
|
1013
|
+
return c.resolvedTypes.get(node.id)!;
|
|
1014
|
+
}
|
|
1015
|
+
|
|
1016
|
+
function getTypeFromTemplateTypeNode(c: Checker, node: TemplateLiteralTypeNode): Type {
|
|
1017
|
+
if (c.resolvedTypes.get(node.id) === undefined) {
|
|
1018
|
+
const spans = node.templateSpans.nodes;
|
|
1019
|
+
const texts: string[] = [getText(node.head)];
|
|
1020
|
+
const types: Type[] = [];
|
|
1021
|
+
for (const span of spans) {
|
|
1022
|
+
texts.push(getText((span as TemplateLiteralTypeSpan).literal));
|
|
1023
|
+
types.push(getTypeFromTypeNode(c, (span as TemplateLiteralTypeSpan).type));
|
|
1024
|
+
}
|
|
1025
|
+
c.resolvedTypes.set(node.id, getTemplateLiteralType(c, texts, types));
|
|
1026
|
+
}
|
|
1027
|
+
return c.resolvedTypes.get(node.id)!;
|
|
1028
|
+
}
|
|
1029
|
+
|
|
1030
|
+
/** The symbol an identifier resolves to, cached on the identifier. */
|
|
1031
|
+
export function getResolvedSymbolOfIdentifier(c: Checker, node: Node): Symbol {
|
|
1032
|
+
return getResolvedSymbol(c, node);
|
|
1033
|
+
}
|