tsc-ts 0.0.4 → 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 +33 -1
- 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 +3 -2
- package/dist/api/library/ast.generated.d.ts +127 -139
- package/dist/api/library/checker.d.ts +51 -0
- package/dist/api/library/checker.js +318 -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/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 +5 -1
- package/dist/api/library/index.js +4 -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/types.d.ts +14 -1
- package/package.json +12 -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 +141 -167
- package/src/library/ast.ts +4 -1
- package/src/library/checker.ts +384 -0
- package/src/library/diagnostics.ts +72 -0
- package/src/library/disk.ts +73 -0
- package/src/library/errors.ts +26 -0
- package/src/library/host.ts +63 -0
- package/src/library/index.ts +21 -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/types.ts +14 -1
|
@@ -0,0 +1,4517 @@
|
|
|
1
|
+
// Prints syntax trees as source text the way tsgo's printer does: formatting, comments,
|
|
2
|
+
// source maps, generated names and emit helpers.
|
|
3
|
+
import { ArrayLiteralExpression, ArrowFunction, AsExpression, AwaitExpression, BinaryExpression, BindingElement, BindingPattern, Block, BreakStatement, CallExpression, CallSignatureDeclaration, CaseBlock, CaseOrDefaultClause, CatchClause, ClassDeclaration, ClassExpression, ClassStaticBlockDeclaration, ComputedPropertyName, ConditionalExpression, ConditionalTypeNode, ConstructSignatureDeclaration, ConstructorDeclaration, ConstructorTypeNode, ContinueStatement, DebuggerStatement, Decorator, DeleteExpression, DoStatement, ElementAccessExpression, EmptyStatement, EnumDeclaration, EnumMember, ExportAssignment, ExportDeclaration, ExportSpecifier, ExpressionStatement, ExpressionWithTypeArguments, ExternalModuleReference, ForInOrOfStatement, ForStatement, FunctionDeclaration, FunctionExpression, FunctionTypeNode, GetAccessorDeclaration, HeritageClause, Identifier, IfStatement, ImportAttribute, ImportAttributes, ImportClause, ImportDeclaration, ImportEqualsDeclaration, ImportSpecifier, ImportTypeNode, IndexSignatureDeclaration, IndexedAccessTypeNode, InferTypeNode, InterfaceDeclaration, IntersectionTypeNode, JSDocNonNullableType, JSDocNullableType, JSDocOptionalType, JSDocVariadicType, JsxAttribute, JsxAttributes, JsxClosingElement, JsxElement, JsxExpression, JsxFragment, JsxNamespacedName, JsxOpeningElement, JsxSelfClosingElement, JsxSpreadAttribute, JsxText, LabeledStatement, LiteralTypeNode, MappedTypeNode, MetaProperty, MethodDeclaration, MethodSignatureDeclaration, ModuleBlock, ModuleDeclaration, NamedExports, NamedImports, NamedTupleMember, NamespaceExport, NamespaceExportDeclaration, NamespaceImport, NewExpression, NonNullExpression, NumericLiteral, ObjectLiteralExpression, OptionalTypeNode, ParameterDeclaration, ParenthesizedExpression, ParenthesizedTypeNode, PartiallyEmittedExpression, PostfixUnaryExpression, PrefixUnaryExpression, PrivateIdentifier, PropertyAccessExpression, PropertyAssignment, PropertyDeclaration, PropertySignatureDeclaration, QualifiedName, RestTypeNode, ReturnStatement, SatisfiesExpression, SetAccessorDeclaration, ShorthandPropertyAssignment, SourceFile, SpreadAssignment, SpreadElement, StringLiteral, SwitchStatement, TaggedTemplateExpression, TemplateExpression, TemplateLiteralTypeNode, TemplateLiteralTypeSpan, TemplateSpan, ThrowStatement, TryStatement, TupleTypeNode, TypeAliasDeclaration, TypeAssertion, TypeLiteralNode, TypeOfExpression, TypeOperatorNode, TypeParameterDeclaration, TypePredicateNode, TypeQueryNode, TypeReferenceNode, UnionTypeNode, VariableDeclaration, VariableDeclarationList, VariableStatement, VoidExpression, WhileStatement, WithStatement, YieldExpression, ArrayTypeNode, getName, getParameters, getTypeParameters, getTypeArguments, getArguments, getElements, getProperties, getStatements, getModifiers, } from '../ast.js';
|
|
4
|
+
import { computeLineOfPosition, computeLineStarts, getLeadingCommentRanges, getShebang, getTrailingCommentRanges, skipTrivia, tokenToString, } from '../scanner.js';
|
|
5
|
+
import { ScriptTarget } from '../options.js';
|
|
6
|
+
import { fileExtensionIs } from '../path.js';
|
|
7
|
+
import { isWhiteSpaceLike } from '../character-codes.js';
|
|
8
|
+
import { EmitContext, compareEmitHelpers } from './emit-context.js';
|
|
9
|
+
import { NameGenerator, NameGeneratorHost, isFileLevelUniqueName } from './name-generator.js';
|
|
10
|
+
import { TextWriter } from './text-writer.js';
|
|
11
|
+
import { blockScopeFlags, calculateIndent, escapeString, getExpressionPrecedence, getLeftmostExpression, getLinesBetweenPositions, getLiteralText, getPreviousNonWhitespacePosition, getSourceFileOfNode, getSourceTextOfNode, getStartPositionOfRange, getTypeNodePrecedence, isBinaryOperation, isExpression, isImmediatelyInvokedFunctionExpressionOrArrowFunction, isJSDocKind, isJSDocLikeText, isKeywordKind, isLineBreakChar, isLiteralKind, isMemberName, isModifier, isNewExpressionWithoutArguments, isOptionalChain, isParseTreeNode, isPinnedComment, isPrologueDirective, isPunctuationKind, isRecognizedTripleSlashComment, isStatement, isTypeNodeKind, mixingBinaryOperatorsRequiresParentheses, nodeIsSynthesized, positionIsSynthesized, skipPartiallyEmittedExpressions, skipSynthesizedParentheses, trimUnicodeSpace, } from './utilities.js';
|
|
12
|
+
export class PrinterOptions {
|
|
13
|
+
removeComments;
|
|
14
|
+
/** `"\n"` or `"\r\n"`. */
|
|
15
|
+
newLine;
|
|
16
|
+
noEmitHelpers;
|
|
17
|
+
target;
|
|
18
|
+
sourceMap;
|
|
19
|
+
inlineSourceMap;
|
|
20
|
+
inlineSources;
|
|
21
|
+
omitBraceSourceMapPositions;
|
|
22
|
+
/** Only keep JSDoc-style and pinned comments (declaration emit). */
|
|
23
|
+
onlyPrintJSDocStyle;
|
|
24
|
+
neverAsciiEscape;
|
|
25
|
+
preserveSourceNewlines;
|
|
26
|
+
terminateUnterminatedLiterals;
|
|
27
|
+
constructor() {
|
|
28
|
+
this.removeComments = false;
|
|
29
|
+
this.newLine = '\n';
|
|
30
|
+
this.noEmitHelpers = false;
|
|
31
|
+
this.target = ScriptTarget.ES5;
|
|
32
|
+
this.sourceMap = false;
|
|
33
|
+
this.inlineSourceMap = false;
|
|
34
|
+
this.inlineSources = false;
|
|
35
|
+
this.omitBraceSourceMapPositions = false;
|
|
36
|
+
this.onlyPrintJSDocStyle = false;
|
|
37
|
+
this.neverAsciiEscape = false;
|
|
38
|
+
this.preserveSourceNewlines = false;
|
|
39
|
+
this.terminateUnterminatedLiterals = false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export class Printer extends NameGeneratorHost {
|
|
43
|
+
options;
|
|
44
|
+
context;
|
|
45
|
+
/**
|
|
46
|
+
* Generates the names of the printed file, created when first needed: it refers back to the printer (its host),
|
|
47
|
+
* and printing a type node never generates names.
|
|
48
|
+
*/
|
|
49
|
+
nameGeneratorStore = undefined;
|
|
50
|
+
currentSourceFile;
|
|
51
|
+
sourceText;
|
|
52
|
+
lineStarts;
|
|
53
|
+
writer;
|
|
54
|
+
ownWriter;
|
|
55
|
+
uniqueHelperNames;
|
|
56
|
+
externalHelpersModuleName;
|
|
57
|
+
nextListElementPos;
|
|
58
|
+
containerPos;
|
|
59
|
+
containerEnd;
|
|
60
|
+
declarationListContainerEnd;
|
|
61
|
+
/** Pairs of (node pos, end of its detached comments). */
|
|
62
|
+
detachedComments;
|
|
63
|
+
commentsDisabled;
|
|
64
|
+
/** Emitting the `extends` clause of a conditional or infer type. */
|
|
65
|
+
inExtends;
|
|
66
|
+
/** Saved comment state: emit flags, comment pos, comment end, container pos, container end, declaration list end. */
|
|
67
|
+
commentStack;
|
|
68
|
+
/** Saved source map state: emit flags, pos, end, has token range. */
|
|
69
|
+
sourceMapStack;
|
|
70
|
+
/** The token position after `enterToken` skipped trivia. */
|
|
71
|
+
tokenPos;
|
|
72
|
+
sourceMapsDisabled;
|
|
73
|
+
sourceMapGenerator;
|
|
74
|
+
sourceMapSource;
|
|
75
|
+
sourceMapSourceIndex;
|
|
76
|
+
sourceMapSourceIsJson;
|
|
77
|
+
sourceMapLineStarts;
|
|
78
|
+
/** The line of the last source map position, where finding the next one's starts. */
|
|
79
|
+
sourceMapLine;
|
|
80
|
+
mostRecentSourceMapSource;
|
|
81
|
+
mostRecentSourceMapSourceIndex;
|
|
82
|
+
get nameGenerator() {
|
|
83
|
+
let generator = this.nameGeneratorStore;
|
|
84
|
+
if (generator === undefined) {
|
|
85
|
+
generator = new NameGenerator(this.context, this);
|
|
86
|
+
this.nameGeneratorStore = generator;
|
|
87
|
+
}
|
|
88
|
+
return generator;
|
|
89
|
+
}
|
|
90
|
+
constructor(options, context) {
|
|
91
|
+
super();
|
|
92
|
+
this.options = options;
|
|
93
|
+
this.context = context === undefined ? new EmitContext() : context;
|
|
94
|
+
this.currentSourceFile = undefined;
|
|
95
|
+
this.sourceText = '';
|
|
96
|
+
this.lineStarts = [];
|
|
97
|
+
this.writer = new TextWriter(options.newLine, 4);
|
|
98
|
+
this.ownWriter = undefined;
|
|
99
|
+
this.uniqueHelperNames = undefined;
|
|
100
|
+
this.externalHelpersModuleName = undefined;
|
|
101
|
+
this.nextListElementPos = 0;
|
|
102
|
+
this.containerPos = -1;
|
|
103
|
+
this.containerEnd = -1;
|
|
104
|
+
this.declarationListContainerEnd = -1;
|
|
105
|
+
this.detachedComments = [];
|
|
106
|
+
this.commentsDisabled = options.removeComments;
|
|
107
|
+
this.inExtends = false;
|
|
108
|
+
this.commentStack = [];
|
|
109
|
+
this.sourceMapStack = [];
|
|
110
|
+
this.tokenPos = 0;
|
|
111
|
+
this.sourceMapsDisabled = true;
|
|
112
|
+
this.sourceMapGenerator = undefined;
|
|
113
|
+
this.sourceMapSource = undefined;
|
|
114
|
+
this.sourceMapSourceIndex = -1;
|
|
115
|
+
this.sourceMapSourceIsJson = false;
|
|
116
|
+
this.sourceMapLineStarts = [];
|
|
117
|
+
this.sourceMapLine = 0;
|
|
118
|
+
this.mostRecentSourceMapSource = undefined;
|
|
119
|
+
this.mostRecentSourceMapSourceIndex = -1;
|
|
120
|
+
}
|
|
121
|
+
// Entry points
|
|
122
|
+
/** Prints `node` (in the context of `sourceFile`, if given) and returns the text. */
|
|
123
|
+
emit(node, sourceFile) {
|
|
124
|
+
let writer = this.ownWriter;
|
|
125
|
+
if (writer === undefined) {
|
|
126
|
+
writer = new TextWriter(this.options.newLine, 4);
|
|
127
|
+
this.ownWriter = writer;
|
|
128
|
+
}
|
|
129
|
+
this.write(node, sourceFile, writer, undefined);
|
|
130
|
+
const text = writer.getText();
|
|
131
|
+
writer.clear();
|
|
132
|
+
return text;
|
|
133
|
+
}
|
|
134
|
+
emitSourceFile(sourceFile) {
|
|
135
|
+
return this.emit(sourceFile, sourceFile);
|
|
136
|
+
}
|
|
137
|
+
setSourceFile(sourceFile) {
|
|
138
|
+
this.setCurrentSourceFile(sourceFile);
|
|
139
|
+
this.uniqueHelperNames = undefined;
|
|
140
|
+
this.externalHelpersModuleName = undefined;
|
|
141
|
+
if (sourceFile !== undefined) {
|
|
142
|
+
if ((this.context.getEmitFlags(this.context.mostOriginal(sourceFile)) & 262144 /* EmitFlags.ExternalHelpers */) !== 0)
|
|
143
|
+
this.uniqueHelperNames = new Map();
|
|
144
|
+
this.externalHelpersModuleName = this.context.getExternalHelpersModuleName(sourceFile);
|
|
145
|
+
this.setSourceMapSource(sourceFile);
|
|
146
|
+
}
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
setCurrentSourceFile(sourceFile) {
|
|
150
|
+
this.currentSourceFile = sourceFile;
|
|
151
|
+
this.sourceText = sourceFile === undefined ? '' : sourceFile.text;
|
|
152
|
+
this.lineStarts = sourceFile === undefined ? [] : sourceFile.lineStarts();
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
/** Prints `node` into `writer`, adding mappings to `sourceMapGenerator` if given. */
|
|
156
|
+
write(node, sourceFile, writer, sourceMapGenerator) {
|
|
157
|
+
const savedSourceFile = this.currentSourceFile;
|
|
158
|
+
const savedWriter = this.writer;
|
|
159
|
+
const savedUniqueHelperNames = this.uniqueHelperNames;
|
|
160
|
+
const savedSourceMapsDisabled = this.sourceMapsDisabled;
|
|
161
|
+
const savedGenerator = this.sourceMapGenerator;
|
|
162
|
+
const savedSource = this.sourceMapSource;
|
|
163
|
+
const savedSourceIndex = this.sourceMapSourceIndex;
|
|
164
|
+
const savedSourceLineStarts = this.sourceMapLineStarts;
|
|
165
|
+
this.sourceMapsDisabled = sourceMapGenerator === undefined;
|
|
166
|
+
this.sourceMapGenerator = sourceMapGenerator;
|
|
167
|
+
this.sourceMapSource = undefined;
|
|
168
|
+
this.sourceMapSourceIndex = -1;
|
|
169
|
+
this.sourceMapLineStarts = [];
|
|
170
|
+
this.sourceMapLine = 0;
|
|
171
|
+
this.setSourceFile(sourceFile);
|
|
172
|
+
this.writer = writer;
|
|
173
|
+
writer.clear();
|
|
174
|
+
writer.trackColumns = sourceMapGenerator !== undefined;
|
|
175
|
+
this.emitAnyNode(node);
|
|
176
|
+
this.setCurrentSourceFile(savedSourceFile);
|
|
177
|
+
this.writer = savedWriter;
|
|
178
|
+
this.uniqueHelperNames = savedUniqueHelperNames;
|
|
179
|
+
this.sourceMapsDisabled = savedSourceMapsDisabled;
|
|
180
|
+
this.sourceMapGenerator = savedGenerator;
|
|
181
|
+
this.sourceMapSource = savedSource;
|
|
182
|
+
this.sourceMapSourceIndex = savedSourceIndex;
|
|
183
|
+
this.sourceMapLineStarts = savedSourceLineStarts;
|
|
184
|
+
this.sourceMapLine = 0;
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
// Text of nodes
|
|
188
|
+
isFileLevelUniqueName(name) {
|
|
189
|
+
const file = this.currentSourceFile;
|
|
190
|
+
return file === undefined || isFileLevelUniqueName(file, name);
|
|
191
|
+
}
|
|
192
|
+
getLiteralTextOfNode(node, sourceFile, flags) {
|
|
193
|
+
if (node instanceof StringLiteral) {
|
|
194
|
+
const textSource = this.context.textSource.get(node);
|
|
195
|
+
if (textSource !== undefined) {
|
|
196
|
+
let text;
|
|
197
|
+
if (textSource instanceof NumericLiteral)
|
|
198
|
+
text = textSource.text;
|
|
199
|
+
else if (textSource instanceof Identifier ||
|
|
200
|
+
textSource instanceof PrivateIdentifier ||
|
|
201
|
+
textSource instanceof JsxNamespacedName)
|
|
202
|
+
text = this.getTextOfNode(textSource);
|
|
203
|
+
else
|
|
204
|
+
return this.getLiteralTextOfNode(textSource, getSourceFileOfNode(textSource), flags);
|
|
205
|
+
if ((flags & 2 /* LiteralTextFlags.JsxAttributeEscape */) !== 0)
|
|
206
|
+
return ('"' +
|
|
207
|
+
escapeString(text, 0x22, 2 /* LiteralTextFlags.JsxAttributeEscape */ | 1 /* LiteralTextFlags.NeverAsciiEscape */) +
|
|
208
|
+
'"');
|
|
209
|
+
if ((flags & 1 /* LiteralTextFlags.NeverAsciiEscape */) !== 0 ||
|
|
210
|
+
(this.context.getEmitFlags(node) & 131072 /* EmitFlags.NoAsciiEscaping */) !== 0)
|
|
211
|
+
return '"' + escapeString(text, 0x22, 1 /* LiteralTextFlags.NeverAsciiEscape */) + '"';
|
|
212
|
+
return '"' + escapeString(text, 0x22, 0 /* LiteralTextFlags.None */) + '"';
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if ((this.context.getEmitFlags(node) & 131072 /* EmitFlags.NoAsciiEscaping */) !== 0)
|
|
216
|
+
flags |= 1 /* LiteralTextFlags.NeverAsciiEscape */;
|
|
217
|
+
if (this.options.target >= ScriptTarget.ES2021)
|
|
218
|
+
flags |= 8 /* LiteralTextFlags.AllowNumericSeparator */;
|
|
219
|
+
const file = sourceFile === undefined ? this.currentSourceFile : sourceFile;
|
|
220
|
+
return getLiteralText(node, file === undefined ? undefined : file.text, flags);
|
|
221
|
+
}
|
|
222
|
+
/** The text of an identifier, private identifier, literal or JSX namespaced name as printed. */
|
|
223
|
+
getTextOfNode(node) {
|
|
224
|
+
if ((node instanceof Identifier || node instanceof PrivateIdentifier) && this.context.autoGenerate.has(node))
|
|
225
|
+
return this.nameGenerator.generateName(node);
|
|
226
|
+
if (node instanceof StringLiteral) {
|
|
227
|
+
const textSource = this.context.textSource.get(node);
|
|
228
|
+
if (textSource !== undefined)
|
|
229
|
+
return this.getTextOfNode(textSource);
|
|
230
|
+
}
|
|
231
|
+
const file = this.currentSourceFile;
|
|
232
|
+
const canUseSourceFile = file !== undefined && node.parent !== undefined && !nodeIsSynthesized(node);
|
|
233
|
+
switch (node.kind) {
|
|
234
|
+
case 79 /* SyntaxKind.Identifier */:
|
|
235
|
+
case 80 /* SyntaxKind.PrivateIdentifier */:
|
|
236
|
+
case 296 /* SyntaxKind.JsxNamespacedName */:
|
|
237
|
+
if (!canUseSourceFile || !this.isInCurrentSourceFile(node)) {
|
|
238
|
+
if (node instanceof Identifier)
|
|
239
|
+
return node.text;
|
|
240
|
+
if (node instanceof PrivateIdentifier)
|
|
241
|
+
return node.text;
|
|
242
|
+
if (node instanceof JsxNamespacedName)
|
|
243
|
+
return node.namespace.text + ':' + node.name.text;
|
|
244
|
+
}
|
|
245
|
+
break;
|
|
246
|
+
case 10 /* SyntaxKind.StringLiteral */:
|
|
247
|
+
case 8 /* SyntaxKind.NumericLiteral */:
|
|
248
|
+
case 9 /* SyntaxKind.BigIntLiteral */:
|
|
249
|
+
case 14 /* SyntaxKind.NoSubstitutionTemplateLiteral */:
|
|
250
|
+
case 15 /* SyntaxKind.TemplateHead */:
|
|
251
|
+
case 16 /* SyntaxKind.TemplateMiddle */:
|
|
252
|
+
case 17 /* SyntaxKind.TemplateTail */:
|
|
253
|
+
return this.getLiteralTextOfNode(node, undefined, 0 /* LiteralTextFlags.None */);
|
|
254
|
+
default:
|
|
255
|
+
throw new Error('Unexpected node kind ' + node.kind);
|
|
256
|
+
}
|
|
257
|
+
return getSourceTextOfNode(this.sourceText, node);
|
|
258
|
+
}
|
|
259
|
+
isInCurrentSourceFile(node) {
|
|
260
|
+
const file = this.currentSourceFile;
|
|
261
|
+
if (file === undefined)
|
|
262
|
+
return false;
|
|
263
|
+
const original = this.context.mostOriginal(file);
|
|
264
|
+
const own = getSourceFileOfNode(node);
|
|
265
|
+
return own !== undefined && own === original;
|
|
266
|
+
}
|
|
267
|
+
// Low-level writing
|
|
268
|
+
write1(text) {
|
|
269
|
+
return this.writer.write(text);
|
|
270
|
+
}
|
|
271
|
+
space() {
|
|
272
|
+
return this.writer.write(' ');
|
|
273
|
+
}
|
|
274
|
+
line() {
|
|
275
|
+
return this.writer.writeLine(false);
|
|
276
|
+
}
|
|
277
|
+
lines(count) {
|
|
278
|
+
for (let i = 0; i < count; i++)
|
|
279
|
+
this.writer.writeLine(false);
|
|
280
|
+
return count > 0;
|
|
281
|
+
}
|
|
282
|
+
indentIf(condition, delta) {
|
|
283
|
+
if (condition)
|
|
284
|
+
this.writer.indent += delta;
|
|
285
|
+
return condition;
|
|
286
|
+
}
|
|
287
|
+
writeLinesOfText(text) {
|
|
288
|
+
const lines = splitLines(text);
|
|
289
|
+
const indentation = guessIndentation(lines);
|
|
290
|
+
for (const text of lines) {
|
|
291
|
+
const line = indentation > 0 ? text.substring(indentation) : text;
|
|
292
|
+
if (line.length > 0) {
|
|
293
|
+
this.line();
|
|
294
|
+
this.write1(line);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return true;
|
|
298
|
+
}
|
|
299
|
+
writeLineOrSpace(parent, prev, next) {
|
|
300
|
+
if (this.shouldEmitOnSingleLine(parent))
|
|
301
|
+
return this.space();
|
|
302
|
+
if (this.options.preserveSourceNewlines) {
|
|
303
|
+
const lines = this.getLinesBetweenNodes(parent, prev, next);
|
|
304
|
+
return lines > 0 ? this.lines(lines) : this.space();
|
|
305
|
+
}
|
|
306
|
+
return this.line();
|
|
307
|
+
}
|
|
308
|
+
writeLinesAndIndent(lineCount, writeSpaceIfNotIndenting) {
|
|
309
|
+
if (lineCount > 0) {
|
|
310
|
+
this.writer.indent++;
|
|
311
|
+
this.lines(lineCount);
|
|
312
|
+
}
|
|
313
|
+
else if (writeSpaceIfNotIndenting)
|
|
314
|
+
this.space();
|
|
315
|
+
return true;
|
|
316
|
+
}
|
|
317
|
+
writeLineSeparatorsAndIndentBefore(node, parent) {
|
|
318
|
+
if (this.options.preserveSourceNewlines) {
|
|
319
|
+
const leading = this.getLeadingLineTerminatorCount(parent, node, 0 /* ListFormat.None */);
|
|
320
|
+
if (leading > 0) {
|
|
321
|
+
this.writeLinesAndIndent(leading, false);
|
|
322
|
+
return true;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return false;
|
|
326
|
+
}
|
|
327
|
+
writeLineSeparatorsAfter(node, parent) {
|
|
328
|
+
if (this.options.preserveSourceNewlines)
|
|
329
|
+
return this.lines(this.getClosingLineTerminatorCount(parent, node, 0 /* ListFormat.None */, -1));
|
|
330
|
+
return false;
|
|
331
|
+
}
|
|
332
|
+
// Lines between nodes
|
|
333
|
+
positionsAreOnSameLine(pos1, pos2) {
|
|
334
|
+
return getLinesBetweenPositions(this.lineStarts, pos1, pos2) === 0;
|
|
335
|
+
}
|
|
336
|
+
rangeStart(pos) {
|
|
337
|
+
return getStartPositionOfRange(this.sourceText, pos, false);
|
|
338
|
+
}
|
|
339
|
+
rangeIsOnSingleLine(node) {
|
|
340
|
+
return this.positionsAreOnSameLine(this.rangeStart(node.pos), node.end);
|
|
341
|
+
}
|
|
342
|
+
rangeEndIsOnSameLineAsRangeStart(end, start) {
|
|
343
|
+
return this.positionsAreOnSameLine(end, this.rangeStart(start));
|
|
344
|
+
}
|
|
345
|
+
getEffectiveLinesBetweenEndAndStart(end, start) {
|
|
346
|
+
const lines = getLinesBetweenPositions(this.lineStarts, end, getStartPositionOfRange(this.sourceText, start, true));
|
|
347
|
+
if (lines !== 0)
|
|
348
|
+
return lines;
|
|
349
|
+
return getLinesBetweenPositions(this.lineStarts, end, getStartPositionOfRange(this.sourceText, start, false));
|
|
350
|
+
}
|
|
351
|
+
getLinesBetweenNodes(parent, node1, node2) {
|
|
352
|
+
if (this.shouldElideIndentation(parent))
|
|
353
|
+
return 0;
|
|
354
|
+
parent = skipSynthesizedParentheses(parent);
|
|
355
|
+
node1 = skipSynthesizedParentheses(node1);
|
|
356
|
+
node2 = skipSynthesizedParentheses(node2);
|
|
357
|
+
if (this.shouldEmitOnNewLine(node2, 0 /* ListFormat.None */))
|
|
358
|
+
return 1;
|
|
359
|
+
if (this.currentSourceFile !== undefined &&
|
|
360
|
+
!nodeIsSynthesized(parent) &&
|
|
361
|
+
!nodeIsSynthesized(node1) &&
|
|
362
|
+
!nodeIsSynthesized(node2)) {
|
|
363
|
+
if (this.options.preserveSourceNewlines)
|
|
364
|
+
return this.getEffectiveLinesBetweenEndAndStart(node1.end, node2.pos);
|
|
365
|
+
return this.rangeEndIsOnSameLineAsRangeStart(node1.end, node2.pos) ? 0 : 1;
|
|
366
|
+
}
|
|
367
|
+
return 0;
|
|
368
|
+
}
|
|
369
|
+
linesToPrecedingNonWhitespace(pos, stopPos, includeComments) {
|
|
370
|
+
const start = skipTrivia(this.sourceText, pos, false, includeComments);
|
|
371
|
+
const prev = getPreviousNonWhitespacePosition(this.sourceText, start, stopPos);
|
|
372
|
+
return getLinesBetweenPositions(this.lineStarts, prev >= 0 ? prev : stopPos, start);
|
|
373
|
+
}
|
|
374
|
+
linesToNextNonWhitespace(pos, stopPos, includeComments) {
|
|
375
|
+
const next = skipTrivia(this.sourceText, pos, false, includeComments);
|
|
376
|
+
return getLinesBetweenPositions(this.lineStarts, pos, stopPos < next ? stopPos : next);
|
|
377
|
+
}
|
|
378
|
+
getLeadingLineTerminatorCount(parent, firstChild, format) {
|
|
379
|
+
if ((format & 2 /* ListFormat.PreserveLines */) !== 0 || this.options.preserveSourceNewlines) {
|
|
380
|
+
if ((format & 65536 /* ListFormat.PreferNewLine */) !== 0)
|
|
381
|
+
return 1;
|
|
382
|
+
if (firstChild === undefined)
|
|
383
|
+
return parent === undefined || (this.currentSourceFile !== undefined && this.rangeIsOnSingleLine(parent))
|
|
384
|
+
? 0
|
|
385
|
+
: 1;
|
|
386
|
+
if (this.nextListElementPos > 0 && firstChild.pos === this.nextListElementPos)
|
|
387
|
+
return 0;
|
|
388
|
+
if (firstChild.kind === 11 /* SyntaxKind.JsxText */)
|
|
389
|
+
return 0;
|
|
390
|
+
if (this.currentSourceFile !== undefined &&
|
|
391
|
+
parent !== undefined &&
|
|
392
|
+
!positionIsSynthesized(parent.pos) &&
|
|
393
|
+
!nodeIsSynthesized(firstChild) &&
|
|
394
|
+
firstChild.parent === undefined) {
|
|
395
|
+
if (this.options.preserveSourceNewlines) {
|
|
396
|
+
const lines = this.linesToPrecedingNonWhitespace(firstChild.pos, parent.pos, true);
|
|
397
|
+
return lines !== 0 ? lines : this.linesToPrecedingNonWhitespace(firstChild.pos, parent.pos, false);
|
|
398
|
+
}
|
|
399
|
+
return this.positionsAreOnSameLine(this.rangeStart(parent.pos), this.rangeStart(firstChild.pos)) ? 0 : 1;
|
|
400
|
+
}
|
|
401
|
+
if (this.shouldEmitOnNewLine(firstChild, format))
|
|
402
|
+
return 1;
|
|
403
|
+
}
|
|
404
|
+
return (format & 1 /* ListFormat.MultiLine */) !== 0 ? 1 : 0;
|
|
405
|
+
}
|
|
406
|
+
getSeparatingLineTerminatorCount(previous, next, format) {
|
|
407
|
+
if ((format & 2 /* ListFormat.PreserveLines */) !== 0 || this.options.preserveSourceNewlines) {
|
|
408
|
+
if (previous === undefined || next === undefined)
|
|
409
|
+
return 0;
|
|
410
|
+
if (next.kind === 11 /* SyntaxKind.JsxText */)
|
|
411
|
+
return 0;
|
|
412
|
+
if (this.currentSourceFile !== undefined && !nodeIsSynthesized(previous) && !nodeIsSynthesized(next)) {
|
|
413
|
+
if (this.options.preserveSourceNewlines && this.siblingNodePositionsAreComparable(previous, next))
|
|
414
|
+
return this.getEffectiveLinesBetweenEndAndStart(previous.end, next.pos);
|
|
415
|
+
if (!this.options.preserveSourceNewlines && this.originalNodesHaveSameParent(previous, next))
|
|
416
|
+
return this.rangeEndIsOnSameLineAsRangeStart(previous.end, next.pos) ? 0 : 1;
|
|
417
|
+
return (format & 65536 /* ListFormat.PreferNewLine */) !== 0 ? 1 : 0;
|
|
418
|
+
}
|
|
419
|
+
if (this.shouldEmitOnNewLine(previous, format) || this.shouldEmitOnNewLine(next, format))
|
|
420
|
+
return 1;
|
|
421
|
+
}
|
|
422
|
+
else if (next !== undefined && this.shouldEmitOnNewLine(next, 0 /* ListFormat.None */))
|
|
423
|
+
return 1;
|
|
424
|
+
return (format & 1 /* ListFormat.MultiLine */) !== 0 ? 1 : 0;
|
|
425
|
+
}
|
|
426
|
+
getClosingLineTerminatorCount(parent, lastChild, format, childrenEnd) {
|
|
427
|
+
if ((format & 2 /* ListFormat.PreserveLines */) !== 0 || this.options.preserveSourceNewlines) {
|
|
428
|
+
if ((format & 65536 /* ListFormat.PreferNewLine */) !== 0)
|
|
429
|
+
return 1;
|
|
430
|
+
if (lastChild === undefined)
|
|
431
|
+
return parent === undefined || (this.currentSourceFile !== undefined && this.rangeIsOnSingleLine(parent))
|
|
432
|
+
? 0
|
|
433
|
+
: 1;
|
|
434
|
+
if (this.currentSourceFile !== undefined &&
|
|
435
|
+
parent !== undefined &&
|
|
436
|
+
!positionIsSynthesized(parent.pos) &&
|
|
437
|
+
!nodeIsSynthesized(lastChild) &&
|
|
438
|
+
(lastChild.parent === undefined || lastChild.parent === parent)) {
|
|
439
|
+
if (this.options.preserveSourceNewlines) {
|
|
440
|
+
const end = childrenEnd > lastChild.end ? childrenEnd : lastChild.end;
|
|
441
|
+
const lines = this.linesToNextNonWhitespace(end, parent.end, true);
|
|
442
|
+
return lines !== 0 ? lines : this.linesToNextNonWhitespace(end, parent.end, false);
|
|
443
|
+
}
|
|
444
|
+
return this.positionsAreOnSameLine(parent.end, lastChild.end) ? 0 : 1;
|
|
445
|
+
}
|
|
446
|
+
if (this.shouldEmitOnNewLine(lastChild, format))
|
|
447
|
+
return 1;
|
|
448
|
+
}
|
|
449
|
+
if ((format & 1 /* ListFormat.MultiLine */) !== 0 && (format & 131072 /* ListFormat.NoTrailingNewLine */) === 0)
|
|
450
|
+
return 1;
|
|
451
|
+
return 0;
|
|
452
|
+
}
|
|
453
|
+
siblingNodePositionsAreComparable(previous, next) {
|
|
454
|
+
if (next.pos < previous.end)
|
|
455
|
+
return false;
|
|
456
|
+
previous = this.context.mostOriginal(previous);
|
|
457
|
+
next = this.context.mostOriginal(next);
|
|
458
|
+
const parent = previous.parent;
|
|
459
|
+
if (parent === undefined || parent !== next.parent)
|
|
460
|
+
return false;
|
|
461
|
+
const list = getContainingNodeArray(previous);
|
|
462
|
+
if (list === undefined)
|
|
463
|
+
return false;
|
|
464
|
+
const index = list.nodes.indexOf(previous);
|
|
465
|
+
return index >= 0 && list.nodes.indexOf(next) === index + 1;
|
|
466
|
+
}
|
|
467
|
+
originalNodesHaveSameParent(a, b) {
|
|
468
|
+
a = this.context.mostOriginal(a);
|
|
469
|
+
if (a.parent === undefined)
|
|
470
|
+
return false;
|
|
471
|
+
return a.parent === this.context.mostOriginal(b).parent;
|
|
472
|
+
}
|
|
473
|
+
// Comment text
|
|
474
|
+
writeCommentRange(comment) {
|
|
475
|
+
if (this.currentSourceFile === undefined)
|
|
476
|
+
return false;
|
|
477
|
+
return this.writeCommentText(this.sourceText, this.lineStarts, comment.kind, comment.pos, comment.end);
|
|
478
|
+
}
|
|
479
|
+
writeCommentText(text, lineStarts, kind, pos, end) {
|
|
480
|
+
if (kind !== 3 /* SyntaxKind.MultiLineCommentTrivia */)
|
|
481
|
+
return this.writer.writeComment(text.substring(pos, end));
|
|
482
|
+
const writer = this.writer;
|
|
483
|
+
const firstLine = computeLineOfPosition(lineStarts, pos);
|
|
484
|
+
const lineCount = lineStarts.length;
|
|
485
|
+
let firstCommentLineIndent = -1;
|
|
486
|
+
const start = pos;
|
|
487
|
+
for (let currentLine = firstLine; pos < end; currentLine++) {
|
|
488
|
+
const nextLineStart = currentLine + 1 === lineCount ? text.length + 1 : lineStarts[currentLine + 1] | 0;
|
|
489
|
+
if (pos !== start) {
|
|
490
|
+
if (firstCommentLineIndent === -1)
|
|
491
|
+
firstCommentLineIndent = calculateIndent(text, lineStarts[firstLine] | 0, start);
|
|
492
|
+
const spacesToEmit = writer.indent * 4 - firstCommentLineIndent + calculateIndent(text, pos, nextLineStart);
|
|
493
|
+
if (spacesToEmit > 0) {
|
|
494
|
+
const singleSpaces = spacesToEmit & 3;
|
|
495
|
+
writer.rawWrite(' '.repeat(spacesToEmit - singleSpaces));
|
|
496
|
+
for (let i = 0; i < singleSpaces; i++)
|
|
497
|
+
writer.rawWrite(' ');
|
|
498
|
+
}
|
|
499
|
+
else
|
|
500
|
+
writer.rawWrite('');
|
|
501
|
+
}
|
|
502
|
+
// Line starts split at every line break, so only the end of the line can hold one.
|
|
503
|
+
let lineEnd = end < nextLineStart ? end : nextLineStart;
|
|
504
|
+
while (lineEnd > pos && isLineBreakChar(text.charCodeAt(lineEnd - 1)))
|
|
505
|
+
lineEnd -= 1;
|
|
506
|
+
const lineText = trimUnicodeSpace(text, pos, lineEnd);
|
|
507
|
+
if (lineText.length > 0) {
|
|
508
|
+
writer.writeComment(lineText);
|
|
509
|
+
if (lineEnd !== end)
|
|
510
|
+
writer.writeLine(false);
|
|
511
|
+
}
|
|
512
|
+
else
|
|
513
|
+
writer.writeLine(true);
|
|
514
|
+
pos = nextLineStart;
|
|
515
|
+
}
|
|
516
|
+
return true;
|
|
517
|
+
}
|
|
518
|
+
// Emit flags
|
|
519
|
+
shouldEmitComments(node) {
|
|
520
|
+
return !this.commentsDisabled && this.currentSourceFile !== undefined && node.kind !== 307 /* SyntaxKind.SourceFile */;
|
|
521
|
+
}
|
|
522
|
+
shouldWriteComment(comment) {
|
|
523
|
+
return (!this.options.onlyPrintJSDocStyle ||
|
|
524
|
+
(this.currentSourceFile !== undefined &&
|
|
525
|
+
(isJSDocLikeText(this.sourceText, comment) || isPinnedComment(this.sourceText, comment))));
|
|
526
|
+
}
|
|
527
|
+
hasEmitFlag(node, flag) {
|
|
528
|
+
return (this.context.getEmitFlags(node) & flag) !== 0;
|
|
529
|
+
}
|
|
530
|
+
shouldEmitIndented(node) {
|
|
531
|
+
return this.hasEmitFlag(node, 8192 /* EmitFlags.Indented */);
|
|
532
|
+
}
|
|
533
|
+
shouldElideIndentation(node) {
|
|
534
|
+
return this.hasEmitFlag(node, 16384 /* EmitFlags.NoIndentation */);
|
|
535
|
+
}
|
|
536
|
+
shouldEmitOnSingleLine(node) {
|
|
537
|
+
return this.hasEmitFlag(node, 1 /* EmitFlags.SingleLine */);
|
|
538
|
+
}
|
|
539
|
+
shouldEmitOnNewLine(node, format) {
|
|
540
|
+
return this.hasEmitFlag(node, 524288 /* EmitFlags.StartOnNewLine */) || (format & 65536 /* ListFormat.PreferNewLine */) !== 0;
|
|
541
|
+
}
|
|
542
|
+
shouldEmitBlockFunctionBodyOnSingleLine(body) {
|
|
543
|
+
if (this.shouldEmitOnSingleLine(body))
|
|
544
|
+
return true;
|
|
545
|
+
if (body.multiLine)
|
|
546
|
+
return false;
|
|
547
|
+
if (!nodeIsSynthesized(body) && this.currentSourceFile !== undefined && !this.rangeIsOnSingleLine(body))
|
|
548
|
+
return false;
|
|
549
|
+
const statements = body.statements.nodes;
|
|
550
|
+
if (this.getLeadingLineTerminatorCount(body, statements.length > 0 ? statements[0] : undefined, 2 /* ListFormat.PreserveLines */) > 0 ||
|
|
551
|
+
this.getClosingLineTerminatorCount(body, statements.length > 0 ? statements[statements.length - 1] : undefined, 2 /* ListFormat.PreserveLines */, body.statements.end) > 0)
|
|
552
|
+
return false;
|
|
553
|
+
let previous = undefined;
|
|
554
|
+
for (const statement of statements) {
|
|
555
|
+
if (this.getSeparatingLineTerminatorCount(previous, statement, 2 /* ListFormat.PreserveLines */) > 0)
|
|
556
|
+
return false;
|
|
557
|
+
previous = statement;
|
|
558
|
+
}
|
|
559
|
+
return true;
|
|
560
|
+
}
|
|
561
|
+
shouldEmitSourceMaps(node) {
|
|
562
|
+
return (!this.sourceMapsDisabled &&
|
|
563
|
+
this.sourceMapSource !== undefined &&
|
|
564
|
+
node.kind !== 307 /* SyntaxKind.SourceFile */ &&
|
|
565
|
+
(node.flags & 33554432 /* NodeFlags.JsonFile */) === 0);
|
|
566
|
+
}
|
|
567
|
+
shouldAllowTrailingComma(node) {
|
|
568
|
+
return (this.currentSourceFile !== undefined &&
|
|
569
|
+
this.currentSourceFile.scriptKind !== 6 /* ScriptKind.JSON */ &&
|
|
570
|
+
node.kind === 211 /* SyntaxKind.ObjectLiteralExpression */);
|
|
571
|
+
}
|
|
572
|
+
hasCommentsAtPosition(pos) {
|
|
573
|
+
if (this.currentSourceFile === undefined)
|
|
574
|
+
return false;
|
|
575
|
+
return (getTrailingCommentRanges(this.sourceText, pos + 1) !== undefined ||
|
|
576
|
+
getLeadingCommentRanges(this.sourceText, pos + 1) !== undefined);
|
|
577
|
+
}
|
|
578
|
+
// Tokens
|
|
579
|
+
writeTokenText(token, pos) {
|
|
580
|
+
const text = tokenToString(token);
|
|
581
|
+
this.writer.write(text);
|
|
582
|
+
return pos < 0 ? pos : pos + text.length;
|
|
583
|
+
}
|
|
584
|
+
emitToken(token, pos, contextNode) {
|
|
585
|
+
return this.emitTokenEx(token, pos, contextNode, 0 /* TokenEmitFlags.None */);
|
|
586
|
+
}
|
|
587
|
+
emitTokenEx(token, pos, contextNode, flags) {
|
|
588
|
+
const state = this.enterToken(token, pos, contextNode, flags);
|
|
589
|
+
pos = this.writeTokenText(token, this.tokenPos);
|
|
590
|
+
this.exitToken(token, pos, contextNode, state);
|
|
591
|
+
return pos;
|
|
592
|
+
}
|
|
593
|
+
emitOptionalToken(node) {
|
|
594
|
+
return node !== undefined && this.emitTokenNodeEx(node, 0 /* TokenEmitFlags.None */);
|
|
595
|
+
}
|
|
596
|
+
emitTokenNode(node) {
|
|
597
|
+
return this.emitTokenNodeEx(node, 0 /* TokenEmitFlags.None */);
|
|
598
|
+
}
|
|
599
|
+
emitTokenNodeEx(node, flags) {
|
|
600
|
+
if (!isKeywordKind(node.kind) && !isPunctuationKind(node.kind))
|
|
601
|
+
throw new Error('Unexpected token ' + node.kind);
|
|
602
|
+
const state = this.enterTokenNode(node, flags);
|
|
603
|
+
this.writeTokenText(node.kind, node.pos);
|
|
604
|
+
this.exitTokenNode(node, state);
|
|
605
|
+
return true;
|
|
606
|
+
}
|
|
607
|
+
// Literals
|
|
608
|
+
emitLiteral(node) {
|
|
609
|
+
let flags = 0 /* LiteralTextFlags.None */;
|
|
610
|
+
if (this.options.neverAsciiEscape)
|
|
611
|
+
flags |= 1 /* LiteralTextFlags.NeverAsciiEscape */;
|
|
612
|
+
if (this.options.terminateUnterminatedLiterals)
|
|
613
|
+
flags |= 4 /* LiteralTextFlags.TerminateUnterminatedLiterals */;
|
|
614
|
+
const state = this.enterNode(node);
|
|
615
|
+
this.writer.writeText(this.getLiteralTextOfNode(node, undefined, flags));
|
|
616
|
+
this.exitNode(node, state);
|
|
617
|
+
return true;
|
|
618
|
+
}
|
|
619
|
+
// Names
|
|
620
|
+
// Source text of names reparsed from JSDoc can span lines.
|
|
621
|
+
emitIdentifierText(node) {
|
|
622
|
+
return this.writer.writeText(this.getTextOfNode(node));
|
|
623
|
+
}
|
|
624
|
+
emitIdentifierName(node) {
|
|
625
|
+
const state = this.enterNode(node);
|
|
626
|
+
this.emitIdentifierText(node);
|
|
627
|
+
this.exitNode(node, state);
|
|
628
|
+
return true;
|
|
629
|
+
}
|
|
630
|
+
getUniqueHelperName(name) {
|
|
631
|
+
const names = this.uniqueHelperNames;
|
|
632
|
+
const existing = names.get(name);
|
|
633
|
+
if (existing !== undefined)
|
|
634
|
+
return this.context.factory.cloneIdentifier(existing);
|
|
635
|
+
const helperName = this.context.factory.createUniqueName(name, 32 /* GeneratedIdentifierFlags.FileLevel */ | 16 /* GeneratedIdentifierFlags.Optimistic */);
|
|
636
|
+
this.nameGenerator.generateName(helperName);
|
|
637
|
+
names.set(name, helperName);
|
|
638
|
+
return helperName;
|
|
639
|
+
}
|
|
640
|
+
emitIdentifierReference(node) {
|
|
641
|
+
if ((this.externalHelpersModuleName !== undefined || this.uniqueHelperNames !== undefined) &&
|
|
642
|
+
this.hasEmitFlag(node, 1024 /* EmitFlags.HelperName */)) {
|
|
643
|
+
const moduleName = this.externalHelpersModuleName;
|
|
644
|
+
if (moduleName !== undefined) {
|
|
645
|
+
const factory = this.context.factory;
|
|
646
|
+
const helper = factory.createPropertyAccessExpression(factory.cloneIdentifier(moduleName), factory.cloneIdentifier(node));
|
|
647
|
+
this.context.assignCommentAndSourceMapRanges(helper, node);
|
|
648
|
+
return this.emitPropertyAccessExpression(helper);
|
|
649
|
+
}
|
|
650
|
+
const helperName = this.getUniqueHelperName(node.text);
|
|
651
|
+
this.context.assignCommentAndSourceMapRanges(helperName, node);
|
|
652
|
+
node = helperName;
|
|
653
|
+
}
|
|
654
|
+
return this.emitIdentifierName(node);
|
|
655
|
+
}
|
|
656
|
+
emitBindingIdentifier(node) {
|
|
657
|
+
if (this.uniqueHelperNames !== undefined && this.hasEmitFlag(node, 1024 /* EmitFlags.HelperName */)) {
|
|
658
|
+
const helperName = this.getUniqueHelperName(node.text);
|
|
659
|
+
this.context.assignCommentAndSourceMapRanges(helperName, node);
|
|
660
|
+
node = helperName;
|
|
661
|
+
}
|
|
662
|
+
return this.emitIdentifierName(node);
|
|
663
|
+
}
|
|
664
|
+
emitPrivateIdentifier(node) {
|
|
665
|
+
const state = this.enterNode(node);
|
|
666
|
+
this.writer.writeText(this.getTextOfNode(node));
|
|
667
|
+
this.exitNode(node, state);
|
|
668
|
+
return true;
|
|
669
|
+
}
|
|
670
|
+
emitQualifiedName(node) {
|
|
671
|
+
const state = this.enterNode(node);
|
|
672
|
+
this.emitEntityName(node.left);
|
|
673
|
+
this.write1('.');
|
|
674
|
+
this.emitIdentifierName(node.right);
|
|
675
|
+
this.exitNode(node, state);
|
|
676
|
+
return true;
|
|
677
|
+
}
|
|
678
|
+
emitComputedPropertyName(node) {
|
|
679
|
+
const state = this.enterNode(node);
|
|
680
|
+
this.write1('[');
|
|
681
|
+
this.emitExpression(node.expression, 2 /* OperatorPrecedence.DisallowComma */);
|
|
682
|
+
this.write1(']');
|
|
683
|
+
this.exitNode(node, state);
|
|
684
|
+
return true;
|
|
685
|
+
}
|
|
686
|
+
emitEntityName(node) {
|
|
687
|
+
if (node instanceof Identifier)
|
|
688
|
+
return this.emitIdentifierReference(node);
|
|
689
|
+
if (node instanceof QualifiedName)
|
|
690
|
+
return this.emitQualifiedName(node);
|
|
691
|
+
if (node instanceof PropertyAccessExpression)
|
|
692
|
+
return this.emitExpression(node, 2 /* OperatorPrecedence.DisallowComma */);
|
|
693
|
+
throw new Error('Unexpected entity name ' + node.kind);
|
|
694
|
+
}
|
|
695
|
+
emitBindingName(node) {
|
|
696
|
+
if (node === undefined)
|
|
697
|
+
return false;
|
|
698
|
+
if (node instanceof Identifier)
|
|
699
|
+
return this.emitBindingIdentifier(node);
|
|
700
|
+
if (node instanceof BindingPattern)
|
|
701
|
+
return this.emitBindingPattern(node);
|
|
702
|
+
throw new Error('Unexpected binding name ' + node.kind);
|
|
703
|
+
}
|
|
704
|
+
emitPropertyName(node) {
|
|
705
|
+
if (node === undefined)
|
|
706
|
+
return false;
|
|
707
|
+
if (node instanceof Identifier)
|
|
708
|
+
return this.emitIdentifierName(node);
|
|
709
|
+
if (node instanceof PrivateIdentifier)
|
|
710
|
+
return this.emitPrivateIdentifier(node);
|
|
711
|
+
if (node instanceof ComputedPropertyName)
|
|
712
|
+
return this.emitComputedPropertyName(node);
|
|
713
|
+
if (isLiteralKind(node.kind))
|
|
714
|
+
return this.emitLiteral(node);
|
|
715
|
+
throw new Error('Unexpected property name ' + node.kind);
|
|
716
|
+
}
|
|
717
|
+
emitMemberName(node) {
|
|
718
|
+
if (node instanceof Identifier)
|
|
719
|
+
return this.emitIdentifierName(node);
|
|
720
|
+
if (node instanceof PrivateIdentifier)
|
|
721
|
+
return this.emitPrivateIdentifier(node);
|
|
722
|
+
throw new Error('Unexpected member name ' + node.kind);
|
|
723
|
+
}
|
|
724
|
+
/** Module names, module export names, import attribute names and nested module names. */
|
|
725
|
+
emitIdentifierOrString(node, binding) {
|
|
726
|
+
if (node instanceof Identifier)
|
|
727
|
+
return binding ? this.emitBindingIdentifier(node) : this.emitIdentifierName(node);
|
|
728
|
+
if (node instanceof StringLiteral)
|
|
729
|
+
return this.emitLiteral(node);
|
|
730
|
+
throw new Error('Unexpected name ' + node.kind);
|
|
731
|
+
}
|
|
732
|
+
// Signature elements
|
|
733
|
+
emitModifierList(parent, modifiers, allowDecorators) {
|
|
734
|
+
if (modifiers === undefined || modifiers.nodes.length === 0)
|
|
735
|
+
return parent.pos;
|
|
736
|
+
const nodes = modifiers.nodes;
|
|
737
|
+
let allModifiers = true;
|
|
738
|
+
let allDecorators = true;
|
|
739
|
+
for (const n of nodes) {
|
|
740
|
+
if (n.kind === 171 /* SyntaxKind.Decorator */)
|
|
741
|
+
allModifiers = false;
|
|
742
|
+
else
|
|
743
|
+
allDecorators = false;
|
|
744
|
+
if (!isModifier(n))
|
|
745
|
+
allModifiers = false;
|
|
746
|
+
}
|
|
747
|
+
if (allModifiers)
|
|
748
|
+
this.emitList(0 /* ListItem.Keyword */, parent, modifiers, 2359808 /* ListFormat.Modifiers */);
|
|
749
|
+
else if (allDecorators) {
|
|
750
|
+
if (!allowDecorators)
|
|
751
|
+
return parent.pos;
|
|
752
|
+
this.emitList(1 /* ListItem.ModifierLike */, parent, modifiers, 2146305 /* ListFormat.Decorators */);
|
|
753
|
+
}
|
|
754
|
+
else {
|
|
755
|
+
// Emit runs of modifiers and decorators with their own formats.
|
|
756
|
+
let lastDecorators = false;
|
|
757
|
+
let decorators = false;
|
|
758
|
+
let haveMode = false;
|
|
759
|
+
let start = 0;
|
|
760
|
+
let pos = 0;
|
|
761
|
+
while (start < nodes.length) {
|
|
762
|
+
while (pos < nodes.length) {
|
|
763
|
+
decorators = nodes[pos].kind === 171 /* SyntaxKind.Decorator */;
|
|
764
|
+
if (!haveMode) {
|
|
765
|
+
lastDecorators = decorators;
|
|
766
|
+
haveMode = true;
|
|
767
|
+
}
|
|
768
|
+
else if (decorators !== lastDecorators)
|
|
769
|
+
break;
|
|
770
|
+
pos++;
|
|
771
|
+
}
|
|
772
|
+
const rangePos = start === 0 ? modifiers.pos : -1;
|
|
773
|
+
const rangeEnd = pos === nodes.length - 1 ? modifiers.end : -1;
|
|
774
|
+
if (allowDecorators || !lastDecorators)
|
|
775
|
+
this.emitListItems(1 /* ListItem.ModifierLike */, parent, nodes, start, pos, lastDecorators ? 2146305 /* ListFormat.Decorators */ : 2359808 /* ListFormat.Modifiers */, false, rangePos, rangeEnd);
|
|
776
|
+
start = pos;
|
|
777
|
+
lastDecorators = decorators;
|
|
778
|
+
pos++;
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
const last = nodes[nodes.length - 1];
|
|
782
|
+
return last.end > parent.pos ? last.end : parent.pos;
|
|
783
|
+
}
|
|
784
|
+
emitTypeParameter(node) {
|
|
785
|
+
const state = this.enterNode(node);
|
|
786
|
+
this.emitModifierList(node, node.modifiers, false);
|
|
787
|
+
this.emitBindingIdentifier(node.name);
|
|
788
|
+
if (node.constraint !== undefined) {
|
|
789
|
+
this.write1(' extends ');
|
|
790
|
+
this.emitTypeNodeOutsideExtends(node.constraint);
|
|
791
|
+
}
|
|
792
|
+
if (node.defaultType !== undefined) {
|
|
793
|
+
this.write1(' = ');
|
|
794
|
+
this.emitTypeNodeOutsideExtends(node.defaultType);
|
|
795
|
+
}
|
|
796
|
+
this.exitNode(node, state);
|
|
797
|
+
return true;
|
|
798
|
+
}
|
|
799
|
+
emitParameter(node) {
|
|
800
|
+
const state = this.enterNode(node);
|
|
801
|
+
this.emitModifierList(node, node.modifiers, true);
|
|
802
|
+
this.emitOptionalToken(node.dotDotDotToken);
|
|
803
|
+
this.emitBindingName(node.name);
|
|
804
|
+
this.emitOptionalToken(node.questionToken);
|
|
805
|
+
this.emitTypeAnnotation(node.type);
|
|
806
|
+
let end = node.pos;
|
|
807
|
+
if (node.modifiers !== undefined && node.modifiers.end > end)
|
|
808
|
+
end = node.modifiers.end;
|
|
809
|
+
if (node.name.end > end)
|
|
810
|
+
end = node.name.end;
|
|
811
|
+
if (node.questionToken !== undefined && node.questionToken.end > end)
|
|
812
|
+
end = node.questionToken.end;
|
|
813
|
+
if (node.type !== undefined && node.type.end > end)
|
|
814
|
+
end = node.type.end;
|
|
815
|
+
this.emitInitializer(node.initializer, end, node);
|
|
816
|
+
this.exitNode(node, state);
|
|
817
|
+
return true;
|
|
818
|
+
}
|
|
819
|
+
emitDecorator(node) {
|
|
820
|
+
const state = this.enterNode(node);
|
|
821
|
+
this.write1('@');
|
|
822
|
+
this.emitExpression(node.expression, 18 /* OperatorPrecedence.LeftHandSide */);
|
|
823
|
+
this.exitNode(node, state);
|
|
824
|
+
return true;
|
|
825
|
+
}
|
|
826
|
+
emitTypeParameters(parent, nodes) {
|
|
827
|
+
if (nodes === undefined)
|
|
828
|
+
return false;
|
|
829
|
+
return this.emitList(2 /* ListItem.TypeParameter */, parent, nodes, 53776 /* ListFormat.TypeParameters */ | (parent.kind === 220 /* SyntaxKind.ArrowFunction */ ? 64 /* ListFormat.AllowTrailingComma */ : 0));
|
|
830
|
+
}
|
|
831
|
+
emitTypeAnnotation(node) {
|
|
832
|
+
if (node === undefined)
|
|
833
|
+
return false;
|
|
834
|
+
this.write1(': ');
|
|
835
|
+
return this.emitTypeNodeOutsideExtends(node);
|
|
836
|
+
}
|
|
837
|
+
emitInitializer(node, equalsPos, contextNode) {
|
|
838
|
+
if (node === undefined)
|
|
839
|
+
return false;
|
|
840
|
+
this.space();
|
|
841
|
+
this.emitToken(63 /* SyntaxKind.EqualsToken */, equalsPos, contextNode);
|
|
842
|
+
this.space();
|
|
843
|
+
return this.emitExpression(node, 2 /* OperatorPrecedence.DisallowComma */);
|
|
844
|
+
}
|
|
845
|
+
emitParameters(parent, parameters) {
|
|
846
|
+
this.generateAllNames(parameters);
|
|
847
|
+
return this.emitList(3 /* ListItem.Parameter */, parent, parameters, 2576 /* ListFormat.Parameters */);
|
|
848
|
+
}
|
|
849
|
+
canEmitSimpleArrowHead(parent, parameters) {
|
|
850
|
+
if (!(parent instanceof ArrowFunction) || parameters.nodes.length !== 1)
|
|
851
|
+
return false;
|
|
852
|
+
const parameter = parameters.nodes[0];
|
|
853
|
+
return (parameter instanceof ParameterDeclaration &&
|
|
854
|
+
parameter.pos === parent.pos &&
|
|
855
|
+
parent.typeParameters === undefined &&
|
|
856
|
+
parent.type === undefined &&
|
|
857
|
+
(parent.modifiers === undefined || parent.modifiers.nodes.length === 0) &&
|
|
858
|
+
!parameters.hasTrailingComma() &&
|
|
859
|
+
parameter.modifiers === undefined &&
|
|
860
|
+
parameter.dotDotDotToken === undefined &&
|
|
861
|
+
parameter.questionToken === undefined &&
|
|
862
|
+
parameter.type === undefined &&
|
|
863
|
+
parameter.initializer === undefined &&
|
|
864
|
+
parameter.name.kind === 79 /* SyntaxKind.Identifier */);
|
|
865
|
+
}
|
|
866
|
+
emitParametersForArrow(parent, parameters) {
|
|
867
|
+
if (this.canEmitSimpleArrowHead(parent, parameters)) {
|
|
868
|
+
this.generateAllNames(parameters);
|
|
869
|
+
return this.emitList(3 /* ListItem.Parameter */, parent, parameters, 528 /* ListFormat.SingleArrowParameter */);
|
|
870
|
+
}
|
|
871
|
+
return this.emitParameters(parent, parameters);
|
|
872
|
+
}
|
|
873
|
+
emitSignature(node, typeParameters, parameters, type) {
|
|
874
|
+
this.emitTypeParameters(node, typeParameters);
|
|
875
|
+
this.emitParameters(node, parameters);
|
|
876
|
+
return this.emitTypeAnnotation(type);
|
|
877
|
+
}
|
|
878
|
+
emitFunctionBody(body) {
|
|
879
|
+
this.context.addEmitFlags(body, 12 /* EmitFlags.NoSourceMap */);
|
|
880
|
+
this.generateNames(body);
|
|
881
|
+
this.write1('{');
|
|
882
|
+
this.writer.indent++;
|
|
883
|
+
const detached = this.emitDetachedCommentsBeforeStatementList(body, body.statements.pos);
|
|
884
|
+
const statementOffset = this.emitPrologueDirectives(body.statements);
|
|
885
|
+
const pos = this.writer.getWriteCount();
|
|
886
|
+
this.emitHelpers(body);
|
|
887
|
+
if (statementOffset === 0 &&
|
|
888
|
+
pos === this.writer.getWriteCount() &&
|
|
889
|
+
this.shouldEmitBlockFunctionBodyOnSingleLine(body)) {
|
|
890
|
+
this.writer.indent--;
|
|
891
|
+
this.emitListRange(15 /* ListItem.Statement */, body, body.statements, 768 /* ListFormat.SingleLineFunctionBodyStatements */, statementOffset);
|
|
892
|
+
this.writer.indent++;
|
|
893
|
+
}
|
|
894
|
+
else
|
|
895
|
+
this.emitListRange(15 /* ListItem.Statement */, body, body.statements, 1 /* ListFormat.MultiLineFunctionBodyStatements */, statementOffset);
|
|
896
|
+
this.emitDetachedCommentsAfterStatementList(body, body.statements.end, detached);
|
|
897
|
+
this.writer.indent--;
|
|
898
|
+
this.emitTokenEx(19 /* SyntaxKind.CloseBraceToken */, body.statements.end, body, 1 /* TokenEmitFlags.NoComments */);
|
|
899
|
+
return true;
|
|
900
|
+
}
|
|
901
|
+
emitFunctionBodyNode(node) {
|
|
902
|
+
if (node === undefined)
|
|
903
|
+
return this.write1(';');
|
|
904
|
+
this.space();
|
|
905
|
+
if (node instanceof Block)
|
|
906
|
+
return this.emitFunctionBody(node);
|
|
907
|
+
throw new Error('Unexpected function body ' + node.kind);
|
|
908
|
+
}
|
|
909
|
+
// Type members and class elements
|
|
910
|
+
emitPropertySignature(node) {
|
|
911
|
+
const state = this.enterNode(node);
|
|
912
|
+
this.emitModifierList(node, node.modifiers, false);
|
|
913
|
+
this.emitPropertyName(node.name);
|
|
914
|
+
this.emitOptionalToken(node.postfixToken);
|
|
915
|
+
this.emitTypeAnnotation(node.type);
|
|
916
|
+
this.write1(';');
|
|
917
|
+
this.exitNode(node, state);
|
|
918
|
+
return true;
|
|
919
|
+
}
|
|
920
|
+
emitPropertyDeclaration(node) {
|
|
921
|
+
const state = this.enterNode(node);
|
|
922
|
+
this.emitModifierList(node, node.modifiers, true);
|
|
923
|
+
this.emitPropertyName(node.name);
|
|
924
|
+
this.emitOptionalToken(node.postfixToken);
|
|
925
|
+
this.emitTypeAnnotation(node.type);
|
|
926
|
+
let end = node.name.end;
|
|
927
|
+
if (node.type !== undefined && node.type.end > end)
|
|
928
|
+
end = node.type.end;
|
|
929
|
+
if (node.postfixToken !== undefined && node.postfixToken.end > end)
|
|
930
|
+
end = node.postfixToken.end;
|
|
931
|
+
this.emitInitializer(node.initializer, end, node);
|
|
932
|
+
this.write1(';');
|
|
933
|
+
this.exitNode(node, state);
|
|
934
|
+
return true;
|
|
935
|
+
}
|
|
936
|
+
/** Emits a signature in its own name scope, indented if the node asks for it. */
|
|
937
|
+
emitScopedSignature(node, typeParameters, parameters, type, body, hasBody) {
|
|
938
|
+
const indented = this.indentIf(this.shouldEmitIndented(node), 1);
|
|
939
|
+
this.pushNameGenerationScope(node);
|
|
940
|
+
this.emitSignature(node, typeParameters, parameters, type);
|
|
941
|
+
if (hasBody)
|
|
942
|
+
this.emitFunctionBodyNode(body);
|
|
943
|
+
else
|
|
944
|
+
this.write1(';');
|
|
945
|
+
this.popNameGenerationScope(node);
|
|
946
|
+
this.indentIf(indented, -1);
|
|
947
|
+
return true;
|
|
948
|
+
}
|
|
949
|
+
emitMethodSignature(node) {
|
|
950
|
+
const state = this.enterNode(node);
|
|
951
|
+
this.emitModifierList(node, node.modifiers, false);
|
|
952
|
+
this.emitPropertyName(node.name);
|
|
953
|
+
this.emitOptionalToken(node.postfixToken);
|
|
954
|
+
this.emitScopedSignature(node, node.typeParameters, node.parameters, node.type, undefined, false);
|
|
955
|
+
this.exitNode(node, state);
|
|
956
|
+
return true;
|
|
957
|
+
}
|
|
958
|
+
emitMethodDeclaration(node) {
|
|
959
|
+
const state = this.enterNode(node);
|
|
960
|
+
this.emitModifierList(node, node.modifiers, true);
|
|
961
|
+
this.emitOptionalToken(node.asteriskToken);
|
|
962
|
+
this.emitPropertyName(node.name);
|
|
963
|
+
this.emitOptionalToken(node.postfixToken);
|
|
964
|
+
this.emitScopedSignature(node, node.typeParameters, node.parameters, node.type, node.body, true);
|
|
965
|
+
this.exitNode(node, state);
|
|
966
|
+
return true;
|
|
967
|
+
}
|
|
968
|
+
emitClassStaticBlockDeclaration(node) {
|
|
969
|
+
const state = this.enterNode(node);
|
|
970
|
+
this.write1('static');
|
|
971
|
+
this.pushNameGenerationScope(node);
|
|
972
|
+
this.emitFunctionBodyNode(node.body);
|
|
973
|
+
this.popNameGenerationScope(node);
|
|
974
|
+
this.exitNode(node, state);
|
|
975
|
+
return true;
|
|
976
|
+
}
|
|
977
|
+
emitConstructor(node) {
|
|
978
|
+
const state = this.enterNode(node);
|
|
979
|
+
this.emitModifierList(node, node.modifiers, false);
|
|
980
|
+
this.write1('constructor');
|
|
981
|
+
this.emitScopedSignature(node, node.typeParameters, node.parameters, node.type, node.body, true);
|
|
982
|
+
this.exitNode(node, state);
|
|
983
|
+
return true;
|
|
984
|
+
}
|
|
985
|
+
emitAccessor(node, token, modifiers, name, typeParameters, parameters, type, body) {
|
|
986
|
+
const state = this.enterNode(node);
|
|
987
|
+
const pos = this.emitModifierList(node, modifiers, true);
|
|
988
|
+
this.emitToken(token, pos, node);
|
|
989
|
+
this.space();
|
|
990
|
+
this.emitPropertyName(name);
|
|
991
|
+
this.emitScopedSignature(node, typeParameters, parameters, type, body, true);
|
|
992
|
+
this.exitNode(node, state);
|
|
993
|
+
return true;
|
|
994
|
+
}
|
|
995
|
+
emitGetAccessor(node) {
|
|
996
|
+
return this.emitAccessor(node, 138 /* SyntaxKind.GetKeyword */, node.modifiers, node.name, node.typeParameters, node.parameters, node.type, node.body);
|
|
997
|
+
}
|
|
998
|
+
emitSetAccessor(node) {
|
|
999
|
+
return this.emitAccessor(node, 153 /* SyntaxKind.SetKeyword */, node.modifiers, node.name, node.typeParameters, node.parameters, node.type, node.body);
|
|
1000
|
+
}
|
|
1001
|
+
emitCallSignature(node) {
|
|
1002
|
+
const state = this.enterNode(node);
|
|
1003
|
+
this.emitScopedSignature(node, node.typeParameters, node.parameters, node.type, undefined, false);
|
|
1004
|
+
this.exitNode(node, state);
|
|
1005
|
+
return true;
|
|
1006
|
+
}
|
|
1007
|
+
emitConstructSignature(node) {
|
|
1008
|
+
const state = this.enterNode(node);
|
|
1009
|
+
this.write1('new ');
|
|
1010
|
+
this.emitScopedSignature(node, node.typeParameters, node.parameters, node.type, undefined, false);
|
|
1011
|
+
this.exitNode(node, state);
|
|
1012
|
+
return true;
|
|
1013
|
+
}
|
|
1014
|
+
emitIndexSignature(node) {
|
|
1015
|
+
const state = this.enterNode(node);
|
|
1016
|
+
this.emitModifierList(node, node.modifiers, false);
|
|
1017
|
+
const indented = this.indentIf(this.shouldEmitIndented(node), 1);
|
|
1018
|
+
this.pushNameGenerationScope(node);
|
|
1019
|
+
this.generateAllNames(node.parameters);
|
|
1020
|
+
this.emitList(3 /* ListItem.Parameter */, node, node.parameters, 8848 /* ListFormat.IndexSignatureParameters */);
|
|
1021
|
+
this.emitTypeAnnotation(node.type);
|
|
1022
|
+
this.write1(';');
|
|
1023
|
+
this.popNameGenerationScope(node);
|
|
1024
|
+
this.indentIf(indented, -1);
|
|
1025
|
+
this.exitNode(node, state);
|
|
1026
|
+
return true;
|
|
1027
|
+
}
|
|
1028
|
+
emitClassElement(node) {
|
|
1029
|
+
switch (node.kind) {
|
|
1030
|
+
case 173 /* SyntaxKind.PropertyDeclaration */:
|
|
1031
|
+
if (node instanceof PropertyDeclaration)
|
|
1032
|
+
return this.emitPropertyDeclaration(node);
|
|
1033
|
+
break;
|
|
1034
|
+
case 175 /* SyntaxKind.MethodDeclaration */:
|
|
1035
|
+
if (node instanceof MethodDeclaration)
|
|
1036
|
+
return this.emitMethodDeclaration(node);
|
|
1037
|
+
break;
|
|
1038
|
+
case 176 /* SyntaxKind.ClassStaticBlockDeclaration */:
|
|
1039
|
+
if (node instanceof ClassStaticBlockDeclaration)
|
|
1040
|
+
return this.emitClassStaticBlockDeclaration(node);
|
|
1041
|
+
break;
|
|
1042
|
+
case 177 /* SyntaxKind.Constructor */:
|
|
1043
|
+
if (node instanceof ConstructorDeclaration)
|
|
1044
|
+
return this.emitConstructor(node);
|
|
1045
|
+
break;
|
|
1046
|
+
case 178 /* SyntaxKind.GetAccessor */:
|
|
1047
|
+
if (node instanceof GetAccessorDeclaration)
|
|
1048
|
+
return this.emitGetAccessor(node);
|
|
1049
|
+
break;
|
|
1050
|
+
case 179 /* SyntaxKind.SetAccessor */:
|
|
1051
|
+
if (node instanceof SetAccessorDeclaration)
|
|
1052
|
+
return this.emitSetAccessor(node);
|
|
1053
|
+
break;
|
|
1054
|
+
case 182 /* SyntaxKind.IndexSignature */:
|
|
1055
|
+
if (node instanceof IndexSignatureDeclaration)
|
|
1056
|
+
return this.emitIndexSignature(node);
|
|
1057
|
+
break;
|
|
1058
|
+
case 241 /* SyntaxKind.SemicolonClassElement */:
|
|
1059
|
+
return this.emitSimpleNode(node, ';');
|
|
1060
|
+
case 347 /* SyntaxKind.NotEmittedStatement */:
|
|
1061
|
+
return this.emitSimpleNode(node, '');
|
|
1062
|
+
case 345 /* SyntaxKind.JSTypeAliasDeclaration */:
|
|
1063
|
+
if (node instanceof TypeAliasDeclaration)
|
|
1064
|
+
return this.emitTypeAliasDeclaration(node);
|
|
1065
|
+
break;
|
|
1066
|
+
}
|
|
1067
|
+
throw new Error('Unexpected class element ' + node.kind);
|
|
1068
|
+
}
|
|
1069
|
+
emitTypeElement(node) {
|
|
1070
|
+
switch (node.kind) {
|
|
1071
|
+
case 172 /* SyntaxKind.PropertySignature */:
|
|
1072
|
+
if (node instanceof PropertySignatureDeclaration)
|
|
1073
|
+
return this.emitPropertySignature(node);
|
|
1074
|
+
break;
|
|
1075
|
+
case 174 /* SyntaxKind.MethodSignature */:
|
|
1076
|
+
if (node instanceof MethodSignatureDeclaration)
|
|
1077
|
+
return this.emitMethodSignature(node);
|
|
1078
|
+
break;
|
|
1079
|
+
case 180 /* SyntaxKind.CallSignature */:
|
|
1080
|
+
if (node instanceof CallSignatureDeclaration)
|
|
1081
|
+
return this.emitCallSignature(node);
|
|
1082
|
+
break;
|
|
1083
|
+
case 181 /* SyntaxKind.ConstructSignature */:
|
|
1084
|
+
if (node instanceof ConstructSignatureDeclaration)
|
|
1085
|
+
return this.emitConstructSignature(node);
|
|
1086
|
+
break;
|
|
1087
|
+
case 178 /* SyntaxKind.GetAccessor */:
|
|
1088
|
+
if (node instanceof GetAccessorDeclaration)
|
|
1089
|
+
return this.emitGetAccessor(node);
|
|
1090
|
+
break;
|
|
1091
|
+
case 179 /* SyntaxKind.SetAccessor */:
|
|
1092
|
+
if (node instanceof SetAccessorDeclaration)
|
|
1093
|
+
return this.emitSetAccessor(node);
|
|
1094
|
+
break;
|
|
1095
|
+
case 182 /* SyntaxKind.IndexSignature */:
|
|
1096
|
+
if (node instanceof IndexSignatureDeclaration)
|
|
1097
|
+
return this.emitIndexSignature(node);
|
|
1098
|
+
break;
|
|
1099
|
+
case 350 /* SyntaxKind.NotEmittedTypeElement */:
|
|
1100
|
+
return this.emitSimpleNode(node, '');
|
|
1101
|
+
}
|
|
1102
|
+
throw new Error('Unexpected type element ' + node.kind);
|
|
1103
|
+
}
|
|
1104
|
+
emitObjectLiteralElement(node) {
|
|
1105
|
+
switch (node.kind) {
|
|
1106
|
+
case 303 /* SyntaxKind.PropertyAssignment */:
|
|
1107
|
+
if (node instanceof PropertyAssignment)
|
|
1108
|
+
return this.emitPropertyAssignment(node);
|
|
1109
|
+
break;
|
|
1110
|
+
case 304 /* SyntaxKind.ShorthandPropertyAssignment */:
|
|
1111
|
+
if (node instanceof ShorthandPropertyAssignment)
|
|
1112
|
+
return this.emitShorthandPropertyAssignment(node);
|
|
1113
|
+
break;
|
|
1114
|
+
case 305 /* SyntaxKind.SpreadAssignment */:
|
|
1115
|
+
if (node instanceof SpreadAssignment)
|
|
1116
|
+
return this.emitSpreadAssignment(node);
|
|
1117
|
+
break;
|
|
1118
|
+
case 175 /* SyntaxKind.MethodDeclaration */:
|
|
1119
|
+
if (node instanceof MethodDeclaration)
|
|
1120
|
+
return this.emitMethodDeclaration(node);
|
|
1121
|
+
break;
|
|
1122
|
+
case 178 /* SyntaxKind.GetAccessor */:
|
|
1123
|
+
if (node instanceof GetAccessorDeclaration)
|
|
1124
|
+
return this.emitGetAccessor(node);
|
|
1125
|
+
break;
|
|
1126
|
+
case 179 /* SyntaxKind.SetAccessor */:
|
|
1127
|
+
if (node instanceof SetAccessorDeclaration)
|
|
1128
|
+
return this.emitSetAccessor(node);
|
|
1129
|
+
break;
|
|
1130
|
+
}
|
|
1131
|
+
throw new Error('Unexpected object literal element ' + node.kind);
|
|
1132
|
+
}
|
|
1133
|
+
/** A node printed as fixed text, such as `;` for a semicolon class element. */
|
|
1134
|
+
emitSimpleNode(node, text) {
|
|
1135
|
+
const state = this.enterNode(node);
|
|
1136
|
+
if (text.length > 0)
|
|
1137
|
+
this.write1(text);
|
|
1138
|
+
this.exitNode(node, state);
|
|
1139
|
+
return true;
|
|
1140
|
+
}
|
|
1141
|
+
// Types
|
|
1142
|
+
emitTypePredicate(node) {
|
|
1143
|
+
const state = this.enterNode(node);
|
|
1144
|
+
if (node.assertsModifier !== undefined) {
|
|
1145
|
+
this.emitOptionalToken(node.assertsModifier);
|
|
1146
|
+
this.space();
|
|
1147
|
+
}
|
|
1148
|
+
const name = node.parameterName;
|
|
1149
|
+
if (name instanceof Identifier)
|
|
1150
|
+
this.emitIdentifierReference(name);
|
|
1151
|
+
else
|
|
1152
|
+
this.emitSimpleNode(name, 'this');
|
|
1153
|
+
if (node.type !== undefined) {
|
|
1154
|
+
this.write1(' is ');
|
|
1155
|
+
this.emitTypeNodeOutsideExtends(node.type);
|
|
1156
|
+
}
|
|
1157
|
+
this.exitNode(node, state);
|
|
1158
|
+
return true;
|
|
1159
|
+
}
|
|
1160
|
+
emitTypeArguments(parent, nodes) {
|
|
1161
|
+
if (nodes === undefined)
|
|
1162
|
+
return false;
|
|
1163
|
+
return this.emitList(7 /* ListItem.TypeArgument */, parent, nodes, 53776 /* ListFormat.TypeArguments */);
|
|
1164
|
+
}
|
|
1165
|
+
emitReturnType(node) {
|
|
1166
|
+
if (node === undefined)
|
|
1167
|
+
return false;
|
|
1168
|
+
this.write1('=> ');
|
|
1169
|
+
if (this.inExtends && node instanceof InferTypeNode && node.typeParameter.constraint !== undefined)
|
|
1170
|
+
return this.emitTypeNode(node, 7 /* TypePrecedence.Highest */);
|
|
1171
|
+
return this.emitTypeNode(node, 0 /* TypePrecedence.Lowest */);
|
|
1172
|
+
}
|
|
1173
|
+
emitFunctionType(node) {
|
|
1174
|
+
const state = this.enterNode(node);
|
|
1175
|
+
const indented = this.indentIf(this.shouldEmitIndented(node), 1);
|
|
1176
|
+
this.pushNameGenerationScope(node);
|
|
1177
|
+
this.emitTypeParameters(node, node.typeParameters);
|
|
1178
|
+
this.emitParameters(node, node.parameters);
|
|
1179
|
+
this.space();
|
|
1180
|
+
this.emitReturnType(node.type);
|
|
1181
|
+
this.popNameGenerationScope(node);
|
|
1182
|
+
this.indentIf(indented, -1);
|
|
1183
|
+
this.exitNode(node, state);
|
|
1184
|
+
return true;
|
|
1185
|
+
}
|
|
1186
|
+
emitConstructorType(node) {
|
|
1187
|
+
const state = this.enterNode(node);
|
|
1188
|
+
this.emitModifierList(node, node.modifiers, false);
|
|
1189
|
+
this.write1('new ');
|
|
1190
|
+
const indented = this.indentIf(this.shouldEmitIndented(node), 1);
|
|
1191
|
+
this.pushNameGenerationScope(node);
|
|
1192
|
+
this.emitTypeParameters(node, node.typeParameters);
|
|
1193
|
+
this.emitParameters(node, node.parameters);
|
|
1194
|
+
this.space();
|
|
1195
|
+
this.emitReturnType(node.type);
|
|
1196
|
+
this.popNameGenerationScope(node);
|
|
1197
|
+
this.indentIf(indented, -1);
|
|
1198
|
+
this.exitNode(node, state);
|
|
1199
|
+
return true;
|
|
1200
|
+
}
|
|
1201
|
+
emitTypeLiteral(node) {
|
|
1202
|
+
const state = this.enterNode(node);
|
|
1203
|
+
this.pushNameGenerationScope(node);
|
|
1204
|
+
this.generateAllMemberNames(node.members);
|
|
1205
|
+
this.write1('{');
|
|
1206
|
+
const format = this.shouldEmitOnSingleLine(node)
|
|
1207
|
+
? 768 /* ListFormat.SingleLineTypeLiteralMembers */
|
|
1208
|
+
: 32897 /* ListFormat.MultiLineTypeLiteralMembers */;
|
|
1209
|
+
this.emitList(4 /* ListItem.TypeElement */, node, node.members, format | 524288 /* ListFormat.NoSpaceIfEmpty */);
|
|
1210
|
+
this.write1('}');
|
|
1211
|
+
this.popNameGenerationScope(node);
|
|
1212
|
+
this.exitNode(node, state);
|
|
1213
|
+
return true;
|
|
1214
|
+
}
|
|
1215
|
+
/** The operand of a postfix type; a parsed `typeof X` operand keeps no parentheses. */
|
|
1216
|
+
emitPostfixTypeOperand(operand, parent) {
|
|
1217
|
+
if (isParseTreeNode(parent) && operand.kind === 187 /* SyntaxKind.TypeQuery */)
|
|
1218
|
+
return this.emitTypeNode(operand, 5 /* TypePrecedence.TypeOperator */);
|
|
1219
|
+
return this.emitTypeNode(operand, 6 /* TypePrecedence.Postfix */);
|
|
1220
|
+
}
|
|
1221
|
+
emitTupleType(node) {
|
|
1222
|
+
const state = this.enterNode(node);
|
|
1223
|
+
this.emitToken(22 /* SyntaxKind.OpenBracketToken */, node.pos, node);
|
|
1224
|
+
const format = this.shouldEmitOnSingleLine(node)
|
|
1225
|
+
? 528 /* ListFormat.SingleLineTupleTypeElements */
|
|
1226
|
+
: 657 /* ListFormat.MultiLineTupleTypeElements */;
|
|
1227
|
+
this.emitList(7 /* ListItem.TypeArgument */, node, node.elements, format | 524288 /* ListFormat.NoSpaceIfEmpty */);
|
|
1228
|
+
this.emitToken(23 /* SyntaxKind.CloseBracketToken */, node.elements.end, node);
|
|
1229
|
+
this.exitNode(node, state);
|
|
1230
|
+
return true;
|
|
1231
|
+
}
|
|
1232
|
+
emitNamedTupleMember(node) {
|
|
1233
|
+
const state = this.enterNode(node);
|
|
1234
|
+
this.emitOptionalToken(node.dotDotDotToken);
|
|
1235
|
+
this.emitIdentifierName(node.name);
|
|
1236
|
+
this.emitOptionalToken(node.questionToken);
|
|
1237
|
+
let end = node.name.end;
|
|
1238
|
+
if (node.questionToken !== undefined && node.questionToken.end > end)
|
|
1239
|
+
end = node.questionToken.end;
|
|
1240
|
+
this.emitToken(58 /* SyntaxKind.ColonToken */, end, node);
|
|
1241
|
+
this.space();
|
|
1242
|
+
this.emitTypeNodeOutsideExtends(node.type);
|
|
1243
|
+
this.exitNode(node, state);
|
|
1244
|
+
return true;
|
|
1245
|
+
}
|
|
1246
|
+
emitConditionalType(node) {
|
|
1247
|
+
const state = this.enterNode(node);
|
|
1248
|
+
this.emitTypeNode(node.checkType, 3 /* TypePrecedence.Union */);
|
|
1249
|
+
this.write1(' extends ');
|
|
1250
|
+
this.emitTypeNodeInExtends(node.extendsType);
|
|
1251
|
+
this.write1(' ? ');
|
|
1252
|
+
this.emitTypeNodeOutsideExtends(node.trueType);
|
|
1253
|
+
this.write1(' : ');
|
|
1254
|
+
this.emitTypeNodeOutsideExtends(node.falseType);
|
|
1255
|
+
this.exitNode(node, state);
|
|
1256
|
+
return true;
|
|
1257
|
+
}
|
|
1258
|
+
emitInferType(node) {
|
|
1259
|
+
const state = this.enterNode(node);
|
|
1260
|
+
this.write1('infer ');
|
|
1261
|
+
const parameter = node.typeParameter;
|
|
1262
|
+
const parameterState = this.enterNode(parameter);
|
|
1263
|
+
this.emitBindingIdentifier(parameter.name);
|
|
1264
|
+
if (parameter.constraint !== undefined) {
|
|
1265
|
+
this.write1(' extends ');
|
|
1266
|
+
this.emitTypeNodeInExtends(parameter.constraint);
|
|
1267
|
+
}
|
|
1268
|
+
this.exitNode(parameter, parameterState);
|
|
1269
|
+
this.exitNode(node, state);
|
|
1270
|
+
return true;
|
|
1271
|
+
}
|
|
1272
|
+
emitTypeOperator(node) {
|
|
1273
|
+
const state = this.enterNode(node);
|
|
1274
|
+
this.emitToken(node.operator, node.pos, node);
|
|
1275
|
+
this.space();
|
|
1276
|
+
this.emitTypeNode(node.type, node.operator === 148 /* SyntaxKind.ReadonlyKeyword */ ? 6 /* TypePrecedence.Postfix */ : 5 /* TypePrecedence.TypeOperator */);
|
|
1277
|
+
this.exitNode(node, state);
|
|
1278
|
+
return true;
|
|
1279
|
+
}
|
|
1280
|
+
emitMappedType(node) {
|
|
1281
|
+
const state = this.enterNode(node);
|
|
1282
|
+
const singleLine = this.shouldEmitOnSingleLine(node);
|
|
1283
|
+
this.write1('{');
|
|
1284
|
+
if (singleLine)
|
|
1285
|
+
this.space();
|
|
1286
|
+
else {
|
|
1287
|
+
this.line();
|
|
1288
|
+
this.writer.indent++;
|
|
1289
|
+
}
|
|
1290
|
+
const readonlyToken = node.readonlyToken;
|
|
1291
|
+
if (readonlyToken !== undefined) {
|
|
1292
|
+
this.emitOptionalToken(readonlyToken);
|
|
1293
|
+
if (readonlyToken.kind !== 148 /* SyntaxKind.ReadonlyKeyword */)
|
|
1294
|
+
this.write1('readonly');
|
|
1295
|
+
this.space();
|
|
1296
|
+
}
|
|
1297
|
+
this.write1('[');
|
|
1298
|
+
const parameter = node.typeParameter;
|
|
1299
|
+
const parameterState = this.enterNode(parameter);
|
|
1300
|
+
this.emitBindingIdentifier(parameter.name);
|
|
1301
|
+
this.write1(' in ');
|
|
1302
|
+
this.emitTypeNodeOutsideExtends(parameter.constraint);
|
|
1303
|
+
this.exitNode(parameter, parameterState);
|
|
1304
|
+
if (node.nameType !== undefined) {
|
|
1305
|
+
this.write1(' as ');
|
|
1306
|
+
this.emitTypeNodeOutsideExtends(node.nameType);
|
|
1307
|
+
}
|
|
1308
|
+
this.write1(']');
|
|
1309
|
+
const questionToken = node.questionToken;
|
|
1310
|
+
if (questionToken !== undefined) {
|
|
1311
|
+
this.emitOptionalToken(questionToken);
|
|
1312
|
+
if (questionToken.kind !== 57 /* SyntaxKind.QuestionToken */)
|
|
1313
|
+
this.write1('?');
|
|
1314
|
+
}
|
|
1315
|
+
this.write1(': ');
|
|
1316
|
+
// tsgo's printer fails on a mapped type without a type, too.
|
|
1317
|
+
if (node.type === undefined)
|
|
1318
|
+
throw new Error('Mapped type without a type');
|
|
1319
|
+
this.emitTypeNodeOutsideExtends(node.type);
|
|
1320
|
+
this.write1(';');
|
|
1321
|
+
if (node.members !== undefined && node.members.nodes.length > 0) {
|
|
1322
|
+
if (singleLine)
|
|
1323
|
+
this.space();
|
|
1324
|
+
else
|
|
1325
|
+
this.line();
|
|
1326
|
+
this.emitList(4 /* ListItem.TypeElement */, node, node.members, 2 /* ListFormat.PreserveLines */);
|
|
1327
|
+
}
|
|
1328
|
+
if (singleLine)
|
|
1329
|
+
this.space();
|
|
1330
|
+
else {
|
|
1331
|
+
this.line();
|
|
1332
|
+
this.writer.indent--;
|
|
1333
|
+
}
|
|
1334
|
+
this.write1('}');
|
|
1335
|
+
this.exitNode(node, state);
|
|
1336
|
+
return true;
|
|
1337
|
+
}
|
|
1338
|
+
emitTemplateType(node) {
|
|
1339
|
+
const state = this.enterNode(node);
|
|
1340
|
+
this.emitLiteral(node.head);
|
|
1341
|
+
this.emitList(9 /* ListItem.TemplateTypeSpan */, node, node.templateSpans, 262144 /* ListFormat.TemplateExpressionSpans */);
|
|
1342
|
+
this.exitNode(node, state);
|
|
1343
|
+
return true;
|
|
1344
|
+
}
|
|
1345
|
+
emitTemplateTypeSpan(node) {
|
|
1346
|
+
const state = this.enterNode(node);
|
|
1347
|
+
this.emitTypeNodeOutsideExtends(node.type);
|
|
1348
|
+
this.emitLiteral(node.literal);
|
|
1349
|
+
this.exitNode(node, state);
|
|
1350
|
+
return true;
|
|
1351
|
+
}
|
|
1352
|
+
emitImportType(node) {
|
|
1353
|
+
const state = this.enterNode(node);
|
|
1354
|
+
if (node.isTypeOf)
|
|
1355
|
+
this.write1('typeof ');
|
|
1356
|
+
this.write1('import(');
|
|
1357
|
+
this.emitTypeNodeOutsideExtends(node.argument);
|
|
1358
|
+
const attributes = node.attributes;
|
|
1359
|
+
if (attributes !== undefined) {
|
|
1360
|
+
this.write1(', ');
|
|
1361
|
+
const attributesState = this.enterNode(attributes);
|
|
1362
|
+
this.write1('{ ');
|
|
1363
|
+
this.write1(attributes.token === 131 /* SyntaxKind.AssertKeyword */ ? 'assert' : 'with');
|
|
1364
|
+
this.write1(': ');
|
|
1365
|
+
this.emitList(10 /* ListItem.ImportAttribute */, attributes, attributes.attributes, 526226 /* ListFormat.ImportAttributes */);
|
|
1366
|
+
this.write1(' }');
|
|
1367
|
+
this.exitNode(attributes, attributesState);
|
|
1368
|
+
}
|
|
1369
|
+
this.write1(')');
|
|
1370
|
+
if (node.qualifier !== undefined) {
|
|
1371
|
+
this.write1('.');
|
|
1372
|
+
this.emitEntityName(node.qualifier);
|
|
1373
|
+
}
|
|
1374
|
+
this.emitTypeArguments(node, node.typeArguments);
|
|
1375
|
+
this.exitNode(node, state);
|
|
1376
|
+
return true;
|
|
1377
|
+
}
|
|
1378
|
+
emitTypeNodeInExtends(node) {
|
|
1379
|
+
const saved = this.inExtends;
|
|
1380
|
+
this.inExtends = true;
|
|
1381
|
+
this.emitTypeNode(node, 0 /* TypePrecedence.Lowest */);
|
|
1382
|
+
this.inExtends = saved;
|
|
1383
|
+
return true;
|
|
1384
|
+
}
|
|
1385
|
+
emitTypeNodeOutsideExtends(node) {
|
|
1386
|
+
const saved = this.inExtends;
|
|
1387
|
+
this.inExtends = false;
|
|
1388
|
+
this.emitTypeNode(node, 0 /* TypePrecedence.Lowest */);
|
|
1389
|
+
this.inExtends = saved;
|
|
1390
|
+
return true;
|
|
1391
|
+
}
|
|
1392
|
+
emitTypeNode(node, precedence) {
|
|
1393
|
+
if (this.inExtends && precedence <= 0 /* TypePrecedence.Conditional */)
|
|
1394
|
+
precedence = 2 /* TypePrecedence.Function */;
|
|
1395
|
+
const savedInExtends = this.inExtends;
|
|
1396
|
+
const parens = getTypeNodePrecedence(node) < precedence;
|
|
1397
|
+
if (parens) {
|
|
1398
|
+
this.inExtends = false;
|
|
1399
|
+
this.write1('(');
|
|
1400
|
+
}
|
|
1401
|
+
this.emitTypeNodeWorker(node);
|
|
1402
|
+
if (parens)
|
|
1403
|
+
this.write1(')');
|
|
1404
|
+
this.inExtends = savedInExtends;
|
|
1405
|
+
return true;
|
|
1406
|
+
}
|
|
1407
|
+
emitTypeNodeWorker(node) {
|
|
1408
|
+
switch (node.kind) {
|
|
1409
|
+
case 132 /* SyntaxKind.AnyKeyword */:
|
|
1410
|
+
case 159 /* SyntaxKind.UnknownKeyword */:
|
|
1411
|
+
case 150 /* SyntaxKind.NumberKeyword */:
|
|
1412
|
+
case 163 /* SyntaxKind.BigIntKeyword */:
|
|
1413
|
+
case 151 /* SyntaxKind.ObjectKeyword */:
|
|
1414
|
+
case 135 /* SyntaxKind.BooleanKeyword */:
|
|
1415
|
+
case 154 /* SyntaxKind.StringKeyword */:
|
|
1416
|
+
case 155 /* SyntaxKind.SymbolKeyword */:
|
|
1417
|
+
case 115 /* SyntaxKind.VoidKeyword */:
|
|
1418
|
+
case 157 /* SyntaxKind.UndefinedKeyword */:
|
|
1419
|
+
case 146 /* SyntaxKind.NeverKeyword */:
|
|
1420
|
+
case 141 /* SyntaxKind.IntrinsicKeyword */:
|
|
1421
|
+
return this.emitTokenNode(node);
|
|
1422
|
+
case 310 /* SyntaxKind.JSDocAllType */:
|
|
1423
|
+
return this.emitSimpleNode(node, tokenToString(node.kind));
|
|
1424
|
+
case 198 /* SyntaxKind.ThisType */:
|
|
1425
|
+
return this.emitSimpleNode(node, 'this');
|
|
1426
|
+
case 183 /* SyntaxKind.TypePredicate */:
|
|
1427
|
+
if (node instanceof TypePredicateNode)
|
|
1428
|
+
return this.emitTypePredicate(node);
|
|
1429
|
+
break;
|
|
1430
|
+
case 184 /* SyntaxKind.TypeReference */:
|
|
1431
|
+
if (node instanceof TypeReferenceNode) {
|
|
1432
|
+
const state = this.enterNode(node);
|
|
1433
|
+
this.emitEntityName(node.typeName);
|
|
1434
|
+
this.emitTypeArguments(node, node.typeArguments);
|
|
1435
|
+
this.exitNode(node, state);
|
|
1436
|
+
return true;
|
|
1437
|
+
}
|
|
1438
|
+
break;
|
|
1439
|
+
case 185 /* SyntaxKind.FunctionType */:
|
|
1440
|
+
if (node instanceof FunctionTypeNode)
|
|
1441
|
+
return this.emitFunctionType(node);
|
|
1442
|
+
break;
|
|
1443
|
+
case 186 /* SyntaxKind.ConstructorType */:
|
|
1444
|
+
if (node instanceof ConstructorTypeNode)
|
|
1445
|
+
return this.emitConstructorType(node);
|
|
1446
|
+
break;
|
|
1447
|
+
case 187 /* SyntaxKind.TypeQuery */:
|
|
1448
|
+
if (node instanceof TypeQueryNode) {
|
|
1449
|
+
const state = this.enterNode(node);
|
|
1450
|
+
this.write1('typeof ');
|
|
1451
|
+
this.emitEntityName(node.exprName);
|
|
1452
|
+
this.emitTypeArguments(node, node.typeArguments);
|
|
1453
|
+
this.exitNode(node, state);
|
|
1454
|
+
return true;
|
|
1455
|
+
}
|
|
1456
|
+
break;
|
|
1457
|
+
case 188 /* SyntaxKind.TypeLiteral */:
|
|
1458
|
+
if (node instanceof TypeLiteralNode)
|
|
1459
|
+
return this.emitTypeLiteral(node);
|
|
1460
|
+
break;
|
|
1461
|
+
case 189 /* SyntaxKind.ArrayType */:
|
|
1462
|
+
if (node instanceof ArrayTypeNode) {
|
|
1463
|
+
const state = this.enterNode(node);
|
|
1464
|
+
this.emitPostfixTypeOperand(node.elementType, node);
|
|
1465
|
+
this.write1('[');
|
|
1466
|
+
this.write1(']');
|
|
1467
|
+
this.exitNode(node, state);
|
|
1468
|
+
return true;
|
|
1469
|
+
}
|
|
1470
|
+
break;
|
|
1471
|
+
case 190 /* SyntaxKind.TupleType */:
|
|
1472
|
+
if (node instanceof TupleTypeNode)
|
|
1473
|
+
return this.emitTupleType(node);
|
|
1474
|
+
break;
|
|
1475
|
+
case 191 /* SyntaxKind.OptionalType */:
|
|
1476
|
+
if (node instanceof OptionalTypeNode) {
|
|
1477
|
+
const state = this.enterNode(node);
|
|
1478
|
+
this.emitPostfixTypeOperand(node.type, node);
|
|
1479
|
+
this.write1('?');
|
|
1480
|
+
this.exitNode(node, state);
|
|
1481
|
+
return true;
|
|
1482
|
+
}
|
|
1483
|
+
break;
|
|
1484
|
+
case 192 /* SyntaxKind.RestType */:
|
|
1485
|
+
if (node instanceof RestTypeNode) {
|
|
1486
|
+
const state = this.enterNode(node);
|
|
1487
|
+
this.write1('...');
|
|
1488
|
+
this.emitTypeNodeOutsideExtends(node.type);
|
|
1489
|
+
this.exitNode(node, state);
|
|
1490
|
+
return true;
|
|
1491
|
+
}
|
|
1492
|
+
break;
|
|
1493
|
+
case 193 /* SyntaxKind.UnionType */:
|
|
1494
|
+
if (node instanceof UnionTypeNode) {
|
|
1495
|
+
const state = this.enterNode(node);
|
|
1496
|
+
this.emitList(8 /* ListItem.UnionConstituent */, node, node.types, 516 /* ListFormat.UnionTypeConstituents */);
|
|
1497
|
+
this.exitNode(node, state);
|
|
1498
|
+
return true;
|
|
1499
|
+
}
|
|
1500
|
+
break;
|
|
1501
|
+
case 194 /* SyntaxKind.IntersectionType */:
|
|
1502
|
+
if (node instanceof IntersectionTypeNode) {
|
|
1503
|
+
const state = this.enterNode(node);
|
|
1504
|
+
this.emitList(8 /* ListItem.UnionConstituent */, node, node.types, 520 /* ListFormat.IntersectionTypeConstituents */);
|
|
1505
|
+
this.exitNode(node, state);
|
|
1506
|
+
return true;
|
|
1507
|
+
}
|
|
1508
|
+
break;
|
|
1509
|
+
case 195 /* SyntaxKind.ConditionalType */:
|
|
1510
|
+
if (node instanceof ConditionalTypeNode)
|
|
1511
|
+
return this.emitConditionalType(node);
|
|
1512
|
+
break;
|
|
1513
|
+
case 196 /* SyntaxKind.InferType */:
|
|
1514
|
+
if (node instanceof InferTypeNode)
|
|
1515
|
+
return this.emitInferType(node);
|
|
1516
|
+
break;
|
|
1517
|
+
case 197 /* SyntaxKind.ParenthesizedType */:
|
|
1518
|
+
if (node instanceof ParenthesizedTypeNode) {
|
|
1519
|
+
const state = this.enterNode(node);
|
|
1520
|
+
this.write1('(');
|
|
1521
|
+
this.emitTypeNodeOutsideExtends(node.type);
|
|
1522
|
+
this.write1(')');
|
|
1523
|
+
this.exitNode(node, state);
|
|
1524
|
+
return true;
|
|
1525
|
+
}
|
|
1526
|
+
break;
|
|
1527
|
+
case 199 /* SyntaxKind.TypeOperator */:
|
|
1528
|
+
if (node instanceof TypeOperatorNode)
|
|
1529
|
+
return this.emitTypeOperator(node);
|
|
1530
|
+
break;
|
|
1531
|
+
case 200 /* SyntaxKind.IndexedAccessType */:
|
|
1532
|
+
if (node instanceof IndexedAccessTypeNode) {
|
|
1533
|
+
const state = this.enterNode(node);
|
|
1534
|
+
this.emitPostfixTypeOperand(node.objectType, node);
|
|
1535
|
+
this.write1('[');
|
|
1536
|
+
this.emitTypeNodeOutsideExtends(node.indexType);
|
|
1537
|
+
this.write1(']');
|
|
1538
|
+
this.exitNode(node, state);
|
|
1539
|
+
return true;
|
|
1540
|
+
}
|
|
1541
|
+
break;
|
|
1542
|
+
case 201 /* SyntaxKind.MappedType */:
|
|
1543
|
+
if (node instanceof MappedTypeNode)
|
|
1544
|
+
return this.emitMappedType(node);
|
|
1545
|
+
break;
|
|
1546
|
+
case 202 /* SyntaxKind.LiteralType */:
|
|
1547
|
+
if (node instanceof LiteralTypeNode) {
|
|
1548
|
+
const state = this.enterNode(node);
|
|
1549
|
+
this.emitExpression(node.literal, 0 /* OperatorPrecedence.Comma */);
|
|
1550
|
+
this.exitNode(node, state);
|
|
1551
|
+
return true;
|
|
1552
|
+
}
|
|
1553
|
+
break;
|
|
1554
|
+
case 203 /* SyntaxKind.NamedTupleMember */:
|
|
1555
|
+
if (node instanceof NamedTupleMember)
|
|
1556
|
+
return this.emitNamedTupleMember(node);
|
|
1557
|
+
break;
|
|
1558
|
+
case 204 /* SyntaxKind.TemplateLiteralType */:
|
|
1559
|
+
if (node instanceof TemplateLiteralTypeNode)
|
|
1560
|
+
return this.emitTemplateType(node);
|
|
1561
|
+
break;
|
|
1562
|
+
case 205 /* SyntaxKind.TemplateLiteralTypeSpan */:
|
|
1563
|
+
if (node instanceof TemplateLiteralTypeSpan)
|
|
1564
|
+
return this.emitTemplateTypeSpan(node);
|
|
1565
|
+
break;
|
|
1566
|
+
case 206 /* SyntaxKind.ImportType */:
|
|
1567
|
+
if (node instanceof ImportTypeNode)
|
|
1568
|
+
return this.emitImportType(node);
|
|
1569
|
+
break;
|
|
1570
|
+
case 212 /* SyntaxKind.PropertyAccessExpression */:
|
|
1571
|
+
if (node instanceof PropertyAccessExpression)
|
|
1572
|
+
return this.emitPropertyAccessExpression(node);
|
|
1573
|
+
break;
|
|
1574
|
+
case 234 /* SyntaxKind.ExpressionWithTypeArguments */:
|
|
1575
|
+
if (node instanceof ExpressionWithTypeArguments)
|
|
1576
|
+
return this.emitExpressionWithTypeArguments(node);
|
|
1577
|
+
break;
|
|
1578
|
+
case 312 /* SyntaxKind.JSDocNonNullableType */:
|
|
1579
|
+
if (node instanceof JSDocNonNullableType)
|
|
1580
|
+
return this.emitJSDocPrefixType(node, '!', node.type);
|
|
1581
|
+
break;
|
|
1582
|
+
case 311 /* SyntaxKind.JSDocNullableType */:
|
|
1583
|
+
if (node instanceof JSDocNullableType)
|
|
1584
|
+
return this.emitJSDocPrefixType(node, '?', node.type);
|
|
1585
|
+
break;
|
|
1586
|
+
case 313 /* SyntaxKind.JSDocOptionalType */:
|
|
1587
|
+
if (node instanceof JSDocOptionalType) {
|
|
1588
|
+
const state = this.enterNode(node);
|
|
1589
|
+
this.emitTypeNode(node.type, 1 /* TypePrecedence.JSDoc */);
|
|
1590
|
+
this.write1('=');
|
|
1591
|
+
this.exitNode(node, state);
|
|
1592
|
+
return true;
|
|
1593
|
+
}
|
|
1594
|
+
break;
|
|
1595
|
+
case 314 /* SyntaxKind.JSDocVariadicType */:
|
|
1596
|
+
if (node instanceof JSDocVariadicType) {
|
|
1597
|
+
const state = this.enterNode(node);
|
|
1598
|
+
this.write1('...');
|
|
1599
|
+
this.emitTypeNode(node.type, 1 /* TypePrecedence.JSDoc */);
|
|
1600
|
+
this.exitNode(node, state);
|
|
1601
|
+
return true;
|
|
1602
|
+
}
|
|
1603
|
+
break;
|
|
1604
|
+
}
|
|
1605
|
+
throw new Error('Unexpected type node ' + node.kind);
|
|
1606
|
+
}
|
|
1607
|
+
emitJSDocPrefixType(node, prefix, type) {
|
|
1608
|
+
const state = this.enterNode(node);
|
|
1609
|
+
this.write1(prefix);
|
|
1610
|
+
this.emitTypeNode(type, 7 /* TypePrecedence.NonArray */);
|
|
1611
|
+
this.exitNode(node, state);
|
|
1612
|
+
return true;
|
|
1613
|
+
}
|
|
1614
|
+
// Binding patterns
|
|
1615
|
+
emitBindingPattern(node) {
|
|
1616
|
+
const state = this.enterNode(node);
|
|
1617
|
+
const object = node.kind === 207 /* SyntaxKind.ObjectBindingPattern */;
|
|
1618
|
+
this.write1(object ? '{' : '[');
|
|
1619
|
+
this.emitList(11 /* ListItem.BindingElement */, node, node.elements, object ? 525136 /* ListFormat.ObjectBindingPatternElements */ : 524880 /* ListFormat.ArrayBindingPatternElements */);
|
|
1620
|
+
this.write1(object ? '}' : ']');
|
|
1621
|
+
this.exitNode(node, state);
|
|
1622
|
+
return true;
|
|
1623
|
+
}
|
|
1624
|
+
emitBindingElement(node) {
|
|
1625
|
+
const state = this.enterNode(node);
|
|
1626
|
+
this.emitOptionalToken(node.dotDotDotToken);
|
|
1627
|
+
if (node.propertyName !== undefined) {
|
|
1628
|
+
this.emitPropertyName(node.propertyName);
|
|
1629
|
+
this.write1(': ');
|
|
1630
|
+
}
|
|
1631
|
+
const name = node.name;
|
|
1632
|
+
if (name !== undefined) {
|
|
1633
|
+
this.emitBindingName(name);
|
|
1634
|
+
this.emitInitializer(node.initializer, name.end, node);
|
|
1635
|
+
}
|
|
1636
|
+
this.exitNode(node, state);
|
|
1637
|
+
return true;
|
|
1638
|
+
}
|
|
1639
|
+
// Expressions
|
|
1640
|
+
emitArrayLiteralExpression(node) {
|
|
1641
|
+
const state = this.enterNode(node);
|
|
1642
|
+
this.emitList(12 /* ListItem.ArrayElement */, node, node.elements, 8914 /* ListFormat.ArrayLiteralExpressionElements */ | (node.multiLine ? 65536 /* ListFormat.PreferNewLine */ : 0));
|
|
1643
|
+
this.exitNode(node, state);
|
|
1644
|
+
return true;
|
|
1645
|
+
}
|
|
1646
|
+
emitObjectLiteralExpression(node) {
|
|
1647
|
+
const state = this.enterNode(node);
|
|
1648
|
+
const indented = this.indentIf(this.shouldEmitIndented(node), 1);
|
|
1649
|
+
this.pushNameGenerationScope(node);
|
|
1650
|
+
this.generateAllMemberNames(node.properties);
|
|
1651
|
+
this.emitList(6 /* ListItem.ObjectLiteralElement */, node, node.properties, 526226 /* ListFormat.ObjectLiteralExpressionProperties */ |
|
|
1652
|
+
(node.multiLine ? 65536 /* ListFormat.PreferNewLine */ : 0) |
|
|
1653
|
+
(this.shouldAllowTrailingComma(node) ? 64 /* ListFormat.AllowTrailingComma */ : 0));
|
|
1654
|
+
this.popNameGenerationScope(node);
|
|
1655
|
+
this.indentIf(indented, -1);
|
|
1656
|
+
this.exitNode(node, state);
|
|
1657
|
+
return true;
|
|
1658
|
+
}
|
|
1659
|
+
/** `1..toString()`: a decimal integer literal needs a second dot before a property access. */
|
|
1660
|
+
mayNeedDotDotForPropertyAccess(expression) {
|
|
1661
|
+
expression = skipPartiallyEmittedExpressions(expression);
|
|
1662
|
+
if (!(expression instanceof NumericLiteral))
|
|
1663
|
+
return false;
|
|
1664
|
+
const text = this.getLiteralTextOfNode(expression, undefined, 1 /* LiteralTextFlags.NeverAsciiEscape */);
|
|
1665
|
+
return ((expression.tokenFlags & 448 /* TokenFlags.WithSpecifier */) === 0 &&
|
|
1666
|
+
text.indexOf('.') < 0 &&
|
|
1667
|
+
text.indexOf('E') < 0 &&
|
|
1668
|
+
text.indexOf('e') < 0);
|
|
1669
|
+
}
|
|
1670
|
+
emitPropertyAccessExpression(node) {
|
|
1671
|
+
const state = this.enterNode(node);
|
|
1672
|
+
this.emitExpression(node.expression, isOptionalChain(node) ? 19 /* OperatorPrecedence.OptionalChain */ : 20 /* OperatorPrecedence.Member */);
|
|
1673
|
+
let token = node.questionDotToken;
|
|
1674
|
+
if (token === undefined) {
|
|
1675
|
+
const dot = this.context.factory.createToken(24 /* SyntaxKind.DotToken */);
|
|
1676
|
+
dot.pos = node.expression.end;
|
|
1677
|
+
dot.end = node.name.pos;
|
|
1678
|
+
this.context.addEmitFlags(dot, 12 /* EmitFlags.NoSourceMap */);
|
|
1679
|
+
token = dot;
|
|
1680
|
+
}
|
|
1681
|
+
const linesBeforeDot = this.getLinesBetweenNodes(node, node.expression, token);
|
|
1682
|
+
this.lines(linesBeforeDot);
|
|
1683
|
+
this.indentIf(linesBeforeDot > 0, 1);
|
|
1684
|
+
if (token.kind !== 28 /* SyntaxKind.QuestionDotToken */ &&
|
|
1685
|
+
this.mayNeedDotDotForPropertyAccess(node.expression) &&
|
|
1686
|
+
!this.writer.hasTrailingComment() &&
|
|
1687
|
+
!this.writer.hasTrailingWhitespace())
|
|
1688
|
+
this.write1('.');
|
|
1689
|
+
if (node.questionDotToken !== undefined)
|
|
1690
|
+
this.emitTokenNode(token);
|
|
1691
|
+
else
|
|
1692
|
+
this.emitToken(24 /* SyntaxKind.DotToken */, node.expression.end, node);
|
|
1693
|
+
const linesAfterDot = this.getLinesBetweenNodes(node, token, node.name);
|
|
1694
|
+
this.lines(linesAfterDot);
|
|
1695
|
+
this.indentIf(linesAfterDot > 0, 1);
|
|
1696
|
+
this.emitMemberName(node.name);
|
|
1697
|
+
this.indentIf(linesAfterDot > 0, -1);
|
|
1698
|
+
this.indentIf(linesBeforeDot > 0, -1);
|
|
1699
|
+
this.exitNode(node, state);
|
|
1700
|
+
return true;
|
|
1701
|
+
}
|
|
1702
|
+
emitElementAccessExpression(node) {
|
|
1703
|
+
const state = this.enterNode(node);
|
|
1704
|
+
this.emitExpression(node.expression, isOptionalChain(node) ? 19 /* OperatorPrecedence.OptionalChain */ : 20 /* OperatorPrecedence.Member */);
|
|
1705
|
+
this.emitOptionalToken(node.questionDotToken);
|
|
1706
|
+
let pos = node.expression.end;
|
|
1707
|
+
if (node.questionDotToken !== undefined && node.questionDotToken.end > pos)
|
|
1708
|
+
pos = node.questionDotToken.end;
|
|
1709
|
+
this.emitToken(22 /* SyntaxKind.OpenBracketToken */, pos, node);
|
|
1710
|
+
this.emitExpression(node.argumentExpression, 0 /* OperatorPrecedence.Comma */);
|
|
1711
|
+
this.emitToken(23 /* SyntaxKind.CloseBracketToken */, node.argumentExpression.end, node);
|
|
1712
|
+
this.exitNode(node, state);
|
|
1713
|
+
return true;
|
|
1714
|
+
}
|
|
1715
|
+
emitCallee(callee, parent) {
|
|
1716
|
+
if (this.hasEmitFlag(parent, 1048576 /* EmitFlags.IndirectCall */)) {
|
|
1717
|
+
this.write1('(');
|
|
1718
|
+
this.write1('0');
|
|
1719
|
+
this.write1(', ');
|
|
1720
|
+
this.emitExpression(callee, 0 /* OperatorPrecedence.Comma */);
|
|
1721
|
+
return this.write1(')');
|
|
1722
|
+
}
|
|
1723
|
+
if (parent.kind === 214 /* SyntaxKind.CallExpression */ &&
|
|
1724
|
+
isNewExpressionWithoutArguments(skipPartiallyEmittedExpressions(callee)))
|
|
1725
|
+
return this.emitExpression(callee, 22 /* OperatorPrecedence.Parentheses */);
|
|
1726
|
+
return this.emitExpression(callee, isOptionalChain(parent) ? 19 /* OperatorPrecedence.OptionalChain */ : 20 /* OperatorPrecedence.Member */);
|
|
1727
|
+
}
|
|
1728
|
+
emitCallExpression(node) {
|
|
1729
|
+
const state = this.enterNode(node);
|
|
1730
|
+
this.emitCallee(node.expression, node);
|
|
1731
|
+
this.emitOptionalToken(node.questionDotToken);
|
|
1732
|
+
this.emitTypeArguments(node, node.typeArguments);
|
|
1733
|
+
this.emitList(13 /* ListItem.Argument */, node, node.arguments, 2576 /* ListFormat.CallExpressionArguments */);
|
|
1734
|
+
this.exitNode(node, state);
|
|
1735
|
+
return true;
|
|
1736
|
+
}
|
|
1737
|
+
emitNewExpression(node) {
|
|
1738
|
+
const state = this.enterNode(node);
|
|
1739
|
+
this.emitToken(104 /* SyntaxKind.NewKeyword */, node.pos, node);
|
|
1740
|
+
this.space();
|
|
1741
|
+
if (skipPartiallyEmittedExpressions(node.expression).kind === 214 /* SyntaxKind.CallExpression */)
|
|
1742
|
+
this.emitExpression(node.expression, 22 /* OperatorPrecedence.Parentheses */);
|
|
1743
|
+
else
|
|
1744
|
+
this.emitExpression(node.expression, 20 /* OperatorPrecedence.Member */);
|
|
1745
|
+
this.emitTypeArguments(node, node.typeArguments);
|
|
1746
|
+
this.emitList(13 /* ListItem.Argument */, node, node.arguments, 18960 /* ListFormat.NewExpressionArguments */);
|
|
1747
|
+
this.exitNode(node, state);
|
|
1748
|
+
return true;
|
|
1749
|
+
}
|
|
1750
|
+
emitTaggedTemplateExpression(node) {
|
|
1751
|
+
const state = this.enterNode(node);
|
|
1752
|
+
this.emitCallee(node.tag, node);
|
|
1753
|
+
this.emitTypeArguments(node, node.typeArguments);
|
|
1754
|
+
this.space();
|
|
1755
|
+
const template = node.template;
|
|
1756
|
+
if (template instanceof TemplateExpression)
|
|
1757
|
+
this.emitTemplateExpression(template);
|
|
1758
|
+
else
|
|
1759
|
+
this.emitLiteral(template);
|
|
1760
|
+
this.exitNode(node, state);
|
|
1761
|
+
return true;
|
|
1762
|
+
}
|
|
1763
|
+
emitParenthesizedExpression(node) {
|
|
1764
|
+
const state = this.enterNode(node);
|
|
1765
|
+
this.emitToken(20 /* SyntaxKind.OpenParenToken */, node.pos, node);
|
|
1766
|
+
const indented = this.writeLineSeparatorsAndIndentBefore(node.expression, node);
|
|
1767
|
+
this.emitExpression(node.expression, 0 /* OperatorPrecedence.Comma */);
|
|
1768
|
+
this.writeLineSeparatorsAfter(node.expression, node);
|
|
1769
|
+
this.indentIf(indented, -1);
|
|
1770
|
+
this.emitToken(21 /* SyntaxKind.CloseParenToken */, node.expression.end, node);
|
|
1771
|
+
this.exitNode(node, state);
|
|
1772
|
+
return true;
|
|
1773
|
+
}
|
|
1774
|
+
emitFunctionExpression(node) {
|
|
1775
|
+
const state = this.enterNode(node);
|
|
1776
|
+
this.generateNameIfNeeded(node.name);
|
|
1777
|
+
this.emitModifierList(node, node.modifiers, false);
|
|
1778
|
+
this.write1('function');
|
|
1779
|
+
this.emitOptionalToken(node.asteriskToken);
|
|
1780
|
+
this.space();
|
|
1781
|
+
if (node.name !== undefined)
|
|
1782
|
+
this.emitIdentifierName(node.name);
|
|
1783
|
+
this.emitScopedSignature(node, node.typeParameters, node.parameters, node.type, node.body, true);
|
|
1784
|
+
this.exitNode(node, state);
|
|
1785
|
+
return true;
|
|
1786
|
+
}
|
|
1787
|
+
emitConciseBody(node) {
|
|
1788
|
+
if (node instanceof Block)
|
|
1789
|
+
return this.emitFunctionBody(node);
|
|
1790
|
+
if (getLeftmostExpression(node, false).kind === 211 /* SyntaxKind.ObjectLiteralExpression */) {
|
|
1791
|
+
const paren = this.context.factory.createParenthesizedExpression(node);
|
|
1792
|
+
paren.pos = node.pos;
|
|
1793
|
+
paren.end = node.end;
|
|
1794
|
+
return this.emitExpression(paren, 0 /* OperatorPrecedence.Lowest */);
|
|
1795
|
+
}
|
|
1796
|
+
if (isExpression(node))
|
|
1797
|
+
return this.emitExpression(node, 2 /* OperatorPrecedence.Yield */);
|
|
1798
|
+
throw new Error('Unexpected concise body ' + node.kind);
|
|
1799
|
+
}
|
|
1800
|
+
emitArrowFunction(node) {
|
|
1801
|
+
const state = this.enterNode(node);
|
|
1802
|
+
this.emitModifierList(node, node.modifiers, false);
|
|
1803
|
+
const indented = this.indentIf(this.shouldEmitIndented(node), 1);
|
|
1804
|
+
this.pushNameGenerationScope(node);
|
|
1805
|
+
this.emitTypeParameters(node, node.typeParameters);
|
|
1806
|
+
this.emitParametersForArrow(node, node.parameters);
|
|
1807
|
+
this.emitTypeAnnotation(node.type);
|
|
1808
|
+
this.space();
|
|
1809
|
+
this.emitOptionalToken(node.equalsGreaterThanToken);
|
|
1810
|
+
this.space();
|
|
1811
|
+
this.emitConciseBody(node.body);
|
|
1812
|
+
this.popNameGenerationScope(node);
|
|
1813
|
+
this.indentIf(indented, -1);
|
|
1814
|
+
this.exitNode(node, state);
|
|
1815
|
+
return true;
|
|
1816
|
+
}
|
|
1817
|
+
/** `delete`, `typeof`, `void` and `await` expressions. */
|
|
1818
|
+
emitKeywordUnary(node, keyword, operand) {
|
|
1819
|
+
const state = this.enterNode(node);
|
|
1820
|
+
this.emitToken(keyword, node.pos, node);
|
|
1821
|
+
this.space();
|
|
1822
|
+
this.emitExpression(operand, 16 /* OperatorPrecedence.Unary */);
|
|
1823
|
+
this.exitNode(node, state);
|
|
1824
|
+
return true;
|
|
1825
|
+
}
|
|
1826
|
+
emitPrefixUnaryExpression(node) {
|
|
1827
|
+
const state = this.enterNode(node);
|
|
1828
|
+
const operator = node.operator;
|
|
1829
|
+
const operand = node.operand;
|
|
1830
|
+
this.emitToken(operator, node.pos, node);
|
|
1831
|
+
if (operand instanceof PrefixUnaryExpression) {
|
|
1832
|
+
const inner = operand.operator;
|
|
1833
|
+
if ((operator === 39 /* SyntaxKind.PlusToken */ && (inner === 39 /* SyntaxKind.PlusToken */ || inner === 45 /* SyntaxKind.PlusPlusToken */)) ||
|
|
1834
|
+
(operator === 40 /* SyntaxKind.MinusToken */ &&
|
|
1835
|
+
(inner === 40 /* SyntaxKind.MinusToken */ || inner === 46 /* SyntaxKind.MinusMinusToken */)))
|
|
1836
|
+
this.space();
|
|
1837
|
+
}
|
|
1838
|
+
this.emitExpression(operand, 16 /* OperatorPrecedence.Unary */);
|
|
1839
|
+
this.exitNode(node, state);
|
|
1840
|
+
return true;
|
|
1841
|
+
}
|
|
1842
|
+
emitPostfixUnaryExpression(node) {
|
|
1843
|
+
const state = this.enterNode(node);
|
|
1844
|
+
this.emitExpression(node.operand, 18 /* OperatorPrecedence.LeftHandSide */);
|
|
1845
|
+
this.emitToken(node.operator, node.operand.end, node);
|
|
1846
|
+
this.exitNode(node, state);
|
|
1847
|
+
return true;
|
|
1848
|
+
}
|
|
1849
|
+
/** The literal kind shared by all operands of a chain of `+`, or Unknown. */
|
|
1850
|
+
getLiteralKindOfBinaryPlusOperand(node) {
|
|
1851
|
+
node = skipPartiallyEmittedExpressions(node);
|
|
1852
|
+
if (isLiteralKind(node.kind))
|
|
1853
|
+
return node.kind;
|
|
1854
|
+
if (node instanceof BinaryExpression && node.operatorToken.kind === 39 /* SyntaxKind.PlusToken */) {
|
|
1855
|
+
const left = this.getLiteralKindOfBinaryPlusOperand(node.left);
|
|
1856
|
+
if (isLiteralKind(left) && left === this.getLiteralKindOfBinaryPlusOperand(node.right))
|
|
1857
|
+
return left;
|
|
1858
|
+
}
|
|
1859
|
+
return 0 /* SyntaxKind.Unknown */;
|
|
1860
|
+
}
|
|
1861
|
+
/** The precedence the right operand of a binary expression needs; the left's is `getExpressionPrecedence`. */
|
|
1862
|
+
getBinaryRightPrecedence(node, precedence) {
|
|
1863
|
+
switch (precedence) {
|
|
1864
|
+
case 3 /* OperatorPrecedence.Assignment */:
|
|
1865
|
+
return 2 /* OperatorPrecedence.Yield */;
|
|
1866
|
+
case 5 /* OperatorPrecedence.LogicalOR */:
|
|
1867
|
+
return 6 /* OperatorPrecedence.LogicalAND */;
|
|
1868
|
+
case 6 /* OperatorPrecedence.LogicalAND */:
|
|
1869
|
+
return 7 /* OperatorPrecedence.BitwiseOR */;
|
|
1870
|
+
case 10 /* OperatorPrecedence.Equality */:
|
|
1871
|
+
return 11 /* OperatorPrecedence.Relational */;
|
|
1872
|
+
case 11 /* OperatorPrecedence.Relational */:
|
|
1873
|
+
return 12 /* OperatorPrecedence.Shift */;
|
|
1874
|
+
case 12 /* OperatorPrecedence.Shift */:
|
|
1875
|
+
return 13 /* OperatorPrecedence.Additive */;
|
|
1876
|
+
case 13 /* OperatorPrecedence.Additive */:
|
|
1877
|
+
if (node.operatorToken.kind === 39 /* SyntaxKind.PlusToken */ && isBinaryOperation(node.right, 39 /* SyntaxKind.PlusToken */)) {
|
|
1878
|
+
const left = this.getLiteralKindOfBinaryPlusOperand(node.left);
|
|
1879
|
+
if (isLiteralKind(left) && left === this.getLiteralKindOfBinaryPlusOperand(node.right))
|
|
1880
|
+
return precedence;
|
|
1881
|
+
}
|
|
1882
|
+
return 14 /* OperatorPrecedence.Multiplicative */;
|
|
1883
|
+
case 14 /* OperatorPrecedence.Multiplicative */:
|
|
1884
|
+
if (node.operatorToken.kind === 41 /* SyntaxKind.AsteriskToken */ &&
|
|
1885
|
+
isBinaryOperation(node.right, 41 /* SyntaxKind.AsteriskToken */))
|
|
1886
|
+
return precedence;
|
|
1887
|
+
return 15 /* OperatorPrecedence.Exponentiation */;
|
|
1888
|
+
}
|
|
1889
|
+
return precedence;
|
|
1890
|
+
}
|
|
1891
|
+
emitBinaryExpression(node) {
|
|
1892
|
+
const precedence = getExpressionPrecedence(node);
|
|
1893
|
+
let leftPrec = precedence;
|
|
1894
|
+
if (precedence === 3 /* OperatorPrecedence.Assignment */)
|
|
1895
|
+
leftPrec = 4 /* OperatorPrecedence.Conditional */;
|
|
1896
|
+
else if (precedence === 15 /* OperatorPrecedence.Exponentiation */)
|
|
1897
|
+
leftPrec = 17 /* OperatorPrecedence.Update */;
|
|
1898
|
+
let rightPrec = this.getBinaryRightPrecedence(node, precedence);
|
|
1899
|
+
const operator = node.operatorToken.kind;
|
|
1900
|
+
const left = skipPartiallyEmittedExpressions(node.left);
|
|
1901
|
+
if (nodeIsSynthesized(left) &&
|
|
1902
|
+
left instanceof BinaryExpression &&
|
|
1903
|
+
mixingBinaryOperatorsRequiresParentheses(operator, left.operatorToken.kind))
|
|
1904
|
+
leftPrec = 22 /* OperatorPrecedence.Highest */;
|
|
1905
|
+
const right = skipPartiallyEmittedExpressions(node.right);
|
|
1906
|
+
if (nodeIsSynthesized(right) &&
|
|
1907
|
+
right instanceof BinaryExpression &&
|
|
1908
|
+
mixingBinaryOperatorsRequiresParentheses(operator, right.operatorToken.kind))
|
|
1909
|
+
rightPrec = 22 /* OperatorPrecedence.Highest */;
|
|
1910
|
+
const state = this.enterNode(node);
|
|
1911
|
+
this.emitExpression(node.left, leftPrec);
|
|
1912
|
+
const linesBefore = this.getLinesBetweenNodes(node, node.left, node.operatorToken);
|
|
1913
|
+
const linesAfter = this.getLinesBetweenNodes(node, node.operatorToken, node.right);
|
|
1914
|
+
this.writeLinesAndIndent(linesBefore, operator !== 27 /* SyntaxKind.CommaToken */);
|
|
1915
|
+
this.emitTokenNodeEx(node.operatorToken, 4 /* TokenEmitFlags.NoSourceMaps */);
|
|
1916
|
+
this.writeLinesAndIndent(linesAfter, true);
|
|
1917
|
+
this.emitExpression(node.right, rightPrec);
|
|
1918
|
+
this.indentIf(linesAfter > 0, -1);
|
|
1919
|
+
this.indentIf(linesBefore > 0, -1);
|
|
1920
|
+
this.exitNode(node, state);
|
|
1921
|
+
return true;
|
|
1922
|
+
}
|
|
1923
|
+
emitConditionalExpression(node) {
|
|
1924
|
+
const state = this.enterNode(node);
|
|
1925
|
+
const linesBeforeQuestion = this.getLinesBetweenNodes(node, node.condition, node.questionToken);
|
|
1926
|
+
const linesAfterQuestion = this.getLinesBetweenNodes(node, node.questionToken, node.whenTrue);
|
|
1927
|
+
const linesBeforeColon = this.getLinesBetweenNodes(node, node.whenTrue, node.colonToken);
|
|
1928
|
+
const linesAfterColon = this.getLinesBetweenNodes(node, node.colonToken, node.whenFalse);
|
|
1929
|
+
this.emitExpression(node.condition, isBinaryOperation(skipPartiallyEmittedExpressions(node.condition), 60 /* SyntaxKind.QuestionQuestionToken */)
|
|
1930
|
+
? 5 /* OperatorPrecedence.Coalesce */
|
|
1931
|
+
: 5 /* OperatorPrecedence.LogicalOR */);
|
|
1932
|
+
this.writeLinesAndIndent(linesBeforeQuestion, true);
|
|
1933
|
+
this.emitOptionalToken(node.questionToken);
|
|
1934
|
+
this.writeLinesAndIndent(linesAfterQuestion, true);
|
|
1935
|
+
this.emitExpression(node.whenTrue, 2 /* OperatorPrecedence.Yield */);
|
|
1936
|
+
this.indentIf(linesAfterQuestion > 0, -1);
|
|
1937
|
+
this.indentIf(linesBeforeQuestion > 0, -1);
|
|
1938
|
+
this.writeLinesAndIndent(linesBeforeColon, true);
|
|
1939
|
+
this.emitOptionalToken(node.colonToken);
|
|
1940
|
+
this.writeLinesAndIndent(linesAfterColon, true);
|
|
1941
|
+
this.emitExpression(node.whenFalse, 2 /* OperatorPrecedence.Yield */);
|
|
1942
|
+
this.indentIf(linesAfterColon > 0, -1);
|
|
1943
|
+
this.indentIf(linesBeforeColon > 0, -1);
|
|
1944
|
+
this.exitNode(node, state);
|
|
1945
|
+
return true;
|
|
1946
|
+
}
|
|
1947
|
+
emitTemplateExpression(node) {
|
|
1948
|
+
const state = this.enterNode(node);
|
|
1949
|
+
this.emitLiteral(node.head);
|
|
1950
|
+
this.emitList(14 /* ListItem.TemplateSpan */, node, node.templateSpans, 262144 /* ListFormat.TemplateExpressionSpans */);
|
|
1951
|
+
this.exitNode(node, state);
|
|
1952
|
+
return true;
|
|
1953
|
+
}
|
|
1954
|
+
emitYieldExpression(node) {
|
|
1955
|
+
const state = this.enterNode(node);
|
|
1956
|
+
this.emitToken(126 /* SyntaxKind.YieldKeyword */, node.pos, node);
|
|
1957
|
+
this.emitOptionalToken(node.asteriskToken);
|
|
1958
|
+
if (node.expression !== undefined) {
|
|
1959
|
+
this.space();
|
|
1960
|
+
this.emitExpressionNoASI(node.expression, 2 /* OperatorPrecedence.DisallowComma */);
|
|
1961
|
+
}
|
|
1962
|
+
this.exitNode(node, state);
|
|
1963
|
+
return true;
|
|
1964
|
+
}
|
|
1965
|
+
emitSpreadElement(node) {
|
|
1966
|
+
const state = this.enterNode(node);
|
|
1967
|
+
this.emitToken(25 /* SyntaxKind.DotDotDotToken */, node.pos, node);
|
|
1968
|
+
this.emitExpression(node.expression, 2 /* OperatorPrecedence.DisallowComma */);
|
|
1969
|
+
this.exitNode(node, state);
|
|
1970
|
+
return true;
|
|
1971
|
+
}
|
|
1972
|
+
emitClassLike(node, modifiers, name, typeParameters, heritageClauses, members) {
|
|
1973
|
+
const state = this.enterNode(node);
|
|
1974
|
+
this.generateNameIfNeeded(name);
|
|
1975
|
+
const pos = this.emitModifierList(node, modifiers, true);
|
|
1976
|
+
this.emitToken(85 /* SyntaxKind.ClassKeyword */, pos, node);
|
|
1977
|
+
if (name !== undefined) {
|
|
1978
|
+
this.space();
|
|
1979
|
+
this.emitIdentifierName(name);
|
|
1980
|
+
}
|
|
1981
|
+
const indented = this.indentIf(this.shouldEmitIndented(node), 1);
|
|
1982
|
+
this.emitTypeParameters(node, typeParameters);
|
|
1983
|
+
this.emitList(17 /* ListItem.HeritageClause */, node, heritageClauses, 0 /* ListFormat.ClassHeritageClauses */);
|
|
1984
|
+
this.write1(' {');
|
|
1985
|
+
this.pushNameGenerationScope(node);
|
|
1986
|
+
this.generateAllMemberNames(members);
|
|
1987
|
+
this.emitList(5 /* ListItem.ClassElement */, node, members, 129 /* ListFormat.ClassMembers */);
|
|
1988
|
+
this.popNameGenerationScope(node);
|
|
1989
|
+
this.write1('}');
|
|
1990
|
+
this.indentIf(indented, -1);
|
|
1991
|
+
this.exitNode(node, state);
|
|
1992
|
+
return true;
|
|
1993
|
+
}
|
|
1994
|
+
emitExpressionWithTypeArguments(node) {
|
|
1995
|
+
const state = this.enterNode(node);
|
|
1996
|
+
this.emitExpression(node.expression, 20 /* OperatorPrecedence.Member */);
|
|
1997
|
+
this.emitTypeArguments(node, node.typeArguments);
|
|
1998
|
+
this.exitNode(node, state);
|
|
1999
|
+
return true;
|
|
2000
|
+
}
|
|
2001
|
+
/** `as` and `satisfies` expressions. */
|
|
2002
|
+
emitTypeRelation(node, expression, keyword, type) {
|
|
2003
|
+
const state = this.enterNode(node);
|
|
2004
|
+
this.emitExpression(expression, 11 /* OperatorPrecedence.Relational */);
|
|
2005
|
+
this.space();
|
|
2006
|
+
this.write1(keyword);
|
|
2007
|
+
this.space();
|
|
2008
|
+
this.emitTypeNodeOutsideExtends(type);
|
|
2009
|
+
this.exitNode(node, state);
|
|
2010
|
+
return true;
|
|
2011
|
+
}
|
|
2012
|
+
emitPartiallyEmittedExpression(node) {
|
|
2013
|
+
// Nested partially emitted expressions share one pass so their parentheses aren't repeated.
|
|
2014
|
+
const nodes = [];
|
|
2015
|
+
const states = [];
|
|
2016
|
+
for (;;) {
|
|
2017
|
+
const state = this.enterNode(node);
|
|
2018
|
+
if (!this.hasEmitFlag(node, 128 /* EmitFlags.NoLeadingComments */) && node.pos !== node.expression.pos)
|
|
2019
|
+
this.emitTrailingCommentsOfPosition(node.expression.pos, false, false);
|
|
2020
|
+
nodes.push(node);
|
|
2021
|
+
states.push(state);
|
|
2022
|
+
const inner = node.expression;
|
|
2023
|
+
if (!(inner instanceof PartiallyEmittedExpression))
|
|
2024
|
+
break;
|
|
2025
|
+
node = inner;
|
|
2026
|
+
}
|
|
2027
|
+
this.emitExpression(node.expression, 0 /* OperatorPrecedence.Lowest */);
|
|
2028
|
+
for (let i = nodes.length - 1; i >= 0; i--) {
|
|
2029
|
+
if (!this.hasEmitFlag(node, 256 /* EmitFlags.NoTrailingComments */) && node.end !== node.expression.end)
|
|
2030
|
+
this.emitLeadingCommentsOfPosition(node.expression.end);
|
|
2031
|
+
this.exitNode(node, states[i]);
|
|
2032
|
+
node = nodes[i];
|
|
2033
|
+
}
|
|
2034
|
+
return true;
|
|
2035
|
+
}
|
|
2036
|
+
commentWillEmitNewLine(comment) {
|
|
2037
|
+
return comment.kind === 2 /* SyntaxKind.SingleLineCommentTrivia */ || comment.hasTrailingNewLine;
|
|
2038
|
+
}
|
|
2039
|
+
willEmitLeadingNewLine(node) {
|
|
2040
|
+
if (this.currentSourceFile === undefined)
|
|
2041
|
+
return false;
|
|
2042
|
+
const comments = getLeadingCommentRanges(this.sourceText, node.pos);
|
|
2043
|
+
let hasNewLineComment = false;
|
|
2044
|
+
if (comments !== undefined) {
|
|
2045
|
+
for (const comment of comments)
|
|
2046
|
+
if (this.commentWillEmitNewLine(comment))
|
|
2047
|
+
hasNewLineComment = true;
|
|
2048
|
+
const parseNode = this.context.parseNode(node);
|
|
2049
|
+
if (parseNode !== undefined &&
|
|
2050
|
+
parseNode.parent !== undefined &&
|
|
2051
|
+
parseNode.parent.kind === 218 /* SyntaxKind.ParenthesizedExpression */)
|
|
2052
|
+
return true;
|
|
2053
|
+
}
|
|
2054
|
+
if (hasNewLineComment)
|
|
2055
|
+
return true;
|
|
2056
|
+
const synthesized = this.context.getSyntheticLeadingComments(node);
|
|
2057
|
+
if (synthesized !== undefined)
|
|
2058
|
+
for (let i = 0; i < synthesized.length; i++)
|
|
2059
|
+
if (synthesized[i].kind === 2 /* SyntaxKind.SingleLineCommentTrivia */ || synthesized[i].hasTrailingNewLine)
|
|
2060
|
+
return true;
|
|
2061
|
+
if (node instanceof PartiallyEmittedExpression) {
|
|
2062
|
+
if (node.pos !== node.expression.pos) {
|
|
2063
|
+
const trailing = getTrailingCommentRanges(this.sourceText, node.expression.pos);
|
|
2064
|
+
if (trailing !== undefined)
|
|
2065
|
+
for (const comment of trailing)
|
|
2066
|
+
if (this.commentWillEmitNewLine(comment))
|
|
2067
|
+
return true;
|
|
2068
|
+
}
|
|
2069
|
+
return this.willEmitLeadingNewLine(node.expression);
|
|
2070
|
+
}
|
|
2071
|
+
return false;
|
|
2072
|
+
}
|
|
2073
|
+
/** Parenthesizes an expression whose leading comments would put a line break after `return` or `throw`. */
|
|
2074
|
+
parenthesizeExpressionForNoAsi(node) {
|
|
2075
|
+
if (this.commentsDisabled)
|
|
2076
|
+
return node;
|
|
2077
|
+
const factory = this.context.factory;
|
|
2078
|
+
if (node instanceof PartiallyEmittedExpression) {
|
|
2079
|
+
if (this.willEmitLeadingNewLine(node)) {
|
|
2080
|
+
const parseNode = this.context.parseNode(node);
|
|
2081
|
+
if (parseNode instanceof ParenthesizedExpression) {
|
|
2082
|
+
const parens = factory.createParenthesizedExpression(node.expression);
|
|
2083
|
+
this.context.setOriginal(parens, node);
|
|
2084
|
+
parens.pos = parseNode.pos;
|
|
2085
|
+
parens.end = parseNode.end;
|
|
2086
|
+
return parens;
|
|
2087
|
+
}
|
|
2088
|
+
return factory.createParenthesizedExpression(node);
|
|
2089
|
+
}
|
|
2090
|
+
return factory.updatePartiallyEmittedExpression(node, this.parenthesizeExpressionForNoAsi(node.expression));
|
|
2091
|
+
}
|
|
2092
|
+
if (node instanceof PropertyAccessExpression)
|
|
2093
|
+
return factory.updatePropertyAccessExpression(node, this.parenthesizeExpressionForNoAsi(node.expression), node.questionDotToken, node.name, node.flags);
|
|
2094
|
+
if (node instanceof ElementAccessExpression)
|
|
2095
|
+
return factory.updateElementAccessExpression(node, this.parenthesizeExpressionForNoAsi(node.expression), node.questionDotToken, node.argumentExpression, node.flags);
|
|
2096
|
+
if (node instanceof CallExpression)
|
|
2097
|
+
return factory.updateCallExpression(node, this.parenthesizeExpressionForNoAsi(node.expression), node.questionDotToken, node.typeArguments, node.arguments, node.flags);
|
|
2098
|
+
if (node instanceof TaggedTemplateExpression)
|
|
2099
|
+
return factory.updateTaggedTemplateExpression(node, this.parenthesizeExpressionForNoAsi(node.tag), node.questionDotToken, node.typeArguments, node.template, node.flags);
|
|
2100
|
+
if (node instanceof PostfixUnaryExpression)
|
|
2101
|
+
return factory.updatePostfixUnaryExpression(node, this.parenthesizeExpressionForNoAsi(node.operand), node.operator);
|
|
2102
|
+
if (node instanceof BinaryExpression)
|
|
2103
|
+
return factory.updateBinaryExpression(node, node.modifiers, this.parenthesizeExpressionForNoAsi(node.left), node.type, node.operatorToken, node.right);
|
|
2104
|
+
if (node instanceof ConditionalExpression)
|
|
2105
|
+
return factory.updateConditionalExpression(node, this.parenthesizeExpressionForNoAsi(node.condition), node.questionToken, node.whenTrue, node.colonToken, node.whenFalse);
|
|
2106
|
+
if (node instanceof AsExpression)
|
|
2107
|
+
return factory.updateAsExpression(node, this.parenthesizeExpressionForNoAsi(node.expression), node.type);
|
|
2108
|
+
if (node instanceof SatisfiesExpression)
|
|
2109
|
+
return factory.updateSatisfiesExpression(node, this.parenthesizeExpressionForNoAsi(node.expression), node.type);
|
|
2110
|
+
if (node instanceof NonNullExpression)
|
|
2111
|
+
return factory.updateNonNullExpression(node, this.parenthesizeExpressionForNoAsi(node.expression), node.flags);
|
|
2112
|
+
return node;
|
|
2113
|
+
}
|
|
2114
|
+
emitExpressionNoASI(node, precedence) {
|
|
2115
|
+
return this.emitExpression(this.parenthesizeExpressionForNoAsi(node), precedence);
|
|
2116
|
+
}
|
|
2117
|
+
emitExpression(node, precedence) {
|
|
2118
|
+
const parens = getExpressionPrecedence(skipPartiallyEmittedExpressions(node)) < precedence;
|
|
2119
|
+
if (parens)
|
|
2120
|
+
this.write1('(');
|
|
2121
|
+
this.emitExpressionWorker(node);
|
|
2122
|
+
if (parens)
|
|
2123
|
+
this.write1(')');
|
|
2124
|
+
return true;
|
|
2125
|
+
}
|
|
2126
|
+
emitExpressionWorker(node) {
|
|
2127
|
+
switch (node.kind) {
|
|
2128
|
+
case 111 /* SyntaxKind.TrueKeyword */:
|
|
2129
|
+
case 96 /* SyntaxKind.FalseKeyword */:
|
|
2130
|
+
case 105 /* SyntaxKind.NullKeyword */:
|
|
2131
|
+
case 109 /* SyntaxKind.ThisKeyword */:
|
|
2132
|
+
case 107 /* SyntaxKind.SuperKeyword */:
|
|
2133
|
+
case 101 /* SyntaxKind.ImportKeyword */:
|
|
2134
|
+
return this.emitTokenNode(node);
|
|
2135
|
+
case 8 /* SyntaxKind.NumericLiteral */:
|
|
2136
|
+
case 9 /* SyntaxKind.BigIntLiteral */:
|
|
2137
|
+
case 10 /* SyntaxKind.StringLiteral */:
|
|
2138
|
+
case 13 /* SyntaxKind.RegularExpressionLiteral */:
|
|
2139
|
+
case 14 /* SyntaxKind.NoSubstitutionTemplateLiteral */:
|
|
2140
|
+
return this.emitLiteral(node);
|
|
2141
|
+
case 79 /* SyntaxKind.Identifier */:
|
|
2142
|
+
if (node instanceof Identifier)
|
|
2143
|
+
return this.emitIdentifierReference(node);
|
|
2144
|
+
break;
|
|
2145
|
+
case 80 /* SyntaxKind.PrivateIdentifier */:
|
|
2146
|
+
if (node instanceof PrivateIdentifier)
|
|
2147
|
+
return this.emitPrivateIdentifier(node);
|
|
2148
|
+
break;
|
|
2149
|
+
case 210 /* SyntaxKind.ArrayLiteralExpression */:
|
|
2150
|
+
if (node instanceof ArrayLiteralExpression)
|
|
2151
|
+
return this.emitArrayLiteralExpression(node);
|
|
2152
|
+
break;
|
|
2153
|
+
case 211 /* SyntaxKind.ObjectLiteralExpression */:
|
|
2154
|
+
if (node instanceof ObjectLiteralExpression)
|
|
2155
|
+
return this.emitObjectLiteralExpression(node);
|
|
2156
|
+
break;
|
|
2157
|
+
case 212 /* SyntaxKind.PropertyAccessExpression */:
|
|
2158
|
+
if (node instanceof PropertyAccessExpression)
|
|
2159
|
+
return this.emitPropertyAccessExpression(node);
|
|
2160
|
+
break;
|
|
2161
|
+
case 213 /* SyntaxKind.ElementAccessExpression */:
|
|
2162
|
+
if (node instanceof ElementAccessExpression)
|
|
2163
|
+
return this.emitElementAccessExpression(node);
|
|
2164
|
+
break;
|
|
2165
|
+
case 214 /* SyntaxKind.CallExpression */:
|
|
2166
|
+
if (node instanceof CallExpression)
|
|
2167
|
+
return this.emitCallExpression(node);
|
|
2168
|
+
break;
|
|
2169
|
+
case 215 /* SyntaxKind.NewExpression */:
|
|
2170
|
+
if (node instanceof NewExpression)
|
|
2171
|
+
return this.emitNewExpression(node);
|
|
2172
|
+
break;
|
|
2173
|
+
case 216 /* SyntaxKind.TaggedTemplateExpression */:
|
|
2174
|
+
if (node instanceof TaggedTemplateExpression)
|
|
2175
|
+
return this.emitTaggedTemplateExpression(node);
|
|
2176
|
+
break;
|
|
2177
|
+
case 217 /* SyntaxKind.TypeAssertionExpression */:
|
|
2178
|
+
if (node instanceof TypeAssertion) {
|
|
2179
|
+
const state = this.enterNode(node);
|
|
2180
|
+
this.write1('<');
|
|
2181
|
+
this.emitTypeNodeOutsideExtends(node.type);
|
|
2182
|
+
this.write1('>');
|
|
2183
|
+
this.emitExpression(node.expression, 17 /* OperatorPrecedence.Update */);
|
|
2184
|
+
this.exitNode(node, state);
|
|
2185
|
+
return true;
|
|
2186
|
+
}
|
|
2187
|
+
break;
|
|
2188
|
+
case 218 /* SyntaxKind.ParenthesizedExpression */:
|
|
2189
|
+
if (node instanceof ParenthesizedExpression)
|
|
2190
|
+
return this.emitParenthesizedExpression(node);
|
|
2191
|
+
break;
|
|
2192
|
+
case 219 /* SyntaxKind.FunctionExpression */:
|
|
2193
|
+
if (node instanceof FunctionExpression)
|
|
2194
|
+
return this.emitFunctionExpression(node);
|
|
2195
|
+
break;
|
|
2196
|
+
case 220 /* SyntaxKind.ArrowFunction */:
|
|
2197
|
+
if (node instanceof ArrowFunction)
|
|
2198
|
+
return this.emitArrowFunction(node);
|
|
2199
|
+
break;
|
|
2200
|
+
case 221 /* SyntaxKind.DeleteExpression */:
|
|
2201
|
+
if (node instanceof DeleteExpression)
|
|
2202
|
+
return this.emitKeywordUnary(node, 90 /* SyntaxKind.DeleteKeyword */, node.expression);
|
|
2203
|
+
break;
|
|
2204
|
+
case 222 /* SyntaxKind.TypeOfExpression */:
|
|
2205
|
+
if (node instanceof TypeOfExpression)
|
|
2206
|
+
return this.emitKeywordUnary(node, 113 /* SyntaxKind.TypeOfKeyword */, node.expression);
|
|
2207
|
+
break;
|
|
2208
|
+
case 223 /* SyntaxKind.VoidExpression */:
|
|
2209
|
+
if (node instanceof VoidExpression)
|
|
2210
|
+
return this.emitKeywordUnary(node, 115 /* SyntaxKind.VoidKeyword */, node.expression);
|
|
2211
|
+
break;
|
|
2212
|
+
case 224 /* SyntaxKind.AwaitExpression */:
|
|
2213
|
+
if (node instanceof AwaitExpression)
|
|
2214
|
+
return this.emitKeywordUnary(node, 134 /* SyntaxKind.AwaitKeyword */, node.expression);
|
|
2215
|
+
break;
|
|
2216
|
+
case 225 /* SyntaxKind.PrefixUnaryExpression */:
|
|
2217
|
+
if (node instanceof PrefixUnaryExpression)
|
|
2218
|
+
return this.emitPrefixUnaryExpression(node);
|
|
2219
|
+
break;
|
|
2220
|
+
case 226 /* SyntaxKind.PostfixUnaryExpression */:
|
|
2221
|
+
if (node instanceof PostfixUnaryExpression)
|
|
2222
|
+
return this.emitPostfixUnaryExpression(node);
|
|
2223
|
+
break;
|
|
2224
|
+
case 227 /* SyntaxKind.BinaryExpression */:
|
|
2225
|
+
if (node instanceof BinaryExpression)
|
|
2226
|
+
return this.emitBinaryExpression(node);
|
|
2227
|
+
break;
|
|
2228
|
+
case 228 /* SyntaxKind.ConditionalExpression */:
|
|
2229
|
+
if (node instanceof ConditionalExpression)
|
|
2230
|
+
return this.emitConditionalExpression(node);
|
|
2231
|
+
break;
|
|
2232
|
+
case 229 /* SyntaxKind.TemplateExpression */:
|
|
2233
|
+
if (node instanceof TemplateExpression)
|
|
2234
|
+
return this.emitTemplateExpression(node);
|
|
2235
|
+
break;
|
|
2236
|
+
case 230 /* SyntaxKind.YieldExpression */:
|
|
2237
|
+
if (node instanceof YieldExpression)
|
|
2238
|
+
return this.emitYieldExpression(node);
|
|
2239
|
+
break;
|
|
2240
|
+
case 231 /* SyntaxKind.SpreadElement */:
|
|
2241
|
+
if (node instanceof SpreadElement)
|
|
2242
|
+
return this.emitSpreadElement(node);
|
|
2243
|
+
break;
|
|
2244
|
+
case 232 /* SyntaxKind.ClassExpression */:
|
|
2245
|
+
if (node instanceof ClassExpression)
|
|
2246
|
+
return this.emitClassLike(node, node.modifiers, node.name, node.typeParameters, node.heritageClauses, node.members);
|
|
2247
|
+
break;
|
|
2248
|
+
case 233 /* SyntaxKind.OmittedExpression */:
|
|
2249
|
+
return this.emitSimpleNode(node, '');
|
|
2250
|
+
case 235 /* SyntaxKind.AsExpression */:
|
|
2251
|
+
if (node instanceof AsExpression)
|
|
2252
|
+
return this.emitTypeRelation(node, node.expression, 'as', node.type);
|
|
2253
|
+
break;
|
|
2254
|
+
case 239 /* SyntaxKind.SatisfiesExpression */:
|
|
2255
|
+
if (node instanceof SatisfiesExpression)
|
|
2256
|
+
return this.emitTypeRelation(node, node.expression, 'satisfies', node.type);
|
|
2257
|
+
break;
|
|
2258
|
+
case 236 /* SyntaxKind.NonNullExpression */:
|
|
2259
|
+
if (node instanceof NonNullExpression) {
|
|
2260
|
+
const state = this.enterNode(node);
|
|
2261
|
+
this.emitExpression(node.expression, 20 /* OperatorPrecedence.Member */);
|
|
2262
|
+
this.write1('!');
|
|
2263
|
+
this.exitNode(node, state);
|
|
2264
|
+
return true;
|
|
2265
|
+
}
|
|
2266
|
+
break;
|
|
2267
|
+
case 234 /* SyntaxKind.ExpressionWithTypeArguments */:
|
|
2268
|
+
if (node instanceof ExpressionWithTypeArguments)
|
|
2269
|
+
return this.emitExpressionWithTypeArguments(node);
|
|
2270
|
+
break;
|
|
2271
|
+
case 237 /* SyntaxKind.MetaProperty */:
|
|
2272
|
+
if (node instanceof MetaProperty) {
|
|
2273
|
+
const state = this.enterNode(node);
|
|
2274
|
+
this.emitToken(node.keywordToken, node.pos, node);
|
|
2275
|
+
this.write1('.');
|
|
2276
|
+
this.emitIdentifierName(node.name);
|
|
2277
|
+
this.exitNode(node, state);
|
|
2278
|
+
return true;
|
|
2279
|
+
}
|
|
2280
|
+
break;
|
|
2281
|
+
case 283 /* SyntaxKind.MissingDeclaration */:
|
|
2282
|
+
case 347 /* SyntaxKind.NotEmittedStatement */:
|
|
2283
|
+
return false;
|
|
2284
|
+
case 285 /* SyntaxKind.JsxElement */:
|
|
2285
|
+
if (node instanceof JsxElement)
|
|
2286
|
+
return this.emitJsxElement(node);
|
|
2287
|
+
break;
|
|
2288
|
+
case 286 /* SyntaxKind.JsxSelfClosingElement */:
|
|
2289
|
+
if (node instanceof JsxSelfClosingElement)
|
|
2290
|
+
return this.emitJsxSelfClosingElement(node);
|
|
2291
|
+
break;
|
|
2292
|
+
case 289 /* SyntaxKind.JsxFragment */:
|
|
2293
|
+
if (node instanceof JsxFragment)
|
|
2294
|
+
return this.emitJsxFragment(node);
|
|
2295
|
+
break;
|
|
2296
|
+
case 348 /* SyntaxKind.PartiallyEmittedExpression */:
|
|
2297
|
+
if (node instanceof PartiallyEmittedExpression)
|
|
2298
|
+
return this.emitPartiallyEmittedExpression(node);
|
|
2299
|
+
break;
|
|
2300
|
+
}
|
|
2301
|
+
throw new Error('Unexpected expression ' + node.kind);
|
|
2302
|
+
}
|
|
2303
|
+
// Statements
|
|
2304
|
+
isEmptyBlock(block, statements) {
|
|
2305
|
+
return (statements.nodes.length === 0 &&
|
|
2306
|
+
(this.currentSourceFile === undefined || this.rangeEndIsOnSameLineAsRangeStart(block.end, block.pos)));
|
|
2307
|
+
}
|
|
2308
|
+
emitBlock(node) {
|
|
2309
|
+
const state = this.enterNode(node);
|
|
2310
|
+
this.generateNames(node);
|
|
2311
|
+
this.emitToken(18 /* SyntaxKind.OpenBraceToken */, node.pos, node);
|
|
2312
|
+
const format = (!node.multiLine && this.isEmptyBlock(node, node.statements)) || this.shouldEmitOnSingleLine(node)
|
|
2313
|
+
? 768 /* ListFormat.SingleLineBlockStatements */
|
|
2314
|
+
: 129 /* ListFormat.MultiLineBlockStatements */;
|
|
2315
|
+
this.emitList(15 /* ListItem.Statement */, node, node.statements, format);
|
|
2316
|
+
this.emitTokenEx(19 /* SyntaxKind.CloseBraceToken */, node.statements.end, node, (format & 1 /* ListFormat.MultiLine */) !== 0 ? 2 /* TokenEmitFlags.IndentLeadingComments */ : 0 /* TokenEmitFlags.None */);
|
|
2317
|
+
this.exitNode(node, state);
|
|
2318
|
+
return true;
|
|
2319
|
+
}
|
|
2320
|
+
emitVariableStatement(node) {
|
|
2321
|
+
const state = this.enterNode(node);
|
|
2322
|
+
this.emitModifierList(node, node.modifiers, false);
|
|
2323
|
+
this.emitVariableDeclarationList(node.declarationList);
|
|
2324
|
+
this.write1(';');
|
|
2325
|
+
this.exitNode(node, state);
|
|
2326
|
+
return true;
|
|
2327
|
+
}
|
|
2328
|
+
emitExpressionStatement(node) {
|
|
2329
|
+
const state = this.enterNode(node);
|
|
2330
|
+
const json = this.currentSourceFile !== undefined && this.currentSourceFile.scriptKind === 6 /* ScriptKind.JSON */;
|
|
2331
|
+
const expression = node.expression;
|
|
2332
|
+
if (json)
|
|
2333
|
+
this.emitExpression(expression, 0 /* OperatorPrecedence.Comma */);
|
|
2334
|
+
else if (isImmediatelyInvokedFunctionExpressionOrArrowFunction(expression)) {
|
|
2335
|
+
// Parenthesize only the callee: `(function () {})()`.
|
|
2336
|
+
const call = skipPartiallyEmittedExpressions(expression);
|
|
2337
|
+
if (call instanceof CallExpression) {
|
|
2338
|
+
const callState = this.enterNode(call);
|
|
2339
|
+
this.write1('(');
|
|
2340
|
+
this.emitExpression(call.expression, 0 /* OperatorPrecedence.Lowest */);
|
|
2341
|
+
this.write1(')');
|
|
2342
|
+
this.emitOptionalToken(call.questionDotToken);
|
|
2343
|
+
this.emitTypeArguments(call, call.typeArguments);
|
|
2344
|
+
this.emitList(13 /* ListItem.Argument */, call, call.arguments, 2576 /* ListFormat.CallExpressionArguments */);
|
|
2345
|
+
this.exitNode(call, callState);
|
|
2346
|
+
}
|
|
2347
|
+
}
|
|
2348
|
+
else {
|
|
2349
|
+
const leftmost = getLeftmostExpression(expression, false).kind;
|
|
2350
|
+
this.emitExpression(expression, leftmost === 219 /* SyntaxKind.FunctionExpression */ || leftmost === 211 /* SyntaxKind.ObjectLiteralExpression */
|
|
2351
|
+
? 22 /* OperatorPrecedence.Parentheses */
|
|
2352
|
+
: 0 /* OperatorPrecedence.Comma */);
|
|
2353
|
+
}
|
|
2354
|
+
if (!json || nodeIsSynthesized(expression))
|
|
2355
|
+
this.write1(';');
|
|
2356
|
+
this.exitNode(node, state);
|
|
2357
|
+
return true;
|
|
2358
|
+
}
|
|
2359
|
+
/** `if`/`while`/`with`/`switch` heads: keyword, `(`, expression, `)`. */
|
|
2360
|
+
emitKeywordAndParenthesizedExpression(node, keyword, keywordPos, expression) {
|
|
2361
|
+
const pos = this.emitToken(keyword, keywordPos, node);
|
|
2362
|
+
this.space();
|
|
2363
|
+
this.emitToken(20 /* SyntaxKind.OpenParenToken */, pos, node);
|
|
2364
|
+
this.emitExpression(expression, 0 /* OperatorPrecedence.Lowest */);
|
|
2365
|
+
this.emitToken(21 /* SyntaxKind.CloseParenToken */, expression.end, node);
|
|
2366
|
+
return true;
|
|
2367
|
+
}
|
|
2368
|
+
emitIfStatement(node) {
|
|
2369
|
+
const state = this.enterNode(node);
|
|
2370
|
+
this.emitKeywordAndParenthesizedExpression(node, 100 /* SyntaxKind.IfKeyword */, node.pos, node.expression);
|
|
2371
|
+
this.emitEmbeddedStatement(node, node.thenStatement);
|
|
2372
|
+
const elseStatement = node.elseStatement;
|
|
2373
|
+
if (elseStatement !== undefined) {
|
|
2374
|
+
this.writeLineOrSpace(node, node.thenStatement, elseStatement);
|
|
2375
|
+
this.emitToken(92 /* SyntaxKind.ElseKeyword */, node.thenStatement.end, node);
|
|
2376
|
+
if (elseStatement instanceof IfStatement) {
|
|
2377
|
+
this.space();
|
|
2378
|
+
this.emitIfStatement(elseStatement);
|
|
2379
|
+
}
|
|
2380
|
+
else
|
|
2381
|
+
this.emitEmbeddedStatement(node, elseStatement);
|
|
2382
|
+
}
|
|
2383
|
+
this.exitNode(node, state);
|
|
2384
|
+
return true;
|
|
2385
|
+
}
|
|
2386
|
+
emitDoStatement(node) {
|
|
2387
|
+
const state = this.enterNode(node);
|
|
2388
|
+
this.emitToken(91 /* SyntaxKind.DoKeyword */, node.pos, node);
|
|
2389
|
+
this.emitEmbeddedStatement(node, node.statement);
|
|
2390
|
+
if (node.statement instanceof Block && !this.options.preserveSourceNewlines)
|
|
2391
|
+
this.space();
|
|
2392
|
+
else
|
|
2393
|
+
this.writeLineOrSpace(node, node.statement, node.expression);
|
|
2394
|
+
this.emitKeywordAndParenthesizedExpression(node, 116 /* SyntaxKind.WhileKeyword */, node.statement.end, node.expression);
|
|
2395
|
+
this.write1(';');
|
|
2396
|
+
this.exitNode(node, state);
|
|
2397
|
+
return true;
|
|
2398
|
+
}
|
|
2399
|
+
emitForInitializer(node) {
|
|
2400
|
+
if (node instanceof VariableDeclarationList)
|
|
2401
|
+
return this.emitVariableDeclarationList(node);
|
|
2402
|
+
return this.emitExpression(node, 0 /* OperatorPrecedence.Lowest */);
|
|
2403
|
+
}
|
|
2404
|
+
emitForStatement(node) {
|
|
2405
|
+
const state = this.enterNode(node);
|
|
2406
|
+
let pos = this.emitToken(98 /* SyntaxKind.ForKeyword */, node.pos, node);
|
|
2407
|
+
this.space();
|
|
2408
|
+
pos = this.emitToken(20 /* SyntaxKind.OpenParenToken */, pos, node);
|
|
2409
|
+
if (node.initializer !== undefined) {
|
|
2410
|
+
this.emitForInitializer(node.initializer);
|
|
2411
|
+
pos = node.initializer.end;
|
|
2412
|
+
}
|
|
2413
|
+
pos = this.emitToken(26 /* SyntaxKind.SemicolonToken */, pos, node);
|
|
2414
|
+
if (node.condition !== undefined) {
|
|
2415
|
+
this.space();
|
|
2416
|
+
this.emitExpression(node.condition, 0 /* OperatorPrecedence.Lowest */);
|
|
2417
|
+
pos = node.condition.end;
|
|
2418
|
+
}
|
|
2419
|
+
pos = this.emitToken(26 /* SyntaxKind.SemicolonToken */, pos, node);
|
|
2420
|
+
if (node.incrementor !== undefined) {
|
|
2421
|
+
this.space();
|
|
2422
|
+
this.emitExpression(node.incrementor, 0 /* OperatorPrecedence.Lowest */);
|
|
2423
|
+
pos = node.incrementor.end;
|
|
2424
|
+
}
|
|
2425
|
+
this.emitToken(21 /* SyntaxKind.CloseParenToken */, pos, node);
|
|
2426
|
+
this.emitEmbeddedStatement(node, node.statement);
|
|
2427
|
+
this.exitNode(node, state);
|
|
2428
|
+
return true;
|
|
2429
|
+
}
|
|
2430
|
+
emitForInOrOfStatement(node) {
|
|
2431
|
+
const state = this.enterNode(node);
|
|
2432
|
+
const pos = this.emitToken(98 /* SyntaxKind.ForKeyword */, node.pos, node);
|
|
2433
|
+
this.space();
|
|
2434
|
+
if (node.kind === 251 /* SyntaxKind.ForOfStatement */ && node.awaitModifier !== undefined) {
|
|
2435
|
+
this.emitOptionalToken(node.awaitModifier);
|
|
2436
|
+
this.space();
|
|
2437
|
+
}
|
|
2438
|
+
this.emitToken(20 /* SyntaxKind.OpenParenToken */, pos, node);
|
|
2439
|
+
this.emitForInitializer(node.initializer);
|
|
2440
|
+
this.space();
|
|
2441
|
+
this.emitToken(node.kind === 251 /* SyntaxKind.ForOfStatement */ ? 165 /* SyntaxKind.OfKeyword */ : 102 /* SyntaxKind.InKeyword */, node.initializer.end, node);
|
|
2442
|
+
this.space();
|
|
2443
|
+
this.emitExpression(node.expression, 0 /* OperatorPrecedence.Lowest */);
|
|
2444
|
+
this.emitToken(21 /* SyntaxKind.CloseParenToken */, node.expression.end, node);
|
|
2445
|
+
this.emitEmbeddedStatement(node, node.statement);
|
|
2446
|
+
this.exitNode(node, state);
|
|
2447
|
+
return true;
|
|
2448
|
+
}
|
|
2449
|
+
/** `break`, `continue` and `return` with their optional operand. */
|
|
2450
|
+
emitJumpStatement(node, keyword, label, expression) {
|
|
2451
|
+
const state = this.enterNode(node);
|
|
2452
|
+
this.emitToken(keyword, node.pos, node);
|
|
2453
|
+
if (label !== undefined) {
|
|
2454
|
+
this.space();
|
|
2455
|
+
this.emitIdentifierName(label);
|
|
2456
|
+
}
|
|
2457
|
+
if (expression !== undefined) {
|
|
2458
|
+
this.space();
|
|
2459
|
+
this.emitExpressionNoASI(expression, 0 /* OperatorPrecedence.Lowest */);
|
|
2460
|
+
}
|
|
2461
|
+
this.write1(';');
|
|
2462
|
+
this.exitNode(node, state);
|
|
2463
|
+
return true;
|
|
2464
|
+
}
|
|
2465
|
+
emitTryStatement(node) {
|
|
2466
|
+
const state = this.enterNode(node);
|
|
2467
|
+
this.emitToken(112 /* SyntaxKind.TryKeyword */, node.pos, node);
|
|
2468
|
+
this.space();
|
|
2469
|
+
this.emitBlock(node.tryBlock);
|
|
2470
|
+
const catchClause = node.catchClause;
|
|
2471
|
+
if (catchClause !== undefined) {
|
|
2472
|
+
this.writeLineOrSpace(node, node.tryBlock, catchClause);
|
|
2473
|
+
this.emitCatchClause(catchClause);
|
|
2474
|
+
}
|
|
2475
|
+
if (node.finallyBlock !== undefined) {
|
|
2476
|
+
const previous = catchClause !== undefined ? catchClause : node.tryBlock;
|
|
2477
|
+
this.writeLineOrSpace(node, previous, node.finallyBlock);
|
|
2478
|
+
this.emitToken(97 /* SyntaxKind.FinallyKeyword */, previous.end, node);
|
|
2479
|
+
this.space();
|
|
2480
|
+
this.emitBlock(node.finallyBlock);
|
|
2481
|
+
}
|
|
2482
|
+
this.exitNode(node, state);
|
|
2483
|
+
return true;
|
|
2484
|
+
}
|
|
2485
|
+
emitEmbeddedStatement(parent, node) {
|
|
2486
|
+
if (node instanceof Block ||
|
|
2487
|
+
this.shouldEmitOnSingleLine(parent) ||
|
|
2488
|
+
(this.options.preserveSourceNewlines && this.getLeadingLineTerminatorCount(parent, node, 0 /* ListFormat.None */) === 0)) {
|
|
2489
|
+
this.space();
|
|
2490
|
+
return this.emitStatement(node);
|
|
2491
|
+
}
|
|
2492
|
+
this.line();
|
|
2493
|
+
this.writer.indent++;
|
|
2494
|
+
// An embedded empty statement is significant.
|
|
2495
|
+
if (node instanceof EmptyStatement)
|
|
2496
|
+
this.emitSimpleNode(node, ';');
|
|
2497
|
+
else
|
|
2498
|
+
this.emitStatement(node);
|
|
2499
|
+
this.writer.indent--;
|
|
2500
|
+
return true;
|
|
2501
|
+
}
|
|
2502
|
+
// Declarations
|
|
2503
|
+
emitVariableDeclaration(node) {
|
|
2504
|
+
const state = this.enterNode(node);
|
|
2505
|
+
this.emitBindingName(node.name);
|
|
2506
|
+
this.emitOptionalToken(node.exclamationToken);
|
|
2507
|
+
this.emitTypeAnnotation(node.type);
|
|
2508
|
+
let end = node.name.end;
|
|
2509
|
+
if (node.type !== undefined && node.type.end > end)
|
|
2510
|
+
end = node.type.end;
|
|
2511
|
+
const erasedType = this.context.getTypeNode(node.name);
|
|
2512
|
+
if (erasedType !== undefined && erasedType.end > end)
|
|
2513
|
+
end = erasedType.end;
|
|
2514
|
+
this.emitInitializer(node.initializer, end, node);
|
|
2515
|
+
this.exitNode(node, state);
|
|
2516
|
+
return true;
|
|
2517
|
+
}
|
|
2518
|
+
emitVariableDeclarationList(node) {
|
|
2519
|
+
const state = this.enterNode(node);
|
|
2520
|
+
switch (blockScopeFlags(node)) {
|
|
2521
|
+
case 1 /* NodeFlags.Let */:
|
|
2522
|
+
this.write1('let');
|
|
2523
|
+
break;
|
|
2524
|
+
case 2 /* NodeFlags.Const */:
|
|
2525
|
+
this.write1('const');
|
|
2526
|
+
break;
|
|
2527
|
+
case 4 /* NodeFlags.Using */:
|
|
2528
|
+
this.write1('using');
|
|
2529
|
+
break;
|
|
2530
|
+
case 6 /* NodeFlags.AwaitUsing */:
|
|
2531
|
+
this.write1('await using');
|
|
2532
|
+
break;
|
|
2533
|
+
default:
|
|
2534
|
+
this.write1('var');
|
|
2535
|
+
}
|
|
2536
|
+
this.space();
|
|
2537
|
+
this.emitList(16 /* ListItem.VariableDeclaration */, node, node.declarations, 528 /* ListFormat.VariableDeclarationList */);
|
|
2538
|
+
this.exitNode(node, state);
|
|
2539
|
+
return true;
|
|
2540
|
+
}
|
|
2541
|
+
emitFunctionDeclaration(node) {
|
|
2542
|
+
const state = this.enterNode(node);
|
|
2543
|
+
this.generateNameIfNeeded(node.name);
|
|
2544
|
+
this.emitModifierList(node, node.modifiers, false);
|
|
2545
|
+
this.write1('function');
|
|
2546
|
+
this.emitOptionalToken(node.asteriskToken);
|
|
2547
|
+
this.space();
|
|
2548
|
+
if (node.name !== undefined)
|
|
2549
|
+
this.emitIdentifierName(node.name);
|
|
2550
|
+
this.emitScopedSignature(node, node.typeParameters, node.parameters, node.type, node.body, true);
|
|
2551
|
+
this.exitNode(node, state);
|
|
2552
|
+
return true;
|
|
2553
|
+
}
|
|
2554
|
+
emitInterfaceDeclaration(node) {
|
|
2555
|
+
const state = this.enterNode(node);
|
|
2556
|
+
this.emitModifierList(node, node.modifiers, false);
|
|
2557
|
+
this.write1('interface ');
|
|
2558
|
+
this.emitBindingIdentifier(node.name);
|
|
2559
|
+
this.emitTypeParameters(node, node.typeParameters);
|
|
2560
|
+
this.emitList(17 /* ListItem.HeritageClause */, node, node.heritageClauses, 512 /* ListFormat.HeritageClauses */);
|
|
2561
|
+
this.write1(' {');
|
|
2562
|
+
this.pushNameGenerationScope(node);
|
|
2563
|
+
this.generateAllMemberNames(node.members);
|
|
2564
|
+
this.emitList(4 /* ListItem.TypeElement */, node, node.members, 129 /* ListFormat.InterfaceMembers */);
|
|
2565
|
+
this.popNameGenerationScope(node);
|
|
2566
|
+
this.write1('}');
|
|
2567
|
+
this.exitNode(node, state);
|
|
2568
|
+
return true;
|
|
2569
|
+
}
|
|
2570
|
+
emitTypeAliasDeclaration(node) {
|
|
2571
|
+
const state = this.enterNode(node);
|
|
2572
|
+
this.emitModifierList(node, node.modifiers, false);
|
|
2573
|
+
this.write1('type ');
|
|
2574
|
+
this.emitBindingIdentifier(node.name);
|
|
2575
|
+
this.emitTypeParameters(node, node.typeParameters);
|
|
2576
|
+
this.write1(' = ');
|
|
2577
|
+
this.emitTypeNodeOutsideExtends(node.type);
|
|
2578
|
+
this.write1(';');
|
|
2579
|
+
this.exitNode(node, state);
|
|
2580
|
+
return true;
|
|
2581
|
+
}
|
|
2582
|
+
emitEnumDeclaration(node) {
|
|
2583
|
+
const state = this.enterNode(node);
|
|
2584
|
+
this.emitModifierList(node, node.modifiers, false);
|
|
2585
|
+
this.write1('enum ');
|
|
2586
|
+
this.emitBindingIdentifier(node.name);
|
|
2587
|
+
this.write1(' {');
|
|
2588
|
+
this.emitList(18 /* ListItem.EnumMember */, node, node.members, 145 /* ListFormat.EnumMembers */);
|
|
2589
|
+
this.write1('}');
|
|
2590
|
+
this.exitNode(node, state);
|
|
2591
|
+
return true;
|
|
2592
|
+
}
|
|
2593
|
+
emitModuleDeclaration(node) {
|
|
2594
|
+
const state = this.enterNode(node);
|
|
2595
|
+
this.emitModifierList(node, node.modifiers, false);
|
|
2596
|
+
if (node.keyword !== 162 /* SyntaxKind.GlobalKeyword */)
|
|
2597
|
+
this.write1(node.keyword === 145 /* SyntaxKind.NamespaceKeyword */ ? 'namespace ' : 'module ');
|
|
2598
|
+
this.emitIdentifierOrString(node.name, true);
|
|
2599
|
+
let body = node.body;
|
|
2600
|
+
while (body instanceof ModuleDeclaration) {
|
|
2601
|
+
this.write1('.');
|
|
2602
|
+
this.emitIdentifierOrString(body.name, false);
|
|
2603
|
+
body = body.body;
|
|
2604
|
+
}
|
|
2605
|
+
if (body === undefined)
|
|
2606
|
+
this.write1(';');
|
|
2607
|
+
else if (body instanceof ModuleBlock) {
|
|
2608
|
+
this.space();
|
|
2609
|
+
this.emitBlockLike(body, body.statements, false);
|
|
2610
|
+
}
|
|
2611
|
+
this.exitNode(node, state);
|
|
2612
|
+
return true;
|
|
2613
|
+
}
|
|
2614
|
+
/** Module blocks and case blocks: braces around a statement or clause list. */
|
|
2615
|
+
emitBlockLike(node, statements, caseBlock) {
|
|
2616
|
+
const state = this.enterNode(node);
|
|
2617
|
+
if (!caseBlock)
|
|
2618
|
+
this.generateNames(node);
|
|
2619
|
+
this.emitToken(18 /* SyntaxKind.OpenBraceToken */, node.pos, node);
|
|
2620
|
+
let format;
|
|
2621
|
+
if (caseBlock)
|
|
2622
|
+
format = 129 /* ListFormat.CaseBlockClauses */;
|
|
2623
|
+
else
|
|
2624
|
+
format =
|
|
2625
|
+
this.isEmptyBlock(node, statements) || this.shouldEmitOnSingleLine(node)
|
|
2626
|
+
? 768 /* ListFormat.SingleLineBlockStatements */
|
|
2627
|
+
: 129 /* ListFormat.MultiLineBlockStatements */;
|
|
2628
|
+
this.emitList(caseBlock ? 19 /* ListItem.CaseOrDefaultClause */ : 15 /* ListItem.Statement */, node, statements, format);
|
|
2629
|
+
this.emitTokenEx(19 /* SyntaxKind.CloseBraceToken */, statements.end, node, caseBlock || (format & 1 /* ListFormat.MultiLine */) !== 0 ? 2 /* TokenEmitFlags.IndentLeadingComments */ : 0 /* TokenEmitFlags.None */);
|
|
2630
|
+
this.exitNode(node, state);
|
|
2631
|
+
return true;
|
|
2632
|
+
}
|
|
2633
|
+
emitImportEqualsDeclaration(node) {
|
|
2634
|
+
const state = this.enterNode(node);
|
|
2635
|
+
this.emitModifierList(node, node.modifiers, false);
|
|
2636
|
+
const modifiersEnd = node.modifiers !== undefined && node.modifiers.end > node.pos ? node.modifiers.end : node.pos;
|
|
2637
|
+
const pos = this.emitToken(101 /* SyntaxKind.ImportKeyword */, modifiersEnd, node);
|
|
2638
|
+
this.space();
|
|
2639
|
+
if (node.isTypeOnly) {
|
|
2640
|
+
this.emitToken(156 /* SyntaxKind.TypeKeyword */, pos, node);
|
|
2641
|
+
this.space();
|
|
2642
|
+
}
|
|
2643
|
+
this.emitBindingIdentifier(node.name);
|
|
2644
|
+
this.space();
|
|
2645
|
+
this.emitToken(63 /* SyntaxKind.EqualsToken */, node.name.end, node);
|
|
2646
|
+
this.space();
|
|
2647
|
+
const reference = node.moduleReference;
|
|
2648
|
+
if (reference instanceof Identifier)
|
|
2649
|
+
this.emitIdentifierReference(reference);
|
|
2650
|
+
else if (reference instanceof QualifiedName)
|
|
2651
|
+
this.emitQualifiedName(reference);
|
|
2652
|
+
else if (reference instanceof ExternalModuleReference) {
|
|
2653
|
+
const referenceState = this.enterNode(reference);
|
|
2654
|
+
this.write1('require(');
|
|
2655
|
+
this.emitExpression(reference.expression, 2 /* OperatorPrecedence.DisallowComma */);
|
|
2656
|
+
this.write1(')');
|
|
2657
|
+
this.exitNode(reference, referenceState);
|
|
2658
|
+
}
|
|
2659
|
+
else
|
|
2660
|
+
throw new Error('Unexpected module reference ' + reference.kind);
|
|
2661
|
+
this.write1(';');
|
|
2662
|
+
this.exitNode(node, state);
|
|
2663
|
+
return true;
|
|
2664
|
+
}
|
|
2665
|
+
emitImportDeclaration(node) {
|
|
2666
|
+
const state = this.enterNode(node);
|
|
2667
|
+
this.emitModifierList(node, node.modifiers, false);
|
|
2668
|
+
const modifiersEnd = node.modifiers !== undefined && node.modifiers.end > node.pos ? node.modifiers.end : node.pos;
|
|
2669
|
+
this.emitToken(101 /* SyntaxKind.ImportKeyword */, modifiersEnd, node);
|
|
2670
|
+
this.space();
|
|
2671
|
+
const clause = node.importClause;
|
|
2672
|
+
if (clause !== undefined) {
|
|
2673
|
+
this.emitImportClause(clause);
|
|
2674
|
+
this.space();
|
|
2675
|
+
this.emitToken(161 /* SyntaxKind.FromKeyword */, clause.end, node);
|
|
2676
|
+
this.space();
|
|
2677
|
+
}
|
|
2678
|
+
this.emitExpression(node.moduleSpecifier, 0 /* OperatorPrecedence.Lowest */);
|
|
2679
|
+
if (node.attributes !== undefined) {
|
|
2680
|
+
this.space();
|
|
2681
|
+
this.emitImportAttributes(node.attributes);
|
|
2682
|
+
}
|
|
2683
|
+
this.write1(';');
|
|
2684
|
+
this.exitNode(node, state);
|
|
2685
|
+
return true;
|
|
2686
|
+
}
|
|
2687
|
+
emitImportClause(node) {
|
|
2688
|
+
const state = this.enterNode(node);
|
|
2689
|
+
if (node.phaseModifier !== undefined && node.phaseModifier !== 0 /* SyntaxKind.Unknown */) {
|
|
2690
|
+
this.emitToken(node.phaseModifier, node.pos, node);
|
|
2691
|
+
this.space();
|
|
2692
|
+
}
|
|
2693
|
+
const name = node.name;
|
|
2694
|
+
if (name !== undefined) {
|
|
2695
|
+
this.emitBindingIdentifier(name);
|
|
2696
|
+
if (node.namedBindings !== undefined) {
|
|
2697
|
+
this.emitToken(27 /* SyntaxKind.CommaToken */, name.end, node);
|
|
2698
|
+
this.space();
|
|
2699
|
+
}
|
|
2700
|
+
}
|
|
2701
|
+
const bindings = node.namedBindings;
|
|
2702
|
+
if (bindings instanceof NamespaceImport) {
|
|
2703
|
+
const bindingsState = this.enterNode(bindings);
|
|
2704
|
+
const pos = this.emitToken(41 /* SyntaxKind.AsteriskToken */, bindings.pos, bindings);
|
|
2705
|
+
this.space();
|
|
2706
|
+
this.emitToken(129 /* SyntaxKind.AsKeyword */, pos, bindings);
|
|
2707
|
+
this.space();
|
|
2708
|
+
this.emitBindingIdentifier(bindings.name);
|
|
2709
|
+
this.exitNode(bindings, bindingsState);
|
|
2710
|
+
}
|
|
2711
|
+
else if (bindings instanceof NamedImports) {
|
|
2712
|
+
const bindingsState = this.enterNode(bindings);
|
|
2713
|
+
this.write1('{');
|
|
2714
|
+
this.emitList(20 /* ListItem.ImportSpecifier */, bindings, bindings.elements, 525136 /* ListFormat.NamedImportsOrExportsElements */);
|
|
2715
|
+
this.write1('}');
|
|
2716
|
+
this.exitNode(bindings, bindingsState);
|
|
2717
|
+
}
|
|
2718
|
+
this.exitNode(node, state);
|
|
2719
|
+
return true;
|
|
2720
|
+
}
|
|
2721
|
+
/** Import and export specifiers. */
|
|
2722
|
+
emitSpecifier(node, isTypeOnly, propertyName, name, binding) {
|
|
2723
|
+
const state = this.enterNode(node);
|
|
2724
|
+
if (isTypeOnly)
|
|
2725
|
+
this.write1('type ');
|
|
2726
|
+
if (propertyName !== undefined) {
|
|
2727
|
+
this.emitIdentifierOrString(propertyName, false);
|
|
2728
|
+
this.space();
|
|
2729
|
+
this.emitToken(129 /* SyntaxKind.AsKeyword */, propertyName.end, node);
|
|
2730
|
+
this.space();
|
|
2731
|
+
}
|
|
2732
|
+
this.emitIdentifierOrString(name, binding);
|
|
2733
|
+
this.exitNode(node, state);
|
|
2734
|
+
return true;
|
|
2735
|
+
}
|
|
2736
|
+
emitExportAssignment(node) {
|
|
2737
|
+
const state = this.enterNode(node);
|
|
2738
|
+
const nextPos = this.emitToken(94 /* SyntaxKind.ExportKeyword */, node.pos, node);
|
|
2739
|
+
this.space();
|
|
2740
|
+
this.emitToken(node.isExportEquals ? 63 /* SyntaxKind.EqualsToken */ : 89 /* SyntaxKind.DefaultKeyword */, nextPos, node);
|
|
2741
|
+
this.space();
|
|
2742
|
+
if (node.isExportEquals)
|
|
2743
|
+
this.emitExpression(node.expression, 3 /* OperatorPrecedence.Assignment */);
|
|
2744
|
+
else {
|
|
2745
|
+
const leftmost = getLeftmostExpression(node.expression, false).kind;
|
|
2746
|
+
this.emitExpression(node.expression, leftmost === 232 /* SyntaxKind.ClassExpression */ || leftmost === 219 /* SyntaxKind.FunctionExpression */
|
|
2747
|
+
? 22 /* OperatorPrecedence.Parentheses */
|
|
2748
|
+
: 3 /* OperatorPrecedence.Assignment */);
|
|
2749
|
+
}
|
|
2750
|
+
this.write1(';');
|
|
2751
|
+
this.exitNode(node, state);
|
|
2752
|
+
return true;
|
|
2753
|
+
}
|
|
2754
|
+
emitExportDeclaration(node) {
|
|
2755
|
+
const state = this.enterNode(node);
|
|
2756
|
+
this.emitModifierList(node, node.modifiers, false);
|
|
2757
|
+
let pos = this.emitToken(94 /* SyntaxKind.ExportKeyword */, node.pos, node);
|
|
2758
|
+
this.space();
|
|
2759
|
+
if (node.isTypeOnly) {
|
|
2760
|
+
pos = this.emitToken(156 /* SyntaxKind.TypeKeyword */, pos, node);
|
|
2761
|
+
this.space();
|
|
2762
|
+
}
|
|
2763
|
+
const clause = node.exportClause;
|
|
2764
|
+
if (clause instanceof NamespaceExport) {
|
|
2765
|
+
const clauseState = this.enterNode(clause);
|
|
2766
|
+
const asteriskEnd = this.emitToken(41 /* SyntaxKind.AsteriskToken */, clause.pos, clause);
|
|
2767
|
+
this.space();
|
|
2768
|
+
this.emitToken(129 /* SyntaxKind.AsKeyword */, asteriskEnd, clause);
|
|
2769
|
+
this.space();
|
|
2770
|
+
this.emitIdentifierOrString(clause.name, false);
|
|
2771
|
+
this.exitNode(clause, clauseState);
|
|
2772
|
+
}
|
|
2773
|
+
else if (clause instanceof NamedExports) {
|
|
2774
|
+
const clauseState = this.enterNode(clause);
|
|
2775
|
+
this.write1('{');
|
|
2776
|
+
this.emitList(21 /* ListItem.ExportSpecifier */, clause, clause.elements, 525136 /* ListFormat.NamedImportsOrExportsElements */);
|
|
2777
|
+
this.write1('}');
|
|
2778
|
+
this.exitNode(clause, clauseState);
|
|
2779
|
+
}
|
|
2780
|
+
else
|
|
2781
|
+
pos = this.emitToken(41 /* SyntaxKind.AsteriskToken */, pos, node);
|
|
2782
|
+
if (node.moduleSpecifier !== undefined) {
|
|
2783
|
+
this.space();
|
|
2784
|
+
this.emitToken(161 /* SyntaxKind.FromKeyword */, clause !== undefined && clause.end > pos ? clause.end : pos, node);
|
|
2785
|
+
this.space();
|
|
2786
|
+
this.emitExpression(node.moduleSpecifier, 0 /* OperatorPrecedence.Lowest */);
|
|
2787
|
+
}
|
|
2788
|
+
if (node.attributes !== undefined) {
|
|
2789
|
+
this.space();
|
|
2790
|
+
this.emitImportAttributes(node.attributes);
|
|
2791
|
+
}
|
|
2792
|
+
this.write1(';');
|
|
2793
|
+
this.exitNode(node, state);
|
|
2794
|
+
return true;
|
|
2795
|
+
}
|
|
2796
|
+
emitImportAttributes(node) {
|
|
2797
|
+
const state = this.enterNode(node);
|
|
2798
|
+
this.emitToken(node.token, node.pos, node);
|
|
2799
|
+
this.space();
|
|
2800
|
+
this.emitList(10 /* ListItem.ImportAttribute */, node, node.attributes, 526226 /* ListFormat.ImportAttributes */);
|
|
2801
|
+
this.exitNode(node, state);
|
|
2802
|
+
return true;
|
|
2803
|
+
}
|
|
2804
|
+
emitImportAttribute(node) {
|
|
2805
|
+
const state = this.enterNode(node);
|
|
2806
|
+
if (node.name !== undefined)
|
|
2807
|
+
this.emitIdentifierOrString(node.name, false);
|
|
2808
|
+
this.write1(': ');
|
|
2809
|
+
const value = node.value;
|
|
2810
|
+
if (!this.hasEmitFlag(value, 128 /* EmitFlags.NoLeadingComments */))
|
|
2811
|
+
this.emitTrailingComments(this.context.commentPos(value), 2 /* CommentSeparator.After */);
|
|
2812
|
+
this.emitExpression(value, 2 /* OperatorPrecedence.DisallowComma */);
|
|
2813
|
+
this.exitNode(node, state);
|
|
2814
|
+
return true;
|
|
2815
|
+
}
|
|
2816
|
+
emitNamespaceExportDeclaration(node) {
|
|
2817
|
+
const state = this.enterNode(node);
|
|
2818
|
+
let pos = this.emitToken(94 /* SyntaxKind.ExportKeyword */, node.pos, node);
|
|
2819
|
+
this.space();
|
|
2820
|
+
pos = this.emitToken(129 /* SyntaxKind.AsKeyword */, pos, node);
|
|
2821
|
+
this.space();
|
|
2822
|
+
this.emitToken(145 /* SyntaxKind.NamespaceKeyword */, pos, node);
|
|
2823
|
+
this.space();
|
|
2824
|
+
this.emitBindingIdentifier(node.name);
|
|
2825
|
+
this.write1(';');
|
|
2826
|
+
this.exitNode(node, state);
|
|
2827
|
+
return true;
|
|
2828
|
+
}
|
|
2829
|
+
emitStatement(node) {
|
|
2830
|
+
switch (node.kind) {
|
|
2831
|
+
case 242 /* SyntaxKind.Block */:
|
|
2832
|
+
if (node instanceof Block)
|
|
2833
|
+
return this.emitBlock(node);
|
|
2834
|
+
break;
|
|
2835
|
+
case 243 /* SyntaxKind.EmptyStatement */:
|
|
2836
|
+
return this.emitSimpleNode(node, ';');
|
|
2837
|
+
case 244 /* SyntaxKind.VariableStatement */:
|
|
2838
|
+
if (node instanceof VariableStatement)
|
|
2839
|
+
return this.emitVariableStatement(node);
|
|
2840
|
+
break;
|
|
2841
|
+
case 245 /* SyntaxKind.ExpressionStatement */:
|
|
2842
|
+
if (node instanceof ExpressionStatement)
|
|
2843
|
+
return this.emitExpressionStatement(node);
|
|
2844
|
+
break;
|
|
2845
|
+
case 246 /* SyntaxKind.IfStatement */:
|
|
2846
|
+
if (node instanceof IfStatement)
|
|
2847
|
+
return this.emitIfStatement(node);
|
|
2848
|
+
break;
|
|
2849
|
+
case 247 /* SyntaxKind.DoStatement */:
|
|
2850
|
+
if (node instanceof DoStatement)
|
|
2851
|
+
return this.emitDoStatement(node);
|
|
2852
|
+
break;
|
|
2853
|
+
case 248 /* SyntaxKind.WhileStatement */:
|
|
2854
|
+
if (node instanceof WhileStatement) {
|
|
2855
|
+
const state = this.enterNode(node);
|
|
2856
|
+
this.emitKeywordAndParenthesizedExpression(node, 116 /* SyntaxKind.WhileKeyword */, node.pos, node.expression);
|
|
2857
|
+
this.emitEmbeddedStatement(node, node.statement);
|
|
2858
|
+
this.exitNode(node, state);
|
|
2859
|
+
return true;
|
|
2860
|
+
}
|
|
2861
|
+
break;
|
|
2862
|
+
case 249 /* SyntaxKind.ForStatement */:
|
|
2863
|
+
if (node instanceof ForStatement)
|
|
2864
|
+
return this.emitForStatement(node);
|
|
2865
|
+
break;
|
|
2866
|
+
case 250 /* SyntaxKind.ForInStatement */:
|
|
2867
|
+
case 251 /* SyntaxKind.ForOfStatement */:
|
|
2868
|
+
if (node instanceof ForInOrOfStatement)
|
|
2869
|
+
return this.emitForInOrOfStatement(node);
|
|
2870
|
+
break;
|
|
2871
|
+
case 252 /* SyntaxKind.ContinueStatement */:
|
|
2872
|
+
if (node instanceof ContinueStatement)
|
|
2873
|
+
return this.emitJumpStatement(node, 87 /* SyntaxKind.ContinueKeyword */, node.label, undefined);
|
|
2874
|
+
break;
|
|
2875
|
+
case 253 /* SyntaxKind.BreakStatement */:
|
|
2876
|
+
if (node instanceof BreakStatement)
|
|
2877
|
+
return this.emitJumpStatement(node, 82 /* SyntaxKind.BreakKeyword */, node.label, undefined);
|
|
2878
|
+
break;
|
|
2879
|
+
case 254 /* SyntaxKind.ReturnStatement */:
|
|
2880
|
+
if (node instanceof ReturnStatement)
|
|
2881
|
+
return this.emitJumpStatement(node, 106 /* SyntaxKind.ReturnKeyword */, undefined, node.expression);
|
|
2882
|
+
break;
|
|
2883
|
+
case 255 /* SyntaxKind.WithStatement */:
|
|
2884
|
+
if (node instanceof WithStatement) {
|
|
2885
|
+
const state = this.enterNode(node);
|
|
2886
|
+
this.emitKeywordAndParenthesizedExpression(node, 117 /* SyntaxKind.WithKeyword */, node.pos, node.expression);
|
|
2887
|
+
this.emitEmbeddedStatement(node, node.statement);
|
|
2888
|
+
this.exitNode(node, state);
|
|
2889
|
+
return true;
|
|
2890
|
+
}
|
|
2891
|
+
break;
|
|
2892
|
+
case 256 /* SyntaxKind.SwitchStatement */:
|
|
2893
|
+
if (node instanceof SwitchStatement) {
|
|
2894
|
+
const state = this.enterNode(node);
|
|
2895
|
+
this.emitKeywordAndParenthesizedExpression(node, 108 /* SyntaxKind.SwitchKeyword */, node.pos, node.expression);
|
|
2896
|
+
this.space();
|
|
2897
|
+
this.emitBlockLike(node.caseBlock, node.caseBlock.clauses, true);
|
|
2898
|
+
this.exitNode(node, state);
|
|
2899
|
+
return true;
|
|
2900
|
+
}
|
|
2901
|
+
break;
|
|
2902
|
+
case 257 /* SyntaxKind.LabeledStatement */:
|
|
2903
|
+
if (node instanceof LabeledStatement) {
|
|
2904
|
+
const state = this.enterNode(node);
|
|
2905
|
+
this.emitIdentifierName(node.label);
|
|
2906
|
+
this.emitToken(58 /* SyntaxKind.ColonToken */, node.label.end, node);
|
|
2907
|
+
this.space();
|
|
2908
|
+
this.emitStatement(node.statement);
|
|
2909
|
+
this.exitNode(node, state);
|
|
2910
|
+
return true;
|
|
2911
|
+
}
|
|
2912
|
+
break;
|
|
2913
|
+
case 258 /* SyntaxKind.ThrowStatement */:
|
|
2914
|
+
if (node instanceof ThrowStatement) {
|
|
2915
|
+
const state = this.enterNode(node);
|
|
2916
|
+
this.emitToken(110 /* SyntaxKind.ThrowKeyword */, node.pos, node);
|
|
2917
|
+
this.space();
|
|
2918
|
+
this.emitExpressionNoASI(node.expression, 0 /* OperatorPrecedence.Lowest */);
|
|
2919
|
+
this.write1(';');
|
|
2920
|
+
this.exitNode(node, state);
|
|
2921
|
+
return true;
|
|
2922
|
+
}
|
|
2923
|
+
break;
|
|
2924
|
+
case 259 /* SyntaxKind.TryStatement */:
|
|
2925
|
+
if (node instanceof TryStatement)
|
|
2926
|
+
return this.emitTryStatement(node);
|
|
2927
|
+
break;
|
|
2928
|
+
case 260 /* SyntaxKind.DebuggerStatement */:
|
|
2929
|
+
if (node instanceof DebuggerStatement) {
|
|
2930
|
+
const state = this.enterNode(node);
|
|
2931
|
+
this.emitToken(88 /* SyntaxKind.DebuggerKeyword */, node.pos, node);
|
|
2932
|
+
this.write1(';');
|
|
2933
|
+
this.exitNode(node, state);
|
|
2934
|
+
return true;
|
|
2935
|
+
}
|
|
2936
|
+
break;
|
|
2937
|
+
case 347 /* SyntaxKind.NotEmittedStatement */:
|
|
2938
|
+
return this.emitSimpleNode(node, '');
|
|
2939
|
+
case 263 /* SyntaxKind.FunctionDeclaration */:
|
|
2940
|
+
if (node instanceof FunctionDeclaration)
|
|
2941
|
+
return this.emitFunctionDeclaration(node);
|
|
2942
|
+
break;
|
|
2943
|
+
case 264 /* SyntaxKind.ClassDeclaration */:
|
|
2944
|
+
if (node instanceof ClassDeclaration)
|
|
2945
|
+
return this.emitClassLike(node, node.modifiers, node.name, node.typeParameters, node.heritageClauses, node.members);
|
|
2946
|
+
break;
|
|
2947
|
+
case 265 /* SyntaxKind.InterfaceDeclaration */:
|
|
2948
|
+
if (node instanceof InterfaceDeclaration)
|
|
2949
|
+
return this.emitInterfaceDeclaration(node);
|
|
2950
|
+
break;
|
|
2951
|
+
case 266 /* SyntaxKind.TypeAliasDeclaration */:
|
|
2952
|
+
case 345 /* SyntaxKind.JSTypeAliasDeclaration */:
|
|
2953
|
+
if (node instanceof TypeAliasDeclaration)
|
|
2954
|
+
return this.emitTypeAliasDeclaration(node);
|
|
2955
|
+
break;
|
|
2956
|
+
case 267 /* SyntaxKind.EnumDeclaration */:
|
|
2957
|
+
if (node instanceof EnumDeclaration)
|
|
2958
|
+
return this.emitEnumDeclaration(node);
|
|
2959
|
+
break;
|
|
2960
|
+
case 268 /* SyntaxKind.ModuleDeclaration */:
|
|
2961
|
+
if (node instanceof ModuleDeclaration)
|
|
2962
|
+
return this.emitModuleDeclaration(node);
|
|
2963
|
+
break;
|
|
2964
|
+
case 283 /* SyntaxKind.MissingDeclaration */:
|
|
2965
|
+
return false;
|
|
2966
|
+
case 271 /* SyntaxKind.NamespaceExportDeclaration */:
|
|
2967
|
+
if (node instanceof NamespaceExportDeclaration)
|
|
2968
|
+
return this.emitNamespaceExportDeclaration(node);
|
|
2969
|
+
break;
|
|
2970
|
+
case 272 /* SyntaxKind.ImportEqualsDeclaration */:
|
|
2971
|
+
if (node instanceof ImportEqualsDeclaration)
|
|
2972
|
+
return this.emitImportEqualsDeclaration(node);
|
|
2973
|
+
break;
|
|
2974
|
+
case 273 /* SyntaxKind.ImportDeclaration */:
|
|
2975
|
+
if (node instanceof ImportDeclaration)
|
|
2976
|
+
return this.emitImportDeclaration(node);
|
|
2977
|
+
break;
|
|
2978
|
+
case 278 /* SyntaxKind.ExportAssignment */:
|
|
2979
|
+
if (node instanceof ExportAssignment)
|
|
2980
|
+
return this.emitExportAssignment(node);
|
|
2981
|
+
break;
|
|
2982
|
+
case 279 /* SyntaxKind.ExportDeclaration */:
|
|
2983
|
+
if (node instanceof ExportDeclaration)
|
|
2984
|
+
return this.emitExportDeclaration(node);
|
|
2985
|
+
break;
|
|
2986
|
+
}
|
|
2987
|
+
throw new Error('Unexpected statement ' + node.kind);
|
|
2988
|
+
}
|
|
2989
|
+
// JSX
|
|
2990
|
+
emitJsxElement(node) {
|
|
2991
|
+
const state = this.enterNode(node);
|
|
2992
|
+
this.emitJsxOpeningElement(node.openingElement);
|
|
2993
|
+
this.emitList(23 /* ListItem.JsxChild */, node, node.children, 262144 /* ListFormat.JsxElementOrFragmentChildren */);
|
|
2994
|
+
this.emitJsxClosingElement(node.closingElement);
|
|
2995
|
+
this.exitNode(node, state);
|
|
2996
|
+
return true;
|
|
2997
|
+
}
|
|
2998
|
+
emitJsxSelfClosingElement(node) {
|
|
2999
|
+
const state = this.enterNode(node);
|
|
3000
|
+
this.write1('<');
|
|
3001
|
+
this.emitJsxTagName(node.tagName);
|
|
3002
|
+
this.emitTypeArguments(node, node.typeArguments);
|
|
3003
|
+
this.space();
|
|
3004
|
+
this.emitJsxAttributes(node.attributes);
|
|
3005
|
+
this.write1('/>');
|
|
3006
|
+
this.exitNode(node, state);
|
|
3007
|
+
return true;
|
|
3008
|
+
}
|
|
3009
|
+
emitJsxFragment(node) {
|
|
3010
|
+
const state = this.enterNode(node);
|
|
3011
|
+
this.emitSimpleNode(node.openingFragment, '<>');
|
|
3012
|
+
this.emitList(23 /* ListItem.JsxChild */, node, node.children, 262144 /* ListFormat.JsxElementOrFragmentChildren */);
|
|
3013
|
+
this.emitSimpleNode(node.closingFragment, '</>');
|
|
3014
|
+
this.exitNode(node, state);
|
|
3015
|
+
return true;
|
|
3016
|
+
}
|
|
3017
|
+
emitJsxOpeningElement(node) {
|
|
3018
|
+
const state = this.enterNode(node);
|
|
3019
|
+
this.write1('<');
|
|
3020
|
+
const indented = this.writeLineSeparatorsAndIndentBefore(node.tagName, node);
|
|
3021
|
+
this.emitJsxTagName(node.tagName);
|
|
3022
|
+
this.emitTypeArguments(node, node.typeArguments);
|
|
3023
|
+
if (node.attributes.properties.nodes.length > 0)
|
|
3024
|
+
this.space();
|
|
3025
|
+
this.emitJsxAttributes(node.attributes);
|
|
3026
|
+
this.writeLineSeparatorsAfter(node.attributes, node);
|
|
3027
|
+
this.indentIf(indented, -1);
|
|
3028
|
+
this.write1('>');
|
|
3029
|
+
this.exitNode(node, state);
|
|
3030
|
+
return true;
|
|
3031
|
+
}
|
|
3032
|
+
emitJsxClosingElement(node) {
|
|
3033
|
+
const state = this.enterNode(node);
|
|
3034
|
+
this.write1('</');
|
|
3035
|
+
this.emitJsxTagName(node.tagName);
|
|
3036
|
+
this.write1('>');
|
|
3037
|
+
this.exitNode(node, state);
|
|
3038
|
+
return true;
|
|
3039
|
+
}
|
|
3040
|
+
emitJsxAttributes(node) {
|
|
3041
|
+
const state = this.enterNode(node);
|
|
3042
|
+
this.emitList(24 /* ListItem.JsxAttributeLike */, node, node.properties, 262656 /* ListFormat.JsxElementAttributes */);
|
|
3043
|
+
this.exitNode(node, state);
|
|
3044
|
+
return true;
|
|
3045
|
+
}
|
|
3046
|
+
emitJsxAttribute(node) {
|
|
3047
|
+
const state = this.enterNode(node);
|
|
3048
|
+
this.emitJsxName(node.name);
|
|
3049
|
+
const initializer = node.initializer;
|
|
3050
|
+
if (initializer !== undefined) {
|
|
3051
|
+
this.write1('=');
|
|
3052
|
+
if (initializer instanceof StringLiteral)
|
|
3053
|
+
this.emitLiteral(initializer);
|
|
3054
|
+
else if (initializer instanceof JsxExpression)
|
|
3055
|
+
this.emitJsxExpression(initializer);
|
|
3056
|
+
else if (initializer instanceof JsxElement)
|
|
3057
|
+
this.emitJsxElement(initializer);
|
|
3058
|
+
else if (initializer instanceof JsxSelfClosingElement)
|
|
3059
|
+
this.emitJsxSelfClosingElement(initializer);
|
|
3060
|
+
else if (initializer instanceof JsxFragment)
|
|
3061
|
+
this.emitJsxFragment(initializer);
|
|
3062
|
+
else
|
|
3063
|
+
this.emitExpression(initializer, 0 /* OperatorPrecedence.Lowest */);
|
|
3064
|
+
}
|
|
3065
|
+
this.exitNode(node, state);
|
|
3066
|
+
return true;
|
|
3067
|
+
}
|
|
3068
|
+
emitJsxExpression(node) {
|
|
3069
|
+
const state = this.enterNode(node);
|
|
3070
|
+
if (node.expression !== undefined ||
|
|
3071
|
+
(!this.commentsDisabled && !nodeIsSynthesized(node) && this.hasCommentsAtPosition(node.pos))) {
|
|
3072
|
+
const indented = this.currentSourceFile !== undefined &&
|
|
3073
|
+
!nodeIsSynthesized(node) &&
|
|
3074
|
+
getLinesBetweenPositions(this.lineStarts, node.pos, node.end) !== 0;
|
|
3075
|
+
this.indentIf(indented, 1);
|
|
3076
|
+
let end = this.emitToken(18 /* SyntaxKind.OpenBraceToken */, node.pos, node);
|
|
3077
|
+
this.emitOptionalToken(node.dotDotDotToken);
|
|
3078
|
+
if (node.expression !== undefined)
|
|
3079
|
+
this.emitExpression(node.expression, 2 /* OperatorPrecedence.DisallowComma */);
|
|
3080
|
+
if (node.expression !== undefined && node.expression.end > end)
|
|
3081
|
+
end = node.expression.end;
|
|
3082
|
+
if (node.dotDotDotToken !== undefined && node.dotDotDotToken.end > end)
|
|
3083
|
+
end = node.dotDotDotToken.end;
|
|
3084
|
+
this.emitToken(19 /* SyntaxKind.CloseBraceToken */, end, node);
|
|
3085
|
+
this.indentIf(indented, -1);
|
|
3086
|
+
}
|
|
3087
|
+
this.exitNode(node, state);
|
|
3088
|
+
return true;
|
|
3089
|
+
}
|
|
3090
|
+
emitJsxName(node) {
|
|
3091
|
+
if (node === undefined)
|
|
3092
|
+
return false;
|
|
3093
|
+
if (node instanceof Identifier)
|
|
3094
|
+
return this.emitIdentifierName(node);
|
|
3095
|
+
if (node instanceof JsxNamespacedName) {
|
|
3096
|
+
const state = this.enterNode(node);
|
|
3097
|
+
this.emitIdentifierName(node.namespace);
|
|
3098
|
+
this.write1(':');
|
|
3099
|
+
this.emitIdentifierName(node.name);
|
|
3100
|
+
this.exitNode(node, state);
|
|
3101
|
+
return true;
|
|
3102
|
+
}
|
|
3103
|
+
throw new Error('Unexpected JSX name ' + node.kind);
|
|
3104
|
+
}
|
|
3105
|
+
emitJsxTagName(node) {
|
|
3106
|
+
if (node instanceof Identifier)
|
|
3107
|
+
return this.emitIdentifierReference(node);
|
|
3108
|
+
if (node instanceof PropertyAccessExpression)
|
|
3109
|
+
return this.emitPropertyAccessExpression(node);
|
|
3110
|
+
if (node.kind === 109 /* SyntaxKind.ThisKeyword */)
|
|
3111
|
+
return this.emitTokenNode(node);
|
|
3112
|
+
return this.emitJsxName(node);
|
|
3113
|
+
}
|
|
3114
|
+
// Typed `Node | undefined` (with a check) so scriptc narrows elements read from arrays.
|
|
3115
|
+
emitJsxChild(node) {
|
|
3116
|
+
if (node === undefined)
|
|
3117
|
+
return false;
|
|
3118
|
+
if (node instanceof JsxText) {
|
|
3119
|
+
const state = this.enterNode(node);
|
|
3120
|
+
this.writer.writeText(node.text);
|
|
3121
|
+
this.exitNode(node, state);
|
|
3122
|
+
return true;
|
|
3123
|
+
}
|
|
3124
|
+
if (node instanceof JsxExpression)
|
|
3125
|
+
return this.emitJsxExpression(node);
|
|
3126
|
+
if (node instanceof JsxElement)
|
|
3127
|
+
return this.emitJsxElement(node);
|
|
3128
|
+
if (node instanceof JsxSelfClosingElement)
|
|
3129
|
+
return this.emitJsxSelfClosingElement(node);
|
|
3130
|
+
if (node instanceof JsxFragment)
|
|
3131
|
+
return this.emitJsxFragment(node);
|
|
3132
|
+
throw new Error('Unexpected JSX child ' + node.kind);
|
|
3133
|
+
}
|
|
3134
|
+
// Clauses
|
|
3135
|
+
emitCaseOrDefaultClause(node) {
|
|
3136
|
+
const state = this.enterNode(node);
|
|
3137
|
+
let colonPos;
|
|
3138
|
+
if (node.kind === 297 /* SyntaxKind.CaseClause */ && node.expression !== undefined) {
|
|
3139
|
+
this.emitToken(83 /* SyntaxKind.CaseKeyword */, node.pos, node);
|
|
3140
|
+
this.space();
|
|
3141
|
+
this.emitExpression(node.expression, 0 /* OperatorPrecedence.Lowest */);
|
|
3142
|
+
colonPos = node.expression.end;
|
|
3143
|
+
}
|
|
3144
|
+
else
|
|
3145
|
+
colonPos = this.emitToken(89 /* SyntaxKind.DefaultKeyword */, node.pos, node);
|
|
3146
|
+
const statements = node.statements.nodes;
|
|
3147
|
+
const single = statements.length === 1 &&
|
|
3148
|
+
(this.currentSourceFile === undefined ||
|
|
3149
|
+
nodeIsSynthesized(node) ||
|
|
3150
|
+
nodeIsSynthesized(statements[0]) ||
|
|
3151
|
+
this.positionsAreOnSameLine(this.rangeStart(node.pos), this.rangeStart(statements[0].pos)));
|
|
3152
|
+
let format = 163969 /* ListFormat.CaseOrDefaultClauseStatements */;
|
|
3153
|
+
if (single) {
|
|
3154
|
+
// The statement list emits the colon's trailing comments.
|
|
3155
|
+
this.writeTokenText(58 /* SyntaxKind.ColonToken */, colonPos);
|
|
3156
|
+
this.space();
|
|
3157
|
+
format &= ~(1 /* ListFormat.MultiLine */ | 128 /* ListFormat.Indented */);
|
|
3158
|
+
}
|
|
3159
|
+
else
|
|
3160
|
+
this.emitToken(58 /* SyntaxKind.ColonToken */, colonPos, node);
|
|
3161
|
+
this.emitList(15 /* ListItem.Statement */, node, node.statements, format);
|
|
3162
|
+
this.exitNode(node, state);
|
|
3163
|
+
return true;
|
|
3164
|
+
}
|
|
3165
|
+
emitHeritageClause(node) {
|
|
3166
|
+
const state = this.enterNode(node);
|
|
3167
|
+
this.space();
|
|
3168
|
+
this.emitToken(node.token, node.pos, node);
|
|
3169
|
+
this.space();
|
|
3170
|
+
this.emitList(22 /* ListItem.ExpressionWithTypeArguments */, node, node.types, 528 /* ListFormat.HeritageClauseTypes */);
|
|
3171
|
+
this.exitNode(node, state);
|
|
3172
|
+
return true;
|
|
3173
|
+
}
|
|
3174
|
+
emitCatchClause(node) {
|
|
3175
|
+
const state = this.enterNode(node);
|
|
3176
|
+
const openParenPos = this.emitToken(84 /* SyntaxKind.CatchKeyword */, node.pos, node);
|
|
3177
|
+
this.space();
|
|
3178
|
+
const declaration = node.variableDeclaration;
|
|
3179
|
+
if (declaration !== undefined) {
|
|
3180
|
+
this.emitToken(20 /* SyntaxKind.OpenParenToken */, openParenPos, node);
|
|
3181
|
+
this.emitVariableDeclaration(declaration);
|
|
3182
|
+
this.emitToken(21 /* SyntaxKind.CloseParenToken */, declaration.end, node);
|
|
3183
|
+
this.space();
|
|
3184
|
+
}
|
|
3185
|
+
this.emitBlock(node.block);
|
|
3186
|
+
this.exitNode(node, state);
|
|
3187
|
+
return true;
|
|
3188
|
+
}
|
|
3189
|
+
// Property assignments
|
|
3190
|
+
emitPropertyAssignment(node) {
|
|
3191
|
+
const state = this.enterNode(node);
|
|
3192
|
+
this.emitPropertyName(node.name);
|
|
3193
|
+
this.write1(': ');
|
|
3194
|
+
// `{ id: /*comment*/ () => {} }`: the comment trails the colon rather than leading the initializer.
|
|
3195
|
+
const initializer = node.initializer;
|
|
3196
|
+
if (!this.hasEmitFlag(initializer, 128 /* EmitFlags.NoLeadingComments */))
|
|
3197
|
+
this.emitTrailingComments(this.context.commentPos(initializer), 2 /* CommentSeparator.After */);
|
|
3198
|
+
this.emitExpression(initializer, 2 /* OperatorPrecedence.DisallowComma */);
|
|
3199
|
+
this.exitNode(node, state);
|
|
3200
|
+
return true;
|
|
3201
|
+
}
|
|
3202
|
+
emitShorthandPropertyAssignment(node) {
|
|
3203
|
+
const state = this.enterNode(node);
|
|
3204
|
+
this.emitPropertyName(node.name);
|
|
3205
|
+
if (node.objectAssignmentInitializer !== undefined) {
|
|
3206
|
+
this.write1(' = ');
|
|
3207
|
+
this.emitExpression(node.objectAssignmentInitializer, 2 /* OperatorPrecedence.DisallowComma */);
|
|
3208
|
+
}
|
|
3209
|
+
this.exitNode(node, state);
|
|
3210
|
+
return true;
|
|
3211
|
+
}
|
|
3212
|
+
emitSpreadAssignment(node) {
|
|
3213
|
+
const state = this.enterNode(node);
|
|
3214
|
+
this.emitToken(25 /* SyntaxKind.DotDotDotToken */, node.pos, node);
|
|
3215
|
+
this.emitExpression(node.expression, 2 /* OperatorPrecedence.DisallowComma */);
|
|
3216
|
+
this.exitNode(node, state);
|
|
3217
|
+
return true;
|
|
3218
|
+
}
|
|
3219
|
+
emitEnumMember(node) {
|
|
3220
|
+
const state = this.enterNode(node);
|
|
3221
|
+
this.emitPropertyName(node.name);
|
|
3222
|
+
this.emitInitializer(node.initializer, node.name.end, node);
|
|
3223
|
+
this.exitNode(node, state);
|
|
3224
|
+
return true;
|
|
3225
|
+
}
|
|
3226
|
+
// Source files
|
|
3227
|
+
emitPrologueDirectives(statements) {
|
|
3228
|
+
const nodes = statements.nodes;
|
|
3229
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
3230
|
+
const node = nodes[i];
|
|
3231
|
+
if (!isPrologueDirective(node))
|
|
3232
|
+
return i;
|
|
3233
|
+
this.line();
|
|
3234
|
+
this.emitStatement(node);
|
|
3235
|
+
}
|
|
3236
|
+
return nodes.length;
|
|
3237
|
+
}
|
|
3238
|
+
emitHelpers(node) {
|
|
3239
|
+
const nodeHelpers = this.context.getEmitHelpers(node);
|
|
3240
|
+
if (nodeHelpers === undefined || nodeHelpers.length === 0)
|
|
3241
|
+
return false;
|
|
3242
|
+
const file = this.currentSourceFile;
|
|
3243
|
+
const shouldSkip = this.options.noEmitHelpers || (file !== undefined && this.context.hasRecordedExternalHelpers(file));
|
|
3244
|
+
const helpers = nodeHelpers.slice();
|
|
3245
|
+
helpers.sort(compareEmitHelpers);
|
|
3246
|
+
let emitted = false;
|
|
3247
|
+
for (const helper of helpers) {
|
|
3248
|
+
if (!helper.scoped && shouldSkip)
|
|
3249
|
+
continue;
|
|
3250
|
+
let text = helper.text;
|
|
3251
|
+
if (helper.uniqueName.length > 0)
|
|
3252
|
+
text = text.split('{name}').join(this.nameGenerator.makeFileLevelOptimisticUniqueName(helper.uniqueName));
|
|
3253
|
+
this.writeLinesOfText(text);
|
|
3254
|
+
emitted = true;
|
|
3255
|
+
}
|
|
3256
|
+
return emitted;
|
|
3257
|
+
}
|
|
3258
|
+
emitSourceFileNode(node) {
|
|
3259
|
+
const savedSourceFile = this.currentSourceFile;
|
|
3260
|
+
const savedCommentsDisabled = this.commentsDisabled;
|
|
3261
|
+
this.setCurrentSourceFile(node);
|
|
3262
|
+
this.line();
|
|
3263
|
+
this.pushNameGenerationScope(node);
|
|
3264
|
+
this.generateAllNames(node.statements);
|
|
3265
|
+
let index = 0;
|
|
3266
|
+
let detached;
|
|
3267
|
+
if (node.scriptKind !== 6 /* ScriptKind.JSON */) {
|
|
3268
|
+
if (!nodeIsSynthesized(node)) {
|
|
3269
|
+
const shebang = getShebang(node.text);
|
|
3270
|
+
if (shebang.length > 0) {
|
|
3271
|
+
this.writer.writeComment(shebang);
|
|
3272
|
+
this.line();
|
|
3273
|
+
}
|
|
3274
|
+
}
|
|
3275
|
+
index = this.emitPrologueDirectives(node.statements);
|
|
3276
|
+
if (!this.writer.isAtStartOfLine())
|
|
3277
|
+
this.line();
|
|
3278
|
+
detached = this.emitDetachedCommentsBeforeStatementList(node, node.statements.pos);
|
|
3279
|
+
this.emitHelpers(node);
|
|
3280
|
+
if (node.isDeclarationFile)
|
|
3281
|
+
this.emitTripleSlashDirectives(node);
|
|
3282
|
+
}
|
|
3283
|
+
else
|
|
3284
|
+
detached = this.emitDetachedCommentsBeforeStatementList(node, node.statements.pos);
|
|
3285
|
+
this.emitListRange(15 /* ListItem.Statement */, node, node.statements, 1 /* ListFormat.MultiLine */, index);
|
|
3286
|
+
this.popNameGenerationScope(node);
|
|
3287
|
+
this.emitDetachedCommentsAfterStatementList(node, node.statements.end, detached);
|
|
3288
|
+
this.setCurrentSourceFile(savedSourceFile);
|
|
3289
|
+
this.commentsDisabled = savedCommentsDisabled;
|
|
3290
|
+
return true;
|
|
3291
|
+
}
|
|
3292
|
+
emitTripleSlashDirectives(node) {
|
|
3293
|
+
this.emitDirectives('path', node.referencedFiles);
|
|
3294
|
+
this.emitDirectives('types', node.typeReferenceDirectives);
|
|
3295
|
+
return this.emitDirectives('lib', node.libReferenceDirectives);
|
|
3296
|
+
}
|
|
3297
|
+
emitDirectives(kind, refs) {
|
|
3298
|
+
for (const ref of refs) {
|
|
3299
|
+
let mode = '';
|
|
3300
|
+
if (ref.resolutionMode !== 0)
|
|
3301
|
+
mode = 'resolution-mode="' + (ref.resolutionMode === 99 ? 'import' : 'require') + '" ';
|
|
3302
|
+
this.writer.writeComment('/// <reference ' + kind + '="' + ref.fileName + '" ' + mode + (ref.preserve ? 'preserve="true" ' : '') + '/>');
|
|
3303
|
+
this.line();
|
|
3304
|
+
}
|
|
3305
|
+
return true;
|
|
3306
|
+
}
|
|
3307
|
+
// Lists
|
|
3308
|
+
// Typed `Node | undefined` (with a check) so scriptc narrows elements read from arrays.
|
|
3309
|
+
emitListItem(item, node) {
|
|
3310
|
+
if (node === undefined)
|
|
3311
|
+
return false;
|
|
3312
|
+
switch (item) {
|
|
3313
|
+
case 0 /* ListItem.Keyword */:
|
|
3314
|
+
return this.emitTokenNode(node);
|
|
3315
|
+
case 1 /* ListItem.ModifierLike */:
|
|
3316
|
+
if (node instanceof Decorator)
|
|
3317
|
+
return this.emitDecorator(node);
|
|
3318
|
+
if (isModifier(node))
|
|
3319
|
+
return this.emitTokenNode(node);
|
|
3320
|
+
break;
|
|
3321
|
+
case 2 /* ListItem.TypeParameter */:
|
|
3322
|
+
if (node instanceof TypeParameterDeclaration)
|
|
3323
|
+
return this.emitTypeParameter(node);
|
|
3324
|
+
return this.emitTypeNodeOutsideExtends(node);
|
|
3325
|
+
case 3 /* ListItem.Parameter */:
|
|
3326
|
+
if (node instanceof ParameterDeclaration)
|
|
3327
|
+
return this.emitParameter(node);
|
|
3328
|
+
break;
|
|
3329
|
+
case 4 /* ListItem.TypeElement */:
|
|
3330
|
+
return this.emitTypeElement(node);
|
|
3331
|
+
case 5 /* ListItem.ClassElement */:
|
|
3332
|
+
return this.emitClassElement(node);
|
|
3333
|
+
case 6 /* ListItem.ObjectLiteralElement */:
|
|
3334
|
+
return this.emitObjectLiteralElement(node);
|
|
3335
|
+
case 7 /* ListItem.TypeArgument */:
|
|
3336
|
+
if (node instanceof TypeParameterDeclaration)
|
|
3337
|
+
return this.emitTypeParameter(node);
|
|
3338
|
+
return this.emitTypeNodeOutsideExtends(node);
|
|
3339
|
+
case 8 /* ListItem.UnionConstituent */:
|
|
3340
|
+
return this.emitTypeNode(node, 5 /* TypePrecedence.TypeOperator */);
|
|
3341
|
+
case 9 /* ListItem.TemplateTypeSpan */:
|
|
3342
|
+
if (node instanceof TemplateLiteralTypeSpan)
|
|
3343
|
+
return this.emitTemplateTypeSpan(node);
|
|
3344
|
+
break;
|
|
3345
|
+
case 10 /* ListItem.ImportAttribute */:
|
|
3346
|
+
if (node instanceof ImportAttribute)
|
|
3347
|
+
return this.emitImportAttribute(node);
|
|
3348
|
+
break;
|
|
3349
|
+
case 11 /* ListItem.BindingElement */:
|
|
3350
|
+
if (node instanceof BindingElement)
|
|
3351
|
+
return this.emitBindingElement(node);
|
|
3352
|
+
break;
|
|
3353
|
+
case 12 /* ListItem.ArrayElement */:
|
|
3354
|
+
case 13 /* ListItem.Argument */:
|
|
3355
|
+
return this.emitExpression(node, 1 /* OperatorPrecedence.Spread */);
|
|
3356
|
+
case 14 /* ListItem.TemplateSpan */:
|
|
3357
|
+
if (node instanceof TemplateSpan) {
|
|
3358
|
+
const state = this.enterNode(node);
|
|
3359
|
+
this.emitExpression(node.expression, 0 /* OperatorPrecedence.Comma */);
|
|
3360
|
+
this.emitLiteral(node.literal);
|
|
3361
|
+
this.exitNode(node, state);
|
|
3362
|
+
return true;
|
|
3363
|
+
}
|
|
3364
|
+
break;
|
|
3365
|
+
case 15 /* ListItem.Statement */:
|
|
3366
|
+
return this.emitStatement(node);
|
|
3367
|
+
case 16 /* ListItem.VariableDeclaration */:
|
|
3368
|
+
if (node instanceof VariableDeclaration)
|
|
3369
|
+
return this.emitVariableDeclaration(node);
|
|
3370
|
+
break;
|
|
3371
|
+
case 17 /* ListItem.HeritageClause */:
|
|
3372
|
+
if (node instanceof HeritageClause)
|
|
3373
|
+
return this.emitHeritageClause(node);
|
|
3374
|
+
break;
|
|
3375
|
+
case 18 /* ListItem.EnumMember */:
|
|
3376
|
+
if (node instanceof EnumMember)
|
|
3377
|
+
return this.emitEnumMember(node);
|
|
3378
|
+
break;
|
|
3379
|
+
case 19 /* ListItem.CaseOrDefaultClause */:
|
|
3380
|
+
if (node instanceof CaseOrDefaultClause)
|
|
3381
|
+
return this.emitCaseOrDefaultClause(node);
|
|
3382
|
+
break;
|
|
3383
|
+
case 20 /* ListItem.ImportSpecifier */:
|
|
3384
|
+
if (node instanceof ImportSpecifier)
|
|
3385
|
+
return this.emitSpecifier(node, node.isTypeOnly, node.propertyName, node.name, true);
|
|
3386
|
+
break;
|
|
3387
|
+
case 21 /* ListItem.ExportSpecifier */:
|
|
3388
|
+
if (node instanceof ExportSpecifier)
|
|
3389
|
+
return this.emitSpecifier(node, node.isTypeOnly, node.propertyName, node.name, false);
|
|
3390
|
+
break;
|
|
3391
|
+
case 22 /* ListItem.ExpressionWithTypeArguments */:
|
|
3392
|
+
if (node instanceof ExpressionWithTypeArguments)
|
|
3393
|
+
return this.emitExpressionWithTypeArguments(node);
|
|
3394
|
+
break;
|
|
3395
|
+
case 23 /* ListItem.JsxChild */:
|
|
3396
|
+
return this.emitJsxChild(node);
|
|
3397
|
+
case 24 /* ListItem.JsxAttributeLike */:
|
|
3398
|
+
if (node instanceof JsxAttribute)
|
|
3399
|
+
return this.emitJsxAttribute(node);
|
|
3400
|
+
if (node instanceof JsxSpreadAttribute) {
|
|
3401
|
+
const state = this.enterNode(node);
|
|
3402
|
+
this.write1('{...');
|
|
3403
|
+
this.emitExpression(node.expression, 0 /* OperatorPrecedence.Lowest */);
|
|
3404
|
+
this.write1('}');
|
|
3405
|
+
this.exitNode(node, state);
|
|
3406
|
+
return true;
|
|
3407
|
+
}
|
|
3408
|
+
break;
|
|
3409
|
+
}
|
|
3410
|
+
throw new Error('Unexpected list element ' + node.kind);
|
|
3411
|
+
}
|
|
3412
|
+
emitList(item, parent, children, format) {
|
|
3413
|
+
if (this.hasEmitFlag(parent, 2 /* EmitFlags.MultiLine */))
|
|
3414
|
+
format |= 65536 /* ListFormat.PreferNewLine */ | 128 /* ListFormat.Indented */;
|
|
3415
|
+
return this.emitListRange(item, parent, children, format, 0);
|
|
3416
|
+
}
|
|
3417
|
+
emitListRange(item, parent, children, format, start) {
|
|
3418
|
+
if (children === undefined && (format & 16384 /* ListFormat.OptionalIfNil */) !== 0)
|
|
3419
|
+
return false;
|
|
3420
|
+
const length = children === undefined ? 0 : children.nodes.length;
|
|
3421
|
+
const isEmpty = children === undefined || start >= length;
|
|
3422
|
+
if (isEmpty && (format & 32768 /* ListFormat.OptionalIfEmpty */) !== 0)
|
|
3423
|
+
return false;
|
|
3424
|
+
const brackets = (format & 15360 /* ListFormat.BracketsMask */) !== 0;
|
|
3425
|
+
if (brackets) {
|
|
3426
|
+
this.write1(openingBracket(format));
|
|
3427
|
+
if (isEmpty && children !== undefined)
|
|
3428
|
+
this.emitTrailingComments(children.pos, 1 /* CommentSeparator.Before */);
|
|
3429
|
+
}
|
|
3430
|
+
if (isEmpty) {
|
|
3431
|
+
if ((format & 1 /* ListFormat.MultiLine */) !== 0 &&
|
|
3432
|
+
!(this.options.preserveSourceNewlines &&
|
|
3433
|
+
(parent === undefined || (this.currentSourceFile !== undefined && this.rangeIsOnSingleLine(parent)))))
|
|
3434
|
+
this.line();
|
|
3435
|
+
else if ((format & 256 /* ListFormat.SpaceBetweenBraces */) !== 0 && (format & 524288 /* ListFormat.NoSpaceIfEmpty */) === 0)
|
|
3436
|
+
this.space();
|
|
3437
|
+
}
|
|
3438
|
+
else
|
|
3439
|
+
this.emitListItems(item, parent, children.nodes, start, length, format, this.hasTrailingComma(parent, children), children.pos, children.end);
|
|
3440
|
+
if (brackets) {
|
|
3441
|
+
if (isEmpty && children !== undefined)
|
|
3442
|
+
this.emitLeadingComments(children.end, false);
|
|
3443
|
+
this.write1(closingBracket(format));
|
|
3444
|
+
}
|
|
3445
|
+
return true;
|
|
3446
|
+
}
|
|
3447
|
+
/** Whether to keep a list's trailing comma; for transformed nodes, as in the original list. */
|
|
3448
|
+
hasTrailingComma(parent, children) {
|
|
3449
|
+
if (!children.hasTrailingComma())
|
|
3450
|
+
return false;
|
|
3451
|
+
const original = this.context.mostOriginal(parent);
|
|
3452
|
+
if (original === parent)
|
|
3453
|
+
return true;
|
|
3454
|
+
if (original.kind !== parent.kind)
|
|
3455
|
+
return false;
|
|
3456
|
+
let originalList = children;
|
|
3457
|
+
switch (original.kind) {
|
|
3458
|
+
case 211 /* SyntaxKind.ObjectLiteralExpression */:
|
|
3459
|
+
originalList = getProperties(original);
|
|
3460
|
+
break;
|
|
3461
|
+
case 210 /* SyntaxKind.ArrayLiteralExpression */:
|
|
3462
|
+
case 207 /* SyntaxKind.ObjectBindingPattern */:
|
|
3463
|
+
case 208 /* SyntaxKind.ArrayBindingPattern */:
|
|
3464
|
+
case 276 /* SyntaxKind.NamedImports */:
|
|
3465
|
+
case 280 /* SyntaxKind.NamedExports */:
|
|
3466
|
+
originalList = getElements(original);
|
|
3467
|
+
break;
|
|
3468
|
+
case 214 /* SyntaxKind.CallExpression */:
|
|
3469
|
+
case 215 /* SyntaxKind.NewExpression */:
|
|
3470
|
+
if (children === getTypeArguments(parent))
|
|
3471
|
+
originalList = getTypeArguments(original);
|
|
3472
|
+
else if (children === getArguments(parent))
|
|
3473
|
+
originalList = getArguments(original);
|
|
3474
|
+
break;
|
|
3475
|
+
case 177 /* SyntaxKind.Constructor */:
|
|
3476
|
+
case 175 /* SyntaxKind.MethodDeclaration */:
|
|
3477
|
+
case 178 /* SyntaxKind.GetAccessor */:
|
|
3478
|
+
case 179 /* SyntaxKind.SetAccessor */:
|
|
3479
|
+
case 263 /* SyntaxKind.FunctionDeclaration */:
|
|
3480
|
+
case 219 /* SyntaxKind.FunctionExpression */:
|
|
3481
|
+
case 220 /* SyntaxKind.ArrowFunction */:
|
|
3482
|
+
case 185 /* SyntaxKind.FunctionType */:
|
|
3483
|
+
case 186 /* SyntaxKind.ConstructorType */:
|
|
3484
|
+
case 180 /* SyntaxKind.CallSignature */:
|
|
3485
|
+
case 181 /* SyntaxKind.ConstructSignature */:
|
|
3486
|
+
if (children === getTypeParameters(parent))
|
|
3487
|
+
originalList = getTypeParameters(original);
|
|
3488
|
+
else if (children === getParameters(parent))
|
|
3489
|
+
originalList = getParameters(original);
|
|
3490
|
+
break;
|
|
3491
|
+
case 264 /* SyntaxKind.ClassDeclaration */:
|
|
3492
|
+
case 232 /* SyntaxKind.ClassExpression */:
|
|
3493
|
+
case 265 /* SyntaxKind.InterfaceDeclaration */:
|
|
3494
|
+
case 266 /* SyntaxKind.TypeAliasDeclaration */:
|
|
3495
|
+
case 345 /* SyntaxKind.JSTypeAliasDeclaration */:
|
|
3496
|
+
if (children === getTypeParameters(parent))
|
|
3497
|
+
originalList = getTypeParameters(original);
|
|
3498
|
+
break;
|
|
3499
|
+
case 301 /* SyntaxKind.ImportAttributes */:
|
|
3500
|
+
if (original instanceof ImportAttributes)
|
|
3501
|
+
originalList = original.attributes;
|
|
3502
|
+
break;
|
|
3503
|
+
}
|
|
3504
|
+
return originalList !== undefined && originalList.hasTrailingComma();
|
|
3505
|
+
}
|
|
3506
|
+
writeDelimiter(format) {
|
|
3507
|
+
switch (format & 60 /* ListFormat.DelimitersMask */) {
|
|
3508
|
+
case 16 /* ListFormat.CommaDelimited */:
|
|
3509
|
+
return this.write1(',');
|
|
3510
|
+
case 4 /* ListFormat.BarDelimited */:
|
|
3511
|
+
return this.write1(' |');
|
|
3512
|
+
case 32 /* ListFormat.AsteriskDelimited */:
|
|
3513
|
+
return this.write1(' * ');
|
|
3514
|
+
case 8 /* ListFormat.AmpersandDelimited */:
|
|
3515
|
+
return this.write1(' &');
|
|
3516
|
+
}
|
|
3517
|
+
return false;
|
|
3518
|
+
}
|
|
3519
|
+
emitListItems(item, parent, nodes, start, end, format, hasTrailingComma, childrenPos, childrenEnd) {
|
|
3520
|
+
const mayEmitInterveningComments = (format & 262144 /* ListFormat.NoInterveningComments */) === 0;
|
|
3521
|
+
let shouldEmitInterveningComments = mayEmitInterveningComments;
|
|
3522
|
+
const leadingLineTerminatorCount = end > start ? this.getLeadingLineTerminatorCount(parent, nodes[start], format) : 0;
|
|
3523
|
+
if (leadingLineTerminatorCount > 0) {
|
|
3524
|
+
this.lines(leadingLineTerminatorCount);
|
|
3525
|
+
shouldEmitInterveningComments = false;
|
|
3526
|
+
}
|
|
3527
|
+
else if ((format & 256 /* ListFormat.SpaceBetweenBraces */) !== 0)
|
|
3528
|
+
this.space();
|
|
3529
|
+
if ((format & 128 /* ListFormat.Indented */) !== 0)
|
|
3530
|
+
this.writer.indent++;
|
|
3531
|
+
const parentEnd = parent.end;
|
|
3532
|
+
let previous = undefined;
|
|
3533
|
+
let shouldDecreaseIndentAfterEmit = false;
|
|
3534
|
+
for (let i = start; i < end; i++) {
|
|
3535
|
+
const child = nodes[i];
|
|
3536
|
+
if ((format & 32 /* ListFormat.AsteriskDelimited */) !== 0) {
|
|
3537
|
+
this.line();
|
|
3538
|
+
this.writeDelimiter(format);
|
|
3539
|
+
}
|
|
3540
|
+
else if (previous !== undefined) {
|
|
3541
|
+
// A comment between an element and its delimiter, on a line of its own, leads the delimiter.
|
|
3542
|
+
if ((format & 60 /* ListFormat.DelimitersMask */) !== 0 &&
|
|
3543
|
+
previous.end !== parentEnd &&
|
|
3544
|
+
!this.commentsDisabled &&
|
|
3545
|
+
!this.hasEmitFlag(previous, 256 /* EmitFlags.NoTrailingComments */))
|
|
3546
|
+
this.emitLeadingComments(previous.end, false);
|
|
3547
|
+
this.writeDelimiter(format);
|
|
3548
|
+
const separating = this.getSeparatingLineTerminatorCount(previous, child, format);
|
|
3549
|
+
if (separating > 0) {
|
|
3550
|
+
if ((format & (3 /* ListFormat.LinesMask */ | 128 /* ListFormat.Indented */)) === 0) {
|
|
3551
|
+
this.writer.indent++;
|
|
3552
|
+
shouldDecreaseIndentAfterEmit = true;
|
|
3553
|
+
}
|
|
3554
|
+
if (shouldEmitInterveningComments &&
|
|
3555
|
+
(format & 60 /* ListFormat.DelimitersMask */) !== 0 &&
|
|
3556
|
+
!positionIsSynthesized(child.pos) &&
|
|
3557
|
+
!this.hasEmitFlag(child, 128 /* EmitFlags.NoLeadingComments */))
|
|
3558
|
+
this.emitTrailingCommentsOfPosition(this.context.commentPos(child), (format & 512 /* ListFormat.SpaceBetweenSiblings */) !== 0, true);
|
|
3559
|
+
this.lines(separating);
|
|
3560
|
+
shouldEmitInterveningComments = false;
|
|
3561
|
+
}
|
|
3562
|
+
else if ((format & 512 /* ListFormat.SpaceBetweenSiblings */) !== 0)
|
|
3563
|
+
this.space();
|
|
3564
|
+
}
|
|
3565
|
+
if (shouldEmitInterveningComments && !this.hasEmitFlag(child, 128 /* EmitFlags.NoLeadingComments */))
|
|
3566
|
+
this.emitTrailingCommentsOfPosition(this.context.commentPos(child), false, false);
|
|
3567
|
+
else
|
|
3568
|
+
shouldEmitInterveningComments = mayEmitInterveningComments;
|
|
3569
|
+
this.nextListElementPos = child.pos;
|
|
3570
|
+
this.emitListItem(item, child);
|
|
3571
|
+
if (shouldDecreaseIndentAfterEmit) {
|
|
3572
|
+
this.writer.indent--;
|
|
3573
|
+
shouldDecreaseIndentAfterEmit = false;
|
|
3574
|
+
}
|
|
3575
|
+
previous = child;
|
|
3576
|
+
}
|
|
3577
|
+
const skipTrailingComments = this.commentsDisabled || (previous !== undefined && this.hasEmitFlag(previous, 256 /* EmitFlags.NoTrailingComments */));
|
|
3578
|
+
const emitTrailingComma = hasTrailingComma && (format & 64 /* ListFormat.AllowTrailingComma */) !== 0 && (format & 16 /* ListFormat.CommaDelimited */) !== 0;
|
|
3579
|
+
if (emitTrailingComma) {
|
|
3580
|
+
if (previous !== undefined && !skipTrailingComments)
|
|
3581
|
+
this.emitToken(27 /* SyntaxKind.CommaToken */, previous.end, previous);
|
|
3582
|
+
else
|
|
3583
|
+
this.write1(',');
|
|
3584
|
+
}
|
|
3585
|
+
if (previous !== undefined &&
|
|
3586
|
+
parentEnd !== previous.end &&
|
|
3587
|
+
(format & 60 /* ListFormat.DelimitersMask */) !== 0 &&
|
|
3588
|
+
!skipTrailingComments)
|
|
3589
|
+
this.emitLeadingComments(emitTrailingComma && childrenEnd > 0 ? childrenEnd : previous.end, false);
|
|
3590
|
+
if ((format & 128 /* ListFormat.Indented */) !== 0)
|
|
3591
|
+
this.writer.indent--;
|
|
3592
|
+
const closing = this.getClosingLineTerminatorCount(parent, end > start ? nodes[end - 1] : undefined, format, childrenEnd);
|
|
3593
|
+
if (closing > 0)
|
|
3594
|
+
this.lines(closing);
|
|
3595
|
+
else if ((format & (2097152 /* ListFormat.SpaceAfterList */ | 256 /* ListFormat.SpaceBetweenBraces */)) !== 0)
|
|
3596
|
+
this.space();
|
|
3597
|
+
return childrenPos >= -1;
|
|
3598
|
+
}
|
|
3599
|
+
// Any node
|
|
3600
|
+
emitAnyNode(node) {
|
|
3601
|
+
switch (node.kind) {
|
|
3602
|
+
case 15 /* SyntaxKind.TemplateHead */:
|
|
3603
|
+
case 16 /* SyntaxKind.TemplateMiddle */:
|
|
3604
|
+
case 17 /* SyntaxKind.TemplateTail */:
|
|
3605
|
+
return this.emitLiteral(node);
|
|
3606
|
+
case 79 /* SyntaxKind.Identifier */:
|
|
3607
|
+
if (node instanceof Identifier)
|
|
3608
|
+
return this.emitIdentifierName(node);
|
|
3609
|
+
break;
|
|
3610
|
+
case 80 /* SyntaxKind.PrivateIdentifier */:
|
|
3611
|
+
if (node instanceof PrivateIdentifier)
|
|
3612
|
+
return this.emitPrivateIdentifier(node);
|
|
3613
|
+
break;
|
|
3614
|
+
case 167 /* SyntaxKind.QualifiedName */:
|
|
3615
|
+
if (node instanceof QualifiedName)
|
|
3616
|
+
return this.emitQualifiedName(node);
|
|
3617
|
+
break;
|
|
3618
|
+
case 168 /* SyntaxKind.ComputedPropertyName */:
|
|
3619
|
+
if (node instanceof ComputedPropertyName)
|
|
3620
|
+
return this.emitComputedPropertyName(node);
|
|
3621
|
+
break;
|
|
3622
|
+
case 169 /* SyntaxKind.TypeParameter */:
|
|
3623
|
+
if (node instanceof TypeParameterDeclaration)
|
|
3624
|
+
return this.emitTypeParameter(node);
|
|
3625
|
+
break;
|
|
3626
|
+
case 170 /* SyntaxKind.Parameter */:
|
|
3627
|
+
if (node instanceof ParameterDeclaration)
|
|
3628
|
+
return this.emitParameter(node);
|
|
3629
|
+
break;
|
|
3630
|
+
case 171 /* SyntaxKind.Decorator */:
|
|
3631
|
+
if (node instanceof Decorator)
|
|
3632
|
+
return this.emitDecorator(node);
|
|
3633
|
+
break;
|
|
3634
|
+
case 172 /* SyntaxKind.PropertySignature */:
|
|
3635
|
+
case 174 /* SyntaxKind.MethodSignature */:
|
|
3636
|
+
case 180 /* SyntaxKind.CallSignature */:
|
|
3637
|
+
case 181 /* SyntaxKind.ConstructSignature */:
|
|
3638
|
+
case 350 /* SyntaxKind.NotEmittedTypeElement */:
|
|
3639
|
+
return this.emitTypeElement(node);
|
|
3640
|
+
case 173 /* SyntaxKind.PropertyDeclaration */:
|
|
3641
|
+
case 175 /* SyntaxKind.MethodDeclaration */:
|
|
3642
|
+
case 176 /* SyntaxKind.ClassStaticBlockDeclaration */:
|
|
3643
|
+
case 177 /* SyntaxKind.Constructor */:
|
|
3644
|
+
case 178 /* SyntaxKind.GetAccessor */:
|
|
3645
|
+
case 179 /* SyntaxKind.SetAccessor */:
|
|
3646
|
+
case 182 /* SyntaxKind.IndexSignature */:
|
|
3647
|
+
case 241 /* SyntaxKind.SemicolonClassElement */:
|
|
3648
|
+
return this.emitClassElement(node);
|
|
3649
|
+
case 207 /* SyntaxKind.ObjectBindingPattern */:
|
|
3650
|
+
case 208 /* SyntaxKind.ArrayBindingPattern */:
|
|
3651
|
+
if (node instanceof BindingPattern)
|
|
3652
|
+
return this.emitBindingPattern(node);
|
|
3653
|
+
break;
|
|
3654
|
+
case 209 /* SyntaxKind.BindingElement */:
|
|
3655
|
+
if (node instanceof BindingElement)
|
|
3656
|
+
return this.emitBindingElement(node);
|
|
3657
|
+
break;
|
|
3658
|
+
case 240 /* SyntaxKind.TemplateSpan */:
|
|
3659
|
+
return this.emitListItem(14 /* ListItem.TemplateSpan */, node);
|
|
3660
|
+
case 261 /* SyntaxKind.VariableDeclaration */:
|
|
3661
|
+
if (node instanceof VariableDeclaration)
|
|
3662
|
+
return this.emitVariableDeclaration(node);
|
|
3663
|
+
break;
|
|
3664
|
+
case 262 /* SyntaxKind.VariableDeclarationList */:
|
|
3665
|
+
if (node instanceof VariableDeclarationList)
|
|
3666
|
+
return this.emitVariableDeclarationList(node);
|
|
3667
|
+
break;
|
|
3668
|
+
case 269 /* SyntaxKind.ModuleBlock */:
|
|
3669
|
+
if (node instanceof ModuleBlock)
|
|
3670
|
+
return this.emitBlockLike(node, node.statements, false);
|
|
3671
|
+
break;
|
|
3672
|
+
case 270 /* SyntaxKind.CaseBlock */:
|
|
3673
|
+
if (node instanceof CaseBlock)
|
|
3674
|
+
return this.emitBlockLike(node, node.clauses, true);
|
|
3675
|
+
break;
|
|
3676
|
+
case 274 /* SyntaxKind.ImportClause */:
|
|
3677
|
+
if (node instanceof ImportClause)
|
|
3678
|
+
return this.emitImportClause(node);
|
|
3679
|
+
break;
|
|
3680
|
+
case 277 /* SyntaxKind.ImportSpecifier */:
|
|
3681
|
+
return this.emitListItem(20 /* ListItem.ImportSpecifier */, node);
|
|
3682
|
+
case 282 /* SyntaxKind.ExportSpecifier */:
|
|
3683
|
+
return this.emitListItem(21 /* ListItem.ExportSpecifier */, node);
|
|
3684
|
+
case 301 /* SyntaxKind.ImportAttributes */:
|
|
3685
|
+
if (node instanceof ImportAttributes)
|
|
3686
|
+
return this.emitImportAttributes(node);
|
|
3687
|
+
break;
|
|
3688
|
+
case 302 /* SyntaxKind.ImportAttribute */:
|
|
3689
|
+
if (node instanceof ImportAttribute)
|
|
3690
|
+
return this.emitImportAttribute(node);
|
|
3691
|
+
break;
|
|
3692
|
+
case 11 /* SyntaxKind.JsxText */:
|
|
3693
|
+
case 295 /* SyntaxKind.JsxExpression */:
|
|
3694
|
+
return this.emitJsxChild(node);
|
|
3695
|
+
case 287 /* SyntaxKind.JsxOpeningElement */:
|
|
3696
|
+
if (node instanceof JsxOpeningElement)
|
|
3697
|
+
return this.emitJsxOpeningElement(node);
|
|
3698
|
+
break;
|
|
3699
|
+
case 288 /* SyntaxKind.JsxClosingElement */:
|
|
3700
|
+
if (node instanceof JsxClosingElement)
|
|
3701
|
+
return this.emitJsxClosingElement(node);
|
|
3702
|
+
break;
|
|
3703
|
+
case 292 /* SyntaxKind.JsxAttribute */:
|
|
3704
|
+
case 294 /* SyntaxKind.JsxSpreadAttribute */:
|
|
3705
|
+
return this.emitListItem(24 /* ListItem.JsxAttributeLike */, node);
|
|
3706
|
+
case 293 /* SyntaxKind.JsxAttributes */:
|
|
3707
|
+
if (node instanceof JsxAttributes)
|
|
3708
|
+
return this.emitJsxAttributes(node);
|
|
3709
|
+
break;
|
|
3710
|
+
case 296 /* SyntaxKind.JsxNamespacedName */:
|
|
3711
|
+
return this.emitJsxName(node);
|
|
3712
|
+
case 297 /* SyntaxKind.CaseClause */:
|
|
3713
|
+
case 298 /* SyntaxKind.DefaultClause */:
|
|
3714
|
+
if (node instanceof CaseOrDefaultClause)
|
|
3715
|
+
return this.emitCaseOrDefaultClause(node);
|
|
3716
|
+
break;
|
|
3717
|
+
case 299 /* SyntaxKind.HeritageClause */:
|
|
3718
|
+
if (node instanceof HeritageClause)
|
|
3719
|
+
return this.emitHeritageClause(node);
|
|
3720
|
+
break;
|
|
3721
|
+
case 300 /* SyntaxKind.CatchClause */:
|
|
3722
|
+
if (node instanceof CatchClause)
|
|
3723
|
+
return this.emitCatchClause(node);
|
|
3724
|
+
break;
|
|
3725
|
+
case 303 /* SyntaxKind.PropertyAssignment */:
|
|
3726
|
+
case 304 /* SyntaxKind.ShorthandPropertyAssignment */:
|
|
3727
|
+
case 305 /* SyntaxKind.SpreadAssignment */:
|
|
3728
|
+
return this.emitObjectLiteralElement(node);
|
|
3729
|
+
case 306 /* SyntaxKind.EnumMember */:
|
|
3730
|
+
if (node instanceof EnumMember)
|
|
3731
|
+
return this.emitEnumMember(node);
|
|
3732
|
+
break;
|
|
3733
|
+
case 307 /* SyntaxKind.SourceFile */:
|
|
3734
|
+
if (node instanceof SourceFile)
|
|
3735
|
+
return this.emitSourceFileNode(node);
|
|
3736
|
+
break;
|
|
3737
|
+
}
|
|
3738
|
+
if (isTypeNodeKind(node.kind))
|
|
3739
|
+
return this.emitTypeNodeOutsideExtends(node);
|
|
3740
|
+
if (isStatement(node))
|
|
3741
|
+
return this.emitStatement(node);
|
|
3742
|
+
if (isExpression(node))
|
|
3743
|
+
return this.emitExpression(node, 0 /* OperatorPrecedence.Lowest */);
|
|
3744
|
+
if (isKeywordKind(node.kind) || isPunctuationKind(node.kind))
|
|
3745
|
+
return this.emitTokenNode(node);
|
|
3746
|
+
if (isJSDocKind(node.kind))
|
|
3747
|
+
throw new Error('Printing JSDoc is not implemented');
|
|
3748
|
+
throw new Error('Unexpected node ' + node.kind);
|
|
3749
|
+
}
|
|
3750
|
+
// Comments
|
|
3751
|
+
emitCommentsBeforeNode(node) {
|
|
3752
|
+
if (!this.shouldEmitComments(node))
|
|
3753
|
+
return false;
|
|
3754
|
+
const flags = this.context.getEmitFlags(node);
|
|
3755
|
+
const pos = this.context.commentPos(node);
|
|
3756
|
+
const end = this.context.commentEnd(node);
|
|
3757
|
+
this.commentStack.push(flags, pos, end, this.containerPos, this.containerEnd, this.declarationListContainerEnd);
|
|
3758
|
+
this.emitLeadingCommentsOfNode(node, flags, pos, end);
|
|
3759
|
+
if ((flags & 128 /* EmitFlags.NoLeadingComments */) === 0) {
|
|
3760
|
+
const synthesized = this.context.getSyntheticLeadingComments(node);
|
|
3761
|
+
if (synthesized !== undefined)
|
|
3762
|
+
for (const comment of synthesized)
|
|
3763
|
+
this.emitLeadingSynthesizedComment(comment);
|
|
3764
|
+
}
|
|
3765
|
+
if ((flags & 512 /* EmitFlags.NoNestedComments */) !== 0)
|
|
3766
|
+
this.commentsDisabled = true;
|
|
3767
|
+
return true;
|
|
3768
|
+
}
|
|
3769
|
+
emitCommentsAfterNode(node) {
|
|
3770
|
+
const stack = this.commentStack;
|
|
3771
|
+
const base = stack.length - 6;
|
|
3772
|
+
// `| 0` keeps scriptc from typing array reads as possibly undefined.
|
|
3773
|
+
const flags = stack[base] | 0;
|
|
3774
|
+
const pos = stack[base + 1] | 0;
|
|
3775
|
+
const end = stack[base + 2] | 0;
|
|
3776
|
+
const containerPos = stack[base + 3] | 0;
|
|
3777
|
+
const containerEnd = stack[base + 4] | 0;
|
|
3778
|
+
const declarationListContainerEnd = stack[base + 5] | 0;
|
|
3779
|
+
stack.length = base;
|
|
3780
|
+
if ((flags & 512 /* EmitFlags.NoNestedComments */) !== 0)
|
|
3781
|
+
this.commentsDisabled = false;
|
|
3782
|
+
if ((flags & 256 /* EmitFlags.NoTrailingComments */) === 0) {
|
|
3783
|
+
const synthesized = this.context.getSyntheticTrailingComments(node);
|
|
3784
|
+
if (synthesized !== undefined)
|
|
3785
|
+
for (const comment of synthesized)
|
|
3786
|
+
this.emitTrailingSynthesizedComment(comment);
|
|
3787
|
+
}
|
|
3788
|
+
this.emitTrailingCommentsOfNode(node, flags, pos, end, containerPos, containerEnd, declarationListContainerEnd);
|
|
3789
|
+
// Comments after an erased type annotation.
|
|
3790
|
+
const typeNode = this.context.getTypeNode(node);
|
|
3791
|
+
if (typeNode !== undefined)
|
|
3792
|
+
this.emitTrailingCommentsOfNode(node, flags, typeNode.pos, typeNode.end, containerPos, containerEnd, declarationListContainerEnd);
|
|
3793
|
+
return true;
|
|
3794
|
+
}
|
|
3795
|
+
/** Emits comments before a token; returns whether `emitCommentsAfterToken` applies, with the token's position in `tokenPos`. */
|
|
3796
|
+
emitCommentsBeforeToken(pos, contextNode, flags) {
|
|
3797
|
+
if ((flags & 1 /* TokenEmitFlags.NoComments */) !== 0 || this.commentsDisabled) {
|
|
3798
|
+
this.tokenPos = this.currentSourceFile !== undefined && pos >= 0 ? skipTrivia(this.sourceText, pos) : pos;
|
|
3799
|
+
return false;
|
|
3800
|
+
}
|
|
3801
|
+
const startPos = pos;
|
|
3802
|
+
if (this.currentSourceFile !== undefined)
|
|
3803
|
+
pos = skipTrivia(this.sourceText, startPos);
|
|
3804
|
+
this.tokenPos = pos;
|
|
3805
|
+
const parseNode = this.context.parseNode(contextNode);
|
|
3806
|
+
if (parseNode === undefined || parseNode.kind !== contextNode.kind)
|
|
3807
|
+
return false;
|
|
3808
|
+
if (contextNode.pos !== startPos) {
|
|
3809
|
+
const needsIndent = (flags & 2 /* TokenEmitFlags.IndentLeadingComments */) !== 0 &&
|
|
3810
|
+
this.currentSourceFile !== undefined &&
|
|
3811
|
+
!this.positionsAreOnSameLine(startPos, pos);
|
|
3812
|
+
this.indentIf(needsIndent, 1);
|
|
3813
|
+
this.emitLeadingComments(startPos, false);
|
|
3814
|
+
this.indentIf(needsIndent, -1);
|
|
3815
|
+
}
|
|
3816
|
+
return true;
|
|
3817
|
+
}
|
|
3818
|
+
emitCommentsAfterToken(pos, contextNode) {
|
|
3819
|
+
if (contextNode.end !== pos)
|
|
3820
|
+
this.emitTrailingComments(pos, contextNode.kind === 295 /* SyntaxKind.JsxExpression */ ? 0 /* CommentSeparator.None */ : 1 /* CommentSeparator.Before */);
|
|
3821
|
+
return true;
|
|
3822
|
+
}
|
|
3823
|
+
emitDetachedCommentsBeforeStatementList(node, pos) {
|
|
3824
|
+
if (node instanceof SourceFile) {
|
|
3825
|
+
const statements = node.statements.nodes;
|
|
3826
|
+
if (statements.length > 0 && isPrologueDirective(statements[0]) && !nodeIsSynthesized(statements[0]))
|
|
3827
|
+
return -1;
|
|
3828
|
+
}
|
|
3829
|
+
const flags = this.context.getEmitFlags(node);
|
|
3830
|
+
if (!positionIsSynthesized(pos) && (flags & 128 /* EmitFlags.NoLeadingComments */) === 0)
|
|
3831
|
+
this.emitDetachedCommentsAndUpdateCommentsInfo(pos);
|
|
3832
|
+
if ((flags & 512 /* EmitFlags.NoNestedComments */) !== 0)
|
|
3833
|
+
this.commentsDisabled = true;
|
|
3834
|
+
return flags;
|
|
3835
|
+
}
|
|
3836
|
+
/** `flags` is what `emitDetachedCommentsBeforeStatementList` returned; -1 if it emitted nothing. */
|
|
3837
|
+
emitDetachedCommentsAfterStatementList(node, end, flags) {
|
|
3838
|
+
if (flags < 0)
|
|
3839
|
+
return false;
|
|
3840
|
+
if (this.commentsDisabled || positionIsSynthesized(end) || (flags & 256 /* EmitFlags.NoTrailingComments */) !== 0)
|
|
3841
|
+
return false;
|
|
3842
|
+
if (this.emitLeadingComments(end, false) && !this.writer.isAtStartOfLine())
|
|
3843
|
+
this.line();
|
|
3844
|
+
return node.kind >= 0;
|
|
3845
|
+
}
|
|
3846
|
+
emitLeadingCommentsOfNode(node, flags, pos, end) {
|
|
3847
|
+
if ((positionIsSynthesized(pos) && positionIsSynthesized(end)) || pos === end)
|
|
3848
|
+
return false;
|
|
3849
|
+
const jsxText = node.kind === 11 /* SyntaxKind.JsxText */;
|
|
3850
|
+
const skipLeading = positionIsSynthesized(pos) || (flags & 128 /* EmitFlags.NoLeadingComments */) !== 0 || jsxText;
|
|
3851
|
+
const skipTrailing = positionIsSynthesized(end) || (flags & 256 /* EmitFlags.NoTrailingComments */) !== 0 || jsxText;
|
|
3852
|
+
if (!skipLeading)
|
|
3853
|
+
this.emitLeadingComments(pos, node.kind === 347 /* SyntaxKind.NotEmittedStatement */);
|
|
3854
|
+
if (!skipLeading || (pos >= 0 && (flags & 128 /* EmitFlags.NoLeadingComments */) !== 0))
|
|
3855
|
+
this.containerPos = pos;
|
|
3856
|
+
if (!skipTrailing || (end >= 0 && (flags & 256 /* EmitFlags.NoTrailingComments */) !== 0)) {
|
|
3857
|
+
this.containerEnd = end;
|
|
3858
|
+
if (node.kind === 262 /* SyntaxKind.VariableDeclarationList */)
|
|
3859
|
+
this.declarationListContainerEnd = end;
|
|
3860
|
+
}
|
|
3861
|
+
return true;
|
|
3862
|
+
}
|
|
3863
|
+
emitTrailingCommentsOfNode(node, flags, pos, end, containerPos, containerEnd, declarationListContainerEnd) {
|
|
3864
|
+
const skipTrailing = end < 0 || (flags & 256 /* EmitFlags.NoTrailingComments */) !== 0 || node.kind === 11 /* SyntaxKind.JsxText */;
|
|
3865
|
+
if ((positionIsSynthesized(pos) && positionIsSynthesized(end)) || pos === end)
|
|
3866
|
+
return false;
|
|
3867
|
+
this.containerPos = containerPos;
|
|
3868
|
+
this.containerEnd = containerEnd;
|
|
3869
|
+
this.declarationListContainerEnd = declarationListContainerEnd;
|
|
3870
|
+
if (!skipTrailing && node.kind !== 347 /* SyntaxKind.NotEmittedStatement */)
|
|
3871
|
+
this.emitTrailingComments(end, 1 /* CommentSeparator.Before */);
|
|
3872
|
+
return true;
|
|
3873
|
+
}
|
|
3874
|
+
emitLeadingSynthesizedComment(comment) {
|
|
3875
|
+
if (comment.hasLeadingNewLine || comment.kind === 2 /* SyntaxKind.SingleLineCommentTrivia */)
|
|
3876
|
+
this.line();
|
|
3877
|
+
this.writeSynthesizedComment(comment);
|
|
3878
|
+
if (comment.hasTrailingNewLine || comment.kind === 2 /* SyntaxKind.SingleLineCommentTrivia */)
|
|
3879
|
+
this.line();
|
|
3880
|
+
else
|
|
3881
|
+
this.space();
|
|
3882
|
+
return true;
|
|
3883
|
+
}
|
|
3884
|
+
emitTrailingSynthesizedComment(comment) {
|
|
3885
|
+
if (!this.writer.isAtStartOfLine())
|
|
3886
|
+
this.space();
|
|
3887
|
+
this.writeSynthesizedComment(comment);
|
|
3888
|
+
if (comment.hasTrailingNewLine)
|
|
3889
|
+
this.line();
|
|
3890
|
+
return true;
|
|
3891
|
+
}
|
|
3892
|
+
writeSynthesizedComment(comment) {
|
|
3893
|
+
const multiLine = comment.kind === 3 /* SyntaxKind.MultiLineCommentTrivia */;
|
|
3894
|
+
const text = multiLine ? '/*' + comment.text + '*/' : '//' + comment.text;
|
|
3895
|
+
return this.writeCommentText(text, multiLine ? computeLineStarts(text) : [0], comment.kind, 0, text.length);
|
|
3896
|
+
}
|
|
3897
|
+
emitLeadingComments(pos, elided) {
|
|
3898
|
+
if (this.commentsDisabled || this.currentSourceFile === undefined || pos < 0 || pos === this.containerPos)
|
|
3899
|
+
return false;
|
|
3900
|
+
// 1: only triple-slash comments, 2: all but triple-slash comments, 0: all.
|
|
3901
|
+
let tripleSlash = 0;
|
|
3902
|
+
if (!elided) {
|
|
3903
|
+
if (pos === 0 && this.currentSourceFile.isDeclarationFile)
|
|
3904
|
+
tripleSlash = 2;
|
|
3905
|
+
}
|
|
3906
|
+
else if (pos === 0)
|
|
3907
|
+
tripleSlash = 1;
|
|
3908
|
+
else
|
|
3909
|
+
return false;
|
|
3910
|
+
const detached = this.detachedComments;
|
|
3911
|
+
if (detached.length > 0 && detached[detached.length - 2] === pos) {
|
|
3912
|
+
pos = detached[detached.length - 1] | 0;
|
|
3913
|
+
detached.pop();
|
|
3914
|
+
detached.pop();
|
|
3915
|
+
}
|
|
3916
|
+
const ranges = getLeadingCommentRanges(this.sourceText, pos);
|
|
3917
|
+
if (ranges === undefined)
|
|
3918
|
+
return false;
|
|
3919
|
+
let comments = undefined;
|
|
3920
|
+
for (const comment of ranges) {
|
|
3921
|
+
if (!this.shouldWriteComment(comment))
|
|
3922
|
+
continue;
|
|
3923
|
+
if (tripleSlash !== 0 && isRecognizedTripleSlashComment(this.sourceText, comment) !== (tripleSlash === 1))
|
|
3924
|
+
continue;
|
|
3925
|
+
if (comments === undefined)
|
|
3926
|
+
comments = [];
|
|
3927
|
+
comments.push(comment);
|
|
3928
|
+
}
|
|
3929
|
+
if (comments === undefined)
|
|
3930
|
+
return false;
|
|
3931
|
+
if (this.shouldEmitNewLineBeforeLeadingComment(pos, comments[0].pos))
|
|
3932
|
+
this.line();
|
|
3933
|
+
return this.emitComments(comments, 2 /* CommentSeparator.After */);
|
|
3934
|
+
}
|
|
3935
|
+
shouldEmitNewLineBeforeLeadingComment(pos, commentPos) {
|
|
3936
|
+
return (this.currentSourceFile !== undefined &&
|
|
3937
|
+
pos !== commentPos &&
|
|
3938
|
+
computeLineOfPosition(this.lineStarts, pos) !== computeLineOfPosition(this.lineStarts, commentPos));
|
|
3939
|
+
}
|
|
3940
|
+
emitLeadingCommentsOfPosition(pos) {
|
|
3941
|
+
if (this.commentsDisabled || pos === -1)
|
|
3942
|
+
return false;
|
|
3943
|
+
return this.emitLeadingComments(pos, false);
|
|
3944
|
+
}
|
|
3945
|
+
emitTrailingComments(pos, separator) {
|
|
3946
|
+
if (this.commentsDisabled ||
|
|
3947
|
+
this.currentSourceFile === undefined ||
|
|
3948
|
+
(this.containerEnd !== -1 && (pos === this.containerEnd || pos === this.declarationListContainerEnd)))
|
|
3949
|
+
return false;
|
|
3950
|
+
const ranges = getTrailingCommentRanges(this.sourceText, pos);
|
|
3951
|
+
if (ranges === undefined)
|
|
3952
|
+
return false;
|
|
3953
|
+
let comments = undefined;
|
|
3954
|
+
for (const comment of ranges) {
|
|
3955
|
+
if (!this.shouldWriteComment(comment))
|
|
3956
|
+
continue;
|
|
3957
|
+
if (comments === undefined)
|
|
3958
|
+
comments = [];
|
|
3959
|
+
comments.push(comment);
|
|
3960
|
+
}
|
|
3961
|
+
return comments !== undefined && this.emitComments(comments, separator);
|
|
3962
|
+
}
|
|
3963
|
+
emitTrailingCommentsOfPosition(pos, prefixSpace, forceNoNewline) {
|
|
3964
|
+
if (this.commentsDisabled || this.currentSourceFile === undefined)
|
|
3965
|
+
return false;
|
|
3966
|
+
if (this.containerEnd !== -1 && (pos === this.containerEnd || pos === this.declarationListContainerEnd))
|
|
3967
|
+
return false;
|
|
3968
|
+
const comments = getTrailingCommentRanges(this.sourceText, pos);
|
|
3969
|
+
if (comments === undefined)
|
|
3970
|
+
return false;
|
|
3971
|
+
for (const comment of comments) {
|
|
3972
|
+
if (prefixSpace) {
|
|
3973
|
+
if (!this.shouldWriteComment(comment))
|
|
3974
|
+
continue;
|
|
3975
|
+
if (!this.writer.isAtStartOfLine())
|
|
3976
|
+
this.space();
|
|
3977
|
+
this.emitComment(comment);
|
|
3978
|
+
if (comment.hasTrailingNewLine)
|
|
3979
|
+
this.line();
|
|
3980
|
+
continue;
|
|
3981
|
+
}
|
|
3982
|
+
this.emitComment(comment);
|
|
3983
|
+
if (forceNoNewline) {
|
|
3984
|
+
if (comment.kind === 2 /* SyntaxKind.SingleLineCommentTrivia */)
|
|
3985
|
+
this.line();
|
|
3986
|
+
}
|
|
3987
|
+
else if (comment.hasTrailingNewLine)
|
|
3988
|
+
this.line();
|
|
3989
|
+
else
|
|
3990
|
+
this.space();
|
|
3991
|
+
}
|
|
3992
|
+
return true;
|
|
3993
|
+
}
|
|
3994
|
+
emitDetachedCommentsAndUpdateCommentsInfo(pos) {
|
|
3995
|
+
if (this.currentSourceFile === undefined)
|
|
3996
|
+
return false;
|
|
3997
|
+
const end = this.emitDetachedComments(pos);
|
|
3998
|
+
if (end < 0)
|
|
3999
|
+
return false;
|
|
4000
|
+
this.detachedComments.push(pos, end);
|
|
4001
|
+
return true;
|
|
4002
|
+
}
|
|
4003
|
+
/** Emits a leading copyright-style comment block; returns its end, or -1 if there is none. */
|
|
4004
|
+
emitDetachedComments(pos) {
|
|
4005
|
+
const text = this.sourceText;
|
|
4006
|
+
let leading;
|
|
4007
|
+
if (this.commentsDisabled) {
|
|
4008
|
+
// Without comments, keep pinned comments at the top of the file.
|
|
4009
|
+
if (pos === 0) {
|
|
4010
|
+
const ranges = getLeadingCommentRanges(text, pos);
|
|
4011
|
+
if (ranges !== undefined)
|
|
4012
|
+
for (const range of ranges)
|
|
4013
|
+
if (isPinnedComment(text, range)) {
|
|
4014
|
+
if (leading === undefined)
|
|
4015
|
+
leading = [];
|
|
4016
|
+
leading.push(range);
|
|
4017
|
+
}
|
|
4018
|
+
}
|
|
4019
|
+
}
|
|
4020
|
+
else
|
|
4021
|
+
leading = getLeadingCommentRanges(text, pos);
|
|
4022
|
+
if (leading === undefined || leading.length === 0)
|
|
4023
|
+
return -1;
|
|
4024
|
+
const lineStarts = this.lineStarts;
|
|
4025
|
+
let count = 0;
|
|
4026
|
+
for (let i = 0; i < leading.length; i++) {
|
|
4027
|
+
if (i > 0) {
|
|
4028
|
+
const lastLine = computeLineOfPosition(lineStarts, leading[i - 1].end);
|
|
4029
|
+
const line = computeLineOfPosition(lineStarts, leading[i].pos);
|
|
4030
|
+
// A blank line ends the block.
|
|
4031
|
+
if (line >= lastLine + 2)
|
|
4032
|
+
break;
|
|
4033
|
+
}
|
|
4034
|
+
count++;
|
|
4035
|
+
}
|
|
4036
|
+
const lastEnd = leading[count - 1].end;
|
|
4037
|
+
const lastLine = computeLineOfPosition(lineStarts, lastEnd);
|
|
4038
|
+
const nodeLine = computeLineOfPosition(lineStarts, skipTrivia(text, pos));
|
|
4039
|
+
if (nodeLine < lastLine + 2)
|
|
4040
|
+
return -1;
|
|
4041
|
+
let toEmit = undefined;
|
|
4042
|
+
for (let i = 0; i < count; i++) {
|
|
4043
|
+
const comment = leading[i];
|
|
4044
|
+
if (!this.shouldWriteComment(comment))
|
|
4045
|
+
continue;
|
|
4046
|
+
if (toEmit === undefined)
|
|
4047
|
+
toEmit = [];
|
|
4048
|
+
toEmit.push(comment);
|
|
4049
|
+
}
|
|
4050
|
+
if (toEmit !== undefined) {
|
|
4051
|
+
if (this.shouldEmitNewLineBeforeLeadingComment(pos, toEmit[0].pos))
|
|
4052
|
+
this.line();
|
|
4053
|
+
this.emitComments(toEmit, 2 /* CommentSeparator.After */);
|
|
4054
|
+
}
|
|
4055
|
+
return lastEnd;
|
|
4056
|
+
}
|
|
4057
|
+
emitComments(comments, separator) {
|
|
4058
|
+
if (comments.length === 0)
|
|
4059
|
+
return false;
|
|
4060
|
+
let interveningSeparator = false;
|
|
4061
|
+
if (separator === 1 /* CommentSeparator.Before */)
|
|
4062
|
+
this.space();
|
|
4063
|
+
for (const comment of comments) {
|
|
4064
|
+
if (interveningSeparator) {
|
|
4065
|
+
this.space();
|
|
4066
|
+
interveningSeparator = false;
|
|
4067
|
+
}
|
|
4068
|
+
this.emitComment(comment);
|
|
4069
|
+
if (comment.kind === 2 /* SyntaxKind.SingleLineCommentTrivia */ ||
|
|
4070
|
+
(comment.hasTrailingNewLine && separator !== 0 /* CommentSeparator.None */))
|
|
4071
|
+
this.line();
|
|
4072
|
+
else
|
|
4073
|
+
interveningSeparator = separator !== 0 /* CommentSeparator.None */;
|
|
4074
|
+
}
|
|
4075
|
+
if (interveningSeparator && separator === 2 /* CommentSeparator.After */)
|
|
4076
|
+
this.space();
|
|
4077
|
+
return true;
|
|
4078
|
+
}
|
|
4079
|
+
emitComment(comment) {
|
|
4080
|
+
this.emitPos(comment.pos);
|
|
4081
|
+
this.writeCommentRange(comment);
|
|
4082
|
+
return this.emitPos(comment.end);
|
|
4083
|
+
}
|
|
4084
|
+
// Source maps
|
|
4085
|
+
setSourceMapSource(source) {
|
|
4086
|
+
if (this.sourceMapsDisabled)
|
|
4087
|
+
return false;
|
|
4088
|
+
this.sourceMapSource = source;
|
|
4089
|
+
this.sourceMapLineStarts = source.lineStarts();
|
|
4090
|
+
this.sourceMapLine = 0;
|
|
4091
|
+
if (this.mostRecentSourceMapSource === source) {
|
|
4092
|
+
this.sourceMapSourceIndex = this.mostRecentSourceMapSourceIndex;
|
|
4093
|
+
return true;
|
|
4094
|
+
}
|
|
4095
|
+
this.sourceMapSourceIsJson = fileExtensionIs(source.fileName, '.json');
|
|
4096
|
+
if (this.sourceMapSourceIsJson)
|
|
4097
|
+
return true;
|
|
4098
|
+
const generator = this.sourceMapGenerator;
|
|
4099
|
+
this.sourceMapSourceIndex = generator.addSource(source.fileName);
|
|
4100
|
+
if (this.options.inlineSources)
|
|
4101
|
+
generator.setSourceContent(this.sourceMapSourceIndex, source.text);
|
|
4102
|
+
this.mostRecentSourceMapSource = source;
|
|
4103
|
+
this.mostRecentSourceMapSourceIndex = this.sourceMapSourceIndex;
|
|
4104
|
+
return true;
|
|
4105
|
+
}
|
|
4106
|
+
emitPos(pos) {
|
|
4107
|
+
const generator = this.sourceMapGenerator;
|
|
4108
|
+
if (this.sourceMapsDisabled ||
|
|
4109
|
+
this.sourceMapSource === undefined ||
|
|
4110
|
+
generator === undefined ||
|
|
4111
|
+
this.sourceMapSourceIsJson ||
|
|
4112
|
+
pos < 0)
|
|
4113
|
+
return false;
|
|
4114
|
+
const lineStarts = this.sourceMapLineStarts;
|
|
4115
|
+
const line = this.sourceMapLineOf(pos);
|
|
4116
|
+
return generator.addSourceMapping(this.writer.getLine(), this.writer.getColumn(), this.sourceMapSourceIndex, line, pos - (lineStarts[line] | 0));
|
|
4117
|
+
}
|
|
4118
|
+
/**
|
|
4119
|
+
* The line of `pos` in the source map source, as `computeLineOfPosition` finds it. Positions mostly
|
|
4120
|
+
* increase, so the line of the last position and the few after it are tried first.
|
|
4121
|
+
*/
|
|
4122
|
+
sourceMapLineOf(pos) {
|
|
4123
|
+
const lineStarts = this.sourceMapLineStarts;
|
|
4124
|
+
let line = this.sourceMapLine;
|
|
4125
|
+
if (line < lineStarts.length && (lineStarts[line] | 0) <= pos) {
|
|
4126
|
+
for (let k = 0; k < 4; k++) {
|
|
4127
|
+
if (line + 1 >= lineStarts.length || (lineStarts[line + 1] | 0) > pos) {
|
|
4128
|
+
this.sourceMapLine = line;
|
|
4129
|
+
return line;
|
|
4130
|
+
}
|
|
4131
|
+
line++;
|
|
4132
|
+
}
|
|
4133
|
+
}
|
|
4134
|
+
line = computeLineOfPosition(lineStarts, pos);
|
|
4135
|
+
this.sourceMapLine = line;
|
|
4136
|
+
return line;
|
|
4137
|
+
}
|
|
4138
|
+
emitSourceMapsBeforeNode(node) {
|
|
4139
|
+
if (!this.shouldEmitSourceMaps(node))
|
|
4140
|
+
return false;
|
|
4141
|
+
const flags = this.context.getEmitFlags(node);
|
|
4142
|
+
const pos = this.context.sourceMapPos(node);
|
|
4143
|
+
const end = this.context.sourceMapEnd(node);
|
|
4144
|
+
if (node.kind !== 347 /* SyntaxKind.NotEmittedStatement */ &&
|
|
4145
|
+
(flags & 4 /* EmitFlags.NoLeadingSourceMap */) === 0 &&
|
|
4146
|
+
this.currentSourceFile !== undefined &&
|
|
4147
|
+
pos >= 0)
|
|
4148
|
+
this.emitPos(skipTrivia(this.sourceText, pos));
|
|
4149
|
+
if ((flags & 16 /* EmitFlags.NoNestedSourceMaps */) !== 0)
|
|
4150
|
+
this.sourceMapsDisabled = true;
|
|
4151
|
+
this.sourceMapStack.push(flags, pos, end, 0);
|
|
4152
|
+
return true;
|
|
4153
|
+
}
|
|
4154
|
+
emitSourceMapsAfterNode(node) {
|
|
4155
|
+
const stack = this.sourceMapStack;
|
|
4156
|
+
const base = stack.length - 4;
|
|
4157
|
+
const flags = stack[base] | 0;
|
|
4158
|
+
const end = stack[base + 2] | 0;
|
|
4159
|
+
stack.length = base;
|
|
4160
|
+
if ((flags & 16 /* EmitFlags.NoNestedSourceMaps */) !== 0)
|
|
4161
|
+
this.sourceMapsDisabled = false;
|
|
4162
|
+
if (node.kind !== 347 /* SyntaxKind.NotEmittedStatement */ && (flags & 8 /* EmitFlags.NoTrailingSourceMap */) === 0 && end >= 0)
|
|
4163
|
+
this.emitPos(end);
|
|
4164
|
+
return true;
|
|
4165
|
+
}
|
|
4166
|
+
emitSourceMapsBeforeToken(token, pos, contextNode, flags) {
|
|
4167
|
+
if ((flags & 4 /* TokenEmitFlags.NoSourceMaps */) !== 0 ||
|
|
4168
|
+
!this.shouldEmitSourceMaps(contextNode) ||
|
|
4169
|
+
this.options.omitBraceSourceMapPositions ||
|
|
4170
|
+
(token !== 18 /* SyntaxKind.OpenBraceToken */ && token !== 19 /* SyntaxKind.CloseBraceToken */))
|
|
4171
|
+
return false;
|
|
4172
|
+
const emitFlags = this.context.getEmitFlags(contextNode);
|
|
4173
|
+
const range = this.context.tokenSourceMapRange(contextNode, token);
|
|
4174
|
+
if (range !== undefined)
|
|
4175
|
+
pos = range[0] | 0;
|
|
4176
|
+
if (pos >= 0 && this.currentSourceFile !== undefined)
|
|
4177
|
+
pos = skipTrivia(this.sourceText, pos);
|
|
4178
|
+
if ((emitFlags & 32 /* EmitFlags.NoTokenLeadingSourceMaps */) === 0 && pos >= 0)
|
|
4179
|
+
this.emitPos(pos);
|
|
4180
|
+
this.sourceMapStack.push(emitFlags, range === undefined ? -1 : range[0] | 0, range === undefined ? -1 : range[1] | 0, range === undefined ? 0 : 1);
|
|
4181
|
+
return true;
|
|
4182
|
+
}
|
|
4183
|
+
emitSourceMapsAfterToken(pos) {
|
|
4184
|
+
const stack = this.sourceMapStack;
|
|
4185
|
+
const base = stack.length - 4;
|
|
4186
|
+
const flags = stack[base] | 0;
|
|
4187
|
+
const end = stack[base + 2] | 0;
|
|
4188
|
+
const hasRange = stack[base + 3] !== 0;
|
|
4189
|
+
stack.length = base;
|
|
4190
|
+
if ((flags & 64 /* EmitFlags.NoTokenTrailingSourceMaps */) === 0) {
|
|
4191
|
+
if (hasRange)
|
|
4192
|
+
pos = end;
|
|
4193
|
+
if (pos >= 0)
|
|
4194
|
+
this.emitPos(pos);
|
|
4195
|
+
}
|
|
4196
|
+
return true;
|
|
4197
|
+
}
|
|
4198
|
+
// Name generation
|
|
4199
|
+
pushNameGenerationScope(node) {
|
|
4200
|
+
return this.nameGenerator.pushScope(this.hasEmitFlag(node, 32768 /* EmitFlags.ReuseTempVariableScope */));
|
|
4201
|
+
}
|
|
4202
|
+
popNameGenerationScope(node) {
|
|
4203
|
+
return this.nameGenerator.popScope(this.hasEmitFlag(node, 32768 /* EmitFlags.ReuseTempVariableScope */));
|
|
4204
|
+
}
|
|
4205
|
+
generateAllNames(nodes) {
|
|
4206
|
+
if (nodes === undefined)
|
|
4207
|
+
return false;
|
|
4208
|
+
for (const node of nodes.nodes)
|
|
4209
|
+
this.generateNames(node);
|
|
4210
|
+
return true;
|
|
4211
|
+
}
|
|
4212
|
+
generateNames(node) {
|
|
4213
|
+
if (node === undefined)
|
|
4214
|
+
return false;
|
|
4215
|
+
// Only generated names need work; parse trees without them are common.
|
|
4216
|
+
if (this.context.autoGenerate.size === 0)
|
|
4217
|
+
return false;
|
|
4218
|
+
if (node instanceof Block)
|
|
4219
|
+
return this.generateAllNames(node.statements);
|
|
4220
|
+
if (node instanceof CaseOrDefaultClause)
|
|
4221
|
+
return this.generateAllNames(node.statements);
|
|
4222
|
+
if (node instanceof LabeledStatement)
|
|
4223
|
+
return this.generateNames(node.statement);
|
|
4224
|
+
if (node instanceof WithStatement)
|
|
4225
|
+
return this.generateNames(node.statement);
|
|
4226
|
+
if (node instanceof DoStatement)
|
|
4227
|
+
return this.generateNames(node.statement);
|
|
4228
|
+
if (node instanceof WhileStatement)
|
|
4229
|
+
return this.generateNames(node.statement);
|
|
4230
|
+
if (node instanceof IfStatement) {
|
|
4231
|
+
this.generateNames(node.thenStatement);
|
|
4232
|
+
return this.generateNames(node.elseStatement);
|
|
4233
|
+
}
|
|
4234
|
+
if (node instanceof ForStatement) {
|
|
4235
|
+
this.generateNames(node.initializer);
|
|
4236
|
+
return this.generateNames(node.statement);
|
|
4237
|
+
}
|
|
4238
|
+
if (node instanceof ForInOrOfStatement) {
|
|
4239
|
+
this.generateNames(node.initializer);
|
|
4240
|
+
return this.generateNames(node.statement);
|
|
4241
|
+
}
|
|
4242
|
+
if (node instanceof SwitchStatement)
|
|
4243
|
+
return this.generateNames(node.caseBlock);
|
|
4244
|
+
if (node instanceof CaseBlock)
|
|
4245
|
+
return this.generateAllNames(node.clauses);
|
|
4246
|
+
if (node instanceof TryStatement) {
|
|
4247
|
+
this.generateNames(node.tryBlock);
|
|
4248
|
+
this.generateNames(node.catchClause);
|
|
4249
|
+
return this.generateNames(node.finallyBlock);
|
|
4250
|
+
}
|
|
4251
|
+
if (node instanceof CatchClause) {
|
|
4252
|
+
this.generateNames(node.variableDeclaration);
|
|
4253
|
+
return this.generateNames(node.block);
|
|
4254
|
+
}
|
|
4255
|
+
if (node instanceof VariableStatement)
|
|
4256
|
+
return this.generateNames(node.declarationList);
|
|
4257
|
+
if (node instanceof VariableDeclarationList)
|
|
4258
|
+
return this.generateAllNames(node.declarations);
|
|
4259
|
+
if (node instanceof VariableDeclaration)
|
|
4260
|
+
return this.generateNameIfNeeded(node.name);
|
|
4261
|
+
if (node instanceof ParameterDeclaration)
|
|
4262
|
+
return this.generateNameIfNeeded(node.name);
|
|
4263
|
+
if (node instanceof BindingElement)
|
|
4264
|
+
return this.generateNameIfNeeded(node.name);
|
|
4265
|
+
if (node instanceof ClassDeclaration)
|
|
4266
|
+
return this.generateNameIfNeeded(node.name);
|
|
4267
|
+
if (node instanceof FunctionDeclaration) {
|
|
4268
|
+
this.generateNameIfNeeded(node.name);
|
|
4269
|
+
if (this.hasEmitFlag(node, 32768 /* EmitFlags.ReuseTempVariableScope */)) {
|
|
4270
|
+
this.generateAllNames(node.parameters);
|
|
4271
|
+
this.generateNames(node.body);
|
|
4272
|
+
}
|
|
4273
|
+
return true;
|
|
4274
|
+
}
|
|
4275
|
+
if (node instanceof BindingPattern)
|
|
4276
|
+
return this.generateAllNames(node.elements);
|
|
4277
|
+
if (node instanceof ImportDeclaration)
|
|
4278
|
+
return this.generateNames(node.importClause);
|
|
4279
|
+
if (node instanceof ImportClause) {
|
|
4280
|
+
this.generateNameIfNeeded(node.name);
|
|
4281
|
+
return this.generateNames(node.namedBindings);
|
|
4282
|
+
}
|
|
4283
|
+
if (node instanceof NamespaceImport)
|
|
4284
|
+
return this.generateNameIfNeeded(node.name);
|
|
4285
|
+
if (node instanceof NamespaceExport)
|
|
4286
|
+
return this.generateNameIfNeeded(node.name);
|
|
4287
|
+
if (node instanceof NamedImports)
|
|
4288
|
+
return this.generateAllNames(node.elements);
|
|
4289
|
+
if (node instanceof ImportSpecifier)
|
|
4290
|
+
return this.generateNameIfNeeded(node.propertyName !== undefined ? node.propertyName : node.name);
|
|
4291
|
+
return false;
|
|
4292
|
+
}
|
|
4293
|
+
generateAllMemberNames(nodes) {
|
|
4294
|
+
if (nodes === undefined || this.context.autoGenerate.size === 0)
|
|
4295
|
+
return false;
|
|
4296
|
+
for (const node of nodes.nodes) {
|
|
4297
|
+
switch (node.kind) {
|
|
4298
|
+
case 303 /* SyntaxKind.PropertyAssignment */:
|
|
4299
|
+
case 304 /* SyntaxKind.ShorthandPropertyAssignment */:
|
|
4300
|
+
case 173 /* SyntaxKind.PropertyDeclaration */:
|
|
4301
|
+
case 172 /* SyntaxKind.PropertySignature */:
|
|
4302
|
+
case 175 /* SyntaxKind.MethodDeclaration */:
|
|
4303
|
+
case 174 /* SyntaxKind.MethodSignature */:
|
|
4304
|
+
case 178 /* SyntaxKind.GetAccessor */:
|
|
4305
|
+
case 179 /* SyntaxKind.SetAccessor */:
|
|
4306
|
+
this.generateNameIfNeeded(getName(node));
|
|
4307
|
+
}
|
|
4308
|
+
}
|
|
4309
|
+
return true;
|
|
4310
|
+
}
|
|
4311
|
+
generateNameIfNeeded(name) {
|
|
4312
|
+
if (name === undefined || this.context.autoGenerate.size === 0)
|
|
4313
|
+
return false;
|
|
4314
|
+
if (isMemberName(name)) {
|
|
4315
|
+
this.nameGenerator.generateName(name);
|
|
4316
|
+
return true;
|
|
4317
|
+
}
|
|
4318
|
+
if (name instanceof BindingPattern)
|
|
4319
|
+
return this.generateNames(name);
|
|
4320
|
+
return false;
|
|
4321
|
+
}
|
|
4322
|
+
// Scopes
|
|
4323
|
+
enterNode(node) {
|
|
4324
|
+
let state = 0 /* State.None */;
|
|
4325
|
+
if (this.emitCommentsBeforeNode(node))
|
|
4326
|
+
state |= 1 /* State.Comments */;
|
|
4327
|
+
if (this.emitSourceMapsBeforeNode(node))
|
|
4328
|
+
state |= 2 /* State.SourceMaps */;
|
|
4329
|
+
return state;
|
|
4330
|
+
}
|
|
4331
|
+
exitNode(node, state) {
|
|
4332
|
+
if ((state & 2 /* State.SourceMaps */) !== 0)
|
|
4333
|
+
this.emitSourceMapsAfterNode(node);
|
|
4334
|
+
if ((state & 1 /* State.Comments */) !== 0)
|
|
4335
|
+
this.emitCommentsAfterNode(node);
|
|
4336
|
+
return true;
|
|
4337
|
+
}
|
|
4338
|
+
enterTokenNode(node, flags) {
|
|
4339
|
+
let state = 0 /* State.None */;
|
|
4340
|
+
if ((flags & 1 /* TokenEmitFlags.NoComments */) === 0 && this.emitCommentsBeforeNode(node))
|
|
4341
|
+
state |= 1 /* State.Comments */;
|
|
4342
|
+
if ((flags & 4 /* TokenEmitFlags.NoSourceMaps */) === 0 && this.emitSourceMapsBeforeNode(node))
|
|
4343
|
+
state |= 2 /* State.SourceMaps */;
|
|
4344
|
+
return state;
|
|
4345
|
+
}
|
|
4346
|
+
exitTokenNode(node, state) {
|
|
4347
|
+
return this.exitNode(node, state);
|
|
4348
|
+
}
|
|
4349
|
+
enterToken(token, pos, contextNode, flags) {
|
|
4350
|
+
let state = 0 /* State.None */;
|
|
4351
|
+
if (this.emitCommentsBeforeToken(pos, contextNode, flags))
|
|
4352
|
+
state |= 1 /* State.Comments */;
|
|
4353
|
+
if (this.emitSourceMapsBeforeToken(token, this.tokenPos, contextNode, flags))
|
|
4354
|
+
state |= 2 /* State.SourceMaps */;
|
|
4355
|
+
return state;
|
|
4356
|
+
}
|
|
4357
|
+
exitToken(token, pos, contextNode, state) {
|
|
4358
|
+
if ((state & 2 /* State.SourceMaps */) !== 0)
|
|
4359
|
+
this.emitSourceMapsAfterToken(pos);
|
|
4360
|
+
if ((state & 1 /* State.Comments */) !== 0)
|
|
4361
|
+
this.emitCommentsAfterToken(pos, contextNode);
|
|
4362
|
+
return token >= 0;
|
|
4363
|
+
}
|
|
4364
|
+
}
|
|
4365
|
+
function openingBracket(format) {
|
|
4366
|
+
switch (format & 15360 /* ListFormat.BracketsMask */) {
|
|
4367
|
+
case 1024 /* ListFormat.Braces */:
|
|
4368
|
+
return '{';
|
|
4369
|
+
case 2048 /* ListFormat.Parenthesis */:
|
|
4370
|
+
return '(';
|
|
4371
|
+
case 4096 /* ListFormat.AngleBrackets */:
|
|
4372
|
+
return '<';
|
|
4373
|
+
}
|
|
4374
|
+
return '[';
|
|
4375
|
+
}
|
|
4376
|
+
function closingBracket(format) {
|
|
4377
|
+
switch (format & 15360 /* ListFormat.BracketsMask */) {
|
|
4378
|
+
case 1024 /* ListFormat.Braces */:
|
|
4379
|
+
return '}';
|
|
4380
|
+
case 2048 /* ListFormat.Parenthesis */:
|
|
4381
|
+
return ')';
|
|
4382
|
+
case 4096 /* ListFormat.AngleBrackets */:
|
|
4383
|
+
return '>';
|
|
4384
|
+
}
|
|
4385
|
+
return ']';
|
|
4386
|
+
}
|
|
4387
|
+
function splitLines(text) {
|
|
4388
|
+
const lines = [];
|
|
4389
|
+
let start = 0;
|
|
4390
|
+
for (let i = 0; i < text.length; i++) {
|
|
4391
|
+
const ch = text.charCodeAt(i);
|
|
4392
|
+
if (ch === 0x0d || ch === 0x0a) {
|
|
4393
|
+
lines.push(text.substring(start, i));
|
|
4394
|
+
if (ch === 0x0d && i + 1 < text.length && text.charCodeAt(i + 1) === 0x0a)
|
|
4395
|
+
i++;
|
|
4396
|
+
start = i + 1;
|
|
4397
|
+
}
|
|
4398
|
+
}
|
|
4399
|
+
if (start < text.length)
|
|
4400
|
+
lines.push(text.substring(start));
|
|
4401
|
+
return lines;
|
|
4402
|
+
}
|
|
4403
|
+
/** The smallest leading whitespace of the non-blank lines. */
|
|
4404
|
+
function guessIndentation(lines) {
|
|
4405
|
+
let indentation = 0x7fffffff;
|
|
4406
|
+
for (const line of lines) {
|
|
4407
|
+
if (line.length === 0)
|
|
4408
|
+
continue;
|
|
4409
|
+
let i = 0;
|
|
4410
|
+
while (i < line.length && i < indentation) {
|
|
4411
|
+
const ch = line.charCodeAt(i);
|
|
4412
|
+
if (!isWhiteSpaceLike(ch))
|
|
4413
|
+
break;
|
|
4414
|
+
i++;
|
|
4415
|
+
}
|
|
4416
|
+
if (i < indentation)
|
|
4417
|
+
indentation = i;
|
|
4418
|
+
if (indentation === 0)
|
|
4419
|
+
return 0;
|
|
4420
|
+
}
|
|
4421
|
+
return indentation === 0x7fffffff ? 0 : indentation;
|
|
4422
|
+
}
|
|
4423
|
+
/** The list holding `node` in its parent, for comparing sibling positions. */
|
|
4424
|
+
function getContainingNodeArray(node) {
|
|
4425
|
+
const parent = node.parent;
|
|
4426
|
+
if (parent === undefined)
|
|
4427
|
+
return undefined;
|
|
4428
|
+
switch (node.kind) {
|
|
4429
|
+
case 169 /* SyntaxKind.TypeParameter */:
|
|
4430
|
+
return getTypeParameters(parent);
|
|
4431
|
+
case 170 /* SyntaxKind.Parameter */:
|
|
4432
|
+
return getParameters(parent);
|
|
4433
|
+
case 205 /* SyntaxKind.TemplateLiteralTypeSpan */:
|
|
4434
|
+
return parent instanceof TemplateLiteralTypeNode ? parent.templateSpans : undefined;
|
|
4435
|
+
case 240 /* SyntaxKind.TemplateSpan */:
|
|
4436
|
+
return parent instanceof TemplateExpression ? parent.templateSpans : undefined;
|
|
4437
|
+
case 171 /* SyntaxKind.Decorator */:
|
|
4438
|
+
return getModifiers(parent);
|
|
4439
|
+
case 299 /* SyntaxKind.HeritageClause */:
|
|
4440
|
+
if (parent instanceof ClassDeclaration)
|
|
4441
|
+
return parent.heritageClauses;
|
|
4442
|
+
if (parent instanceof ClassExpression)
|
|
4443
|
+
return parent.heritageClauses;
|
|
4444
|
+
if (parent instanceof InterfaceDeclaration)
|
|
4445
|
+
return parent.heritageClauses;
|
|
4446
|
+
return undefined;
|
|
4447
|
+
}
|
|
4448
|
+
switch (parent.kind) {
|
|
4449
|
+
case 188 /* SyntaxKind.TypeLiteral */:
|
|
4450
|
+
case 265 /* SyntaxKind.InterfaceDeclaration */:
|
|
4451
|
+
case 264 /* SyntaxKind.ClassDeclaration */:
|
|
4452
|
+
case 232 /* SyntaxKind.ClassExpression */:
|
|
4453
|
+
case 267 /* SyntaxKind.EnumDeclaration */:
|
|
4454
|
+
if (parent instanceof TypeLiteralNode)
|
|
4455
|
+
return parent.members;
|
|
4456
|
+
if (parent instanceof InterfaceDeclaration)
|
|
4457
|
+
return parent.members;
|
|
4458
|
+
if (parent instanceof ClassDeclaration)
|
|
4459
|
+
return parent.members;
|
|
4460
|
+
if (parent instanceof ClassExpression)
|
|
4461
|
+
return parent.members;
|
|
4462
|
+
if (parent instanceof EnumDeclaration)
|
|
4463
|
+
return parent.members;
|
|
4464
|
+
break;
|
|
4465
|
+
case 193 /* SyntaxKind.UnionType */:
|
|
4466
|
+
if (parent instanceof UnionTypeNode)
|
|
4467
|
+
return parent.types;
|
|
4468
|
+
break;
|
|
4469
|
+
case 194 /* SyntaxKind.IntersectionType */:
|
|
4470
|
+
if (parent instanceof IntersectionTypeNode)
|
|
4471
|
+
return parent.types;
|
|
4472
|
+
break;
|
|
4473
|
+
case 210 /* SyntaxKind.ArrayLiteralExpression */:
|
|
4474
|
+
case 190 /* SyntaxKind.TupleType */:
|
|
4475
|
+
case 276 /* SyntaxKind.NamedImports */:
|
|
4476
|
+
case 280 /* SyntaxKind.NamedExports */:
|
|
4477
|
+
return getElements(parent);
|
|
4478
|
+
case 211 /* SyntaxKind.ObjectLiteralExpression */:
|
|
4479
|
+
case 293 /* SyntaxKind.JsxAttributes */:
|
|
4480
|
+
return getProperties(parent);
|
|
4481
|
+
case 214 /* SyntaxKind.CallExpression */:
|
|
4482
|
+
case 215 /* SyntaxKind.NewExpression */:
|
|
4483
|
+
if (isTypeNodeKind(node.kind))
|
|
4484
|
+
return getTypeArguments(parent);
|
|
4485
|
+
if (parent instanceof CallExpression && node !== parent.expression)
|
|
4486
|
+
return parent.arguments;
|
|
4487
|
+
if (parent instanceof NewExpression && node !== parent.expression)
|
|
4488
|
+
return parent.arguments;
|
|
4489
|
+
break;
|
|
4490
|
+
case 285 /* SyntaxKind.JsxElement */:
|
|
4491
|
+
if (parent instanceof JsxElement)
|
|
4492
|
+
return parent.children;
|
|
4493
|
+
break;
|
|
4494
|
+
case 289 /* SyntaxKind.JsxFragment */:
|
|
4495
|
+
if (parent instanceof JsxFragment)
|
|
4496
|
+
return parent.children;
|
|
4497
|
+
break;
|
|
4498
|
+
case 287 /* SyntaxKind.JsxOpeningElement */:
|
|
4499
|
+
case 286 /* SyntaxKind.JsxSelfClosingElement */:
|
|
4500
|
+
if (isTypeNodeKind(node.kind))
|
|
4501
|
+
return getTypeArguments(parent);
|
|
4502
|
+
break;
|
|
4503
|
+
case 242 /* SyntaxKind.Block */:
|
|
4504
|
+
case 269 /* SyntaxKind.ModuleBlock */:
|
|
4505
|
+
case 297 /* SyntaxKind.CaseClause */:
|
|
4506
|
+
case 298 /* SyntaxKind.DefaultClause */:
|
|
4507
|
+
case 307 /* SyntaxKind.SourceFile */:
|
|
4508
|
+
return getStatements(parent);
|
|
4509
|
+
case 270 /* SyntaxKind.CaseBlock */:
|
|
4510
|
+
if (parent instanceof CaseBlock)
|
|
4511
|
+
return parent.clauses;
|
|
4512
|
+
break;
|
|
4513
|
+
}
|
|
4514
|
+
if (isModifier(node))
|
|
4515
|
+
return getModifiers(parent);
|
|
4516
|
+
return undefined;
|
|
4517
|
+
}
|