/; let autoValue = 0; let previous; for (const member of node.members) { const result = computeEnumMemberValue(member, autoValue, previous); getNodeLinks(member).enumMemberValue = result; autoValue = typeof result.value === "number" ? result.value + 1 : void 0; previous = member; } } } function computeEnumMemberValue(member, autoValue, previous) { if (isComputedNonLiteralName(member.name)) { error(member.name, Diagnostics.Computed_property_names_are_not_allowed_in_enums); } else if (isBigIntLiteral(member.name)) { error(member.name, Diagnostics.An_enum_member_cannot_have_a_numeric_name); } else { const text = getTextOfPropertyName(member.name); if (isNumericLiteralName(text) && !isInfinityOrNaNString(text)) { error(member.name, Diagnostics.An_enum_member_cannot_have_a_numeric_name); } } if (member.initializer) { return computeConstantEnumMemberValue(member); } if (member.parent.flags & 33554432 /* Ambient */ && !isEnumConst(member.parent)) { return evaluatorResult( /*value*/ void 0 ); } if (autoValue === void 0) { error(member.name, Diagnostics.Enum_member_must_have_initializer); return evaluatorResult( /*value*/ void 0 ); } if (getIsolatedModules(compilerOptions) && (previous == null ? void 0 : previous.initializer)) { const prevValue = getEnumMemberValue(previous); if (!(typeof prevValue.value === "number" && !prevValue.resolvedOtherFiles)) { error( member.name, Diagnostics.Enum_member_following_a_non_literal_numeric_member_must_have_an_initializer_when_isolatedModules_is_enabled ); } } return evaluatorResult(autoValue); } function computeConstantEnumMemberValue(member) { const isConstEnum = isEnumConst(member.parent); const initializer = member.initializer; const result = evaluate(initializer, member); if (result.value !== void 0) { if (isConstEnum && typeof result.value === "number" && !isFinite(result.value)) { error( initializer, isNaN(result.value) ? Diagnostics.const_enum_member_initializer_was_evaluated_to_disallowed_value_NaN : Diagnostics.const_enum_member_initializer_was_evaluated_to_a_non_finite_value ); } else if (getIsolatedModules(compilerOptions) && typeof result.value === "string" && !result.isSyntacticallyString) { error( initializer, Diagnostics._0_has_a_string_type_but_must_have_syntactically_recognizable_string_syntax_when_isolatedModules_is_enabled, `${idText(member.parent.name)}.${getTextOfPropertyName(member.name)}` ); } } else if (isConstEnum) { error(initializer, Diagnostics.const_enum_member_initializers_must_be_constant_expressions); } else if (member.parent.flags & 33554432 /* Ambient */) { error(initializer, Diagnostics.In_ambient_enum_declarations_member_initializer_must_be_constant_expression); } else { checkTypeAssignableTo(checkExpression(initializer), numberType, initializer, Diagnostics.Type_0_is_not_assignable_to_type_1_as_required_for_computed_enum_member_values); } return result; } function evaluateEntityNameExpression(expr, location) { const symbol = resolveEntityName( expr, 111551 /* Value */, /*ignoreErrors*/ true ); if (!symbol) return evaluatorResult( /*value*/ void 0 ); if (expr.kind === 80 /* Identifier */) { const identifier = expr; if (isInfinityOrNaNString(identifier.escapedText) && symbol === getGlobalSymbol( identifier.escapedText, 111551 /* Value */, /*diagnostic*/ void 0 )) { return evaluatorResult( +identifier.escapedText, /*isSyntacticallyString*/ false ); } } if (symbol.flags & 8 /* EnumMember */) { return location ? evaluateEnumMember(expr, symbol, location) : getEnumMemberValue(symbol.valueDeclaration); } if (isConstantVariable(symbol)) { const declaration = symbol.valueDeclaration; if (declaration && isVariableDeclaration(declaration) && !declaration.type && declaration.initializer && (!location || declaration !== location && isBlockScopedNameDeclaredBeforeUse(declaration, location))) { const result = evaluate(declaration.initializer, declaration); if (location && getSourceFileOfNode(location) !== getSourceFileOfNode(declaration)) { return evaluatorResult( result.value, /*isSyntacticallyString*/ false, /*resolvedOtherFiles*/ true, /*hasExternalReferences*/ true ); } return evaluatorResult( result.value, result.isSyntacticallyString, result.resolvedOtherFiles, /*hasExternalReferences*/ true ); } } return evaluatorResult( /*value*/ void 0 ); } function evaluateElementAccessExpression(expr, location) { const root = expr.expression; if (isEntityNameExpression(root) && isStringLiteralLike(expr.argumentExpression)) { const rootSymbol = resolveEntityName( root, 111551 /* Value */, /*ignoreErrors*/ true ); if (rootSymbol && rootSymbol.flags & 384 /* Enum */) { const name = escapeLeadingUnderscores(expr.argumentExpression.text); const member = rootSymbol.exports.get(name); if (member) { Debug.assert(getSourceFileOfNode(member.valueDeclaration) === getSourceFileOfNode(rootSymbol.valueDeclaration)); return location ? evaluateEnumMember(expr, member, location) : getEnumMemberValue(member.valueDeclaration); } } } return evaluatorResult( /*value*/ void 0 ); } function evaluateEnumMember(expr, symbol, location) { const declaration = symbol.valueDeclaration; if (!declaration || declaration === location) { error(expr, Diagnostics.Property_0_is_used_before_being_assigned, symbolToString(symbol)); return evaluatorResult( /*value*/ void 0 ); } if (!isBlockScopedNameDeclaredBeforeUse(declaration, location)) { error(expr, Diagnostics.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums); return evaluatorResult( /*value*/ 0 ); } const value = getEnumMemberValue(declaration); if (location.parent !== declaration.parent) { return evaluatorResult( value.value, value.isSyntacticallyString, value.resolvedOtherFiles, /*hasExternalReferences*/ true ); } return value; } function checkEnumDeclaration(node) { addLazyDiagnostic(() => checkEnumDeclarationWorker(node)); } function checkEnumDeclarationWorker(node) { checkGrammarModifiers(node); checkCollisionsForDeclarationName(node, node.name); checkExportsOnMergedDeclarations(node); node.members.forEach(checkSourceElement); if (compilerOptions.erasableSyntaxOnly && !(node.flags & 33554432 /* Ambient */)) { error(node, Diagnostics.This_syntax_is_not_allowed_when_erasableSyntaxOnly_is_enabled); } computeEnumMemberValues(node); const enumSymbol = getSymbolOfDeclaration(node); const firstDeclaration = getDeclarationOfKind(enumSymbol, node.kind); if (node === firstDeclaration) { if (enumSymbol.declarations && enumSymbol.declarations.length > 1) { const enumIsConst = isEnumConst(node); forEach(enumSymbol.declarations, (decl) => { if (isEnumDeclaration(decl) && isEnumConst(decl) !== enumIsConst) { error(getNameOfDeclaration(decl), Diagnostics.Enum_declarations_must_all_be_const_or_non_const); } }); } let seenEnumMissingInitialInitializer = false; forEach(enumSymbol.declarations, (declaration) => { if (declaration.kind !== 267 /* EnumDeclaration */) { return false; } const enumDeclaration = declaration; if (!enumDeclaration.members.length) { return false; } const firstEnumMember = enumDeclaration.members[0]; if (!firstEnumMember.initializer) { if (seenEnumMissingInitialInitializer) { error(firstEnumMember.name, Diagnostics.In_an_enum_with_multiple_declarations_only_one_declaration_can_omit_an_initializer_for_its_first_enum_element); } else { seenEnumMissingInitialInitializer = true; } } }); } } function checkEnumMember(node) { if (isPrivateIdentifier(node.name)) { error(node, Diagnostics.An_enum_member_cannot_be_named_with_a_private_identifier); } if (node.initializer) { checkExpression(node.initializer); } } function getFirstNonAmbientClassOrFunctionDeclaration(symbol) { const declarations = symbol.declarations; if (declarations) { for (const declaration of declarations) { if ((declaration.kind === 264 /* ClassDeclaration */ || declaration.kind === 263 /* FunctionDeclaration */ && nodeIsPresent(declaration.body)) && !(declaration.flags & 33554432 /* Ambient */)) { return declaration; } } } return void 0; } function inSameLexicalScope(node1, node2) { const container1 = getEnclosingBlockScopeContainer(node1); const container2 = getEnclosingBlockScopeContainer(node2); if (isGlobalSourceFile(container1)) { return isGlobalSourceFile(container2); } else if (isGlobalSourceFile(container2)) { return false; } else { return container1 === container2; } } function checkModuleDeclaration(node) { if (node.body) { checkSourceElement(node.body); if (!isGlobalScopeAugmentation(node)) { registerForUnusedIdentifiersCheck(node); } } addLazyDiagnostic(checkModuleDeclarationDiagnostics); function checkModuleDeclarationDiagnostics() { var _a, _b; const isGlobalAugmentation = isGlobalScopeAugmentation(node); const inAmbientContext = node.flags & 33554432 /* Ambient */; if (isGlobalAugmentation && !inAmbientContext) { error(node.name, Diagnostics.Augmentations_for_the_global_scope_should_have_declare_modifier_unless_they_appear_in_already_ambient_context); } const isAmbientExternalModule = isAmbientModule(node); const contextErrorMessage = isAmbientExternalModule ? Diagnostics.An_ambient_module_declaration_is_only_allowed_at_the_top_level_in_a_file : Diagnostics.A_namespace_declaration_is_only_allowed_at_the_top_level_of_a_namespace_or_module; if (checkGrammarModuleElementContext(node, contextErrorMessage)) { return; } if (!checkGrammarModifiers(node)) { if (!inAmbientContext && node.name.kind === 11 /* StringLiteral */) { grammarErrorOnNode(node.name, Diagnostics.Only_ambient_modules_can_use_quoted_names); } } if (isIdentifier(node.name)) { checkCollisionsForDeclarationName(node, node.name); if (!(node.flags & (32 /* Namespace */ | 2048 /* GlobalAugmentation */))) { const sourceFile = getSourceFileOfNode(node); const pos = getNonModifierTokenPosOfNode(node); const span = getSpanOfTokenAtPosition(sourceFile, pos); suggestionDiagnostics.add( createFileDiagnostic(sourceFile, span.start, span.length, Diagnostics.A_namespace_declaration_should_not_be_declared_using_the_module_keyword_Please_use_the_namespace_keyword_instead) ); } } checkExportsOnMergedDeclarations(node); const symbol = getSymbolOfDeclaration(node); if (symbol.flags & 512 /* ValueModule */ && !inAmbientContext && isInstantiatedModule(node, shouldPreserveConstEnums(compilerOptions))) { if (compilerOptions.erasableSyntaxOnly) { error(node.name, Diagnostics.This_syntax_is_not_allowed_when_erasableSyntaxOnly_is_enabled); } if (getIsolatedModules(compilerOptions) && !getSourceFileOfNode(node).externalModuleIndicator) { error(node.name, Diagnostics.Namespaces_are_not_allowed_in_global_script_files_when_0_is_enabled_If_this_file_is_not_intended_to_be_a_global_script_set_moduleDetection_to_force_or_add_an_empty_export_statement, isolatedModulesLikeFlagName); } if (((_a = symbol.declarations) == null ? void 0 : _a.length) > 1) { const firstNonAmbientClassOrFunc = getFirstNonAmbientClassOrFunctionDeclaration(symbol); if (firstNonAmbientClassOrFunc) { if (getSourceFileOfNode(node) !== getSourceFileOfNode(firstNonAmbientClassOrFunc)) { error(node.name, Diagnostics.A_namespace_declaration_cannot_be_in_a_different_file_from_a_class_or_function_with_which_it_is_merged); } else if (node.pos < firstNonAmbientClassOrFunc.pos) { error(node.name, Diagnostics.A_namespace_declaration_cannot_be_located_prior_to_a_class_or_function_with_which_it_is_merged); } } const mergedClass = getDeclarationOfKind(symbol, 264 /* ClassDeclaration */); if (mergedClass && inSameLexicalScope(node, mergedClass)) { getNodeLinks(node).flags |= 2048 /* LexicalModuleMergesWithClass */; } } if (compilerOptions.verbatimModuleSyntax && node.parent.kind === 308 /* SourceFile */ && host.getEmitModuleFormatOfFile(node.parent) === 1 /* CommonJS */) { const exportModifier = (_b = node.modifiers) == null ? void 0 : _b.find((m) => m.kind === 95 /* ExportKeyword */); if (exportModifier) { error(exportModifier, Diagnostics.A_top_level_export_modifier_cannot_be_used_on_value_declarations_in_a_CommonJS_module_when_verbatimModuleSyntax_is_enabled); } } } if (isAmbientExternalModule) { if (isExternalModuleAugmentation(node)) { const checkBody = isGlobalAugmentation || getSymbolOfDeclaration(node).flags & 33554432 /* Transient */; if (checkBody && node.body) { for (const statement of node.body.statements) { checkModuleAugmentationElement(statement, isGlobalAugmentation); } } } else if (isGlobalSourceFile(node.parent)) { if (isGlobalAugmentation) { error(node.name, Diagnostics.Augmentations_for_the_global_scope_can_only_be_directly_nested_in_external_modules_or_ambient_module_declarations); } else if (isExternalModuleNameRelative(getTextOfIdentifierOrLiteral(node.name))) { error(node.name, Diagnostics.Ambient_module_declaration_cannot_specify_relative_module_name); } } else { if (isGlobalAugmentation) { error(node.name, Diagnostics.Augmentations_for_the_global_scope_can_only_be_directly_nested_in_external_modules_or_ambient_module_declarations); } else { error(node.name, Diagnostics.Ambient_modules_cannot_be_nested_in_other_modules_or_namespaces); } } } } } function checkModuleAugmentationElement(node, isGlobalAugmentation) { switch (node.kind) { case 244 /* VariableStatement */: for (const decl of node.declarationList.declarations) { checkModuleAugmentationElement(decl, isGlobalAugmentation); } break; case 278 /* ExportAssignment */: case 279 /* ExportDeclaration */: grammarErrorOnFirstToken(node, Diagnostics.Exports_and_export_assignments_are_not_permitted_in_module_augmentations); break; case 272 /* ImportEqualsDeclaration */: if (isInternalModuleImportEqualsDeclaration(node)) break; // falls through case 273 /* ImportDeclaration */: grammarErrorOnFirstToken(node, Diagnostics.Imports_are_not_permitted_in_module_augmentations_Consider_moving_them_to_the_enclosing_external_module); break; case 209 /* BindingElement */: case 261 /* VariableDeclaration */: const name = node.name; if (isBindingPattern(name)) { for (const el of name.elements) { checkModuleAugmentationElement(el, isGlobalAugmentation); } break; } // falls through case 264 /* ClassDeclaration */: case 267 /* EnumDeclaration */: case 263 /* FunctionDeclaration */: case 265 /* InterfaceDeclaration */: case 268 /* ModuleDeclaration */: case 266 /* TypeAliasDeclaration */: if (isGlobalAugmentation) { return; } break; } } function getFirstNonModuleExportsIdentifier(node) { switch (node.kind) { case 80 /* Identifier */: return node; case 167 /* QualifiedName */: do { node = node.left; } while (node.kind !== 80 /* Identifier */); return node; case 212 /* PropertyAccessExpression */: do { if (isModuleExportsAccessExpression(node.expression) && !isPrivateIdentifier(node.name)) { return node.name; } node = node.expression; } while (node.kind !== 80 /* Identifier */); return node; } } function checkExternalImportOrExportDeclaration(node) { const moduleName = getExternalModuleName(node); if (!moduleName || nodeIsMissing(moduleName)) { return false; } if (!isStringLiteral(moduleName)) { error(moduleName, Diagnostics.String_literal_expected); return false; } const inAmbientExternalModule = node.parent.kind === 269 /* ModuleBlock */ && isAmbientModule(node.parent.parent); if (node.parent.kind !== 308 /* SourceFile */ && !inAmbientExternalModule) { error( moduleName, node.kind === 279 /* ExportDeclaration */ ? Diagnostics.Export_declarations_are_not_permitted_in_a_namespace : Diagnostics.Import_declarations_in_a_namespace_cannot_reference_a_module ); return false; } if (inAmbientExternalModule && isExternalModuleNameRelative(moduleName.text)) { if (!isTopLevelInExternalModuleAugmentation(node)) { error(node, Diagnostics.Import_or_export_declaration_in_an_ambient_module_declaration_cannot_reference_module_through_relative_module_name); return false; } } if (!isImportEqualsDeclaration(node) && node.attributes) { const diagnostic = node.attributes.token === 118 /* WithKeyword */ ? Diagnostics.Import_attribute_values_must_be_string_literal_expressions : Diagnostics.Import_assertion_values_must_be_string_literal_expressions; let hasError = false; for (const attr of node.attributes.elements) { if (!isStringLiteral(attr.value)) { hasError = true; error(attr.value, diagnostic); } } return !hasError; } return true; } function checkModuleExportName(name, allowStringLiteral = true) { if (name === void 0 || name.kind !== 11 /* StringLiteral */) { return; } if (!allowStringLiteral) { grammarErrorOnNode(name, Diagnostics.Identifier_expected); } else if (moduleKind === 5 /* ES2015 */ || moduleKind === 6 /* ES2020 */) { grammarErrorOnNode(name, Diagnostics.String_literal_import_and_export_names_are_not_supported_when_the_module_flag_is_set_to_es2015_or_es2020); } } function checkAliasSymbol(node) { var _a, _b, _c, _d, _e; let symbol = getSymbolOfDeclaration(node); const target = resolveAlias(symbol); if (target !== unknownSymbol) { symbol = getMergedSymbol(symbol.exportSymbol || symbol); if (isInJSFile(node) && !(target.flags & 111551 /* Value */) && !isTypeOnlyImportOrExportDeclaration(node)) { const errorNode = isImportOrExportSpecifier(node) ? node.propertyName || node.name : isNamedDeclaration(node) ? node.name : node; Debug.assert(node.kind !== 281 /* NamespaceExport */); if (node.kind === 282 /* ExportSpecifier */) { const diag2 = error(errorNode, Diagnostics.Types_cannot_appear_in_export_declarations_in_JavaScript_files); const alreadyExportedSymbol = (_b = (_a = getSourceFileOfNode(node).symbol) == null ? void 0 : _a.exports) == null ? void 0 : _b.get(moduleExportNameTextEscaped(node.propertyName || node.name)); if (alreadyExportedSymbol === target) { const exportingDeclaration = (_c = alreadyExportedSymbol.declarations) == null ? void 0 : _c.find(isJSDocNode); if (exportingDeclaration) { addRelatedInfo( diag2, createDiagnosticForNode( exportingDeclaration, Diagnostics._0_is_automatically_exported_here, unescapeLeadingUnderscores(alreadyExportedSymbol.escapedName) ) ); } } } else { Debug.assert(node.kind !== 261 /* VariableDeclaration */); const importDeclaration = findAncestor(node, or(isImportDeclaration, isImportEqualsDeclaration)); const moduleSpecifier = (importDeclaration && ((_d = tryGetModuleSpecifierFromDeclaration(importDeclaration)) == null ? void 0 : _d.text)) ?? "..."; const importedIdentifier = unescapeLeadingUnderscores(isIdentifier(errorNode) ? errorNode.escapedText : symbol.escapedName); error( errorNode, Diagnostics._0_is_a_type_and_cannot_be_imported_in_JavaScript_files_Use_1_in_a_JSDoc_type_annotation, importedIdentifier, `import("${moduleSpecifier}").${importedIdentifier}` ); } return; } const targetFlags = getSymbolFlags(target); const excludedMeanings = (symbol.flags & (111551 /* Value */ | 1048576 /* ExportValue */) ? 111551 /* Value */ : 0) | (symbol.flags & 788968 /* Type */ ? 788968 /* Type */ : 0) | (symbol.flags & 1920 /* Namespace */ ? 1920 /* Namespace */ : 0); if (targetFlags & excludedMeanings) { const message = node.kind === 282 /* ExportSpecifier */ ? Diagnostics.Export_declaration_conflicts_with_exported_declaration_of_0 : Diagnostics.Import_declaration_conflicts_with_local_declaration_of_0; error(node, message, symbolToString(symbol)); } else if (node.kind !== 282 /* ExportSpecifier */) { const appearsValueyToTranspiler = compilerOptions.isolatedModules && !findAncestor(node, isTypeOnlyImportOrExportDeclaration); if (appearsValueyToTranspiler && symbol.flags & (111551 /* Value */ | 1048576 /* ExportValue */)) { error( node, Diagnostics.Import_0_conflicts_with_local_value_so_must_be_declared_with_a_type_only_import_when_isolatedModules_is_enabled, symbolToString(symbol), isolatedModulesLikeFlagName ); } } if (getIsolatedModules(compilerOptions) && !isTypeOnlyImportOrExportDeclaration(node) && !(node.flags & 33554432 /* Ambient */)) { const typeOnlyAlias = getTypeOnlyAliasDeclaration(symbol); const isType = !(targetFlags & 111551 /* Value */); if (isType || typeOnlyAlias) { switch (node.kind) { case 274 /* ImportClause */: case 277 /* ImportSpecifier */: case 272 /* ImportEqualsDeclaration */: { if (compilerOptions.verbatimModuleSyntax) { Debug.assertIsDefined(node.name, "An ImportClause with a symbol should have a name"); const message = compilerOptions.verbatimModuleSyntax && isInternalModuleImportEqualsDeclaration(node) ? Diagnostics.An_import_alias_cannot_resolve_to_a_type_or_type_only_declaration_when_verbatimModuleSyntax_is_enabled : isType ? Diagnostics._0_is_a_type_and_must_be_imported_using_a_type_only_import_when_verbatimModuleSyntax_is_enabled : Diagnostics._0_resolves_to_a_type_only_declaration_and_must_be_imported_using_a_type_only_import_when_verbatimModuleSyntax_is_enabled; const name = moduleExportNameTextUnescaped(node.kind === 277 /* ImportSpecifier */ ? node.propertyName || node.name : node.name); addTypeOnlyDeclarationRelatedInfo( error(node, message, name), isType ? void 0 : typeOnlyAlias, name ); } if (isType && node.kind === 272 /* ImportEqualsDeclaration */ && hasEffectiveModifier(node, 32 /* Export */)) { error(node, Diagnostics.Cannot_use_export_import_on_a_type_or_type_only_namespace_when_0_is_enabled, isolatedModulesLikeFlagName); } break; } case 282 /* ExportSpecifier */: { if (compilerOptions.verbatimModuleSyntax || getSourceFileOfNode(typeOnlyAlias) !== getSourceFileOfNode(node)) { const name = moduleExportNameTextUnescaped(node.propertyName || node.name); const diagnostic = isType ? error(node, Diagnostics.Re_exporting_a_type_when_0_is_enabled_requires_using_export_type, isolatedModulesLikeFlagName) : error(node, Diagnostics._0_resolves_to_a_type_only_declaration_and_must_be_re_exported_using_a_type_only_re_export_when_1_is_enabled, name, isolatedModulesLikeFlagName); addTypeOnlyDeclarationRelatedInfo(diagnostic, isType ? void 0 : typeOnlyAlias, name); break; } } } } if (compilerOptions.verbatimModuleSyntax && node.kind !== 272 /* ImportEqualsDeclaration */ && !isInJSFile(node) && host.getEmitModuleFormatOfFile(getSourceFileOfNode(node)) === 1 /* CommonJS */) { error(node, getVerbatimModuleSyntaxErrorMessage(node)); } else if (moduleKind === 200 /* Preserve */ && node.kind !== 272 /* ImportEqualsDeclaration */ && node.kind !== 261 /* VariableDeclaration */ && host.getEmitModuleFormatOfFile(getSourceFileOfNode(node)) === 1 /* CommonJS */) { error(node, Diagnostics.ECMAScript_module_syntax_is_not_allowed_in_a_CommonJS_module_when_module_is_set_to_preserve); } if (compilerOptions.verbatimModuleSyntax && !isTypeOnlyImportOrExportDeclaration(node) && !(node.flags & 33554432 /* Ambient */) && targetFlags & 128 /* ConstEnum */) { const constEnumDeclaration = target.valueDeclaration; const redirect = (_e = host.getRedirectFromOutput(getSourceFileOfNode(constEnumDeclaration).resolvedPath)) == null ? void 0 : _e.resolvedRef; if (constEnumDeclaration.flags & 33554432 /* Ambient */ && (!redirect || !shouldPreserveConstEnums(redirect.commandLine.options))) { error(node, Diagnostics.Cannot_access_ambient_const_enums_when_0_is_enabled, isolatedModulesLikeFlagName); } } } if (isImportSpecifier(node)) { const targetSymbol = resolveAliasWithDeprecationCheck(symbol, node); if (isDeprecatedSymbol(targetSymbol) && targetSymbol.declarations) { addDeprecatedSuggestion(node, targetSymbol.declarations, targetSymbol.escapedName); } } } } function resolveAliasWithDeprecationCheck(symbol, location) { if (!(symbol.flags & 2097152 /* Alias */) || isDeprecatedSymbol(symbol) || !getDeclarationOfAliasSymbol(symbol)) { return symbol; } const targetSymbol = resolveAlias(symbol); if (targetSymbol === unknownSymbol) return targetSymbol; while (symbol.flags & 2097152 /* Alias */) { const target = getImmediateAliasedSymbol(symbol); if (target) { if (target === targetSymbol) break; if (target.declarations && length(target.declarations)) { if (isDeprecatedSymbol(target)) { addDeprecatedSuggestion(location, target.declarations, target.escapedName); break; } else { if (symbol === targetSymbol) break; symbol = target; } } } else { break; } } return targetSymbol; } function checkImportBinding(node) { checkCollisionsForDeclarationName(node, node.name); checkAliasSymbol(node); if (node.kind === 277 /* ImportSpecifier */) { checkModuleExportName(node.propertyName); if (moduleExportNameIsDefault(node.propertyName || node.name) && getESModuleInterop(compilerOptions) && host.getEmitModuleFormatOfFile(getSourceFileOfNode(node)) < 4 /* System */) { checkExternalEmitHelpers(node, 131072 /* ImportDefault */); } } } function checkImportAttributes(declaration) { var _a; const node = declaration.attributes; if (node) { const importAttributesType = getGlobalImportAttributesType( /*reportErrors*/ true ); if (importAttributesType !== emptyObjectType) { checkTypeAssignableTo(getTypeFromImportAttributes(node), getNullableType(importAttributesType, 32768 /* Undefined */), node); } const validForTypeAttributes = isExclusivelyTypeOnlyImportOrExport(declaration); const override = getResolutionModeOverride(node, validForTypeAttributes ? grammarErrorOnNode : void 0); const isImportAttributes2 = declaration.attributes.token === 118 /* WithKeyword */; if (validForTypeAttributes && override) { return; } if (!moduleSupportsImportAttributes(moduleKind)) { return grammarErrorOnNode( node, isImportAttributes2 ? Diagnostics.Import_attributes_are_only_supported_when_the_module_option_is_set_to_esnext_node18_node20_nodenext_or_preserve : Diagnostics.Import_assertions_are_only_supported_when_the_module_option_is_set_to_esnext_node18_node20_nodenext_or_preserve ); } if (102 /* Node20 */ <= moduleKind && moduleKind <= 199 /* NodeNext */ && !isImportAttributes2) { return grammarErrorOnFirstToken(node, Diagnostics.Import_assertions_have_been_replaced_by_import_attributes_Use_with_instead_of_assert); } if (declaration.moduleSpecifier && getEmitSyntaxForModuleSpecifierExpression(declaration.moduleSpecifier) === 1 /* CommonJS */) { return grammarErrorOnNode( node, isImportAttributes2 ? Diagnostics.Import_attributes_are_not_allowed_on_statements_that_compile_to_CommonJS_require_calls : Diagnostics.Import_assertions_are_not_allowed_on_statements_that_compile_to_CommonJS_require_calls ); } const isTypeOnly = isJSDocImportTag(declaration) || (isImportDeclaration(declaration) ? (_a = declaration.importClause) == null ? void 0 : _a.isTypeOnly : declaration.isTypeOnly); if (isTypeOnly) { return grammarErrorOnNode(node, isImportAttributes2 ? Diagnostics.Import_attributes_cannot_be_used_with_type_only_imports_or_exports : Diagnostics.Import_assertions_cannot_be_used_with_type_only_imports_or_exports); } if (override) { return grammarErrorOnNode(node, Diagnostics.resolution_mode_can_only_be_set_for_type_only_imports); } } } function checkImportAttribute(node) { return getRegularTypeOfLiteralType(checkExpressionCached(node.value)); } function checkImportDeclaration(node) { if (checkGrammarModuleElementContext(node, isInJSFile(node) ? Diagnostics.An_import_declaration_can_only_be_used_at_the_top_level_of_a_module : Diagnostics.An_import_declaration_can_only_be_used_at_the_top_level_of_a_namespace_or_module)) { return; } if (!checkGrammarModifiers(node) && node.modifiers) { grammarErrorOnFirstToken(node, Diagnostics.An_import_declaration_cannot_have_modifiers); } if (checkExternalImportOrExportDeclaration(node)) { let resolvedModule; const importClause = node.importClause; if (importClause && !checkGrammarImportClause(importClause)) { if (importClause.name) { checkImportBinding(importClause); } if (importClause.namedBindings) { if (importClause.namedBindings.kind === 275 /* NamespaceImport */) { checkImportBinding(importClause.namedBindings); if (host.getEmitModuleFormatOfFile(getSourceFileOfNode(node)) < 4 /* System */ && getESModuleInterop(compilerOptions)) { checkExternalEmitHelpers(node, 65536 /* ImportStar */); } } else { resolvedModule = resolveExternalModuleName(node, node.moduleSpecifier); if (resolvedModule) { forEach(importClause.namedBindings.elements, checkImportBinding); } } } if (!importClause.isTypeOnly && 101 /* Node18 */ <= moduleKind && moduleKind <= 199 /* NodeNext */ && isOnlyImportableAsDefault(node.moduleSpecifier, resolvedModule) && !hasTypeJsonImportAttribute(node)) { error(node.moduleSpecifier, Diagnostics.Importing_a_JSON_file_into_an_ECMAScript_module_requires_a_type_Colon_json_import_attribute_when_module_is_set_to_0, ModuleKind[moduleKind]); } } else if (noUncheckedSideEffectImports && !importClause) { void resolveExternalModuleName(node, node.moduleSpecifier); } } checkImportAttributes(node); } function hasTypeJsonImportAttribute(node) { return !!node.attributes && node.attributes.elements.some((attr) => { var _a; return getTextOfIdentifierOrLiteral(attr.name) === "type" && ((_a = tryCast(attr.value, isStringLiteralLike)) == null ? void 0 : _a.text) === "json"; }); } function checkImportEqualsDeclaration(node) { if (checkGrammarModuleElementContext(node, isInJSFile(node) ? Diagnostics.An_import_declaration_can_only_be_used_at_the_top_level_of_a_module : Diagnostics.An_import_declaration_can_only_be_used_at_the_top_level_of_a_namespace_or_module)) { return; } checkGrammarModifiers(node); if (compilerOptions.erasableSyntaxOnly && !(node.flags & 33554432 /* Ambient */)) { error(node, Diagnostics.This_syntax_is_not_allowed_when_erasableSyntaxOnly_is_enabled); } if (isInternalModuleImportEqualsDeclaration(node) || checkExternalImportOrExportDeclaration(node)) { checkImportBinding(node); markLinkedReferences(node, 6 /* ExportImportEquals */); if (node.moduleReference.kind !== 284 /* ExternalModuleReference */) { const target = resolveAlias(getSymbolOfDeclaration(node)); if (target !== unknownSymbol) { const targetFlags = getSymbolFlags(target); if (targetFlags & 111551 /* Value */) { const moduleName = getFirstIdentifier(node.moduleReference); if (!(resolveEntityName(moduleName, 111551 /* Value */ | 1920 /* Namespace */).flags & 1920 /* Namespace */)) { error(moduleName, Diagnostics.Module_0_is_hidden_by_a_local_declaration_with_the_same_name, declarationNameToString(moduleName)); } } if (targetFlags & 788968 /* Type */) { checkTypeNameIsReserved(node.name, Diagnostics.Import_name_cannot_be_0); } } if (node.isTypeOnly) { grammarErrorOnNode(node, Diagnostics.An_import_alias_cannot_use_import_type); } } else { if (5 /* ES2015 */ <= moduleKind && moduleKind <= 99 /* ESNext */ && !node.isTypeOnly && !(node.flags & 33554432 /* Ambient */)) { grammarErrorOnNode(node, Diagnostics.Import_assignment_cannot_be_used_when_targeting_ECMAScript_modules_Consider_using_import_Asterisk_as_ns_from_mod_import_a_from_mod_import_d_from_mod_or_another_module_format_instead); } } } } function checkExportDeclaration(node) { if (checkGrammarModuleElementContext(node, isInJSFile(node) ? Diagnostics.An_export_declaration_can_only_be_used_at_the_top_level_of_a_module : Diagnostics.An_export_declaration_can_only_be_used_at_the_top_level_of_a_namespace_or_module)) { return; } if (!checkGrammarModifiers(node) && hasSyntacticModifiers(node)) { grammarErrorOnFirstToken(node, Diagnostics.An_export_declaration_cannot_have_modifiers); } checkGrammarExportDeclaration(node); if (!node.moduleSpecifier || checkExternalImportOrExportDeclaration(node)) { if (node.exportClause && !isNamespaceExport(node.exportClause)) { forEach(node.exportClause.elements, checkExportSpecifier); const inAmbientExternalModule = node.parent.kind === 269 /* ModuleBlock */ && isAmbientModule(node.parent.parent); const inAmbientNamespaceDeclaration = !inAmbientExternalModule && node.parent.kind === 269 /* ModuleBlock */ && !node.moduleSpecifier && node.flags & 33554432 /* Ambient */; if (node.parent.kind !== 308 /* SourceFile */ && !inAmbientExternalModule && !inAmbientNamespaceDeclaration) { error(node, Diagnostics.Export_declarations_are_not_permitted_in_a_namespace); } } else { const moduleSymbol = resolveExternalModuleName(node, node.moduleSpecifier); if (moduleSymbol && hasExportAssignmentSymbol(moduleSymbol)) { error(node.moduleSpecifier, Diagnostics.Module_0_uses_export_and_cannot_be_used_with_export_Asterisk, symbolToString(moduleSymbol)); } else if (node.exportClause) { checkAliasSymbol(node.exportClause); checkModuleExportName(node.exportClause.name); } if (host.getEmitModuleFormatOfFile(getSourceFileOfNode(node)) < 4 /* System */) { if (node.exportClause) { if (getESModuleInterop(compilerOptions)) { checkExternalEmitHelpers(node, 65536 /* ImportStar */); } } else { checkExternalEmitHelpers(node, 32768 /* ExportStar */); } } } } checkImportAttributes(node); } function checkGrammarExportDeclaration(node) { var _a; if (node.isTypeOnly && ((_a = node.exportClause) == null ? void 0 : _a.kind) === 280 /* NamedExports */) { return checkGrammarNamedImportsOrExports(node.exportClause); } return false; } function checkGrammarModuleElementContext(node, errorMessage) { const isInAppropriateContext = node.parent.kind === 308 /* SourceFile */ || node.parent.kind === 269 /* ModuleBlock */ || node.parent.kind === 268 /* ModuleDeclaration */; if (!isInAppropriateContext) { grammarErrorOnFirstToken(node, errorMessage); } return !isInAppropriateContext; } function checkExportSpecifier(node) { checkAliasSymbol(node); const hasModuleSpecifier = node.parent.parent.moduleSpecifier !== void 0; checkModuleExportName(node.propertyName, hasModuleSpecifier); checkModuleExportName(node.name); if (getEmitDeclarations(compilerOptions)) { collectLinkedAliases( node.propertyName || node.name, /*setVisibility*/ true ); } if (!hasModuleSpecifier) { const exportedName = node.propertyName || node.name; if (exportedName.kind === 11 /* StringLiteral */) { return; } const symbol = resolveName( exportedName, exportedName.escapedText, 111551 /* Value */ | 788968 /* Type */ | 1920 /* Namespace */ | 2097152 /* Alias */, /*nameNotFoundMessage*/ void 0, /*isUse*/ true ); if (symbol && (symbol === undefinedSymbol || symbol === globalThisSymbol || symbol.declarations && isGlobalSourceFile(getDeclarationContainer(symbol.declarations[0])))) { error(exportedName, Diagnostics.Cannot_export_0_Only_local_declarations_can_be_exported_from_a_module, idText(exportedName)); } else { markLinkedReferences(node, 7 /* ExportSpecifier */); } } else { if (getESModuleInterop(compilerOptions) && host.getEmitModuleFormatOfFile(getSourceFileOfNode(node)) < 4 /* System */ && moduleExportNameIsDefault(node.propertyName || node.name)) { checkExternalEmitHelpers(node, 131072 /* ImportDefault */); } } } function checkExportAssignment(node) { const illegalContextMessage = node.isExportEquals ? Diagnostics.An_export_assignment_must_be_at_the_top_level_of_a_file_or_module_declaration : Diagnostics.A_default_export_must_be_at_the_top_level_of_a_file_or_module_declaration; if (checkGrammarModuleElementContext(node, illegalContextMessage)) { return; } if (compilerOptions.erasableSyntaxOnly && node.isExportEquals && !(node.flags & 33554432 /* Ambient */)) { error(node, Diagnostics.This_syntax_is_not_allowed_when_erasableSyntaxOnly_is_enabled); } const container = node.parent.kind === 308 /* SourceFile */ ? node.parent : node.parent.parent; if (container.kind === 268 /* ModuleDeclaration */ && !isAmbientModule(container)) { if (node.isExportEquals) { error(node, Diagnostics.An_export_assignment_cannot_be_used_in_a_namespace); } else { error(node, Diagnostics.A_default_export_can_only_be_used_in_an_ECMAScript_style_module); } return; } if (!checkGrammarModifiers(node) && hasEffectiveModifiers(node)) { grammarErrorOnFirstToken(node, Diagnostics.An_export_assignment_cannot_have_modifiers); } const typeAnnotationNode = getEffectiveTypeAnnotationNode(node); if (typeAnnotationNode) { checkTypeAssignableTo(checkExpressionCached(node.expression), getTypeFromTypeNode(typeAnnotationNode), node.expression); } const isIllegalExportDefaultInCJS = !node.isExportEquals && !(node.flags & 33554432 /* Ambient */) && compilerOptions.verbatimModuleSyntax && host.getEmitModuleFormatOfFile(getSourceFileOfNode(node)) === 1 /* CommonJS */; if (node.expression.kind === 80 /* Identifier */) { const id = node.expression; const sym = getExportSymbolOfValueSymbolIfExported(resolveEntityName( id, -1 /* All */, /*ignoreErrors*/ true, /*dontResolveAlias*/ true, node )); if (sym) { markLinkedReferences(node, 3 /* ExportAssignment */); const typeOnlyDeclaration = getTypeOnlyAliasDeclaration(sym, 111551 /* Value */); if (getSymbolFlags(sym) & 111551 /* Value */) { checkExpressionCached(id); if (!isIllegalExportDefaultInCJS && !(node.flags & 33554432 /* Ambient */) && compilerOptions.verbatimModuleSyntax && typeOnlyDeclaration) { error( id, node.isExportEquals ? Diagnostics.An_export_declaration_must_reference_a_real_value_when_verbatimModuleSyntax_is_enabled_but_0_resolves_to_a_type_only_declaration : Diagnostics.An_export_default_must_reference_a_real_value_when_verbatimModuleSyntax_is_enabled_but_0_resolves_to_a_type_only_declaration, idText(id) ); } } else if (!isIllegalExportDefaultInCJS && !(node.flags & 33554432 /* Ambient */) && compilerOptions.verbatimModuleSyntax) { error( id, node.isExportEquals ? Diagnostics.An_export_declaration_must_reference_a_value_when_verbatimModuleSyntax_is_enabled_but_0_only_refers_to_a_type : Diagnostics.An_export_default_must_reference_a_value_when_verbatimModuleSyntax_is_enabled_but_0_only_refers_to_a_type, idText(id) ); } if (!isIllegalExportDefaultInCJS && !(node.flags & 33554432 /* Ambient */) && getIsolatedModules(compilerOptions) && !(sym.flags & 111551 /* Value */)) { const nonLocalMeanings = getSymbolFlags( sym, /*excludeTypeOnlyMeanings*/ false, /*excludeLocalMeanings*/ true ); if (sym.flags & 2097152 /* Alias */ && nonLocalMeanings & 788968 /* Type */ && !(nonLocalMeanings & 111551 /* Value */) && (!typeOnlyDeclaration || getSourceFileOfNode(typeOnlyDeclaration) !== getSourceFileOfNode(node))) { error( id, node.isExportEquals ? Diagnostics._0_resolves_to_a_type_and_must_be_marked_type_only_in_this_file_before_re_exporting_when_1_is_enabled_Consider_using_import_type_where_0_is_imported : Diagnostics._0_resolves_to_a_type_and_must_be_marked_type_only_in_this_file_before_re_exporting_when_1_is_enabled_Consider_using_export_type_0_as_default, idText(id), isolatedModulesLikeFlagName ); } else if (typeOnlyDeclaration && getSourceFileOfNode(typeOnlyDeclaration) !== getSourceFileOfNode(node)) { addTypeOnlyDeclarationRelatedInfo( error( id, node.isExportEquals ? Diagnostics._0_resolves_to_a_type_only_declaration_and_must_be_marked_type_only_in_this_file_before_re_exporting_when_1_is_enabled_Consider_using_import_type_where_0_is_imported : Diagnostics._0_resolves_to_a_type_only_declaration_and_must_be_marked_type_only_in_this_file_before_re_exporting_when_1_is_enabled_Consider_using_export_type_0_as_default, idText(id), isolatedModulesLikeFlagName ), typeOnlyDeclaration, idText(id) ); } } } else { checkExpressionCached(id); } if (getEmitDeclarations(compilerOptions)) { collectLinkedAliases( id, /*setVisibility*/ true ); } } else { checkExpressionCached(node.expression); } if (isIllegalExportDefaultInCJS) { error(node, getVerbatimModuleSyntaxErrorMessage(node)); } checkExternalModuleExports(container); if (node.flags & 33554432 /* Ambient */ && !isEntityNameExpression(node.expression)) { grammarErrorOnNode(node.expression, Diagnostics.The_expression_of_an_export_assignment_must_be_an_identifier_or_qualified_name_in_an_ambient_context); } if (node.isExportEquals) { if (moduleKind >= 5 /* ES2015 */ && moduleKind !== 200 /* Preserve */ && (node.flags & 33554432 /* Ambient */ && host.getImpliedNodeFormatForEmit(getSourceFileOfNode(node)) === 99 /* ESNext */ || !(node.flags & 33554432 /* Ambient */) && host.getImpliedNodeFormatForEmit(getSourceFileOfNode(node)) !== 1 /* CommonJS */)) { grammarErrorOnNode(node, Diagnostics.Export_assignment_cannot_be_used_when_targeting_ECMAScript_modules_Consider_using_export_default_or_another_module_format_instead); } else if (moduleKind === 4 /* System */ && !(node.flags & 33554432 /* Ambient */)) { grammarErrorOnNode(node, Diagnostics.Export_assignment_is_not_supported_when_module_flag_is_system); } } } function hasExportedMembers(moduleSymbol) { return forEachEntry(moduleSymbol.exports, (_, id) => id !== "export="); } function checkExternalModuleExports(node) { const moduleSymbol = getSymbolOfDeclaration(node); const links = getSymbolLinks(moduleSymbol); if (!links.exportsChecked) { const exportEqualsSymbol = moduleSymbol.exports.get("export="); if (exportEqualsSymbol && hasExportedMembers(moduleSymbol)) { const declaration = getDeclarationOfAliasSymbol(exportEqualsSymbol) || exportEqualsSymbol.valueDeclaration; if (declaration && !isTopLevelInExternalModuleAugmentation(declaration) && !isInJSFile(declaration)) { error(declaration, Diagnostics.An_export_assignment_cannot_be_used_in_a_module_with_other_exported_elements); } } const exports2 = getExportsOfModule(moduleSymbol); if (exports2) { exports2.forEach(({ declarations, flags }, id) => { if (id === "__export") { return; } if (flags & (1920 /* Namespace */ | 384 /* Enum */)) { return; } const exportedDeclarationsCount = countWhere(declarations, and(isNotOverloadAndNotAccessor, not(isInterfaceDeclaration))); if (flags & 524288 /* TypeAlias */ && exportedDeclarationsCount <= 2) { return; } if (exportedDeclarationsCount > 1) { if (!isDuplicatedCommonJSExport(declarations)) { for (const declaration of declarations) { if (isNotOverload(declaration)) { diagnostics.add(createDiagnosticForNode(declaration, Diagnostics.Cannot_redeclare_exported_variable_0, unescapeLeadingUnderscores(id))); } } } } }); } links.exportsChecked = true; } } function isDuplicatedCommonJSExport(declarations) { return declarations && declarations.length > 1 && declarations.every((d) => isInJSFile(d) && isAccessExpression(d) && (isExportsIdentifier(d.expression) || isModuleExportsAccessExpression(d.expression))); } function checkSourceElement(node) { if (node) { const saveCurrentNode = currentNode; currentNode = node; instantiationCount = 0; checkSourceElementWorker(node); currentNode = saveCurrentNode; } } function checkSourceElementWorker(node) { if (getNodeCheckFlags(node) & 8388608 /* PartiallyTypeChecked */) { return; } if (canHaveJSDoc(node)) { forEach(node.jsDoc, ({ comment, tags }) => { checkJSDocCommentWorker(comment); forEach(tags, (tag) => { checkJSDocCommentWorker(tag.comment); if (isInJSFile(node)) { checkSourceElement(tag); } }); }); } const kind = node.kind; if (cancellationToken) { switch (kind) { case 268 /* ModuleDeclaration */: case 264 /* ClassDeclaration */: case 265 /* InterfaceDeclaration */: case 263 /* FunctionDeclaration */: cancellationToken.throwIfCancellationRequested(); } } if (kind >= 244 /* FirstStatement */ && kind <= 260 /* LastStatement */ && canHaveFlowNode(node) && node.flowNode && !isReachableFlowNode(node.flowNode)) { errorOrSuggestion(compilerOptions.allowUnreachableCode === false, node, Diagnostics.Unreachable_code_detected); } switch (kind) { case 169 /* TypeParameter */: return checkTypeParameter(node); case 170 /* Parameter */: return checkParameter(node); case 173 /* PropertyDeclaration */: return checkPropertyDeclaration(node); case 172 /* PropertySignature */: return checkPropertySignature(node); case 186 /* ConstructorType */: case 185 /* FunctionType */: case 180 /* CallSignature */: case 181 /* ConstructSignature */: case 182 /* IndexSignature */: return checkSignatureDeclaration(node); case 175 /* MethodDeclaration */: case 174 /* MethodSignature */: return checkMethodDeclaration(node); case 176 /* ClassStaticBlockDeclaration */: return checkClassStaticBlockDeclaration(node); case 177 /* Constructor */: return checkConstructorDeclaration(node); case 178 /* GetAccessor */: case 179 /* SetAccessor */: return checkAccessorDeclaration(node); case 184 /* TypeReference */: return checkTypeReferenceNode(node); case 183 /* TypePredicate */: return checkTypePredicate(node); case 187 /* TypeQuery */: return checkTypeQuery(node); case 188 /* TypeLiteral */: return checkTypeLiteral(node); case 189 /* ArrayType */: return checkArrayType(node); case 190 /* TupleType */: return checkTupleType(node); case 193 /* UnionType */: case 194 /* IntersectionType */: return checkUnionOrIntersectionType(node); case 197 /* ParenthesizedType */: case 191 /* OptionalType */: case 192 /* RestType */: return checkSourceElement(node.type); case 198 /* ThisType */: return checkThisType(node); case 199 /* TypeOperator */: return checkTypeOperator(node); case 195 /* ConditionalType */: return checkConditionalType(node); case 196 /* InferType */: return checkInferType(node); case 204 /* TemplateLiteralType */: return checkTemplateLiteralType(node); case 206 /* ImportType */: return checkImportType(node); case 203 /* NamedTupleMember */: return checkNamedTupleMember(node); case 329 /* JSDocAugmentsTag */: return checkJSDocAugmentsTag(node); case 330 /* JSDocImplementsTag */: return checkJSDocImplementsTag(node); case 347 /* JSDocTypedefTag */: case 339 /* JSDocCallbackTag */: case 341 /* JSDocEnumTag */: return checkJSDocTypeAliasTag(node); case 346 /* JSDocTemplateTag */: return checkJSDocTemplateTag(node); case 345 /* JSDocTypeTag */: return checkJSDocTypeTag(node); case 325 /* JSDocLink */: case 326 /* JSDocLinkCode */: case 327 /* JSDocLinkPlain */: return checkJSDocLinkLikeTag(node); case 342 /* JSDocParameterTag */: return checkJSDocParameterTag(node); case 349 /* JSDocPropertyTag */: return checkJSDocPropertyTag(node); case 318 /* JSDocFunctionType */: checkJSDocFunctionType(node); // falls through case 316 /* JSDocNonNullableType */: case 315 /* JSDocNullableType */: case 313 /* JSDocAllType */: case 314 /* JSDocUnknownType */: case 323 /* JSDocTypeLiteral */: checkJSDocTypeIsInJsFile(node); forEachChild(node, checkSourceElement); return; case 319 /* JSDocVariadicType */: checkJSDocVariadicType(node); return; case 310 /* JSDocTypeExpression */: return checkSourceElement(node.type); case 334 /* JSDocPublicTag */: case 336 /* JSDocProtectedTag */: case 335 /* JSDocPrivateTag */: return checkJSDocAccessibilityModifiers(node); case 351 /* JSDocSatisfiesTag */: return checkJSDocSatisfiesTag(node); case 344 /* JSDocThisTag */: return checkJSDocThisTag(node); case 352 /* JSDocImportTag */: return checkJSDocImportTag(node); case 200 /* IndexedAccessType */: return checkIndexedAccessType(node); case 201 /* MappedType */: return checkMappedType(node); case 263 /* FunctionDeclaration */: return checkFunctionDeclaration(node); case 242 /* Block */: case 269 /* ModuleBlock */: return checkBlock(node); case 244 /* VariableStatement */: return checkVariableStatement(node); case 245 /* ExpressionStatement */: return checkExpressionStatement(node); case 246 /* IfStatement */: return checkIfStatement(node); case 247 /* DoStatement */: return checkDoStatement(node); case 248 /* WhileStatement */: return checkWhileStatement(node); case 249 /* ForStatement */: return checkForStatement(node); case 250 /* ForInStatement */: return checkForInStatement(node); case 251 /* ForOfStatement */: return checkForOfStatement(node); case 252 /* ContinueStatement */: case 253 /* BreakStatement */: return checkBreakOrContinueStatement(node); case 254 /* ReturnStatement */: return checkReturnStatement(node); case 255 /* WithStatement */: return checkWithStatement(node); case 256 /* SwitchStatement */: return checkSwitchStatement(node); case 257 /* LabeledStatement */: return checkLabeledStatement(node); case 258 /* ThrowStatement */: return checkThrowStatement(node); case 259 /* TryStatement */: return checkTryStatement(node); case 261 /* VariableDeclaration */: return checkVariableDeclaration(node); case 209 /* BindingElement */: return checkBindingElement(node); case 264 /* ClassDeclaration */: return checkClassDeclaration(node); case 265 /* InterfaceDeclaration */: return checkInterfaceDeclaration(node); case 266 /* TypeAliasDeclaration */: return checkTypeAliasDeclaration(node); case 267 /* EnumDeclaration */: return checkEnumDeclaration(node); case 307 /* EnumMember */: return checkEnumMember(node); case 268 /* ModuleDeclaration */: return checkModuleDeclaration(node); case 273 /* ImportDeclaration */: return checkImportDeclaration(node); case 272 /* ImportEqualsDeclaration */: return checkImportEqualsDeclaration(node); case 279 /* ExportDeclaration */: return checkExportDeclaration(node); case 278 /* ExportAssignment */: return checkExportAssignment(node); case 243 /* EmptyStatement */: case 260 /* DebuggerStatement */: checkGrammarStatementInAmbientContext(node); return; case 283 /* MissingDeclaration */: return checkMissingDeclaration(node); } } function checkJSDocCommentWorker(node) { if (isArray(node)) { forEach(node, (tag) => { if (isJSDocLinkLike(tag)) { checkSourceElement(tag); } }); } } function checkJSDocTypeIsInJsFile(node) { if (!isInJSFile(node)) { if (isJSDocNonNullableType(node) || isJSDocNullableType(node)) { const token = tokenToString(isJSDocNonNullableType(node) ? 54 /* ExclamationToken */ : 58 /* QuestionToken */); const diagnostic = node.postfix ? Diagnostics._0_at_the_end_of_a_type_is_not_valid_TypeScript_syntax_Did_you_mean_to_write_1 : Diagnostics._0_at_the_start_of_a_type_is_not_valid_TypeScript_syntax_Did_you_mean_to_write_1; const typeNode = node.type; const type = getTypeFromTypeNode(typeNode); grammarErrorOnNode( node, diagnostic, token, typeToString( isJSDocNullableType(node) && !(type === neverType || type === voidType) ? getUnionType(append([type, undefinedType], node.postfix ? void 0 : nullType)) : type ) ); } else { grammarErrorOnNode(node, Diagnostics.JSDoc_types_can_only_be_used_inside_documentation_comments); } } } function checkJSDocVariadicType(node) { checkJSDocTypeIsInJsFile(node); checkSourceElement(node.type); const { parent } = node; if (isParameter(parent) && isJSDocFunctionType(parent.parent)) { if (last(parent.parent.parameters) !== parent) { error(node, Diagnostics.A_rest_parameter_must_be_last_in_a_parameter_list); } return; } if (!isJSDocTypeExpression(parent)) { error(node, Diagnostics.JSDoc_may_only_appear_in_the_last_parameter_of_a_signature); } const paramTag = node.parent.parent; if (!isJSDocParameterTag(paramTag)) { error(node, Diagnostics.JSDoc_may_only_appear_in_the_last_parameter_of_a_signature); return; } const param = getParameterSymbolFromJSDoc(paramTag); if (!param) { return; } const host2 = getHostSignatureFromJSDoc(paramTag); if (!host2 || last(host2.parameters).symbol !== param) { error(node, Diagnostics.A_rest_parameter_must_be_last_in_a_parameter_list); } } function getTypeFromJSDocVariadicType(node) { const type = getTypeFromTypeNode(node.type); const { parent } = node; const paramTag = node.parent.parent; if (isJSDocTypeExpression(node.parent) && isJSDocParameterTag(paramTag)) { const host2 = getHostSignatureFromJSDoc(paramTag); const isCallbackTag = isJSDocCallbackTag(paramTag.parent.parent); if (host2 || isCallbackTag) { const lastParamDeclaration = isCallbackTag ? lastOrUndefined(paramTag.parent.parent.typeExpression.parameters) : lastOrUndefined(host2.parameters); const symbol = getParameterSymbolFromJSDoc(paramTag); if (!lastParamDeclaration || symbol && lastParamDeclaration.symbol === symbol && isRestParameter(lastParamDeclaration)) { return createArrayType(type); } } } if (isParameter(parent) && isJSDocFunctionType(parent.parent)) { return createArrayType(type); } return addOptionality(type); } function checkNodeDeferred(node) { const enclosingFile = getSourceFileOfNode(node); const links = getNodeLinks(enclosingFile); if (!(links.flags & 1 /* TypeChecked */)) { links.deferredNodes || (links.deferredNodes = /* @__PURE__ */ new Set()); links.deferredNodes.add(node); } else { Debug.assert(!links.deferredNodes, "A type-checked file should have no deferred nodes."); } } function checkDeferredNodes(context) { const links = getNodeLinks(context); if (links.deferredNodes) { links.deferredNodes.forEach(checkDeferredNode); } links.deferredNodes = void 0; } function checkDeferredNode(node) { var _a, _b; (_a = tracing) == null ? void 0 : _a.push(tracing.Phase.Check, "checkDeferredNode", { kind: node.kind, pos: node.pos, end: node.end, path: node.tracingPath }); const saveCurrentNode = currentNode; currentNode = node; instantiationCount = 0; switch (node.kind) { case 214 /* CallExpression */: case 215 /* NewExpression */: case 216 /* TaggedTemplateExpression */: case 171 /* Decorator */: case 287 /* JsxOpeningElement */: resolveUntypedCall(node); break; case 219 /* FunctionExpression */: case 220 /* ArrowFunction */: case 175 /* MethodDeclaration */: case 174 /* MethodSignature */: checkFunctionExpressionOrObjectLiteralMethodDeferred(node); break; case 178 /* GetAccessor */: case 179 /* SetAccessor */: checkAccessorDeclaration(node); break; case 232 /* ClassExpression */: checkClassExpressionDeferred(node); break; case 169 /* TypeParameter */: checkTypeParameterDeferred(node); break; case 286 /* JsxSelfClosingElement */: checkJsxSelfClosingElementDeferred(node); break; case 285 /* JsxElement */: checkJsxElementDeferred(node); break; case 217 /* TypeAssertionExpression */: case 235 /* AsExpression */: case 218 /* ParenthesizedExpression */: checkAssertionDeferred(node); break; case 223 /* VoidExpression */: checkExpression(node.expression); break; case 227 /* BinaryExpression */: if (isInstanceOfExpression(node)) { resolveUntypedCall(node); } break; } currentNode = saveCurrentNode; (_b = tracing) == null ? void 0 : _b.pop(); } function checkSourceFile(node, nodesToCheck) { var _a, _b; (_a = tracing) == null ? void 0 : _a.push( tracing.Phase.Check, nodesToCheck ? "checkSourceFileNodes" : "checkSourceFile", { path: node.path }, /*separateBeginAndEnd*/ true ); const beforeMark = nodesToCheck ? "beforeCheckNodes" : "beforeCheck"; const afterMark = nodesToCheck ? "afterCheckNodes" : "afterCheck"; mark(beforeMark); nodesToCheck ? checkSourceFileNodesWorker(node, nodesToCheck) : checkSourceFileWorker(node); mark(afterMark); measure("Check", beforeMark, afterMark); (_b = tracing) == null ? void 0 : _b.pop(); } function unusedIsError(kind, isAmbient) { if (isAmbient) { return false; } switch (kind) { case 0 /* Local */: return !!compilerOptions.noUnusedLocals; case 1 /* Parameter */: return !!compilerOptions.noUnusedParameters; default: return Debug.assertNever(kind); } } function getPotentiallyUnusedIdentifiers(sourceFile) { return allPotentiallyUnusedIdentifiers.get(sourceFile.path) || emptyArray; } function checkSourceFileWorker(node) { const links = getNodeLinks(node); if (!(links.flags & 1 /* TypeChecked */)) { if (skipTypeChecking(node, compilerOptions, host)) { return; } checkGrammarSourceFile(node); clear(potentialThisCollisions); clear(potentialNewTargetCollisions); clear(potentialWeakMapSetCollisions); clear(potentialReflectCollisions); clear(potentialUnusedRenamedBindingElementsInTypes); if (links.flags & 8388608 /* PartiallyTypeChecked */) { potentialThisCollisions = links.potentialThisCollisions; potentialNewTargetCollisions = links.potentialNewTargetCollisions; potentialWeakMapSetCollisions = links.potentialWeakMapSetCollisions; potentialReflectCollisions = links.potentialReflectCollisions; potentialUnusedRenamedBindingElementsInTypes = links.potentialUnusedRenamedBindingElementsInTypes; } forEach(node.statements, checkSourceElement); checkSourceElement(node.endOfFileToken); checkDeferredNodes(node); if (isExternalOrCommonJsModule(node)) { registerForUnusedIdentifiersCheck(node); } addLazyDiagnostic(() => { if (!node.isDeclarationFile && (compilerOptions.noUnusedLocals || compilerOptions.noUnusedParameters)) { checkUnusedIdentifiers(getPotentiallyUnusedIdentifiers(node), (containingNode, kind, diag2) => { if (!containsParseError(containingNode) && unusedIsError(kind, !!(containingNode.flags & 33554432 /* Ambient */))) { diagnostics.add(diag2); } }); } if (!node.isDeclarationFile) { checkPotentialUncheckedRenamedBindingElementsInTypes(); } }); if (isExternalOrCommonJsModule(node)) { checkExternalModuleExports(node); } if (potentialThisCollisions.length) { forEach(potentialThisCollisions, checkIfThisIsCapturedInEnclosingScope); clear(potentialThisCollisions); } if (potentialNewTargetCollisions.length) { forEach(potentialNewTargetCollisions, checkIfNewTargetIsCapturedInEnclosingScope); clear(potentialNewTargetCollisions); } if (potentialWeakMapSetCollisions.length) { forEach(potentialWeakMapSetCollisions, checkWeakMapSetCollision); clear(potentialWeakMapSetCollisions); } if (potentialReflectCollisions.length) { forEach(potentialReflectCollisions, checkReflectCollision); clear(potentialReflectCollisions); } links.flags |= 1 /* TypeChecked */; } } function checkSourceFileNodesWorker(file, nodes) { const links = getNodeLinks(file); if (!(links.flags & 1 /* TypeChecked */)) { if (skipTypeChecking(file, compilerOptions, host)) { return; } checkGrammarSourceFile(file); clear(potentialThisCollisions); clear(potentialNewTargetCollisions); clear(potentialWeakMapSetCollisions); clear(potentialReflectCollisions); clear(potentialUnusedRenamedBindingElementsInTypes); forEach(nodes, checkSourceElement); checkDeferredNodes(file); (links.potentialThisCollisions || (links.potentialThisCollisions = [])).push(...potentialThisCollisions); (links.potentialNewTargetCollisions || (links.potentialNewTargetCollisions = [])).push(...potentialNewTargetCollisions); (links.potentialWeakMapSetCollisions || (links.potentialWeakMapSetCollisions = [])).push(...potentialWeakMapSetCollisions); (links.potentialReflectCollisions || (links.potentialReflectCollisions = [])).push(...potentialReflectCollisions); (links.potentialUnusedRenamedBindingElementsInTypes || (links.potentialUnusedRenamedBindingElementsInTypes = [])).push( ...potentialUnusedRenamedBindingElementsInTypes ); links.flags |= 8388608 /* PartiallyTypeChecked */; for (const node of nodes) { const nodeLinks2 = getNodeLinks(node); nodeLinks2.flags |= 8388608 /* PartiallyTypeChecked */; } } } function getDiagnostics(sourceFile, ct, nodesToCheck) { try { cancellationToken = ct; return getDiagnosticsWorker(sourceFile, nodesToCheck); } finally { cancellationToken = void 0; } } function ensurePendingDiagnosticWorkComplete() { for (const cb of deferredDiagnosticsCallbacks) { cb(); } deferredDiagnosticsCallbacks = []; } function checkSourceFileWithEagerDiagnostics(sourceFile, nodesToCheck) { ensurePendingDiagnosticWorkComplete(); const oldAddLazyDiagnostics = addLazyDiagnostic; addLazyDiagnostic = (cb) => cb(); checkSourceFile(sourceFile, nodesToCheck); addLazyDiagnostic = oldAddLazyDiagnostics; } function getDiagnosticsWorker(sourceFile, nodesToCheck) { if (sourceFile) { ensurePendingDiagnosticWorkComplete(); const previousGlobalDiagnostics = diagnostics.getGlobalDiagnostics(); const previousGlobalDiagnosticsSize = previousGlobalDiagnostics.length; checkSourceFileWithEagerDiagnostics(sourceFile, nodesToCheck); const semanticDiagnostics = diagnostics.getDiagnostics(sourceFile.fileName); if (nodesToCheck) { return semanticDiagnostics; } const currentGlobalDiagnostics = diagnostics.getGlobalDiagnostics(); if (currentGlobalDiagnostics !== previousGlobalDiagnostics) { const deferredGlobalDiagnostics = relativeComplement(previousGlobalDiagnostics, currentGlobalDiagnostics, compareDiagnostics); return concatenate(deferredGlobalDiagnostics, semanticDiagnostics); } else if (previousGlobalDiagnosticsSize === 0 && currentGlobalDiagnostics.length > 0) { return concatenate(currentGlobalDiagnostics, semanticDiagnostics); } return semanticDiagnostics; } forEach(host.getSourceFiles(), (file) => checkSourceFileWithEagerDiagnostics(file)); return diagnostics.getDiagnostics(); } function getGlobalDiagnostics() { ensurePendingDiagnosticWorkComplete(); return diagnostics.getGlobalDiagnostics(); } function getSymbolsInScope(location, meaning) { if (location.flags & 67108864 /* InWithStatement */) { return []; } const symbols = createSymbolTable(); let isStaticSymbol = false; populateSymbols(); symbols.delete("this" /* This */); return symbolsToArray(symbols); function populateSymbols() { while (location) { if (canHaveLocals(location) && location.locals && !isGlobalSourceFile(location)) { copySymbols(location.locals, meaning); } switch (location.kind) { case 308 /* SourceFile */: if (!isExternalModule(location)) break; // falls through case 268 /* ModuleDeclaration */: copyLocallyVisibleExportSymbols(getSymbolOfDeclaration(location).exports, meaning & 2623475 /* ModuleMember */); break; case 267 /* EnumDeclaration */: copySymbols(getSymbolOfDeclaration(location).exports, meaning & 8 /* EnumMember */); break; case 232 /* ClassExpression */: const className = location.name; if (className) { copySymbol(location.symbol, meaning); } // this fall-through is necessary because we would like to handle // type parameter inside class expression similar to how we handle it in classDeclaration and interface Declaration. // falls through case 264 /* ClassDeclaration */: case 265 /* InterfaceDeclaration */: if (!isStaticSymbol) { copySymbols(getMembersOfSymbol(getSymbolOfDeclaration(location)), meaning & 788968 /* Type */); } break; case 219 /* FunctionExpression */: const funcName = location.name; if (funcName) { copySymbol(location.symbol, meaning); } break; } if (introducesArgumentsExoticObject(location)) { copySymbol(argumentsSymbol, meaning); } isStaticSymbol = isStatic(location); location = location.parent; } copySymbols(globals, meaning); } function copySymbol(symbol, meaning2) { if (getCombinedLocalAndExportSymbolFlags(symbol) & meaning2) { const id = symbol.escapedName; if (!symbols.has(id)) { symbols.set(id, symbol); } } } function copySymbols(source, meaning2) { if (meaning2) { source.forEach((symbol) => { copySymbol(symbol, meaning2); }); } } function copyLocallyVisibleExportSymbols(source, meaning2) { if (meaning2) { source.forEach((symbol) => { if (!getDeclarationOfKind(symbol, 282 /* ExportSpecifier */) && !getDeclarationOfKind(symbol, 281 /* NamespaceExport */) && symbol.escapedName !== "default" /* Default */) { copySymbol(symbol, meaning2); } }); } } } function isTypeDeclarationName(name) { return name.kind === 80 /* Identifier */ && isTypeDeclaration(name.parent) && getNameOfDeclaration(name.parent) === name; } function isTypeReferenceIdentifier(node) { while (node.parent.kind === 167 /* QualifiedName */) { node = node.parent; } return node.parent.kind === 184 /* TypeReference */; } function isInNameOfExpressionWithTypeArguments(node) { while (node.parent.kind === 212 /* PropertyAccessExpression */) { node = node.parent; } return node.parent.kind === 234 /* ExpressionWithTypeArguments */; } function forEachEnclosingClass(node, callback) { let result; let containingClass = getContainingClass(node); while (containingClass) { if (result = callback(containingClass)) break; containingClass = getContainingClass(containingClass); } return result; } function isNodeUsedDuringClassInitialization(node) { return !!findAncestor(node, (element) => { if (isConstructorDeclaration(element) && nodeIsPresent(element.body) || isPropertyDeclaration(element)) { return true; } else if (isClassLike(element) || isFunctionLikeDeclaration(element)) { return "quit"; } return false; }); } function isNodeWithinClass(node, classDeclaration) { return !!forEachEnclosingClass(node, (n) => n === classDeclaration); } function getLeftSideOfImportEqualsOrExportAssignment(nodeOnRightSide) { while (nodeOnRightSide.parent.kind === 167 /* QualifiedName */) { nodeOnRightSide = nodeOnRightSide.parent; } if (nodeOnRightSide.parent.kind === 272 /* ImportEqualsDeclaration */) { return nodeOnRightSide.parent.moduleReference === nodeOnRightSide ? nodeOnRightSide.parent : void 0; } if (nodeOnRightSide.parent.kind === 278 /* ExportAssignment */) { return nodeOnRightSide.parent.expression === nodeOnRightSide ? nodeOnRightSide.parent : void 0; } return void 0; } function isInRightSideOfImportOrExportAssignment(node) { return getLeftSideOfImportEqualsOrExportAssignment(node) !== void 0; } function getSpecialPropertyAssignmentSymbolFromEntityName(entityName) { const specialPropertyAssignmentKind = getAssignmentDeclarationKind(entityName.parent.parent); switch (specialPropertyAssignmentKind) { case 1 /* ExportsProperty */: case 3 /* PrototypeProperty */: return getSymbolOfNode(entityName.parent); case 5 /* Property */: if (isPropertyAccessExpression(entityName.parent) && getLeftmostAccessExpression(entityName.parent) === entityName) { return void 0; } // falls through case 4 /* ThisProperty */: case 2 /* ModuleExports */: return getSymbolOfDeclaration(entityName.parent.parent); } } function isImportTypeQualifierPart(node) { let parent = node.parent; while (isQualifiedName(parent)) { node = parent; parent = parent.parent; } if (parent && parent.kind === 206 /* ImportType */ && parent.qualifier === node) { return parent; } return void 0; } function isThisPropertyAndThisTyped(node) { if (node.expression.kind === 110 /* ThisKeyword */) { const container = getThisContainer( node, /*includeArrowFunctions*/ false, /*includeClassComputedPropertyName*/ false ); if (isFunctionLike(container)) { const containingLiteral = getContainingObjectLiteral(container); if (containingLiteral) { const contextualType = getApparentTypeOfContextualType( containingLiteral, /*contextFlags*/ void 0 ); const type = getThisTypeOfObjectLiteralFromContextualType(containingLiteral, contextualType); return type && !isTypeAny(type); } } } } function getSymbolOfNameOrPropertyAccessExpression(name) { if (isDeclarationName(name)) { return getSymbolOfNode(name.parent); } if (isInJSFile(name) && name.parent.kind === 212 /* PropertyAccessExpression */ && name.parent === name.parent.parent.left) { if (!isPrivateIdentifier(name) && !isJSDocMemberName(name) && !isThisPropertyAndThisTyped(name.parent)) { const specialPropertyAssignmentSymbol = getSpecialPropertyAssignmentSymbolFromEntityName(name); if (specialPropertyAssignmentSymbol) { return specialPropertyAssignmentSymbol; } } } if (name.parent.kind === 278 /* ExportAssignment */ && isEntityNameExpression(name)) { const success = resolveEntityName( name, /*all meanings*/ 111551 /* Value */ | 788968 /* Type */ | 1920 /* Namespace */ | 2097152 /* Alias */, /*ignoreErrors*/ true ); if (success && success !== unknownSymbol) { return success; } } else if (isEntityName(name) && isInRightSideOfImportOrExportAssignment(name)) { const importEqualsDeclaration = getAncestor(name, 272 /* ImportEqualsDeclaration */); Debug.assert(importEqualsDeclaration !== void 0); return getSymbolOfPartOfRightHandSideOfImportEquals( name, /*dontResolveAlias*/ true ); } if (isEntityName(name)) { const possibleImportNode = isImportTypeQualifierPart(name); if (possibleImportNode) { getTypeFromTypeNode(possibleImportNode); const sym = getNodeLinks(name).resolvedSymbol; return sym === unknownSymbol ? void 0 : sym; } } while (isRightSideOfQualifiedNameOrPropertyAccessOrJSDocMemberName(name)) { name = name.parent; } if (isInNameOfExpressionWithTypeArguments(name)) { let meaning = 0 /* None */; if (name.parent.kind === 234 /* ExpressionWithTypeArguments */) { meaning = isPartOfTypeNode(name) ? 788968 /* Type */ : 111551 /* Value */; if (isExpressionWithTypeArgumentsInClassExtendsClause(name.parent)) { meaning |= 111551 /* Value */; } } else { meaning = 1920 /* Namespace */; } meaning |= 2097152 /* Alias */; const entityNameSymbol = isEntityNameExpression(name) ? resolveEntityName( name, meaning, /*ignoreErrors*/ true ) : void 0; if (entityNameSymbol) { return entityNameSymbol; } } if (name.parent.kind === 342 /* JSDocParameterTag */) { return getParameterSymbolFromJSDoc(name.parent); } if (name.parent.kind === 169 /* TypeParameter */ && name.parent.parent.kind === 346 /* JSDocTemplateTag */) { Debug.assert(!isInJSFile(name)); const typeParameter = getTypeParameterFromJsDoc(name.parent); return typeParameter && typeParameter.symbol; } if (isExpressionNode(name)) { if (nodeIsMissing(name)) { return void 0; } const isJSDoc2 = findAncestor(name, or(isJSDocLinkLike, isJSDocNameReference, isJSDocMemberName)); const meaning = isJSDoc2 ? 788968 /* Type */ | 1920 /* Namespace */ | 111551 /* Value */ : 111551 /* Value */; if (name.kind === 80 /* Identifier */) { if (isJSXTagName(name) && isJsxIntrinsicTagName(name)) { const symbol = getIntrinsicTagSymbol(name.parent); return symbol === unknownSymbol ? void 0 : symbol; } const result = resolveEntityName( name, meaning, /*ignoreErrors*/ true, /*dontResolveAlias*/ true, getHostSignatureFromJSDoc(name) ); if (!result && isJSDoc2) { const container = findAncestor(name, or(isClassLike, isInterfaceDeclaration)); if (container) { return resolveJSDocMemberName( name, /*ignoreErrors*/ true, getSymbolOfDeclaration(container) ); } } if (result && isJSDoc2) { const container = getJSDocHost(name); if (container && isEnumMember(container) && container === result.valueDeclaration) { return resolveEntityName( name, meaning, /*ignoreErrors*/ true, /*dontResolveAlias*/ true, getSourceFileOfNode(container) ) || result; } } return result; } else if (isPrivateIdentifier(name)) { return getSymbolForPrivateIdentifierExpression(name); } else if (name.kind === 212 /* PropertyAccessExpression */ || name.kind === 167 /* QualifiedName */) { const links = getNodeLinks(name); if (links.resolvedSymbol) { return links.resolvedSymbol; } if (name.kind === 212 /* PropertyAccessExpression */) { checkPropertyAccessExpression(name, 0 /* Normal */); if (!links.resolvedSymbol) { links.resolvedSymbol = getApplicableIndexSymbol(checkExpressionCached(name.expression), getLiteralTypeFromPropertyName(name.name)); } } else { checkQualifiedName(name, 0 /* Normal */); } if (!links.resolvedSymbol && isJSDoc2 && isQualifiedName(name)) { return resolveJSDocMemberName(name); } return links.resolvedSymbol; } else if (isJSDocMemberName(name)) { return resolveJSDocMemberName(name); } } else if (isEntityName(name) && isTypeReferenceIdentifier(name)) { const meaning = name.parent.kind === 184 /* TypeReference */ ? 788968 /* Type */ : 1920 /* Namespace */; const symbol = resolveEntityName( name, meaning, /*ignoreErrors*/ true, /*dontResolveAlias*/ true ); return symbol && symbol !== unknownSymbol ? symbol : getUnresolvedSymbolForEntityName(name); } if (name.parent.kind === 183 /* TypePredicate */) { return resolveEntityName( name, /*meaning*/ 1 /* FunctionScopedVariable */, /*ignoreErrors*/ true ); } return void 0; } function getApplicableIndexSymbol(type, keyType) { const infos = getApplicableIndexInfos(type, keyType); if (infos.length && type.members) { const symbol = getIndexSymbolFromSymbolTable(resolveStructuredTypeMembers(type).members); if (infos === getIndexInfosOfType(type)) { return symbol; } else if (symbol) { const symbolLinks2 = getSymbolLinks(symbol); const declarationList = mapDefined(infos, (i) => i.declaration); const nodeListId = map(declarationList, getNodeId).join(","); if (!symbolLinks2.filteredIndexSymbolCache) { symbolLinks2.filteredIndexSymbolCache = /* @__PURE__ */ new Map(); } if (symbolLinks2.filteredIndexSymbolCache.has(nodeListId)) { return symbolLinks2.filteredIndexSymbolCache.get(nodeListId); } else { const copy = createSymbol(131072 /* Signature */, "__index" /* Index */); copy.declarations = mapDefined(infos, (i) => i.declaration); copy.parent = type.aliasSymbol ? type.aliasSymbol : type.symbol ? type.symbol : getSymbolAtLocation(copy.declarations[0].parent); symbolLinks2.filteredIndexSymbolCache.set(nodeListId, copy); return copy; } } } } function resolveJSDocMemberName(name, ignoreErrors, container) { if (isEntityName(name)) { const meaning = 788968 /* Type */ | 1920 /* Namespace */ | 111551 /* Value */; let symbol = resolveEntityName( name, meaning, ignoreErrors, /*dontResolveAlias*/ true, getHostSignatureFromJSDoc(name) ); if (!symbol && isIdentifier(name) && container) { symbol = getMergedSymbol(getSymbol(getExportsOfSymbol(container), name.escapedText, meaning)); } if (symbol) { return symbol; } } const left = isIdentifier(name) ? container : resolveJSDocMemberName(name.left, ignoreErrors, container); const right = isIdentifier(name) ? name.escapedText : name.right.escapedText; if (left) { const proto = left.flags & 111551 /* Value */ && getPropertyOfType(getTypeOfSymbol(left), "prototype"); const t = proto ? getTypeOfSymbol(proto) : getDeclaredTypeOfSymbol(left); return getPropertyOfType(t, right); } } function getSymbolAtLocation(node, ignoreErrors) { if (isSourceFile(node)) { return isExternalModule(node) ? getMergedSymbol(node.symbol) : void 0; } const { parent } = node; const grandParent = parent.parent; if (node.flags & 67108864 /* InWithStatement */) { return void 0; } if (isDeclarationNameOrImportPropertyName(node)) { const parentSymbol = getSymbolOfDeclaration(parent); return isImportOrExportSpecifier(node.parent) && node.parent.propertyName === node ? getImmediateAliasedSymbol(parentSymbol) : parentSymbol; } else if (isLiteralComputedPropertyDeclarationName(node)) { return getSymbolOfDeclaration(parent.parent); } if (node.kind === 80 /* Identifier */) { if (isInRightSideOfImportOrExportAssignment(node)) { return getSymbolOfNameOrPropertyAccessExpression(node); } else if (parent.kind === 209 /* BindingElement */ && grandParent.kind === 207 /* ObjectBindingPattern */ && node === parent.propertyName) { const typeOfPattern = getTypeOfNode(grandParent); const propertyDeclaration = getPropertyOfType(typeOfPattern, node.escapedText); if (propertyDeclaration) { return propertyDeclaration; } } else if (isMetaProperty(parent) && parent.name === node) { if (parent.keywordToken === 105 /* NewKeyword */ && idText(node) === "target") { return checkNewTargetMetaProperty(parent).symbol; } if (parent.keywordToken === 102 /* ImportKeyword */ && idText(node) === "meta") { return getGlobalImportMetaExpressionType().members.get("meta"); } return void 0; } } switch (node.kind) { case 80 /* Identifier */: case 81 /* PrivateIdentifier */: case 212 /* PropertyAccessExpression */: case 167 /* QualifiedName */: if (!isThisInTypeQuery(node)) { return getSymbolOfNameOrPropertyAccessExpression(node); } // falls through case 110 /* ThisKeyword */: const container = getThisContainer( node, /*includeArrowFunctions*/ false, /*includeClassComputedPropertyName*/ false ); if (isFunctionLike(container)) { const sig = getSignatureFromDeclaration(container); if (sig.thisParameter) { return sig.thisParameter; } } if (isInExpressionContext(node)) { return checkExpression(node).symbol; } // falls through case 198 /* ThisType */: return getTypeFromThisTypeNode(node).symbol; case 108 /* SuperKeyword */: return checkExpression(node).symbol; case 137 /* ConstructorKeyword */: const constructorDeclaration = node.parent; if (constructorDeclaration && constructorDeclaration.kind === 177 /* Constructor */) { return constructorDeclaration.parent.symbol; } return void 0; case 11 /* StringLiteral */: case 15 /* NoSubstitutionTemplateLiteral */: if (isExternalModuleImportEqualsDeclaration(node.parent.parent) && getExternalModuleImportEqualsDeclarationExpression(node.parent.parent) === node || (node.parent.kind === 273 /* ImportDeclaration */ || node.parent.kind === 279 /* ExportDeclaration */) && node.parent.moduleSpecifier === node || isInJSFile(node) && isJSDocImportTag(node.parent) && node.parent.moduleSpecifier === node || (isInJSFile(node) && isRequireCall( node.parent, /*requireStringLiteralLikeArgument*/ false ) || isImportCall(node.parent)) || isLiteralTypeNode(node.parent) && isLiteralImportTypeNode(node.parent.parent) && node.parent.parent.argument === node.parent) { return resolveExternalModuleName(node, node, ignoreErrors); } if (isCallExpression(parent) && isBindableObjectDefinePropertyCall(parent) && parent.arguments[1] === node) { return getSymbolOfDeclaration(parent); } // falls through case 9 /* NumericLiteral */: const objectType = isElementAccessExpression(parent) ? parent.argumentExpression === node ? getTypeOfExpression(parent.expression) : void 0 : isLiteralTypeNode(parent) && isIndexedAccessTypeNode(grandParent) ? getTypeFromTypeNode(grandParent.objectType) : void 0; return objectType && getPropertyOfType(objectType, escapeLeadingUnderscores(node.text)); case 90 /* DefaultKeyword */: case 100 /* FunctionKeyword */: case 39 /* EqualsGreaterThanToken */: case 86 /* ClassKeyword */: return getSymbolOfNode(node.parent); case 206 /* ImportType */: return isLiteralImportTypeNode(node) ? getSymbolAtLocation(node.argument.literal, ignoreErrors) : void 0; case 95 /* ExportKeyword */: return isExportAssignment(node.parent) ? Debug.checkDefined(node.parent.symbol) : void 0; case 102 /* ImportKeyword */: if (isMetaProperty(node.parent) && node.parent.name.escapedText === "defer") { return void 0; } // falls through case 105 /* NewKeyword */: return isMetaProperty(node.parent) ? checkMetaPropertyKeyword(node.parent).symbol : void 0; case 104 /* InstanceOfKeyword */: if (isBinaryExpression(node.parent)) { const type = getTypeOfExpression(node.parent.right); const hasInstanceMethodType = getSymbolHasInstanceMethodOfObjectType(type); return (hasInstanceMethodType == null ? void 0 : hasInstanceMethodType.symbol) ?? type.symbol; } return void 0; case 237 /* MetaProperty */: return checkExpression(node).symbol; case 296 /* JsxNamespacedName */: if (isJSXTagName(node) && isJsxIntrinsicTagName(node)) { const symbol = getIntrinsicTagSymbol(node.parent); return symbol === unknownSymbol ? void 0 : symbol; } // falls through default: return void 0; } } function getIndexInfosAtLocation(node) { if (isIdentifier(node) && isPropertyAccessExpression(node.parent) && node.parent.name === node) { const keyType = getLiteralTypeFromPropertyName(node); const objectType = getTypeOfExpression(node.parent.expression); const objectTypes = objectType.flags & 1048576 /* Union */ ? objectType.types : [objectType]; return flatMap(objectTypes, (t) => filter(getIndexInfosOfType(t), (info) => isApplicableIndexType(keyType, info.keyType))); } return void 0; } function getShorthandAssignmentValueSymbol(location) { if (location && location.kind === 305 /* ShorthandPropertyAssignment */) { return resolveEntityName( location.name, 111551 /* Value */ | 2097152 /* Alias */, /*ignoreErrors*/ true ); } return void 0; } function getExportSpecifierLocalTargetSymbol(node) { if (isExportSpecifier(node)) { const name = node.propertyName || node.name; return node.parent.parent.moduleSpecifier ? getExternalModuleMember(node.parent.parent, node) : name.kind === 11 /* StringLiteral */ ? void 0 : ( // Skip for invalid syntax like this: export { "x" } resolveEntityName( name, 111551 /* Value */ | 788968 /* Type */ | 1920 /* Namespace */ | 2097152 /* Alias */, /*ignoreErrors*/ true ) ); } else { return resolveEntityName( node, 111551 /* Value */ | 788968 /* Type */ | 1920 /* Namespace */ | 2097152 /* Alias */, /*ignoreErrors*/ true ); } } function getTypeOfNode(node) { if (isSourceFile(node) && !isExternalModule(node)) { return errorType; } if (node.flags & 67108864 /* InWithStatement */) { return errorType; } const classDecl = tryGetClassImplementingOrExtendingExpressionWithTypeArguments(node); const classType = classDecl && getDeclaredTypeOfClassOrInterface(getSymbolOfDeclaration(classDecl.class)); if (isPartOfTypeNode(node)) { const typeFromTypeNode = getTypeFromTypeNode(node); return classType ? getTypeWithThisArgument(typeFromTypeNode, classType.thisType) : typeFromTypeNode; } if (isExpressionNode(node)) { return getRegularTypeOfExpression(node); } if (classType && !classDecl.isImplements) { const baseType = firstOrUndefined(getBaseTypes(classType)); return baseType ? getTypeWithThisArgument(baseType, classType.thisType) : errorType; } if (isTypeDeclaration(node)) { const symbol = getSymbolOfDeclaration(node); return getDeclaredTypeOfSymbol(symbol); } if (isTypeDeclarationName(node)) { const symbol = getSymbolAtLocation(node); return symbol ? getDeclaredTypeOfSymbol(symbol) : errorType; } if (isBindingElement(node)) { return getTypeForVariableLikeDeclaration( node, /*includeOptionality*/ true, 0 /* Normal */ ) || errorType; } if (isDeclaration(node)) { const symbol = getSymbolOfDeclaration(node); return symbol ? getTypeOfSymbol(symbol) : errorType; } if (isDeclarationNameOrImportPropertyName(node)) { const symbol = getSymbolAtLocation(node); if (symbol) { return getTypeOfSymbol(symbol); } return errorType; } if (isBindingPattern(node)) { return getTypeForVariableLikeDeclaration( node.parent, /*includeOptionality*/ true, 0 /* Normal */ ) || errorType; } if (isInRightSideOfImportOrExportAssignment(node)) { const symbol = getSymbolAtLocation(node); if (symbol) { const declaredType = getDeclaredTypeOfSymbol(symbol); return !isErrorType(declaredType) ? declaredType : getTypeOfSymbol(symbol); } } if (isMetaProperty(node.parent) && node.parent.keywordToken === node.kind) { return checkMetaPropertyKeyword(node.parent); } if (isImportAttributes(node)) { return getGlobalImportAttributesType( /*reportErrors*/ false ); } return errorType; } function getTypeOfAssignmentPattern(expr) { Debug.assert(expr.kind === 211 /* ObjectLiteralExpression */ || expr.kind === 210 /* ArrayLiteralExpression */); if (expr.parent.kind === 251 /* ForOfStatement */) { const iteratedType = checkRightHandSideOfForOf(expr.parent); return checkDestructuringAssignment(expr, iteratedType || errorType); } if (expr.parent.kind === 227 /* BinaryExpression */) { const iteratedType = getTypeOfExpression(expr.parent.right); return checkDestructuringAssignment(expr, iteratedType || errorType); } if (expr.parent.kind === 304 /* PropertyAssignment */) { const node2 = cast(expr.parent.parent, isObjectLiteralExpression); const typeOfParentObjectLiteral = getTypeOfAssignmentPattern(node2) || errorType; const propertyIndex = indexOfNode(node2.properties, expr.parent); return checkObjectLiteralDestructuringPropertyAssignment(node2, typeOfParentObjectLiteral, propertyIndex); } const node = cast(expr.parent, isArrayLiteralExpression); const typeOfArrayLiteral = getTypeOfAssignmentPattern(node) || errorType; const elementType = checkIteratedTypeOrElementType(65 /* Destructuring */, typeOfArrayLiteral, undefinedType, expr.parent) || errorType; return checkArrayLiteralDestructuringElementAssignment(node, typeOfArrayLiteral, node.elements.indexOf(expr), elementType); } function getPropertySymbolOfDestructuringAssignment(location) { const typeOfObjectLiteral = getTypeOfAssignmentPattern(cast(location.parent.parent, isAssignmentPattern)); return typeOfObjectLiteral && getPropertyOfType(typeOfObjectLiteral, location.escapedText); } function getRegularTypeOfExpression(expr) { if (isRightSideOfQualifiedNameOrPropertyAccess(expr)) { expr = expr.parent; } return getRegularTypeOfLiteralType(getTypeOfExpression(expr)); } function getParentTypeOfClassElement(node) { const classSymbol = getSymbolOfNode(node.parent); return isStatic(node) ? getTypeOfSymbol(classSymbol) : getDeclaredTypeOfSymbol(classSymbol); } function getClassElementPropertyKeyType(element) { const name = element.name; switch (name.kind) { case 80 /* Identifier */: return getStringLiteralType(idText(name)); case 9 /* NumericLiteral */: case 11 /* StringLiteral */: return getStringLiteralType(name.text); case 168 /* ComputedPropertyName */: const nameType = checkComputedPropertyName(name); return isTypeAssignableToKind(nameType, 12288 /* ESSymbolLike */) ? nameType : stringType; default: return Debug.fail("Unsupported property name."); } } function getAugmentedPropertiesOfType(type) { type = getApparentType(type); const propsByName = createSymbolTable(getPropertiesOfType(type)); const functionType = getSignaturesOfType(type, 0 /* Call */).length ? globalCallableFunctionType : getSignaturesOfType(type, 1 /* Construct */).length ? globalNewableFunctionType : void 0; if (functionType) { forEach(getPropertiesOfType(functionType), (p) => { if (!propsByName.has(p.escapedName)) { propsByName.set(p.escapedName, p); } }); } return getNamedMembers(propsByName); } function typeHasCallOrConstructSignatures(type) { return getSignaturesOfType(type, 0 /* Call */).length !== 0 || getSignaturesOfType(type, 1 /* Construct */).length !== 0; } function getRootSymbols(symbol) { const roots = getImmediateRootSymbols(symbol); return roots ? flatMap(roots, getRootSymbols) : [symbol]; } function getImmediateRootSymbols(symbol) { if (getCheckFlags(symbol) & 6 /* Synthetic */) { return mapDefined(getSymbolLinks(symbol).containingType.types, (type) => getPropertyOfType(type, symbol.escapedName)); } else if (symbol.flags & 33554432 /* Transient */) { const { links: { leftSpread, rightSpread, syntheticOrigin } } = symbol; return leftSpread ? [leftSpread, rightSpread] : syntheticOrigin ? [syntheticOrigin] : singleElementArray(tryGetTarget(symbol)); } return void 0; } function tryGetTarget(symbol) { let target; let next = symbol; while (next = getSymbolLinks(next).target) { target = next; } return target; } function isArgumentsLocalBinding(nodeIn) { if (isGeneratedIdentifier(nodeIn)) return false; const node = getParseTreeNode(nodeIn, isIdentifier); if (!node) return false; const parent = node.parent; if (!parent) return false; const isPropertyName2 = (isPropertyAccessExpression(parent) || isPropertyAssignment(parent)) && parent.name === node; return !isPropertyName2 && getReferencedValueSymbol(node) === argumentsSymbol; } function isNameOfModuleOrEnumDeclaration(node) { return isModuleOrEnumDeclaration(node.parent) && node === node.parent.name; } function getReferencedExportContainer(nodeIn, prefixLocals) { var _a; const node = getParseTreeNode(nodeIn, isIdentifier); if (node) { let symbol = getReferencedValueSymbol( node, /*startInDeclarationContainer*/ isNameOfModuleOrEnumDeclaration(node) ); if (symbol) { if (symbol.flags & 1048576 /* ExportValue */) { const exportSymbol = getMergedSymbol(symbol.exportSymbol); if (!prefixLocals && exportSymbol.flags & 944 /* ExportHasLocal */ && !(exportSymbol.flags & 3 /* Variable */)) { return void 0; } symbol = exportSymbol; } const parentSymbol = getParentOfSymbol(symbol); if (parentSymbol) { if (parentSymbol.flags & 512 /* ValueModule */ && ((_a = parentSymbol.valueDeclaration) == null ? void 0 : _a.kind) === 308 /* SourceFile */) { const symbolFile = parentSymbol.valueDeclaration; const referenceFile = getSourceFileOfNode(node); const symbolIsUmdExport = symbolFile !== referenceFile; return symbolIsUmdExport ? void 0 : symbolFile; } return findAncestor(node.parent, (n) => isModuleOrEnumDeclaration(n) && getSymbolOfDeclaration(n) === parentSymbol); } } } } function getReferencedImportDeclaration(nodeIn) { const specifier = getIdentifierGeneratedImportReference(nodeIn); if (specifier) { return specifier; } const node = getParseTreeNode(nodeIn, isIdentifier); if (node) { const symbol = getReferencedValueOrAliasSymbol(node); if (isNonLocalAlias( symbol, /*excludes*/ 111551 /* Value */ ) && !getTypeOnlyAliasDeclaration(symbol, 111551 /* Value */)) { return getDeclarationOfAliasSymbol(symbol); } } return void 0; } function isSymbolOfDestructuredElementOfCatchBinding(symbol) { return symbol.valueDeclaration && isBindingElement(symbol.valueDeclaration) && walkUpBindingElementsAndPatterns(symbol.valueDeclaration).parent.kind === 300 /* CatchClause */; } function isSymbolOfDeclarationWithCollidingName(symbol) { if (symbol.flags & 418 /* BlockScoped */ && symbol.valueDeclaration && !isSourceFile(symbol.valueDeclaration)) { const links = getSymbolLinks(symbol); if (links.isDeclarationWithCollidingName === void 0) { const container = getEnclosingBlockScopeContainer(symbol.valueDeclaration); if (isStatementWithLocals(container) || isSymbolOfDestructuredElementOfCatchBinding(symbol)) { if (resolveName( container.parent, symbol.escapedName, 111551 /* Value */, /*nameNotFoundMessage*/ void 0, /*isUse*/ false )) { links.isDeclarationWithCollidingName = true; } else if (hasNodeCheckFlag(symbol.valueDeclaration, 16384 /* CapturedBlockScopedBinding */)) { const isDeclaredInLoop = hasNodeCheckFlag(symbol.valueDeclaration, 32768 /* BlockScopedBindingInLoop */); const inLoopInitializer = isIterationStatement( container, /*lookInLabeledStatements*/ false ); const inLoopBodyBlock = container.kind === 242 /* Block */ && isIterationStatement( container.parent, /*lookInLabeledStatements*/ false ); links.isDeclarationWithCollidingName = !isBlockScopedContainerTopLevel(container) && (!isDeclaredInLoop || !inLoopInitializer && !inLoopBodyBlock); } else { links.isDeclarationWithCollidingName = false; } } } return links.isDeclarationWithCollidingName; } return false; } function getReferencedDeclarationWithCollidingName(nodeIn) { if (!isGeneratedIdentifier(nodeIn)) { const node = getParseTreeNode(nodeIn, isIdentifier); if (node) { const symbol = getReferencedValueSymbol(node); if (symbol && isSymbolOfDeclarationWithCollidingName(symbol)) { return symbol.valueDeclaration; } } } return void 0; } function isDeclarationWithCollidingName(nodeIn) { const node = getParseTreeNode(nodeIn, isDeclaration); if (node) { const symbol = getSymbolOfDeclaration(node); if (symbol) { return isSymbolOfDeclarationWithCollidingName(symbol); } } return false; } function isValueAliasDeclaration(node) { Debug.assert(canCollectSymbolAliasAccessabilityData); switch (node.kind) { case 272 /* ImportEqualsDeclaration */: return isAliasResolvedToValue(getSymbolOfDeclaration(node)); case 274 /* ImportClause */: case 275 /* NamespaceImport */: case 277 /* ImportSpecifier */: case 282 /* ExportSpecifier */: const symbol = getSymbolOfDeclaration(node); return !!symbol && isAliasResolvedToValue( symbol, /*excludeTypeOnlyValues*/ true ); case 279 /* ExportDeclaration */: const exportClause = node.exportClause; return !!exportClause && (isNamespaceExport(exportClause) || some(exportClause.elements, isValueAliasDeclaration)); case 278 /* ExportAssignment */: return node.expression && node.expression.kind === 80 /* Identifier */ ? isAliasResolvedToValue( getSymbolOfDeclaration(node), /*excludeTypeOnlyValues*/ true ) : true; } return false; } function isTopLevelValueImportEqualsWithEntityName(nodeIn) { const node = getParseTreeNode(nodeIn, isImportEqualsDeclaration); if (node === void 0 || node.parent.kind !== 308 /* SourceFile */ || !isInternalModuleImportEqualsDeclaration(node)) { return false; } const isValue = isAliasResolvedToValue(getSymbolOfDeclaration(node)); return isValue && node.moduleReference && !nodeIsMissing(node.moduleReference); } function isAliasResolvedToValue(symbol, excludeTypeOnlyValues) { if (!symbol) { return false; } const container = getSourceFileOfNode(symbol.valueDeclaration); const fileSymbol = container && getSymbolOfDeclaration(container); void resolveExternalModuleSymbol(fileSymbol); const target = getExportSymbolOfValueSymbolIfExported(resolveAlias(symbol)); if (target === unknownSymbol) { return !excludeTypeOnlyValues || !getTypeOnlyAliasDeclaration(symbol); } return !!(getSymbolFlags( symbol, excludeTypeOnlyValues, /*excludeLocalMeanings*/ true ) & 111551 /* Value */) && (shouldPreserveConstEnums(compilerOptions) || !isConstEnumOrConstEnumOnlyModule(target)); } function isConstEnumOrConstEnumOnlyModule(s) { return isConstEnumSymbol(s) || !!s.constEnumOnlyModule; } function isReferencedAliasDeclaration(node, checkChildren) { Debug.assert(canCollectSymbolAliasAccessabilityData); if (isAliasSymbolDeclaration(node)) { const symbol = getSymbolOfDeclaration(node); const links = symbol && getSymbolLinks(symbol); if (links == null ? void 0 : links.referenced) { return true; } const target = getSymbolLinks(symbol).aliasTarget; if (target && getEffectiveModifierFlags(node) & 32 /* Export */ && getSymbolFlags(target) & 111551 /* Value */ && (shouldPreserveConstEnums(compilerOptions) || !isConstEnumOrConstEnumOnlyModule(target))) { return true; } } if (checkChildren) { return !!forEachChild(node, (node2) => isReferencedAliasDeclaration(node2, checkChildren)); } return false; } function isImplementationOfOverload(node) { if (nodeIsPresent(node.body)) { if (isGetAccessor(node) || isSetAccessor(node)) return false; const symbol = getSymbolOfDeclaration(node); const signaturesOfSymbol = getSignaturesOfSymbol(symbol); return signaturesOfSymbol.length > 1 || // If there is single signature for the symbol, it is overload if that signature isn't coming from the node // e.g.: function foo(a: string): string; // function foo(a: any) { // This is implementation of the overloads // return a; // } signaturesOfSymbol.length === 1 && signaturesOfSymbol[0].declaration !== node; } return false; } function declaredParameterTypeContainsUndefined(parameter) { const typeNode = getNonlocalEffectiveTypeAnnotationNode(parameter); if (!typeNode) return false; const type = getTypeFromTypeNode(typeNode); return isErrorType(type) || containsUndefinedType(type); } function requiresAddingImplicitUndefined(parameter, enclosingDeclaration) { return (isRequiredInitializedParameter(parameter, enclosingDeclaration) || isOptionalUninitializedParameterProperty(parameter)) && !declaredParameterTypeContainsUndefined(parameter); } function isRequiredInitializedParameter(parameter, enclosingDeclaration) { if (!strictNullChecks || isOptionalParameter(parameter) || isJSDocParameterTag(parameter) || !parameter.initializer) { return false; } if (hasSyntacticModifier(parameter, 31 /* ParameterPropertyModifier */)) { return !!enclosingDeclaration && isFunctionLikeDeclaration(enclosingDeclaration); } return true; } function isOptionalUninitializedParameterProperty(parameter) { return strictNullChecks && isOptionalParameter(parameter) && (isJSDocParameterTag(parameter) || !parameter.initializer) && hasSyntacticModifier(parameter, 31 /* ParameterPropertyModifier */); } function isExpandoFunctionDeclaration(node) { const declaration = getParseTreeNode(node, (n) => isFunctionDeclaration(n) || isVariableDeclaration(n)); if (!declaration) { return false; } let symbol; if (isVariableDeclaration(declaration)) { if (declaration.type || !isInJSFile(declaration) && !isVarConstLike2(declaration)) { return false; } const initializer = getDeclaredExpandoInitializer(declaration); if (!initializer || !canHaveSymbol(initializer)) { return false; } symbol = getSymbolOfDeclaration(initializer); } else { symbol = getSymbolOfDeclaration(declaration); } if (!symbol || !(symbol.flags & 16 /* Function */ | 3 /* Variable */)) { return false; } return !!forEachEntry(getExportsOfSymbol(symbol), (p) => p.flags & 111551 /* Value */ && isExpandoPropertyDeclaration(p.valueDeclaration)); } function getPropertiesOfContainerFunction(node) { const declaration = getParseTreeNode(node, isFunctionDeclaration); if (!declaration) { return emptyArray; } const symbol = getSymbolOfDeclaration(declaration); return symbol && getPropertiesOfType(getTypeOfSymbol(symbol)) || emptyArray; } function getNodeCheckFlags(node) { var _a; const nodeId = node.id || 0; if (nodeId < 0 || nodeId >= nodeLinks.length) return 0; return ((_a = nodeLinks[nodeId]) == null ? void 0 : _a.flags) || 0; } function hasNodeCheckFlag(node, flag) { calculateNodeCheckFlagWorker(node, flag); return !!(getNodeCheckFlags(node) & flag); } function calculateNodeCheckFlagWorker(node, flag) { if (!compilerOptions.noCheck && canIncludeBindAndCheckDiagnostics(getSourceFileOfNode(node), compilerOptions)) { return; } const links = getNodeLinks(node); if (links.calculatedFlags & flag) { return; } switch (flag) { case 16 /* SuperInstance */: case 32 /* SuperStatic */: return checkSingleSuperExpression(node); case 128 /* MethodWithSuperPropertyAccessInAsync */: case 256 /* MethodWithSuperPropertyAssignmentInAsync */: case 2097152 /* ContainsSuperPropertyInStaticInitializer */: return checkChildSuperExpressions(node); case 512 /* CaptureArguments */: case 8192 /* ContainsCapturedBlockScopeBinding */: case 65536 /* NeedsLoopOutParameter */: case 262144 /* ContainsConstructorReference */: return checkChildIdentifiers(node); case 536870912 /* ConstructorReference */: return checkSingleIdentifier(node); case 4096 /* LoopWithCapturedBlockScopedBinding */: case 32768 /* BlockScopedBindingInLoop */: case 16384 /* CapturedBlockScopedBinding */: return checkContainingBlockScopeBindingUses(node); default: return Debug.assertNever(flag, `Unhandled node check flag calculation: ${Debug.formatNodeCheckFlags(flag)}`); } function forEachNodeRecursively(root, cb) { const rootResult = cb(root, root.parent); if (rootResult === "skip") return void 0; if (rootResult) return rootResult; return forEachChildRecursively(root, cb); } function checkSuperExpressions(node2) { const links2 = getNodeLinks(node2); if (links2.calculatedFlags & flag) return "skip"; links2.calculatedFlags |= 128 /* MethodWithSuperPropertyAccessInAsync */ | 256 /* MethodWithSuperPropertyAssignmentInAsync */ | 2097152 /* ContainsSuperPropertyInStaticInitializer */; checkSingleSuperExpression(node2); return void 0; } function checkChildSuperExpressions(node2) { forEachNodeRecursively(node2, checkSuperExpressions); } function checkSingleSuperExpression(node2) { const nodeLinks2 = getNodeLinks(node2); nodeLinks2.calculatedFlags |= 16 /* SuperInstance */ | 32 /* SuperStatic */; if (node2.kind === 108 /* SuperKeyword */) { checkSuperExpression(node2); } } function checkIdentifiers(node2) { const links2 = getNodeLinks(node2); if (links2.calculatedFlags & flag) return "skip"; links2.calculatedFlags |= 512 /* CaptureArguments */ | 8192 /* ContainsCapturedBlockScopeBinding */ | 65536 /* NeedsLoopOutParameter */ | 262144 /* ContainsConstructorReference */; checkSingleIdentifier(node2); return void 0; } function checkChildIdentifiers(node2) { forEachNodeRecursively(node2, checkIdentifiers); } function isExpressionNodeOrShorthandPropertyAssignmentName(node2) { return isExpressionNode(node2) || isShorthandPropertyAssignment(node2.parent) && (node2.parent.objectAssignmentInitializer ?? node2.parent.name) === node2; } function checkSingleIdentifier(node2) { const nodeLinks2 = getNodeLinks(node2); nodeLinks2.calculatedFlags |= 536870912 /* ConstructorReference */; if (isIdentifier(node2)) { nodeLinks2.calculatedFlags |= 32768 /* BlockScopedBindingInLoop */ | 16384 /* CapturedBlockScopedBinding */; if (isExpressionNodeOrShorthandPropertyAssignmentName(node2) && !(isPropertyAccessExpression(node2.parent) && node2.parent.name === node2)) { const s = getResolvedSymbol(node2); if (s && s !== unknownSymbol) { checkIdentifierCalculateNodeCheckFlags(node2, s); } } } } function checkBlockScopeBindings(node2) { const links2 = getNodeLinks(node2); if (links2.calculatedFlags & flag) return "skip"; links2.calculatedFlags |= 4096 /* LoopWithCapturedBlockScopedBinding */ | 32768 /* BlockScopedBindingInLoop */ | 16384 /* CapturedBlockScopedBinding */; checkSingleBlockScopeBinding(node2); return void 0; } function checkContainingBlockScopeBindingUses(node2) { const scope = getEnclosingBlockScopeContainer(isDeclarationName(node2) ? node2.parent : node2); forEachNodeRecursively(scope, checkBlockScopeBindings); } function checkSingleBlockScopeBinding(node2) { checkSingleIdentifier(node2); if (isComputedPropertyName(node2)) { checkComputedPropertyName(node2); } if (isPrivateIdentifier(node2) && isClassElement(node2.parent)) { setNodeLinksForPrivateIdentifierScope(node2.parent); } } } function getEnumMemberValue(node) { computeEnumMemberValues(node.parent); return getNodeLinks(node).enumMemberValue ?? evaluatorResult( /*value*/ void 0 ); } function canHaveConstantValue(node) { switch (node.kind) { case 307 /* EnumMember */: case 212 /* PropertyAccessExpression */: case 213 /* ElementAccessExpression */: return true; } return false; } function getConstantValue2(node) { if (node.kind === 307 /* EnumMember */) { return getEnumMemberValue(node).value; } if (!getNodeLinks(node).resolvedSymbol) { void checkExpressionCached(node); } const symbol = getNodeLinks(node).resolvedSymbol || (isEntityNameExpression(node) ? resolveEntityName( node, 111551 /* Value */, /*ignoreErrors*/ true ) : void 0); if (symbol && symbol.flags & 8 /* EnumMember */) { const member = symbol.valueDeclaration; if (isEnumConst(member.parent)) { return getEnumMemberValue(member).value; } } return void 0; } function isFunctionType(type) { return !!(type.flags & 524288 /* Object */) && getSignaturesOfType(type, 0 /* Call */).length > 0; } function getTypeReferenceSerializationKind(typeNameIn, location) { var _a; const typeName = getParseTreeNode(typeNameIn, isEntityName); if (!typeName) return 0 /* Unknown */; if (location) { location = getParseTreeNode(location); if (!location) return 0 /* Unknown */; } let isTypeOnly = false; if (isQualifiedName(typeName)) { const rootValueSymbol = resolveEntityName( getFirstIdentifier(typeName), 111551 /* Value */, /*ignoreErrors*/ true, /*dontResolveAlias*/ true, location ); isTypeOnly = !!((_a = rootValueSymbol == null ? void 0 : rootValueSymbol.declarations) == null ? void 0 : _a.every(isTypeOnlyImportOrExportDeclaration)); } const valueSymbol = resolveEntityName( typeName, 111551 /* Value */, /*ignoreErrors*/ true, /*dontResolveAlias*/ true, location ); const resolvedValueSymbol = valueSymbol && valueSymbol.flags & 2097152 /* Alias */ ? resolveAlias(valueSymbol) : valueSymbol; isTypeOnly || (isTypeOnly = !!(valueSymbol && getTypeOnlyAliasDeclaration(valueSymbol, 111551 /* Value */))); const typeSymbol = resolveEntityName( typeName, 788968 /* Type */, /*ignoreErrors*/ true, /*dontResolveAlias*/ true, location ); const resolvedTypeSymbol = typeSymbol && typeSymbol.flags & 2097152 /* Alias */ ? resolveAlias(typeSymbol) : typeSymbol; if (!valueSymbol) { isTypeOnly || (isTypeOnly = !!(typeSymbol && getTypeOnlyAliasDeclaration(typeSymbol, 788968 /* Type */))); } if (resolvedValueSymbol && resolvedValueSymbol === resolvedTypeSymbol) { const globalPromiseSymbol = getGlobalPromiseConstructorSymbol( /*reportErrors*/ false ); if (globalPromiseSymbol && resolvedValueSymbol === globalPromiseSymbol) { return 9 /* Promise */; } const constructorType = getTypeOfSymbol(resolvedValueSymbol); if (constructorType && isConstructorType(constructorType)) { return isTypeOnly ? 10 /* TypeWithCallSignature */ : 1 /* TypeWithConstructSignatureAndValue */; } } if (!resolvedTypeSymbol) { return isTypeOnly ? 11 /* ObjectType */ : 0 /* Unknown */; } const type = getDeclaredTypeOfSymbol(resolvedTypeSymbol); if (isErrorType(type)) { return isTypeOnly ? 11 /* ObjectType */ : 0 /* Unknown */; } else if (type.flags & 3 /* AnyOrUnknown */) { return 11 /* ObjectType */; } else if (isTypeAssignableToKind(type, 16384 /* Void */ | 98304 /* Nullable */ | 131072 /* Never */)) { return 2 /* VoidNullableOrNeverType */; } else if (isTypeAssignableToKind(type, 528 /* BooleanLike */)) { return 6 /* BooleanType */; } else if (isTypeAssignableToKind(type, 296 /* NumberLike */)) { return 3 /* NumberLikeType */; } else if (isTypeAssignableToKind(type, 2112 /* BigIntLike */)) { return 4 /* BigIntLikeType */; } else if (isTypeAssignableToKind(type, 402653316 /* StringLike */)) { return 5 /* StringLikeType */; } else if (isTupleType(type)) { return 7 /* ArrayLikeType */; } else if (isTypeAssignableToKind(type, 12288 /* ESSymbolLike */)) { return 8 /* ESSymbolType */; } else if (isFunctionType(type)) { return 10 /* TypeWithCallSignature */; } else if (isArrayType(type)) { return 7 /* ArrayLikeType */; } else { return 11 /* ObjectType */; } } function createTypeOfDeclaration(declarationIn, enclosingDeclaration, flags, internalFlags, tracker) { const declaration = getParseTreeNode(declarationIn, hasInferredType); if (!declaration) { return factory.createToken(133 /* AnyKeyword */); } const symbol = getSymbolOfDeclaration(declaration); return nodeBuilder.serializeTypeForDeclaration(declaration, symbol, enclosingDeclaration, flags | 1024 /* MultilineObjectLiterals */, internalFlags, tracker); } function getAllAccessorDeclarationsForDeclaration(accessor) { accessor = getParseTreeNode(accessor, isGetOrSetAccessorDeclaration); const otherKind = accessor.kind === 179 /* SetAccessor */ ? 178 /* GetAccessor */ : 179 /* SetAccessor */; const otherAccessor = getDeclarationOfKind(getSymbolOfDeclaration(accessor), otherKind); const firstAccessor = otherAccessor && otherAccessor.pos < accessor.pos ? otherAccessor : accessor; const secondAccessor = otherAccessor && otherAccessor.pos < accessor.pos ? accessor : otherAccessor; const setAccessor = accessor.kind === 179 /* SetAccessor */ ? accessor : otherAccessor; const getAccessor = accessor.kind === 178 /* GetAccessor */ ? accessor : otherAccessor; return { firstAccessor, secondAccessor, setAccessor, getAccessor }; } function createReturnTypeOfSignatureDeclaration(signatureDeclarationIn, enclosingDeclaration, flags, internalFlags, tracker) { const signatureDeclaration = getParseTreeNode(signatureDeclarationIn, isFunctionLike); if (!signatureDeclaration) { return factory.createToken(133 /* AnyKeyword */); } return nodeBuilder.serializeReturnTypeForSignature(signatureDeclaration, enclosingDeclaration, flags | 1024 /* MultilineObjectLiterals */, internalFlags, tracker); } function createTypeOfExpression(exprIn, enclosingDeclaration, flags, internalFlags, tracker) { const expr = getParseTreeNode(exprIn, isExpression); if (!expr) { return factory.createToken(133 /* AnyKeyword */); } return nodeBuilder.serializeTypeForExpression(expr, enclosingDeclaration, flags | 1024 /* MultilineObjectLiterals */, internalFlags, tracker); } function hasGlobalName(name) { return globals.has(escapeLeadingUnderscores(name)); } function getReferencedValueSymbol(reference, startInDeclarationContainer) { const resolvedSymbol = getNodeLinks(reference).resolvedSymbol; if (resolvedSymbol) { return resolvedSymbol; } let location = reference; if (startInDeclarationContainer) { const parent = reference.parent; if (isDeclaration(parent) && reference === parent.name) { location = getDeclarationContainer(parent); } } return resolveName( location, reference.escapedText, 111551 /* Value */ | 1048576 /* ExportValue */ | 2097152 /* Alias */, /*nameNotFoundMessage*/ void 0, /*isUse*/ true ); } function getReferencedValueOrAliasSymbol(reference) { const resolvedSymbol = getNodeLinks(reference).resolvedSymbol; if (resolvedSymbol && resolvedSymbol !== unknownSymbol) { return resolvedSymbol; } return resolveName( reference, reference.escapedText, 111551 /* Value */ | 1048576 /* ExportValue */ | 2097152 /* Alias */, /*nameNotFoundMessage*/ void 0, /*isUse*/ true, /*excludeGlobals*/ void 0 ); } function getReferencedValueDeclaration(referenceIn) { if (!isGeneratedIdentifier(referenceIn)) { const reference = getParseTreeNode(referenceIn, isIdentifier); if (reference) { const symbol = getReferencedValueSymbol(reference); if (symbol) { return getExportSymbolOfValueSymbolIfExported(symbol).valueDeclaration; } } } return void 0; } function getReferencedValueDeclarations(referenceIn) { if (!isGeneratedIdentifier(referenceIn)) { const reference = getParseTreeNode(referenceIn, isIdentifier); if (reference) { const symbol = getReferencedValueSymbol(reference); if (symbol) { return filter(getExportSymbolOfValueSymbolIfExported(symbol).declarations, (declaration) => { switch (declaration.kind) { case 261 /* VariableDeclaration */: case 170 /* Parameter */: case 209 /* BindingElement */: case 173 /* PropertyDeclaration */: case 304 /* PropertyAssignment */: case 305 /* ShorthandPropertyAssignment */: case 307 /* EnumMember */: case 211 /* ObjectLiteralExpression */: case 263 /* FunctionDeclaration */: case 219 /* FunctionExpression */: case 220 /* ArrowFunction */: case 264 /* ClassDeclaration */: case 232 /* ClassExpression */: case 267 /* EnumDeclaration */: case 175 /* MethodDeclaration */: case 178 /* GetAccessor */: case 179 /* SetAccessor */: case 268 /* ModuleDeclaration */: return true; } return false; }); } } } return void 0; } function isLiteralConstDeclaration(node) { if (isDeclarationReadonly(node) || isVariableDeclaration(node) && isVarConstLike2(node)) { return isFreshLiteralType(getTypeOfSymbol(getSymbolOfDeclaration(node))); } return false; } function literalTypeToNode(type, enclosing, tracker) { const enumResult = type.flags & 1056 /* EnumLike */ ? nodeBuilder.symbolToExpression( type.symbol, 111551 /* Value */, enclosing, /*flags*/ void 0, /*internalFlags*/ void 0, tracker ) : type === trueType ? factory.createTrue() : type === falseType && factory.createFalse(); if (enumResult) return enumResult; const literalValue = type.value; return typeof literalValue === "object" ? factory.createBigIntLiteral(literalValue) : typeof literalValue === "string" ? factory.createStringLiteral(literalValue) : literalValue < 0 ? factory.createPrefixUnaryExpression(41 /* MinusToken */, factory.createNumericLiteral(-literalValue)) : factory.createNumericLiteral(literalValue); } function createLiteralConstValue(node, tracker) { const type = getTypeOfSymbol(getSymbolOfDeclaration(node)); return literalTypeToNode(type, node, tracker); } function getJsxFactoryEntity(location) { return location ? (getJsxNamespace(location), getSourceFileOfNode(location).localJsxFactory || _jsxFactoryEntity) : _jsxFactoryEntity; } function getJsxFragmentFactoryEntity(location) { if (location) { const file = getSourceFileOfNode(location); if (file) { if (file.localJsxFragmentFactory) { return file.localJsxFragmentFactory; } const jsxFragPragmas = file.pragmas.get("jsxfrag"); const jsxFragPragma = isArray(jsxFragPragmas) ? jsxFragPragmas[0] : jsxFragPragmas; if (jsxFragPragma) { file.localJsxFragmentFactory = parseIsolatedEntityName(jsxFragPragma.arguments.factory, languageVersion); return file.localJsxFragmentFactory; } } } if (compilerOptions.jsxFragmentFactory) { return parseIsolatedEntityName(compilerOptions.jsxFragmentFactory, languageVersion); } } function getNonlocalEffectiveTypeAnnotationNode(node) { const direct = getEffectiveTypeAnnotationNode(node); if (direct) { return direct; } if (node.kind === 170 /* Parameter */ && node.parent.kind === 179 /* SetAccessor */) { const other = getAllAccessorDeclarationsForDeclaration(node.parent).getAccessor; if (other) { return getEffectiveReturnTypeNode(other); } } return void 0; } function createResolver() { return { getReferencedExportContainer, getReferencedImportDeclaration, getReferencedDeclarationWithCollidingName, isDeclarationWithCollidingName, isValueAliasDeclaration: (nodeIn) => { const node = getParseTreeNode(nodeIn); return node && canCollectSymbolAliasAccessabilityData ? isValueAliasDeclaration(node) : true; }, hasGlobalName, isReferencedAliasDeclaration: (nodeIn, checkChildren) => { const node = getParseTreeNode(nodeIn); return node && canCollectSymbolAliasAccessabilityData ? isReferencedAliasDeclaration(node, checkChildren) : true; }, hasNodeCheckFlag: (nodeIn, flag) => { const node = getParseTreeNode(nodeIn); if (!node) return false; return hasNodeCheckFlag(node, flag); }, isTopLevelValueImportEqualsWithEntityName, isDeclarationVisible, isImplementationOfOverload, requiresAddingImplicitUndefined, isExpandoFunctionDeclaration, getPropertiesOfContainerFunction, createTypeOfDeclaration, createReturnTypeOfSignatureDeclaration, createTypeOfExpression, createLiteralConstValue, isSymbolAccessible, isEntityNameVisible, getConstantValue: (nodeIn) => { const node = getParseTreeNode(nodeIn, canHaveConstantValue); return node ? getConstantValue2(node) : void 0; }, getEnumMemberValue: (nodeIn) => { const node = getParseTreeNode(nodeIn, isEnumMember); return node ? getEnumMemberValue(node) : void 0; }, collectLinkedAliases, markLinkedReferences: (nodeIn) => { const node = getParseTreeNode(nodeIn); return node && markLinkedReferences(node, 0 /* Unspecified */); }, getReferencedValueDeclaration, getReferencedValueDeclarations, getTypeReferenceSerializationKind, isOptionalParameter, isArgumentsLocalBinding, getExternalModuleFileFromDeclaration: (nodeIn) => { const node = getParseTreeNode(nodeIn, hasPossibleExternalModuleReference); return node && getExternalModuleFileFromDeclaration(node); }, isLiteralConstDeclaration, isLateBound: (nodeIn) => { const node = getParseTreeNode(nodeIn, isDeclaration); const symbol = node && getSymbolOfDeclaration(node); return !!(symbol && getCheckFlags(symbol) & 4096 /* Late */); }, getJsxFactoryEntity, getJsxFragmentFactoryEntity, isBindingCapturedByNode: (node, decl) => { const parseNode = getParseTreeNode(node); const parseDecl = getParseTreeNode(decl); return !!parseNode && !!parseDecl && (isVariableDeclaration(parseDecl) || isBindingElement(parseDecl)) && isBindingCapturedByNode(parseNode, parseDecl); }, getDeclarationStatementsForSourceFile: (node, flags, internalFlags, tracker) => { const n = getParseTreeNode(node); Debug.assert(n && n.kind === 308 /* SourceFile */, "Non-sourcefile node passed into getDeclarationsForSourceFile"); const sym = getSymbolOfDeclaration(node); if (!sym) { return !node.locals ? [] : nodeBuilder.symbolTableToDeclarationStatements(node.locals, node, flags, internalFlags, tracker); } resolveExternalModuleSymbol(sym); return !sym.exports ? [] : nodeBuilder.symbolTableToDeclarationStatements(sym.exports, node, flags, internalFlags, tracker); }, isImportRequiredByAugmentation, isDefinitelyReferenceToGlobalSymbolObject, createLateBoundIndexSignatures: (cls, enclosing, flags, internalFlags, tracker) => { const sym = cls.symbol; const staticInfos = getIndexInfosOfType(getTypeOfSymbol(sym)); const instanceIndexSymbol = getIndexSymbol(sym); const instanceInfos = instanceIndexSymbol && getIndexInfosOfIndexSymbol(instanceIndexSymbol, arrayFrom(getMembersOfSymbol(sym).values())); let result; for (const infoList of [staticInfos, instanceInfos]) { if (!length(infoList)) continue; result || (result = []); for (const info of infoList) { if (info.declaration) continue; if (info === anyBaseTypeIndexInfo) continue; if (info.components) { const allComponentComputedNamesSerializable = every(info.components, (e) => { var _a; return !!(e.name && isComputedPropertyName(e.name) && isEntityNameExpression(e.name.expression) && enclosing && ((_a = isEntityNameVisible( e.name.expression, enclosing, /*shouldComputeAliasToMakeVisible*/ false )) == null ? void 0 : _a.accessibility) === 0 /* Accessible */); }); if (allComponentComputedNamesSerializable) { const newComponents = filter(info.components, (e) => { return !hasLateBindableName(e); }); result.push(...map(newComponents, (e) => { trackComputedName(e.name.expression); const mods = infoList === staticInfos ? [factory.createModifier(126 /* StaticKeyword */)] : void 0; return factory.createPropertyDeclaration( append(mods, info.isReadonly ? factory.createModifier(148 /* ReadonlyKeyword */) : void 0), e.name, (isPropertySignature(e) || isPropertyDeclaration(e) || isMethodSignature(e) || isMethodDeclaration(e) || isGetAccessor(e) || isSetAccessor(e)) && e.questionToken ? factory.createToken(58 /* QuestionToken */) : void 0, nodeBuilder.typeToTypeNode(getTypeOfSymbol(e.symbol), enclosing, flags, internalFlags, tracker), /*initializer*/ void 0 ); })); continue; } } const node = nodeBuilder.indexInfoToIndexSignatureDeclaration(info, enclosing, flags, internalFlags, tracker); if (node && infoList === staticInfos) { (node.modifiers || (node.modifiers = factory.createNodeArray())).unshift(factory.createModifier(126 /* StaticKeyword */)); } if (node) { result.push(node); } } } return result; function trackComputedName(accessExpression) { if (!tracker.trackSymbol) return; const firstIdentifier = getFirstIdentifier(accessExpression); const name = resolveName( firstIdentifier, firstIdentifier.escapedText, 111551 /* Value */ | 1048576 /* ExportValue */, /*nameNotFoundMessage*/ void 0, /*isUse*/ true ); if (name) { tracker.trackSymbol(name, enclosing, 111551 /* Value */); } } }, symbolToDeclarations: (symbol, meaning, flags, maximumLength, verbosityLevel, out) => { return nodeBuilder.symbolToDeclarations(symbol, meaning, flags, maximumLength, verbosityLevel, out); } }; function isImportRequiredByAugmentation(node) { const file = getSourceFileOfNode(node); if (!file.symbol) return false; const importTarget = getExternalModuleFileFromDeclaration(node); if (!importTarget) return false; if (importTarget === file) return false; const exports2 = getExportsOfModule(file.symbol); for (const s of arrayFrom(exports2.values())) { if (s.mergeId) { const merged = getMergedSymbol(s); if (merged.declarations) { for (const d of merged.declarations) { const declFile = getSourceFileOfNode(d); if (declFile === importTarget) { return true; } } } } } return false; } } function getExternalModuleFileFromDeclaration(declaration) { const specifier = declaration.kind === 268 /* ModuleDeclaration */ ? tryCast(declaration.name, isStringLiteral) : getExternalModuleName(declaration); const moduleSymbol = resolveExternalModuleNameWorker( specifier, specifier, /*moduleNotFoundError*/ void 0 ); if (!moduleSymbol) { return void 0; } return getDeclarationOfKind(moduleSymbol, 308 /* SourceFile */); } function initializeTypeChecker() { for (const file of host.getSourceFiles()) { bindSourceFile(file, compilerOptions); } amalgamatedDuplicates = /* @__PURE__ */ new Map(); let augmentations; for (const file of host.getSourceFiles()) { if (file.redirectInfo) { continue; } if (!isExternalOrCommonJsModule(file)) { const fileGlobalThisSymbol = file.locals.get("globalThis"); if (fileGlobalThisSymbol == null ? void 0 : fileGlobalThisSymbol.declarations) { for (const declaration of fileGlobalThisSymbol.declarations) { diagnostics.add(createDiagnosticForNode(declaration, Diagnostics.Declaration_name_conflicts_with_built_in_global_identifier_0, "globalThis")); } } mergeSymbolTable(globals, file.locals); } if (file.jsGlobalAugmentations) { mergeSymbolTable(globals, file.jsGlobalAugmentations); } if (file.patternAmbientModules && file.patternAmbientModules.length) { patternAmbientModules = concatenate(patternAmbientModules, file.patternAmbientModules); } if (file.moduleAugmentations.length) { (augmentations || (augmentations = [])).push(file.moduleAugmentations); } if (file.symbol && file.symbol.globalExports) { const source = file.symbol.globalExports; source.forEach((sourceSymbol, id) => { if (!globals.has(id)) { globals.set(id, sourceSymbol); } }); } } if (augmentations) { for (const list of augmentations) { for (const augmentation of list) { if (!isGlobalScopeAugmentation(augmentation.parent)) continue; mergeModuleAugmentation(augmentation); } } } addUndefinedToGlobalsOrErrorOnRedeclaration(); getSymbolLinks(undefinedSymbol).type = undefinedWideningType; getSymbolLinks(argumentsSymbol).type = getGlobalType( "IArguments", /*arity*/ 0, /*reportErrors*/ true ); getSymbolLinks(unknownSymbol).type = errorType; getSymbolLinks(globalThisSymbol).type = createObjectType(16 /* Anonymous */, globalThisSymbol); globalArrayType = getGlobalType( "Array", /*arity*/ 1, /*reportErrors*/ true ); globalObjectType = getGlobalType( "Object", /*arity*/ 0, /*reportErrors*/ true ); globalFunctionType = getGlobalType( "Function", /*arity*/ 0, /*reportErrors*/ true ); globalCallableFunctionType = strictBindCallApply && getGlobalType( "CallableFunction", /*arity*/ 0, /*reportErrors*/ true ) || globalFunctionType; globalNewableFunctionType = strictBindCallApply && getGlobalType( "NewableFunction", /*arity*/ 0, /*reportErrors*/ true ) || globalFunctionType; globalStringType = getGlobalType( "String", /*arity*/ 0, /*reportErrors*/ true ); globalNumberType = getGlobalType( "Number", /*arity*/ 0, /*reportErrors*/ true ); globalBooleanType = getGlobalType( "Boolean", /*arity*/ 0, /*reportErrors*/ true ); globalRegExpType = getGlobalType( "RegExp", /*arity*/ 0, /*reportErrors*/ true ); anyArrayType = createArrayType(anyType); autoArrayType = createArrayType(autoType); if (autoArrayType === emptyObjectType) { autoArrayType = createAnonymousType( /*symbol*/ void 0, emptySymbols, emptyArray, emptyArray, emptyArray ); } globalReadonlyArrayType = getGlobalTypeOrUndefined( "ReadonlyArray", /*arity*/ 1 ) || globalArrayType; anyReadonlyArrayType = globalReadonlyArrayType ? createTypeFromGenericGlobalType(globalReadonlyArrayType, [anyType]) : anyArrayType; globalThisType = getGlobalTypeOrUndefined( "ThisType", /*arity*/ 1 ); if (augmentations) { for (const list of augmentations) { for (const augmentation of list) { if (isGlobalScopeAugmentation(augmentation.parent)) continue; mergeModuleAugmentation(augmentation); } } } amalgamatedDuplicates.forEach(({ firstFile, secondFile, conflictingSymbols }) => { if (conflictingSymbols.size < 8) { conflictingSymbols.forEach(({ isBlockScoped, firstFileLocations, secondFileLocations }, symbolName2) => { const message = isBlockScoped ? Diagnostics.Cannot_redeclare_block_scoped_variable_0 : Diagnostics.Duplicate_identifier_0; for (const node of firstFileLocations) { addDuplicateDeclarationError(node, message, symbolName2, secondFileLocations); } for (const node of secondFileLocations) { addDuplicateDeclarationError(node, message, symbolName2, firstFileLocations); } }); } else { const list = arrayFrom(conflictingSymbols.keys()).join(", "); diagnostics.add(addRelatedInfo( createDiagnosticForNode(firstFile, Diagnostics.Definitions_of_the_following_identifiers_conflict_with_those_in_another_file_Colon_0, list), createDiagnosticForNode(secondFile, Diagnostics.Conflicts_are_in_this_file) )); diagnostics.add(addRelatedInfo( createDiagnosticForNode(secondFile, Diagnostics.Definitions_of_the_following_identifiers_conflict_with_those_in_another_file_Colon_0, list), createDiagnosticForNode(firstFile, Diagnostics.Conflicts_are_in_this_file) )); } }); amalgamatedDuplicates = void 0; } function checkExternalEmitHelpers(location, helpers) { if (compilerOptions.importHelpers) { const sourceFile = getSourceFileOfNode(location); if (isEffectiveExternalModule(sourceFile, compilerOptions) && !(location.flags & 33554432 /* Ambient */)) { const helpersModule = resolveHelpersModule(sourceFile, location); if (helpersModule !== unknownSymbol) { const links = getSymbolLinks(helpersModule); links.requestedExternalEmitHelpers ?? (links.requestedExternalEmitHelpers = 0); if ((links.requestedExternalEmitHelpers & helpers) !== helpers) { const uncheckedHelpers = helpers & ~links.requestedExternalEmitHelpers; for (let helper = 1 /* FirstEmitHelper */; helper <= 16777216 /* LastEmitHelper */; helper <<= 1) { if (uncheckedHelpers & helper) { for (const name of getHelperNames(helper)) { const symbol = resolveSymbol(getSymbol(getExportsOfModule(helpersModule), escapeLeadingUnderscores(name), 111551 /* Value */)); if (!symbol) { error(location, Diagnostics.This_syntax_requires_an_imported_helper_named_1_which_does_not_exist_in_0_Consider_upgrading_your_version_of_0, externalHelpersModuleNameText, name); } else if (helper & 524288 /* ClassPrivateFieldGet */) { if (!some(getSignaturesOfSymbol(symbol), (signature) => getParameterCount(signature) > 3)) { error(location, Diagnostics.This_syntax_requires_an_imported_helper_named_1_with_2_parameters_which_is_not_compatible_with_the_one_in_0_Consider_upgrading_your_version_of_0, externalHelpersModuleNameText, name, 4); } } else if (helper & 1048576 /* ClassPrivateFieldSet */) { if (!some(getSignaturesOfSymbol(symbol), (signature) => getParameterCount(signature) > 4)) { error(location, Diagnostics.This_syntax_requires_an_imported_helper_named_1_with_2_parameters_which_is_not_compatible_with_the_one_in_0_Consider_upgrading_your_version_of_0, externalHelpersModuleNameText, name, 5); } } else if (helper & 1024 /* SpreadArray */) { if (!some(getSignaturesOfSymbol(symbol), (signature) => getParameterCount(signature) > 2)) { error(location, Diagnostics.This_syntax_requires_an_imported_helper_named_1_with_2_parameters_which_is_not_compatible_with_the_one_in_0_Consider_upgrading_your_version_of_0, externalHelpersModuleNameText, name, 3); } } } } } } links.requestedExternalEmitHelpers |= helpers; } } } } function getHelperNames(helper) { switch (helper) { case 1 /* Extends */: return ["__extends"]; case 2 /* Assign */: return ["__assign"]; case 4 /* Rest */: return ["__rest"]; case 8 /* Decorate */: return legacyDecorators ? ["__decorate"] : ["__esDecorate", "__runInitializers"]; case 16 /* Metadata */: return ["__metadata"]; case 32 /* Param */: return ["__param"]; case 64 /* Awaiter */: return ["__awaiter"]; case 128 /* Generator */: return ["__generator"]; case 256 /* Values */: return ["__values"]; case 512 /* Read */: return ["__read"]; case 1024 /* SpreadArray */: return ["__spreadArray"]; case 2048 /* Await */: return ["__await"]; case 4096 /* AsyncGenerator */: return ["__asyncGenerator"]; case 8192 /* AsyncDelegator */: return ["__asyncDelegator"]; case 16384 /* AsyncValues */: return ["__asyncValues"]; case 32768 /* ExportStar */: return ["__exportStar"]; case 65536 /* ImportStar */: return ["__importStar"]; case 131072 /* ImportDefault */: return ["__importDefault"]; case 262144 /* MakeTemplateObject */: return ["__makeTemplateObject"]; case 524288 /* ClassPrivateFieldGet */: return ["__classPrivateFieldGet"]; case 1048576 /* ClassPrivateFieldSet */: return ["__classPrivateFieldSet"]; case 2097152 /* ClassPrivateFieldIn */: return ["__classPrivateFieldIn"]; case 4194304 /* SetFunctionName */: return ["__setFunctionName"]; case 8388608 /* PropKey */: return ["__propKey"]; case 16777216 /* AddDisposableResourceAndDisposeResources */: return ["__addDisposableResource", "__disposeResources"]; case 33554432 /* RewriteRelativeImportExtension */: return ["__rewriteRelativeImportExtension"]; default: return Debug.fail("Unrecognized helper"); } } function resolveHelpersModule(file, errorNode) { const links = getNodeLinks(file); if (!links.externalHelpersModule) { links.externalHelpersModule = resolveExternalModule(getImportHelpersImportSpecifier(file), externalHelpersModuleNameText, Diagnostics.This_syntax_requires_an_imported_helper_but_module_0_cannot_be_found, errorNode) || unknownSymbol; } return links.externalHelpersModule; } function checkGrammarModifiers(node) { var _a; const quickResult = reportObviousDecoratorErrors(node) || reportObviousModifierErrors(node); if (quickResult !== void 0) { return quickResult; } if (isParameter(node) && parameterIsThisKeyword(node)) { return grammarErrorOnFirstToken(node, Diagnostics.Neither_decorators_nor_modifiers_may_be_applied_to_this_parameters); } const blockScopeKind = isVariableStatement(node) ? node.declarationList.flags & 7 /* BlockScoped */ : 0 /* None */; let lastStatic, lastDeclare, lastAsync, lastOverride, firstDecorator; let flags = 0 /* None */; let sawExportBeforeDecorators = false; let hasLeadingDecorators = false; for (const modifier of node.modifiers) { if (isDecorator(modifier)) { if (!nodeCanBeDecorated(legacyDecorators, node, node.parent, node.parent.parent)) { if (node.kind === 175 /* MethodDeclaration */ && !nodeIsPresent(node.body)) { return grammarErrorOnFirstToken(node, Diagnostics.A_decorator_can_only_decorate_a_method_implementation_not_an_overload); } else { return grammarErrorOnFirstToken(node, Diagnostics.Decorators_are_not_valid_here); } } else if (legacyDecorators && (node.kind === 178 /* GetAccessor */ || node.kind === 179 /* SetAccessor */)) { const accessors = getAllAccessorDeclarationsForDeclaration(node); if (hasDecorators(accessors.firstAccessor) && node === accessors.secondAccessor) { return grammarErrorOnFirstToken(node, Diagnostics.Decorators_cannot_be_applied_to_multiple_get_Slashset_accessors_of_the_same_name); } } if (flags & ~(2080 /* ExportDefault */ | 32768 /* Decorator */)) { return grammarErrorOnNode(modifier, Diagnostics.Decorators_are_not_valid_here); } if (hasLeadingDecorators && flags & 98303 /* Modifier */) { Debug.assertIsDefined(firstDecorator); const sourceFile = getSourceFileOfNode(modifier); if (!hasParseDiagnostics(sourceFile)) { addRelatedInfo( error(modifier, Diagnostics.Decorators_may_not_appear_after_export_or_export_default_if_they_also_appear_before_export), createDiagnosticForNode(firstDecorator, Diagnostics.Decorator_used_before_export_here) ); return true; } return false; } flags |= 32768 /* Decorator */; if (!(flags & 98303 /* Modifier */)) { hasLeadingDecorators = true; } else if (flags & 32 /* Export */) { sawExportBeforeDecorators = true; } firstDecorator ?? (firstDecorator = modifier); } else { if (modifier.kind !== 148 /* ReadonlyKeyword */) { if (node.kind === 172 /* PropertySignature */ || node.kind === 174 /* MethodSignature */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_type_member, tokenToString(modifier.kind)); } if (node.kind === 182 /* IndexSignature */ && (modifier.kind !== 126 /* StaticKeyword */ || !isClassLike(node.parent))) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_an_index_signature, tokenToString(modifier.kind)); } } if (modifier.kind !== 103 /* InKeyword */ && modifier.kind !== 147 /* OutKeyword */ && modifier.kind !== 87 /* ConstKeyword */) { if (node.kind === 169 /* TypeParameter */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_type_parameter, tokenToString(modifier.kind)); } } switch (modifier.kind) { case 87 /* ConstKeyword */: { if (node.kind !== 267 /* EnumDeclaration */ && node.kind !== 169 /* TypeParameter */) { return grammarErrorOnNode(node, Diagnostics.A_class_member_cannot_have_the_0_keyword, tokenToString(87 /* ConstKeyword */)); } const parent = isJSDocTemplateTag(node.parent) && getEffectiveJSDocHost(node.parent) || node.parent; if (node.kind === 169 /* TypeParameter */ && !(isFunctionLikeDeclaration(parent) || isClassLike(parent) || isFunctionTypeNode(parent) || isConstructorTypeNode(parent) || isCallSignatureDeclaration(parent) || isConstructSignatureDeclaration(parent) || isMethodSignature(parent))) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_can_only_appear_on_a_type_parameter_of_a_function_method_or_class, tokenToString(modifier.kind)); } break; } case 164 /* OverrideKeyword */: if (flags & 16 /* Override */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "override"); } else if (flags & 128 /* Ambient */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "override", "declare"); } else if (flags & 8 /* Readonly */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "override", "readonly"); } else if (flags & 512 /* Accessor */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "override", "accessor"); } else if (flags & 1024 /* Async */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "override", "async"); } flags |= 16 /* Override */; lastOverride = modifier; break; case 125 /* PublicKeyword */: case 124 /* ProtectedKeyword */: case 123 /* PrivateKeyword */: const text = visibilityToString(modifierToFlag(modifier.kind)); if (flags & 7 /* AccessibilityModifier */) { return grammarErrorOnNode(modifier, Diagnostics.Accessibility_modifier_already_seen); } else if (flags & 16 /* Override */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "override"); } else if (flags & 256 /* Static */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "static"); } else if (flags & 512 /* Accessor */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "accessor"); } else if (flags & 8 /* Readonly */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "readonly"); } else if (flags & 1024 /* Async */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "async"); } else if (node.parent.kind === 269 /* ModuleBlock */ || node.parent.kind === 308 /* SourceFile */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_module_or_namespace_element, text); } else if (flags & 64 /* Abstract */) { if (modifier.kind === 123 /* PrivateKeyword */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, text, "abstract"); } else { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "abstract"); } } else if (isPrivateIdentifierClassElementDeclaration(node)) { return grammarErrorOnNode(modifier, Diagnostics.An_accessibility_modifier_cannot_be_used_with_a_private_identifier); } flags |= modifierToFlag(modifier.kind); break; case 126 /* StaticKeyword */: if (flags & 256 /* Static */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "static"); } else if (flags & 8 /* Readonly */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "static", "readonly"); } else if (flags & 1024 /* Async */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "static", "async"); } else if (flags & 512 /* Accessor */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "static", "accessor"); } else if (node.parent.kind === 269 /* ModuleBlock */ || node.parent.kind === 308 /* SourceFile */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_module_or_namespace_element, "static"); } else if (node.kind === 170 /* Parameter */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_parameter, "static"); } else if (flags & 64 /* Abstract */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "static", "abstract"); } else if (flags & 16 /* Override */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "static", "override"); } flags |= 256 /* Static */; lastStatic = modifier; break; case 129 /* AccessorKeyword */: if (flags & 512 /* Accessor */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "accessor"); } else if (flags & 8 /* Readonly */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "accessor", "readonly"); } else if (flags & 128 /* Ambient */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "accessor", "declare"); } else if (node.kind !== 173 /* PropertyDeclaration */) { return grammarErrorOnNode(modifier, Diagnostics.accessor_modifier_can_only_appear_on_a_property_declaration); } flags |= 512 /* Accessor */; break; case 148 /* ReadonlyKeyword */: if (flags & 8 /* Readonly */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "readonly"); } else if (node.kind !== 173 /* PropertyDeclaration */ && node.kind !== 172 /* PropertySignature */ && node.kind !== 182 /* IndexSignature */ && node.kind !== 170 /* Parameter */) { return grammarErrorOnNode(modifier, Diagnostics.readonly_modifier_can_only_appear_on_a_property_declaration_or_index_signature); } else if (flags & 512 /* Accessor */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "readonly", "accessor"); } flags |= 8 /* Readonly */; break; case 95 /* ExportKeyword */: if (compilerOptions.verbatimModuleSyntax && !(node.flags & 33554432 /* Ambient */) && node.kind !== 266 /* TypeAliasDeclaration */ && node.kind !== 265 /* InterfaceDeclaration */ && // ModuleDeclaration needs to be checked that it is uninstantiated later node.kind !== 268 /* ModuleDeclaration */ && node.parent.kind === 308 /* SourceFile */ && host.getEmitModuleFormatOfFile(getSourceFileOfNode(node)) === 1 /* CommonJS */) { return grammarErrorOnNode(modifier, Diagnostics.A_top_level_export_modifier_cannot_be_used_on_value_declarations_in_a_CommonJS_module_when_verbatimModuleSyntax_is_enabled); } if (flags & 32 /* Export */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "export"); } else if (flags & 128 /* Ambient */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "export", "declare"); } else if (flags & 64 /* Abstract */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "export", "abstract"); } else if (flags & 1024 /* Async */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "export", "async"); } else if (isClassLike(node.parent)) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_class_elements_of_this_kind, "export"); } else if (node.kind === 170 /* Parameter */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_parameter, "export"); } else if (blockScopeKind === 4 /* Using */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_using_declaration, "export"); } else if (blockScopeKind === 6 /* AwaitUsing */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_an_await_using_declaration, "export"); } flags |= 32 /* Export */; break; case 90 /* DefaultKeyword */: const container = node.parent.kind === 308 /* SourceFile */ ? node.parent : node.parent.parent; if (container.kind === 268 /* ModuleDeclaration */ && !isAmbientModule(container)) { return grammarErrorOnNode(modifier, Diagnostics.A_default_export_can_only_be_used_in_an_ECMAScript_style_module); } else if (blockScopeKind === 4 /* Using */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_using_declaration, "default"); } else if (blockScopeKind === 6 /* AwaitUsing */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_an_await_using_declaration, "default"); } else if (!(flags & 32 /* Export */)) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "export", "default"); } else if (sawExportBeforeDecorators) { return grammarErrorOnNode(firstDecorator, Diagnostics.Decorators_are_not_valid_here); } flags |= 2048 /* Default */; break; case 138 /* DeclareKeyword */: if (flags & 128 /* Ambient */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "declare"); } else if (flags & 1024 /* Async */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_in_an_ambient_context, "async"); } else if (flags & 16 /* Override */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_in_an_ambient_context, "override"); } else if (isClassLike(node.parent) && !isPropertyDeclaration(node)) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_class_elements_of_this_kind, "declare"); } else if (node.kind === 170 /* Parameter */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_parameter, "declare"); } else if (blockScopeKind === 4 /* Using */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_using_declaration, "declare"); } else if (blockScopeKind === 6 /* AwaitUsing */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_an_await_using_declaration, "declare"); } else if (node.parent.flags & 33554432 /* Ambient */ && node.parent.kind === 269 /* ModuleBlock */) { return grammarErrorOnNode(modifier, Diagnostics.A_declare_modifier_cannot_be_used_in_an_already_ambient_context); } else if (isPrivateIdentifierClassElementDeclaration(node)) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_a_private_identifier, "declare"); } else if (flags & 512 /* Accessor */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "declare", "accessor"); } flags |= 128 /* Ambient */; lastDeclare = modifier; break; case 128 /* AbstractKeyword */: if (flags & 64 /* Abstract */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "abstract"); } if (node.kind !== 264 /* ClassDeclaration */ && node.kind !== 186 /* ConstructorType */) { if (node.kind !== 175 /* MethodDeclaration */ && node.kind !== 173 /* PropertyDeclaration */ && node.kind !== 178 /* GetAccessor */ && node.kind !== 179 /* SetAccessor */) { return grammarErrorOnNode(modifier, Diagnostics.abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration); } if (!(node.parent.kind === 264 /* ClassDeclaration */ && hasSyntacticModifier(node.parent, 64 /* Abstract */))) { const message = node.kind === 173 /* PropertyDeclaration */ ? Diagnostics.Abstract_properties_can_only_appear_within_an_abstract_class : Diagnostics.Abstract_methods_can_only_appear_within_an_abstract_class; return grammarErrorOnNode(modifier, message); } if (flags & 256 /* Static */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "static", "abstract"); } if (flags & 2 /* Private */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "private", "abstract"); } if (flags & 1024 /* Async */ && lastAsync) { return grammarErrorOnNode(lastAsync, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "async", "abstract"); } if (flags & 16 /* Override */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "abstract", "override"); } if (flags & 512 /* Accessor */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "abstract", "accessor"); } } if (isNamedDeclaration(node) && node.name.kind === 81 /* PrivateIdentifier */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_a_private_identifier, "abstract"); } flags |= 64 /* Abstract */; break; case 134 /* AsyncKeyword */: if (flags & 1024 /* Async */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "async"); } else if (flags & 128 /* Ambient */ || node.parent.flags & 33554432 /* Ambient */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_in_an_ambient_context, "async"); } else if (node.kind === 170 /* Parameter */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_parameter, "async"); } if (flags & 64 /* Abstract */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "async", "abstract"); } flags |= 1024 /* Async */; lastAsync = modifier; break; case 103 /* InKeyword */: case 147 /* OutKeyword */: { const inOutFlag = modifier.kind === 103 /* InKeyword */ ? 8192 /* In */ : 16384 /* Out */; const inOutText = modifier.kind === 103 /* InKeyword */ ? "in" : "out"; const parent = isJSDocTemplateTag(node.parent) && (getEffectiveJSDocHost(node.parent) || find((_a = getJSDocRoot(node.parent)) == null ? void 0 : _a.tags, isJSDocTypedefTag)) || node.parent; if (node.kind !== 169 /* TypeParameter */ || parent && !(isInterfaceDeclaration(parent) || isClassLike(parent) || isTypeAliasDeclaration(parent) || isJSDocTypedefTag(parent))) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_can_only_appear_on_a_type_parameter_of_a_class_interface_or_type_alias, inOutText); } if (flags & inOutFlag) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, inOutText); } if (inOutFlag & 8192 /* In */ && flags & 16384 /* Out */) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "in", "out"); } flags |= inOutFlag; break; } } } } if (node.kind === 177 /* Constructor */) { if (flags & 256 /* Static */) { return grammarErrorOnNode(lastStatic, Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "static"); } if (flags & 16 /* Override */) { return grammarErrorOnNode(lastOverride, Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "override"); } if (flags & 1024 /* Async */) { return grammarErrorOnNode(lastAsync, Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "async"); } return false; } else if ((node.kind === 273 /* ImportDeclaration */ || node.kind === 272 /* ImportEqualsDeclaration */) && flags & 128 /* Ambient */) { return grammarErrorOnNode(lastDeclare, Diagnostics.A_0_modifier_cannot_be_used_with_an_import_declaration, "declare"); } else if (node.kind === 170 /* Parameter */ && flags & 31 /* ParameterPropertyModifier */ && isBindingPattern(node.name)) { return grammarErrorOnNode(node, Diagnostics.A_parameter_property_may_not_be_declared_using_a_binding_pattern); } else if (node.kind === 170 /* Parameter */ && flags & 31 /* ParameterPropertyModifier */ && node.dotDotDotToken) { return grammarErrorOnNode(node, Diagnostics.A_parameter_property_cannot_be_declared_using_a_rest_parameter); } if (flags & 1024 /* Async */) { return checkGrammarAsyncModifier(node, lastAsync); } return false; } function reportObviousModifierErrors(node) { if (!node.modifiers) return false; const modifier = findFirstIllegalModifier(node); return modifier && grammarErrorOnFirstToken(modifier, Diagnostics.Modifiers_cannot_appear_here); } function findFirstModifierExcept(node, allowedModifier) { const modifier = find(node.modifiers, isModifier); return modifier && modifier.kind !== allowedModifier ? modifier : void 0; } function findFirstIllegalModifier(node) { switch (node.kind) { case 178 /* GetAccessor */: case 179 /* SetAccessor */: case 177 /* Constructor */: case 173 /* PropertyDeclaration */: case 172 /* PropertySignature */: case 175 /* MethodDeclaration */: case 174 /* MethodSignature */: case 182 /* IndexSignature */: case 268 /* ModuleDeclaration */: case 273 /* ImportDeclaration */: case 272 /* ImportEqualsDeclaration */: case 279 /* ExportDeclaration */: case 278 /* ExportAssignment */: case 219 /* FunctionExpression */: case 220 /* ArrowFunction */: case 170 /* Parameter */: case 169 /* TypeParameter */: return void 0; case 176 /* ClassStaticBlockDeclaration */: case 304 /* PropertyAssignment */: case 305 /* ShorthandPropertyAssignment */: case 271 /* NamespaceExportDeclaration */: case 283 /* MissingDeclaration */: return find(node.modifiers, isModifier); default: if (node.parent.kind === 269 /* ModuleBlock */ || node.parent.kind === 308 /* SourceFile */) { return void 0; } switch (node.kind) { case 263 /* FunctionDeclaration */: return findFirstModifierExcept(node, 134 /* AsyncKeyword */); case 264 /* ClassDeclaration */: case 186 /* ConstructorType */: return findFirstModifierExcept(node, 128 /* AbstractKeyword */); case 232 /* ClassExpression */: case 265 /* InterfaceDeclaration */: case 266 /* TypeAliasDeclaration */: return find(node.modifiers, isModifier); case 244 /* VariableStatement */: return node.declarationList.flags & 4 /* Using */ ? findFirstModifierExcept(node, 135 /* AwaitKeyword */) : find(node.modifiers, isModifier); case 267 /* EnumDeclaration */: return findFirstModifierExcept(node, 87 /* ConstKeyword */); default: Debug.assertNever(node); } } } function reportObviousDecoratorErrors(node) { const decorator = findFirstIllegalDecorator(node); return decorator && grammarErrorOnFirstToken(decorator, Diagnostics.Decorators_are_not_valid_here); } function findFirstIllegalDecorator(node) { return canHaveIllegalDecorators(node) ? find(node.modifiers, isDecorator) : void 0; } function checkGrammarAsyncModifier(node, asyncModifier) { switch (node.kind) { case 175 /* MethodDeclaration */: case 263 /* FunctionDeclaration */: case 219 /* FunctionExpression */: case 220 /* ArrowFunction */: return false; } return grammarErrorOnNode(asyncModifier, Diagnostics._0_modifier_cannot_be_used_here, "async"); } function checkGrammarForDisallowedTrailingComma(list, diag2 = Diagnostics.Trailing_comma_not_allowed) { if (list && list.hasTrailingComma) { return grammarErrorAtPos(list[0], list.end - ",".length, ",".length, diag2); } return false; } function checkGrammarTypeParameterList(typeParameters, file) { if (typeParameters && typeParameters.length === 0) { const start = typeParameters.pos - "<".length; const end = skipTrivia(file.text, typeParameters.end) + ">".length; return grammarErrorAtPos(file, start, end - start, Diagnostics.Type_parameter_list_cannot_be_empty); } return false; } function checkGrammarParameterList(parameters) { let seenOptionalParameter = false; const parameterCount = parameters.length; for (let i = 0; i < parameterCount; i++) { const parameter = parameters[i]; if (parameter.dotDotDotToken) { if (i !== parameterCount - 1) { return grammarErrorOnNode(parameter.dotDotDotToken, Diagnostics.A_rest_parameter_must_be_last_in_a_parameter_list); } if (!(parameter.flags & 33554432 /* Ambient */)) { checkGrammarForDisallowedTrailingComma(parameters, Diagnostics.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma); } if (parameter.questionToken) { return grammarErrorOnNode(parameter.questionToken, Diagnostics.A_rest_parameter_cannot_be_optional); } if (parameter.initializer) { return grammarErrorOnNode(parameter.name, Diagnostics.A_rest_parameter_cannot_have_an_initializer); } } else if (hasEffectiveQuestionToken(parameter)) { seenOptionalParameter = true; if (parameter.questionToken && parameter.initializer) { return grammarErrorOnNode(parameter.name, Diagnostics.Parameter_cannot_have_question_mark_and_initializer); } } else if (seenOptionalParameter && !parameter.initializer) { return grammarErrorOnNode(parameter.name, Diagnostics.A_required_parameter_cannot_follow_an_optional_parameter); } } } function getNonSimpleParameters(parameters) { return filter(parameters, (parameter) => !!parameter.initializer || isBindingPattern(parameter.name) || isRestParameter(parameter)); } function checkGrammarForUseStrictSimpleParameterList(node) { if (languageVersion >= 3 /* ES2016 */) { const useStrictDirective = node.body && isBlock(node.body) && findUseStrictPrologue(node.body.statements); if (useStrictDirective) { const nonSimpleParameters = getNonSimpleParameters(node.parameters); if (length(nonSimpleParameters)) { forEach(nonSimpleParameters, (parameter) => { addRelatedInfo( error(parameter, Diagnostics.This_parameter_is_not_allowed_with_use_strict_directive), createDiagnosticForNode(useStrictDirective, Diagnostics.use_strict_directive_used_here) ); }); const diagnostics2 = nonSimpleParameters.map((parameter, index) => index === 0 ? createDiagnosticForNode(parameter, Diagnostics.Non_simple_parameter_declared_here) : createDiagnosticForNode(parameter, Diagnostics.and_here)); addRelatedInfo(error(useStrictDirective, Diagnostics.use_strict_directive_cannot_be_used_with_non_simple_parameter_list), ...diagnostics2); return true; } } } return false; } function checkGrammarFunctionLikeDeclaration(node) { const file = getSourceFileOfNode(node); return checkGrammarModifiers(node) || checkGrammarTypeParameterList(node.typeParameters, file) || checkGrammarParameterList(node.parameters) || checkGrammarArrowFunction(node, file) || isFunctionLikeDeclaration(node) && checkGrammarForUseStrictSimpleParameterList(node); } function checkGrammarClassLikeDeclaration(node) { const file = getSourceFileOfNode(node); return checkGrammarClassDeclarationHeritageClauses(node) || checkGrammarTypeParameterList(node.typeParameters, file); } function checkGrammarArrowFunction(node, file) { if (!isArrowFunction(node)) { return false; } if (node.typeParameters && !(length(node.typeParameters) > 1 || node.typeParameters.hasTrailingComma || node.typeParameters[0].constraint)) { if (file && fileExtensionIsOneOf(file.fileName, [".mts" /* Mts */, ".cts" /* Cts */])) { grammarErrorOnNode(node.typeParameters[0], Diagnostics.This_syntax_is_reserved_in_files_with_the_mts_or_cts_extension_Add_a_trailing_comma_or_explicit_constraint); } } const { equalsGreaterThanToken } = node; const startLine = getLineAndCharacterOfPosition(file, equalsGreaterThanToken.pos).line; const endLine = getLineAndCharacterOfPosition(file, equalsGreaterThanToken.end).line; return startLine !== endLine && grammarErrorOnNode(equalsGreaterThanToken, Diagnostics.Line_terminator_not_permitted_before_arrow); } function checkGrammarIndexSignatureParameters(node) { const parameter = node.parameters[0]; if (node.parameters.length !== 1) { if (parameter) { return grammarErrorOnNode(parameter.name, Diagnostics.An_index_signature_must_have_exactly_one_parameter); } else { return grammarErrorOnNode(node, Diagnostics.An_index_signature_must_have_exactly_one_parameter); } } checkGrammarForDisallowedTrailingComma(node.parameters, Diagnostics.An_index_signature_cannot_have_a_trailing_comma); if (parameter.dotDotDotToken) { return grammarErrorOnNode(parameter.dotDotDotToken, Diagnostics.An_index_signature_cannot_have_a_rest_parameter); } if (hasEffectiveModifiers(parameter)) { return grammarErrorOnNode(parameter.name, Diagnostics.An_index_signature_parameter_cannot_have_an_accessibility_modifier); } if (parameter.questionToken) { return grammarErrorOnNode(parameter.questionToken, Diagnostics.An_index_signature_parameter_cannot_have_a_question_mark); } if (parameter.initializer) { return grammarErrorOnNode(parameter.name, Diagnostics.An_index_signature_parameter_cannot_have_an_initializer); } if (!parameter.type) { return grammarErrorOnNode(parameter.name, Diagnostics.An_index_signature_parameter_must_have_a_type_annotation); } const type = getTypeFromTypeNode(parameter.type); if (someType(type, (t) => !!(t.flags & 8576 /* StringOrNumberLiteralOrUnique */)) || isGenericType(type)) { return grammarErrorOnNode(parameter.name, Diagnostics.An_index_signature_parameter_type_cannot_be_a_literal_type_or_generic_type_Consider_using_a_mapped_object_type_instead); } if (!everyType(type, isValidIndexKeyType)) { return grammarErrorOnNode(parameter.name, Diagnostics.An_index_signature_parameter_type_must_be_string_number_symbol_or_a_template_literal_type); } if (!node.type) { return grammarErrorOnNode(node, Diagnostics.An_index_signature_must_have_a_type_annotation); } return false; } function checkGrammarIndexSignature(node) { return checkGrammarModifiers(node) || checkGrammarIndexSignatureParameters(node); } function checkGrammarForAtLeastOneTypeArgument(node, typeArguments) { if (typeArguments && typeArguments.length === 0) { const sourceFile = getSourceFileOfNode(node); const start = typeArguments.pos - "<".length; const end = skipTrivia(sourceFile.text, typeArguments.end) + ">".length; return grammarErrorAtPos(sourceFile, start, end - start, Diagnostics.Type_argument_list_cannot_be_empty); } return false; } function checkGrammarTypeArguments(node, typeArguments) { return checkGrammarForDisallowedTrailingComma(typeArguments) || checkGrammarForAtLeastOneTypeArgument(node, typeArguments); } function checkGrammarTaggedTemplateChain(node) { if (node.questionDotToken || node.flags & 64 /* OptionalChain */) { return grammarErrorOnNode(node.template, Diagnostics.Tagged_template_expressions_are_not_permitted_in_an_optional_chain); } return false; } function checkGrammarHeritageClause(node) { const types = node.types; if (checkGrammarForDisallowedTrailingComma(types)) { return true; } if (types && types.length === 0) { const listType = tokenToString(node.token); return grammarErrorAtPos(node, types.pos, 0, Diagnostics._0_list_cannot_be_empty, listType); } return some(types, checkGrammarExpressionWithTypeArguments); } function checkGrammarExpressionWithTypeArguments(node) { if (isExpressionWithTypeArguments(node) && isImportKeyword(node.expression) && node.typeArguments) { return grammarErrorOnNode(node, Diagnostics.This_use_of_import_is_invalid_import_calls_can_be_written_but_they_must_have_parentheses_and_cannot_have_type_arguments); } return checkGrammarTypeArguments(node, node.typeArguments); } function checkGrammarClassDeclarationHeritageClauses(node) { let seenExtendsClause = false; let seenImplementsClause = false; if (!checkGrammarModifiers(node) && node.heritageClauses) { for (const heritageClause of node.heritageClauses) { if (heritageClause.token === 96 /* ExtendsKeyword */) { if (seenExtendsClause) { return grammarErrorOnFirstToken(heritageClause, Diagnostics.extends_clause_already_seen); } if (seenImplementsClause) { return grammarErrorOnFirstToken(heritageClause, Diagnostics.extends_clause_must_precede_implements_clause); } if (heritageClause.types.length > 1) { return grammarErrorOnFirstToken(heritageClause.types[1], Diagnostics.Classes_can_only_extend_a_single_class); } seenExtendsClause = true; } else { Debug.assert(heritageClause.token === 119 /* ImplementsKeyword */); if (seenImplementsClause) { return grammarErrorOnFirstToken(heritageClause, Diagnostics.implements_clause_already_seen); } seenImplementsClause = true; } checkGrammarHeritageClause(heritageClause); } } } function checkGrammarInterfaceDeclaration(node) { let seenExtendsClause = false; if (node.heritageClauses) { for (const heritageClause of node.heritageClauses) { if (heritageClause.token === 96 /* ExtendsKeyword */) { if (seenExtendsClause) { return grammarErrorOnFirstToken(heritageClause, Diagnostics.extends_clause_already_seen); } seenExtendsClause = true; } else { Debug.assert(heritageClause.token === 119 /* ImplementsKeyword */); return grammarErrorOnFirstToken(heritageClause, Diagnostics.Interface_declaration_cannot_have_implements_clause); } checkGrammarHeritageClause(heritageClause); } } return false; } function checkGrammarComputedPropertyName(node) { if (node.kind !== 168 /* ComputedPropertyName */) { return false; } const computedPropertyName = node; if (computedPropertyName.expression.kind === 227 /* BinaryExpression */ && computedPropertyName.expression.operatorToken.kind === 28 /* CommaToken */) { return grammarErrorOnNode(computedPropertyName.expression, Diagnostics.A_comma_expression_is_not_allowed_in_a_computed_property_name); } return false; } function checkGrammarForGenerator(node) { if (node.asteriskToken) { Debug.assert( node.kind === 263 /* FunctionDeclaration */ || node.kind === 219 /* FunctionExpression */ || node.kind === 175 /* MethodDeclaration */ ); if (node.flags & 33554432 /* Ambient */) { return grammarErrorOnNode(node.asteriskToken, Diagnostics.Generators_are_not_allowed_in_an_ambient_context); } if (!node.body) { return grammarErrorOnNode(node.asteriskToken, Diagnostics.An_overload_signature_cannot_be_declared_as_a_generator); } } } function checkGrammarForInvalidQuestionMark(questionToken, message) { return !!questionToken && grammarErrorOnNode(questionToken, message); } function checkGrammarForInvalidExclamationToken(exclamationToken, message) { return !!exclamationToken && grammarErrorOnNode(exclamationToken, message); } function checkGrammarObjectLiteralExpression(node, inDestructuring) { const seen = /* @__PURE__ */ new Map(); for (const prop of node.properties) { if (prop.kind === 306 /* SpreadAssignment */) { if (inDestructuring) { const expression = skipParentheses(prop.expression); if (isArrayLiteralExpression(expression) || isObjectLiteralExpression(expression)) { return grammarErrorOnNode(prop.expression, Diagnostics.A_rest_element_cannot_contain_a_binding_pattern); } } continue; } const name = prop.name; if (name.kind === 168 /* ComputedPropertyName */) { checkGrammarComputedPropertyName(name); } if (prop.kind === 305 /* ShorthandPropertyAssignment */ && !inDestructuring && prop.objectAssignmentInitializer) { grammarErrorOnNode(prop.equalsToken, Diagnostics.Did_you_mean_to_use_a_Colon_An_can_only_follow_a_property_name_when_the_containing_object_literal_is_part_of_a_destructuring_pattern); } if (name.kind === 81 /* PrivateIdentifier */) { grammarErrorOnNode(name, Diagnostics.Private_identifiers_are_not_allowed_outside_class_bodies); } if (canHaveModifiers(prop) && prop.modifiers) { for (const mod of prop.modifiers) { if (isModifier(mod) && (mod.kind !== 134 /* AsyncKeyword */ || prop.kind !== 175 /* MethodDeclaration */)) { grammarErrorOnNode(mod, Diagnostics._0_modifier_cannot_be_used_here, getTextOfNode(mod)); } } } else if (canHaveIllegalModifiers(prop) && prop.modifiers) { for (const mod of prop.modifiers) { if (isModifier(mod)) { grammarErrorOnNode(mod, Diagnostics._0_modifier_cannot_be_used_here, getTextOfNode(mod)); } } } let currentKind; switch (prop.kind) { case 305 /* ShorthandPropertyAssignment */: case 304 /* PropertyAssignment */: checkGrammarForInvalidExclamationToken(prop.exclamationToken, Diagnostics.A_definite_assignment_assertion_is_not_permitted_in_this_context); checkGrammarForInvalidQuestionMark(prop.questionToken, Diagnostics.An_object_member_cannot_be_declared_optional); if (name.kind === 9 /* NumericLiteral */) { checkGrammarNumericLiteral(name); } if (name.kind === 10 /* BigIntLiteral */) { addErrorOrSuggestion( /*isError*/ true, createDiagnosticForNode(name, Diagnostics.A_bigint_literal_cannot_be_used_as_a_property_name) ); } currentKind = 4 /* PropertyAssignment */; break; case 175 /* MethodDeclaration */: currentKind = 8 /* Method */; break; case 178 /* GetAccessor */: currentKind = 1 /* GetAccessor */; break; case 179 /* SetAccessor */: currentKind = 2 /* SetAccessor */; break; default: Debug.assertNever(prop, "Unexpected syntax kind:" + prop.kind); } if (!inDestructuring) { const effectiveName = getEffectivePropertyNameForPropertyNameNode(name); if (effectiveName === void 0) { continue; } const existingKind = seen.get(effectiveName); if (!existingKind) { seen.set(effectiveName, currentKind); } else { if (currentKind & 8 /* Method */ && existingKind & 8 /* Method */) { grammarErrorOnNode(name, Diagnostics.Duplicate_identifier_0, getTextOfNode(name)); } else if (currentKind & 4 /* PropertyAssignment */ && existingKind & 4 /* PropertyAssignment */) { grammarErrorOnNode(name, Diagnostics.An_object_literal_cannot_have_multiple_properties_with_the_same_name, getTextOfNode(name)); } else if (currentKind & 3 /* GetOrSetAccessor */ && existingKind & 3 /* GetOrSetAccessor */) { if (existingKind !== 3 /* GetOrSetAccessor */ && currentKind !== existingKind) { seen.set(effectiveName, currentKind | existingKind); } else { return grammarErrorOnNode(name, Diagnostics.An_object_literal_cannot_have_multiple_get_Slashset_accessors_with_the_same_name); } } else { return grammarErrorOnNode(name, Diagnostics.An_object_literal_cannot_have_property_and_accessor_with_the_same_name); } } } } } function checkGrammarJsxElement(node) { checkGrammarJsxName(node.tagName); checkGrammarTypeArguments(node, node.typeArguments); const seen = /* @__PURE__ */ new Map(); for (const attr of node.attributes.properties) { if (attr.kind === 294 /* JsxSpreadAttribute */) { continue; } const { name, initializer } = attr; const escapedText = getEscapedTextOfJsxAttributeName(name); if (!seen.get(escapedText)) { seen.set(escapedText, true); } else { return grammarErrorOnNode(name, Diagnostics.JSX_elements_cannot_have_multiple_attributes_with_the_same_name); } if (initializer && initializer.kind === 295 /* JsxExpression */ && !initializer.expression) { return grammarErrorOnNode(initializer, Diagnostics.JSX_attributes_must_only_be_assigned_a_non_empty_expression); } } } function checkGrammarJsxName(node) { if (isPropertyAccessExpression(node) && isJsxNamespacedName(node.expression)) { return grammarErrorOnNode(node.expression, Diagnostics.JSX_property_access_expressions_cannot_include_JSX_namespace_names); } if (isJsxNamespacedName(node) && getJSXTransformEnabled(compilerOptions) && !isIntrinsicJsxName(node.namespace.escapedText)) { return grammarErrorOnNode(node, Diagnostics.React_components_cannot_include_JSX_namespace_names); } } function checkGrammarJsxExpression(node) { if (node.expression && isCommaSequence(node.expression)) { return grammarErrorOnNode(node.expression, Diagnostics.JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array); } } function checkGrammarForInOrForOfStatement(forInOrOfStatement) { if (checkGrammarStatementInAmbientContext(forInOrOfStatement)) { return true; } if (forInOrOfStatement.kind === 251 /* ForOfStatement */ && forInOrOfStatement.awaitModifier) { if (!(forInOrOfStatement.flags & 65536 /* AwaitContext */)) { const sourceFile = getSourceFileOfNode(forInOrOfStatement); if (isInTopLevelContext(forInOrOfStatement)) { if (!hasParseDiagnostics(sourceFile)) { if (!isEffectiveExternalModule(sourceFile, compilerOptions)) { diagnostics.add(createDiagnosticForNode(forInOrOfStatement.awaitModifier, Diagnostics.for_await_loops_are_only_allowed_at_the_top_level_of_a_file_when_that_file_is_a_module_but_this_file_has_no_imports_or_exports_Consider_adding_an_empty_export_to_make_this_file_a_module)); } switch (moduleKind) { case 100 /* Node16 */: case 101 /* Node18 */: case 102 /* Node20 */: case 199 /* NodeNext */: if (sourceFile.impliedNodeFormat === 1 /* CommonJS */) { diagnostics.add( createDiagnosticForNode(forInOrOfStatement.awaitModifier, Diagnostics.The_current_file_is_a_CommonJS_module_and_cannot_use_await_at_the_top_level) ); break; } // fallthrough case 7 /* ES2022 */: case 99 /* ESNext */: case 200 /* Preserve */: case 4 /* System */: if (languageVersion >= 4 /* ES2017 */) { break; } // fallthrough default: diagnostics.add( createDiagnosticForNode(forInOrOfStatement.awaitModifier, Diagnostics.Top_level_for_await_loops_are_only_allowed_when_the_module_option_is_set_to_es2022_esnext_system_node16_node18_node20_nodenext_or_preserve_and_the_target_option_is_set_to_es2017_or_higher) ); break; } } } else { if (!hasParseDiagnostics(sourceFile)) { const diagnostic = createDiagnosticForNode(forInOrOfStatement.awaitModifier, Diagnostics.for_await_loops_are_only_allowed_within_async_functions_and_at_the_top_levels_of_modules); const func = getContainingFunction(forInOrOfStatement); if (func && func.kind !== 177 /* Constructor */) { Debug.assert((getFunctionFlags(func) & 2 /* Async */) === 0, "Enclosing function should never be an async function."); const relatedInfo = createDiagnosticForNode(func, Diagnostics.Did_you_mean_to_mark_this_function_as_async); addRelatedInfo(diagnostic, relatedInfo); } diagnostics.add(diagnostic); return true; } } } } if (isForOfStatement(forInOrOfStatement) && !(forInOrOfStatement.flags & 65536 /* AwaitContext */) && isIdentifier(forInOrOfStatement.initializer) && forInOrOfStatement.initializer.escapedText === "async") { grammarErrorOnNode(forInOrOfStatement.initializer, Diagnostics.The_left_hand_side_of_a_for_of_statement_may_not_be_async); return false; } if (forInOrOfStatement.initializer.kind === 262 /* VariableDeclarationList */) { const variableList = forInOrOfStatement.initializer; if (!checkGrammarVariableDeclarationList(variableList)) { const declarations = variableList.declarations; if (!declarations.length) { return false; } if (declarations.length > 1) { const diagnostic = forInOrOfStatement.kind === 250 /* ForInStatement */ ? Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement : Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement; return grammarErrorOnFirstToken(variableList.declarations[1], diagnostic); } const firstDeclaration = declarations[0]; if (firstDeclaration.initializer) { const diagnostic = forInOrOfStatement.kind === 250 /* ForInStatement */ ? Diagnostics.The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer : Diagnostics.The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer; return grammarErrorOnNode(firstDeclaration.name, diagnostic); } if (firstDeclaration.type) { const diagnostic = forInOrOfStatement.kind === 250 /* ForInStatement */ ? Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_use_a_type_annotation : Diagnostics.The_left_hand_side_of_a_for_of_statement_cannot_use_a_type_annotation; return grammarErrorOnNode(firstDeclaration, diagnostic); } } } return false; } function checkGrammarAccessor(accessor) { if (!(accessor.flags & 33554432 /* Ambient */) && accessor.parent.kind !== 188 /* TypeLiteral */ && accessor.parent.kind !== 265 /* InterfaceDeclaration */) { if (languageVersion < 2 /* ES2015 */ && isPrivateIdentifier(accessor.name)) { return grammarErrorOnNode(accessor.name, Diagnostics.Private_identifiers_are_only_available_when_targeting_ECMAScript_2015_and_higher); } if (accessor.body === void 0 && !hasSyntacticModifier(accessor, 64 /* Abstract */)) { return grammarErrorAtPos(accessor, accessor.end - 1, ";".length, Diagnostics._0_expected, "{"); } } if (accessor.body) { if (hasSyntacticModifier(accessor, 64 /* Abstract */)) { return grammarErrorOnNode(accessor, Diagnostics.An_abstract_accessor_cannot_have_an_implementation); } if (accessor.parent.kind === 188 /* TypeLiteral */ || accessor.parent.kind === 265 /* InterfaceDeclaration */) { return grammarErrorOnNode(accessor.body, Diagnostics.An_implementation_cannot_be_declared_in_ambient_contexts); } } if (accessor.typeParameters) { return grammarErrorOnNode(accessor.name, Diagnostics.An_accessor_cannot_have_type_parameters); } if (!doesAccessorHaveCorrectParameterCount(accessor)) { return grammarErrorOnNode( accessor.name, accessor.kind === 178 /* GetAccessor */ ? Diagnostics.A_get_accessor_cannot_have_parameters : Diagnostics.A_set_accessor_must_have_exactly_one_parameter ); } if (accessor.kind === 179 /* SetAccessor */) { if (accessor.type) { return grammarErrorOnNode(accessor.name, Diagnostics.A_set_accessor_cannot_have_a_return_type_annotation); } const parameter = Debug.checkDefined(getSetAccessorValueParameter(accessor), "Return value does not match parameter count assertion."); if (parameter.dotDotDotToken) { return grammarErrorOnNode(parameter.dotDotDotToken, Diagnostics.A_set_accessor_cannot_have_rest_parameter); } if (parameter.questionToken) { return grammarErrorOnNode(parameter.questionToken, Diagnostics.A_set_accessor_cannot_have_an_optional_parameter); } if (parameter.initializer) { return grammarErrorOnNode(accessor.name, Diagnostics.A_set_accessor_parameter_cannot_have_an_initializer); } } return false; } function doesAccessorHaveCorrectParameterCount(accessor) { return getAccessorThisParameter(accessor) || accessor.parameters.length === (accessor.kind === 178 /* GetAccessor */ ? 0 : 1); } function getAccessorThisParameter(accessor) { if (accessor.parameters.length === (accessor.kind === 178 /* GetAccessor */ ? 1 : 2)) { return getThisParameter(accessor); } } function checkGrammarTypeOperatorNode(node) { if (node.operator === 158 /* UniqueKeyword */) { if (node.type.kind !== 155 /* SymbolKeyword */) { return grammarErrorOnNode(node.type, Diagnostics._0_expected, tokenToString(155 /* SymbolKeyword */)); } let parent = walkUpParenthesizedTypes(node.parent); if (isInJSFile(parent) && isJSDocTypeExpression(parent)) { const host2 = getJSDocHost(parent); if (host2) { parent = getSingleVariableOfVariableStatement(host2) || host2; } } switch (parent.kind) { case 261 /* VariableDeclaration */: const decl = parent; if (decl.name.kind !== 80 /* Identifier */) { return grammarErrorOnNode(node, Diagnostics.unique_symbol_types_may_not_be_used_on_a_variable_declaration_with_a_binding_name); } if (!isVariableDeclarationInVariableStatement(decl)) { return grammarErrorOnNode(node, Diagnostics.unique_symbol_types_are_only_allowed_on_variables_in_a_variable_statement); } if (!(decl.parent.flags & 2 /* Const */)) { return grammarErrorOnNode(parent.name, Diagnostics.A_variable_whose_type_is_a_unique_symbol_type_must_be_const); } break; case 173 /* PropertyDeclaration */: if (!isStatic(parent) || !hasEffectiveReadonlyModifier(parent)) { return grammarErrorOnNode(parent.name, Diagnostics.A_property_of_a_class_whose_type_is_a_unique_symbol_type_must_be_both_static_and_readonly); } break; case 172 /* PropertySignature */: if (!hasSyntacticModifier(parent, 8 /* Readonly */)) { return grammarErrorOnNode(parent.name, Diagnostics.A_property_of_an_interface_or_type_literal_whose_type_is_a_unique_symbol_type_must_be_readonly); } break; default: return grammarErrorOnNode(node, Diagnostics.unique_symbol_types_are_not_allowed_here); } } else if (node.operator === 148 /* ReadonlyKeyword */) { if (node.type.kind !== 189 /* ArrayType */ && node.type.kind !== 190 /* TupleType */) { return grammarErrorOnFirstToken(node, Diagnostics.readonly_type_modifier_is_only_permitted_on_array_and_tuple_literal_types, tokenToString(155 /* SymbolKeyword */)); } } } function checkGrammarForInvalidDynamicName(node, message) { if (isNonBindableDynamicName(node) && !isEntityNameExpression(isElementAccessExpression(node) ? skipParentheses(node.argumentExpression) : node.expression)) { return grammarErrorOnNode(node, message); } } function checkGrammarMethod(node) { if (checkGrammarFunctionLikeDeclaration(node)) { return true; } if (node.kind === 175 /* MethodDeclaration */) { if (node.parent.kind === 211 /* ObjectLiteralExpression */) { if (node.modifiers && !(node.modifiers.length === 1 && first(node.modifiers).kind === 134 /* AsyncKeyword */)) { return grammarErrorOnFirstToken(node, Diagnostics.Modifiers_cannot_appear_here); } else if (checkGrammarForInvalidQuestionMark(node.questionToken, Diagnostics.An_object_member_cannot_be_declared_optional)) { return true; } else if (checkGrammarForInvalidExclamationToken(node.exclamationToken, Diagnostics.A_definite_assignment_assertion_is_not_permitted_in_this_context)) { return true; } else if (node.body === void 0) { return grammarErrorAtPos(node, node.end - 1, ";".length, Diagnostics._0_expected, "{"); } } if (checkGrammarForGenerator(node)) { return true; } } if (isClassLike(node.parent)) { if (languageVersion < 2 /* ES2015 */ && isPrivateIdentifier(node.name)) { return grammarErrorOnNode(node.name, Diagnostics.Private_identifiers_are_only_available_when_targeting_ECMAScript_2015_and_higher); } if (node.flags & 33554432 /* Ambient */) { return checkGrammarForInvalidDynamicName(node.name, Diagnostics.A_computed_property_name_in_an_ambient_context_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type); } else if (node.kind === 175 /* MethodDeclaration */ && !node.body) { return checkGrammarForInvalidDynamicName(node.name, Diagnostics.A_computed_property_name_in_a_method_overload_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type); } } else if (node.parent.kind === 265 /* InterfaceDeclaration */) { return checkGrammarForInvalidDynamicName(node.name, Diagnostics.A_computed_property_name_in_an_interface_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type); } else if (node.parent.kind === 188 /* TypeLiteral */) { return checkGrammarForInvalidDynamicName(node.name, Diagnostics.A_computed_property_name_in_a_type_literal_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type); } } function checkGrammarBreakOrContinueStatement(node) { let current = node; while (current) { if (isFunctionLikeOrClassStaticBlockDeclaration(current)) { return grammarErrorOnNode(node, Diagnostics.Jump_target_cannot_cross_function_boundary); } switch (current.kind) { case 257 /* LabeledStatement */: if (node.label && current.label.escapedText === node.label.escapedText) { const isMisplacedContinueLabel = node.kind === 252 /* ContinueStatement */ && !isIterationStatement( current.statement, /*lookInLabeledStatements*/ true ); if (isMisplacedContinueLabel) { return grammarErrorOnNode(node, Diagnostics.A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement); } return false; } break; case 256 /* SwitchStatement */: if (node.kind === 253 /* BreakStatement */ && !node.label) { return false; } break; default: if (isIterationStatement( current, /*lookInLabeledStatements*/ false ) && !node.label) { return false; } break; } current = current.parent; } if (node.label) { const message = node.kind === 253 /* BreakStatement */ ? Diagnostics.A_break_statement_can_only_jump_to_a_label_of_an_enclosing_statement : Diagnostics.A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement; return grammarErrorOnNode(node, message); } else { const message = node.kind === 253 /* BreakStatement */ ? Diagnostics.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement : Diagnostics.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement; return grammarErrorOnNode(node, message); } } function checkGrammarBindingElement(node) { if (node.dotDotDotToken) { const elements = node.parent.elements; if (node !== last(elements)) { return grammarErrorOnNode(node, Diagnostics.A_rest_element_must_be_last_in_a_destructuring_pattern); } checkGrammarForDisallowedTrailingComma(elements, Diagnostics.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma); if (node.propertyName) { return grammarErrorOnNode(node.name, Diagnostics.A_rest_element_cannot_have_a_property_name); } } if (node.dotDotDotToken && node.initializer) { return grammarErrorAtPos(node, node.initializer.pos - 1, 1, Diagnostics.A_rest_element_cannot_have_an_initializer); } } function isStringOrNumberLiteralExpression(expr) { return isStringOrNumericLiteralLike(expr) || expr.kind === 225 /* PrefixUnaryExpression */ && expr.operator === 41 /* MinusToken */ && expr.operand.kind === 9 /* NumericLiteral */; } function isBigIntLiteralExpression(expr) { return expr.kind === 10 /* BigIntLiteral */ || expr.kind === 225 /* PrefixUnaryExpression */ && expr.operator === 41 /* MinusToken */ && expr.operand.kind === 10 /* BigIntLiteral */; } function isSimpleLiteralEnumReference(expr) { if ((isPropertyAccessExpression(expr) || isElementAccessExpression(expr) && isStringOrNumberLiteralExpression(expr.argumentExpression)) && isEntityNameExpression(expr.expression)) { return !!(checkExpressionCached(expr).flags & 1056 /* EnumLike */); } } function checkAmbientInitializer(node) { const initializer = node.initializer; if (initializer) { const isInvalidInitializer = !(isStringOrNumberLiteralExpression(initializer) || isSimpleLiteralEnumReference(initializer) || initializer.kind === 112 /* TrueKeyword */ || initializer.kind === 97 /* FalseKeyword */ || isBigIntLiteralExpression(initializer)); const isConstOrReadonly = isDeclarationReadonly(node) || isVariableDeclaration(node) && isVarConstLike2(node); if (isConstOrReadonly && !node.type) { if (isInvalidInitializer) { return grammarErrorOnNode(initializer, Diagnostics.A_const_initializer_in_an_ambient_context_must_be_a_string_or_numeric_literal_or_literal_enum_reference); } } else { return grammarErrorOnNode(initializer, Diagnostics.Initializers_are_not_allowed_in_ambient_contexts); } } } function checkGrammarVariableDeclaration(node) { const nodeFlags = getCombinedNodeFlagsCached(node); const blockScopeKind = nodeFlags & 7 /* BlockScoped */; if (isBindingPattern(node.name)) { switch (blockScopeKind) { case 6 /* AwaitUsing */: return grammarErrorOnNode(node, Diagnostics._0_declarations_may_not_have_binding_patterns, "await using"); case 4 /* Using */: return grammarErrorOnNode(node, Diagnostics._0_declarations_may_not_have_binding_patterns, "using"); } } if (node.parent.parent.kind !== 250 /* ForInStatement */ && node.parent.parent.kind !== 251 /* ForOfStatement */) { if (nodeFlags & 33554432 /* Ambient */) { checkAmbientInitializer(node); } else if (!node.initializer) { if (isBindingPattern(node.name) && !isBindingPattern(node.parent)) { return grammarErrorOnNode(node, Diagnostics.A_destructuring_declaration_must_have_an_initializer); } switch (blockScopeKind) { case 6 /* AwaitUsing */: return grammarErrorOnNode(node, Diagnostics._0_declarations_must_be_initialized, "await using"); case 4 /* Using */: return grammarErrorOnNode(node, Diagnostics._0_declarations_must_be_initialized, "using"); case 2 /* Const */: return grammarErrorOnNode(node, Diagnostics._0_declarations_must_be_initialized, "const"); } } } if (node.exclamationToken && (node.parent.parent.kind !== 244 /* VariableStatement */ || !node.type || node.initializer || nodeFlags & 33554432 /* Ambient */)) { const message = node.initializer ? Diagnostics.Declarations_with_initializers_cannot_also_have_definite_assignment_assertions : !node.type ? Diagnostics.Declarations_with_definite_assignment_assertions_must_also_have_type_annotations : Diagnostics.A_definite_assignment_assertion_is_not_permitted_in_this_context; return grammarErrorOnNode(node.exclamationToken, message); } if (host.getEmitModuleFormatOfFile(getSourceFileOfNode(node)) < 4 /* System */ && !(node.parent.parent.flags & 33554432 /* Ambient */) && hasSyntacticModifier(node.parent.parent, 32 /* Export */)) { checkESModuleMarker(node.name); } return !!blockScopeKind && checkGrammarNameInLetOrConstDeclarations(node.name); } function checkESModuleMarker(name) { if (name.kind === 80 /* Identifier */) { if (idText(name) === "__esModule") { return grammarErrorOnNodeSkippedOn("noEmit", name, Diagnostics.Identifier_expected_esModule_is_reserved_as_an_exported_marker_when_transforming_ECMAScript_modules); } } else { const elements = name.elements; for (const element of elements) { if (!isOmittedExpression(element)) { return checkESModuleMarker(element.name); } } } return false; } function checkGrammarNameInLetOrConstDeclarations(name) { if (name.kind === 80 /* Identifier */) { if (name.escapedText === "let") { return grammarErrorOnNode(name, Diagnostics.let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations); } } else { const elements = name.elements; for (const element of elements) { if (!isOmittedExpression(element)) { checkGrammarNameInLetOrConstDeclarations(element.name); } } } return false; } function checkGrammarVariableDeclarationList(declarationList) { const declarations = declarationList.declarations; if (checkGrammarForDisallowedTrailingComma(declarationList.declarations)) { return true; } if (!declarationList.declarations.length) { return grammarErrorAtPos(declarationList, declarations.pos, declarations.end - declarations.pos, Diagnostics.Variable_declaration_list_cannot_be_empty); } const blockScopeFlags = declarationList.flags & 7 /* BlockScoped */; if (blockScopeFlags === 4 /* Using */ || blockScopeFlags === 6 /* AwaitUsing */) { if (isForInStatement(declarationList.parent)) { return grammarErrorOnNode( declarationList, blockScopeFlags === 4 /* Using */ ? Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_be_a_using_declaration : Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_be_an_await_using_declaration ); } if (declarationList.flags & 33554432 /* Ambient */) { return grammarErrorOnNode( declarationList, blockScopeFlags === 4 /* Using */ ? Diagnostics.using_declarations_are_not_allowed_in_ambient_contexts : Diagnostics.await_using_declarations_are_not_allowed_in_ambient_contexts ); } if (blockScopeFlags === 6 /* AwaitUsing */) { return checkAwaitGrammar(declarationList); } } return false; } function allowBlockDeclarations(parent) { switch (parent.kind) { case 246 /* IfStatement */: case 247 /* DoStatement */: case 248 /* WhileStatement */: case 255 /* WithStatement */: case 249 /* ForStatement */: case 250 /* ForInStatement */: case 251 /* ForOfStatement */: return false; case 257 /* LabeledStatement */: return allowBlockDeclarations(parent.parent); } return true; } function checkGrammarForDisallowedBlockScopedVariableStatement(node) { if (!allowBlockDeclarations(node.parent)) { const blockScopeKind = getCombinedNodeFlagsCached(node.declarationList) & 7 /* BlockScoped */; if (blockScopeKind) { const keyword = blockScopeKind === 1 /* Let */ ? "let" : blockScopeKind === 2 /* Const */ ? "const" : blockScopeKind === 4 /* Using */ ? "using" : blockScopeKind === 6 /* AwaitUsing */ ? "await using" : Debug.fail("Unknown BlockScope flag"); error(node, Diagnostics._0_declarations_can_only_be_declared_inside_a_block, keyword); } } } function checkGrammarMetaProperty(node) { const escapedText = node.name.escapedText; switch (node.keywordToken) { case 105 /* NewKeyword */: if (escapedText !== "target") { return grammarErrorOnNode(node.name, Diagnostics._0_is_not_a_valid_meta_property_for_keyword_1_Did_you_mean_2, unescapeLeadingUnderscores(node.name.escapedText), tokenToString(node.keywordToken), "target"); } break; case 102 /* ImportKeyword */: if (escapedText !== "meta") { const isCallee = isCallExpression(node.parent) && node.parent.expression === node; if (escapedText === "defer") { if (!isCallee) { return grammarErrorAtPos(node, node.end, 0, Diagnostics._0_expected, "("); } } else { if (isCallee) { return grammarErrorOnNode(node.name, Diagnostics._0_is_not_a_valid_meta_property_for_keyword_import_Did_you_mean_meta_or_defer, unescapeLeadingUnderscores(node.name.escapedText)); } return grammarErrorOnNode(node.name, Diagnostics._0_is_not_a_valid_meta_property_for_keyword_1_Did_you_mean_2, unescapeLeadingUnderscores(node.name.escapedText), tokenToString(node.keywordToken), "meta"); } } break; } } function hasParseDiagnostics(sourceFile) { return sourceFile.parseDiagnostics.length > 0; } function grammarErrorOnFirstToken(node, message, ...args) { const sourceFile = getSourceFileOfNode(node); if (!hasParseDiagnostics(sourceFile)) { const span = getSpanOfTokenAtPosition(sourceFile, node.pos); diagnostics.add(createFileDiagnostic(sourceFile, span.start, span.length, message, ...args)); return true; } return false; } function grammarErrorAtPos(nodeForSourceFile, start, length2, message, ...args) { const sourceFile = getSourceFileOfNode(nodeForSourceFile); if (!hasParseDiagnostics(sourceFile)) { diagnostics.add(createFileDiagnostic(sourceFile, start, length2, message, ...args)); return true; } return false; } function grammarErrorOnNodeSkippedOn(key, node, message, ...args) { const sourceFile = getSourceFileOfNode(node); if (!hasParseDiagnostics(sourceFile)) { errorSkippedOn(key, node, message, ...args); return true; } return false; } function grammarErrorOnNode(node, message, ...args) { const sourceFile = getSourceFileOfNode(node); if (!hasParseDiagnostics(sourceFile)) { error(node, message, ...args); return true; } return false; } function checkGrammarConstructorTypeParameters(node) { const jsdocTypeParameters = isInJSFile(node) ? getJSDocTypeParameterDeclarations(node) : void 0; const range = node.typeParameters || jsdocTypeParameters && firstOrUndefined(jsdocTypeParameters); if (range) { const pos = range.pos === range.end ? range.pos : skipTrivia(getSourceFileOfNode(node).text, range.pos); return grammarErrorAtPos(node, pos, range.end - pos, Diagnostics.Type_parameters_cannot_appear_on_a_constructor_declaration); } } function checkGrammarConstructorTypeAnnotation(node) { const type = node.type || getEffectiveReturnTypeNode(node); if (type) { return grammarErrorOnNode(type, Diagnostics.Type_annotation_cannot_appear_on_a_constructor_declaration); } } function checkGrammarProperty(node) { if (isComputedPropertyName(node.name) && isBinaryExpression(node.name.expression) && node.name.expression.operatorToken.kind === 103 /* InKeyword */) { return grammarErrorOnNode(node.parent.members[0], Diagnostics.A_mapped_type_may_not_declare_properties_or_methods); } if (isClassLike(node.parent)) { if (isStringLiteral(node.name) && node.name.text === "constructor") { return grammarErrorOnNode(node.name, Diagnostics.Classes_may_not_have_a_field_named_constructor); } if (checkGrammarForInvalidDynamicName(node.name, Diagnostics.A_computed_property_name_in_a_class_property_declaration_must_have_a_simple_literal_type_or_a_unique_symbol_type)) { return true; } if (languageVersion < 2 /* ES2015 */ && isPrivateIdentifier(node.name)) { return grammarErrorOnNode(node.name, Diagnostics.Private_identifiers_are_only_available_when_targeting_ECMAScript_2015_and_higher); } if (languageVersion < 2 /* ES2015 */ && isAutoAccessorPropertyDeclaration(node) && !(node.flags & 33554432 /* Ambient */)) { return grammarErrorOnNode(node.name, Diagnostics.Properties_with_the_accessor_modifier_are_only_available_when_targeting_ECMAScript_2015_and_higher); } if (isAutoAccessorPropertyDeclaration(node) && checkGrammarForInvalidQuestionMark(node.questionToken, Diagnostics.An_accessor_property_cannot_be_declared_optional)) { return true; } } else if (node.parent.kind === 265 /* InterfaceDeclaration */) { if (checkGrammarForInvalidDynamicName(node.name, Diagnostics.A_computed_property_name_in_an_interface_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type)) { return true; } Debug.assertNode(node, isPropertySignature); if (node.initializer) { return grammarErrorOnNode(node.initializer, Diagnostics.An_interface_property_cannot_have_an_initializer); } } else if (isTypeLiteralNode(node.parent)) { if (checkGrammarForInvalidDynamicName(node.name, Diagnostics.A_computed_property_name_in_a_type_literal_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type)) { return true; } Debug.assertNode(node, isPropertySignature); if (node.initializer) { return grammarErrorOnNode(node.initializer, Diagnostics.A_type_literal_property_cannot_have_an_initializer); } } if (node.flags & 33554432 /* Ambient */) { checkAmbientInitializer(node); } if (isPropertyDeclaration(node) && node.exclamationToken && (!isClassLike(node.parent) || !node.type || node.initializer || node.flags & 33554432 /* Ambient */ || isStatic(node) || hasAbstractModifier(node))) { const message = node.initializer ? Diagnostics.Declarations_with_initializers_cannot_also_have_definite_assignment_assertions : !node.type ? Diagnostics.Declarations_with_definite_assignment_assertions_must_also_have_type_annotations : Diagnostics.A_definite_assignment_assertion_is_not_permitted_in_this_context; return grammarErrorOnNode(node.exclamationToken, message); } } function checkGrammarTopLevelElementForRequiredDeclareModifier(node) { if (node.kind === 265 /* InterfaceDeclaration */ || node.kind === 266 /* TypeAliasDeclaration */ || node.kind === 273 /* ImportDeclaration */ || node.kind === 272 /* ImportEqualsDeclaration */ || node.kind === 279 /* ExportDeclaration */ || node.kind === 278 /* ExportAssignment */ || node.kind === 271 /* NamespaceExportDeclaration */ || hasSyntacticModifier(node, 128 /* Ambient */ | 32 /* Export */ | 2048 /* Default */)) { return false; } return grammarErrorOnFirstToken(node, Diagnostics.Top_level_declarations_in_d_ts_files_must_start_with_either_a_declare_or_export_modifier); } function checkGrammarTopLevelElementsForRequiredDeclareModifier(file) { for (const decl of file.statements) { if (isDeclaration(decl) || decl.kind === 244 /* VariableStatement */) { if (checkGrammarTopLevelElementForRequiredDeclareModifier(decl)) { return true; } } } return false; } function checkGrammarSourceFile(node) { return !!(node.flags & 33554432 /* Ambient */) && checkGrammarTopLevelElementsForRequiredDeclareModifier(node); } function checkGrammarStatementInAmbientContext(node) { if (node.flags & 33554432 /* Ambient */) { const links = getNodeLinks(node); if (!links.hasReportedStatementInAmbientContext && (isFunctionLike(node.parent) || isAccessor(node.parent))) { return getNodeLinks(node).hasReportedStatementInAmbientContext = grammarErrorOnFirstToken(node, Diagnostics.An_implementation_cannot_be_declared_in_ambient_contexts); } if (node.parent.kind === 242 /* Block */ || node.parent.kind === 269 /* ModuleBlock */ || node.parent.kind === 308 /* SourceFile */) { const links2 = getNodeLinks(node.parent); if (!links2.hasReportedStatementInAmbientContext) { return links2.hasReportedStatementInAmbientContext = grammarErrorOnFirstToken(node, Diagnostics.Statements_are_not_allowed_in_ambient_contexts); } } else { } } return false; } function checkGrammarNumericLiteral(node) { const isFractional = getTextOfNode(node).includes("."); const isScientific = node.numericLiteralFlags & 16 /* Scientific */; if (isFractional || isScientific) { return; } const value = +node.text; if (value <= 2 ** 53 - 1) { return; } addErrorOrSuggestion( /*isError*/ false, createDiagnosticForNode(node, Diagnostics.Numeric_literals_with_absolute_values_equal_to_2_53_or_greater_are_too_large_to_be_represented_accurately_as_integers) ); } function checkGrammarBigIntLiteral(node) { const literalType = isLiteralTypeNode(node.parent) || isPrefixUnaryExpression(node.parent) && isLiteralTypeNode(node.parent.parent); if (!literalType) { if (!(node.flags & 33554432 /* Ambient */) && languageVersion < 7 /* ES2020 */) { if (grammarErrorOnNode(node, Diagnostics.BigInt_literals_are_not_available_when_targeting_lower_than_ES2020)) { return true; } } } return false; } function grammarErrorAfterFirstToken(node, message, ...args) { const sourceFile = getSourceFileOfNode(node); if (!hasParseDiagnostics(sourceFile)) { const span = getSpanOfTokenAtPosition(sourceFile, node.pos); diagnostics.add(createFileDiagnostic( sourceFile, textSpanEnd(span), /*length*/ 0, message, ...args )); return true; } return false; } function getAmbientModules() { if (!ambientModulesCache) { ambientModulesCache = []; globals.forEach((global2, sym) => { if (ambientModuleSymbolRegex.test(sym)) { ambientModulesCache.push(global2); } }); } return ambientModulesCache; } function checkGrammarImportClause(node) { var _a, _b; if (node.phaseModifier === 156 /* TypeKeyword */) { if (node.name && node.namedBindings) { return grammarErrorOnNode(node, Diagnostics.A_type_only_import_can_specify_a_default_import_or_named_bindings_but_not_both); } if (((_a = node.namedBindings) == null ? void 0 : _a.kind) === 276 /* NamedImports */) { return checkGrammarNamedImportsOrExports(node.namedBindings); } } else if (node.phaseModifier === 166 /* DeferKeyword */) { if (node.name) { return grammarErrorOnNode(node, Diagnostics.Default_imports_are_not_allowed_in_a_deferred_import); } if (((_b = node.namedBindings) == null ? void 0 : _b.kind) === 276 /* NamedImports */) { return grammarErrorOnNode(node, Diagnostics.Named_imports_are_not_allowed_in_a_deferred_import); } if (moduleKind !== 99 /* ESNext */ && moduleKind !== 200 /* Preserve */) { return grammarErrorOnNode(node, Diagnostics.Deferred_imports_are_only_supported_when_the_module_flag_is_set_to_esnext_or_preserve); } } return false; } function checkGrammarNamedImportsOrExports(namedBindings) { return !!forEach(namedBindings.elements, (specifier) => { if (specifier.isTypeOnly) { return grammarErrorOnFirstToken( specifier, specifier.kind === 277 /* ImportSpecifier */ ? Diagnostics.The_type_modifier_cannot_be_used_on_a_named_import_when_import_type_is_used_on_its_import_statement : Diagnostics.The_type_modifier_cannot_be_used_on_a_named_export_when_export_type_is_used_on_its_export_statement ); } }); } function checkGrammarImportCallExpression(node) { if (compilerOptions.verbatimModuleSyntax && moduleKind === 1 /* CommonJS */) { return grammarErrorOnNode(node, getVerbatimModuleSyntaxErrorMessage(node)); } if (node.expression.kind === 237 /* MetaProperty */) { if (moduleKind !== 99 /* ESNext */ && moduleKind !== 200 /* Preserve */) { return grammarErrorOnNode(node, Diagnostics.Deferred_imports_are_only_supported_when_the_module_flag_is_set_to_esnext_or_preserve); } } else if (moduleKind === 5 /* ES2015 */) { return grammarErrorOnNode(node, Diagnostics.Dynamic_imports_are_only_supported_when_the_module_flag_is_set_to_es2020_es2022_esnext_commonjs_amd_system_umd_node16_node18_node20_or_nodenext); } if (node.typeArguments) { return grammarErrorOnNode(node, Diagnostics.This_use_of_import_is_invalid_import_calls_can_be_written_but_they_must_have_parentheses_and_cannot_have_type_arguments); } const nodeArguments = node.arguments; if (!(100 /* Node16 */ <= moduleKind && moduleKind <= 199 /* NodeNext */) && moduleKind !== 99 /* ESNext */ && moduleKind !== 200 /* Preserve */) { checkGrammarForDisallowedTrailingComma(nodeArguments); if (nodeArguments.length > 1) { const importAttributesArgument = nodeArguments[1]; return grammarErrorOnNode(importAttributesArgument, Diagnostics.Dynamic_imports_only_support_a_second_argument_when_the_module_option_is_set_to_esnext_node16_node18_node20_nodenext_or_preserve); } } if (nodeArguments.length === 0 || nodeArguments.length > 2) { return grammarErrorOnNode(node, Diagnostics.Dynamic_imports_can_only_accept_a_module_specifier_and_an_optional_set_of_attributes_as_arguments); } const spreadElement = find(nodeArguments, isSpreadElement); if (spreadElement) { return grammarErrorOnNode(spreadElement, Diagnostics.Argument_of_dynamic_import_cannot_be_spread_element); } return false; } function findMatchingTypeReferenceOrTypeAliasReference(source, unionTarget) { const sourceObjectFlags = getObjectFlags(source); if (sourceObjectFlags & (4 /* Reference */ | 16 /* Anonymous */) && unionTarget.flags & 1048576 /* Union */) { return find(unionTarget.types, (target) => { if (target.flags & 524288 /* Object */) { const overlapObjFlags = sourceObjectFlags & getObjectFlags(target); if (overlapObjFlags & 4 /* Reference */) { return source.target === target.target; } if (overlapObjFlags & 16 /* Anonymous */) { return !!source.aliasSymbol && source.aliasSymbol === target.aliasSymbol; } } return false; }); } } function findBestTypeForObjectLiteral(source, unionTarget) { if (getObjectFlags(source) & 128 /* ObjectLiteral */ && someType(unionTarget, isArrayLikeType)) { return find(unionTarget.types, (t) => !isArrayLikeType(t)); } } function findBestTypeForInvokable(source, unionTarget) { let signatureKind = 0 /* Call */; const hasSignatures2 = getSignaturesOfType(source, signatureKind).length > 0 || (signatureKind = 1 /* Construct */, getSignaturesOfType(source, signatureKind).length > 0); if (hasSignatures2) { return find(unionTarget.types, (t) => getSignaturesOfType(t, signatureKind).length > 0); } } function findMostOverlappyType(source, unionTarget) { let bestMatch; if (!(source.flags & (402784252 /* Primitive */ | 406847488 /* InstantiablePrimitive */))) { let matchingCount = 0; for (const target of unionTarget.types) { if (!(target.flags & (402784252 /* Primitive */ | 406847488 /* InstantiablePrimitive */))) { const overlap = getIntersectionType([getIndexType(source), getIndexType(target)]); if (overlap.flags & 4194304 /* Index */) { return target; } else if (isUnitType(overlap) || overlap.flags & 1048576 /* Union */) { const len = overlap.flags & 1048576 /* Union */ ? countWhere(overlap.types, isUnitType) : 1; if (len >= matchingCount) { bestMatch = target; matchingCount = len; } } } } } return bestMatch; } function filterPrimitivesIfContainsNonPrimitive(type) { if (maybeTypeOfKind(type, 67108864 /* NonPrimitive */)) { const result = filterType(type, (t) => !(t.flags & 402784252 /* Primitive */)); if (!(result.flags & 131072 /* Never */)) { return result; } } return type; } function findMatchingDiscriminantType(source, target, isRelatedTo) { if (target.flags & 1048576 /* Union */ && source.flags & (2097152 /* Intersection */ | 524288 /* Object */)) { const match = getMatchingUnionConstituentForType(target, source); if (match) { return match; } const sourceProperties = getPropertiesOfType(source); if (sourceProperties) { const sourcePropertiesFiltered = findDiscriminantProperties(sourceProperties, target); if (sourcePropertiesFiltered) { const discriminated = discriminateTypeByDiscriminableItems(target, map(sourcePropertiesFiltered, (p) => [() => getTypeOfSymbol(p), p.escapedName]), isRelatedTo); if (discriminated !== target) { return discriminated; } } } } return void 0; } function getEffectivePropertyNameForPropertyNameNode(node) { const name = getPropertyNameForPropertyNameNode(node); return name ? name : isComputedPropertyName(node) ? tryGetNameFromType(getTypeOfExpression(node.expression)) : void 0; } function getCombinedModifierFlagsCached(node) { if (lastGetCombinedModifierFlagsNode === node) { return lastGetCombinedModifierFlagsResult; } lastGetCombinedModifierFlagsNode = node; lastGetCombinedModifierFlagsResult = getCombinedModifierFlags(node); return lastGetCombinedModifierFlagsResult; } function getCombinedNodeFlagsCached(node) { if (lastGetCombinedNodeFlagsNode === node) { return lastGetCombinedNodeFlagsResult; } lastGetCombinedNodeFlagsNode = node; lastGetCombinedNodeFlagsResult = getCombinedNodeFlags(node); return lastGetCombinedNodeFlagsResult; } function isVarConstLike2(node) { const blockScopeKind = getCombinedNodeFlagsCached(node) & 7 /* BlockScoped */; return blockScopeKind === 2 /* Const */ || blockScopeKind === 4 /* Using */ || blockScopeKind === 6 /* AwaitUsing */; } function getJSXRuntimeImportSpecifier(file, specifierText) { const jsxImportIndex = compilerOptions.importHelpers ? 1 : 0; const specifier = file == null ? void 0 : file.imports[jsxImportIndex]; if (specifier) { Debug.assert(nodeIsSynthesized(specifier) && specifier.text === specifierText, `Expected sourceFile.imports[${jsxImportIndex}] to be the synthesized JSX runtime import`); } return specifier; } function getImportHelpersImportSpecifier(file) { Debug.assert(compilerOptions.importHelpers, "Expected importHelpers to be enabled"); const specifier = file.imports[0]; Debug.assert(specifier && nodeIsSynthesized(specifier) && specifier.text === "tslib", `Expected sourceFile.imports[0] to be the synthesized tslib import`); return specifier; } } function isNotAccessor(declaration) { return !isAccessor(declaration); } function isNotOverload(declaration) { return declaration.kind !== 263 /* FunctionDeclaration */ && declaration.kind !== 175 /* MethodDeclaration */ || !!declaration.body; } function isDeclarationNameOrImportPropertyName(name) { switch (name.parent.kind) { case 277 /* ImportSpecifier */: case 282 /* ExportSpecifier */: return isIdentifier(name) || name.kind === 11 /* StringLiteral */; default: return isDeclarationName(name); } } var JsxNames; ((JsxNames2) => { JsxNames2.JSX = "JSX"; JsxNames2.IntrinsicElements = "IntrinsicElements"; JsxNames2.ElementClass = "ElementClass"; JsxNames2.ElementAttributesPropertyNameContainer = "ElementAttributesProperty"; JsxNames2.ElementChildrenAttributeNameContainer = "ElementChildrenAttribute"; JsxNames2.Element = "Element"; JsxNames2.ElementType = "ElementType"; JsxNames2.IntrinsicAttributes = "IntrinsicAttributes"; JsxNames2.IntrinsicClassAttributes = "IntrinsicClassAttributes"; JsxNames2.LibraryManagedAttributes = "LibraryManagedAttributes"; })(JsxNames || (JsxNames = {})); var ReactNames; ((ReactNames2) => { ReactNames2.Fragment = "Fragment"; })(ReactNames || (ReactNames = {})); function getIterationTypesKeyFromIterationTypeKind(typeKind) { switch (typeKind) { case 0 /* Yield */: return "yieldType"; case 1 /* Return */: return "returnType"; case 2 /* Next */: return "nextType"; } } function signatureHasRestParameter(s) { return !!(s.flags & 1 /* HasRestParameter */); } function signatureHasLiteralTypes(s) { return !!(s.flags & 2 /* HasLiteralTypes */); } function createBasicNodeBuilderModuleSpecifierResolutionHost(host) { return { getCommonSourceDirectory: !!host.getCommonSourceDirectory ? () => host.getCommonSourceDirectory() : () => "", getCurrentDirectory: () => host.getCurrentDirectory(), getSymlinkCache: maybeBind(host, host.getSymlinkCache), getPackageJsonInfoCache: () => { var _a; return (_a = host.getPackageJsonInfoCache) == null ? void 0 : _a.call(host); }, useCaseSensitiveFileNames: () => host.useCaseSensitiveFileNames(), redirectTargetsMap: host.redirectTargetsMap, getRedirectFromSourceFile: (fileName) => host.getRedirectFromSourceFile(fileName), isSourceOfProjectReferenceRedirect: (fileName) => host.isSourceOfProjectReferenceRedirect(fileName), fileExists: (fileName) => host.fileExists(fileName), getFileIncludeReasons: () => host.getFileIncludeReasons(), readFile: host.readFile ? (fileName) => host.readFile(fileName) : void 0, getDefaultResolutionModeForFile: (file) => host.getDefaultResolutionModeForFile(file), getModeForResolutionAtIndex: (file, index) => host.getModeForResolutionAtIndex(file, index), getGlobalTypingsCacheLocation: maybeBind(host, host.getGlobalTypingsCacheLocation) }; } var SymbolTrackerImpl = class _SymbolTrackerImpl { constructor(context, tracker, moduleResolverHost) { this.moduleResolverHost = void 0; this.inner = void 0; this.disableTrackSymbol = false; var _a; while (tracker instanceof _SymbolTrackerImpl) { tracker = tracker.inner; } this.inner = tracker; this.moduleResolverHost = moduleResolverHost; this.context = context; this.canTrackSymbol = !!((_a = this.inner) == null ? void 0 : _a.trackSymbol); } trackSymbol(symbol, enclosingDeclaration, meaning) { var _a, _b; if (((_a = this.inner) == null ? void 0 : _a.trackSymbol) && !this.disableTrackSymbol) { if (this.inner.trackSymbol(symbol, enclosingDeclaration, meaning)) { this.onDiagnosticReported(); return true; } if (!(symbol.flags & 262144 /* TypeParameter */)) ((_b = this.context).trackedSymbols ?? (_b.trackedSymbols = [])).push([symbol, enclosingDeclaration, meaning]); } return false; } reportInaccessibleThisError() { var _a; if ((_a = this.inner) == null ? void 0 : _a.reportInaccessibleThisError) { this.onDiagnosticReported(); this.inner.reportInaccessibleThisError(); } } reportPrivateInBaseOfClassExpression(propertyName) { var _a; if ((_a = this.inner) == null ? void 0 : _a.reportPrivateInBaseOfClassExpression) { this.onDiagnosticReported(); this.inner.reportPrivateInBaseOfClassExpression(propertyName); } } reportInaccessibleUniqueSymbolError() { var _a; if ((_a = this.inner) == null ? void 0 : _a.reportInaccessibleUniqueSymbolError) { this.onDiagnosticReported(); this.inner.reportInaccessibleUniqueSymbolError(); } } reportCyclicStructureError() { var _a; if ((_a = this.inner) == null ? void 0 : _a.reportCyclicStructureError) { this.onDiagnosticReported(); this.inner.reportCyclicStructureError(); } } reportLikelyUnsafeImportRequiredError(specifier) { var _a; if ((_a = this.inner) == null ? void 0 : _a.reportLikelyUnsafeImportRequiredError) { this.onDiagnosticReported(); this.inner.reportLikelyUnsafeImportRequiredError(specifier); } } reportTruncationError() { var _a; if ((_a = this.inner) == null ? void 0 : _a.reportTruncationError) { this.onDiagnosticReported(); this.inner.reportTruncationError(); } } reportNonlocalAugmentation(containingFile, parentSymbol, augmentingSymbol) { var _a; if ((_a = this.inner) == null ? void 0 : _a.reportNonlocalAugmentation) { this.onDiagnosticReported(); this.inner.reportNonlocalAugmentation(containingFile, parentSymbol, augmentingSymbol); } } reportNonSerializableProperty(propertyName) { var _a; if ((_a = this.inner) == null ? void 0 : _a.reportNonSerializableProperty) { this.onDiagnosticReported(); this.inner.reportNonSerializableProperty(propertyName); } } onDiagnosticReported() { this.context.reportedDiagnostic = true; } reportInferenceFallback(node) { var _a; if (((_a = this.inner) == null ? void 0 : _a.reportInferenceFallback) && !this.context.suppressReportInferenceFallback) { this.onDiagnosticReported(); this.inner.reportInferenceFallback(node); } } pushErrorFallbackNode(node) { var _a, _b; return (_b = (_a = this.inner) == null ? void 0 : _a.pushErrorFallbackNode) == null ? void 0 : _b.call(_a, node); } popErrorFallbackNode() { var _a, _b; return (_b = (_a = this.inner) == null ? void 0 : _a.popErrorFallbackNode) == null ? void 0 : _b.call(_a); } }; // src/compiler/visitorPublic.ts function visitNode(node, visitor, test, lift) { if (node === void 0) { return node; } const visited = visitor(node); let visitedNode; if (visited === void 0) { return void 0; } else if (isArray(visited)) { visitedNode = (lift || extractSingleNode)(visited); } else { visitedNode = visited; } Debug.assertNode(visitedNode, test); return visitedNode; } function visitNodes2(nodes, visitor, test, start, count) { if (nodes === void 0) { return nodes; } const length2 = nodes.length; if (start === void 0 || start < 0) { start = 0; } if (count === void 0 || count > length2 - start) { count = length2 - start; } let hasTrailingComma; let pos = -1; let end = -1; if (start > 0 || count < length2) { hasTrailingComma = nodes.hasTrailingComma && start + count === length2; } else { pos = nodes.pos; end = nodes.end; hasTrailingComma = nodes.hasTrailingComma; } const updated = visitArrayWorker(nodes, visitor, test, start, count); if (updated !== nodes) { const updatedArray = factory.createNodeArray(updated, hasTrailingComma); setTextRangePosEnd(updatedArray, pos, end); return updatedArray; } return nodes; } function visitArray(nodes, visitor, test, start, count) { if (nodes === void 0) { return nodes; } const length2 = nodes.length; if (start === void 0 || start < 0) { start = 0; } if (count === void 0 || count > length2 - start) { count = length2 - start; } return visitArrayWorker(nodes, visitor, test, start, count); } function visitArrayWorker(nodes, visitor, test, start, count) { let updated; const length2 = nodes.length; if (start > 0 || count < length2) { updated = []; } for (let i = 0; i < count; i++) { const node = nodes[i + start]; const visited = node !== void 0 ? visitor ? visitor(node) : node : void 0; if (updated !== void 0 || visited === void 0 || visited !== node) { if (updated === void 0) { updated = nodes.slice(0, i); Debug.assertEachNode(updated, test); } if (visited) { if (isArray(visited)) { for (const visitedNode of visited) { Debug.assertNode(visitedNode, test); updated.push(visitedNode); } } else { Debug.assertNode(visited, test); updated.push(visited); } } } } if (updated) { return updated; } Debug.assertEachNode(nodes, test); return nodes; } function visitLexicalEnvironment(statements, visitor, context, start, ensureUseStrict, nodesVisitor = visitNodes2) { context.startLexicalEnvironment(); statements = nodesVisitor(statements, visitor, isStatement, start); if (ensureUseStrict) statements = context.factory.ensureUseStrict(statements); return factory.mergeLexicalEnvironment(statements, context.endLexicalEnvironment()); } function visitParameterList(nodes, visitor, context, nodesVisitor = visitNodes2) { let updated; context.startLexicalEnvironment(); if (nodes) { context.setLexicalEnvironmentFlags(1 /* InParameters */, true); updated = nodesVisitor(nodes, visitor, isParameter); if (context.getLexicalEnvironmentFlags() & 2 /* VariablesHoistedInParameters */ && getEmitScriptTarget(context.getCompilerOptions()) >= 2 /* ES2015 */) { updated = addDefaultValueAssignmentsIfNeeded(updated, context); } context.setLexicalEnvironmentFlags(1 /* InParameters */, false); } context.suspendLexicalEnvironment(); return updated; } function addDefaultValueAssignmentsIfNeeded(parameters, context) { let result; for (let i = 0; i < parameters.length; i++) { const parameter = parameters[i]; const updated = addDefaultValueAssignmentIfNeeded(parameter, context); if (result || updated !== parameter) { if (!result) result = parameters.slice(0, i); result[i] = updated; } } if (result) { return setTextRange(context.factory.createNodeArray(result, parameters.hasTrailingComma), parameters); } return parameters; } function addDefaultValueAssignmentIfNeeded(parameter, context) { return parameter.dotDotDotToken ? parameter : isBindingPattern(parameter.name) ? addDefaultValueAssignmentForBindingPattern(parameter, context) : parameter.initializer ? addDefaultValueAssignmentForInitializer(parameter, parameter.name, parameter.initializer, context) : parameter; } function addDefaultValueAssignmentForBindingPattern(parameter, context) { const { factory: factory2 } = context; context.addInitializationStatement( factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList([ factory2.createVariableDeclaration( parameter.name, /*exclamationToken*/ void 0, parameter.type, parameter.initializer ? factory2.createConditionalExpression( factory2.createStrictEquality( factory2.getGeneratedNameForNode(parameter), factory2.createVoidZero() ), /*questionToken*/ void 0, parameter.initializer, /*colonToken*/ void 0, factory2.getGeneratedNameForNode(parameter) ) : factory2.getGeneratedNameForNode(parameter) ) ]) ) ); return factory2.updateParameterDeclaration( parameter, parameter.modifiers, parameter.dotDotDotToken, factory2.getGeneratedNameForNode(parameter), parameter.questionToken, parameter.type, /*initializer*/ void 0 ); } function addDefaultValueAssignmentForInitializer(parameter, name, initializer, context) { const factory2 = context.factory; context.addInitializationStatement( factory2.createIfStatement( factory2.createTypeCheck(factory2.cloneNode(name), "undefined"), setEmitFlags( setTextRange( factory2.createBlock([ factory2.createExpressionStatement( setEmitFlags( setTextRange( factory2.createAssignment( setEmitFlags(factory2.cloneNode(name), 96 /* NoSourceMap */), setEmitFlags(initializer, 96 /* NoSourceMap */ | getEmitFlags(initializer) | 3072 /* NoComments */) ), parameter ), 3072 /* NoComments */ ) ) ]), parameter ), 1 /* SingleLine */ | 64 /* NoTrailingSourceMap */ | 768 /* NoTokenSourceMaps */ | 3072 /* NoComments */ ) ) ); return factory2.updateParameterDeclaration( parameter, parameter.modifiers, parameter.dotDotDotToken, parameter.name, parameter.questionToken, parameter.type, /*initializer*/ void 0 ); } function visitFunctionBody(node, visitor, context, nodeVisitor = visitNode) { context.resumeLexicalEnvironment(); const updated = nodeVisitor(node, visitor, isConciseBody); const declarations = context.endLexicalEnvironment(); if (some(declarations)) { if (!updated) { return context.factory.createBlock(declarations); } const block = context.factory.converters.convertToFunctionBlock(updated); const statements = factory.mergeLexicalEnvironment(block.statements, declarations); return context.factory.updateBlock(block, statements); } return updated; } function visitIterationBody(body, visitor, context, nodeVisitor = visitNode) { context.startBlockScope(); const updated = nodeVisitor(body, visitor, isStatement, context.factory.liftToBlock); Debug.assert(updated); const declarations = context.endBlockScope(); if (some(declarations)) { if (isBlock(updated)) { declarations.push(...updated.statements); return context.factory.updateBlock(updated, declarations); } declarations.push(updated); return context.factory.createBlock(declarations); } return updated; } function visitCommaListElements(elements, visitor, discardVisitor = visitor) { if (discardVisitor === visitor || elements.length <= 1) { return visitNodes2(elements, visitor, isExpression); } let i = 0; const length2 = elements.length; return visitNodes2(elements, (node) => { const discarded = i < length2 - 1; i++; return discarded ? discardVisitor(node) : visitor(node); }, isExpression); } function visitEachChild(node, visitor, context = nullTransformationContext, nodesVisitor = visitNodes2, tokenVisitor, nodeVisitor = visitNode) { if (node === void 0) { return void 0; } const fn = visitEachChildTable[node.kind]; return fn === void 0 ? node : fn(node, visitor, context, nodesVisitor, nodeVisitor, tokenVisitor); } var visitEachChildTable = { [167 /* QualifiedName */]: function visitEachChildOfQualifiedName(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateQualifiedName( node, Debug.checkDefined(nodeVisitor(node.left, visitor, isEntityName)), Debug.checkDefined(nodeVisitor(node.right, visitor, isIdentifier)) ); }, [168 /* ComputedPropertyName */]: function visitEachChildOfComputedPropertyName(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateComputedPropertyName( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)) ); }, // Signature elements [169 /* TypeParameter */]: function visitEachChildOfTypeParameterDeclaration(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateTypeParameterDeclaration( node, nodesVisitor(node.modifiers, visitor, isModifier), Debug.checkDefined(nodeVisitor(node.name, visitor, isIdentifier)), nodeVisitor(node.constraint, visitor, isTypeNode), nodeVisitor(node.default, visitor, isTypeNode) ); }, [170 /* Parameter */]: function visitEachChildOfParameterDeclaration(node, visitor, context, nodesVisitor, nodeVisitor, tokenVisitor) { return context.factory.updateParameterDeclaration( node, nodesVisitor(node.modifiers, visitor, isModifierLike), tokenVisitor ? nodeVisitor(node.dotDotDotToken, tokenVisitor, isDotDotDotToken) : node.dotDotDotToken, Debug.checkDefined(nodeVisitor(node.name, visitor, isBindingName)), tokenVisitor ? nodeVisitor(node.questionToken, tokenVisitor, isQuestionToken) : node.questionToken, nodeVisitor(node.type, visitor, isTypeNode), nodeVisitor(node.initializer, visitor, isExpression) ); }, [171 /* Decorator */]: function visitEachChildOfDecorator(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateDecorator( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)) ); }, // Type elements [172 /* PropertySignature */]: function visitEachChildOfPropertySignature(node, visitor, context, nodesVisitor, nodeVisitor, tokenVisitor) { return context.factory.updatePropertySignature( node, nodesVisitor(node.modifiers, visitor, isModifier), Debug.checkDefined(nodeVisitor(node.name, visitor, isPropertyName)), tokenVisitor ? nodeVisitor(node.questionToken, tokenVisitor, isQuestionToken) : node.questionToken, nodeVisitor(node.type, visitor, isTypeNode) ); }, [173 /* PropertyDeclaration */]: function visitEachChildOfPropertyDeclaration(node, visitor, context, nodesVisitor, nodeVisitor, tokenVisitor) { return context.factory.updatePropertyDeclaration( node, nodesVisitor(node.modifiers, visitor, isModifierLike), Debug.checkDefined(nodeVisitor(node.name, visitor, isPropertyName)), // QuestionToken and ExclamationToken are mutually exclusive in PropertyDeclaration tokenVisitor ? nodeVisitor(node.questionToken ?? node.exclamationToken, tokenVisitor, isQuestionOrExclamationToken) : node.questionToken ?? node.exclamationToken, nodeVisitor(node.type, visitor, isTypeNode), nodeVisitor(node.initializer, visitor, isExpression) ); }, [174 /* MethodSignature */]: function visitEachChildOfMethodSignature(node, visitor, context, nodesVisitor, nodeVisitor, tokenVisitor) { return context.factory.updateMethodSignature( node, nodesVisitor(node.modifiers, visitor, isModifier), Debug.checkDefined(nodeVisitor(node.name, visitor, isPropertyName)), tokenVisitor ? nodeVisitor(node.questionToken, tokenVisitor, isQuestionToken) : node.questionToken, nodesVisitor(node.typeParameters, visitor, isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, isParameter), nodeVisitor(node.type, visitor, isTypeNode) ); }, [175 /* MethodDeclaration */]: function visitEachChildOfMethodDeclaration(node, visitor, context, nodesVisitor, nodeVisitor, tokenVisitor) { return context.factory.updateMethodDeclaration( node, nodesVisitor(node.modifiers, visitor, isModifierLike), tokenVisitor ? nodeVisitor(node.asteriskToken, tokenVisitor, isAsteriskToken) : node.asteriskToken, Debug.checkDefined(nodeVisitor(node.name, visitor, isPropertyName)), tokenVisitor ? nodeVisitor(node.questionToken, tokenVisitor, isQuestionToken) : node.questionToken, nodesVisitor(node.typeParameters, visitor, isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), nodeVisitor(node.type, visitor, isTypeNode), visitFunctionBody(node.body, visitor, context, nodeVisitor) ); }, [177 /* Constructor */]: function visitEachChildOfConstructorDeclaration(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateConstructorDeclaration( node, nodesVisitor(node.modifiers, visitor, isModifierLike), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitFunctionBody(node.body, visitor, context, nodeVisitor) ); }, [178 /* GetAccessor */]: function visitEachChildOfGetAccessorDeclaration(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateGetAccessorDeclaration( node, nodesVisitor(node.modifiers, visitor, isModifierLike), Debug.checkDefined(nodeVisitor(node.name, visitor, isPropertyName)), visitParameterList(node.parameters, visitor, context, nodesVisitor), nodeVisitor(node.type, visitor, isTypeNode), visitFunctionBody(node.body, visitor, context, nodeVisitor) ); }, [179 /* SetAccessor */]: function visitEachChildOfSetAccessorDeclaration(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateSetAccessorDeclaration( node, nodesVisitor(node.modifiers, visitor, isModifierLike), Debug.checkDefined(nodeVisitor(node.name, visitor, isPropertyName)), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitFunctionBody(node.body, visitor, context, nodeVisitor) ); }, [176 /* ClassStaticBlockDeclaration */]: function visitEachChildOfClassStaticBlockDeclaration(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { context.startLexicalEnvironment(); context.suspendLexicalEnvironment(); return context.factory.updateClassStaticBlockDeclaration( node, visitFunctionBody(node.body, visitor, context, nodeVisitor) ); }, [180 /* CallSignature */]: function visitEachChildOfCallSignatureDeclaration(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateCallSignature( node, nodesVisitor(node.typeParameters, visitor, isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, isParameter), nodeVisitor(node.type, visitor, isTypeNode) ); }, [181 /* ConstructSignature */]: function visitEachChildOfConstructSignatureDeclaration(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateConstructSignature( node, nodesVisitor(node.typeParameters, visitor, isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, isParameter), nodeVisitor(node.type, visitor, isTypeNode) ); }, [182 /* IndexSignature */]: function visitEachChildOfIndexSignatureDeclaration(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateIndexSignature( node, nodesVisitor(node.modifiers, visitor, isModifierLike), nodesVisitor(node.parameters, visitor, isParameter), Debug.checkDefined(nodeVisitor(node.type, visitor, isTypeNode)) ); }, // Types [183 /* TypePredicate */]: function visitEachChildOfTypePredicateNode(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateTypePredicateNode( node, nodeVisitor(node.assertsModifier, visitor, isAssertsKeyword), Debug.checkDefined(nodeVisitor(node.parameterName, visitor, isIdentifierOrThisTypeNode)), nodeVisitor(node.type, visitor, isTypeNode) ); }, [184 /* TypeReference */]: function visitEachChildOfTypeReferenceNode(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateTypeReferenceNode( node, Debug.checkDefined(nodeVisitor(node.typeName, visitor, isEntityName)), nodesVisitor(node.typeArguments, visitor, isTypeNode) ); }, [185 /* FunctionType */]: function visitEachChildOfFunctionTypeNode(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateFunctionTypeNode( node, nodesVisitor(node.typeParameters, visitor, isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, isParameter), Debug.checkDefined(nodeVisitor(node.type, visitor, isTypeNode)) ); }, [186 /* ConstructorType */]: function visitEachChildOfConstructorTypeNode(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateConstructorTypeNode( node, nodesVisitor(node.modifiers, visitor, isModifier), nodesVisitor(node.typeParameters, visitor, isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, isParameter), Debug.checkDefined(nodeVisitor(node.type, visitor, isTypeNode)) ); }, [187 /* TypeQuery */]: function visitEachChildOfTypeQueryNode(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateTypeQueryNode( node, Debug.checkDefined(nodeVisitor(node.exprName, visitor, isEntityName)), nodesVisitor(node.typeArguments, visitor, isTypeNode) ); }, [188 /* TypeLiteral */]: function visitEachChildOfTypeLiteralNode(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) { return context.factory.updateTypeLiteralNode( node, nodesVisitor(node.members, visitor, isTypeElement) ); }, [189 /* ArrayType */]: function visitEachChildOfArrayTypeNode(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateArrayTypeNode( node, Debug.checkDefined(nodeVisitor(node.elementType, visitor, isTypeNode)) ); }, [190 /* TupleType */]: function visitEachChildOfTupleTypeNode(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) { return context.factory.updateTupleTypeNode( node, nodesVisitor(node.elements, visitor, isTypeNode) ); }, [191 /* OptionalType */]: function visitEachChildOfOptionalTypeNode(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateOptionalTypeNode( node, Debug.checkDefined(nodeVisitor(node.type, visitor, isTypeNode)) ); }, [192 /* RestType */]: function visitEachChildOfRestTypeNode(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateRestTypeNode( node, Debug.checkDefined(nodeVisitor(node.type, visitor, isTypeNode)) ); }, [193 /* UnionType */]: function visitEachChildOfUnionTypeNode(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) { return context.factory.updateUnionTypeNode( node, nodesVisitor(node.types, visitor, isTypeNode) ); }, [194 /* IntersectionType */]: function visitEachChildOfIntersectionTypeNode(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) { return context.factory.updateIntersectionTypeNode( node, nodesVisitor(node.types, visitor, isTypeNode) ); }, [195 /* ConditionalType */]: function visitEachChildOfConditionalTypeNode(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateConditionalTypeNode( node, Debug.checkDefined(nodeVisitor(node.checkType, visitor, isTypeNode)), Debug.checkDefined(nodeVisitor(node.extendsType, visitor, isTypeNode)), Debug.checkDefined(nodeVisitor(node.trueType, visitor, isTypeNode)), Debug.checkDefined(nodeVisitor(node.falseType, visitor, isTypeNode)) ); }, [196 /* InferType */]: function visitEachChildOfInferTypeNode(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateInferTypeNode( node, Debug.checkDefined(nodeVisitor(node.typeParameter, visitor, isTypeParameterDeclaration)) ); }, [206 /* ImportType */]: function visitEachChildOfImportTypeNode(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateImportTypeNode( node, Debug.checkDefined(nodeVisitor(node.argument, visitor, isTypeNode)), nodeVisitor(node.attributes, visitor, isImportAttributes), nodeVisitor(node.qualifier, visitor, isEntityName), nodesVisitor(node.typeArguments, visitor, isTypeNode), node.isTypeOf ); }, [303 /* ImportTypeAssertionContainer */]: function visitEachChildOfImportTypeAssertionContainer(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateImportTypeAssertionContainer( node, Debug.checkDefined(nodeVisitor(node.assertClause, visitor, isAssertClause)), node.multiLine ); }, [203 /* NamedTupleMember */]: function visitEachChildOfNamedTupleMember(node, visitor, context, _nodesVisitor, nodeVisitor, tokenVisitor) { return context.factory.updateNamedTupleMember( node, tokenVisitor ? nodeVisitor(node.dotDotDotToken, tokenVisitor, isDotDotDotToken) : node.dotDotDotToken, Debug.checkDefined(nodeVisitor(node.name, visitor, isIdentifier)), tokenVisitor ? nodeVisitor(node.questionToken, tokenVisitor, isQuestionToken) : node.questionToken, Debug.checkDefined(nodeVisitor(node.type, visitor, isTypeNode)) ); }, [197 /* ParenthesizedType */]: function visitEachChildOfParenthesizedType(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateParenthesizedType( node, Debug.checkDefined(nodeVisitor(node.type, visitor, isTypeNode)) ); }, [199 /* TypeOperator */]: function visitEachChildOfTypeOperatorNode(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateTypeOperatorNode( node, Debug.checkDefined(nodeVisitor(node.type, visitor, isTypeNode)) ); }, [200 /* IndexedAccessType */]: function visitEachChildOfIndexedAccessType(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateIndexedAccessTypeNode( node, Debug.checkDefined(nodeVisitor(node.objectType, visitor, isTypeNode)), Debug.checkDefined(nodeVisitor(node.indexType, visitor, isTypeNode)) ); }, [201 /* MappedType */]: function visitEachChildOfMappedType(node, visitor, context, nodesVisitor, nodeVisitor, tokenVisitor) { return context.factory.updateMappedTypeNode( node, tokenVisitor ? nodeVisitor(node.readonlyToken, tokenVisitor, isReadonlyKeywordOrPlusOrMinusToken) : node.readonlyToken, Debug.checkDefined(nodeVisitor(node.typeParameter, visitor, isTypeParameterDeclaration)), nodeVisitor(node.nameType, visitor, isTypeNode), tokenVisitor ? nodeVisitor(node.questionToken, tokenVisitor, isQuestionOrPlusOrMinusToken) : node.questionToken, nodeVisitor(node.type, visitor, isTypeNode), nodesVisitor(node.members, visitor, isTypeElement) ); }, [202 /* LiteralType */]: function visitEachChildOfLiteralTypeNode(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateLiteralTypeNode( node, Debug.checkDefined(nodeVisitor(node.literal, visitor, isLiteralTypeLiteral)) ); }, [204 /* TemplateLiteralType */]: function visitEachChildOfTemplateLiteralType(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateTemplateLiteralType( node, Debug.checkDefined(nodeVisitor(node.head, visitor, isTemplateHead)), nodesVisitor(node.templateSpans, visitor, isTemplateLiteralTypeSpan) ); }, [205 /* TemplateLiteralTypeSpan */]: function visitEachChildOfTemplateLiteralTypeSpan(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateTemplateLiteralTypeSpan( node, Debug.checkDefined(nodeVisitor(node.type, visitor, isTypeNode)), Debug.checkDefined(nodeVisitor(node.literal, visitor, isTemplateMiddleOrTemplateTail)) ); }, // Binding patterns [207 /* ObjectBindingPattern */]: function visitEachChildOfObjectBindingPattern(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) { return context.factory.updateObjectBindingPattern( node, nodesVisitor(node.elements, visitor, isBindingElement) ); }, [208 /* ArrayBindingPattern */]: function visitEachChildOfArrayBindingPattern(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) { return context.factory.updateArrayBindingPattern( node, nodesVisitor(node.elements, visitor, isArrayBindingElement) ); }, [209 /* BindingElement */]: function visitEachChildOfBindingElement(node, visitor, context, _nodesVisitor, nodeVisitor, tokenVisitor) { return context.factory.updateBindingElement( node, tokenVisitor ? nodeVisitor(node.dotDotDotToken, tokenVisitor, isDotDotDotToken) : node.dotDotDotToken, nodeVisitor(node.propertyName, visitor, isPropertyName), Debug.checkDefined(nodeVisitor(node.name, visitor, isBindingName)), nodeVisitor(node.initializer, visitor, isExpression) ); }, // Expression [210 /* ArrayLiteralExpression */]: function visitEachChildOfArrayLiteralExpression(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) { return context.factory.updateArrayLiteralExpression( node, nodesVisitor(node.elements, visitor, isExpression) ); }, [211 /* ObjectLiteralExpression */]: function visitEachChildOfObjectLiteralExpression(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) { return context.factory.updateObjectLiteralExpression( node, nodesVisitor(node.properties, visitor, isObjectLiteralElementLike) ); }, [212 /* PropertyAccessExpression */]: function visitEachChildOfPropertyAccessExpression(node, visitor, context, _nodesVisitor, nodeVisitor, tokenVisitor) { return isPropertyAccessChain(node) ? context.factory.updatePropertyAccessChain( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)), tokenVisitor ? nodeVisitor(node.questionDotToken, tokenVisitor, isQuestionDotToken) : node.questionDotToken, Debug.checkDefined(nodeVisitor(node.name, visitor, isMemberName)) ) : context.factory.updatePropertyAccessExpression( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)), Debug.checkDefined(nodeVisitor(node.name, visitor, isMemberName)) ); }, [213 /* ElementAccessExpression */]: function visitEachChildOfElementAccessExpression(node, visitor, context, _nodesVisitor, nodeVisitor, tokenVisitor) { return isElementAccessChain(node) ? context.factory.updateElementAccessChain( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)), tokenVisitor ? nodeVisitor(node.questionDotToken, tokenVisitor, isQuestionDotToken) : node.questionDotToken, Debug.checkDefined(nodeVisitor(node.argumentExpression, visitor, isExpression)) ) : context.factory.updateElementAccessExpression( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)), Debug.checkDefined(nodeVisitor(node.argumentExpression, visitor, isExpression)) ); }, [214 /* CallExpression */]: function visitEachChildOfCallExpression(node, visitor, context, nodesVisitor, nodeVisitor, tokenVisitor) { return isCallChain(node) ? context.factory.updateCallChain( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)), tokenVisitor ? nodeVisitor(node.questionDotToken, tokenVisitor, isQuestionDotToken) : node.questionDotToken, nodesVisitor(node.typeArguments, visitor, isTypeNode), nodesVisitor(node.arguments, visitor, isExpression) ) : context.factory.updateCallExpression( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)), nodesVisitor(node.typeArguments, visitor, isTypeNode), nodesVisitor(node.arguments, visitor, isExpression) ); }, [215 /* NewExpression */]: function visitEachChildOfNewExpression(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateNewExpression( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)), nodesVisitor(node.typeArguments, visitor, isTypeNode), nodesVisitor(node.arguments, visitor, isExpression) ); }, [216 /* TaggedTemplateExpression */]: function visitEachChildOfTaggedTemplateExpression(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateTaggedTemplateExpression( node, Debug.checkDefined(nodeVisitor(node.tag, visitor, isExpression)), nodesVisitor(node.typeArguments, visitor, isTypeNode), Debug.checkDefined(nodeVisitor(node.template, visitor, isTemplateLiteral)) ); }, [217 /* TypeAssertionExpression */]: function visitEachChildOfTypeAssertionExpression(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateTypeAssertion( node, Debug.checkDefined(nodeVisitor(node.type, visitor, isTypeNode)), Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)) ); }, [218 /* ParenthesizedExpression */]: function visitEachChildOfParenthesizedExpression(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateParenthesizedExpression( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)) ); }, [219 /* FunctionExpression */]: function visitEachChildOfFunctionExpression(node, visitor, context, nodesVisitor, nodeVisitor, tokenVisitor) { return context.factory.updateFunctionExpression( node, nodesVisitor(node.modifiers, visitor, isModifier), tokenVisitor ? nodeVisitor(node.asteriskToken, tokenVisitor, isAsteriskToken) : node.asteriskToken, nodeVisitor(node.name, visitor, isIdentifier), nodesVisitor(node.typeParameters, visitor, isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), nodeVisitor(node.type, visitor, isTypeNode), visitFunctionBody(node.body, visitor, context, nodeVisitor) ); }, [220 /* ArrowFunction */]: function visitEachChildOfArrowFunction(node, visitor, context, nodesVisitor, nodeVisitor, tokenVisitor) { return context.factory.updateArrowFunction( node, nodesVisitor(node.modifiers, visitor, isModifier), nodesVisitor(node.typeParameters, visitor, isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), nodeVisitor(node.type, visitor, isTypeNode), tokenVisitor ? Debug.checkDefined(nodeVisitor(node.equalsGreaterThanToken, tokenVisitor, isEqualsGreaterThanToken)) : node.equalsGreaterThanToken, visitFunctionBody(node.body, visitor, context, nodeVisitor) ); }, [221 /* DeleteExpression */]: function visitEachChildOfDeleteExpression(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateDeleteExpression( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)) ); }, [222 /* TypeOfExpression */]: function visitEachChildOfTypeOfExpression(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateTypeOfExpression( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)) ); }, [223 /* VoidExpression */]: function visitEachChildOfVoidExpression(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateVoidExpression( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)) ); }, [224 /* AwaitExpression */]: function visitEachChildOfAwaitExpression(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateAwaitExpression( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)) ); }, [225 /* PrefixUnaryExpression */]: function visitEachChildOfPrefixUnaryExpression(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updatePrefixUnaryExpression( node, Debug.checkDefined(nodeVisitor(node.operand, visitor, isExpression)) ); }, [226 /* PostfixUnaryExpression */]: function visitEachChildOfPostfixUnaryExpression(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updatePostfixUnaryExpression( node, Debug.checkDefined(nodeVisitor(node.operand, visitor, isExpression)) ); }, [227 /* BinaryExpression */]: function visitEachChildOfBinaryExpression(node, visitor, context, _nodesVisitor, nodeVisitor, tokenVisitor) { return context.factory.updateBinaryExpression( node, Debug.checkDefined(nodeVisitor(node.left, visitor, isExpression)), tokenVisitor ? Debug.checkDefined(nodeVisitor(node.operatorToken, tokenVisitor, isBinaryOperatorToken)) : node.operatorToken, Debug.checkDefined(nodeVisitor(node.right, visitor, isExpression)) ); }, [228 /* ConditionalExpression */]: function visitEachChildOfConditionalExpression(node, visitor, context, _nodesVisitor, nodeVisitor, tokenVisitor) { return context.factory.updateConditionalExpression( node, Debug.checkDefined(nodeVisitor(node.condition, visitor, isExpression)), tokenVisitor ? Debug.checkDefined(nodeVisitor(node.questionToken, tokenVisitor, isQuestionToken)) : node.questionToken, Debug.checkDefined(nodeVisitor(node.whenTrue, visitor, isExpression)), tokenVisitor ? Debug.checkDefined(nodeVisitor(node.colonToken, tokenVisitor, isColonToken)) : node.colonToken, Debug.checkDefined(nodeVisitor(node.whenFalse, visitor, isExpression)) ); }, [229 /* TemplateExpression */]: function visitEachChildOfTemplateExpression(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateTemplateExpression( node, Debug.checkDefined(nodeVisitor(node.head, visitor, isTemplateHead)), nodesVisitor(node.templateSpans, visitor, isTemplateSpan) ); }, [230 /* YieldExpression */]: function visitEachChildOfYieldExpression(node, visitor, context, _nodesVisitor, nodeVisitor, tokenVisitor) { return context.factory.updateYieldExpression( node, tokenVisitor ? nodeVisitor(node.asteriskToken, tokenVisitor, isAsteriskToken) : node.asteriskToken, nodeVisitor(node.expression, visitor, isExpression) ); }, [231 /* SpreadElement */]: function visitEachChildOfSpreadElement(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateSpreadElement( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)) ); }, [232 /* ClassExpression */]: function visitEachChildOfClassExpression(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateClassExpression( node, nodesVisitor(node.modifiers, visitor, isModifierLike), nodeVisitor(node.name, visitor, isIdentifier), nodesVisitor(node.typeParameters, visitor, isTypeParameterDeclaration), nodesVisitor(node.heritageClauses, visitor, isHeritageClause), nodesVisitor(node.members, visitor, isClassElement) ); }, [234 /* ExpressionWithTypeArguments */]: function visitEachChildOfExpressionWithTypeArguments(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateExpressionWithTypeArguments( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)), nodesVisitor(node.typeArguments, visitor, isTypeNode) ); }, [235 /* AsExpression */]: function visitEachChildOfAsExpression(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateAsExpression( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)), Debug.checkDefined(nodeVisitor(node.type, visitor, isTypeNode)) ); }, [239 /* SatisfiesExpression */]: function visitEachChildOfSatisfiesExpression(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateSatisfiesExpression( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)), Debug.checkDefined(nodeVisitor(node.type, visitor, isTypeNode)) ); }, [236 /* NonNullExpression */]: function visitEachChildOfNonNullExpression(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return isOptionalChain(node) ? context.factory.updateNonNullChain( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)) ) : context.factory.updateNonNullExpression( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)) ); }, [237 /* MetaProperty */]: function visitEachChildOfMetaProperty(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateMetaProperty( node, Debug.checkDefined(nodeVisitor(node.name, visitor, isIdentifier)) ); }, // Misc [240 /* TemplateSpan */]: function visitEachChildOfTemplateSpan(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateTemplateSpan( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)), Debug.checkDefined(nodeVisitor(node.literal, visitor, isTemplateMiddleOrTemplateTail)) ); }, // Element [242 /* Block */]: function visitEachChildOfBlock(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) { return context.factory.updateBlock( node, nodesVisitor(node.statements, visitor, isStatement) ); }, [244 /* VariableStatement */]: function visitEachChildOfVariableStatement(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateVariableStatement( node, nodesVisitor(node.modifiers, visitor, isModifierLike), Debug.checkDefined(nodeVisitor(node.declarationList, visitor, isVariableDeclarationList)) ); }, [245 /* ExpressionStatement */]: function visitEachChildOfExpressionStatement(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateExpressionStatement( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)) ); }, [246 /* IfStatement */]: function visitEachChildOfIfStatement(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateIfStatement( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)), Debug.checkDefined(nodeVisitor(node.thenStatement, visitor, isStatement, context.factory.liftToBlock)), nodeVisitor(node.elseStatement, visitor, isStatement, context.factory.liftToBlock) ); }, [247 /* DoStatement */]: function visitEachChildOfDoStatement(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateDoStatement( node, visitIterationBody(node.statement, visitor, context, nodeVisitor), Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)) ); }, [248 /* WhileStatement */]: function visitEachChildOfWhileStatement(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateWhileStatement( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)), visitIterationBody(node.statement, visitor, context, nodeVisitor) ); }, [249 /* ForStatement */]: function visitEachChildOfForStatement(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateForStatement( node, nodeVisitor(node.initializer, visitor, isForInitializer), nodeVisitor(node.condition, visitor, isExpression), nodeVisitor(node.incrementor, visitor, isExpression), visitIterationBody(node.statement, visitor, context, nodeVisitor) ); }, [250 /* ForInStatement */]: function visitEachChildOfForInStatement(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateForInStatement( node, Debug.checkDefined(nodeVisitor(node.initializer, visitor, isForInitializer)), Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)), visitIterationBody(node.statement, visitor, context, nodeVisitor) ); }, [251 /* ForOfStatement */]: function visitEachChildOfForOfStatement(node, visitor, context, _nodesVisitor, nodeVisitor, tokenVisitor) { return context.factory.updateForOfStatement( node, tokenVisitor ? nodeVisitor(node.awaitModifier, tokenVisitor, isAwaitKeyword) : node.awaitModifier, Debug.checkDefined(nodeVisitor(node.initializer, visitor, isForInitializer)), Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)), visitIterationBody(node.statement, visitor, context, nodeVisitor) ); }, [252 /* ContinueStatement */]: function visitEachChildOfContinueStatement(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateContinueStatement( node, nodeVisitor(node.label, visitor, isIdentifier) ); }, [253 /* BreakStatement */]: function visitEachChildOfBreakStatement(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateBreakStatement( node, nodeVisitor(node.label, visitor, isIdentifier) ); }, [254 /* ReturnStatement */]: function visitEachChildOfReturnStatement(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateReturnStatement( node, nodeVisitor(node.expression, visitor, isExpression) ); }, [255 /* WithStatement */]: function visitEachChildOfWithStatement(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateWithStatement( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)), Debug.checkDefined(nodeVisitor(node.statement, visitor, isStatement, context.factory.liftToBlock)) ); }, [256 /* SwitchStatement */]: function visitEachChildOfSwitchStatement(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateSwitchStatement( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)), Debug.checkDefined(nodeVisitor(node.caseBlock, visitor, isCaseBlock)) ); }, [257 /* LabeledStatement */]: function visitEachChildOfLabeledStatement(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateLabeledStatement( node, Debug.checkDefined(nodeVisitor(node.label, visitor, isIdentifier)), Debug.checkDefined(nodeVisitor(node.statement, visitor, isStatement, context.factory.liftToBlock)) ); }, [258 /* ThrowStatement */]: function visitEachChildOfThrowStatement(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateThrowStatement( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)) ); }, [259 /* TryStatement */]: function visitEachChildOfTryStatement(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateTryStatement( node, Debug.checkDefined(nodeVisitor(node.tryBlock, visitor, isBlock)), nodeVisitor(node.catchClause, visitor, isCatchClause), nodeVisitor(node.finallyBlock, visitor, isBlock) ); }, [261 /* VariableDeclaration */]: function visitEachChildOfVariableDeclaration(node, visitor, context, _nodesVisitor, nodeVisitor, tokenVisitor) { return context.factory.updateVariableDeclaration( node, Debug.checkDefined(nodeVisitor(node.name, visitor, isBindingName)), tokenVisitor ? nodeVisitor(node.exclamationToken, tokenVisitor, isExclamationToken) : node.exclamationToken, nodeVisitor(node.type, visitor, isTypeNode), nodeVisitor(node.initializer, visitor, isExpression) ); }, [262 /* VariableDeclarationList */]: function visitEachChildOfVariableDeclarationList(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) { return context.factory.updateVariableDeclarationList( node, nodesVisitor(node.declarations, visitor, isVariableDeclaration) ); }, [263 /* FunctionDeclaration */]: function visitEachChildOfFunctionDeclaration(node, visitor, context, nodesVisitor, nodeVisitor, tokenVisitor) { return context.factory.updateFunctionDeclaration( node, nodesVisitor(node.modifiers, visitor, isModifier), tokenVisitor ? nodeVisitor(node.asteriskToken, tokenVisitor, isAsteriskToken) : node.asteriskToken, nodeVisitor(node.name, visitor, isIdentifier), nodesVisitor(node.typeParameters, visitor, isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), nodeVisitor(node.type, visitor, isTypeNode), visitFunctionBody(node.body, visitor, context, nodeVisitor) ); }, [264 /* ClassDeclaration */]: function visitEachChildOfClassDeclaration(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateClassDeclaration( node, nodesVisitor(node.modifiers, visitor, isModifierLike), nodeVisitor(node.name, visitor, isIdentifier), nodesVisitor(node.typeParameters, visitor, isTypeParameterDeclaration), nodesVisitor(node.heritageClauses, visitor, isHeritageClause), nodesVisitor(node.members, visitor, isClassElement) ); }, [265 /* InterfaceDeclaration */]: function visitEachChildOfInterfaceDeclaration(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateInterfaceDeclaration( node, nodesVisitor(node.modifiers, visitor, isModifierLike), Debug.checkDefined(nodeVisitor(node.name, visitor, isIdentifier)), nodesVisitor(node.typeParameters, visitor, isTypeParameterDeclaration), nodesVisitor(node.heritageClauses, visitor, isHeritageClause), nodesVisitor(node.members, visitor, isTypeElement) ); }, [266 /* TypeAliasDeclaration */]: function visitEachChildOfTypeAliasDeclaration(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateTypeAliasDeclaration( node, nodesVisitor(node.modifiers, visitor, isModifierLike), Debug.checkDefined(nodeVisitor(node.name, visitor, isIdentifier)), nodesVisitor(node.typeParameters, visitor, isTypeParameterDeclaration), Debug.checkDefined(nodeVisitor(node.type, visitor, isTypeNode)) ); }, [267 /* EnumDeclaration */]: function visitEachChildOfEnumDeclaration(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateEnumDeclaration( node, nodesVisitor(node.modifiers, visitor, isModifierLike), Debug.checkDefined(nodeVisitor(node.name, visitor, isIdentifier)), nodesVisitor(node.members, visitor, isEnumMember) ); }, [268 /* ModuleDeclaration */]: function visitEachChildOfModuleDeclaration(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateModuleDeclaration( node, nodesVisitor(node.modifiers, visitor, isModifierLike), Debug.checkDefined(nodeVisitor(node.name, visitor, isModuleName)), nodeVisitor(node.body, visitor, isModuleBody) ); }, [269 /* ModuleBlock */]: function visitEachChildOfModuleBlock(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) { return context.factory.updateModuleBlock( node, nodesVisitor(node.statements, visitor, isStatement) ); }, [270 /* CaseBlock */]: function visitEachChildOfCaseBlock(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) { return context.factory.updateCaseBlock( node, nodesVisitor(node.clauses, visitor, isCaseOrDefaultClause) ); }, [271 /* NamespaceExportDeclaration */]: function visitEachChildOfNamespaceExportDeclaration(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateNamespaceExportDeclaration( node, Debug.checkDefined(nodeVisitor(node.name, visitor, isIdentifier)) ); }, [272 /* ImportEqualsDeclaration */]: function visitEachChildOfImportEqualsDeclaration(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateImportEqualsDeclaration( node, nodesVisitor(node.modifiers, visitor, isModifierLike), node.isTypeOnly, Debug.checkDefined(nodeVisitor(node.name, visitor, isIdentifier)), Debug.checkDefined(nodeVisitor(node.moduleReference, visitor, isModuleReference)) ); }, [273 /* ImportDeclaration */]: function visitEachChildOfImportDeclaration(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateImportDeclaration( node, nodesVisitor(node.modifiers, visitor, isModifierLike), nodeVisitor(node.importClause, visitor, isImportClause), Debug.checkDefined(nodeVisitor(node.moduleSpecifier, visitor, isExpression)), nodeVisitor(node.attributes, visitor, isImportAttributes) ); }, [301 /* ImportAttributes */]: function visitEachChildOfImportAttributes(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) { return context.factory.updateImportAttributes( node, nodesVisitor(node.elements, visitor, isImportAttribute), node.multiLine ); }, [302 /* ImportAttribute */]: function visitEachChildOfImportAttribute(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateImportAttribute( node, Debug.checkDefined(nodeVisitor(node.name, visitor, isImportAttributeName)), Debug.checkDefined(nodeVisitor(node.value, visitor, isExpression)) ); }, [274 /* ImportClause */]: function visitEachChildOfImportClause(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateImportClause( node, node.phaseModifier, nodeVisitor(node.name, visitor, isIdentifier), nodeVisitor(node.namedBindings, visitor, isNamedImportBindings) ); }, [275 /* NamespaceImport */]: function visitEachChildOfNamespaceImport(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateNamespaceImport( node, Debug.checkDefined(nodeVisitor(node.name, visitor, isIdentifier)) ); }, [281 /* NamespaceExport */]: function visitEachChildOfNamespaceExport(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateNamespaceExport( node, Debug.checkDefined(nodeVisitor(node.name, visitor, isIdentifier)) ); }, [276 /* NamedImports */]: function visitEachChildOfNamedImports(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) { return context.factory.updateNamedImports( node, nodesVisitor(node.elements, visitor, isImportSpecifier) ); }, [277 /* ImportSpecifier */]: function visitEachChildOfImportSpecifier(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateImportSpecifier( node, node.isTypeOnly, nodeVisitor(node.propertyName, visitor, isModuleExportName), Debug.checkDefined(nodeVisitor(node.name, visitor, isIdentifier)) ); }, [278 /* ExportAssignment */]: function visitEachChildOfExportAssignment(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateExportAssignment( node, nodesVisitor(node.modifiers, visitor, isModifierLike), Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)) ); }, [279 /* ExportDeclaration */]: function visitEachChildOfExportDeclaration(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateExportDeclaration( node, nodesVisitor(node.modifiers, visitor, isModifierLike), node.isTypeOnly, nodeVisitor(node.exportClause, visitor, isNamedExportBindings), nodeVisitor(node.moduleSpecifier, visitor, isExpression), nodeVisitor(node.attributes, visitor, isImportAttributes) ); }, [280 /* NamedExports */]: function visitEachChildOfNamedExports(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) { return context.factory.updateNamedExports( node, nodesVisitor(node.elements, visitor, isExportSpecifier) ); }, [282 /* ExportSpecifier */]: function visitEachChildOfExportSpecifier(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateExportSpecifier( node, node.isTypeOnly, nodeVisitor(node.propertyName, visitor, isModuleExportName), Debug.checkDefined(nodeVisitor(node.name, visitor, isModuleExportName)) ); }, // Module references [284 /* ExternalModuleReference */]: function visitEachChildOfExternalModuleReference(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateExternalModuleReference( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)) ); }, // JSX [285 /* JsxElement */]: function visitEachChildOfJsxElement(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateJsxElement( node, Debug.checkDefined(nodeVisitor(node.openingElement, visitor, isJsxOpeningElement)), nodesVisitor(node.children, visitor, isJsxChild), Debug.checkDefined(nodeVisitor(node.closingElement, visitor, isJsxClosingElement)) ); }, [286 /* JsxSelfClosingElement */]: function visitEachChildOfJsxSelfClosingElement(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateJsxSelfClosingElement( node, Debug.checkDefined(nodeVisitor(node.tagName, visitor, isJsxTagNameExpression)), nodesVisitor(node.typeArguments, visitor, isTypeNode), Debug.checkDefined(nodeVisitor(node.attributes, visitor, isJsxAttributes)) ); }, [287 /* JsxOpeningElement */]: function visitEachChildOfJsxOpeningElement(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateJsxOpeningElement( node, Debug.checkDefined(nodeVisitor(node.tagName, visitor, isJsxTagNameExpression)), nodesVisitor(node.typeArguments, visitor, isTypeNode), Debug.checkDefined(nodeVisitor(node.attributes, visitor, isJsxAttributes)) ); }, [288 /* JsxClosingElement */]: function visitEachChildOfJsxClosingElement(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateJsxClosingElement( node, Debug.checkDefined(nodeVisitor(node.tagName, visitor, isJsxTagNameExpression)) ); }, [296 /* JsxNamespacedName */]: function forEachChildInJsxNamespacedName2(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateJsxNamespacedName( node, Debug.checkDefined(nodeVisitor(node.namespace, visitor, isIdentifier)), Debug.checkDefined(nodeVisitor(node.name, visitor, isIdentifier)) ); }, [289 /* JsxFragment */]: function visitEachChildOfJsxFragment(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateJsxFragment( node, Debug.checkDefined(nodeVisitor(node.openingFragment, visitor, isJsxOpeningFragment)), nodesVisitor(node.children, visitor, isJsxChild), Debug.checkDefined(nodeVisitor(node.closingFragment, visitor, isJsxClosingFragment)) ); }, [292 /* JsxAttribute */]: function visitEachChildOfJsxAttribute(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateJsxAttribute( node, Debug.checkDefined(nodeVisitor(node.name, visitor, isJsxAttributeName)), nodeVisitor(node.initializer, visitor, isStringLiteralOrJsxExpression) ); }, [293 /* JsxAttributes */]: function visitEachChildOfJsxAttributes(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) { return context.factory.updateJsxAttributes( node, nodesVisitor(node.properties, visitor, isJsxAttributeLike) ); }, [294 /* JsxSpreadAttribute */]: function visitEachChildOfJsxSpreadAttribute(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateJsxSpreadAttribute( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)) ); }, [295 /* JsxExpression */]: function visitEachChildOfJsxExpression(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateJsxExpression( node, nodeVisitor(node.expression, visitor, isExpression) ); }, // Clauses [297 /* CaseClause */]: function visitEachChildOfCaseClause(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateCaseClause( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)), nodesVisitor(node.statements, visitor, isStatement) ); }, [298 /* DefaultClause */]: function visitEachChildOfDefaultClause(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) { return context.factory.updateDefaultClause( node, nodesVisitor(node.statements, visitor, isStatement) ); }, [299 /* HeritageClause */]: function visitEachChildOfHeritageClause(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) { return context.factory.updateHeritageClause( node, nodesVisitor(node.types, visitor, isExpressionWithTypeArguments) ); }, [300 /* CatchClause */]: function visitEachChildOfCatchClause(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateCatchClause( node, nodeVisitor(node.variableDeclaration, visitor, isVariableDeclaration), Debug.checkDefined(nodeVisitor(node.block, visitor, isBlock)) ); }, // Property assignments [304 /* PropertyAssignment */]: function visitEachChildOfPropertyAssignment(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updatePropertyAssignment( node, Debug.checkDefined(nodeVisitor(node.name, visitor, isPropertyName)), Debug.checkDefined(nodeVisitor(node.initializer, visitor, isExpression)) ); }, [305 /* ShorthandPropertyAssignment */]: function visitEachChildOfShorthandPropertyAssignment(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateShorthandPropertyAssignment( node, Debug.checkDefined(nodeVisitor(node.name, visitor, isIdentifier)), nodeVisitor(node.objectAssignmentInitializer, visitor, isExpression) ); }, [306 /* SpreadAssignment */]: function visitEachChildOfSpreadAssignment(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateSpreadAssignment( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)) ); }, // Enum [307 /* EnumMember */]: function visitEachChildOfEnumMember(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updateEnumMember( node, Debug.checkDefined(nodeVisitor(node.name, visitor, isPropertyName)), nodeVisitor(node.initializer, visitor, isExpression) ); }, // Top-level nodes [308 /* SourceFile */]: function visitEachChildOfSourceFile(node, visitor, context, _nodesVisitor, _nodeVisitor, _tokenVisitor) { return context.factory.updateSourceFile( node, visitLexicalEnvironment(node.statements, visitor, context) ); }, // Transformation nodes [356 /* PartiallyEmittedExpression */]: function visitEachChildOfPartiallyEmittedExpression(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) { return context.factory.updatePartiallyEmittedExpression( node, Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression)) ); }, [357 /* CommaListExpression */]: function visitEachChildOfCommaListExpression(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) { return context.factory.updateCommaListExpression( node, nodesVisitor(node.elements, visitor, isExpression) ); } }; function extractSingleNode(nodes) { Debug.assert(nodes.length <= 1, "Too many nodes written to output."); return singleOrUndefined(nodes); } // src/compiler/sourcemap.ts function createSourceMapGenerator(host, file, sourceRoot, sourcesDirectoryPath, generatorOptions) { var { enter, exit } = generatorOptions.extendedDiagnostics ? createTimer("Source Map", "beforeSourcemap", "afterSourcemap") : nullTimer; var rawSources = []; var sources = []; var sourceToSourceIndexMap = /* @__PURE__ */ new Map(); var sourcesContent; var names = []; var nameToNameIndexMap; var mappingCharCodes = []; var mappings = ""; var lastGeneratedLine = 0; var lastGeneratedCharacter = 0; var lastSourceIndex = 0; var lastSourceLine = 0; var lastSourceCharacter = 0; var lastNameIndex = 0; var hasLast = false; var pendingGeneratedLine = 0; var pendingGeneratedCharacter = 0; var pendingSourceIndex = 0; var pendingSourceLine = 0; var pendingSourceCharacter = 0; var pendingNameIndex = 0; var hasPending = false; var hasPendingSource = false; var hasPendingName = false; return { getSources: () => rawSources, addSource, setSourceContent, addName, addMapping, appendSourceMap, toJSON, toString: () => JSON.stringify(toJSON()) }; function addSource(fileName) { enter(); const source = getRelativePathToDirectoryOrUrl( sourcesDirectoryPath, fileName, host.getCurrentDirectory(), host.getCanonicalFileName, /*isAbsolutePathAnUrl*/ true ); let sourceIndex = sourceToSourceIndexMap.get(source); if (sourceIndex === void 0) { sourceIndex = sources.length; sources.push(source); rawSources.push(fileName); sourceToSourceIndexMap.set(source, sourceIndex); } exit(); return sourceIndex; } function setSourceContent(sourceIndex, content) { enter(); if (content !== null) { if (!sourcesContent) sourcesContent = []; while (sourcesContent.length < sourceIndex) { sourcesContent.push(null); } sourcesContent[sourceIndex] = content; } exit(); } function addName(name) { enter(); if (!nameToNameIndexMap) nameToNameIndexMap = /* @__PURE__ */ new Map(); let nameIndex = nameToNameIndexMap.get(name); if (nameIndex === void 0) { nameIndex = names.length; names.push(name); nameToNameIndexMap.set(name, nameIndex); } exit(); return nameIndex; } function isNewGeneratedPosition(generatedLine, generatedCharacter) { return !hasPending || pendingGeneratedLine !== generatedLine || pendingGeneratedCharacter !== generatedCharacter; } function isBacktrackingSourcePosition(sourceIndex, sourceLine, sourceCharacter) { return sourceIndex !== void 0 && sourceLine !== void 0 && sourceCharacter !== void 0 && pendingSourceIndex === sourceIndex && (pendingSourceLine > sourceLine || pendingSourceLine === sourceLine && pendingSourceCharacter > sourceCharacter); } function addMapping(generatedLine, generatedCharacter, sourceIndex, sourceLine, sourceCharacter, nameIndex) { Debug.assert(generatedLine >= pendingGeneratedLine, "generatedLine cannot backtrack"); Debug.assert(generatedCharacter >= 0, "generatedCharacter cannot be negative"); Debug.assert(sourceIndex === void 0 || sourceIndex >= 0, "sourceIndex cannot be negative"); Debug.assert(sourceLine === void 0 || sourceLine >= 0, "sourceLine cannot be negative"); Debug.assert(sourceCharacter === void 0 || sourceCharacter >= 0, "sourceCharacter cannot be negative"); enter(); if (isNewGeneratedPosition(generatedLine, generatedCharacter) || isBacktrackingSourcePosition(sourceIndex, sourceLine, sourceCharacter)) { commitPendingMapping(); pendingGeneratedLine = generatedLine; pendingGeneratedCharacter = generatedCharacter; hasPendingSource = false; hasPendingName = false; hasPending = true; } if (sourceIndex !== void 0 && sourceLine !== void 0 && sourceCharacter !== void 0) { pendingSourceIndex = sourceIndex; pendingSourceLine = sourceLine; pendingSourceCharacter = sourceCharacter; hasPendingSource = true; if (nameIndex !== void 0) { pendingNameIndex = nameIndex; hasPendingName = true; } } exit(); } function appendSourceMap(generatedLine, generatedCharacter, map2, sourceMapPath, start, end) { Debug.assert(generatedLine >= pendingGeneratedLine, "generatedLine cannot backtrack"); Debug.assert(generatedCharacter >= 0, "generatedCharacter cannot be negative"); enter(); const sourceIndexToNewSourceIndexMap = []; let nameIndexToNewNameIndexMap; const mappingIterator = decodeMappings(map2.mappings); for (const raw of mappingIterator) { if (end && (raw.generatedLine > end.line || raw.generatedLine === end.line && raw.generatedCharacter > end.character)) { break; } if (start && (raw.generatedLine < start.line || start.line === raw.generatedLine && raw.generatedCharacter < start.character)) { continue; } let newSourceIndex; let newSourceLine; let newSourceCharacter; let newNameIndex; if (raw.sourceIndex !== void 0) { newSourceIndex = sourceIndexToNewSourceIndexMap[raw.sourceIndex]; if (newSourceIndex === void 0) { const rawPath = map2.sources[raw.sourceIndex]; const relativePath = map2.sourceRoot ? combinePaths(map2.sourceRoot, rawPath) : rawPath; const combinedPath = combinePaths(getDirectoryPath(sourceMapPath), relativePath); sourceIndexToNewSourceIndexMap[raw.sourceIndex] = newSourceIndex = addSource(combinedPath); if (map2.sourcesContent && typeof map2.sourcesContent[raw.sourceIndex] === "string") { setSourceContent(newSourceIndex, map2.sourcesContent[raw.sourceIndex]); } } newSourceLine = raw.sourceLine; newSourceCharacter = raw.sourceCharacter; if (map2.names && raw.nameIndex !== void 0) { if (!nameIndexToNewNameIndexMap) nameIndexToNewNameIndexMap = []; newNameIndex = nameIndexToNewNameIndexMap[raw.nameIndex]; if (newNameIndex === void 0) { nameIndexToNewNameIndexMap[raw.nameIndex] = newNameIndex = addName(map2.names[raw.nameIndex]); } } } const rawGeneratedLine = raw.generatedLine - (start ? start.line : 0); const newGeneratedLine = rawGeneratedLine + generatedLine; const rawGeneratedCharacter = start && start.line === raw.generatedLine ? raw.generatedCharacter - start.character : raw.generatedCharacter; const newGeneratedCharacter = rawGeneratedLine === 0 ? rawGeneratedCharacter + generatedCharacter : rawGeneratedCharacter; addMapping(newGeneratedLine, newGeneratedCharacter, newSourceIndex, newSourceLine, newSourceCharacter, newNameIndex); } exit(); } function shouldCommitMapping() { return !hasLast || lastGeneratedLine !== pendingGeneratedLine || lastGeneratedCharacter !== pendingGeneratedCharacter || lastSourceIndex !== pendingSourceIndex || lastSourceLine !== pendingSourceLine || lastSourceCharacter !== pendingSourceCharacter || lastNameIndex !== pendingNameIndex; } function appendMappingCharCode(charCode) { mappingCharCodes.push(charCode); if (mappingCharCodes.length >= 1024) { flushMappingBuffer(); } } function commitPendingMapping() { if (!hasPending || !shouldCommitMapping()) { return; } enter(); if (lastGeneratedLine < pendingGeneratedLine) { do { appendMappingCharCode(59 /* semicolon */); lastGeneratedLine++; } while (lastGeneratedLine < pendingGeneratedLine); lastGeneratedCharacter = 0; } else { Debug.assertEqual(lastGeneratedLine, pendingGeneratedLine, "generatedLine cannot backtrack"); if (hasLast) { appendMappingCharCode(44 /* comma */); } } appendBase64VLQ(pendingGeneratedCharacter - lastGeneratedCharacter); lastGeneratedCharacter = pendingGeneratedCharacter; if (hasPendingSource) { appendBase64VLQ(pendingSourceIndex - lastSourceIndex); lastSourceIndex = pendingSourceIndex; appendBase64VLQ(pendingSourceLine - lastSourceLine); lastSourceLine = pendingSourceLine; appendBase64VLQ(pendingSourceCharacter - lastSourceCharacter); lastSourceCharacter = pendingSourceCharacter; if (hasPendingName) { appendBase64VLQ(pendingNameIndex - lastNameIndex); lastNameIndex = pendingNameIndex; } } hasLast = true; exit(); } function flushMappingBuffer() { if (mappingCharCodes.length > 0) { mappings += String.fromCharCode.apply(void 0, mappingCharCodes); mappingCharCodes.length = 0; } } function toJSON() { commitPendingMapping(); flushMappingBuffer(); return { version: 3, file, sourceRoot, sources, names, mappings, sourcesContent }; } function appendBase64VLQ(inValue) { if (inValue < 0) { inValue = (-inValue << 1) + 1; } else { inValue = inValue << 1; } do { let currentDigit = inValue & 31; inValue = inValue >> 5; if (inValue > 0) { currentDigit = currentDigit | 32; } appendMappingCharCode(base64FormatEncode(currentDigit)); } while (inValue > 0); } } var sourceMapCommentRegExpDontCareLineStart = /\/\/[@#] source[M]appingURL=(.+)\r?\n?$/; var sourceMapCommentRegExp = /^\/\/[@#] source[M]appingURL=(.+)\r?\n?$/; var whitespaceOrMapCommentRegExp = /^\s*(\/\/[@#] .*)?$/; function decodeMappings(mappings) { let done = false; let pos = 0; let generatedLine = 0; let generatedCharacter = 0; let sourceIndex = 0; let sourceLine = 0; let sourceCharacter = 0; let nameIndex = 0; let error; return { get pos() { return pos; }, get error() { return error; }, get state() { return captureMapping( /*hasSource*/ true, /*hasName*/ true ); }, next() { while (!done && pos < mappings.length) { const ch = mappings.charCodeAt(pos); if (ch === 59 /* semicolon */) { generatedLine++; generatedCharacter = 0; pos++; continue; } if (ch === 44 /* comma */) { pos++; continue; } let hasSource = false; let hasName = false; generatedCharacter += base64VLQFormatDecode(); if (hasReportedError()) return stopIterating(); if (generatedCharacter < 0) return setErrorAndStopIterating("Invalid generatedCharacter found"); if (!isSourceMappingSegmentEnd()) { hasSource = true; sourceIndex += base64VLQFormatDecode(); if (hasReportedError()) return stopIterating(); if (sourceIndex < 0) return setErrorAndStopIterating("Invalid sourceIndex found"); if (isSourceMappingSegmentEnd()) return setErrorAndStopIterating("Unsupported Format: No entries after sourceIndex"); sourceLine += base64VLQFormatDecode(); if (hasReportedError()) return stopIterating(); if (sourceLine < 0) return setErrorAndStopIterating("Invalid sourceLine found"); if (isSourceMappingSegmentEnd()) return setErrorAndStopIterating("Unsupported Format: No entries after sourceLine"); sourceCharacter += base64VLQFormatDecode(); if (hasReportedError()) return stopIterating(); if (sourceCharacter < 0) return setErrorAndStopIterating("Invalid sourceCharacter found"); if (!isSourceMappingSegmentEnd()) { hasName = true; nameIndex += base64VLQFormatDecode(); if (hasReportedError()) return stopIterating(); if (nameIndex < 0) return setErrorAndStopIterating("Invalid nameIndex found"); if (!isSourceMappingSegmentEnd()) return setErrorAndStopIterating("Unsupported Error Format: Entries after nameIndex"); } } return { value: captureMapping(hasSource, hasName), done }; } return stopIterating(); }, [Symbol.iterator]() { return this; } }; function captureMapping(hasSource, hasName) { return { generatedLine, generatedCharacter, sourceIndex: hasSource ? sourceIndex : void 0, sourceLine: hasSource ? sourceLine : void 0, sourceCharacter: hasSource ? sourceCharacter : void 0, nameIndex: hasName ? nameIndex : void 0 }; } function stopIterating() { done = true; return { value: void 0, done: true }; } function setError(message) { if (error === void 0) { error = message; } } function setErrorAndStopIterating(message) { setError(message); return stopIterating(); } function hasReportedError() { return error !== void 0; } function isSourceMappingSegmentEnd() { return pos === mappings.length || mappings.charCodeAt(pos) === 44 /* comma */ || mappings.charCodeAt(pos) === 59 /* semicolon */; } function base64VLQFormatDecode() { let moreDigits = true; let shiftCount = 0; let value = 0; for (; moreDigits; pos++) { if (pos >= mappings.length) return setError("Error in decoding base64VLQFormatDecode, past the mapping string"), -1; const currentByte = base64FormatDecode(mappings.charCodeAt(pos)); if (currentByte === -1) return setError("Invalid character in VLQ"), -1; moreDigits = (currentByte & 32) !== 0; value = value | (currentByte & 31) << shiftCount; shiftCount += 5; } if ((value & 1) === 0) { value = value >> 1; } else { value = value >> 1; value = -value; } return value; } } function base64FormatEncode(value) { return value >= 0 && value < 26 ? 65 /* A */ + value : value >= 26 && value < 52 ? 97 /* a */ + value - 26 : value >= 52 && value < 62 ? 48 /* _0 */ + value - 52 : value === 62 ? 43 /* plus */ : value === 63 ? 47 /* slash */ : Debug.fail(`${value}: not a base64 value`); } function base64FormatDecode(ch) { return ch >= 65 /* A */ && ch <= 90 /* Z */ ? ch - 65 /* A */ : ch >= 97 /* a */ && ch <= 122 /* z */ ? ch - 97 /* a */ + 26 : ch >= 48 /* _0 */ && ch <= 57 /* _9 */ ? ch - 48 /* _0 */ + 52 : ch === 43 /* plus */ ? 62 : ch === 47 /* slash */ ? 63 : -1; } // src/compiler/transformers/utilities.ts function getOriginalNodeId(node) { node = getOriginalNode(node); return node ? getNodeId(node) : 0; } function containsDefaultReference(node) { if (!node) return false; if (!isNamedImports(node) && !isNamedExports(node)) return false; return some(node.elements, isNamedDefaultReference); } function isNamedDefaultReference(e) { return moduleExportNameIsDefault(e.propertyName || e.name); } function chainBundle(context, transformSourceFile) { return transformSourceFileOrBundle; function transformSourceFileOrBundle(node) { return node.kind === 308 /* SourceFile */ ? transformSourceFile(node) : transformBundle(node); } function transformBundle(node) { return context.factory.createBundle(map(node.sourceFiles, transformSourceFile)); } } function getExportNeedsImportStarHelper(node) { return !!getNamespaceDeclarationNode(node); } function getImportNeedsImportStarHelper(node) { if (!!getNamespaceDeclarationNode(node)) { return true; } const bindings = node.importClause && node.importClause.namedBindings; if (!bindings) { return false; } if (!isNamedImports(bindings)) return false; let defaultRefCount = 0; for (const binding of bindings.elements) { if (isNamedDefaultReference(binding)) { defaultRefCount++; } } return defaultRefCount > 0 && defaultRefCount !== bindings.elements.length || !!(bindings.elements.length - defaultRefCount) && isDefaultImport(node); } function getImportNeedsImportDefaultHelper(node) { return !getImportNeedsImportStarHelper(node) && (isDefaultImport(node) || !!node.importClause && isNamedImports(node.importClause.namedBindings) && containsDefaultReference(node.importClause.namedBindings)); } function collectExternalModuleInfo(context, sourceFile) { const resolver = context.getEmitResolver(); const compilerOptions = context.getCompilerOptions(); const externalImports = []; const exportSpecifiers = new IdentifierNameMultiMap(); const exportedBindings = []; const uniqueExports = /* @__PURE__ */ new Map(); const exportedFunctions = /* @__PURE__ */ new Set(); let exportedNames; let hasExportDefault = false; let exportEquals; let hasExportStarsToExportValues = false; let hasImportStar = false; let hasImportDefault = false; for (const node of sourceFile.statements) { switch (node.kind) { case 273 /* ImportDeclaration */: externalImports.push(node); if (!hasImportStar && getImportNeedsImportStarHelper(node)) { hasImportStar = true; } if (!hasImportDefault && getImportNeedsImportDefaultHelper(node)) { hasImportDefault = true; } break; case 272 /* ImportEqualsDeclaration */: if (node.moduleReference.kind === 284 /* ExternalModuleReference */) { externalImports.push(node); } break; case 279 /* ExportDeclaration */: if (node.moduleSpecifier) { if (!node.exportClause) { externalImports.push(node); hasExportStarsToExportValues = true; } else { externalImports.push(node); if (isNamedExports(node.exportClause)) { addExportedNamesForExportDeclaration(node); hasImportDefault || (hasImportDefault = containsDefaultReference(node.exportClause)); } else { const name = node.exportClause.name; const nameText = moduleExportNameTextUnescaped(name); if (!uniqueExports.get(nameText)) { multiMapSparseArrayAdd(exportedBindings, getOriginalNodeId(node), name); uniqueExports.set(nameText, true); exportedNames = append(exportedNames, name); } hasImportStar = true; } } } else { addExportedNamesForExportDeclaration(node); } break; case 278 /* ExportAssignment */: if (node.isExportEquals && !exportEquals) { exportEquals = node; } break; case 244 /* VariableStatement */: if (hasSyntacticModifier(node, 32 /* Export */)) { for (const decl of node.declarationList.declarations) { exportedNames = collectExportedVariableInfo(decl, uniqueExports, exportedNames, exportedBindings); } } break; case 263 /* FunctionDeclaration */: if (hasSyntacticModifier(node, 32 /* Export */)) { addExportedFunctionDeclaration( node, /*name*/ void 0, hasSyntacticModifier(node, 2048 /* Default */) ); } break; case 264 /* ClassDeclaration */: if (hasSyntacticModifier(node, 32 /* Export */)) { if (hasSyntacticModifier(node, 2048 /* Default */)) { if (!hasExportDefault) { multiMapSparseArrayAdd(exportedBindings, getOriginalNodeId(node), context.factory.getDeclarationName(node)); hasExportDefault = true; } } else { const name = node.name; if (name && !uniqueExports.get(idText(name))) { multiMapSparseArrayAdd(exportedBindings, getOriginalNodeId(node), name); uniqueExports.set(idText(name), true); exportedNames = append(exportedNames, name); } } } break; } } const externalHelpersImportDeclaration = createExternalHelpersImportDeclarationIfNeeded(context.factory, context.getEmitHelperFactory(), sourceFile, compilerOptions, hasExportStarsToExportValues, hasImportStar, hasImportDefault); if (externalHelpersImportDeclaration) { externalImports.unshift(externalHelpersImportDeclaration); } return { externalImports, exportSpecifiers, exportEquals, hasExportStarsToExportValues, exportedBindings, exportedNames, exportedFunctions, externalHelpersImportDeclaration }; function addExportedNamesForExportDeclaration(node) { for (const specifier of cast(node.exportClause, isNamedExports).elements) { const specifierNameText = moduleExportNameTextUnescaped(specifier.name); if (!uniqueExports.get(specifierNameText)) { const name = specifier.propertyName || specifier.name; if (name.kind !== 11 /* StringLiteral */) { if (!node.moduleSpecifier) { exportSpecifiers.add(name, specifier); } const decl = resolver.getReferencedImportDeclaration(name) || resolver.getReferencedValueDeclaration(name); if (decl) { if (decl.kind === 263 /* FunctionDeclaration */) { addExportedFunctionDeclaration(decl, specifier.name, moduleExportNameIsDefault(specifier.name)); continue; } multiMapSparseArrayAdd(exportedBindings, getOriginalNodeId(decl), specifier.name); } } uniqueExports.set(specifierNameText, true); exportedNames = append(exportedNames, specifier.name); } } } function addExportedFunctionDeclaration(node, name, isDefault) { exportedFunctions.add(getOriginalNode(node, isFunctionDeclaration)); if (isDefault) { if (!hasExportDefault) { multiMapSparseArrayAdd(exportedBindings, getOriginalNodeId(node), name ?? context.factory.getDeclarationName(node)); hasExportDefault = true; } } else { name ?? (name = node.name); const nameText = moduleExportNameTextUnescaped(name); if (!uniqueExports.get(nameText)) { multiMapSparseArrayAdd(exportedBindings, getOriginalNodeId(node), name); uniqueExports.set(nameText, true); } } } } function collectExportedVariableInfo(decl, uniqueExports, exportedNames, exportedBindings) { if (isBindingPattern(decl.name)) { for (const element of decl.name.elements) { if (!isOmittedExpression(element)) { exportedNames = collectExportedVariableInfo(element, uniqueExports, exportedNames, exportedBindings); } } } else if (!isGeneratedIdentifier(decl.name)) { const text = idText(decl.name); if (!uniqueExports.get(text)) { uniqueExports.set(text, true); exportedNames = append(exportedNames, decl.name); if (isLocalName(decl.name)) { multiMapSparseArrayAdd(exportedBindings, getOriginalNodeId(decl), decl.name); } } } return exportedNames; } function multiMapSparseArrayAdd(map2, key, value) { let values = map2[key]; if (values) { values.push(value); } else { map2[key] = values = [value]; } return values; } var IdentifierNameMap = class _IdentifierNameMap { constructor() { this._map = /* @__PURE__ */ new Map(); } get size() { return this._map.size; } has(key) { return this._map.has(_IdentifierNameMap.toKey(key)); } get(key) { return this._map.get(_IdentifierNameMap.toKey(key)); } set(key, value) { this._map.set(_IdentifierNameMap.toKey(key), value); return this; } delete(key) { var _a; return ((_a = this._map) == null ? void 0 : _a.delete(_IdentifierNameMap.toKey(key))) ?? false; } clear() { this._map.clear(); } values() { return this._map.values(); } static toKey(name) { if (isGeneratedPrivateIdentifier(name) || isGeneratedIdentifier(name)) { const autoGenerate = name.emitNode.autoGenerate; if ((autoGenerate.flags & 7 /* KindMask */) === 4 /* Node */) { const node = getNodeForGeneratedName(name); const baseName = isMemberName(node) && node !== name ? _IdentifierNameMap.toKey(node) : `(generated@${getNodeId(node)})`; return formatGeneratedName( /*privateName*/ false, autoGenerate.prefix, baseName, autoGenerate.suffix, _IdentifierNameMap.toKey ); } else { const baseName = `(auto@${autoGenerate.id})`; return formatGeneratedName( /*privateName*/ false, autoGenerate.prefix, baseName, autoGenerate.suffix, _IdentifierNameMap.toKey ); } } if (isPrivateIdentifier(name)) { return idText(name).slice(1); } return idText(name); } }; var IdentifierNameMultiMap = class extends IdentifierNameMap { add(key, value) { let values = this.get(key); if (values) { values.push(value); } else { this.set(key, values = [value]); } return values; } remove(key, value) { const values = this.get(key); if (values) { unorderedRemoveItem(values, value); if (!values.length) { this.delete(key); } } } }; function isSimpleCopiableExpression(expression) { return isStringLiteralLike(expression) || expression.kind === 9 /* NumericLiteral */ || isKeyword(expression.kind) || isIdentifier(expression); } function isSimpleInlineableExpression(expression) { return !isIdentifier(expression) && isSimpleCopiableExpression(expression); } function isCompoundAssignment(kind) { return kind >= 65 /* FirstCompoundAssignment */ && kind <= 79 /* LastCompoundAssignment */; } function getNonAssignmentOperatorForCompoundAssignment(kind) { switch (kind) { case 65 /* PlusEqualsToken */: return 40 /* PlusToken */; case 66 /* MinusEqualsToken */: return 41 /* MinusToken */; case 67 /* AsteriskEqualsToken */: return 42 /* AsteriskToken */; case 68 /* AsteriskAsteriskEqualsToken */: return 43 /* AsteriskAsteriskToken */; case 69 /* SlashEqualsToken */: return 44 /* SlashToken */; case 70 /* PercentEqualsToken */: return 45 /* PercentToken */; case 71 /* LessThanLessThanEqualsToken */: return 48 /* LessThanLessThanToken */; case 72 /* GreaterThanGreaterThanEqualsToken */: return 49 /* GreaterThanGreaterThanToken */; case 73 /* GreaterThanGreaterThanGreaterThanEqualsToken */: return 50 /* GreaterThanGreaterThanGreaterThanToken */; case 74 /* AmpersandEqualsToken */: return 51 /* AmpersandToken */; case 75 /* BarEqualsToken */: return 52 /* BarToken */; case 79 /* CaretEqualsToken */: return 53 /* CaretToken */; case 76 /* BarBarEqualsToken */: return 57 /* BarBarToken */; case 77 /* AmpersandAmpersandEqualsToken */: return 56 /* AmpersandAmpersandToken */; case 78 /* QuestionQuestionEqualsToken */: return 61 /* QuestionQuestionToken */; } } function getSuperCallFromStatement(statement) { if (!isExpressionStatement(statement)) { return void 0; } const expression = skipParentheses(statement.expression); return isSuperCall(expression) ? expression : void 0; } function findSuperStatementIndexPathWorker(statements, start, indices) { for (let i = start; i < statements.length; i += 1) { const statement = statements[i]; if (getSuperCallFromStatement(statement)) { indices.unshift(i); return true; } else if (isTryStatement(statement) && findSuperStatementIndexPathWorker(statement.tryBlock.statements, 0, indices)) { indices.unshift(i); return true; } } return false; } function findSuperStatementIndexPath(statements, start) { const indices = []; findSuperStatementIndexPathWorker(statements, start, indices); return indices; } function getProperties(node, requireInitializer, isStatic2) { return filter(node.members, (m) => isInitializedOrStaticProperty(m, requireInitializer, isStatic2)); } function isStaticPropertyDeclarationOrClassStaticBlockDeclaration(element) { return isStaticPropertyDeclaration(element) || isClassStaticBlockDeclaration(element); } function getStaticPropertiesAndClassStaticBlock(node) { return filter(node.members, isStaticPropertyDeclarationOrClassStaticBlockDeclaration); } function isInitializedOrStaticProperty(member, requireInitializer, isStatic2) { return isPropertyDeclaration(member) && (!!member.initializer || !requireInitializer) && hasStaticModifier(member) === isStatic2; } function isStaticPropertyDeclaration(member) { return isPropertyDeclaration(member) && hasStaticModifier(member); } function isInitializedProperty(member) { return member.kind === 173 /* PropertyDeclaration */ && member.initializer !== void 0; } function isNonStaticMethodOrAccessorWithPrivateName(member) { return !isStatic(member) && (isMethodOrAccessor(member) || isAutoAccessorPropertyDeclaration(member)) && isPrivateIdentifier(member.name); } function getDecoratorsOfParameters(node) { let decorators; if (node) { const parameters = node.parameters; const firstParameterIsThis = parameters.length > 0 && parameterIsThisKeyword(parameters[0]); const firstParameterOffset = firstParameterIsThis ? 1 : 0; const numParameters = firstParameterIsThis ? parameters.length - 1 : parameters.length; for (let i = 0; i < numParameters; i++) { const parameter = parameters[i + firstParameterOffset]; if (decorators || hasDecorators(parameter)) { if (!decorators) { decorators = new Array(numParameters); } decorators[i] = getDecorators(parameter); } } } return decorators; } function getAllDecoratorsOfClass(node, useLegacyDecorators) { const decorators = getDecorators(node); const parameters = useLegacyDecorators ? getDecoratorsOfParameters(getFirstConstructorWithBody(node)) : void 0; if (!some(decorators) && !some(parameters)) { return void 0; } return { decorators, parameters }; } function getAllDecoratorsOfClassElement(member, parent, useLegacyDecorators) { switch (member.kind) { case 178 /* GetAccessor */: case 179 /* SetAccessor */: if (!useLegacyDecorators) { return getAllDecoratorsOfMethod( member, /*useLegacyDecorators*/ false ); } return getAllDecoratorsOfAccessors( member, parent, /*useLegacyDecorators*/ true ); case 175 /* MethodDeclaration */: return getAllDecoratorsOfMethod(member, useLegacyDecorators); case 173 /* PropertyDeclaration */: return getAllDecoratorsOfProperty(member); default: return void 0; } } function getAllDecoratorsOfAccessors(accessor, parent, useLegacyDecorators) { if (!accessor.body) { return void 0; } const { firstAccessor, secondAccessor, getAccessor, setAccessor } = getAllAccessorDeclarations(parent.members, accessor); const firstAccessorWithDecorators = hasDecorators(firstAccessor) ? firstAccessor : secondAccessor && hasDecorators(secondAccessor) ? secondAccessor : void 0; if (!firstAccessorWithDecorators || accessor !== firstAccessorWithDecorators) { return void 0; } const decorators = getDecorators(firstAccessorWithDecorators); const parameters = useLegacyDecorators ? getDecoratorsOfParameters(setAccessor) : void 0; if (!some(decorators) && !some(parameters)) { return void 0; } return { decorators, parameters, getDecorators: getAccessor && getDecorators(getAccessor), setDecorators: setAccessor && getDecorators(setAccessor) }; } function getAllDecoratorsOfMethod(method, useLegacyDecorators) { if (!method.body) { return void 0; } const decorators = getDecorators(method); const parameters = useLegacyDecorators ? getDecoratorsOfParameters(method) : void 0; if (!some(decorators) && !some(parameters)) { return void 0; } return { decorators, parameters }; } function getAllDecoratorsOfProperty(property) { const decorators = getDecorators(property); if (!some(decorators)) { return void 0; } return { decorators }; } function walkUpLexicalEnvironments(env, cb) { while (env) { const result = cb(env); if (result !== void 0) return result; env = env.previous; } } function newPrivateEnvironment(data) { return { data }; } function getPrivateIdentifier(privateEnv, name) { var _a, _b; return isGeneratedPrivateIdentifier(name) ? (_a = privateEnv == null ? void 0 : privateEnv.generatedIdentifiers) == null ? void 0 : _a.get(getNodeForGeneratedName(name)) : (_b = privateEnv == null ? void 0 : privateEnv.identifiers) == null ? void 0 : _b.get(name.escapedText); } function setPrivateIdentifier(privateEnv, name, entry) { if (isGeneratedPrivateIdentifier(name)) { privateEnv.generatedIdentifiers ?? (privateEnv.generatedIdentifiers = /* @__PURE__ */ new Map()); privateEnv.generatedIdentifiers.set(getNodeForGeneratedName(name), entry); } else { privateEnv.identifiers ?? (privateEnv.identifiers = /* @__PURE__ */ new Map()); privateEnv.identifiers.set(name.escapedText, entry); } } function accessPrivateIdentifier(env, name) { return walkUpLexicalEnvironments(env, (env2) => getPrivateIdentifier(env2.privateEnv, name)); } function isSimpleParameter(node) { return !node.initializer && isIdentifier(node.name); } function isSimpleParameterList(nodes) { return every(nodes, isSimpleParameter); } function rewriteModuleSpecifier(node, compilerOptions) { if (!node || !isStringLiteral(node) || !shouldRewriteModuleSpecifier(node.text, compilerOptions)) { return node; } const updatedText = changeExtension(node.text, getOutputExtension(node.text, compilerOptions)); return updatedText !== node.text ? setOriginalNode(setTextRange(factory.createStringLiteral(updatedText, node.singleQuote), node), node) : node; } // src/compiler/transformers/destructuring.ts function flattenDestructuringAssignment(node, visitor, context, level, needsValue, createAssignmentCallback) { let location = node; let value; if (isDestructuringAssignment(node)) { value = node.right; while (isEmptyArrayLiteral(node.left) || isEmptyObjectLiteral(node.left)) { if (isDestructuringAssignment(value)) { location = node = value; value = node.right; } else { return Debug.checkDefined(visitNode(value, visitor, isExpression)); } } } let expressions; const flattenContext = { context, level, downlevelIteration: !!context.getCompilerOptions().downlevelIteration, hoistTempVariables: true, emitExpression, emitBindingOrAssignment, createArrayBindingOrAssignmentPattern: (elements) => makeArrayAssignmentPattern(context.factory, elements), createObjectBindingOrAssignmentPattern: (elements) => makeObjectAssignmentPattern(context.factory, elements), createArrayBindingOrAssignmentElement: makeAssignmentElement, visitor }; if (value) { value = visitNode(value, visitor, isExpression); Debug.assert(value); if (isIdentifier(value) && bindingOrAssignmentElementAssignsToName(node, value.escapedText) || bindingOrAssignmentElementContainsNonLiteralComputedName(node)) { value = ensureIdentifier( flattenContext, value, /*reuseIdentifierExpressions*/ false, location ); } else if (needsValue) { value = ensureIdentifier( flattenContext, value, /*reuseIdentifierExpressions*/ true, location ); } else if (nodeIsSynthesized(node)) { location = value; } } flattenBindingOrAssignmentElement( flattenContext, node, value, location, /*skipInitializer*/ isDestructuringAssignment(node) ); if (value && needsValue) { if (!some(expressions)) { return value; } expressions.push(value); } return context.factory.inlineExpressions(expressions) || context.factory.createOmittedExpression(); function emitExpression(expression) { expressions = append(expressions, expression); } function emitBindingOrAssignment(target, value2, location2, original) { Debug.assertNode(target, createAssignmentCallback ? isIdentifier : isExpression); const expression = createAssignmentCallback ? createAssignmentCallback(target, value2, location2) : setTextRange( context.factory.createAssignment(Debug.checkDefined(visitNode(target, visitor, isExpression)), value2), location2 ); expression.original = original; emitExpression(expression); } } function bindingOrAssignmentElementAssignsToName(element, escapedName) { const target = getTargetOfBindingOrAssignmentElement(element); if (isBindingOrAssignmentPattern(target)) { return bindingOrAssignmentPatternAssignsToName(target, escapedName); } else if (isIdentifier(target)) { return target.escapedText === escapedName; } return false; } function bindingOrAssignmentPatternAssignsToName(pattern, escapedName) { const elements = getElementsOfBindingOrAssignmentPattern(pattern); for (const element of elements) { if (bindingOrAssignmentElementAssignsToName(element, escapedName)) { return true; } } return false; } function bindingOrAssignmentElementContainsNonLiteralComputedName(element) { const propertyName = tryGetPropertyNameOfBindingOrAssignmentElement(element); if (propertyName && isComputedPropertyName(propertyName) && !isLiteralExpression(propertyName.expression)) { return true; } const target = getTargetOfBindingOrAssignmentElement(element); return !!target && isBindingOrAssignmentPattern(target) && bindingOrAssignmentPatternContainsNonLiteralComputedName(target); } function bindingOrAssignmentPatternContainsNonLiteralComputedName(pattern) { return !!forEach(getElementsOfBindingOrAssignmentPattern(pattern), bindingOrAssignmentElementContainsNonLiteralComputedName); } function flattenDestructuringBinding(node, visitor, context, level, rval, hoistTempVariables = false, skipInitializer) { let pendingExpressions; const pendingDeclarations = []; const declarations = []; const flattenContext = { context, level, downlevelIteration: !!context.getCompilerOptions().downlevelIteration, hoistTempVariables, emitExpression, emitBindingOrAssignment, createArrayBindingOrAssignmentPattern: (elements) => makeArrayBindingPattern(context.factory, elements), createObjectBindingOrAssignmentPattern: (elements) => makeObjectBindingPattern(context.factory, elements), createArrayBindingOrAssignmentElement: (name) => makeBindingElement(context.factory, name), visitor }; if (isVariableDeclaration(node)) { let initializer = getInitializerOfBindingOrAssignmentElement(node); if (initializer && (isIdentifier(initializer) && bindingOrAssignmentElementAssignsToName(node, initializer.escapedText) || bindingOrAssignmentElementContainsNonLiteralComputedName(node))) { initializer = ensureIdentifier( flattenContext, Debug.checkDefined(visitNode(initializer, flattenContext.visitor, isExpression)), /*reuseIdentifierExpressions*/ false, initializer ); node = context.factory.updateVariableDeclaration( node, node.name, /*exclamationToken*/ void 0, /*type*/ void 0, initializer ); } } flattenBindingOrAssignmentElement(flattenContext, node, rval, node, skipInitializer); if (pendingExpressions) { const temp = context.factory.createTempVariable( /*recordTempVariable*/ void 0 ); if (hoistTempVariables) { const value = context.factory.inlineExpressions(pendingExpressions); pendingExpressions = void 0; emitBindingOrAssignment( temp, value, /*location*/ void 0, /*original*/ void 0 ); } else { context.hoistVariableDeclaration(temp); const pendingDeclaration = last(pendingDeclarations); pendingDeclaration.pendingExpressions = append( pendingDeclaration.pendingExpressions, context.factory.createAssignment(temp, pendingDeclaration.value) ); addRange(pendingDeclaration.pendingExpressions, pendingExpressions); pendingDeclaration.value = temp; } } for (const { pendingExpressions: pendingExpressions2, name, value, location, original } of pendingDeclarations) { const variable = context.factory.createVariableDeclaration( name, /*exclamationToken*/ void 0, /*type*/ void 0, pendingExpressions2 ? context.factory.inlineExpressions(append(pendingExpressions2, value)) : value ); variable.original = original; setTextRange(variable, location); declarations.push(variable); } return declarations; function emitExpression(value) { pendingExpressions = append(pendingExpressions, value); } function emitBindingOrAssignment(target, value, location, original) { Debug.assertNode(target, isBindingName); if (pendingExpressions) { value = context.factory.inlineExpressions(append(pendingExpressions, value)); pendingExpressions = void 0; } pendingDeclarations.push({ pendingExpressions, name: target, value, location, original }); } } function flattenBindingOrAssignmentElement(flattenContext, element, value, location, skipInitializer) { const bindingTarget = getTargetOfBindingOrAssignmentElement(element); if (!skipInitializer) { const initializer = visitNode(getInitializerOfBindingOrAssignmentElement(element), flattenContext.visitor, isExpression); if (initializer) { if (value) { value = createDefaultValueCheck(flattenContext, value, initializer, location); if (!isSimpleInlineableExpression(initializer) && isBindingOrAssignmentPattern(bindingTarget)) { value = ensureIdentifier( flattenContext, value, /*reuseIdentifierExpressions*/ true, location ); } } else { value = initializer; } } else if (!value) { value = flattenContext.context.factory.createVoidZero(); } } if (isObjectBindingOrAssignmentPattern(bindingTarget)) { flattenObjectBindingOrAssignmentPattern(flattenContext, element, bindingTarget, value, location); } else if (isArrayBindingOrAssignmentPattern(bindingTarget)) { flattenArrayBindingOrAssignmentPattern(flattenContext, element, bindingTarget, value, location); } else { flattenContext.emitBindingOrAssignment( bindingTarget, value, location, /*original*/ element ); } } function flattenObjectBindingOrAssignmentPattern(flattenContext, parent, pattern, value, location) { const elements = getElementsOfBindingOrAssignmentPattern(pattern); const numElements = elements.length; if (numElements !== 1) { const reuseIdentifierExpressions = !isDeclarationBindingElement(parent) || numElements !== 0; value = ensureIdentifier(flattenContext, value, reuseIdentifierExpressions, location); } let bindingElements; let computedTempVariables; for (let i = 0; i < numElements; i++) { const element = elements[i]; if (!getRestIndicatorOfBindingOrAssignmentElement(element)) { const propertyName = getPropertyNameOfBindingOrAssignmentElement(element); if (flattenContext.level >= 1 /* ObjectRest */ && !(element.transformFlags & (32768 /* ContainsRestOrSpread */ | 65536 /* ContainsObjectRestOrSpread */)) && !(getTargetOfBindingOrAssignmentElement(element).transformFlags & (32768 /* ContainsRestOrSpread */ | 65536 /* ContainsObjectRestOrSpread */)) && !isComputedPropertyName(propertyName)) { bindingElements = append(bindingElements, visitNode(element, flattenContext.visitor, isBindingOrAssignmentElement)); } else { if (bindingElements) { flattenContext.emitBindingOrAssignment(flattenContext.createObjectBindingOrAssignmentPattern(bindingElements), value, location, pattern); bindingElements = void 0; } const rhsValue = createDestructuringPropertyAccess(flattenContext, value, propertyName); if (isComputedPropertyName(propertyName)) { computedTempVariables = append(computedTempVariables, rhsValue.argumentExpression); } flattenBindingOrAssignmentElement( flattenContext, element, rhsValue, /*location*/ element ); } } else if (i === numElements - 1) { if (bindingElements) { flattenContext.emitBindingOrAssignment(flattenContext.createObjectBindingOrAssignmentPattern(bindingElements), value, location, pattern); bindingElements = void 0; } const rhsValue = flattenContext.context.getEmitHelperFactory().createRestHelper(value, elements, computedTempVariables, pattern); flattenBindingOrAssignmentElement(flattenContext, element, rhsValue, element); } } if (bindingElements) { flattenContext.emitBindingOrAssignment(flattenContext.createObjectBindingOrAssignmentPattern(bindingElements), value, location, pattern); } } function flattenArrayBindingOrAssignmentPattern(flattenContext, parent, pattern, value, location) { const elements = getElementsOfBindingOrAssignmentPattern(pattern); const numElements = elements.length; if (flattenContext.level < 1 /* ObjectRest */ && flattenContext.downlevelIteration) { value = ensureIdentifier( flattenContext, setTextRange( flattenContext.context.getEmitHelperFactory().createReadHelper( value, numElements > 0 && getRestIndicatorOfBindingOrAssignmentElement(elements[numElements - 1]) ? void 0 : numElements ), location ), /*reuseIdentifierExpressions*/ false, location ); } else if (numElements !== 1 && (flattenContext.level < 1 /* ObjectRest */ || numElements === 0) || every(elements, isOmittedExpression)) { const reuseIdentifierExpressions = !isDeclarationBindingElement(parent) || numElements !== 0; value = ensureIdentifier(flattenContext, value, reuseIdentifierExpressions, location); } let bindingElements; let restContainingElements; for (let i = 0; i < numElements; i++) { const element = elements[i]; if (flattenContext.level >= 1 /* ObjectRest */) { if (element.transformFlags & 65536 /* ContainsObjectRestOrSpread */ || flattenContext.hasTransformedPriorElement && !isSimpleBindingOrAssignmentElement(element)) { flattenContext.hasTransformedPriorElement = true; const temp = flattenContext.context.factory.createTempVariable( /*recordTempVariable*/ void 0 ); if (flattenContext.hoistTempVariables) { flattenContext.context.hoistVariableDeclaration(temp); } restContainingElements = append(restContainingElements, [temp, element]); bindingElements = append(bindingElements, flattenContext.createArrayBindingOrAssignmentElement(temp)); } else { bindingElements = append(bindingElements, element); } } else if (isOmittedExpression(element)) { continue; } else if (!getRestIndicatorOfBindingOrAssignmentElement(element)) { const rhsValue = flattenContext.context.factory.createElementAccessExpression(value, i); flattenBindingOrAssignmentElement( flattenContext, element, rhsValue, /*location*/ element ); } else if (i === numElements - 1) { const rhsValue = flattenContext.context.factory.createArraySliceCall(value, i); flattenBindingOrAssignmentElement( flattenContext, element, rhsValue, /*location*/ element ); } } if (bindingElements) { flattenContext.emitBindingOrAssignment(flattenContext.createArrayBindingOrAssignmentPattern(bindingElements), value, location, pattern); } if (restContainingElements) { for (const [id, element] of restContainingElements) { flattenBindingOrAssignmentElement(flattenContext, element, id, element); } } } function isSimpleBindingOrAssignmentElement(element) { const target = getTargetOfBindingOrAssignmentElement(element); if (!target || isOmittedExpression(target)) return true; const propertyName = tryGetPropertyNameOfBindingOrAssignmentElement(element); if (propertyName && !isPropertyNameLiteral(propertyName)) return false; const initializer = getInitializerOfBindingOrAssignmentElement(element); if (initializer && !isSimpleInlineableExpression(initializer)) return false; if (isBindingOrAssignmentPattern(target)) return every(getElementsOfBindingOrAssignmentPattern(target), isSimpleBindingOrAssignmentElement); return isIdentifier(target); } function createDefaultValueCheck(flattenContext, value, defaultValue, location) { value = ensureIdentifier( flattenContext, value, /*reuseIdentifierExpressions*/ true, location ); return flattenContext.context.factory.createConditionalExpression( flattenContext.context.factory.createTypeCheck(value, "undefined"), /*questionToken*/ void 0, defaultValue, /*colonToken*/ void 0, value ); } function createDestructuringPropertyAccess(flattenContext, value, propertyName) { const { factory: factory2 } = flattenContext.context; if (isComputedPropertyName(propertyName)) { const argumentExpression = ensureIdentifier( flattenContext, Debug.checkDefined(visitNode(propertyName.expression, flattenContext.visitor, isExpression)), /*reuseIdentifierExpressions*/ false, /*location*/ propertyName ); return flattenContext.context.factory.createElementAccessExpression(value, argumentExpression); } else if (isStringOrNumericLiteralLike(propertyName) || isBigIntLiteral(propertyName)) { const argumentExpression = factory2.cloneNode(propertyName); return flattenContext.context.factory.createElementAccessExpression(value, argumentExpression); } else { const name = flattenContext.context.factory.createIdentifier(idText(propertyName)); return flattenContext.context.factory.createPropertyAccessExpression(value, name); } } function ensureIdentifier(flattenContext, value, reuseIdentifierExpressions, location) { if (isIdentifier(value) && reuseIdentifierExpressions) { return value; } else { const temp = flattenContext.context.factory.createTempVariable( /*recordTempVariable*/ void 0 ); if (flattenContext.hoistTempVariables) { flattenContext.context.hoistVariableDeclaration(temp); flattenContext.emitExpression(setTextRange(flattenContext.context.factory.createAssignment(temp, value), location)); } else { flattenContext.emitBindingOrAssignment( temp, value, location, /*original*/ void 0 ); } return temp; } } function makeArrayBindingPattern(factory2, elements) { Debug.assertEachNode(elements, isArrayBindingElement); return factory2.createArrayBindingPattern(elements); } function makeArrayAssignmentPattern(factory2, elements) { Debug.assertEachNode(elements, isArrayBindingOrAssignmentElement); return factory2.createArrayLiteralExpression(map(elements, factory2.converters.convertToArrayAssignmentElement)); } function makeObjectBindingPattern(factory2, elements) { Debug.assertEachNode(elements, isBindingElement); return factory2.createObjectBindingPattern(elements); } function makeObjectAssignmentPattern(factory2, elements) { Debug.assertEachNode(elements, isObjectBindingOrAssignmentElement); return factory2.createObjectLiteralExpression(map(elements, factory2.converters.convertToObjectAssignmentElement)); } function makeBindingElement(factory2, name) { return factory2.createBindingElement( /*dotDotDotToken*/ void 0, /*propertyName*/ void 0, name ); } function makeAssignmentElement(name) { return name; } // src/compiler/transformers/classThis.ts function createClassThisAssignmentBlock(factory2, classThis, thisExpression = factory2.createThis()) { const expression = factory2.createAssignment(classThis, thisExpression); const statement = factory2.createExpressionStatement(expression); const body = factory2.createBlock( [statement], /*multiLine*/ false ); const block = factory2.createClassStaticBlockDeclaration(body); getOrCreateEmitNode(block).classThis = classThis; return block; } function isClassThisAssignmentBlock(node) { var _a; if (!isClassStaticBlockDeclaration(node) || node.body.statements.length !== 1) { return false; } const statement = node.body.statements[0]; return isExpressionStatement(statement) && isAssignmentExpression( statement.expression, /*excludeCompoundAssignment*/ true ) && isIdentifier(statement.expression.left) && ((_a = node.emitNode) == null ? void 0 : _a.classThis) === statement.expression.left && statement.expression.right.kind === 110 /* ThisKeyword */; } function classHasClassThisAssignment(node) { var _a; return !!((_a = node.emitNode) == null ? void 0 : _a.classThis) && some(node.members, isClassThisAssignmentBlock); } function injectClassThisAssignmentIfMissing(factory2, node, classThis, thisExpression) { if (classHasClassThisAssignment(node)) { return node; } const staticBlock = createClassThisAssignmentBlock(factory2, classThis, thisExpression); if (node.name) { setSourceMapRange(staticBlock.body.statements[0], node.name); } const members = factory2.createNodeArray([staticBlock, ...node.members]); setTextRange(members, node.members); const updatedNode = isClassDeclaration(node) ? factory2.updateClassDeclaration( node, node.modifiers, node.name, node.typeParameters, node.heritageClauses, members ) : factory2.updateClassExpression( node, node.modifiers, node.name, node.typeParameters, node.heritageClauses, members ); getOrCreateEmitNode(updatedNode).classThis = classThis; return updatedNode; } // src/compiler/transformers/namedEvaluation.ts function getAssignedNameOfIdentifier(factory2, name, expression) { const original = getOriginalNode(skipOuterExpressions(expression)); if ((isClassDeclaration(original) || isFunctionDeclaration(original)) && !original.name && hasSyntacticModifier(original, 2048 /* Default */)) { return factory2.createStringLiteral("default"); } return factory2.createStringLiteralFromNode(name); } function getAssignedNameOfPropertyName(context, name, assignedNameText) { const { factory: factory2 } = context; if (assignedNameText !== void 0) { const assignedName2 = factory2.createStringLiteral(assignedNameText); return { assignedName: assignedName2, name }; } if (isPropertyNameLiteral(name) || isPrivateIdentifier(name)) { const assignedName2 = factory2.createStringLiteralFromNode(name); return { assignedName: assignedName2, name }; } if (isPropertyNameLiteral(name.expression) && !isIdentifier(name.expression)) { const assignedName2 = factory2.createStringLiteralFromNode(name.expression); return { assignedName: assignedName2, name }; } const assignedName = factory2.getGeneratedNameForNode(name); context.hoistVariableDeclaration(assignedName); const key = context.getEmitHelperFactory().createPropKeyHelper(name.expression); const assignment = factory2.createAssignment(assignedName, key); const updatedName = factory2.updateComputedPropertyName(name, assignment); return { assignedName, name: updatedName }; } function createClassNamedEvaluationHelperBlock(context, assignedName, thisExpression = context.factory.createThis()) { const { factory: factory2 } = context; const expression = context.getEmitHelperFactory().createSetFunctionNameHelper(thisExpression, assignedName); const statement = factory2.createExpressionStatement(expression); const body = factory2.createBlock( [statement], /*multiLine*/ false ); const block = factory2.createClassStaticBlockDeclaration(body); getOrCreateEmitNode(block).assignedName = assignedName; return block; } function isClassNamedEvaluationHelperBlock(node) { var _a; if (!isClassStaticBlockDeclaration(node) || node.body.statements.length !== 1) { return false; } const statement = node.body.statements[0]; return isExpressionStatement(statement) && isCallToHelper(statement.expression, "___setFunctionName") && statement.expression.arguments.length >= 2 && statement.expression.arguments[1] === ((_a = node.emitNode) == null ? void 0 : _a.assignedName); } function classHasExplicitlyAssignedName(node) { var _a; return !!((_a = node.emitNode) == null ? void 0 : _a.assignedName) && some(node.members, isClassNamedEvaluationHelperBlock); } function classHasDeclaredOrExplicitlyAssignedName(node) { return !!node.name || classHasExplicitlyAssignedName(node); } function injectClassNamedEvaluationHelperBlockIfMissing(context, node, assignedName, thisExpression) { if (classHasExplicitlyAssignedName(node)) { return node; } const { factory: factory2 } = context; const namedEvaluationBlock = createClassNamedEvaluationHelperBlock(context, assignedName, thisExpression); if (node.name) { setSourceMapRange(namedEvaluationBlock.body.statements[0], node.name); } const insertionIndex = findIndex(node.members, isClassThisAssignmentBlock) + 1; const leading = node.members.slice(0, insertionIndex); const trailing = node.members.slice(insertionIndex); const members = factory2.createNodeArray([...leading, namedEvaluationBlock, ...trailing]); setTextRange(members, node.members); node = isClassDeclaration(node) ? factory2.updateClassDeclaration( node, node.modifiers, node.name, node.typeParameters, node.heritageClauses, members ) : factory2.updateClassExpression( node, node.modifiers, node.name, node.typeParameters, node.heritageClauses, members ); getOrCreateEmitNode(node).assignedName = assignedName; return node; } function finishTransformNamedEvaluation(context, expression, assignedName, ignoreEmptyStringLiteral) { if (ignoreEmptyStringLiteral && isStringLiteral(assignedName) && isEmptyStringLiteral(assignedName)) { return expression; } const { factory: factory2 } = context; const innerExpression = skipOuterExpressions(expression); const updatedExpression = isClassExpression(innerExpression) ? cast(injectClassNamedEvaluationHelperBlockIfMissing(context, innerExpression, assignedName), isClassExpression) : context.getEmitHelperFactory().createSetFunctionNameHelper(innerExpression, assignedName); return factory2.restoreOuterExpressions(expression, updatedExpression); } function transformNamedEvaluationOfPropertyAssignment(context, node, ignoreEmptyStringLiteral, assignedNameText) { const { factory: factory2 } = context; const { assignedName, name } = getAssignedNameOfPropertyName(context, node.name, assignedNameText); const initializer = finishTransformNamedEvaluation(context, node.initializer, assignedName, ignoreEmptyStringLiteral); return factory2.updatePropertyAssignment( node, name, initializer ); } function transformNamedEvaluationOfShorthandAssignmentProperty(context, node, ignoreEmptyStringLiteral, assignedNameText) { const { factory: factory2 } = context; const assignedName = assignedNameText !== void 0 ? factory2.createStringLiteral(assignedNameText) : getAssignedNameOfIdentifier(factory2, node.name, node.objectAssignmentInitializer); const objectAssignmentInitializer = finishTransformNamedEvaluation(context, node.objectAssignmentInitializer, assignedName, ignoreEmptyStringLiteral); return factory2.updateShorthandPropertyAssignment( node, node.name, objectAssignmentInitializer ); } function transformNamedEvaluationOfVariableDeclaration(context, node, ignoreEmptyStringLiteral, assignedNameText) { const { factory: factory2 } = context; const assignedName = assignedNameText !== void 0 ? factory2.createStringLiteral(assignedNameText) : getAssignedNameOfIdentifier(factory2, node.name, node.initializer); const initializer = finishTransformNamedEvaluation(context, node.initializer, assignedName, ignoreEmptyStringLiteral); return factory2.updateVariableDeclaration( node, node.name, node.exclamationToken, node.type, initializer ); } function transformNamedEvaluationOfParameterDeclaration(context, node, ignoreEmptyStringLiteral, assignedNameText) { const { factory: factory2 } = context; const assignedName = assignedNameText !== void 0 ? factory2.createStringLiteral(assignedNameText) : getAssignedNameOfIdentifier(factory2, node.name, node.initializer); const initializer = finishTransformNamedEvaluation(context, node.initializer, assignedName, ignoreEmptyStringLiteral); return factory2.updateParameterDeclaration( node, node.modifiers, node.dotDotDotToken, node.name, node.questionToken, node.type, initializer ); } function transformNamedEvaluationOfBindingElement(context, node, ignoreEmptyStringLiteral, assignedNameText) { const { factory: factory2 } = context; const assignedName = assignedNameText !== void 0 ? factory2.createStringLiteral(assignedNameText) : getAssignedNameOfIdentifier(factory2, node.name, node.initializer); const initializer = finishTransformNamedEvaluation(context, node.initializer, assignedName, ignoreEmptyStringLiteral); return factory2.updateBindingElement( node, node.dotDotDotToken, node.propertyName, node.name, initializer ); } function transformNamedEvaluationOfPropertyDeclaration(context, node, ignoreEmptyStringLiteral, assignedNameText) { const { factory: factory2 } = context; const { assignedName, name } = getAssignedNameOfPropertyName(context, node.name, assignedNameText); const initializer = finishTransformNamedEvaluation(context, node.initializer, assignedName, ignoreEmptyStringLiteral); return factory2.updatePropertyDeclaration( node, node.modifiers, name, node.questionToken ?? node.exclamationToken, node.type, initializer ); } function transformNamedEvaluationOfAssignmentExpression(context, node, ignoreEmptyStringLiteral, assignedNameText) { const { factory: factory2 } = context; const assignedName = assignedNameText !== void 0 ? factory2.createStringLiteral(assignedNameText) : getAssignedNameOfIdentifier(factory2, node.left, node.right); const right = finishTransformNamedEvaluation(context, node.right, assignedName, ignoreEmptyStringLiteral); return factory2.updateBinaryExpression( node, node.left, node.operatorToken, right ); } function transformNamedEvaluationOfExportAssignment(context, node, ignoreEmptyStringLiteral, assignedNameText) { const { factory: factory2 } = context; const assignedName = assignedNameText !== void 0 ? factory2.createStringLiteral(assignedNameText) : factory2.createStringLiteral(node.isExportEquals ? "" : "default"); const expression = finishTransformNamedEvaluation(context, node.expression, assignedName, ignoreEmptyStringLiteral); return factory2.updateExportAssignment( node, node.modifiers, expression ); } function transformNamedEvaluation(context, node, ignoreEmptyStringLiteral, assignedName) { switch (node.kind) { case 304 /* PropertyAssignment */: return transformNamedEvaluationOfPropertyAssignment(context, node, ignoreEmptyStringLiteral, assignedName); case 305 /* ShorthandPropertyAssignment */: return transformNamedEvaluationOfShorthandAssignmentProperty(context, node, ignoreEmptyStringLiteral, assignedName); case 261 /* VariableDeclaration */: return transformNamedEvaluationOfVariableDeclaration(context, node, ignoreEmptyStringLiteral, assignedName); case 170 /* Parameter */: return transformNamedEvaluationOfParameterDeclaration(context, node, ignoreEmptyStringLiteral, assignedName); case 209 /* BindingElement */: return transformNamedEvaluationOfBindingElement(context, node, ignoreEmptyStringLiteral, assignedName); case 173 /* PropertyDeclaration */: return transformNamedEvaluationOfPropertyDeclaration(context, node, ignoreEmptyStringLiteral, assignedName); case 227 /* BinaryExpression */: return transformNamedEvaluationOfAssignmentExpression(context, node, ignoreEmptyStringLiteral, assignedName); case 278 /* ExportAssignment */: return transformNamedEvaluationOfExportAssignment(context, node, ignoreEmptyStringLiteral, assignedName); } } // src/compiler/transformers/taggedTemplate.ts function processTaggedTemplateExpression(context, node, visitor, currentSourceFile, recordTaggedTemplateString, level) { const tag = visitNode(node.tag, visitor, isExpression); Debug.assert(tag); const templateArguments = [void 0]; const cookedStrings = []; const rawStrings = []; const template = node.template; if (level === 0 /* LiftRestriction */ && !hasInvalidEscape(template)) { return visitEachChild(node, visitor, context); } const { factory: factory2 } = context; if (isNoSubstitutionTemplateLiteral(template)) { cookedStrings.push(createTemplateCooked(factory2, template)); rawStrings.push(getRawLiteral(factory2, template, currentSourceFile)); } else { cookedStrings.push(createTemplateCooked(factory2, template.head)); rawStrings.push(getRawLiteral(factory2, template.head, currentSourceFile)); for (const templateSpan of template.templateSpans) { cookedStrings.push(createTemplateCooked(factory2, templateSpan.literal)); rawStrings.push(getRawLiteral(factory2, templateSpan.literal, currentSourceFile)); templateArguments.push(Debug.checkDefined(visitNode(templateSpan.expression, visitor, isExpression))); } } const helperCall = context.getEmitHelperFactory().createTemplateObjectHelper( factory2.createArrayLiteralExpression(cookedStrings), factory2.createArrayLiteralExpression(rawStrings) ); if (isExternalModule(currentSourceFile)) { const tempVar = factory2.createUniqueName("templateObject"); recordTaggedTemplateString(tempVar); templateArguments[0] = factory2.createLogicalOr( tempVar, factory2.createAssignment( tempVar, helperCall ) ); } else { templateArguments[0] = helperCall; } return factory2.createCallExpression( tag, /*typeArguments*/ void 0, templateArguments ); } function createTemplateCooked(factory2, template) { return template.templateFlags & 26656 /* IsInvalid */ ? factory2.createVoidZero() : factory2.createStringLiteral(template.text); } function getRawLiteral(factory2, node, currentSourceFile) { let text = node.rawText; if (text === void 0) { Debug.assertIsDefined(currentSourceFile, "Template literal node is missing 'rawText' and does not have a source file. Possibly bad transform."); text = getSourceTextOfNodeFromSourceFile(currentSourceFile, node); const isLast = node.kind === 15 /* NoSubstitutionTemplateLiteral */ || node.kind === 18 /* TemplateTail */; text = text.substring(1, text.length - (isLast ? 1 : 2)); } text = text.replace(/\r\n?/g, "\n"); return setTextRange(factory2.createStringLiteral(text), node); } // src/compiler/transformers/ts.ts var USE_NEW_TYPE_METADATA_FORMAT = false; function transformTypeScript(context) { const { factory: factory2, getEmitHelperFactory: emitHelpers, startLexicalEnvironment, resumeLexicalEnvironment, endLexicalEnvironment, hoistVariableDeclaration } = context; const resolver = context.getEmitResolver(); const compilerOptions = context.getCompilerOptions(); const languageVersion = getEmitScriptTarget(compilerOptions); const moduleKind = getEmitModuleKind(compilerOptions); const legacyDecorators = !!compilerOptions.experimentalDecorators; const typeSerializer = compilerOptions.emitDecoratorMetadata ? createRuntimeTypeSerializer(context) : void 0; const previousOnEmitNode = context.onEmitNode; const previousOnSubstituteNode = context.onSubstituteNode; context.onEmitNode = onEmitNode; context.onSubstituteNode = onSubstituteNode; context.enableSubstitution(212 /* PropertyAccessExpression */); context.enableSubstitution(213 /* ElementAccessExpression */); let currentSourceFile; let currentNamespace; let currentNamespaceContainerName; let currentLexicalScope; let currentScopeFirstDeclarationsOfName; let enabledSubstitutions = 0 /* None */; let applicableSubstitutions; return transformSourceFileOrBundle; function transformSourceFileOrBundle(node) { if (node.kind === 309 /* Bundle */) { return transformBundle(node); } return transformSourceFile(node); } function transformBundle(node) { return factory2.createBundle( node.sourceFiles.map(transformSourceFile) ); } function transformSourceFile(node) { if (node.isDeclarationFile) { return node; } currentSourceFile = node; const visited = saveStateAndInvoke(node, visitSourceFile); addEmitHelpers(visited, context.readEmitHelpers()); currentSourceFile = void 0; return visited; } function saveStateAndInvoke(node, f) { const savedCurrentScope = currentLexicalScope; const savedCurrentScopeFirstDeclarationsOfName = currentScopeFirstDeclarationsOfName; onBeforeVisitNode(node); const visited = f(node); if (currentLexicalScope !== savedCurrentScope) { currentScopeFirstDeclarationsOfName = savedCurrentScopeFirstDeclarationsOfName; } currentLexicalScope = savedCurrentScope; return visited; } function onBeforeVisitNode(node) { switch (node.kind) { case 308 /* SourceFile */: case 270 /* CaseBlock */: case 269 /* ModuleBlock */: case 242 /* Block */: currentLexicalScope = node; currentScopeFirstDeclarationsOfName = void 0; break; case 264 /* ClassDeclaration */: case 263 /* FunctionDeclaration */: if (hasSyntacticModifier(node, 128 /* Ambient */)) { break; } if (node.name) { recordEmittedDeclarationInScope(node); } else { Debug.assert(node.kind === 264 /* ClassDeclaration */ || hasSyntacticModifier(node, 2048 /* Default */)); } break; } } function visitor(node) { return saveStateAndInvoke(node, visitorWorker); } function visitorWorker(node) { if (node.transformFlags & 1 /* ContainsTypeScript */) { return visitTypeScript(node); } return node; } function sourceElementVisitor(node) { return saveStateAndInvoke(node, sourceElementVisitorWorker); } function sourceElementVisitorWorker(node) { switch (node.kind) { case 273 /* ImportDeclaration */: case 272 /* ImportEqualsDeclaration */: case 278 /* ExportAssignment */: case 279 /* ExportDeclaration */: return visitElidableStatement(node); default: return visitorWorker(node); } } function isElisionBlocked(node) { const parsed = getParseTreeNode(node); if (parsed === node || isExportAssignment(node)) { return false; } if (!parsed || parsed.kind !== node.kind) { return true; } switch (node.kind) { case 273 /* ImportDeclaration */: Debug.assertNode(parsed, isImportDeclaration); if (node.importClause !== parsed.importClause) { return true; } if (node.attributes !== parsed.attributes) { return true; } break; case 272 /* ImportEqualsDeclaration */: Debug.assertNode(parsed, isImportEqualsDeclaration); if (node.name !== parsed.name) { return true; } if (node.isTypeOnly !== parsed.isTypeOnly) { return true; } if (node.moduleReference !== parsed.moduleReference && (isEntityName(node.moduleReference) || isEntityName(parsed.moduleReference))) { return true; } break; case 279 /* ExportDeclaration */: Debug.assertNode(parsed, isExportDeclaration); if (node.exportClause !== parsed.exportClause) { return true; } if (node.attributes !== parsed.attributes) { return true; } break; } return false; } function visitElidableStatement(node) { if (isElisionBlocked(node)) { if (node.transformFlags & 1 /* ContainsTypeScript */) { return visitEachChild(node, visitor, context); } return node; } switch (node.kind) { case 273 /* ImportDeclaration */: return visitImportDeclaration(node); case 272 /* ImportEqualsDeclaration */: return visitImportEqualsDeclaration(node); case 278 /* ExportAssignment */: return visitExportAssignment(node); case 279 /* ExportDeclaration */: return visitExportDeclaration(node); default: Debug.fail("Unhandled ellided statement"); } } function namespaceElementVisitor(node) { return saveStateAndInvoke(node, namespaceElementVisitorWorker); } function namespaceElementVisitorWorker(node) { if (node.kind === 279 /* ExportDeclaration */ || node.kind === 273 /* ImportDeclaration */ || node.kind === 274 /* ImportClause */ || node.kind === 272 /* ImportEqualsDeclaration */ && node.moduleReference.kind === 284 /* ExternalModuleReference */) { return void 0; } else if (node.transformFlags & 1 /* ContainsTypeScript */ || hasSyntacticModifier(node, 32 /* Export */)) { return visitTypeScript(node); } return node; } function getClassElementVisitor(parent) { return (node) => saveStateAndInvoke(node, (n) => classElementVisitorWorker(n, parent)); } function classElementVisitorWorker(node, parent) { switch (node.kind) { case 177 /* Constructor */: return visitConstructor(node); case 173 /* PropertyDeclaration */: return visitPropertyDeclaration(node, parent); case 178 /* GetAccessor */: return visitGetAccessor(node, parent); case 179 /* SetAccessor */: return visitSetAccessor(node, parent); case 175 /* MethodDeclaration */: return visitMethodDeclaration(node, parent); case 176 /* ClassStaticBlockDeclaration */: return visitEachChild(node, visitor, context); case 241 /* SemicolonClassElement */: return node; case 182 /* IndexSignature */: return; default: return Debug.failBadSyntaxKind(node); } } function getObjectLiteralElementVisitor(parent) { return (node) => saveStateAndInvoke(node, (n) => objectLiteralElementVisitorWorker(n, parent)); } function objectLiteralElementVisitorWorker(node, parent) { switch (node.kind) { case 304 /* PropertyAssignment */: case 305 /* ShorthandPropertyAssignment */: case 306 /* SpreadAssignment */: return visitor(node); case 178 /* GetAccessor */: return visitGetAccessor(node, parent); case 179 /* SetAccessor */: return visitSetAccessor(node, parent); case 175 /* MethodDeclaration */: return visitMethodDeclaration(node, parent); default: return Debug.failBadSyntaxKind(node); } } function decoratorElidingVisitor(node) { return isDecorator(node) ? void 0 : visitor(node); } function modifierElidingVisitor(node) { return isModifier(node) ? void 0 : visitor(node); } function modifierVisitor(node) { if (isDecorator(node)) return void 0; if (modifierToFlag(node.kind) & 28895 /* TypeScriptModifier */) { return void 0; } else if (currentNamespace && node.kind === 95 /* ExportKeyword */) { return void 0; } return node; } function visitTypeScript(node) { if (isStatement(node) && hasSyntacticModifier(node, 128 /* Ambient */)) { return factory2.createNotEmittedStatement(node); } switch (node.kind) { case 95 /* ExportKeyword */: case 90 /* DefaultKeyword */: return currentNamespace ? void 0 : node; case 125 /* PublicKeyword */: case 123 /* PrivateKeyword */: case 124 /* ProtectedKeyword */: case 128 /* AbstractKeyword */: case 164 /* OverrideKeyword */: case 87 /* ConstKeyword */: case 138 /* DeclareKeyword */: case 148 /* ReadonlyKeyword */: case 103 /* InKeyword */: case 147 /* OutKeyword */: // TypeScript accessibility and readonly modifiers are elided // falls through case 189 /* ArrayType */: case 190 /* TupleType */: case 191 /* OptionalType */: case 192 /* RestType */: case 188 /* TypeLiteral */: case 183 /* TypePredicate */: case 169 /* TypeParameter */: case 133 /* AnyKeyword */: case 159 /* UnknownKeyword */: case 136 /* BooleanKeyword */: case 154 /* StringKeyword */: case 150 /* NumberKeyword */: case 146 /* NeverKeyword */: case 116 /* VoidKeyword */: case 155 /* SymbolKeyword */: case 186 /* ConstructorType */: case 185 /* FunctionType */: case 187 /* TypeQuery */: case 184 /* TypeReference */: case 193 /* UnionType */: case 194 /* IntersectionType */: case 195 /* ConditionalType */: case 197 /* ParenthesizedType */: case 198 /* ThisType */: case 199 /* TypeOperator */: case 200 /* IndexedAccessType */: case 201 /* MappedType */: case 202 /* LiteralType */: // TypeScript type nodes are elided. // falls through case 182 /* IndexSignature */: return void 0; case 266 /* TypeAliasDeclaration */: return factory2.createNotEmittedStatement(node); case 271 /* NamespaceExportDeclaration */: return void 0; case 265 /* InterfaceDeclaration */: return factory2.createNotEmittedStatement(node); case 264 /* ClassDeclaration */: return visitClassDeclaration(node); case 232 /* ClassExpression */: return visitClassExpression(node); case 299 /* HeritageClause */: return visitHeritageClause(node); case 234 /* ExpressionWithTypeArguments */: return visitExpressionWithTypeArguments(node); case 211 /* ObjectLiteralExpression */: return visitObjectLiteralExpression(node); case 177 /* Constructor */: case 173 /* PropertyDeclaration */: case 175 /* MethodDeclaration */: case 178 /* GetAccessor */: case 179 /* SetAccessor */: case 176 /* ClassStaticBlockDeclaration */: return Debug.fail("Class and object literal elements must be visited with their respective visitors"); case 263 /* FunctionDeclaration */: return visitFunctionDeclaration(node); case 219 /* FunctionExpression */: return visitFunctionExpression(node); case 220 /* ArrowFunction */: return visitArrowFunction(node); case 170 /* Parameter */: return visitParameter(node); case 218 /* ParenthesizedExpression */: return visitParenthesizedExpression(node); case 217 /* TypeAssertionExpression */: case 235 /* AsExpression */: return visitAssertionExpression(node); case 239 /* SatisfiesExpression */: return visitSatisfiesExpression(node); case 214 /* CallExpression */: return visitCallExpression(node); case 215 /* NewExpression */: return visitNewExpression(node); case 216 /* TaggedTemplateExpression */: return visitTaggedTemplateExpression(node); case 236 /* NonNullExpression */: return visitNonNullExpression(node); case 267 /* EnumDeclaration */: return visitEnumDeclaration(node); case 244 /* VariableStatement */: return visitVariableStatement(node); case 261 /* VariableDeclaration */: return visitVariableDeclaration(node); case 268 /* ModuleDeclaration */: return visitModuleDeclaration(node); case 272 /* ImportEqualsDeclaration */: return visitImportEqualsDeclaration(node); case 286 /* JsxSelfClosingElement */: return visitJsxSelfClosingElement(node); case 287 /* JsxOpeningElement */: return visitJsxJsxOpeningElement(node); default: return visitEachChild(node, visitor, context); } } function visitSourceFile(node) { const alwaysStrict = getStrictOptionValue(compilerOptions, "alwaysStrict") && !(isExternalModule(node) && moduleKind >= 5 /* ES2015 */) && !isJsonSourceFile(node); return factory2.updateSourceFile( node, visitLexicalEnvironment( node.statements, sourceElementVisitor, context, /*start*/ 0, alwaysStrict ) ); } function visitObjectLiteralExpression(node) { return factory2.updateObjectLiteralExpression( node, visitNodes2(node.properties, getObjectLiteralElementVisitor(node), isObjectLiteralElementLike) ); } function getClassFacts(node) { let facts = 0 /* None */; if (some(getProperties( node, /*requireInitializer*/ true, /*isStatic*/ true ))) facts |= 1 /* HasStaticInitializedProperties */; const extendsClauseElement = getEffectiveBaseTypeNode(node); if (extendsClauseElement && skipOuterExpressions(extendsClauseElement.expression).kind !== 106 /* NullKeyword */) facts |= 64 /* IsDerivedClass */; if (classOrConstructorParameterIsDecorated(legacyDecorators, node)) facts |= 2 /* HasClassOrConstructorParameterDecorators */; if (childIsDecorated(legacyDecorators, node)) facts |= 4 /* HasMemberDecorators */; if (isExportOfNamespace(node)) facts |= 8 /* IsExportOfNamespace */; else if (isDefaultExternalModuleExport(node)) facts |= 32 /* IsDefaultExternalExport */; else if (isNamedExternalModuleExport(node)) facts |= 16 /* IsNamedExternalExport */; return facts; } function hasTypeScriptClassSyntax(node) { return !!(node.transformFlags & 8192 /* ContainsTypeScriptClassSyntax */); } function isClassLikeDeclarationWithTypeScriptSyntax(node) { return hasDecorators(node) || some(node.typeParameters) || some(node.heritageClauses, hasTypeScriptClassSyntax) || some(node.members, hasTypeScriptClassSyntax); } function visitClassDeclaration(node) { const facts = getClassFacts(node); const promoteToIIFE = languageVersion <= 1 /* ES5 */ && !!(facts & 7 /* MayNeedImmediatelyInvokedFunctionExpression */); if (!isClassLikeDeclarationWithTypeScriptSyntax(node) && !classOrConstructorParameterIsDecorated(legacyDecorators, node) && !isExportOfNamespace(node)) { return factory2.updateClassDeclaration( node, visitNodes2(node.modifiers, modifierVisitor, isModifier), node.name, /*typeParameters*/ void 0, visitNodes2(node.heritageClauses, visitor, isHeritageClause), visitNodes2(node.members, getClassElementVisitor(node), isClassElement) ); } if (promoteToIIFE) { context.startLexicalEnvironment(); } const moveModifiers = promoteToIIFE || facts & 8 /* IsExportOfNamespace */; let modifiers = moveModifiers ? visitNodes2(node.modifiers, modifierElidingVisitor, isModifierLike) : visitNodes2(node.modifiers, visitor, isModifierLike); if (facts & 2 /* HasClassOrConstructorParameterDecorators */) { modifiers = injectClassTypeMetadata(modifiers, node); } const needsName = moveModifiers && !node.name || facts & 4 /* HasMemberDecorators */ || facts & 1 /* HasStaticInitializedProperties */; const name = needsName ? node.name ?? factory2.getGeneratedNameForNode(node) : node.name; const classDeclaration = factory2.updateClassDeclaration( node, modifiers, name, /*typeParameters*/ void 0, visitNodes2(node.heritageClauses, visitor, isHeritageClause), transformClassMembers(node) ); let emitFlags = getEmitFlags(node); if (facts & 1 /* HasStaticInitializedProperties */) { emitFlags |= 64 /* NoTrailingSourceMap */; } setEmitFlags(classDeclaration, emitFlags); let statement; if (promoteToIIFE) { const statements = [classDeclaration]; const closingBraceLocation = createTokenRange(skipTrivia(currentSourceFile.text, node.members.end), 20 /* CloseBraceToken */); const localName = factory2.getInternalName(node); const outer = factory2.createPartiallyEmittedExpression(localName); setTextRangeEnd(outer, closingBraceLocation.end); setEmitFlags(outer, 3072 /* NoComments */); const returnStatement = factory2.createReturnStatement(outer); setTextRangePos(returnStatement, closingBraceLocation.pos); setEmitFlags(returnStatement, 3072 /* NoComments */ | 768 /* NoTokenSourceMaps */); statements.push(returnStatement); insertStatementsAfterStandardPrologue(statements, context.endLexicalEnvironment()); const iife = factory2.createImmediatelyInvokedArrowFunction(statements); setInternalEmitFlags(iife, 1 /* TypeScriptClassWrapper */); const varDecl = factory2.createVariableDeclaration( factory2.getLocalName( node, /*allowComments*/ false, /*allowSourceMaps*/ false ), /*exclamationToken*/ void 0, /*type*/ void 0, iife ); setOriginalNode(varDecl, node); const varStatement = factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList([varDecl], 1 /* Let */) ); setOriginalNode(varStatement, node); setCommentRange(varStatement, node); setSourceMapRange(varStatement, moveRangePastDecorators(node)); startOnNewLine(varStatement); statement = varStatement; } else { statement = classDeclaration; } if (moveModifiers) { if (facts & 8 /* IsExportOfNamespace */) { return [ statement, createExportMemberAssignmentStatement(node) ]; } if (facts & 32 /* IsDefaultExternalExport */) { return [ statement, factory2.createExportDefault(factory2.getLocalName( node, /*allowComments*/ false, /*allowSourceMaps*/ true )) ]; } if (facts & 16 /* IsNamedExternalExport */) { return [ statement, factory2.createExternalModuleExport(factory2.getDeclarationName( node, /*allowComments*/ false, /*allowSourceMaps*/ true )) ]; } } return statement; } function visitClassExpression(node) { let modifiers = visitNodes2(node.modifiers, modifierElidingVisitor, isModifierLike); if (classOrConstructorParameterIsDecorated(legacyDecorators, node)) { modifiers = injectClassTypeMetadata(modifiers, node); } return factory2.updateClassExpression( node, modifiers, node.name, /*typeParameters*/ void 0, visitNodes2(node.heritageClauses, visitor, isHeritageClause), transformClassMembers(node) ); } function transformClassMembers(node) { const members = visitNodes2(node.members, getClassElementVisitor(node), isClassElement); let newMembers; const constructor = getFirstConstructorWithBody(node); const parametersWithPropertyAssignments = constructor && filter(constructor.parameters, (p) => isParameterPropertyDeclaration(p, constructor)); if (parametersWithPropertyAssignments) { for (const parameter of parametersWithPropertyAssignments) { const parameterProperty = factory2.createPropertyDeclaration( /*modifiers*/ void 0, parameter.name, /*questionOrExclamationToken*/ void 0, /*type*/ void 0, /*initializer*/ void 0 ); setOriginalNode(parameterProperty, parameter); newMembers = append(newMembers, parameterProperty); } } if (newMembers) { newMembers = addRange(newMembers, members); return setTextRange( factory2.createNodeArray(newMembers), /*location*/ node.members ); } return members; } function injectClassTypeMetadata(modifiers, node) { const metadata = getTypeMetadata(node, node); if (some(metadata)) { const modifiersArray = []; addRange(modifiersArray, takeWhile(modifiers, isExportOrDefaultModifier)); addRange(modifiersArray, filter(modifiers, isDecorator)); addRange(modifiersArray, metadata); addRange(modifiersArray, filter(skipWhile(modifiers, isExportOrDefaultModifier), isModifier)); modifiers = setTextRange(factory2.createNodeArray(modifiersArray), modifiers); } return modifiers; } function injectClassElementTypeMetadata(modifiers, node, container) { if (isClassLike(container) && classElementOrClassElementParameterIsDecorated(legacyDecorators, node, container)) { const metadata = getTypeMetadata(node, container); if (some(metadata)) { const modifiersArray = []; addRange(modifiersArray, filter(modifiers, isDecorator)); addRange(modifiersArray, metadata); addRange(modifiersArray, filter(modifiers, isModifier)); modifiers = setTextRange(factory2.createNodeArray(modifiersArray), modifiers); } } return modifiers; } function getTypeMetadata(node, container) { if (!legacyDecorators) return void 0; return USE_NEW_TYPE_METADATA_FORMAT ? getNewTypeMetadata(node, container) : getOldTypeMetadata(node, container); } function getOldTypeMetadata(node, container) { if (typeSerializer) { let decorators; if (shouldAddTypeMetadata(node)) { const typeMetadata = emitHelpers().createMetadataHelper("design:type", typeSerializer.serializeTypeOfNode({ currentLexicalScope, currentNameScope: container }, node, container)); decorators = append(decorators, factory2.createDecorator(typeMetadata)); } if (shouldAddParamTypesMetadata(node)) { const paramTypesMetadata = emitHelpers().createMetadataHelper("design:paramtypes", typeSerializer.serializeParameterTypesOfNode({ currentLexicalScope, currentNameScope: container }, node, container)); decorators = append(decorators, factory2.createDecorator(paramTypesMetadata)); } if (shouldAddReturnTypeMetadata(node)) { const returnTypeMetadata = emitHelpers().createMetadataHelper("design:returntype", typeSerializer.serializeReturnTypeOfNode({ currentLexicalScope, currentNameScope: container }, node)); decorators = append(decorators, factory2.createDecorator(returnTypeMetadata)); } return decorators; } } function getNewTypeMetadata(node, container) { if (typeSerializer) { let properties; if (shouldAddTypeMetadata(node)) { const typeProperty = factory2.createPropertyAssignment("type", factory2.createArrowFunction( /*modifiers*/ void 0, /*typeParameters*/ void 0, [], /*type*/ void 0, factory2.createToken(39 /* EqualsGreaterThanToken */), typeSerializer.serializeTypeOfNode({ currentLexicalScope, currentNameScope: container }, node, container) )); properties = append(properties, typeProperty); } if (shouldAddParamTypesMetadata(node)) { const paramTypeProperty = factory2.createPropertyAssignment("paramTypes", factory2.createArrowFunction( /*modifiers*/ void 0, /*typeParameters*/ void 0, [], /*type*/ void 0, factory2.createToken(39 /* EqualsGreaterThanToken */), typeSerializer.serializeParameterTypesOfNode({ currentLexicalScope, currentNameScope: container }, node, container) )); properties = append(properties, paramTypeProperty); } if (shouldAddReturnTypeMetadata(node)) { const returnTypeProperty = factory2.createPropertyAssignment("returnType", factory2.createArrowFunction( /*modifiers*/ void 0, /*typeParameters*/ void 0, [], /*type*/ void 0, factory2.createToken(39 /* EqualsGreaterThanToken */), typeSerializer.serializeReturnTypeOfNode({ currentLexicalScope, currentNameScope: container }, node) )); properties = append(properties, returnTypeProperty); } if (properties) { const typeInfoMetadata = emitHelpers().createMetadataHelper("design:typeinfo", factory2.createObjectLiteralExpression( properties, /*multiLine*/ true )); return [factory2.createDecorator(typeInfoMetadata)]; } } } function shouldAddTypeMetadata(node) { const kind = node.kind; return kind === 175 /* MethodDeclaration */ || kind === 178 /* GetAccessor */ || kind === 179 /* SetAccessor */ || kind === 173 /* PropertyDeclaration */; } function shouldAddReturnTypeMetadata(node) { return node.kind === 175 /* MethodDeclaration */; } function shouldAddParamTypesMetadata(node) { switch (node.kind) { case 264 /* ClassDeclaration */: case 232 /* ClassExpression */: return getFirstConstructorWithBody(node) !== void 0; case 175 /* MethodDeclaration */: case 178 /* GetAccessor */: case 179 /* SetAccessor */: return true; } return false; } function getExpressionForPropertyName(member, generateNameForComputedPropertyName) { const name = member.name; if (isPrivateIdentifier(name)) { return factory2.createIdentifier(""); } else if (isComputedPropertyName(name)) { return generateNameForComputedPropertyName && !isSimpleInlineableExpression(name.expression) ? factory2.getGeneratedNameForNode(name) : name.expression; } else if (isIdentifier(name)) { return factory2.createStringLiteral(idText(name)); } else { return factory2.cloneNode(name); } } function visitPropertyNameOfClassElement(member) { const name = member.name; if (legacyDecorators && isComputedPropertyName(name) && hasDecorators(member)) { const expression = visitNode(name.expression, visitor, isExpression); Debug.assert(expression); const innerExpression = skipPartiallyEmittedExpressions(expression); if (!isSimpleInlineableExpression(innerExpression)) { const generatedName = factory2.getGeneratedNameForNode(name); hoistVariableDeclaration(generatedName); return factory2.updateComputedPropertyName(name, factory2.createAssignment(generatedName, expression)); } } return Debug.checkDefined(visitNode(name, visitor, isPropertyName)); } function visitHeritageClause(node) { if (node.token === 119 /* ImplementsKeyword */) { return void 0; } return visitEachChild(node, visitor, context); } function visitExpressionWithTypeArguments(node) { return factory2.updateExpressionWithTypeArguments( node, Debug.checkDefined(visitNode(node.expression, visitor, isLeftHandSideExpression)), /*typeArguments*/ void 0 ); } function shouldEmitFunctionLikeDeclaration(node) { return !nodeIsMissing(node.body); } function visitPropertyDeclaration(node, parent) { const isAmbient = node.flags & 33554432 /* Ambient */ || hasSyntacticModifier(node, 64 /* Abstract */); if (isAmbient && !(legacyDecorators && hasDecorators(node))) { return void 0; } let modifiers = isClassLike(parent) ? !isAmbient ? visitNodes2(node.modifiers, visitor, isModifierLike) : visitNodes2(node.modifiers, modifierElidingVisitor, isModifierLike) : visitNodes2(node.modifiers, decoratorElidingVisitor, isModifierLike); modifiers = injectClassElementTypeMetadata(modifiers, node, parent); if (isAmbient) { return factory2.updatePropertyDeclaration( node, concatenate(modifiers, factory2.createModifiersFromModifierFlags(128 /* Ambient */)), Debug.checkDefined(visitNode(node.name, visitor, isPropertyName)), /*questionOrExclamationToken*/ void 0, /*type*/ void 0, /*initializer*/ void 0 ); } return factory2.updatePropertyDeclaration( node, modifiers, visitPropertyNameOfClassElement(node), /*questionOrExclamationToken*/ void 0, /*type*/ void 0, visitNode(node.initializer, visitor, isExpression) ); } function visitConstructor(node) { if (!shouldEmitFunctionLikeDeclaration(node)) { return void 0; } return factory2.updateConstructorDeclaration( node, /*modifiers*/ void 0, visitParameterList(node.parameters, visitor, context), transformConstructorBody(node.body, node) ); } function transformConstructorBodyWorker(statementsOut, statementsIn, statementOffset, superPath, superPathDepth, initializerStatements) { const superStatementIndex = superPath[superPathDepth]; const superStatement = statementsIn[superStatementIndex]; addRange(statementsOut, visitNodes2(statementsIn, visitor, isStatement, statementOffset, superStatementIndex - statementOffset)); if (isTryStatement(superStatement)) { const tryBlockStatements = []; transformConstructorBodyWorker( tryBlockStatements, superStatement.tryBlock.statements, /*statementOffset*/ 0, superPath, superPathDepth + 1, initializerStatements ); const tryBlockStatementsArray = factory2.createNodeArray(tryBlockStatements); setTextRange(tryBlockStatementsArray, superStatement.tryBlock.statements); statementsOut.push(factory2.updateTryStatement( superStatement, factory2.updateBlock(superStatement.tryBlock, tryBlockStatements), visitNode(superStatement.catchClause, visitor, isCatchClause), visitNode(superStatement.finallyBlock, visitor, isBlock) )); } else { addRange(statementsOut, visitNodes2(statementsIn, visitor, isStatement, superStatementIndex, 1)); addRange(statementsOut, initializerStatements); } addRange(statementsOut, visitNodes2(statementsIn, visitor, isStatement, superStatementIndex + 1)); } function transformConstructorBody(body, constructor) { const parametersWithPropertyAssignments = constructor && filter(constructor.parameters, (p) => isParameterPropertyDeclaration(p, constructor)); if (!some(parametersWithPropertyAssignments)) { return visitFunctionBody(body, visitor, context); } let statements = []; resumeLexicalEnvironment(); const prologueStatementCount = factory2.copyPrologue( body.statements, statements, /*ensureUseStrict*/ false, visitor ); const superPath = findSuperStatementIndexPath(body.statements, prologueStatementCount); const parameterPropertyAssignments = mapDefined(parametersWithPropertyAssignments, transformParameterWithPropertyAssignment); if (superPath.length) { transformConstructorBodyWorker( statements, body.statements, prologueStatementCount, superPath, /*superPathDepth*/ 0, parameterPropertyAssignments ); } else { addRange(statements, parameterPropertyAssignments); addRange(statements, visitNodes2(body.statements, visitor, isStatement, prologueStatementCount)); } statements = factory2.mergeLexicalEnvironment(statements, endLexicalEnvironment()); const block = factory2.createBlock( setTextRange(factory2.createNodeArray(statements), body.statements), /*multiLine*/ true ); setTextRange( block, /*location*/ body ); setOriginalNode(block, body); return block; } function transformParameterWithPropertyAssignment(node) { const name = node.name; if (!isIdentifier(name)) { return void 0; } const propertyName = setParent(setTextRange(factory2.cloneNode(name), name), name.parent); setEmitFlags(propertyName, 3072 /* NoComments */ | 96 /* NoSourceMap */); const localName = setParent(setTextRange(factory2.cloneNode(name), name), name.parent); setEmitFlags(localName, 3072 /* NoComments */); return startOnNewLine( removeAllComments( setTextRange( setOriginalNode( factory2.createExpressionStatement( factory2.createAssignment( setTextRange( factory2.createPropertyAccessExpression( factory2.createThis(), propertyName ), node.name ), localName ) ), node ), moveRangePos(node, -1) ) ) ); } function visitMethodDeclaration(node, parent) { if (!(node.transformFlags & 1 /* ContainsTypeScript */)) { return node; } if (!shouldEmitFunctionLikeDeclaration(node)) { return void 0; } let modifiers = isClassLike(parent) ? visitNodes2(node.modifiers, visitor, isModifierLike) : visitNodes2(node.modifiers, decoratorElidingVisitor, isModifierLike); modifiers = injectClassElementTypeMetadata(modifiers, node, parent); return factory2.updateMethodDeclaration( node, modifiers, node.asteriskToken, visitPropertyNameOfClassElement(node), /*questionToken*/ void 0, /*typeParameters*/ void 0, visitParameterList(node.parameters, visitor, context), /*type*/ void 0, visitFunctionBody(node.body, visitor, context) ); } function shouldEmitAccessorDeclaration(node) { return !(nodeIsMissing(node.body) && hasSyntacticModifier(node, 64 /* Abstract */)); } function visitGetAccessor(node, parent) { if (!(node.transformFlags & 1 /* ContainsTypeScript */)) { return node; } if (!shouldEmitAccessorDeclaration(node)) { return void 0; } let modifiers = isClassLike(parent) ? visitNodes2(node.modifiers, visitor, isModifierLike) : visitNodes2(node.modifiers, decoratorElidingVisitor, isModifierLike); modifiers = injectClassElementTypeMetadata(modifiers, node, parent); return factory2.updateGetAccessorDeclaration( node, modifiers, visitPropertyNameOfClassElement(node), visitParameterList(node.parameters, visitor, context), /*type*/ void 0, visitFunctionBody(node.body, visitor, context) || factory2.createBlock([]) ); } function visitSetAccessor(node, parent) { if (!(node.transformFlags & 1 /* ContainsTypeScript */)) { return node; } if (!shouldEmitAccessorDeclaration(node)) { return void 0; } let modifiers = isClassLike(parent) ? visitNodes2(node.modifiers, visitor, isModifierLike) : visitNodes2(node.modifiers, decoratorElidingVisitor, isModifierLike); modifiers = injectClassElementTypeMetadata(modifiers, node, parent); return factory2.updateSetAccessorDeclaration( node, modifiers, visitPropertyNameOfClassElement(node), visitParameterList(node.parameters, visitor, context), visitFunctionBody(node.body, visitor, context) || factory2.createBlock([]) ); } function visitFunctionDeclaration(node) { if (!shouldEmitFunctionLikeDeclaration(node)) { return factory2.createNotEmittedStatement(node); } const updated = factory2.updateFunctionDeclaration( node, visitNodes2(node.modifiers, modifierVisitor, isModifier), node.asteriskToken, node.name, /*typeParameters*/ void 0, visitParameterList(node.parameters, visitor, context), /*type*/ void 0, visitFunctionBody(node.body, visitor, context) || factory2.createBlock([]) ); if (isExportOfNamespace(node)) { const statements = [updated]; addExportMemberAssignment(statements, node); return statements; } return updated; } function visitFunctionExpression(node) { if (!shouldEmitFunctionLikeDeclaration(node)) { return factory2.createOmittedExpression(); } const updated = factory2.updateFunctionExpression( node, visitNodes2(node.modifiers, modifierVisitor, isModifier), node.asteriskToken, node.name, /*typeParameters*/ void 0, visitParameterList(node.parameters, visitor, context), /*type*/ void 0, visitFunctionBody(node.body, visitor, context) || factory2.createBlock([]) ); return updated; } function visitArrowFunction(node) { const updated = factory2.updateArrowFunction( node, visitNodes2(node.modifiers, modifierVisitor, isModifier), /*typeParameters*/ void 0, visitParameterList(node.parameters, visitor, context), /*type*/ void 0, node.equalsGreaterThanToken, visitFunctionBody(node.body, visitor, context) ); return updated; } function visitParameter(node) { if (parameterIsThisKeyword(node)) { return void 0; } const updated = factory2.updateParameterDeclaration( node, visitNodes2(node.modifiers, (node2) => isDecorator(node2) ? visitor(node2) : void 0, isModifierLike), node.dotDotDotToken, Debug.checkDefined(visitNode(node.name, visitor, isBindingName)), /*questionToken*/ void 0, /*type*/ void 0, visitNode(node.initializer, visitor, isExpression) ); if (updated !== node) { setCommentRange(updated, node); setTextRange(updated, moveRangePastModifiers(node)); setSourceMapRange(updated, moveRangePastModifiers(node)); setEmitFlags(updated.name, 64 /* NoTrailingSourceMap */); } return updated; } function visitVariableStatement(node) { if (isExportOfNamespace(node)) { const variables = getInitializedVariables(node.declarationList); if (variables.length === 0) { return void 0; } return setTextRange( factory2.createExpressionStatement( factory2.inlineExpressions( map(variables, transformInitializedVariable) ) ), node ); } else { return visitEachChild(node, visitor, context); } } function transformInitializedVariable(node) { const name = node.name; if (isBindingPattern(name)) { return flattenDestructuringAssignment( node, visitor, context, 0 /* All */, /*needsValue*/ false, createNamespaceExportExpression ); } else { return setTextRange( factory2.createAssignment( getNamespaceMemberNameWithSourceMapsAndWithoutComments(name), Debug.checkDefined(visitNode(node.initializer, visitor, isExpression)) ), /*location*/ node ); } } function visitVariableDeclaration(node) { const updated = factory2.updateVariableDeclaration( node, Debug.checkDefined(visitNode(node.name, visitor, isBindingName)), /*exclamationToken*/ void 0, /*type*/ void 0, visitNode(node.initializer, visitor, isExpression) ); if (node.type) { setTypeNode(updated.name, node.type); } return updated; } function visitParenthesizedExpression(node) { const innerExpression = skipOuterExpressions(node.expression, ~(38 /* Assertions */ | 16 /* ExpressionsWithTypeArguments */)); if (isAssertionExpression(innerExpression) || isSatisfiesExpression(innerExpression)) { const expression = visitNode(node.expression, visitor, isExpression); Debug.assert(expression); return factory2.createPartiallyEmittedExpression(expression, node); } return visitEachChild(node, visitor, context); } function visitAssertionExpression(node) { const expression = visitNode(node.expression, visitor, isExpression); Debug.assert(expression); return factory2.createPartiallyEmittedExpression(expression, node); } function visitNonNullExpression(node) { const expression = visitNode(node.expression, visitor, isLeftHandSideExpression); Debug.assert(expression); return factory2.createPartiallyEmittedExpression(expression, node); } function visitSatisfiesExpression(node) { const expression = visitNode(node.expression, visitor, isExpression); Debug.assert(expression); return factory2.createPartiallyEmittedExpression(expression, node); } function visitCallExpression(node) { return factory2.updateCallExpression( node, Debug.checkDefined(visitNode(node.expression, visitor, isExpression)), /*typeArguments*/ void 0, visitNodes2(node.arguments, visitor, isExpression) ); } function visitNewExpression(node) { return factory2.updateNewExpression( node, Debug.checkDefined(visitNode(node.expression, visitor, isExpression)), /*typeArguments*/ void 0, visitNodes2(node.arguments, visitor, isExpression) ); } function visitTaggedTemplateExpression(node) { return factory2.updateTaggedTemplateExpression( node, Debug.checkDefined(visitNode(node.tag, visitor, isExpression)), /*typeArguments*/ void 0, Debug.checkDefined(visitNode(node.template, visitor, isTemplateLiteral)) ); } function visitJsxSelfClosingElement(node) { return factory2.updateJsxSelfClosingElement( node, Debug.checkDefined(visitNode(node.tagName, visitor, isJsxTagNameExpression)), /*typeArguments*/ void 0, Debug.checkDefined(visitNode(node.attributes, visitor, isJsxAttributes)) ); } function visitJsxJsxOpeningElement(node) { return factory2.updateJsxOpeningElement( node, Debug.checkDefined(visitNode(node.tagName, visitor, isJsxTagNameExpression)), /*typeArguments*/ void 0, Debug.checkDefined(visitNode(node.attributes, visitor, isJsxAttributes)) ); } function shouldEmitEnumDeclaration(node) { return !isEnumConst(node) || shouldPreserveConstEnums(compilerOptions); } function visitEnumDeclaration(node) { if (!shouldEmitEnumDeclaration(node)) { return factory2.createNotEmittedStatement(node); } const statements = []; let emitFlags = 4 /* AdviseOnEmitNode */; const varAdded = addVarForEnumOrModuleDeclaration(statements, node); if (varAdded) { if (moduleKind !== 4 /* System */ || currentLexicalScope !== currentSourceFile) { emitFlags |= 1024 /* NoLeadingComments */; } } const parameterName = getNamespaceParameterName(node); const containerName = getNamespaceContainerName(node); const exportName = isExportOfNamespace(node) ? factory2.getExternalModuleOrNamespaceExportName( currentNamespaceContainerName, node, /*allowComments*/ false, /*allowSourceMaps*/ true ) : factory2.getDeclarationName( node, /*allowComments*/ false, /*allowSourceMaps*/ true ); let moduleArg = factory2.createLogicalOr( exportName, factory2.createAssignment( exportName, factory2.createObjectLiteralExpression() ) ); if (isExportOfNamespace(node)) { const localName = factory2.getLocalName( node, /*allowComments*/ false, /*allowSourceMaps*/ true ); moduleArg = factory2.createAssignment(localName, moduleArg); } const enumStatement = factory2.createExpressionStatement( factory2.createCallExpression( factory2.createFunctionExpression( /*modifiers*/ void 0, /*asteriskToken*/ void 0, /*name*/ void 0, /*typeParameters*/ void 0, [factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, parameterName )], /*type*/ void 0, transformEnumBody(node, containerName) ), /*typeArguments*/ void 0, [moduleArg] ) ); setOriginalNode(enumStatement, node); if (varAdded) { setSyntheticLeadingComments(enumStatement, void 0); setSyntheticTrailingComments(enumStatement, void 0); } setTextRange(enumStatement, node); addEmitFlags(enumStatement, emitFlags); statements.push(enumStatement); return statements; } function transformEnumBody(node, localName) { const savedCurrentNamespaceLocalName = currentNamespaceContainerName; currentNamespaceContainerName = localName; const statements = []; startLexicalEnvironment(); const members = map(node.members, transformEnumMember); insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment()); addRange(statements, members); currentNamespaceContainerName = savedCurrentNamespaceLocalName; return factory2.createBlock( setTextRange( factory2.createNodeArray(statements), /*location*/ node.members ), /*multiLine*/ true ); } function transformEnumMember(member) { const name = getExpressionForPropertyName( member, /*generateNameForComputedPropertyName*/ false ); const evaluated = resolver.getEnumMemberValue(member); const valueExpression = transformEnumMemberDeclarationValue(member, evaluated == null ? void 0 : evaluated.value); const innerAssignment = factory2.createAssignment( factory2.createElementAccessExpression( currentNamespaceContainerName, name ), valueExpression ); const outerAssignment = typeof (evaluated == null ? void 0 : evaluated.value) === "string" || (evaluated == null ? void 0 : evaluated.isSyntacticallyString) ? innerAssignment : factory2.createAssignment( factory2.createElementAccessExpression( currentNamespaceContainerName, innerAssignment ), name ); return setTextRange( factory2.createExpressionStatement( setTextRange( outerAssignment, member ) ), member ); } function transformEnumMemberDeclarationValue(member, constantValue) { if (constantValue !== void 0) { return typeof constantValue === "string" ? factory2.createStringLiteral(constantValue) : constantValue < 0 ? factory2.createPrefixUnaryExpression(41 /* MinusToken */, factory2.createNumericLiteral(-constantValue)) : factory2.createNumericLiteral(constantValue); } else { enableSubstitutionForNonQualifiedEnumMembers(); if (member.initializer) { return Debug.checkDefined(visitNode(member.initializer, visitor, isExpression)); } else { return factory2.createVoidZero(); } } } function shouldEmitModuleDeclaration(nodeIn) { const node = getParseTreeNode(nodeIn, isModuleDeclaration); if (!node) { return true; } return isInstantiatedModule(node, shouldPreserveConstEnums(compilerOptions)); } function recordEmittedDeclarationInScope(node) { if (!currentScopeFirstDeclarationsOfName) { currentScopeFirstDeclarationsOfName = /* @__PURE__ */ new Map(); } const name = declaredNameInScope(node); if (!currentScopeFirstDeclarationsOfName.has(name)) { currentScopeFirstDeclarationsOfName.set(name, node); } } function isFirstEmittedDeclarationInScope(node) { if (currentScopeFirstDeclarationsOfName) { const name = declaredNameInScope(node); return currentScopeFirstDeclarationsOfName.get(name) === node; } return true; } function declaredNameInScope(node) { Debug.assertNode(node.name, isIdentifier); return node.name.escapedText; } function addVarForEnumOrModuleDeclaration(statements, node) { const varDecl = factory2.createVariableDeclaration(factory2.getLocalName( node, /*allowComments*/ false, /*allowSourceMaps*/ true )); const varFlags = currentLexicalScope.kind === 308 /* SourceFile */ ? 0 /* None */ : 1 /* Let */; const statement = factory2.createVariableStatement( visitNodes2(node.modifiers, modifierVisitor, isModifier), factory2.createVariableDeclarationList([varDecl], varFlags) ); setOriginalNode(varDecl, node); setSyntheticLeadingComments(varDecl, void 0); setSyntheticTrailingComments(varDecl, void 0); setOriginalNode(statement, node); recordEmittedDeclarationInScope(node); if (isFirstEmittedDeclarationInScope(node)) { if (node.kind === 267 /* EnumDeclaration */) { setSourceMapRange(statement.declarationList, node); } else { setSourceMapRange(statement, node); } setCommentRange(statement, node); addEmitFlags(statement, 2048 /* NoTrailingComments */); statements.push(statement); return true; } return false; } function visitModuleDeclaration(node) { if (!shouldEmitModuleDeclaration(node)) { return factory2.createNotEmittedStatement(node); } Debug.assertNode(node.name, isIdentifier, "A TypeScript namespace should have an Identifier name."); enableSubstitutionForNamespaceExports(); const statements = []; let emitFlags = 4 /* AdviseOnEmitNode */; const varAdded = addVarForEnumOrModuleDeclaration(statements, node); if (varAdded) { if (moduleKind !== 4 /* System */ || currentLexicalScope !== currentSourceFile) { emitFlags |= 1024 /* NoLeadingComments */; } } const parameterName = getNamespaceParameterName(node); const containerName = getNamespaceContainerName(node); const exportName = isExportOfNamespace(node) ? factory2.getExternalModuleOrNamespaceExportName( currentNamespaceContainerName, node, /*allowComments*/ false, /*allowSourceMaps*/ true ) : factory2.getDeclarationName( node, /*allowComments*/ false, /*allowSourceMaps*/ true ); let moduleArg = factory2.createLogicalOr( exportName, factory2.createAssignment( exportName, factory2.createObjectLiteralExpression() ) ); if (isExportOfNamespace(node)) { const localName = factory2.getLocalName( node, /*allowComments*/ false, /*allowSourceMaps*/ true ); moduleArg = factory2.createAssignment(localName, moduleArg); } const moduleStatement = factory2.createExpressionStatement( factory2.createCallExpression( factory2.createFunctionExpression( /*modifiers*/ void 0, /*asteriskToken*/ void 0, /*name*/ void 0, /*typeParameters*/ void 0, [factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, parameterName )], /*type*/ void 0, transformModuleBody(node, containerName) ), /*typeArguments*/ void 0, [moduleArg] ) ); setOriginalNode(moduleStatement, node); if (varAdded) { setSyntheticLeadingComments(moduleStatement, void 0); setSyntheticTrailingComments(moduleStatement, void 0); } setTextRange(moduleStatement, node); addEmitFlags(moduleStatement, emitFlags); statements.push(moduleStatement); return statements; } function transformModuleBody(node, namespaceLocalName) { const savedCurrentNamespaceContainerName = currentNamespaceContainerName; const savedCurrentNamespace = currentNamespace; const savedCurrentScopeFirstDeclarationsOfName = currentScopeFirstDeclarationsOfName; currentNamespaceContainerName = namespaceLocalName; currentNamespace = node; currentScopeFirstDeclarationsOfName = void 0; const statements = []; startLexicalEnvironment(); let statementsLocation; let blockLocation; if (node.body) { if (node.body.kind === 269 /* ModuleBlock */) { saveStateAndInvoke(node.body, (body) => addRange(statements, visitNodes2(body.statements, namespaceElementVisitor, isStatement))); statementsLocation = node.body.statements; blockLocation = node.body; } else { const result = visitModuleDeclaration(node.body); if (result) { if (isArray(result)) { addRange(statements, result); } else { statements.push(result); } } const moduleBlock = getInnerMostModuleDeclarationFromDottedModule(node).body; statementsLocation = moveRangePos(moduleBlock.statements, -1); } } insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment()); currentNamespaceContainerName = savedCurrentNamespaceContainerName; currentNamespace = savedCurrentNamespace; currentScopeFirstDeclarationsOfName = savedCurrentScopeFirstDeclarationsOfName; const block = factory2.createBlock( setTextRange( factory2.createNodeArray(statements), /*location*/ statementsLocation ), /*multiLine*/ true ); setTextRange(block, blockLocation); if (!node.body || node.body.kind !== 269 /* ModuleBlock */) { setEmitFlags(block, getEmitFlags(block) | 3072 /* NoComments */); } return block; } function getInnerMostModuleDeclarationFromDottedModule(moduleDeclaration) { if (moduleDeclaration.body.kind === 268 /* ModuleDeclaration */) { const recursiveInnerModule = getInnerMostModuleDeclarationFromDottedModule(moduleDeclaration.body); return recursiveInnerModule || moduleDeclaration.body; } } function visitImportDeclaration(node) { if (!node.importClause) { return node; } if (node.importClause.isTypeOnly) { return void 0; } const importClause = visitNode(node.importClause, visitImportClause, isImportClause); return importClause ? factory2.updateImportDeclaration( node, /*modifiers*/ void 0, importClause, node.moduleSpecifier, node.attributes ) : void 0; } function visitImportClause(node) { Debug.assert(node.phaseModifier !== 156 /* TypeKeyword */); const name = shouldEmitAliasDeclaration(node) ? node.name : void 0; const namedBindings = visitNode(node.namedBindings, visitNamedImportBindings, isNamedImportBindings); return name || namedBindings ? factory2.updateImportClause(node, node.phaseModifier, name, namedBindings) : void 0; } function visitNamedImportBindings(node) { if (node.kind === 275 /* NamespaceImport */) { return shouldEmitAliasDeclaration(node) ? node : void 0; } else { const allowEmpty = compilerOptions.verbatimModuleSyntax; const elements = visitNodes2(node.elements, visitImportSpecifier, isImportSpecifier); return allowEmpty || some(elements) ? factory2.updateNamedImports(node, elements) : void 0; } } function visitImportSpecifier(node) { return !node.isTypeOnly && shouldEmitAliasDeclaration(node) ? node : void 0; } function visitExportAssignment(node) { return compilerOptions.verbatimModuleSyntax || resolver.isValueAliasDeclaration(node) ? visitEachChild(node, visitor, context) : void 0; } function visitExportDeclaration(node) { if (node.isTypeOnly) { return void 0; } if (!node.exportClause || isNamespaceExport(node.exportClause)) { return factory2.updateExportDeclaration( node, node.modifiers, node.isTypeOnly, node.exportClause, node.moduleSpecifier, node.attributes ); } const allowEmpty = !!compilerOptions.verbatimModuleSyntax; const exportClause = visitNode( node.exportClause, (bindings) => visitNamedExportBindings(bindings, allowEmpty), isNamedExportBindings ); return exportClause ? factory2.updateExportDeclaration( node, /*modifiers*/ void 0, node.isTypeOnly, exportClause, node.moduleSpecifier, node.attributes ) : void 0; } function visitNamedExports(node, allowEmpty) { const elements = visitNodes2(node.elements, visitExportSpecifier, isExportSpecifier); return allowEmpty || some(elements) ? factory2.updateNamedExports(node, elements) : void 0; } function visitNamespaceExports(node) { return factory2.updateNamespaceExport(node, Debug.checkDefined(visitNode(node.name, visitor, isIdentifier))); } function visitNamedExportBindings(node, allowEmpty) { return isNamespaceExport(node) ? visitNamespaceExports(node) : visitNamedExports(node, allowEmpty); } function visitExportSpecifier(node) { return !node.isTypeOnly && (compilerOptions.verbatimModuleSyntax || resolver.isValueAliasDeclaration(node)) ? node : void 0; } function shouldEmitImportEqualsDeclaration(node) { return shouldEmitAliasDeclaration(node) || !isExternalModule(currentSourceFile) && resolver.isTopLevelValueImportEqualsWithEntityName(node); } function visitImportEqualsDeclaration(node) { if (node.isTypeOnly) { return void 0; } if (isExternalModuleImportEqualsDeclaration(node)) { if (!shouldEmitAliasDeclaration(node)) { return void 0; } return visitEachChild(node, visitor, context); } if (!shouldEmitImportEqualsDeclaration(node)) { return void 0; } const moduleReference = createExpressionFromEntityName(factory2, node.moduleReference); setEmitFlags(moduleReference, 3072 /* NoComments */ | 4096 /* NoNestedComments */); if (isNamedExternalModuleExport(node) || !isExportOfNamespace(node)) { return setOriginalNode( setTextRange( factory2.createVariableStatement( visitNodes2(node.modifiers, modifierVisitor, isModifier), factory2.createVariableDeclarationList([ setOriginalNode( factory2.createVariableDeclaration( node.name, /*exclamationToken*/ void 0, /*type*/ void 0, moduleReference ), node ) ]) ), node ), node ); } else { return setOriginalNode( createNamespaceExport( node.name, moduleReference, node ), node ); } } function isExportOfNamespace(node) { return currentNamespace !== void 0 && hasSyntacticModifier(node, 32 /* Export */); } function isExternalModuleExport(node) { return currentNamespace === void 0 && hasSyntacticModifier(node, 32 /* Export */); } function isNamedExternalModuleExport(node) { return isExternalModuleExport(node) && !hasSyntacticModifier(node, 2048 /* Default */); } function isDefaultExternalModuleExport(node) { return isExternalModuleExport(node) && hasSyntacticModifier(node, 2048 /* Default */); } function createExportMemberAssignmentStatement(node) { const expression = factory2.createAssignment( factory2.getExternalModuleOrNamespaceExportName( currentNamespaceContainerName, node, /*allowComments*/ false, /*allowSourceMaps*/ true ), factory2.getLocalName(node) ); setSourceMapRange(expression, createRange(node.name ? node.name.pos : node.pos, node.end)); const statement = factory2.createExpressionStatement(expression); setSourceMapRange(statement, createRange(-1, node.end)); return statement; } function addExportMemberAssignment(statements, node) { statements.push(createExportMemberAssignmentStatement(node)); } function createNamespaceExport(exportName, exportValue, location) { return setTextRange( factory2.createExpressionStatement( factory2.createAssignment( factory2.getNamespaceMemberName( currentNamespaceContainerName, exportName, /*allowComments*/ false, /*allowSourceMaps*/ true ), exportValue ) ), location ); } function createNamespaceExportExpression(exportName, exportValue, location) { return setTextRange(factory2.createAssignment(getNamespaceMemberNameWithSourceMapsAndWithoutComments(exportName), exportValue), location); } function getNamespaceMemberNameWithSourceMapsAndWithoutComments(name) { return factory2.getNamespaceMemberName( currentNamespaceContainerName, name, /*allowComments*/ false, /*allowSourceMaps*/ true ); } function getNamespaceParameterName(node) { const name = factory2.getGeneratedNameForNode(node); setSourceMapRange(name, node.name); return name; } function getNamespaceContainerName(node) { return factory2.getGeneratedNameForNode(node); } function enableSubstitutionForNonQualifiedEnumMembers() { if ((enabledSubstitutions & 8 /* NonQualifiedEnumMembers */) === 0) { enabledSubstitutions |= 8 /* NonQualifiedEnumMembers */; context.enableSubstitution(80 /* Identifier */); } } function enableSubstitutionForNamespaceExports() { if ((enabledSubstitutions & 2 /* NamespaceExports */) === 0) { enabledSubstitutions |= 2 /* NamespaceExports */; context.enableSubstitution(80 /* Identifier */); context.enableSubstitution(305 /* ShorthandPropertyAssignment */); context.enableEmitNotification(268 /* ModuleDeclaration */); } } function isTransformedModuleDeclaration(node) { return getOriginalNode(node).kind === 268 /* ModuleDeclaration */; } function isTransformedEnumDeclaration(node) { return getOriginalNode(node).kind === 267 /* EnumDeclaration */; } function onEmitNode(hint, node, emitCallback) { const savedApplicableSubstitutions = applicableSubstitutions; const savedCurrentSourceFile = currentSourceFile; if (isSourceFile(node)) { currentSourceFile = node; } if (enabledSubstitutions & 2 /* NamespaceExports */ && isTransformedModuleDeclaration(node)) { applicableSubstitutions |= 2 /* NamespaceExports */; } if (enabledSubstitutions & 8 /* NonQualifiedEnumMembers */ && isTransformedEnumDeclaration(node)) { applicableSubstitutions |= 8 /* NonQualifiedEnumMembers */; } previousOnEmitNode(hint, node, emitCallback); applicableSubstitutions = savedApplicableSubstitutions; currentSourceFile = savedCurrentSourceFile; } function onSubstituteNode(hint, node) { node = previousOnSubstituteNode(hint, node); if (hint === 1 /* Expression */) { return substituteExpression(node); } else if (isShorthandPropertyAssignment(node)) { return substituteShorthandPropertyAssignment(node); } return node; } function substituteShorthandPropertyAssignment(node) { if (enabledSubstitutions & 2 /* NamespaceExports */) { const name = node.name; const exportedName = trySubstituteNamespaceExportedName(name); if (exportedName) { if (node.objectAssignmentInitializer) { const initializer = factory2.createAssignment(exportedName, node.objectAssignmentInitializer); return setTextRange(factory2.createPropertyAssignment(name, initializer), node); } return setTextRange(factory2.createPropertyAssignment(name, exportedName), node); } } return node; } function substituteExpression(node) { switch (node.kind) { case 80 /* Identifier */: return substituteExpressionIdentifier(node); case 212 /* PropertyAccessExpression */: return substitutePropertyAccessExpression(node); case 213 /* ElementAccessExpression */: return substituteElementAccessExpression(node); } return node; } function substituteExpressionIdentifier(node) { return trySubstituteNamespaceExportedName(node) || node; } function trySubstituteNamespaceExportedName(node) { if (enabledSubstitutions & applicableSubstitutions && !isGeneratedIdentifier(node) && !isLocalName(node)) { const container = resolver.getReferencedExportContainer( node, /*prefixLocals*/ false ); if (container && container.kind !== 308 /* SourceFile */) { const substitute = applicableSubstitutions & 2 /* NamespaceExports */ && container.kind === 268 /* ModuleDeclaration */ || applicableSubstitutions & 8 /* NonQualifiedEnumMembers */ && container.kind === 267 /* EnumDeclaration */; if (substitute) { return setTextRange( factory2.createPropertyAccessExpression(factory2.getGeneratedNameForNode(container), node), /*location*/ node ); } } } return void 0; } function substitutePropertyAccessExpression(node) { return substituteConstantValue(node); } function substituteElementAccessExpression(node) { return substituteConstantValue(node); } function safeMultiLineComment(value) { return value.replace(/\*\//g, "*_/"); } function substituteConstantValue(node) { const constantValue = tryGetConstEnumValue(node); if (constantValue !== void 0) { setConstantValue(node, constantValue); const substitute = typeof constantValue === "string" ? factory2.createStringLiteral(constantValue) : constantValue < 0 ? factory2.createPrefixUnaryExpression(41 /* MinusToken */, factory2.createNumericLiteral(-constantValue)) : factory2.createNumericLiteral(constantValue); if (!compilerOptions.removeComments) { const originalNode = getOriginalNode(node, isAccessExpression); addSyntheticTrailingComment(substitute, 3 /* MultiLineCommentTrivia */, ` ${safeMultiLineComment(getTextOfNode(originalNode))} `); } return substitute; } return node; } function tryGetConstEnumValue(node) { if (getIsolatedModules(compilerOptions)) { return void 0; } return isPropertyAccessExpression(node) || isElementAccessExpression(node) ? resolver.getConstantValue(node) : void 0; } function shouldEmitAliasDeclaration(node) { return compilerOptions.verbatimModuleSyntax || isInJSFile(node) || resolver.isReferencedAliasDeclaration(node); } } // src/compiler/transformers/classFields.ts function transformClassFields(context) { const { factory: factory2, getEmitHelperFactory: emitHelpers, hoistVariableDeclaration, endLexicalEnvironment, startLexicalEnvironment, resumeLexicalEnvironment, addBlockScopedVariable } = context; const resolver = context.getEmitResolver(); const compilerOptions = context.getCompilerOptions(); const languageVersion = getEmitScriptTarget(compilerOptions); const useDefineForClassFields = getUseDefineForClassFields(compilerOptions); const legacyDecorators = !!compilerOptions.experimentalDecorators; const shouldTransformInitializersUsingSet = !useDefineForClassFields; const shouldTransformInitializersUsingDefine = useDefineForClassFields && languageVersion < 9 /* ES2022 */; const shouldTransformInitializers = shouldTransformInitializersUsingSet || shouldTransformInitializersUsingDefine; const shouldTransformPrivateElementsOrClassStaticBlocks = languageVersion < 9 /* ES2022 */; const shouldTransformAutoAccessors = languageVersion < 99 /* ESNext */ ? -1 /* True */ : !useDefineForClassFields ? 3 /* Maybe */ : 0 /* False */; const shouldTransformThisInStaticInitializers = languageVersion < 9 /* ES2022 */; const shouldTransformSuperInStaticInitializers = shouldTransformThisInStaticInitializers && languageVersion >= 2 /* ES2015 */; const shouldTransformAnything = shouldTransformInitializers || shouldTransformPrivateElementsOrClassStaticBlocks || shouldTransformAutoAccessors === -1 /* True */; const previousOnSubstituteNode = context.onSubstituteNode; context.onSubstituteNode = onSubstituteNode; const previousOnEmitNode = context.onEmitNode; context.onEmitNode = onEmitNode; let shouldTransformPrivateStaticElementsInFile = false; let enabledSubstitutions = 0 /* None */; let classAliases; let pendingExpressions; let pendingStatements; let lexicalEnvironment; const lexicalEnvironmentMap = /* @__PURE__ */ new Map(); const noSubstitution = /* @__PURE__ */ new Set(); let currentClassContainer; let currentClassElement; let shouldSubstituteThisWithClassThis = false; let previousShouldSubstituteThisWithClassThis = false; return chainBundle(context, transformSourceFile); function transformSourceFile(node) { if (node.isDeclarationFile) { return node; } lexicalEnvironment = void 0; shouldTransformPrivateStaticElementsInFile = !!(getInternalEmitFlags(node) & 32 /* TransformPrivateStaticElements */); if (!shouldTransformAnything && !shouldTransformPrivateStaticElementsInFile) { return node; } const visited = visitEachChild(node, visitor, context); addEmitHelpers(visited, context.readEmitHelpers()); return visited; } function modifierVisitor(node) { switch (node.kind) { case 129 /* AccessorKeyword */: return shouldTransformAutoAccessorsInCurrentClass() ? void 0 : node; default: return tryCast(node, isModifier); } } function visitor(node) { if (!(node.transformFlags & 16777216 /* ContainsClassFields */) && !(node.transformFlags & 134234112 /* ContainsLexicalThisOrSuper */)) { return node; } switch (node.kind) { case 264 /* ClassDeclaration */: return visitClassDeclaration(node); case 232 /* ClassExpression */: return visitClassExpression(node); case 176 /* ClassStaticBlockDeclaration */: case 173 /* PropertyDeclaration */: return Debug.fail("Use `classElementVisitor` instead."); case 304 /* PropertyAssignment */: return visitPropertyAssignment(node); case 244 /* VariableStatement */: return visitVariableStatement(node); case 261 /* VariableDeclaration */: return visitVariableDeclaration(node); case 170 /* Parameter */: return visitParameterDeclaration(node); case 209 /* BindingElement */: return visitBindingElement(node); case 278 /* ExportAssignment */: return visitExportAssignment(node); case 81 /* PrivateIdentifier */: return visitPrivateIdentifier(node); case 212 /* PropertyAccessExpression */: return visitPropertyAccessExpression(node); case 213 /* ElementAccessExpression */: return visitElementAccessExpression(node); case 225 /* PrefixUnaryExpression */: case 226 /* PostfixUnaryExpression */: return visitPreOrPostfixUnaryExpression( node, /*discarded*/ false ); case 227 /* BinaryExpression */: return visitBinaryExpression( node, /*discarded*/ false ); case 218 /* ParenthesizedExpression */: return visitParenthesizedExpression( node, /*discarded*/ false ); case 214 /* CallExpression */: return visitCallExpression(node); case 245 /* ExpressionStatement */: return visitExpressionStatement(node); case 216 /* TaggedTemplateExpression */: return visitTaggedTemplateExpression(node); case 249 /* ForStatement */: return visitForStatement(node); case 110 /* ThisKeyword */: return visitThisExpression(node); case 263 /* FunctionDeclaration */: case 219 /* FunctionExpression */: return setCurrentClassElementAnd( /*classElement*/ void 0, fallbackVisitor, node ); case 177 /* Constructor */: case 175 /* MethodDeclaration */: case 178 /* GetAccessor */: case 179 /* SetAccessor */: { return setCurrentClassElementAnd( node, fallbackVisitor, node ); } default: return fallbackVisitor(node); } } function fallbackVisitor(node) { return visitEachChild(node, visitor, context); } function discardedValueVisitor(node) { switch (node.kind) { case 225 /* PrefixUnaryExpression */: case 226 /* PostfixUnaryExpression */: return visitPreOrPostfixUnaryExpression( node, /*discarded*/ true ); case 227 /* BinaryExpression */: return visitBinaryExpression( node, /*discarded*/ true ); case 357 /* CommaListExpression */: return visitCommaListExpression( node, /*discarded*/ true ); case 218 /* ParenthesizedExpression */: return visitParenthesizedExpression( node, /*discarded*/ true ); default: return visitor(node); } } function heritageClauseVisitor(node) { switch (node.kind) { case 299 /* HeritageClause */: return visitEachChild(node, heritageClauseVisitor, context); case 234 /* ExpressionWithTypeArguments */: return visitExpressionWithTypeArgumentsInHeritageClause(node); default: return visitor(node); } } function assignmentTargetVisitor(node) { switch (node.kind) { case 211 /* ObjectLiteralExpression */: case 210 /* ArrayLiteralExpression */: return visitAssignmentPattern(node); default: return visitor(node); } } function classElementVisitor(node) { switch (node.kind) { case 177 /* Constructor */: return setCurrentClassElementAnd( node, visitConstructorDeclaration, node ); case 178 /* GetAccessor */: case 179 /* SetAccessor */: case 175 /* MethodDeclaration */: return setCurrentClassElementAnd( node, visitMethodOrAccessorDeclaration, node ); case 173 /* PropertyDeclaration */: return setCurrentClassElementAnd( node, visitPropertyDeclaration, node ); case 176 /* ClassStaticBlockDeclaration */: return setCurrentClassElementAnd( node, visitClassStaticBlockDeclaration, node ); case 168 /* ComputedPropertyName */: return visitComputedPropertyName(node); case 241 /* SemicolonClassElement */: return node; default: return isModifierLike(node) ? modifierVisitor(node) : visitor(node); } } function propertyNameVisitor(node) { switch (node.kind) { case 168 /* ComputedPropertyName */: return visitComputedPropertyName(node); default: return visitor(node); } } function accessorFieldResultVisitor(node) { switch (node.kind) { case 173 /* PropertyDeclaration */: return transformFieldInitializer(node); case 178 /* GetAccessor */: case 179 /* SetAccessor */: return classElementVisitor(node); default: Debug.assertMissingNode(node, "Expected node to either be a PropertyDeclaration, GetAccessorDeclaration, or SetAccessorDeclaration"); break; } } function visitPrivateIdentifier(node) { if (!shouldTransformPrivateElementsOrClassStaticBlocks) { return node; } if (isStatement(node.parent)) { return node; } return setOriginalNode(factory2.createIdentifier(""), node); } function transformPrivateIdentifierInInExpression(node) { const info = accessPrivateIdentifier2(node.left); if (info) { const receiver = visitNode(node.right, visitor, isExpression); return setOriginalNode( emitHelpers().createClassPrivateFieldInHelper(info.brandCheckIdentifier, receiver), node ); } return visitEachChild(node, visitor, context); } function visitPropertyAssignment(node) { if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) { node = transformNamedEvaluation(context, node); } return visitEachChild(node, visitor, context); } function visitVariableStatement(node) { const savedPendingStatements = pendingStatements; pendingStatements = []; const visitedNode = visitEachChild(node, visitor, context); const statement = some(pendingStatements) ? [visitedNode, ...pendingStatements] : visitedNode; pendingStatements = savedPendingStatements; return statement; } function visitVariableDeclaration(node) { if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) { node = transformNamedEvaluation(context, node); } return visitEachChild(node, visitor, context); } function visitParameterDeclaration(node) { if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) { node = transformNamedEvaluation(context, node); } return visitEachChild(node, visitor, context); } function visitBindingElement(node) { if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) { node = transformNamedEvaluation(context, node); } return visitEachChild(node, visitor, context); } function visitExportAssignment(node) { if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) { node = transformNamedEvaluation( context, node, /*ignoreEmptyStringLiteral*/ true, node.isExportEquals ? "" : "default" ); } return visitEachChild(node, visitor, context); } function injectPendingExpressions(expression) { if (some(pendingExpressions)) { if (isParenthesizedExpression(expression)) { pendingExpressions.push(expression.expression); expression = factory2.updateParenthesizedExpression(expression, factory2.inlineExpressions(pendingExpressions)); } else { pendingExpressions.push(expression); expression = factory2.inlineExpressions(pendingExpressions); } pendingExpressions = void 0; } return expression; } function visitComputedPropertyName(node) { const expression = visitNode(node.expression, visitor, isExpression); return factory2.updateComputedPropertyName(node, injectPendingExpressions(expression)); } function visitConstructorDeclaration(node) { if (currentClassContainer) { return transformConstructor(node, currentClassContainer); } return fallbackVisitor(node); } function shouldTransformClassElementToWeakMap(node) { if (shouldTransformPrivateElementsOrClassStaticBlocks) return true; if (hasStaticModifier(node) && getInternalEmitFlags(node) & 32 /* TransformPrivateStaticElements */) return true; return false; } function visitMethodOrAccessorDeclaration(node) { Debug.assert(!hasDecorators(node)); if (!isPrivateIdentifierClassElementDeclaration(node) || !shouldTransformClassElementToWeakMap(node)) { return visitEachChild(node, classElementVisitor, context); } const info = accessPrivateIdentifier2(node.name); Debug.assert(info, "Undeclared private name for property declaration."); if (!info.isValid) { return node; } const functionName = getHoistedFunctionName(node); if (functionName) { getPendingExpressions().push( factory2.createAssignment( functionName, factory2.createFunctionExpression( filter(node.modifiers, (m) => isModifier(m) && !isStaticModifier(m) && !isAccessorModifier(m)), node.asteriskToken, functionName, /*typeParameters*/ void 0, visitParameterList(node.parameters, visitor, context), /*type*/ void 0, visitFunctionBody(node.body, visitor, context) ) ) ); } return void 0; } function setCurrentClassElementAnd(classElement, visitor2, arg) { if (classElement !== currentClassElement) { const savedCurrentClassElement = currentClassElement; currentClassElement = classElement; const result = visitor2(arg); currentClassElement = savedCurrentClassElement; return result; } return visitor2(arg); } function getHoistedFunctionName(node) { Debug.assert(isPrivateIdentifier(node.name)); const info = accessPrivateIdentifier2(node.name); Debug.assert(info, "Undeclared private name for property declaration."); if (info.kind === "m" /* Method */) { return info.methodName; } if (info.kind === "a" /* Accessor */) { if (isGetAccessor(node)) { return info.getterName; } if (isSetAccessor(node)) { return info.setterName; } } } function tryGetClassThis() { const lex = getClassLexicalEnvironment(); return lex.classThis ?? lex.classConstructor ?? (currentClassContainer == null ? void 0 : currentClassContainer.name); } function transformAutoAccessor(node) { const commentRange = getCommentRange(node); const sourceMapRange = getSourceMapRange(node); const name = node.name; let getterName = name; let setterName = name; if (isComputedPropertyName(name) && !isSimpleInlineableExpression(name.expression)) { const cacheAssignment = findComputedPropertyNameCacheAssignment(name); if (cacheAssignment) { getterName = factory2.updateComputedPropertyName(name, visitNode(name.expression, visitor, isExpression)); setterName = factory2.updateComputedPropertyName(name, cacheAssignment.left); } else { const temp = factory2.createTempVariable(hoistVariableDeclaration); setSourceMapRange(temp, name.expression); const expression = visitNode(name.expression, visitor, isExpression); const assignment = factory2.createAssignment(temp, expression); setSourceMapRange(assignment, name.expression); getterName = factory2.updateComputedPropertyName(name, assignment); setterName = factory2.updateComputedPropertyName(name, temp); } } const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier); const backingField = createAccessorPropertyBackingField(factory2, node, modifiers, node.initializer); setOriginalNode(backingField, node); setEmitFlags(backingField, 3072 /* NoComments */); setSourceMapRange(backingField, sourceMapRange); const receiver = isStatic(node) ? tryGetClassThis() ?? factory2.createThis() : factory2.createThis(); const getter = createAccessorPropertyGetRedirector(factory2, node, modifiers, getterName, receiver); setOriginalNode(getter, node); setCommentRange(getter, commentRange); setSourceMapRange(getter, sourceMapRange); const setterModifiers = factory2.createModifiersFromModifierFlags(modifiersToFlags(modifiers)); const setter = createAccessorPropertySetRedirector(factory2, node, setterModifiers, setterName, receiver); setOriginalNode(setter, node); setEmitFlags(setter, 3072 /* NoComments */); setSourceMapRange(setter, sourceMapRange); return visitArray([backingField, getter, setter], accessorFieldResultVisitor, isClassElement); } function transformPrivateFieldInitializer(node) { if (shouldTransformClassElementToWeakMap(node)) { const info = accessPrivateIdentifier2(node.name); Debug.assert(info, "Undeclared private name for property declaration."); if (!info.isValid) { return node; } if (info.isStatic && !shouldTransformPrivateElementsOrClassStaticBlocks) { const statement = transformPropertyOrClassStaticBlock(node, factory2.createThis()); if (statement) { return factory2.createClassStaticBlockDeclaration(factory2.createBlock( [statement], /*multiLine*/ true )); } } return void 0; } if (shouldTransformInitializersUsingSet && !isStatic(node) && (lexicalEnvironment == null ? void 0 : lexicalEnvironment.data) && lexicalEnvironment.data.facts & 16 /* WillHoistInitializersToConstructor */) { return factory2.updatePropertyDeclaration( node, visitNodes2(node.modifiers, visitor, isModifierLike), node.name, /*questionOrExclamationToken*/ void 0, /*type*/ void 0, /*initializer*/ void 0 ); } if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) { node = transformNamedEvaluation(context, node); } return factory2.updatePropertyDeclaration( node, visitNodes2(node.modifiers, modifierVisitor, isModifier), visitNode(node.name, propertyNameVisitor, isPropertyName), /*questionOrExclamationToken*/ void 0, /*type*/ void 0, visitNode(node.initializer, visitor, isExpression) ); } function transformPublicFieldInitializer(node) { if (shouldTransformInitializers && !isAutoAccessorPropertyDeclaration(node)) { const expr = getPropertyNameExpressionIfNeeded( node.name, /*shouldHoist*/ !!node.initializer || useDefineForClassFields ); if (expr) { getPendingExpressions().push(...flattenCommaList(expr)); } if (isStatic(node) && !shouldTransformPrivateElementsOrClassStaticBlocks) { const initializerStatement = transformPropertyOrClassStaticBlock(node, factory2.createThis()); if (initializerStatement) { const staticBlock = factory2.createClassStaticBlockDeclaration( factory2.createBlock([initializerStatement]) ); setOriginalNode(staticBlock, node); setCommentRange(staticBlock, node); setCommentRange(initializerStatement, { pos: -1, end: -1 }); setSyntheticLeadingComments(initializerStatement, void 0); setSyntheticTrailingComments(initializerStatement, void 0); return staticBlock; } } return void 0; } return factory2.updatePropertyDeclaration( node, visitNodes2(node.modifiers, modifierVisitor, isModifier), visitNode(node.name, propertyNameVisitor, isPropertyName), /*questionOrExclamationToken*/ void 0, /*type*/ void 0, visitNode(node.initializer, visitor, isExpression) ); } function transformFieldInitializer(node) { Debug.assert(!hasDecorators(node), "Decorators should already have been transformed and elided."); return isPrivateIdentifierClassElementDeclaration(node) ? transformPrivateFieldInitializer(node) : transformPublicFieldInitializer(node); } function shouldTransformAutoAccessorsInCurrentClass() { return shouldTransformAutoAccessors === -1 /* True */ || shouldTransformAutoAccessors === 3 /* Maybe */ && !!(lexicalEnvironment == null ? void 0 : lexicalEnvironment.data) && !!(lexicalEnvironment.data.facts & 16 /* WillHoistInitializersToConstructor */); } function visitPropertyDeclaration(node) { if (isAutoAccessorPropertyDeclaration(node) && (shouldTransformAutoAccessorsInCurrentClass() || hasStaticModifier(node) && getInternalEmitFlags(node) & 32 /* TransformPrivateStaticElements */)) { return transformAutoAccessor(node); } return transformFieldInitializer(node); } function shouldForceDynamicThis() { return !!currentClassElement && hasStaticModifier(currentClassElement) && isAccessor(currentClassElement) && isAutoAccessorPropertyDeclaration(getOriginalNode(currentClassElement)); } function ensureDynamicThisIfNeeded(node) { if (shouldForceDynamicThis()) { const innerExpression = skipOuterExpressions(node); if (innerExpression.kind === 110 /* ThisKeyword */) { noSubstitution.add(innerExpression); } } } function createPrivateIdentifierAccess(info, receiver) { receiver = visitNode(receiver, visitor, isExpression); ensureDynamicThisIfNeeded(receiver); return createPrivateIdentifierAccessHelper(info, receiver); } function createPrivateIdentifierAccessHelper(info, receiver) { setCommentRange(receiver, moveRangePos(receiver, -1)); switch (info.kind) { case "a" /* Accessor */: return emitHelpers().createClassPrivateFieldGetHelper( receiver, info.brandCheckIdentifier, info.kind, info.getterName ); case "m" /* Method */: return emitHelpers().createClassPrivateFieldGetHelper( receiver, info.brandCheckIdentifier, info.kind, info.methodName ); case "f" /* Field */: return emitHelpers().createClassPrivateFieldGetHelper( receiver, info.brandCheckIdentifier, info.kind, info.isStatic ? info.variableName : void 0 ); case "untransformed": return Debug.fail("Access helpers should not be created for untransformed private elements"); default: Debug.assertNever(info, "Unknown private element type"); } } function visitPropertyAccessExpression(node) { if (isPrivateIdentifier(node.name)) { const privateIdentifierInfo = accessPrivateIdentifier2(node.name); if (privateIdentifierInfo) { return setTextRange( setOriginalNode( createPrivateIdentifierAccess(privateIdentifierInfo, node.expression), node ), node ); } } if (shouldTransformSuperInStaticInitializers && currentClassElement && isSuperProperty(node) && isIdentifier(node.name) && isStaticPropertyDeclarationOrClassStaticBlock(currentClassElement) && (lexicalEnvironment == null ? void 0 : lexicalEnvironment.data)) { const { classConstructor, superClassReference, facts } = lexicalEnvironment.data; if (facts & 1 /* ClassWasDecorated */) { return visitInvalidSuperProperty(node); } if (classConstructor && superClassReference) { const superProperty = factory2.createReflectGetCall( superClassReference, factory2.createStringLiteralFromNode(node.name), classConstructor ); setOriginalNode(superProperty, node.expression); setTextRange(superProperty, node.expression); return superProperty; } } return visitEachChild(node, visitor, context); } function visitElementAccessExpression(node) { if (shouldTransformSuperInStaticInitializers && currentClassElement && isSuperProperty(node) && isStaticPropertyDeclarationOrClassStaticBlock(currentClassElement) && (lexicalEnvironment == null ? void 0 : lexicalEnvironment.data)) { const { classConstructor, superClassReference, facts } = lexicalEnvironment.data; if (facts & 1 /* ClassWasDecorated */) { return visitInvalidSuperProperty(node); } if (classConstructor && superClassReference) { const superProperty = factory2.createReflectGetCall( superClassReference, visitNode(node.argumentExpression, visitor, isExpression), classConstructor ); setOriginalNode(superProperty, node.expression); setTextRange(superProperty, node.expression); return superProperty; } } return visitEachChild(node, visitor, context); } function visitPreOrPostfixUnaryExpression(node, discarded) { if (node.operator === 46 /* PlusPlusToken */ || node.operator === 47 /* MinusMinusToken */) { const operand = skipParentheses(node.operand); if (isPrivateIdentifierPropertyAccessExpression(operand)) { let info; if (info = accessPrivateIdentifier2(operand.name)) { const receiver = visitNode(operand.expression, visitor, isExpression); ensureDynamicThisIfNeeded(receiver); const { readExpression, initializeExpression } = createCopiableReceiverExpr(receiver); let expression = createPrivateIdentifierAccess(info, readExpression); const temp = isPrefixUnaryExpression(node) || discarded ? void 0 : factory2.createTempVariable(hoistVariableDeclaration); expression = expandPreOrPostfixIncrementOrDecrementExpression(factory2, node, expression, hoistVariableDeclaration, temp); expression = createPrivateIdentifierAssignment( info, initializeExpression || readExpression, expression, 64 /* EqualsToken */ ); setOriginalNode(expression, node); setTextRange(expression, node); if (temp) { expression = factory2.createComma(expression, temp); setTextRange(expression, node); } return expression; } } else if (shouldTransformSuperInStaticInitializers && currentClassElement && isSuperProperty(operand) && isStaticPropertyDeclarationOrClassStaticBlock(currentClassElement) && (lexicalEnvironment == null ? void 0 : lexicalEnvironment.data)) { const { classConstructor, superClassReference, facts } = lexicalEnvironment.data; if (facts & 1 /* ClassWasDecorated */) { const expression = visitInvalidSuperProperty(operand); return isPrefixUnaryExpression(node) ? factory2.updatePrefixUnaryExpression(node, expression) : factory2.updatePostfixUnaryExpression(node, expression); } if (classConstructor && superClassReference) { let setterName; let getterName; if (isPropertyAccessExpression(operand)) { if (isIdentifier(operand.name)) { getterName = setterName = factory2.createStringLiteralFromNode(operand.name); } } else { if (isSimpleInlineableExpression(operand.argumentExpression)) { getterName = setterName = operand.argumentExpression; } else { getterName = factory2.createTempVariable(hoistVariableDeclaration); setterName = factory2.createAssignment(getterName, visitNode(operand.argumentExpression, visitor, isExpression)); } } if (setterName && getterName) { let expression = factory2.createReflectGetCall(superClassReference, getterName, classConstructor); setTextRange(expression, operand); const temp = discarded ? void 0 : factory2.createTempVariable(hoistVariableDeclaration); expression = expandPreOrPostfixIncrementOrDecrementExpression(factory2, node, expression, hoistVariableDeclaration, temp); expression = factory2.createReflectSetCall(superClassReference, setterName, expression, classConstructor); setOriginalNode(expression, node); setTextRange(expression, node); if (temp) { expression = factory2.createComma(expression, temp); setTextRange(expression, node); } return expression; } } } } return visitEachChild(node, visitor, context); } function visitForStatement(node) { return factory2.updateForStatement( node, visitNode(node.initializer, discardedValueVisitor, isForInitializer), visitNode(node.condition, visitor, isExpression), visitNode(node.incrementor, discardedValueVisitor, isExpression), visitIterationBody(node.statement, visitor, context) ); } function visitExpressionStatement(node) { return factory2.updateExpressionStatement( node, visitNode(node.expression, discardedValueVisitor, isExpression) ); } function createCopiableReceiverExpr(receiver) { const clone = nodeIsSynthesized(receiver) ? receiver : factory2.cloneNode(receiver); if (receiver.kind === 110 /* ThisKeyword */ && noSubstitution.has(receiver)) { noSubstitution.add(clone); } if (isSimpleInlineableExpression(receiver)) { return { readExpression: clone, initializeExpression: void 0 }; } const readExpression = factory2.createTempVariable(hoistVariableDeclaration); const initializeExpression = factory2.createAssignment(readExpression, clone); return { readExpression, initializeExpression }; } function visitCallExpression(node) { var _a; if (isPrivateIdentifierPropertyAccessExpression(node.expression) && accessPrivateIdentifier2(node.expression.name)) { const { thisArg, target } = factory2.createCallBinding(node.expression, hoistVariableDeclaration, languageVersion); if (isCallChain(node)) { return factory2.updateCallChain( node, factory2.createPropertyAccessChain(visitNode(target, visitor, isExpression), node.questionDotToken, "call"), /*questionDotToken*/ void 0, /*typeArguments*/ void 0, [visitNode(thisArg, visitor, isExpression), ...visitNodes2(node.arguments, visitor, isExpression)] ); } return factory2.updateCallExpression( node, factory2.createPropertyAccessExpression(visitNode(target, visitor, isExpression), "call"), /*typeArguments*/ void 0, [visitNode(thisArg, visitor, isExpression), ...visitNodes2(node.arguments, visitor, isExpression)] ); } if (shouldTransformSuperInStaticInitializers && currentClassElement && isSuperProperty(node.expression) && isStaticPropertyDeclarationOrClassStaticBlock(currentClassElement) && ((_a = lexicalEnvironment == null ? void 0 : lexicalEnvironment.data) == null ? void 0 : _a.classConstructor)) { const invocation = factory2.createFunctionCallCall( visitNode(node.expression, visitor, isExpression), lexicalEnvironment.data.classConstructor, visitNodes2(node.arguments, visitor, isExpression) ); setOriginalNode(invocation, node); setTextRange(invocation, node); return invocation; } return visitEachChild(node, visitor, context); } function visitTaggedTemplateExpression(node) { var _a; if (isPrivateIdentifierPropertyAccessExpression(node.tag) && accessPrivateIdentifier2(node.tag.name)) { const { thisArg, target } = factory2.createCallBinding(node.tag, hoistVariableDeclaration, languageVersion); return factory2.updateTaggedTemplateExpression( node, factory2.createCallExpression( factory2.createPropertyAccessExpression(visitNode(target, visitor, isExpression), "bind"), /*typeArguments*/ void 0, [visitNode(thisArg, visitor, isExpression)] ), /*typeArguments*/ void 0, visitNode(node.template, visitor, isTemplateLiteral) ); } if (shouldTransformSuperInStaticInitializers && currentClassElement && isSuperProperty(node.tag) && isStaticPropertyDeclarationOrClassStaticBlock(currentClassElement) && ((_a = lexicalEnvironment == null ? void 0 : lexicalEnvironment.data) == null ? void 0 : _a.classConstructor)) { const invocation = factory2.createFunctionBindCall( visitNode(node.tag, visitor, isExpression), lexicalEnvironment.data.classConstructor, [] ); setOriginalNode(invocation, node); setTextRange(invocation, node); return factory2.updateTaggedTemplateExpression( node, invocation, /*typeArguments*/ void 0, visitNode(node.template, visitor, isTemplateLiteral) ); } return visitEachChild(node, visitor, context); } function transformClassStaticBlockDeclaration(node) { if (lexicalEnvironment) { lexicalEnvironmentMap.set(getOriginalNode(node), lexicalEnvironment); } if (shouldTransformPrivateElementsOrClassStaticBlocks) { if (isClassThisAssignmentBlock(node)) { const result = visitNode(node.body.statements[0].expression, visitor, isExpression); if (isAssignmentExpression( result, /*excludeCompoundAssignment*/ true ) && result.left === result.right) { return void 0; } return result; } if (isClassNamedEvaluationHelperBlock(node)) { return visitNode(node.body.statements[0].expression, visitor, isExpression); } startLexicalEnvironment(); let statements = setCurrentClassElementAnd( node, (statements2) => visitNodes2(statements2, visitor, isStatement), node.body.statements ); statements = factory2.mergeLexicalEnvironment(statements, endLexicalEnvironment()); const iife = factory2.createImmediatelyInvokedArrowFunction(statements); setOriginalNode(skipParentheses(iife.expression), node); addEmitFlags(skipParentheses(iife.expression), 4 /* AdviseOnEmitNode */); setOriginalNode(iife, node); setTextRange(iife, node); return iife; } } function isAnonymousClassNeedingAssignedName(node) { if (isClassExpression(node) && !node.name) { const staticPropertiesOrClassStaticBlocks = getStaticPropertiesAndClassStaticBlock(node); if (some(staticPropertiesOrClassStaticBlocks, isClassNamedEvaluationHelperBlock)) { return false; } const hasTransformableStatics = (shouldTransformPrivateElementsOrClassStaticBlocks || !!(getInternalEmitFlags(node) && 32 /* TransformPrivateStaticElements */)) && some(staticPropertiesOrClassStaticBlocks, (node2) => isClassStaticBlockDeclaration(node2) || isPrivateIdentifierClassElementDeclaration(node2) || shouldTransformInitializers && isInitializedProperty(node2)); return hasTransformableStatics; } return false; } function visitBinaryExpression(node, discarded) { if (isDestructuringAssignment(node)) { const savedPendingExpressions = pendingExpressions; pendingExpressions = void 0; node = factory2.updateBinaryExpression( node, visitNode(node.left, assignmentTargetVisitor, isExpression), node.operatorToken, visitNode(node.right, visitor, isExpression) ); const expr = some(pendingExpressions) ? factory2.inlineExpressions(compact([...pendingExpressions, node])) : node; pendingExpressions = savedPendingExpressions; return expr; } if (isAssignmentExpression(node)) { if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) { node = transformNamedEvaluation(context, node); Debug.assertNode(node, isAssignmentExpression); } const left = skipOuterExpressions(node.left, 8 /* PartiallyEmittedExpressions */ | 1 /* Parentheses */); if (isPrivateIdentifierPropertyAccessExpression(left)) { const info = accessPrivateIdentifier2(left.name); if (info) { return setTextRange( setOriginalNode( createPrivateIdentifierAssignment(info, left.expression, node.right, node.operatorToken.kind), node ), node ); } } else if (shouldTransformSuperInStaticInitializers && currentClassElement && isSuperProperty(node.left) && isStaticPropertyDeclarationOrClassStaticBlock(currentClassElement) && (lexicalEnvironment == null ? void 0 : lexicalEnvironment.data)) { const { classConstructor, superClassReference, facts } = lexicalEnvironment.data; if (facts & 1 /* ClassWasDecorated */) { return factory2.updateBinaryExpression( node, visitInvalidSuperProperty(node.left), node.operatorToken, visitNode(node.right, visitor, isExpression) ); } if (classConstructor && superClassReference) { let setterName = isElementAccessExpression(node.left) ? visitNode(node.left.argumentExpression, visitor, isExpression) : isIdentifier(node.left.name) ? factory2.createStringLiteralFromNode(node.left.name) : void 0; if (setterName) { let expression = visitNode(node.right, visitor, isExpression); if (isCompoundAssignment(node.operatorToken.kind)) { let getterName = setterName; if (!isSimpleInlineableExpression(setterName)) { getterName = factory2.createTempVariable(hoistVariableDeclaration); setterName = factory2.createAssignment(getterName, setterName); } const superPropertyGet = factory2.createReflectGetCall( superClassReference, getterName, classConstructor ); setOriginalNode(superPropertyGet, node.left); setTextRange(superPropertyGet, node.left); expression = factory2.createBinaryExpression( superPropertyGet, getNonAssignmentOperatorForCompoundAssignment(node.operatorToken.kind), expression ); setTextRange(expression, node); } const temp = discarded ? void 0 : factory2.createTempVariable(hoistVariableDeclaration); if (temp) { expression = factory2.createAssignment(temp, expression); setTextRange(temp, node); } expression = factory2.createReflectSetCall( superClassReference, setterName, expression, classConstructor ); setOriginalNode(expression, node); setTextRange(expression, node); if (temp) { expression = factory2.createComma(expression, temp); setTextRange(expression, node); } return expression; } } } } if (isPrivateIdentifierInExpression(node)) { return transformPrivateIdentifierInInExpression(node); } return visitEachChild(node, visitor, context); } function visitCommaListExpression(node, discarded) { const elements = discarded ? visitCommaListElements(node.elements, discardedValueVisitor) : visitCommaListElements(node.elements, visitor, discardedValueVisitor); return factory2.updateCommaListExpression(node, elements); } function visitParenthesizedExpression(node, discarded) { const visitorFunc = discarded ? discardedValueVisitor : visitor; const expression = visitNode(node.expression, visitorFunc, isExpression); return factory2.updateParenthesizedExpression(node, expression); } function createPrivateIdentifierAssignment(info, receiver, right, operator) { receiver = visitNode(receiver, visitor, isExpression); right = visitNode(right, visitor, isExpression); ensureDynamicThisIfNeeded(receiver); if (isCompoundAssignment(operator)) { const { readExpression, initializeExpression } = createCopiableReceiverExpr(receiver); receiver = initializeExpression || readExpression; right = factory2.createBinaryExpression( createPrivateIdentifierAccessHelper(info, readExpression), getNonAssignmentOperatorForCompoundAssignment(operator), right ); } setCommentRange(receiver, moveRangePos(receiver, -1)); switch (info.kind) { case "a" /* Accessor */: return emitHelpers().createClassPrivateFieldSetHelper( receiver, info.brandCheckIdentifier, right, info.kind, info.setterName ); case "m" /* Method */: return emitHelpers().createClassPrivateFieldSetHelper( receiver, info.brandCheckIdentifier, right, info.kind, /*f*/ void 0 ); case "f" /* Field */: return emitHelpers().createClassPrivateFieldSetHelper( receiver, info.brandCheckIdentifier, right, info.kind, info.isStatic ? info.variableName : void 0 ); case "untransformed": return Debug.fail("Access helpers should not be created for untransformed private elements"); default: Debug.assertNever(info, "Unknown private element type"); } } function getPrivateInstanceMethodsAndAccessors(node) { return filter(node.members, isNonStaticMethodOrAccessorWithPrivateName); } function getClassFacts(node) { var _a; let facts = 0 /* None */; const original = getOriginalNode(node); if (isClassLike(original) && classOrConstructorParameterIsDecorated(legacyDecorators, original)) { facts |= 1 /* ClassWasDecorated */; } if (shouldTransformPrivateElementsOrClassStaticBlocks && (classHasClassThisAssignment(node) || classHasExplicitlyAssignedName(node))) { facts |= 2 /* NeedsClassConstructorReference */; } let containsPublicInstanceFields = false; let containsInitializedPublicInstanceFields = false; let containsInstancePrivateElements = false; let containsInstanceAutoAccessors = false; for (const member of node.members) { if (isStatic(member)) { if (member.name && (isPrivateIdentifier(member.name) || isAutoAccessorPropertyDeclaration(member)) && shouldTransformPrivateElementsOrClassStaticBlocks) { facts |= 2 /* NeedsClassConstructorReference */; } else if (isAutoAccessorPropertyDeclaration(member) && shouldTransformAutoAccessors === -1 /* True */ && !node.name && !((_a = node.emitNode) == null ? void 0 : _a.classThis)) { facts |= 2 /* NeedsClassConstructorReference */; } if (isPropertyDeclaration(member) || isClassStaticBlockDeclaration(member)) { if (shouldTransformThisInStaticInitializers && member.transformFlags & 16384 /* ContainsLexicalThis */) { facts |= 8 /* NeedsSubstitutionForThisInClassStaticField */; if (!(facts & 1 /* ClassWasDecorated */)) { facts |= 2 /* NeedsClassConstructorReference */; } } if (shouldTransformSuperInStaticInitializers && member.transformFlags & 134217728 /* ContainsLexicalSuper */) { if (!(facts & 1 /* ClassWasDecorated */)) { facts |= 2 /* NeedsClassConstructorReference */ | 4 /* NeedsClassSuperReference */; } } } } else if (!hasAbstractModifier(getOriginalNode(member))) { if (isAutoAccessorPropertyDeclaration(member)) { containsInstanceAutoAccessors = true; containsInstancePrivateElements || (containsInstancePrivateElements = isPrivateIdentifierClassElementDeclaration(member)); } else if (isPrivateIdentifierClassElementDeclaration(member)) { containsInstancePrivateElements = true; if (resolver.hasNodeCheckFlag(member, 262144 /* ContainsConstructorReference */)) { facts |= 2 /* NeedsClassConstructorReference */; } } else if (isPropertyDeclaration(member)) { containsPublicInstanceFields = true; containsInitializedPublicInstanceFields || (containsInitializedPublicInstanceFields = !!member.initializer); } } } const willHoistInitializersToConstructor = shouldTransformInitializersUsingDefine && containsPublicInstanceFields || shouldTransformInitializersUsingSet && containsInitializedPublicInstanceFields || shouldTransformPrivateElementsOrClassStaticBlocks && containsInstancePrivateElements || shouldTransformPrivateElementsOrClassStaticBlocks && containsInstanceAutoAccessors && shouldTransformAutoAccessors === -1 /* True */; if (willHoistInitializersToConstructor) { facts |= 16 /* WillHoistInitializersToConstructor */; } return facts; } function visitExpressionWithTypeArgumentsInHeritageClause(node) { var _a; const facts = ((_a = lexicalEnvironment == null ? void 0 : lexicalEnvironment.data) == null ? void 0 : _a.facts) || 0 /* None */; if (facts & 4 /* NeedsClassSuperReference */) { const temp = factory2.createTempVariable( hoistVariableDeclaration, /*reservedInNestedScopes*/ true ); getClassLexicalEnvironment().superClassReference = temp; return factory2.updateExpressionWithTypeArguments( node, factory2.createAssignment( temp, visitNode(node.expression, visitor, isExpression) ), /*typeArguments*/ void 0 ); } return visitEachChild(node, visitor, context); } function visitInNewClassLexicalEnvironment(node, visitor2) { var _a; const savedCurrentClassContainer = currentClassContainer; const savedPendingExpressions = pendingExpressions; const savedLexicalEnvironment = lexicalEnvironment; currentClassContainer = node; pendingExpressions = void 0; startClassLexicalEnvironment(); const shouldAlwaysTransformPrivateStaticElements = getInternalEmitFlags(node) & 32 /* TransformPrivateStaticElements */; if (shouldTransformPrivateElementsOrClassStaticBlocks || shouldAlwaysTransformPrivateStaticElements) { const name = getNameOfDeclaration(node); if (name && isIdentifier(name)) { getPrivateIdentifierEnvironment().data.className = name; } else if ((_a = node.emitNode) == null ? void 0 : _a.assignedName) { if (isStringLiteral(node.emitNode.assignedName)) { if (node.emitNode.assignedName.textSourceNode && isIdentifier(node.emitNode.assignedName.textSourceNode)) { getPrivateIdentifierEnvironment().data.className = node.emitNode.assignedName.textSourceNode; } else if (isIdentifierText(node.emitNode.assignedName.text, languageVersion)) { const prefixName = factory2.createIdentifier(node.emitNode.assignedName.text); getPrivateIdentifierEnvironment().data.className = prefixName; } } } } if (shouldTransformPrivateElementsOrClassStaticBlocks) { const privateInstanceMethodsAndAccessors = getPrivateInstanceMethodsAndAccessors(node); if (some(privateInstanceMethodsAndAccessors)) { getPrivateIdentifierEnvironment().data.weakSetName = createHoistedVariableForClass( "instances", privateInstanceMethodsAndAccessors[0].name ); } } const facts = getClassFacts(node); if (facts) { getClassLexicalEnvironment().facts = facts; } if (facts & 8 /* NeedsSubstitutionForThisInClassStaticField */) { enableSubstitutionForClassStaticThisOrSuperReference(); } const result = visitor2(node, facts); endClassLexicalEnvironment(); Debug.assert(lexicalEnvironment === savedLexicalEnvironment); currentClassContainer = savedCurrentClassContainer; pendingExpressions = savedPendingExpressions; return result; } function visitClassDeclaration(node) { return visitInNewClassLexicalEnvironment(node, visitClassDeclarationInNewClassLexicalEnvironment); } function visitClassDeclarationInNewClassLexicalEnvironment(node, facts) { var _a, _b; let pendingClassReferenceAssignment; if (facts & 2 /* NeedsClassConstructorReference */) { if (shouldTransformPrivateElementsOrClassStaticBlocks && ((_a = node.emitNode) == null ? void 0 : _a.classThis)) { getClassLexicalEnvironment().classConstructor = node.emitNode.classThis; pendingClassReferenceAssignment = factory2.createAssignment(node.emitNode.classThis, factory2.getInternalName(node)); } else { const temp = factory2.createTempVariable( hoistVariableDeclaration, /*reservedInNestedScopes*/ true ); getClassLexicalEnvironment().classConstructor = factory2.cloneNode(temp); pendingClassReferenceAssignment = factory2.createAssignment(temp, factory2.getInternalName(node)); } } if ((_b = node.emitNode) == null ? void 0 : _b.classThis) { getClassLexicalEnvironment().classThis = node.emitNode.classThis; } const isClassWithConstructorReference = resolver.hasNodeCheckFlag(node, 262144 /* ContainsConstructorReference */); const isExport = hasSyntacticModifier(node, 32 /* Export */); const isDefault = hasSyntacticModifier(node, 2048 /* Default */); let modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier); const heritageClauses = visitNodes2(node.heritageClauses, heritageClauseVisitor, isHeritageClause); const { members, prologue } = transformClassMembers(node); const statements = []; if (pendingClassReferenceAssignment) { getPendingExpressions().unshift(pendingClassReferenceAssignment); } if (some(pendingExpressions)) { statements.push(factory2.createExpressionStatement(factory2.inlineExpressions(pendingExpressions))); } if (shouldTransformInitializersUsingSet || shouldTransformPrivateElementsOrClassStaticBlocks || getInternalEmitFlags(node) & 32 /* TransformPrivateStaticElements */) { const staticProperties = getStaticPropertiesAndClassStaticBlock(node); if (some(staticProperties)) { addPropertyOrClassStaticBlockStatements(statements, staticProperties, factory2.getInternalName(node)); } } if (statements.length > 0 && isExport && isDefault) { modifiers = visitNodes2(modifiers, (node2) => isExportOrDefaultModifier(node2) ? void 0 : node2, isModifier); statements.push(factory2.createExportAssignment( /*modifiers*/ void 0, /*isExportEquals*/ false, factory2.getLocalName( node, /*allowComments*/ false, /*allowSourceMaps*/ true ) )); } const alias = getClassLexicalEnvironment().classConstructor; if (isClassWithConstructorReference && alias) { enableSubstitutionForClassAliases(); classAliases[getOriginalNodeId(node)] = alias; } const classDecl = factory2.updateClassDeclaration( node, modifiers, node.name, /*typeParameters*/ void 0, heritageClauses, members ); statements.unshift(classDecl); if (prologue) { statements.unshift(factory2.createExpressionStatement(prologue)); } return statements; } function visitClassExpression(node) { return visitInNewClassLexicalEnvironment(node, visitClassExpressionInNewClassLexicalEnvironment); } function visitClassExpressionInNewClassLexicalEnvironment(node, facts) { var _a, _b, _c; const isDecoratedClassDeclaration = !!(facts & 1 /* ClassWasDecorated */); const staticPropertiesOrClassStaticBlocks = getStaticPropertiesAndClassStaticBlock(node); const isClassWithConstructorReference = resolver.hasNodeCheckFlag(node, 262144 /* ContainsConstructorReference */); const requiresBlockScopedVar = resolver.hasNodeCheckFlag(node, 32768 /* BlockScopedBindingInLoop */); let temp; function createClassTempVar() { var _a2; if (shouldTransformPrivateElementsOrClassStaticBlocks && ((_a2 = node.emitNode) == null ? void 0 : _a2.classThis)) { return getClassLexicalEnvironment().classConstructor = node.emitNode.classThis; } const temp2 = factory2.createTempVariable( requiresBlockScopedVar ? addBlockScopedVariable : hoistVariableDeclaration, /*reservedInNestedScopes*/ true ); getClassLexicalEnvironment().classConstructor = factory2.cloneNode(temp2); return temp2; } if ((_a = node.emitNode) == null ? void 0 : _a.classThis) { getClassLexicalEnvironment().classThis = node.emitNode.classThis; } if (facts & 2 /* NeedsClassConstructorReference */) { temp ?? (temp = createClassTempVar()); } const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier); const heritageClauses = visitNodes2(node.heritageClauses, heritageClauseVisitor, isHeritageClause); const { members, prologue } = transformClassMembers(node); const classExpression = factory2.updateClassExpression( node, modifiers, node.name, /*typeParameters*/ void 0, heritageClauses, members ); const expressions = []; if (prologue) { expressions.push(prologue); } const hasTransformableStatics = (shouldTransformPrivateElementsOrClassStaticBlocks || getInternalEmitFlags(node) & 32 /* TransformPrivateStaticElements */) && some(staticPropertiesOrClassStaticBlocks, (node2) => isClassStaticBlockDeclaration(node2) || isPrivateIdentifierClassElementDeclaration(node2) || shouldTransformInitializers && isInitializedProperty(node2)); if (hasTransformableStatics || some(pendingExpressions)) { if (isDecoratedClassDeclaration) { Debug.assertIsDefined(pendingStatements, "Decorated classes transformed by TypeScript are expected to be within a variable declaration."); if (some(pendingExpressions)) { addRange(pendingStatements, map(pendingExpressions, factory2.createExpressionStatement)); } if (some(staticPropertiesOrClassStaticBlocks)) { addPropertyOrClassStaticBlockStatements(pendingStatements, staticPropertiesOrClassStaticBlocks, ((_b = node.emitNode) == null ? void 0 : _b.classThis) ?? factory2.getInternalName(node)); } if (temp) { expressions.push(factory2.createAssignment(temp, classExpression)); } else if (shouldTransformPrivateElementsOrClassStaticBlocks && ((_c = node.emitNode) == null ? void 0 : _c.classThis)) { expressions.push(factory2.createAssignment(node.emitNode.classThis, classExpression)); } else { expressions.push(classExpression); } } else { temp ?? (temp = createClassTempVar()); if (isClassWithConstructorReference) { enableSubstitutionForClassAliases(); const alias = factory2.cloneNode(temp); alias.emitNode.autoGenerate.flags &= ~8 /* ReservedInNestedScopes */; classAliases[getOriginalNodeId(node)] = alias; } expressions.push(factory2.createAssignment(temp, classExpression)); addRange(expressions, pendingExpressions); addRange(expressions, generateInitializedPropertyExpressionsOrClassStaticBlock(staticPropertiesOrClassStaticBlocks, temp)); expressions.push(factory2.cloneNode(temp)); } } else { expressions.push(classExpression); } if (expressions.length > 1) { addEmitFlags(classExpression, 131072 /* Indented */); expressions.forEach(startOnNewLine); } return factory2.inlineExpressions(expressions); } function visitClassStaticBlockDeclaration(node) { if (!shouldTransformPrivateElementsOrClassStaticBlocks) { return visitEachChild(node, visitor, context); } return void 0; } function visitThisExpression(node) { if (shouldTransformThisInStaticInitializers && currentClassElement && isClassStaticBlockDeclaration(currentClassElement) && (lexicalEnvironment == null ? void 0 : lexicalEnvironment.data)) { const { classThis, classConstructor } = lexicalEnvironment.data; return classThis ?? classConstructor ?? node; } return node; } function transformClassMembers(node) { const shouldTransformPrivateStaticElementsInClass = !!(getInternalEmitFlags(node) & 32 /* TransformPrivateStaticElements */); if (shouldTransformPrivateElementsOrClassStaticBlocks || shouldTransformPrivateStaticElementsInFile) { for (const member of node.members) { if (isPrivateIdentifierClassElementDeclaration(member)) { if (shouldTransformClassElementToWeakMap(member)) { addPrivateIdentifierToEnvironment(member, member.name, addPrivateIdentifierClassElementToEnvironment); } else { const privateEnv = getPrivateIdentifierEnvironment(); setPrivateIdentifier(privateEnv, member.name, { kind: "untransformed" }); } } } if (shouldTransformPrivateElementsOrClassStaticBlocks) { if (some(getPrivateInstanceMethodsAndAccessors(node))) { createBrandCheckWeakSetForPrivateMethods(); } } if (shouldTransformAutoAccessorsInCurrentClass()) { for (const member of node.members) { if (isAutoAccessorPropertyDeclaration(member)) { const storageName = factory2.getGeneratedPrivateNameForNode( member.name, /*prefix*/ void 0, "_accessor_storage" ); if (shouldTransformPrivateElementsOrClassStaticBlocks || shouldTransformPrivateStaticElementsInClass && hasStaticModifier(member)) { addPrivateIdentifierToEnvironment(member, storageName, addPrivateIdentifierPropertyDeclarationToEnvironment); } else { const privateEnv = getPrivateIdentifierEnvironment(); setPrivateIdentifier(privateEnv, storageName, { kind: "untransformed" }); } } } } } let members = visitNodes2(node.members, classElementVisitor, isClassElement); let syntheticConstructor; if (!some(members, isConstructorDeclaration)) { syntheticConstructor = transformConstructor( /*constructor*/ void 0, node ); } let prologue; let syntheticStaticBlock; if (!shouldTransformPrivateElementsOrClassStaticBlocks && some(pendingExpressions)) { let statement = factory2.createExpressionStatement(factory2.inlineExpressions(pendingExpressions)); if (statement.transformFlags & 134234112 /* ContainsLexicalThisOrSuper */) { const temp = factory2.createTempVariable(hoistVariableDeclaration); const arrow = factory2.createArrowFunction( /*modifiers*/ void 0, /*typeParameters*/ void 0, /*parameters*/ [], /*type*/ void 0, /*equalsGreaterThanToken*/ void 0, factory2.createBlock([statement]) ); prologue = factory2.createAssignment(temp, arrow); statement = factory2.createExpressionStatement(factory2.createCallExpression( temp, /*typeArguments*/ void 0, [] )); } const block = factory2.createBlock([statement]); syntheticStaticBlock = factory2.createClassStaticBlockDeclaration(block); pendingExpressions = void 0; } if (syntheticConstructor || syntheticStaticBlock) { let membersArray; const classThisAssignmentBlock = find(members, isClassThisAssignmentBlock); const classNamedEvaluationHelperBlock = find(members, isClassNamedEvaluationHelperBlock); membersArray = append(membersArray, classThisAssignmentBlock); membersArray = append(membersArray, classNamedEvaluationHelperBlock); membersArray = append(membersArray, syntheticConstructor); membersArray = append(membersArray, syntheticStaticBlock); const remainingMembers = classThisAssignmentBlock || classNamedEvaluationHelperBlock ? filter(members, (member) => member !== classThisAssignmentBlock && member !== classNamedEvaluationHelperBlock) : members; membersArray = addRange(membersArray, remainingMembers); members = setTextRange( factory2.createNodeArray(membersArray), /*location*/ node.members ); } return { members, prologue }; } function createBrandCheckWeakSetForPrivateMethods() { const { weakSetName } = getPrivateIdentifierEnvironment().data; Debug.assert(weakSetName, "weakSetName should be set in private identifier environment"); getPendingExpressions().push( factory2.createAssignment( weakSetName, factory2.createNewExpression( factory2.createIdentifier("WeakSet"), /*typeArguments*/ void 0, [] ) ) ); } function transformConstructor(constructor, container) { constructor = visitNode(constructor, visitor, isConstructorDeclaration); if (!(lexicalEnvironment == null ? void 0 : lexicalEnvironment.data) || !(lexicalEnvironment.data.facts & 16 /* WillHoistInitializersToConstructor */)) { return constructor; } const extendsClauseElement = getEffectiveBaseTypeNode(container); const isDerivedClass = !!(extendsClauseElement && skipOuterExpressions(extendsClauseElement.expression).kind !== 106 /* NullKeyword */); const parameters = visitParameterList(constructor ? constructor.parameters : void 0, visitor, context); const body = transformConstructorBody(container, constructor, isDerivedClass); if (!body) { return constructor; } if (constructor) { Debug.assert(parameters); return factory2.updateConstructorDeclaration( constructor, /*modifiers*/ void 0, parameters, body ); } return startOnNewLine( setOriginalNode( setTextRange( factory2.createConstructorDeclaration( /*modifiers*/ void 0, parameters ?? [], body ), constructor || container ), constructor ) ); } function transformConstructorBodyWorker(statementsOut, statementsIn, statementOffset, superPath, superPathDepth, initializerStatements, constructor) { const superStatementIndex = superPath[superPathDepth]; const superStatement = statementsIn[superStatementIndex]; addRange(statementsOut, visitNodes2(statementsIn, visitor, isStatement, statementOffset, superStatementIndex - statementOffset)); statementOffset = superStatementIndex + 1; if (isTryStatement(superStatement)) { const tryBlockStatements = []; transformConstructorBodyWorker( tryBlockStatements, superStatement.tryBlock.statements, /*statementOffset*/ 0, superPath, superPathDepth + 1, initializerStatements, constructor ); const tryBlockStatementsArray = factory2.createNodeArray(tryBlockStatements); setTextRange(tryBlockStatementsArray, superStatement.tryBlock.statements); statementsOut.push(factory2.updateTryStatement( superStatement, factory2.updateBlock(superStatement.tryBlock, tryBlockStatements), visitNode(superStatement.catchClause, visitor, isCatchClause), visitNode(superStatement.finallyBlock, visitor, isBlock) )); } else { addRange(statementsOut, visitNodes2(statementsIn, visitor, isStatement, superStatementIndex, 1)); while (statementOffset < statementsIn.length) { const statement = statementsIn[statementOffset]; if (isParameterPropertyDeclaration(getOriginalNode(statement), constructor)) { statementOffset++; } else { break; } } addRange(statementsOut, initializerStatements); } addRange(statementsOut, visitNodes2(statementsIn, visitor, isStatement, statementOffset)); } function transformConstructorBody(node, constructor, isDerivedClass) { var _a; const instanceProperties = getProperties( node, /*requireInitializer*/ false, /*isStatic*/ false ); let properties = instanceProperties; if (!useDefineForClassFields) { properties = filter(properties, (property) => !!property.initializer || isPrivateIdentifier(property.name) || hasAccessorModifier(property)); } const privateMethodsAndAccessors = getPrivateInstanceMethodsAndAccessors(node); const needsConstructorBody = some(properties) || some(privateMethodsAndAccessors); if (!constructor && !needsConstructorBody) { return visitFunctionBody( /*node*/ void 0, visitor, context ); } resumeLexicalEnvironment(); const needsSyntheticConstructor = !constructor && isDerivedClass; let statementOffset = 0; let statements = []; const initializerStatements = []; const receiver = factory2.createThis(); addInstanceMethodStatements(initializerStatements, privateMethodsAndAccessors, receiver); if (constructor) { const parameterProperties = filter(instanceProperties, (prop) => isParameterPropertyDeclaration(getOriginalNode(prop), constructor)); const nonParameterProperties = filter(properties, (prop) => !isParameterPropertyDeclaration(getOriginalNode(prop), constructor)); addPropertyOrClassStaticBlockStatements(initializerStatements, parameterProperties, receiver); addPropertyOrClassStaticBlockStatements(initializerStatements, nonParameterProperties, receiver); } else { addPropertyOrClassStaticBlockStatements(initializerStatements, properties, receiver); } if (constructor == null ? void 0 : constructor.body) { statementOffset = factory2.copyPrologue( constructor.body.statements, statements, /*ensureUseStrict*/ false, visitor ); const superStatementIndices = findSuperStatementIndexPath(constructor.body.statements, statementOffset); if (superStatementIndices.length) { transformConstructorBodyWorker( statements, constructor.body.statements, statementOffset, superStatementIndices, /*superPathDepth*/ 0, initializerStatements, constructor ); } else { while (statementOffset < constructor.body.statements.length) { const statement = constructor.body.statements[statementOffset]; if (isParameterPropertyDeclaration(getOriginalNode(statement), constructor)) { statementOffset++; } else { break; } } addRange(statements, initializerStatements); addRange(statements, visitNodes2(constructor.body.statements, visitor, isStatement, statementOffset)); } } else { if (needsSyntheticConstructor) { statements.push( factory2.createExpressionStatement( factory2.createCallExpression( factory2.createSuper(), /*typeArguments*/ void 0, [factory2.createSpreadElement(factory2.createIdentifier("arguments"))] ) ) ); } addRange(statements, initializerStatements); } statements = factory2.mergeLexicalEnvironment(statements, endLexicalEnvironment()); if (statements.length === 0 && !constructor) { return void 0; } const multiLine = (constructor == null ? void 0 : constructor.body) && constructor.body.statements.length >= statements.length ? constructor.body.multiLine ?? statements.length > 0 : statements.length > 0; return setTextRange( factory2.createBlock( setTextRange( factory2.createNodeArray(statements), /*location*/ ((_a = constructor == null ? void 0 : constructor.body) == null ? void 0 : _a.statements) ?? node.members ), multiLine ), /*location*/ constructor == null ? void 0 : constructor.body ); } function addPropertyOrClassStaticBlockStatements(statements, properties, receiver) { for (const property of properties) { if (isStatic(property) && !shouldTransformPrivateElementsOrClassStaticBlocks) { continue; } const statement = transformPropertyOrClassStaticBlock(property, receiver); if (!statement) { continue; } statements.push(statement); } } function transformPropertyOrClassStaticBlock(property, receiver) { const expression = isClassStaticBlockDeclaration(property) ? setCurrentClassElementAnd(property, transformClassStaticBlockDeclaration, property) : transformProperty(property, receiver); if (!expression) { return void 0; } const statement = factory2.createExpressionStatement(expression); setOriginalNode(statement, property); addEmitFlags(statement, getEmitFlags(property) & 3072 /* NoComments */); setCommentRange(statement, property); const propertyOriginalNode = getOriginalNode(property); if (isParameter(propertyOriginalNode)) { setSourceMapRange(statement, propertyOriginalNode); removeAllComments(statement); } else { setSourceMapRange(statement, moveRangePastModifiers(property)); } setSyntheticLeadingComments(expression, void 0); setSyntheticTrailingComments(expression, void 0); if (hasAccessorModifier(propertyOriginalNode)) { addEmitFlags(statement, 3072 /* NoComments */); } return statement; } function generateInitializedPropertyExpressionsOrClassStaticBlock(propertiesOrClassStaticBlocks, receiver) { const expressions = []; for (const property of propertiesOrClassStaticBlocks) { const expression = isClassStaticBlockDeclaration(property) ? setCurrentClassElementAnd(property, transformClassStaticBlockDeclaration, property) : setCurrentClassElementAnd( property, () => transformProperty(property, receiver), /*arg*/ void 0 ); if (!expression) { continue; } startOnNewLine(expression); setOriginalNode(expression, property); addEmitFlags(expression, getEmitFlags(property) & 3072 /* NoComments */); setSourceMapRange(expression, moveRangePastModifiers(property)); setCommentRange(expression, property); expressions.push(expression); } return expressions; } function transformProperty(property, receiver) { var _a; const savedCurrentClassElement = currentClassElement; const transformed = transformPropertyWorker(property, receiver); if (transformed && hasStaticModifier(property) && ((_a = lexicalEnvironment == null ? void 0 : lexicalEnvironment.data) == null ? void 0 : _a.facts)) { setOriginalNode(transformed, property); addEmitFlags(transformed, 4 /* AdviseOnEmitNode */); setSourceMapRange(transformed, getSourceMapRange(property.name)); lexicalEnvironmentMap.set(getOriginalNode(property), lexicalEnvironment); } currentClassElement = savedCurrentClassElement; return transformed; } function transformPropertyWorker(property, receiver) { const emitAssignment = !useDefineForClassFields; if (isNamedEvaluation(property, isAnonymousClassNeedingAssignedName)) { property = transformNamedEvaluation(context, property); } const propertyName = hasAccessorModifier(property) ? factory2.getGeneratedPrivateNameForNode(property.name) : isComputedPropertyName(property.name) && !isSimpleInlineableExpression(property.name.expression) ? factory2.updateComputedPropertyName(property.name, factory2.getGeneratedNameForNode(property.name)) : property.name; if (hasStaticModifier(property)) { currentClassElement = property; } if (isPrivateIdentifier(propertyName) && shouldTransformClassElementToWeakMap(property)) { const privateIdentifierInfo = accessPrivateIdentifier2(propertyName); if (privateIdentifierInfo) { if (privateIdentifierInfo.kind === "f" /* Field */) { if (!privateIdentifierInfo.isStatic) { return createPrivateInstanceFieldInitializer( factory2, receiver, visitNode(property.initializer, visitor, isExpression), privateIdentifierInfo.brandCheckIdentifier ); } else { return createPrivateStaticFieldInitializer( factory2, privateIdentifierInfo.variableName, visitNode(property.initializer, visitor, isExpression) ); } } else { return void 0; } } else { Debug.fail("Undeclared private name for property declaration."); } } if ((isPrivateIdentifier(propertyName) || hasStaticModifier(property)) && !property.initializer) { return void 0; } const propertyOriginalNode = getOriginalNode(property); if (hasSyntacticModifier(propertyOriginalNode, 64 /* Abstract */)) { return void 0; } let initializer = visitNode(property.initializer, visitor, isExpression); if (isParameterPropertyDeclaration(propertyOriginalNode, propertyOriginalNode.parent) && isIdentifier(propertyName)) { const localName = factory2.cloneNode(propertyName); if (initializer) { if (isParenthesizedExpression(initializer) && isCommaExpression(initializer.expression) && isCallToHelper(initializer.expression.left, "___runInitializers") && isVoidExpression(initializer.expression.right) && isNumericLiteral(initializer.expression.right.expression)) { initializer = initializer.expression.left; } initializer = factory2.inlineExpressions([initializer, localName]); } else { initializer = localName; } setEmitFlags(propertyName, 3072 /* NoComments */ | 96 /* NoSourceMap */); setSourceMapRange(localName, propertyOriginalNode.name); setEmitFlags(localName, 3072 /* NoComments */); } else { initializer ?? (initializer = factory2.createVoidZero()); } if (emitAssignment || isPrivateIdentifier(propertyName)) { const memberAccess = createMemberAccessForPropertyName( factory2, receiver, propertyName, /*location*/ propertyName ); addEmitFlags(memberAccess, 1024 /* NoLeadingComments */); const expression = factory2.createAssignment(memberAccess, initializer); return expression; } else { const name = isComputedPropertyName(propertyName) ? propertyName.expression : isIdentifier(propertyName) ? factory2.createStringLiteral(unescapeLeadingUnderscores(propertyName.escapedText)) : propertyName; const descriptor = factory2.createPropertyDescriptor({ value: initializer, configurable: true, writable: true, enumerable: true }); return factory2.createObjectDefinePropertyCall(receiver, name, descriptor); } } function enableSubstitutionForClassAliases() { if ((enabledSubstitutions & 1 /* ClassAliases */) === 0) { enabledSubstitutions |= 1 /* ClassAliases */; context.enableSubstitution(80 /* Identifier */); classAliases = []; } } function enableSubstitutionForClassStaticThisOrSuperReference() { if ((enabledSubstitutions & 2 /* ClassStaticThisOrSuperReference */) === 0) { enabledSubstitutions |= 2 /* ClassStaticThisOrSuperReference */; context.enableSubstitution(110 /* ThisKeyword */); context.enableEmitNotification(263 /* FunctionDeclaration */); context.enableEmitNotification(219 /* FunctionExpression */); context.enableEmitNotification(177 /* Constructor */); context.enableEmitNotification(178 /* GetAccessor */); context.enableEmitNotification(179 /* SetAccessor */); context.enableEmitNotification(175 /* MethodDeclaration */); context.enableEmitNotification(173 /* PropertyDeclaration */); context.enableEmitNotification(168 /* ComputedPropertyName */); } } function addInstanceMethodStatements(statements, methods, receiver) { if (!shouldTransformPrivateElementsOrClassStaticBlocks || !some(methods)) { return; } const { weakSetName } = getPrivateIdentifierEnvironment().data; Debug.assert(weakSetName, "weakSetName should be set in private identifier environment"); statements.push( factory2.createExpressionStatement( createPrivateInstanceMethodInitializer(factory2, receiver, weakSetName) ) ); } function visitInvalidSuperProperty(node) { return isPropertyAccessExpression(node) ? factory2.updatePropertyAccessExpression( node, factory2.createVoidZero(), node.name ) : factory2.updateElementAccessExpression( node, factory2.createVoidZero(), visitNode(node.argumentExpression, visitor, isExpression) ); } function getPropertyNameExpressionIfNeeded(name, shouldHoist) { if (isComputedPropertyName(name)) { const cacheAssignment = findComputedPropertyNameCacheAssignment(name); const expression = visitNode(name.expression, visitor, isExpression); const innerExpression = skipPartiallyEmittedExpressions(expression); const inlinable = isSimpleInlineableExpression(innerExpression); const alreadyTransformed = !!cacheAssignment || isAssignmentExpression(innerExpression) && isGeneratedIdentifier(innerExpression.left); if (!alreadyTransformed && !inlinable && shouldHoist) { const generatedName = factory2.getGeneratedNameForNode(name); if (resolver.hasNodeCheckFlag(name, 32768 /* BlockScopedBindingInLoop */)) { addBlockScopedVariable(generatedName); } else { hoistVariableDeclaration(generatedName); } return factory2.createAssignment(generatedName, expression); } return inlinable || isIdentifier(innerExpression) ? void 0 : expression; } } function startClassLexicalEnvironment() { lexicalEnvironment = { previous: lexicalEnvironment, data: void 0 }; } function endClassLexicalEnvironment() { lexicalEnvironment = lexicalEnvironment == null ? void 0 : lexicalEnvironment.previous; } function getClassLexicalEnvironment() { Debug.assert(lexicalEnvironment); return lexicalEnvironment.data ?? (lexicalEnvironment.data = { facts: 0 /* None */, classConstructor: void 0, classThis: void 0, superClassReference: void 0 // privateIdentifierEnvironment: undefined, }); } function getPrivateIdentifierEnvironment() { Debug.assert(lexicalEnvironment); return lexicalEnvironment.privateEnv ?? (lexicalEnvironment.privateEnv = newPrivateEnvironment({ className: void 0, weakSetName: void 0 })); } function getPendingExpressions() { return pendingExpressions ?? (pendingExpressions = []); } function addPrivateIdentifierClassElementToEnvironment(node, name, lex, privateEnv, isStatic2, isValid, previousInfo) { if (isAutoAccessorPropertyDeclaration(node)) { addPrivateIdentifierAutoAccessorPropertyDeclarationToEnvironment(node, name, lex, privateEnv, isStatic2, isValid, previousInfo); } else if (isPropertyDeclaration(node)) { addPrivateIdentifierPropertyDeclarationToEnvironment(node, name, lex, privateEnv, isStatic2, isValid, previousInfo); } else if (isMethodDeclaration(node)) { addPrivateIdentifierMethodDeclarationToEnvironment(node, name, lex, privateEnv, isStatic2, isValid, previousInfo); } else if (isGetAccessorDeclaration(node)) { addPrivateIdentifierGetAccessorDeclarationToEnvironment(node, name, lex, privateEnv, isStatic2, isValid, previousInfo); } else if (isSetAccessorDeclaration(node)) { addPrivateIdentifierSetAccessorDeclarationToEnvironment(node, name, lex, privateEnv, isStatic2, isValid, previousInfo); } } function addPrivateIdentifierPropertyDeclarationToEnvironment(_node, name, lex, privateEnv, isStatic2, isValid, _previousInfo) { if (isStatic2) { const brandCheckIdentifier = Debug.checkDefined(lex.classThis ?? lex.classConstructor, "classConstructor should be set in private identifier environment"); const variableName = createHoistedVariableForPrivateName(name); setPrivateIdentifier(privateEnv, name, { kind: "f" /* Field */, isStatic: true, brandCheckIdentifier, variableName, isValid }); } else { const weakMapName = createHoistedVariableForPrivateName(name); setPrivateIdentifier(privateEnv, name, { kind: "f" /* Field */, isStatic: false, brandCheckIdentifier: weakMapName, isValid }); getPendingExpressions().push(factory2.createAssignment( weakMapName, factory2.createNewExpression( factory2.createIdentifier("WeakMap"), /*typeArguments*/ void 0, [] ) )); } } function addPrivateIdentifierMethodDeclarationToEnvironment(_node, name, lex, privateEnv, isStatic2, isValid, _previousInfo) { const methodName = createHoistedVariableForPrivateName(name); const brandCheckIdentifier = isStatic2 ? Debug.checkDefined(lex.classThis ?? lex.classConstructor, "classConstructor should be set in private identifier environment") : Debug.checkDefined(privateEnv.data.weakSetName, "weakSetName should be set in private identifier environment"); setPrivateIdentifier(privateEnv, name, { kind: "m" /* Method */, methodName, brandCheckIdentifier, isStatic: isStatic2, isValid }); } function addPrivateIdentifierGetAccessorDeclarationToEnvironment(_node, name, lex, privateEnv, isStatic2, isValid, previousInfo) { const getterName = createHoistedVariableForPrivateName(name, "_get"); const brandCheckIdentifier = isStatic2 ? Debug.checkDefined(lex.classThis ?? lex.classConstructor, "classConstructor should be set in private identifier environment") : Debug.checkDefined(privateEnv.data.weakSetName, "weakSetName should be set in private identifier environment"); if ((previousInfo == null ? void 0 : previousInfo.kind) === "a" /* Accessor */ && previousInfo.isStatic === isStatic2 && !previousInfo.getterName) { previousInfo.getterName = getterName; } else { setPrivateIdentifier(privateEnv, name, { kind: "a" /* Accessor */, getterName, setterName: void 0, brandCheckIdentifier, isStatic: isStatic2, isValid }); } } function addPrivateIdentifierSetAccessorDeclarationToEnvironment(_node, name, lex, privateEnv, isStatic2, isValid, previousInfo) { const setterName = createHoistedVariableForPrivateName(name, "_set"); const brandCheckIdentifier = isStatic2 ? Debug.checkDefined(lex.classThis ?? lex.classConstructor, "classConstructor should be set in private identifier environment") : Debug.checkDefined(privateEnv.data.weakSetName, "weakSetName should be set in private identifier environment"); if ((previousInfo == null ? void 0 : previousInfo.kind) === "a" /* Accessor */ && previousInfo.isStatic === isStatic2 && !previousInfo.setterName) { previousInfo.setterName = setterName; } else { setPrivateIdentifier(privateEnv, name, { kind: "a" /* Accessor */, getterName: void 0, setterName, brandCheckIdentifier, isStatic: isStatic2, isValid }); } } function addPrivateIdentifierAutoAccessorPropertyDeclarationToEnvironment(_node, name, lex, privateEnv, isStatic2, isValid, _previousInfo) { const getterName = createHoistedVariableForPrivateName(name, "_get"); const setterName = createHoistedVariableForPrivateName(name, "_set"); const brandCheckIdentifier = isStatic2 ? Debug.checkDefined(lex.classThis ?? lex.classConstructor, "classConstructor should be set in private identifier environment") : Debug.checkDefined(privateEnv.data.weakSetName, "weakSetName should be set in private identifier environment"); setPrivateIdentifier(privateEnv, name, { kind: "a" /* Accessor */, getterName, setterName, brandCheckIdentifier, isStatic: isStatic2, isValid }); } function addPrivateIdentifierToEnvironment(node, name, addDeclaration) { const lex = getClassLexicalEnvironment(); const privateEnv = getPrivateIdentifierEnvironment(); const previousInfo = getPrivateIdentifier(privateEnv, name); const isStatic2 = hasStaticModifier(node); const isValid = !isReservedPrivateName(name) && previousInfo === void 0; addDeclaration(node, name, lex, privateEnv, isStatic2, isValid, previousInfo); } function createHoistedVariableForClass(name, node, suffix) { const { className } = getPrivateIdentifierEnvironment().data; const prefix = className ? { prefix: "_", node: className, suffix: "_" } : "_"; const identifier = typeof name === "object" ? factory2.getGeneratedNameForNode(name, 16 /* Optimistic */ | 8 /* ReservedInNestedScopes */, prefix, suffix) : typeof name === "string" ? factory2.createUniqueName(name, 16 /* Optimistic */, prefix, suffix) : factory2.createTempVariable( /*recordTempVariable*/ void 0, /*reservedInNestedScopes*/ true, prefix, suffix ); if (resolver.hasNodeCheckFlag(node, 32768 /* BlockScopedBindingInLoop */)) { addBlockScopedVariable(identifier); } else { hoistVariableDeclaration(identifier); } return identifier; } function createHoistedVariableForPrivateName(name, suffix) { const text = tryGetTextOfPropertyName(name); return createHoistedVariableForClass((text == null ? void 0 : text.substring(1)) ?? name, name, suffix); } function accessPrivateIdentifier2(name) { const info = accessPrivateIdentifier(lexicalEnvironment, name); return (info == null ? void 0 : info.kind) === "untransformed" ? void 0 : info; } function wrapPrivateIdentifierForDestructuringTarget(node) { const parameter = factory2.getGeneratedNameForNode(node); const info = accessPrivateIdentifier2(node.name); if (!info) { return visitEachChild(node, visitor, context); } let receiver = node.expression; if (isThisProperty(node) || isSuperProperty(node) || !isSimpleCopiableExpression(node.expression)) { receiver = factory2.createTempVariable( hoistVariableDeclaration, /*reservedInNestedScopes*/ true ); getPendingExpressions().push(factory2.createBinaryExpression(receiver, 64 /* EqualsToken */, visitNode(node.expression, visitor, isExpression))); } return factory2.createAssignmentTargetWrapper( parameter, createPrivateIdentifierAssignment( info, receiver, parameter, 64 /* EqualsToken */ ) ); } function visitDestructuringAssignmentTarget(node) { if (isObjectLiteralExpression(node) || isArrayLiteralExpression(node)) { return visitAssignmentPattern(node); } if (isPrivateIdentifierPropertyAccessExpression(node)) { return wrapPrivateIdentifierForDestructuringTarget(node); } else if (shouldTransformSuperInStaticInitializers && currentClassElement && isSuperProperty(node) && isStaticPropertyDeclarationOrClassStaticBlock(currentClassElement) && (lexicalEnvironment == null ? void 0 : lexicalEnvironment.data)) { const { classConstructor, superClassReference, facts } = lexicalEnvironment.data; if (facts & 1 /* ClassWasDecorated */) { return visitInvalidSuperProperty(node); } else if (classConstructor && superClassReference) { const name = isElementAccessExpression(node) ? visitNode(node.argumentExpression, visitor, isExpression) : isIdentifier(node.name) ? factory2.createStringLiteralFromNode(node.name) : void 0; if (name) { const temp = factory2.createTempVariable( /*recordTempVariable*/ void 0 ); return factory2.createAssignmentTargetWrapper( temp, factory2.createReflectSetCall( superClassReference, name, temp, classConstructor ) ); } } } return visitEachChild(node, visitor, context); } function visitAssignmentElement(node) { if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) { node = transformNamedEvaluation(context, node); } if (isAssignmentExpression( node, /*excludeCompoundAssignment*/ true )) { const left = visitDestructuringAssignmentTarget(node.left); const right = visitNode(node.right, visitor, isExpression); return factory2.updateBinaryExpression(node, left, node.operatorToken, right); } return visitDestructuringAssignmentTarget(node); } function visitAssignmentRestElement(node) { if (isLeftHandSideExpression(node.expression)) { const expression = visitDestructuringAssignmentTarget(node.expression); return factory2.updateSpreadElement(node, expression); } return visitEachChild(node, visitor, context); } function visitArrayAssignmentElement(node) { if (isArrayBindingOrAssignmentElement(node)) { if (isSpreadElement(node)) return visitAssignmentRestElement(node); if (!isOmittedExpression(node)) return visitAssignmentElement(node); } return visitEachChild(node, visitor, context); } function visitAssignmentProperty(node) { const name = visitNode(node.name, visitor, isPropertyName); if (isAssignmentExpression( node.initializer, /*excludeCompoundAssignment*/ true )) { const assignmentElement = visitAssignmentElement(node.initializer); return factory2.updatePropertyAssignment(node, name, assignmentElement); } if (isLeftHandSideExpression(node.initializer)) { const assignmentElement = visitDestructuringAssignmentTarget(node.initializer); return factory2.updatePropertyAssignment(node, name, assignmentElement); } return visitEachChild(node, visitor, context); } function visitShorthandAssignmentProperty(node) { if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) { node = transformNamedEvaluation(context, node); } return visitEachChild(node, visitor, context); } function visitAssignmentRestProperty(node) { if (isLeftHandSideExpression(node.expression)) { const expression = visitDestructuringAssignmentTarget(node.expression); return factory2.updateSpreadAssignment(node, expression); } return visitEachChild(node, visitor, context); } function visitObjectAssignmentElement(node) { Debug.assertNode(node, isObjectBindingOrAssignmentElement); if (isSpreadAssignment(node)) return visitAssignmentRestProperty(node); if (isShorthandPropertyAssignment(node)) return visitShorthandAssignmentProperty(node); if (isPropertyAssignment(node)) return visitAssignmentProperty(node); return visitEachChild(node, visitor, context); } function visitAssignmentPattern(node) { if (isArrayLiteralExpression(node)) { return factory2.updateArrayLiteralExpression( node, visitNodes2(node.elements, visitArrayAssignmentElement, isExpression) ); } else { return factory2.updateObjectLiteralExpression( node, visitNodes2(node.properties, visitObjectAssignmentElement, isObjectLiteralElementLike) ); } } function onEmitNode(hint, node, emitCallback) { const original = getOriginalNode(node); const lex = lexicalEnvironmentMap.get(original); if (lex) { const savedLexicalEnvironment = lexicalEnvironment; const savedPreviousShouldSubstituteThisWithClassThis = previousShouldSubstituteThisWithClassThis; lexicalEnvironment = lex; previousShouldSubstituteThisWithClassThis = shouldSubstituteThisWithClassThis; shouldSubstituteThisWithClassThis = !isClassStaticBlockDeclaration(original) || !(getInternalEmitFlags(original) & 32 /* TransformPrivateStaticElements */); previousOnEmitNode(hint, node, emitCallback); shouldSubstituteThisWithClassThis = previousShouldSubstituteThisWithClassThis; previousShouldSubstituteThisWithClassThis = savedPreviousShouldSubstituteThisWithClassThis; lexicalEnvironment = savedLexicalEnvironment; return; } switch (node.kind) { case 219 /* FunctionExpression */: if (isArrowFunction(original) || getEmitFlags(node) & 524288 /* AsyncFunctionBody */) { break; } // falls through case 263 /* FunctionDeclaration */: case 177 /* Constructor */: case 178 /* GetAccessor */: case 179 /* SetAccessor */: case 175 /* MethodDeclaration */: case 173 /* PropertyDeclaration */: { const savedLexicalEnvironment = lexicalEnvironment; const savedPreviousShouldSubstituteThisWithClassThis = previousShouldSubstituteThisWithClassThis; lexicalEnvironment = void 0; previousShouldSubstituteThisWithClassThis = shouldSubstituteThisWithClassThis; shouldSubstituteThisWithClassThis = false; previousOnEmitNode(hint, node, emitCallback); shouldSubstituteThisWithClassThis = previousShouldSubstituteThisWithClassThis; previousShouldSubstituteThisWithClassThis = savedPreviousShouldSubstituteThisWithClassThis; lexicalEnvironment = savedLexicalEnvironment; return; } case 168 /* ComputedPropertyName */: { const savedLexicalEnvironment = lexicalEnvironment; const savedShouldSubstituteThisWithClassThis = shouldSubstituteThisWithClassThis; lexicalEnvironment = lexicalEnvironment == null ? void 0 : lexicalEnvironment.previous; shouldSubstituteThisWithClassThis = previousShouldSubstituteThisWithClassThis; previousOnEmitNode(hint, node, emitCallback); shouldSubstituteThisWithClassThis = savedShouldSubstituteThisWithClassThis; lexicalEnvironment = savedLexicalEnvironment; return; } } previousOnEmitNode(hint, node, emitCallback); } function onSubstituteNode(hint, node) { node = previousOnSubstituteNode(hint, node); if (hint === 1 /* Expression */) { return substituteExpression(node); } return node; } function substituteExpression(node) { switch (node.kind) { case 80 /* Identifier */: return substituteExpressionIdentifier(node); case 110 /* ThisKeyword */: return substituteThisExpression(node); } return node; } function substituteThisExpression(node) { if (enabledSubstitutions & 2 /* ClassStaticThisOrSuperReference */ && (lexicalEnvironment == null ? void 0 : lexicalEnvironment.data) && !noSubstitution.has(node)) { const { facts, classConstructor, classThis } = lexicalEnvironment.data; const substituteThis = shouldSubstituteThisWithClassThis ? classThis ?? classConstructor : classConstructor; if (substituteThis) { return setTextRange( setOriginalNode( factory2.cloneNode(substituteThis), node ), node ); } if (facts & 1 /* ClassWasDecorated */ && legacyDecorators) { return factory2.createParenthesizedExpression(factory2.createVoidZero()); } } return node; } function substituteExpressionIdentifier(node) { return trySubstituteClassAlias(node) || node; } function trySubstituteClassAlias(node) { if (enabledSubstitutions & 1 /* ClassAliases */) { if (resolver.hasNodeCheckFlag(node, 536870912 /* ConstructorReference */)) { const declaration = resolver.getReferencedValueDeclaration(node); if (declaration) { const classAlias = classAliases[declaration.id]; if (classAlias) { const clone = factory2.cloneNode(classAlias); setSourceMapRange(clone, node); setCommentRange(clone, node); return clone; } } } } return void 0; } } function createPrivateStaticFieldInitializer(factory2, variableName, initializer) { return factory2.createAssignment( variableName, factory2.createObjectLiteralExpression([ factory2.createPropertyAssignment("value", initializer || factory2.createVoidZero()) ]) ); } function createPrivateInstanceFieldInitializer(factory2, receiver, initializer, weakMapName) { return factory2.createCallExpression( factory2.createPropertyAccessExpression(weakMapName, "set"), /*typeArguments*/ void 0, [receiver, initializer || factory2.createVoidZero()] ); } function createPrivateInstanceMethodInitializer(factory2, receiver, weakSetName) { return factory2.createCallExpression( factory2.createPropertyAccessExpression(weakSetName, "add"), /*typeArguments*/ void 0, [receiver] ); } function isReservedPrivateName(node) { return !isGeneratedPrivateIdentifier(node) && node.escapedText === "#constructor"; } function isPrivateIdentifierInExpression(node) { return isPrivateIdentifier(node.left) && node.operatorToken.kind === 103 /* InKeyword */; } function isStaticPropertyDeclaration2(node) { return isPropertyDeclaration(node) && hasStaticModifier(node); } function isStaticPropertyDeclarationOrClassStaticBlock(node) { return isClassStaticBlockDeclaration(node) || isStaticPropertyDeclaration2(node); } // src/compiler/transformers/typeSerializer.ts function createRuntimeTypeSerializer(context) { const { factory: factory2, hoistVariableDeclaration } = context; const resolver = context.getEmitResolver(); const compilerOptions = context.getCompilerOptions(); const languageVersion = getEmitScriptTarget(compilerOptions); const strictNullChecks = getStrictOptionValue(compilerOptions, "strictNullChecks"); let currentLexicalScope; let currentNameScope; return { serializeTypeNode: (serializerContext, node) => setSerializerContextAnd(serializerContext, serializeTypeNode, node), serializeTypeOfNode: (serializerContext, node, container) => setSerializerContextAnd(serializerContext, serializeTypeOfNode, node, container), serializeParameterTypesOfNode: (serializerContext, node, container) => setSerializerContextAnd(serializerContext, serializeParameterTypesOfNode, node, container), serializeReturnTypeOfNode: (serializerContext, node) => setSerializerContextAnd(serializerContext, serializeReturnTypeOfNode, node) }; function setSerializerContextAnd(serializerContext, cb, node, arg) { const savedCurrentLexicalScope = currentLexicalScope; const savedCurrentNameScope = currentNameScope; currentLexicalScope = serializerContext.currentLexicalScope; currentNameScope = serializerContext.currentNameScope; const result = arg === void 0 ? cb(node) : cb(node, arg); currentLexicalScope = savedCurrentLexicalScope; currentNameScope = savedCurrentNameScope; return result; } function getAccessorTypeNode(node, container) { const accessors = getAllAccessorDeclarations(container.members, node); return accessors.setAccessor && getSetAccessorTypeAnnotationNode(accessors.setAccessor) || accessors.getAccessor && getEffectiveReturnTypeNode(accessors.getAccessor); } function serializeTypeOfNode(node, container) { switch (node.kind) { case 173 /* PropertyDeclaration */: case 170 /* Parameter */: return serializeTypeNode(node.type); case 179 /* SetAccessor */: case 178 /* GetAccessor */: return serializeTypeNode(getAccessorTypeNode(node, container)); case 264 /* ClassDeclaration */: case 232 /* ClassExpression */: case 175 /* MethodDeclaration */: return factory2.createIdentifier("Function"); default: return factory2.createVoidZero(); } } function serializeParameterTypesOfNode(node, container) { const valueDeclaration = isClassLike(node) ? getFirstConstructorWithBody(node) : isFunctionLike(node) && nodeIsPresent(node.body) ? node : void 0; const expressions = []; if (valueDeclaration) { const parameters = getParametersOfDecoratedDeclaration(valueDeclaration, container); const numParameters = parameters.length; for (let i = 0; i < numParameters; i++) { const parameter = parameters[i]; if (i === 0 && isIdentifier(parameter.name) && parameter.name.escapedText === "this") { continue; } if (parameter.dotDotDotToken) { expressions.push(serializeTypeNode(getRestParameterElementType(parameter.type))); } else { expressions.push(serializeTypeOfNode(parameter, container)); } } } return factory2.createArrayLiteralExpression(expressions); } function getParametersOfDecoratedDeclaration(node, container) { if (container && node.kind === 178 /* GetAccessor */) { const { setAccessor } = getAllAccessorDeclarations(container.members, node); if (setAccessor) { return setAccessor.parameters; } } return node.parameters; } function serializeReturnTypeOfNode(node) { if (isFunctionLike(node) && node.type) { return serializeTypeNode(node.type); } else if (isAsyncFunction(node)) { return factory2.createIdentifier("Promise"); } return factory2.createVoidZero(); } function serializeTypeNode(node) { if (node === void 0) { return factory2.createIdentifier("Object"); } node = skipTypeParentheses(node); switch (node.kind) { case 116 /* VoidKeyword */: case 157 /* UndefinedKeyword */: case 146 /* NeverKeyword */: return factory2.createVoidZero(); case 185 /* FunctionType */: case 186 /* ConstructorType */: return factory2.createIdentifier("Function"); case 189 /* ArrayType */: case 190 /* TupleType */: return factory2.createIdentifier("Array"); case 183 /* TypePredicate */: return node.assertsModifier ? factory2.createVoidZero() : factory2.createIdentifier("Boolean"); case 136 /* BooleanKeyword */: return factory2.createIdentifier("Boolean"); case 204 /* TemplateLiteralType */: case 154 /* StringKeyword */: return factory2.createIdentifier("String"); case 151 /* ObjectKeyword */: return factory2.createIdentifier("Object"); case 202 /* LiteralType */: return serializeLiteralOfLiteralTypeNode(node.literal); case 150 /* NumberKeyword */: return factory2.createIdentifier("Number"); case 163 /* BigIntKeyword */: return getGlobalConstructor("BigInt", 7 /* ES2020 */); case 155 /* SymbolKeyword */: return getGlobalConstructor("Symbol", 2 /* ES2015 */); case 184 /* TypeReference */: return serializeTypeReferenceNode(node); case 194 /* IntersectionType */: return serializeUnionOrIntersectionConstituents( node.types, /*isIntersection*/ true ); case 193 /* UnionType */: return serializeUnionOrIntersectionConstituents( node.types, /*isIntersection*/ false ); case 195 /* ConditionalType */: return serializeUnionOrIntersectionConstituents( [node.trueType, node.falseType], /*isIntersection*/ false ); case 199 /* TypeOperator */: if (node.operator === 148 /* ReadonlyKeyword */) { return serializeTypeNode(node.type); } break; case 187 /* TypeQuery */: case 200 /* IndexedAccessType */: case 201 /* MappedType */: case 188 /* TypeLiteral */: case 133 /* AnyKeyword */: case 159 /* UnknownKeyword */: case 198 /* ThisType */: case 206 /* ImportType */: break; // handle JSDoc types from an invalid parse case 313 /* JSDocAllType */: case 314 /* JSDocUnknownType */: case 318 /* JSDocFunctionType */: case 319 /* JSDocVariadicType */: case 320 /* JSDocNamepathType */: break; case 315 /* JSDocNullableType */: case 316 /* JSDocNonNullableType */: case 317 /* JSDocOptionalType */: return serializeTypeNode(node.type); default: return Debug.failBadSyntaxKind(node); } return factory2.createIdentifier("Object"); } function serializeLiteralOfLiteralTypeNode(node) { switch (node.kind) { case 11 /* StringLiteral */: case 15 /* NoSubstitutionTemplateLiteral */: return factory2.createIdentifier("String"); case 225 /* PrefixUnaryExpression */: { const operand = node.operand; switch (operand.kind) { case 9 /* NumericLiteral */: case 10 /* BigIntLiteral */: return serializeLiteralOfLiteralTypeNode(operand); default: return Debug.failBadSyntaxKind(operand); } } case 9 /* NumericLiteral */: return factory2.createIdentifier("Number"); case 10 /* BigIntLiteral */: return getGlobalConstructor("BigInt", 7 /* ES2020 */); case 112 /* TrueKeyword */: case 97 /* FalseKeyword */: return factory2.createIdentifier("Boolean"); case 106 /* NullKeyword */: return factory2.createVoidZero(); default: return Debug.failBadSyntaxKind(node); } } function serializeUnionOrIntersectionConstituents(types, isIntersection) { let serializedType; for (let typeNode of types) { typeNode = skipTypeParentheses(typeNode); if (typeNode.kind === 146 /* NeverKeyword */) { if (isIntersection) return factory2.createVoidZero(); continue; } if (typeNode.kind === 159 /* UnknownKeyword */) { if (!isIntersection) return factory2.createIdentifier("Object"); continue; } if (typeNode.kind === 133 /* AnyKeyword */) { return factory2.createIdentifier("Object"); } if (!strictNullChecks && (isLiteralTypeNode(typeNode) && typeNode.literal.kind === 106 /* NullKeyword */ || typeNode.kind === 157 /* UndefinedKeyword */)) { continue; } const serializedConstituent = serializeTypeNode(typeNode); if (isIdentifier(serializedConstituent) && serializedConstituent.escapedText === "Object") { return serializedConstituent; } if (serializedType) { if (!equateSerializedTypeNodes(serializedType, serializedConstituent)) { return factory2.createIdentifier("Object"); } } else { serializedType = serializedConstituent; } } return serializedType ?? factory2.createVoidZero(); } function equateSerializedTypeNodes(left, right) { return ( // temp vars used in fallback isGeneratedIdentifier(left) ? isGeneratedIdentifier(right) : ( // entity names isIdentifier(left) ? isIdentifier(right) && left.escapedText === right.escapedText : isPropertyAccessExpression(left) ? isPropertyAccessExpression(right) && equateSerializedTypeNodes(left.expression, right.expression) && equateSerializedTypeNodes(left.name, right.name) : ( // `void 0` isVoidExpression(left) ? isVoidExpression(right) && isNumericLiteral(left.expression) && left.expression.text === "0" && isNumericLiteral(right.expression) && right.expression.text === "0" : ( // `"undefined"` or `"function"` in `typeof` checks isStringLiteral(left) ? isStringLiteral(right) && left.text === right.text : ( // used in `typeof` checks for fallback isTypeOfExpression(left) ? isTypeOfExpression(right) && equateSerializedTypeNodes(left.expression, right.expression) : ( // parens in `typeof` checks with temps isParenthesizedExpression(left) ? isParenthesizedExpression(right) && equateSerializedTypeNodes(left.expression, right.expression) : ( // conditionals used in fallback isConditionalExpression(left) ? isConditionalExpression(right) && equateSerializedTypeNodes(left.condition, right.condition) && equateSerializedTypeNodes(left.whenTrue, right.whenTrue) && equateSerializedTypeNodes(left.whenFalse, right.whenFalse) : ( // logical binary and assignments used in fallback isBinaryExpression(left) ? isBinaryExpression(right) && left.operatorToken.kind === right.operatorToken.kind && equateSerializedTypeNodes(left.left, right.left) && equateSerializedTypeNodes(left.right, right.right) : false ) ) ) ) ) ) ) ); } function serializeTypeReferenceNode(node) { const kind = resolver.getTypeReferenceSerializationKind(node.typeName, currentNameScope ?? currentLexicalScope); switch (kind) { case 0 /* Unknown */: if (findAncestor(node, (n) => n.parent && isConditionalTypeNode(n.parent) && (n.parent.trueType === n || n.parent.falseType === n))) { return factory2.createIdentifier("Object"); } const serialized = serializeEntityNameAsExpressionFallback(node.typeName); const temp = factory2.createTempVariable(hoistVariableDeclaration); return factory2.createConditionalExpression( factory2.createTypeCheck(factory2.createAssignment(temp, serialized), "function"), /*questionToken*/ void 0, temp, /*colonToken*/ void 0, factory2.createIdentifier("Object") ); case 1 /* TypeWithConstructSignatureAndValue */: return serializeEntityNameAsExpression(node.typeName); case 2 /* VoidNullableOrNeverType */: return factory2.createVoidZero(); case 4 /* BigIntLikeType */: return getGlobalConstructor("BigInt", 7 /* ES2020 */); case 6 /* BooleanType */: return factory2.createIdentifier("Boolean"); case 3 /* NumberLikeType */: return factory2.createIdentifier("Number"); case 5 /* StringLikeType */: return factory2.createIdentifier("String"); case 7 /* ArrayLikeType */: return factory2.createIdentifier("Array"); case 8 /* ESSymbolType */: return getGlobalConstructor("Symbol", 2 /* ES2015 */); case 10 /* TypeWithCallSignature */: return factory2.createIdentifier("Function"); case 9 /* Promise */: return factory2.createIdentifier("Promise"); case 11 /* ObjectType */: return factory2.createIdentifier("Object"); default: return Debug.assertNever(kind); } } function createCheckedValue(left, right) { return factory2.createLogicalAnd( factory2.createStrictInequality(factory2.createTypeOfExpression(left), factory2.createStringLiteral("undefined")), right ); } function serializeEntityNameAsExpressionFallback(node) { if (node.kind === 80 /* Identifier */) { const copied = serializeEntityNameAsExpression(node); return createCheckedValue(copied, copied); } if (node.left.kind === 80 /* Identifier */) { return createCheckedValue(serializeEntityNameAsExpression(node.left), serializeEntityNameAsExpression(node)); } const left = serializeEntityNameAsExpressionFallback(node.left); const temp = factory2.createTempVariable(hoistVariableDeclaration); return factory2.createLogicalAnd( factory2.createLogicalAnd( left.left, factory2.createStrictInequality(factory2.createAssignment(temp, left.right), factory2.createVoidZero()) ), factory2.createPropertyAccessExpression(temp, node.right) ); } function serializeEntityNameAsExpression(node) { switch (node.kind) { case 80 /* Identifier */: const name = setParent(setTextRange(parseNodeFactory.cloneNode(node), node), node.parent); name.original = void 0; setParent(name, getParseTreeNode(currentLexicalScope)); return name; case 167 /* QualifiedName */: return serializeQualifiedNameAsExpression(node); } } function serializeQualifiedNameAsExpression(node) { return factory2.createPropertyAccessExpression(serializeEntityNameAsExpression(node.left), node.right); } function getGlobalConstructorWithFallback(name) { return factory2.createConditionalExpression( factory2.createTypeCheck(factory2.createIdentifier(name), "function"), /*questionToken*/ void 0, factory2.createIdentifier(name), /*colonToken*/ void 0, factory2.createIdentifier("Object") ); } function getGlobalConstructor(name, minLanguageVersion) { return languageVersion < minLanguageVersion ? getGlobalConstructorWithFallback(name) : factory2.createIdentifier(name); } } // src/compiler/transformers/legacyDecorators.ts function transformLegacyDecorators(context) { const { factory: factory2, getEmitHelperFactory: emitHelpers, hoistVariableDeclaration } = context; const resolver = context.getEmitResolver(); const compilerOptions = context.getCompilerOptions(); const languageVersion = getEmitScriptTarget(compilerOptions); const previousOnSubstituteNode = context.onSubstituteNode; context.onSubstituteNode = onSubstituteNode; let classAliases; return chainBundle(context, transformSourceFile); function transformSourceFile(node) { const visited = visitEachChild(node, visitor, context); addEmitHelpers(visited, context.readEmitHelpers()); return visited; } function modifierVisitor(node) { return isDecorator(node) ? void 0 : node; } function visitor(node) { if (!(node.transformFlags & 33554432 /* ContainsDecorators */)) { return node; } switch (node.kind) { case 171 /* Decorator */: return void 0; case 264 /* ClassDeclaration */: return visitClassDeclaration(node); case 232 /* ClassExpression */: return visitClassExpression(node); case 177 /* Constructor */: return visitConstructorDeclaration(node); case 175 /* MethodDeclaration */: return visitMethodDeclaration(node); case 179 /* SetAccessor */: return visitSetAccessorDeclaration(node); case 178 /* GetAccessor */: return visitGetAccessorDeclaration(node); case 173 /* PropertyDeclaration */: return visitPropertyDeclaration(node); case 170 /* Parameter */: return visitParameterDeclaration(node); default: return visitEachChild(node, visitor, context); } } function visitClassDeclaration(node) { if (!(classOrConstructorParameterIsDecorated( /*useLegacyDecorators*/ true, node ) || childIsDecorated( /*useLegacyDecorators*/ true, node ))) { return visitEachChild(node, visitor, context); } const statements = classOrConstructorParameterIsDecorated( /*useLegacyDecorators*/ true, node ) ? transformClassDeclarationWithClassDecorators(node, node.name) : transformClassDeclarationWithoutClassDecorators(node, node.name); return singleOrMany(statements); } function decoratorContainsPrivateIdentifierInExpression(decorator) { return !!(decorator.transformFlags & 536870912 /* ContainsPrivateIdentifierInExpression */); } function parameterDecoratorsContainPrivateIdentifierInExpression(parameterDecorators) { return some(parameterDecorators, decoratorContainsPrivateIdentifierInExpression); } function hasClassElementWithDecoratorContainingPrivateIdentifierInExpression(node) { for (const member of node.members) { if (!canHaveDecorators(member)) continue; const allDecorators = getAllDecoratorsOfClassElement( member, node, /*useLegacyDecorators*/ true ); if (some(allDecorators == null ? void 0 : allDecorators.decorators, decoratorContainsPrivateIdentifierInExpression)) return true; if (some(allDecorators == null ? void 0 : allDecorators.parameters, parameterDecoratorsContainPrivateIdentifierInExpression)) return true; } return false; } function transformDecoratorsOfClassElements(node, members) { let decorationStatements = []; addClassElementDecorationStatements( decorationStatements, node, /*isStatic*/ false ); addClassElementDecorationStatements( decorationStatements, node, /*isStatic*/ true ); if (hasClassElementWithDecoratorContainingPrivateIdentifierInExpression(node)) { members = setTextRange( factory2.createNodeArray([ ...members, factory2.createClassStaticBlockDeclaration( factory2.createBlock( decorationStatements, /*multiLine*/ true ) ) ]), members ); decorationStatements = void 0; } return { decorationStatements, members }; } function transformClassDeclarationWithoutClassDecorators(node, name) { const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier); const heritageClauses = visitNodes2(node.heritageClauses, visitor, isHeritageClause); let members = visitNodes2(node.members, visitor, isClassElement); let decorationStatements = []; ({ members, decorationStatements } = transformDecoratorsOfClassElements(node, members)); const updated = factory2.updateClassDeclaration( node, modifiers, name, /*typeParameters*/ void 0, heritageClauses, members ); return addRange([updated], decorationStatements); } function transformClassDeclarationWithClassDecorators(node, name) { const isExport = hasSyntacticModifier(node, 32 /* Export */); const isDefault = hasSyntacticModifier(node, 2048 /* Default */); const modifiers = visitNodes2(node.modifiers, (node2) => isExportOrDefaultModifier(node2) || isDecorator(node2) ? void 0 : node2, isModifierLike); const location = moveRangePastModifiers(node); const classAlias = getClassAliasIfNeeded(node); const declName = languageVersion < 2 /* ES2015 */ ? factory2.getInternalName( node, /*allowComments*/ false, /*allowSourceMaps*/ true ) : factory2.getLocalName( node, /*allowComments*/ false, /*allowSourceMaps*/ true ); const heritageClauses = visitNodes2(node.heritageClauses, visitor, isHeritageClause); let members = visitNodes2(node.members, visitor, isClassElement); let decorationStatements = []; ({ members, decorationStatements } = transformDecoratorsOfClassElements(node, members)); const assignClassAliasInStaticBlock = languageVersion >= 9 /* ES2022 */ && !!classAlias && some(members, (member) => isPropertyDeclaration(member) && hasSyntacticModifier(member, 256 /* Static */) || isClassStaticBlockDeclaration(member)); if (assignClassAliasInStaticBlock) { members = setTextRange( factory2.createNodeArray([ factory2.createClassStaticBlockDeclaration( factory2.createBlock([ factory2.createExpressionStatement( factory2.createAssignment(classAlias, factory2.createThis()) ) ]) ), ...members ]), members ); } const classExpression = factory2.createClassExpression( modifiers, name && isGeneratedIdentifier(name) ? void 0 : name, /*typeParameters*/ void 0, heritageClauses, members ); setOriginalNode(classExpression, node); setTextRange(classExpression, location); const varInitializer = classAlias && !assignClassAliasInStaticBlock ? factory2.createAssignment(classAlias, classExpression) : classExpression; const varDecl = factory2.createVariableDeclaration( declName, /*exclamationToken*/ void 0, /*type*/ void 0, varInitializer ); setOriginalNode(varDecl, node); const varDeclList = factory2.createVariableDeclarationList([varDecl], 1 /* Let */); const varStatement = factory2.createVariableStatement( /*modifiers*/ void 0, varDeclList ); setOriginalNode(varStatement, node); setTextRange(varStatement, location); setCommentRange(varStatement, node); const statements = [varStatement]; addRange(statements, decorationStatements); addConstructorDecorationStatement(statements, node); if (isExport) { if (isDefault) { const exportStatement = factory2.createExportDefault(declName); statements.push(exportStatement); } else { const exportStatement = factory2.createExternalModuleExport(factory2.getDeclarationName(node)); statements.push(exportStatement); } } return statements; } function visitClassExpression(node) { return factory2.updateClassExpression( node, visitNodes2(node.modifiers, modifierVisitor, isModifier), node.name, /*typeParameters*/ void 0, visitNodes2(node.heritageClauses, visitor, isHeritageClause), visitNodes2(node.members, visitor, isClassElement) ); } function visitConstructorDeclaration(node) { return factory2.updateConstructorDeclaration( node, visitNodes2(node.modifiers, modifierVisitor, isModifier), visitNodes2(node.parameters, visitor, isParameter), visitNode(node.body, visitor, isBlock) ); } function finishClassElement(updated, original) { if (updated !== original) { setCommentRange(updated, original); setSourceMapRange(updated, moveRangePastModifiers(original)); } return updated; } function visitMethodDeclaration(node) { return finishClassElement( factory2.updateMethodDeclaration( node, visitNodes2(node.modifiers, modifierVisitor, isModifier), node.asteriskToken, Debug.checkDefined(visitNode(node.name, visitor, isPropertyName)), /*questionToken*/ void 0, /*typeParameters*/ void 0, visitNodes2(node.parameters, visitor, isParameter), /*type*/ void 0, visitNode(node.body, visitor, isBlock) ), node ); } function visitGetAccessorDeclaration(node) { return finishClassElement( factory2.updateGetAccessorDeclaration( node, visitNodes2(node.modifiers, modifierVisitor, isModifier), Debug.checkDefined(visitNode(node.name, visitor, isPropertyName)), visitNodes2(node.parameters, visitor, isParameter), /*type*/ void 0, visitNode(node.body, visitor, isBlock) ), node ); } function visitSetAccessorDeclaration(node) { return finishClassElement( factory2.updateSetAccessorDeclaration( node, visitNodes2(node.modifiers, modifierVisitor, isModifier), Debug.checkDefined(visitNode(node.name, visitor, isPropertyName)), visitNodes2(node.parameters, visitor, isParameter), visitNode(node.body, visitor, isBlock) ), node ); } function visitPropertyDeclaration(node) { if (node.flags & 33554432 /* Ambient */ || hasSyntacticModifier(node, 128 /* Ambient */)) { return void 0; } return finishClassElement( factory2.updatePropertyDeclaration( node, visitNodes2(node.modifiers, modifierVisitor, isModifier), Debug.checkDefined(visitNode(node.name, visitor, isPropertyName)), /*questionOrExclamationToken*/ void 0, /*type*/ void 0, visitNode(node.initializer, visitor, isExpression) ), node ); } function visitParameterDeclaration(node) { const updated = factory2.updateParameterDeclaration( node, elideNodes(factory2, node.modifiers), node.dotDotDotToken, Debug.checkDefined(visitNode(node.name, visitor, isBindingName)), /*questionToken*/ void 0, /*type*/ void 0, visitNode(node.initializer, visitor, isExpression) ); if (updated !== node) { setCommentRange(updated, node); setTextRange(updated, moveRangePastModifiers(node)); setSourceMapRange(updated, moveRangePastModifiers(node)); setEmitFlags(updated.name, 64 /* NoTrailingSourceMap */); } return updated; } function isSyntheticMetadataDecorator(node) { return isCallToHelper(node.expression, "___metadata"); } function transformAllDecoratorsOfDeclaration(allDecorators) { if (!allDecorators) { return void 0; } const { false: decorators, true: metadata } = groupBy(allDecorators.decorators, isSyntheticMetadataDecorator); const decoratorExpressions = []; addRange(decoratorExpressions, map(decorators, transformDecorator)); addRange(decoratorExpressions, flatMap(allDecorators.parameters, transformDecoratorsOfParameter)); addRange(decoratorExpressions, map(metadata, transformDecorator)); return decoratorExpressions; } function addClassElementDecorationStatements(statements, node, isStatic2) { addRange(statements, map(generateClassElementDecorationExpressions(node, isStatic2), (expr) => factory2.createExpressionStatement(expr))); } function isDecoratedClassElement(member, isStaticElement, parent) { return nodeOrChildIsDecorated( /*useLegacyDecorators*/ true, member, parent ) && isStaticElement === isStatic(member); } function getDecoratedClassElements(node, isStatic2) { return filter(node.members, (m) => isDecoratedClassElement(m, isStatic2, node)); } function generateClassElementDecorationExpressions(node, isStatic2) { const members = getDecoratedClassElements(node, isStatic2); let expressions; for (const member of members) { expressions = append(expressions, generateClassElementDecorationExpression(node, member)); } return expressions; } function generateClassElementDecorationExpression(node, member) { const allDecorators = getAllDecoratorsOfClassElement( member, node, /*useLegacyDecorators*/ true ); const decoratorExpressions = transformAllDecoratorsOfDeclaration(allDecorators); if (!decoratorExpressions) { return void 0; } const prefix = getClassMemberPrefix(node, member); const memberName = getExpressionForPropertyName( member, /*generateNameForComputedPropertyName*/ !hasSyntacticModifier(member, 128 /* Ambient */) ); const descriptor = isPropertyDeclaration(member) && !hasAccessorModifier(member) ? factory2.createVoidZero() : factory2.createNull(); const helper = emitHelpers().createDecorateHelper( decoratorExpressions, prefix, memberName, descriptor ); setEmitFlags(helper, 3072 /* NoComments */); setSourceMapRange(helper, moveRangePastModifiers(member)); return helper; } function addConstructorDecorationStatement(statements, node) { const expression = generateConstructorDecorationExpression(node); if (expression) { statements.push(setOriginalNode(factory2.createExpressionStatement(expression), node)); } } function generateConstructorDecorationExpression(node) { const allDecorators = getAllDecoratorsOfClass( node, /*useLegacyDecorators*/ true ); const decoratorExpressions = transformAllDecoratorsOfDeclaration(allDecorators); if (!decoratorExpressions) { return void 0; } const classAlias = classAliases && classAliases[getOriginalNodeId(node)]; const localName = languageVersion < 2 /* ES2015 */ ? factory2.getInternalName( node, /*allowComments*/ false, /*allowSourceMaps*/ true ) : factory2.getDeclarationName( node, /*allowComments*/ false, /*allowSourceMaps*/ true ); const decorate = emitHelpers().createDecorateHelper(decoratorExpressions, localName); const expression = factory2.createAssignment(localName, classAlias ? factory2.createAssignment(classAlias, decorate) : decorate); setEmitFlags(expression, 3072 /* NoComments */); setSourceMapRange(expression, moveRangePastModifiers(node)); return expression; } function transformDecorator(decorator) { return Debug.checkDefined(visitNode(decorator.expression, visitor, isExpression)); } function transformDecoratorsOfParameter(decorators, parameterOffset) { let expressions; if (decorators) { expressions = []; for (const decorator of decorators) { const helper = emitHelpers().createParamHelper( transformDecorator(decorator), parameterOffset ); setTextRange(helper, decorator.expression); setEmitFlags(helper, 3072 /* NoComments */); expressions.push(helper); } } return expressions; } function getExpressionForPropertyName(member, generateNameForComputedPropertyName) { const name = member.name; if (isPrivateIdentifier(name)) { return factory2.createIdentifier(""); } else if (isComputedPropertyName(name)) { return generateNameForComputedPropertyName && !isSimpleInlineableExpression(name.expression) ? factory2.getGeneratedNameForNode(name) : name.expression; } else if (isIdentifier(name)) { return factory2.createStringLiteral(idText(name)); } else { return factory2.cloneNode(name); } } function enableSubstitutionForClassAliases() { if (!classAliases) { context.enableSubstitution(80 /* Identifier */); classAliases = []; } } function getClassAliasIfNeeded(node) { if (resolver.hasNodeCheckFlag(node, 262144 /* ContainsConstructorReference */)) { enableSubstitutionForClassAliases(); const classAlias = factory2.createUniqueName(node.name && !isGeneratedIdentifier(node.name) ? idText(node.name) : "default"); classAliases[getOriginalNodeId(node)] = classAlias; hoistVariableDeclaration(classAlias); return classAlias; } } function getClassPrototype(node) { return factory2.createPropertyAccessExpression(factory2.getDeclarationName(node), "prototype"); } function getClassMemberPrefix(node, member) { return isStatic(member) ? factory2.getDeclarationName(node) : getClassPrototype(node); } function onSubstituteNode(hint, node) { node = previousOnSubstituteNode(hint, node); if (hint === 1 /* Expression */) { return substituteExpression(node); } return node; } function substituteExpression(node) { switch (node.kind) { case 80 /* Identifier */: return substituteExpressionIdentifier(node); } return node; } function substituteExpressionIdentifier(node) { return trySubstituteClassAlias(node) ?? node; } function trySubstituteClassAlias(node) { if (classAliases) { if (resolver.hasNodeCheckFlag(node, 536870912 /* ConstructorReference */)) { const declaration = resolver.getReferencedValueDeclaration(node); if (declaration) { const classAlias = classAliases[declaration.id]; if (classAlias) { const clone = factory2.cloneNode(classAlias); setSourceMapRange(clone, node); setCommentRange(clone, node); return clone; } } } } return void 0; } } // src/compiler/transformers/esDecorators.ts function transformESDecorators(context) { const { factory: factory2, getEmitHelperFactory: emitHelpers, startLexicalEnvironment, endLexicalEnvironment, hoistVariableDeclaration } = context; const languageVersion = getEmitScriptTarget(context.getCompilerOptions()); let top; let classInfo; let classThis; let classSuper; let pendingExpressions; let shouldTransformPrivateStaticElementsInFile; return chainBundle(context, transformSourceFile); function transformSourceFile(node) { top = void 0; shouldTransformPrivateStaticElementsInFile = false; const visited = visitEachChild(node, visitor, context); addEmitHelpers(visited, context.readEmitHelpers()); if (shouldTransformPrivateStaticElementsInFile) { addInternalEmitFlags(visited, 32 /* TransformPrivateStaticElements */); shouldTransformPrivateStaticElementsInFile = false; } return visited; } function updateState() { classInfo = void 0; classThis = void 0; classSuper = void 0; switch (top == null ? void 0 : top.kind) { case "class": classInfo = top.classInfo; break; case "class-element": classInfo = top.next.classInfo; classThis = top.classThis; classSuper = top.classSuper; break; case "name": const grandparent = top.next.next.next; if ((grandparent == null ? void 0 : grandparent.kind) === "class-element") { classInfo = grandparent.next.classInfo; classThis = grandparent.classThis; classSuper = grandparent.classSuper; } break; } } function enterClass(classInfo2) { top = { kind: "class", next: top, classInfo: classInfo2, savedPendingExpressions: pendingExpressions }; pendingExpressions = void 0; updateState(); } function exitClass() { Debug.assert((top == null ? void 0 : top.kind) === "class", "Incorrect value for top.kind.", () => `Expected top.kind to be 'class' but got '${top == null ? void 0 : top.kind}' instead.`); pendingExpressions = top.savedPendingExpressions; top = top.next; updateState(); } function enterClassElement(node) { var _a, _b; Debug.assert((top == null ? void 0 : top.kind) === "class", "Incorrect value for top.kind.", () => `Expected top.kind to be 'class' but got '${top == null ? void 0 : top.kind}' instead.`); top = { kind: "class-element", next: top }; if (isClassStaticBlockDeclaration(node) || isPropertyDeclaration(node) && hasStaticModifier(node)) { top.classThis = (_a = top.next.classInfo) == null ? void 0 : _a.classThis; top.classSuper = (_b = top.next.classInfo) == null ? void 0 : _b.classSuper; } updateState(); } function exitClassElement() { var _a; Debug.assert((top == null ? void 0 : top.kind) === "class-element", "Incorrect value for top.kind.", () => `Expected top.kind to be 'class-element' but got '${top == null ? void 0 : top.kind}' instead.`); Debug.assert(((_a = top.next) == null ? void 0 : _a.kind) === "class", "Incorrect value for top.next.kind.", () => { var _a2; return `Expected top.next.kind to be 'class' but got '${(_a2 = top.next) == null ? void 0 : _a2.kind}' instead.`; }); top = top.next; updateState(); } function enterName() { Debug.assert((top == null ? void 0 : top.kind) === "class-element", "Incorrect value for top.kind.", () => `Expected top.kind to be 'class-element' but got '${top == null ? void 0 : top.kind}' instead.`); top = { kind: "name", next: top }; updateState(); } function exitName() { Debug.assert((top == null ? void 0 : top.kind) === "name", "Incorrect value for top.kind.", () => `Expected top.kind to be 'name' but got '${top == null ? void 0 : top.kind}' instead.`); top = top.next; updateState(); } function enterOther() { if ((top == null ? void 0 : top.kind) === "other") { Debug.assert(!pendingExpressions); top.depth++; } else { top = { kind: "other", next: top, depth: 0, savedPendingExpressions: pendingExpressions }; pendingExpressions = void 0; updateState(); } } function exitOther() { Debug.assert((top == null ? void 0 : top.kind) === "other", "Incorrect value for top.kind.", () => `Expected top.kind to be 'other' but got '${top == null ? void 0 : top.kind}' instead.`); if (top.depth > 0) { Debug.assert(!pendingExpressions); top.depth--; } else { pendingExpressions = top.savedPendingExpressions; top = top.next; updateState(); } } function shouldVisitNode(node) { return !!(node.transformFlags & 33554432 /* ContainsDecorators */) || !!classThis && !!(node.transformFlags & 16384 /* ContainsLexicalThis */) || !!classThis && !!classSuper && !!(node.transformFlags & 134217728 /* ContainsLexicalSuper */); } function visitor(node) { if (!shouldVisitNode(node)) { return node; } switch (node.kind) { case 171 /* Decorator */: return Debug.fail("Use `modifierVisitor` instead."); case 264 /* ClassDeclaration */: return visitClassDeclaration(node); case 232 /* ClassExpression */: return visitClassExpression(node); case 177 /* Constructor */: case 173 /* PropertyDeclaration */: case 176 /* ClassStaticBlockDeclaration */: return Debug.fail("Not supported outside of a class. Use 'classElementVisitor' instead."); case 170 /* Parameter */: return visitParameterDeclaration(node); // Support NamedEvaluation to ensure the correct class name for class expressions. case 227 /* BinaryExpression */: return visitBinaryExpression( node, /*discarded*/ false ); case 304 /* PropertyAssignment */: return visitPropertyAssignment(node); case 261 /* VariableDeclaration */: return visitVariableDeclaration(node); case 209 /* BindingElement */: return visitBindingElement(node); case 278 /* ExportAssignment */: return visitExportAssignment(node); case 110 /* ThisKeyword */: return visitThisExpression(node); case 249 /* ForStatement */: return visitForStatement(node); case 245 /* ExpressionStatement */: return visitExpressionStatement(node); case 357 /* CommaListExpression */: return visitCommaListExpression( node, /*discarded*/ false ); case 218 /* ParenthesizedExpression */: return visitParenthesizedExpression( node, /*discarded*/ false ); case 356 /* PartiallyEmittedExpression */: return visitPartiallyEmittedExpression( node, /*discarded*/ false ); case 214 /* CallExpression */: return visitCallExpression(node); case 216 /* TaggedTemplateExpression */: return visitTaggedTemplateExpression(node); case 225 /* PrefixUnaryExpression */: case 226 /* PostfixUnaryExpression */: return visitPreOrPostfixUnaryExpression( node, /*discarded*/ false ); case 212 /* PropertyAccessExpression */: return visitPropertyAccessExpression(node); case 213 /* ElementAccessExpression */: return visitElementAccessExpression(node); case 168 /* ComputedPropertyName */: return visitComputedPropertyName(node); case 175 /* MethodDeclaration */: // object literal methods and accessors case 179 /* SetAccessor */: case 178 /* GetAccessor */: case 219 /* FunctionExpression */: case 263 /* FunctionDeclaration */: { enterOther(); const result = visitEachChild(node, fallbackVisitor, context); exitOther(); return result; } default: return visitEachChild(node, fallbackVisitor, context); } } function fallbackVisitor(node) { switch (node.kind) { case 171 /* Decorator */: return void 0; default: return visitor(node); } } function modifierVisitor(node) { switch (node.kind) { case 171 /* Decorator */: return void 0; default: return node; } } function classElementVisitor(node) { switch (node.kind) { case 177 /* Constructor */: return visitConstructorDeclaration(node); case 175 /* MethodDeclaration */: return visitMethodDeclaration(node); case 178 /* GetAccessor */: return visitGetAccessorDeclaration(node); case 179 /* SetAccessor */: return visitSetAccessorDeclaration(node); case 173 /* PropertyDeclaration */: return visitPropertyDeclaration(node); case 176 /* ClassStaticBlockDeclaration */: return visitClassStaticBlockDeclaration(node); default: return visitor(node); } } function discardedValueVisitor(node) { switch (node.kind) { case 225 /* PrefixUnaryExpression */: case 226 /* PostfixUnaryExpression */: return visitPreOrPostfixUnaryExpression( node, /*discarded*/ true ); case 227 /* BinaryExpression */: return visitBinaryExpression( node, /*discarded*/ true ); case 357 /* CommaListExpression */: return visitCommaListExpression( node, /*discarded*/ true ); case 218 /* ParenthesizedExpression */: return visitParenthesizedExpression( node, /*discarded*/ true ); default: return visitor(node); } } function getHelperVariableName(node) { let declarationName = node.name && isIdentifier(node.name) && !isGeneratedIdentifier(node.name) ? idText(node.name) : node.name && isPrivateIdentifier(node.name) && !isGeneratedIdentifier(node.name) ? idText(node.name).slice(1) : node.name && isStringLiteral(node.name) && isIdentifierText(node.name.text, 99 /* ESNext */) ? node.name.text : isClassLike(node) ? "class" : "member"; if (isGetAccessor(node)) declarationName = `get_${declarationName}`; if (isSetAccessor(node)) declarationName = `set_${declarationName}`; if (node.name && isPrivateIdentifier(node.name)) declarationName = `private_${declarationName}`; if (isStatic(node)) declarationName = `static_${declarationName}`; return "_" + declarationName; } function createHelperVariable(node, suffix) { return factory2.createUniqueName(`${getHelperVariableName(node)}_${suffix}`, 16 /* Optimistic */ | 8 /* ReservedInNestedScopes */); } function createLet(name, initializer) { return factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList([ factory2.createVariableDeclaration( name, /*exclamationToken*/ void 0, /*type*/ void 0, initializer ) ], 1 /* Let */) ); } function createClassInfo(node) { const metadataReference = factory2.createUniqueName("_metadata", 16 /* Optimistic */ | 32 /* FileLevel */); let instanceMethodExtraInitializersName; let staticMethodExtraInitializersName; let hasStaticInitializers = false; let hasNonAmbientInstanceFields = false; let hasStaticPrivateClassElements = false; let classThis2; let pendingStaticInitializers; let pendingInstanceInitializers; if (nodeIsDecorated( /*useLegacyDecorators*/ false, node )) { const needsUniqueClassThis = some(node.members, (member) => (isPrivateIdentifierClassElementDeclaration(member) || isAutoAccessorPropertyDeclaration(member)) && hasStaticModifier(member)); classThis2 = factory2.createUniqueName( "_classThis", needsUniqueClassThis ? 16 /* Optimistic */ | 8 /* ReservedInNestedScopes */ : 16 /* Optimistic */ | 32 /* FileLevel */ ); } for (const member of node.members) { if (isMethodOrAccessor(member) && nodeOrChildIsDecorated( /*useLegacyDecorators*/ false, member, node )) { if (hasStaticModifier(member)) { if (!staticMethodExtraInitializersName) { staticMethodExtraInitializersName = factory2.createUniqueName("_staticExtraInitializers", 16 /* Optimistic */ | 32 /* FileLevel */); const initializer = emitHelpers().createRunInitializersHelper(classThis2 ?? factory2.createThis(), staticMethodExtraInitializersName); setSourceMapRange(initializer, node.name ?? moveRangePastDecorators(node)); pendingStaticInitializers ?? (pendingStaticInitializers = []); pendingStaticInitializers.push(initializer); } } else { if (!instanceMethodExtraInitializersName) { instanceMethodExtraInitializersName = factory2.createUniqueName("_instanceExtraInitializers", 16 /* Optimistic */ | 32 /* FileLevel */); const initializer = emitHelpers().createRunInitializersHelper(factory2.createThis(), instanceMethodExtraInitializersName); setSourceMapRange(initializer, node.name ?? moveRangePastDecorators(node)); pendingInstanceInitializers ?? (pendingInstanceInitializers = []); pendingInstanceInitializers.push(initializer); } instanceMethodExtraInitializersName ?? (instanceMethodExtraInitializersName = factory2.createUniqueName("_instanceExtraInitializers", 16 /* Optimistic */ | 32 /* FileLevel */)); } } if (isClassStaticBlockDeclaration(member)) { if (!isClassNamedEvaluationHelperBlock(member)) { hasStaticInitializers = true; } } else if (isPropertyDeclaration(member)) { if (hasStaticModifier(member)) { hasStaticInitializers || (hasStaticInitializers = !!member.initializer || hasDecorators(member)); } else { hasNonAmbientInstanceFields || (hasNonAmbientInstanceFields = !isAmbientPropertyDeclaration(member)); } } if ((isPrivateIdentifierClassElementDeclaration(member) || isAutoAccessorPropertyDeclaration(member)) && hasStaticModifier(member)) { hasStaticPrivateClassElements = true; } if (staticMethodExtraInitializersName && instanceMethodExtraInitializersName && hasStaticInitializers && hasNonAmbientInstanceFields && hasStaticPrivateClassElements) { break; } } return { class: node, classThis: classThis2, metadataReference, instanceMethodExtraInitializersName, staticMethodExtraInitializersName, hasStaticInitializers, hasNonAmbientInstanceFields, hasStaticPrivateClassElements, pendingStaticInitializers, pendingInstanceInitializers }; } function transformClassLike(node) { startLexicalEnvironment(); if (!classHasDeclaredOrExplicitlyAssignedName(node) && classOrConstructorParameterIsDecorated( /*useLegacyDecorators*/ false, node )) { node = injectClassNamedEvaluationHelperBlockIfMissing(context, node, factory2.createStringLiteral("")); } const classReference = factory2.getLocalName( node, /*allowComments*/ false, /*allowSourceMaps*/ false, /*ignoreAssignedName*/ true ); const classInfo2 = createClassInfo(node); const classDefinitionStatements = []; let leadingBlockStatements; let trailingBlockStatements; let syntheticConstructor; let heritageClauses; let shouldTransformPrivateStaticElementsInClass = false; const classDecorators = transformAllDecoratorsOfDeclaration(getAllDecoratorsOfClass( node, /*useLegacyDecorators*/ false )); if (classDecorators) { classInfo2.classDecoratorsName = factory2.createUniqueName("_classDecorators", 16 /* Optimistic */ | 32 /* FileLevel */); classInfo2.classDescriptorName = factory2.createUniqueName("_classDescriptor", 16 /* Optimistic */ | 32 /* FileLevel */); classInfo2.classExtraInitializersName = factory2.createUniqueName("_classExtraInitializers", 16 /* Optimistic */ | 32 /* FileLevel */); Debug.assertIsDefined(classInfo2.classThis); classDefinitionStatements.push( createLet(classInfo2.classDecoratorsName, factory2.createArrayLiteralExpression(classDecorators)), createLet(classInfo2.classDescriptorName), createLet(classInfo2.classExtraInitializersName, factory2.createArrayLiteralExpression()), createLet(classInfo2.classThis) ); if (classInfo2.hasStaticPrivateClassElements) { shouldTransformPrivateStaticElementsInClass = true; shouldTransformPrivateStaticElementsInFile = true; } } const extendsClause = getHeritageClause(node.heritageClauses, 96 /* ExtendsKeyword */); const extendsElement = extendsClause && firstOrUndefined(extendsClause.types); const extendsExpression = extendsElement && visitNode(extendsElement.expression, visitor, isExpression); if (extendsExpression) { classInfo2.classSuper = factory2.createUniqueName("_classSuper", 16 /* Optimistic */ | 32 /* FileLevel */); const unwrapped = skipOuterExpressions(extendsExpression); const safeExtendsExpression = isClassExpression(unwrapped) && !unwrapped.name || isFunctionExpression(unwrapped) && !unwrapped.name || isArrowFunction(unwrapped) ? factory2.createComma(factory2.createNumericLiteral(0), extendsExpression) : extendsExpression; classDefinitionStatements.push(createLet(classInfo2.classSuper, safeExtendsExpression)); const updatedExtendsElement = factory2.updateExpressionWithTypeArguments( extendsElement, classInfo2.classSuper, /*typeArguments*/ void 0 ); const updatedExtendsClause = factory2.updateHeritageClause(extendsClause, [updatedExtendsElement]); heritageClauses = factory2.createNodeArray([updatedExtendsClause]); } const renamedClassThis = classInfo2.classThis ?? factory2.createThis(); enterClass(classInfo2); leadingBlockStatements = append(leadingBlockStatements, createMetadata(classInfo2.metadataReference, classInfo2.classSuper)); let members = node.members; members = visitNodes2(members, (node2) => isConstructorDeclaration(node2) ? node2 : classElementVisitor(node2), isClassElement); members = visitNodes2(members, (node2) => isConstructorDeclaration(node2) ? classElementVisitor(node2) : node2, isClassElement); if (pendingExpressions) { let outerThis; for (let expression of pendingExpressions) { expression = visitNode(expression, function thisVisitor(node2) { if (!(node2.transformFlags & 16384 /* ContainsLexicalThis */)) { return node2; } switch (node2.kind) { case 110 /* ThisKeyword */: if (!outerThis) { outerThis = factory2.createUniqueName("_outerThis", 16 /* Optimistic */); classDefinitionStatements.unshift(createLet(outerThis, factory2.createThis())); } return outerThis; default: return visitEachChild(node2, thisVisitor, context); } }, isExpression); const statement = factory2.createExpressionStatement(expression); leadingBlockStatements = append(leadingBlockStatements, statement); } pendingExpressions = void 0; } exitClass(); if (some(classInfo2.pendingInstanceInitializers) && !getFirstConstructorWithBody(node)) { const initializerStatements = prepareConstructor(node, classInfo2); if (initializerStatements) { const extendsClauseElement = getEffectiveBaseTypeNode(node); const isDerivedClass = !!(extendsClauseElement && skipOuterExpressions(extendsClauseElement.expression).kind !== 106 /* NullKeyword */); const constructorStatements = []; if (isDerivedClass) { const spreadArguments = factory2.createSpreadElement(factory2.createIdentifier("arguments")); const superCall = factory2.createCallExpression( factory2.createSuper(), /*typeArguments*/ void 0, [spreadArguments] ); constructorStatements.push(factory2.createExpressionStatement(superCall)); } addRange(constructorStatements, initializerStatements); const constructorBody = factory2.createBlock( constructorStatements, /*multiLine*/ true ); syntheticConstructor = factory2.createConstructorDeclaration( /*modifiers*/ void 0, [], constructorBody ); } } if (classInfo2.staticMethodExtraInitializersName) { classDefinitionStatements.push( createLet(classInfo2.staticMethodExtraInitializersName, factory2.createArrayLiteralExpression()) ); } if (classInfo2.instanceMethodExtraInitializersName) { classDefinitionStatements.push( createLet(classInfo2.instanceMethodExtraInitializersName, factory2.createArrayLiteralExpression()) ); } if (classInfo2.memberInfos) { forEachEntry(classInfo2.memberInfos, (memberInfo, member) => { if (isStatic(member)) { classDefinitionStatements.push(createLet(memberInfo.memberDecoratorsName)); if (memberInfo.memberInitializersName) { classDefinitionStatements.push(createLet(memberInfo.memberInitializersName, factory2.createArrayLiteralExpression())); } if (memberInfo.memberExtraInitializersName) { classDefinitionStatements.push(createLet(memberInfo.memberExtraInitializersName, factory2.createArrayLiteralExpression())); } if (memberInfo.memberDescriptorName) { classDefinitionStatements.push(createLet(memberInfo.memberDescriptorName)); } } }); } if (classInfo2.memberInfos) { forEachEntry(classInfo2.memberInfos, (memberInfo, member) => { if (!isStatic(member)) { classDefinitionStatements.push(createLet(memberInfo.memberDecoratorsName)); if (memberInfo.memberInitializersName) { classDefinitionStatements.push(createLet(memberInfo.memberInitializersName, factory2.createArrayLiteralExpression())); } if (memberInfo.memberExtraInitializersName) { classDefinitionStatements.push(createLet(memberInfo.memberExtraInitializersName, factory2.createArrayLiteralExpression())); } if (memberInfo.memberDescriptorName) { classDefinitionStatements.push(createLet(memberInfo.memberDescriptorName)); } } }); } leadingBlockStatements = addRange(leadingBlockStatements, classInfo2.staticNonFieldDecorationStatements); leadingBlockStatements = addRange(leadingBlockStatements, classInfo2.nonStaticNonFieldDecorationStatements); leadingBlockStatements = addRange(leadingBlockStatements, classInfo2.staticFieldDecorationStatements); leadingBlockStatements = addRange(leadingBlockStatements, classInfo2.nonStaticFieldDecorationStatements); if (classInfo2.classDescriptorName && classInfo2.classDecoratorsName && classInfo2.classExtraInitializersName && classInfo2.classThis) { leadingBlockStatements ?? (leadingBlockStatements = []); const valueProperty = factory2.createPropertyAssignment("value", renamedClassThis); const classDescriptor = factory2.createObjectLiteralExpression([valueProperty]); const classDescriptorAssignment = factory2.createAssignment(classInfo2.classDescriptorName, classDescriptor); const classNameReference = factory2.createPropertyAccessExpression(renamedClassThis, "name"); const esDecorateHelper2 = emitHelpers().createESDecorateHelper( factory2.createNull(), classDescriptorAssignment, classInfo2.classDecoratorsName, { kind: "class", name: classNameReference, metadata: classInfo2.metadataReference }, factory2.createNull(), classInfo2.classExtraInitializersName ); const esDecorateStatement = factory2.createExpressionStatement(esDecorateHelper2); setSourceMapRange(esDecorateStatement, moveRangePastDecorators(node)); leadingBlockStatements.push(esDecorateStatement); const classDescriptorValueReference = factory2.createPropertyAccessExpression(classInfo2.classDescriptorName, "value"); const classThisAssignment = factory2.createAssignment(classInfo2.classThis, classDescriptorValueReference); const classReferenceAssignment = factory2.createAssignment(classReference, classThisAssignment); leadingBlockStatements.push(factory2.createExpressionStatement(classReferenceAssignment)); } leadingBlockStatements.push(createSymbolMetadata(renamedClassThis, classInfo2.metadataReference)); if (some(classInfo2.pendingStaticInitializers)) { for (const initializer of classInfo2.pendingStaticInitializers) { const initializerStatement = factory2.createExpressionStatement(initializer); setSourceMapRange(initializerStatement, getSourceMapRange(initializer)); trailingBlockStatements = append(trailingBlockStatements, initializerStatement); } classInfo2.pendingStaticInitializers = void 0; } if (classInfo2.classExtraInitializersName) { const runClassInitializersHelper = emitHelpers().createRunInitializersHelper(renamedClassThis, classInfo2.classExtraInitializersName); const runClassInitializersStatement = factory2.createExpressionStatement(runClassInitializersHelper); setSourceMapRange(runClassInitializersStatement, node.name ?? moveRangePastDecorators(node)); trailingBlockStatements = append(trailingBlockStatements, runClassInitializersStatement); } if (leadingBlockStatements && trailingBlockStatements && !classInfo2.hasStaticInitializers) { addRange(leadingBlockStatements, trailingBlockStatements); trailingBlockStatements = void 0; } const leadingStaticBlock = leadingBlockStatements && factory2.createClassStaticBlockDeclaration(factory2.createBlock( leadingBlockStatements, /*multiLine*/ true )); if (leadingStaticBlock && shouldTransformPrivateStaticElementsInClass) { setInternalEmitFlags(leadingStaticBlock, 32 /* TransformPrivateStaticElements */); } const trailingStaticBlock = trailingBlockStatements && factory2.createClassStaticBlockDeclaration(factory2.createBlock( trailingBlockStatements, /*multiLine*/ true )); if (leadingStaticBlock || syntheticConstructor || trailingStaticBlock) { const newMembers = []; const existingNamedEvaluationHelperBlockIndex = members.findIndex(isClassNamedEvaluationHelperBlock); if (leadingStaticBlock) { addRange(newMembers, members, 0, existingNamedEvaluationHelperBlockIndex + 1); newMembers.push(leadingStaticBlock); addRange(newMembers, members, existingNamedEvaluationHelperBlockIndex + 1); } else { addRange(newMembers, members); } if (syntheticConstructor) { newMembers.push(syntheticConstructor); } if (trailingStaticBlock) { newMembers.push(trailingStaticBlock); } members = setTextRange(factory2.createNodeArray(newMembers), members); } const lexicalEnvironment = endLexicalEnvironment(); let classExpression; if (classDecorators) { classExpression = factory2.createClassExpression( /*modifiers*/ void 0, /*name*/ void 0, /*typeParameters*/ void 0, heritageClauses, members ); if (classInfo2.classThis) { classExpression = injectClassThisAssignmentIfMissing(factory2, classExpression, classInfo2.classThis); } const classReferenceDeclaration = factory2.createVariableDeclaration( classReference, /*exclamationToken*/ void 0, /*type*/ void 0, classExpression ); const classReferenceVarDeclList = factory2.createVariableDeclarationList([classReferenceDeclaration]); const returnExpr = classInfo2.classThis ? factory2.createAssignment(classReference, classInfo2.classThis) : classReference; classDefinitionStatements.push( factory2.createVariableStatement( /*modifiers*/ void 0, classReferenceVarDeclList ), factory2.createReturnStatement(returnExpr) ); } else { classExpression = factory2.createClassExpression( /*modifiers*/ void 0, node.name, /*typeParameters*/ void 0, heritageClauses, members ); classDefinitionStatements.push(factory2.createReturnStatement(classExpression)); } if (shouldTransformPrivateStaticElementsInClass) { addInternalEmitFlags(classExpression, 32 /* TransformPrivateStaticElements */); for (const member of classExpression.members) { if ((isPrivateIdentifierClassElementDeclaration(member) || isAutoAccessorPropertyDeclaration(member)) && hasStaticModifier(member)) { addInternalEmitFlags(member, 32 /* TransformPrivateStaticElements */); } } } setOriginalNode(classExpression, node); return factory2.createImmediatelyInvokedArrowFunction(factory2.mergeLexicalEnvironment(classDefinitionStatements, lexicalEnvironment)); } function isDecoratedClassLike(node) { return classOrConstructorParameterIsDecorated( /*useLegacyDecorators*/ false, node ) || childIsDecorated( /*useLegacyDecorators*/ false, node ); } function visitClassDeclaration(node) { if (isDecoratedClassLike(node)) { const statements = []; const originalClass = getOriginalNode(node, isClassLike) ?? node; const className = originalClass.name ? factory2.createStringLiteralFromNode(originalClass.name) : factory2.createStringLiteral("default"); const isExport = hasSyntacticModifier(node, 32 /* Export */); const isDefault = hasSyntacticModifier(node, 2048 /* Default */); if (!node.name) { node = injectClassNamedEvaluationHelperBlockIfMissing(context, node, className); } if (isExport && isDefault) { const iife = transformClassLike(node); if (node.name) { const varDecl = factory2.createVariableDeclaration( factory2.getLocalName(node), /*exclamationToken*/ void 0, /*type*/ void 0, iife ); setOriginalNode(varDecl, node); const varDecls = factory2.createVariableDeclarationList([varDecl], 1 /* Let */); const varStatement = factory2.createVariableStatement( /*modifiers*/ void 0, varDecls ); statements.push(varStatement); const exportStatement = factory2.createExportDefault(factory2.getDeclarationName(node)); setOriginalNode(exportStatement, node); setCommentRange(exportStatement, getCommentRange(node)); setSourceMapRange(exportStatement, moveRangePastDecorators(node)); statements.push(exportStatement); } else { const exportStatement = factory2.createExportDefault(iife); setOriginalNode(exportStatement, node); setCommentRange(exportStatement, getCommentRange(node)); setSourceMapRange(exportStatement, moveRangePastDecorators(node)); statements.push(exportStatement); } } else { Debug.assertIsDefined(node.name, "A class declaration that is not a default export must have a name."); const iife = transformClassLike(node); const modifierVisitorNoExport = isExport ? (node2) => isExportModifier(node2) ? void 0 : modifierVisitor(node2) : modifierVisitor; const modifiers = visitNodes2(node.modifiers, modifierVisitorNoExport, isModifier); const declName = factory2.getLocalName( node, /*allowComments*/ false, /*allowSourceMaps*/ true ); const varDecl = factory2.createVariableDeclaration( declName, /*exclamationToken*/ void 0, /*type*/ void 0, iife ); setOriginalNode(varDecl, node); const varDecls = factory2.createVariableDeclarationList([varDecl], 1 /* Let */); const varStatement = factory2.createVariableStatement(modifiers, varDecls); setOriginalNode(varStatement, node); setCommentRange(varStatement, getCommentRange(node)); statements.push(varStatement); if (isExport) { const exportStatement = factory2.createExternalModuleExport(declName); setOriginalNode(exportStatement, node); statements.push(exportStatement); } } return singleOrMany(statements); } else { const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier); const heritageClauses = visitNodes2(node.heritageClauses, visitor, isHeritageClause); enterClass( /*classInfo*/ void 0 ); const members = visitNodes2(node.members, classElementVisitor, isClassElement); exitClass(); return factory2.updateClassDeclaration( node, modifiers, node.name, /*typeParameters*/ void 0, heritageClauses, members ); } } function visitClassExpression(node) { if (isDecoratedClassLike(node)) { const iife = transformClassLike(node); setOriginalNode(iife, node); return iife; } else { const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier); const heritageClauses = visitNodes2(node.heritageClauses, visitor, isHeritageClause); enterClass( /*classInfo*/ void 0 ); const members = visitNodes2(node.members, classElementVisitor, isClassElement); exitClass(); return factory2.updateClassExpression( node, modifiers, node.name, /*typeParameters*/ void 0, heritageClauses, members ); } } function prepareConstructor(_parent, classInfo2) { if (some(classInfo2.pendingInstanceInitializers)) { const statements = []; statements.push( factory2.createExpressionStatement( factory2.inlineExpressions(classInfo2.pendingInstanceInitializers) ) ); classInfo2.pendingInstanceInitializers = void 0; return statements; } } function transformConstructorBodyWorker(statementsOut, statementsIn, statementOffset, superPath, superPathDepth, initializerStatements) { const superStatementIndex = superPath[superPathDepth]; const superStatement = statementsIn[superStatementIndex]; addRange(statementsOut, visitNodes2(statementsIn, visitor, isStatement, statementOffset, superStatementIndex - statementOffset)); if (isTryStatement(superStatement)) { const tryBlockStatements = []; transformConstructorBodyWorker( tryBlockStatements, superStatement.tryBlock.statements, /*statementOffset*/ 0, superPath, superPathDepth + 1, initializerStatements ); const tryBlockStatementsArray = factory2.createNodeArray(tryBlockStatements); setTextRange(tryBlockStatementsArray, superStatement.tryBlock.statements); statementsOut.push(factory2.updateTryStatement( superStatement, factory2.updateBlock(superStatement.tryBlock, tryBlockStatements), visitNode(superStatement.catchClause, visitor, isCatchClause), visitNode(superStatement.finallyBlock, visitor, isBlock) )); } else { addRange(statementsOut, visitNodes2(statementsIn, visitor, isStatement, superStatementIndex, 1)); addRange(statementsOut, initializerStatements); } addRange(statementsOut, visitNodes2(statementsIn, visitor, isStatement, superStatementIndex + 1)); } function visitConstructorDeclaration(node) { enterClassElement(node); const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier); const parameters = visitNodes2(node.parameters, visitor, isParameter); let body; if (node.body && classInfo) { const initializerStatements = prepareConstructor(classInfo.class, classInfo); if (initializerStatements) { const statements = []; const nonPrologueStart = factory2.copyPrologue( node.body.statements, statements, /*ensureUseStrict*/ false, visitor ); const superStatementIndices = findSuperStatementIndexPath(node.body.statements, nonPrologueStart); if (superStatementIndices.length > 0) { transformConstructorBodyWorker(statements, node.body.statements, nonPrologueStart, superStatementIndices, 0, initializerStatements); } else { addRange(statements, initializerStatements); addRange(statements, visitNodes2(node.body.statements, visitor, isStatement)); } body = factory2.createBlock( statements, /*multiLine*/ true ); setOriginalNode(body, node.body); setTextRange(body, node.body); } } body ?? (body = visitNode(node.body, visitor, isBlock)); exitClassElement(); return factory2.updateConstructorDeclaration(node, modifiers, parameters, body); } function finishClassElement(updated, original) { if (updated !== original) { setCommentRange(updated, original); setSourceMapRange(updated, moveRangePastDecorators(original)); } return updated; } function partialTransformClassElement(member, classInfo2, createDescriptor) { let referencedName; let name; let initializersName; let extraInitializersName; let thisArg; let descriptorName; if (!classInfo2) { const modifiers2 = visitNodes2(member.modifiers, modifierVisitor, isModifier); enterName(); name = visitPropertyName(member.name); exitName(); return { modifiers: modifiers2, referencedName, name, initializersName, descriptorName, thisArg }; } const memberDecorators = transformAllDecoratorsOfDeclaration(getAllDecoratorsOfClassElement( member, classInfo2.class, /*useLegacyDecorators*/ false )); const modifiers = visitNodes2(member.modifiers, modifierVisitor, isModifier); if (memberDecorators) { const memberDecoratorsName = createHelperVariable(member, "decorators"); const memberDecoratorsArray = factory2.createArrayLiteralExpression(memberDecorators); const memberDecoratorsAssignment = factory2.createAssignment(memberDecoratorsName, memberDecoratorsArray); const memberInfo = { memberDecoratorsName }; classInfo2.memberInfos ?? (classInfo2.memberInfos = /* @__PURE__ */ new Map()); classInfo2.memberInfos.set(member, memberInfo); pendingExpressions ?? (pendingExpressions = []); pendingExpressions.push(memberDecoratorsAssignment); const statements = isMethodOrAccessor(member) || isAutoAccessorPropertyDeclaration(member) ? isStatic(member) ? classInfo2.staticNonFieldDecorationStatements ?? (classInfo2.staticNonFieldDecorationStatements = []) : classInfo2.nonStaticNonFieldDecorationStatements ?? (classInfo2.nonStaticNonFieldDecorationStatements = []) : isPropertyDeclaration(member) && !isAutoAccessorPropertyDeclaration(member) ? isStatic(member) ? classInfo2.staticFieldDecorationStatements ?? (classInfo2.staticFieldDecorationStatements = []) : classInfo2.nonStaticFieldDecorationStatements ?? (classInfo2.nonStaticFieldDecorationStatements = []) : Debug.fail(); const kind = isGetAccessorDeclaration(member) ? "getter" : isSetAccessorDeclaration(member) ? "setter" : isMethodDeclaration(member) ? "method" : isAutoAccessorPropertyDeclaration(member) ? "accessor" : isPropertyDeclaration(member) ? "field" : Debug.fail(); let propertyName; if (isIdentifier(member.name) || isPrivateIdentifier(member.name)) { propertyName = { computed: false, name: member.name }; } else if (isPropertyNameLiteral(member.name)) { propertyName = { computed: true, name: factory2.createStringLiteralFromNode(member.name) }; } else { const expression = member.name.expression; if (isPropertyNameLiteral(expression) && !isIdentifier(expression)) { propertyName = { computed: true, name: factory2.createStringLiteralFromNode(expression) }; } else { enterName(); ({ referencedName, name } = visitReferencedPropertyName(member.name)); propertyName = { computed: true, name: referencedName }; exitName(); } } const context2 = { kind, name: propertyName, static: isStatic(member), private: isPrivateIdentifier(member.name), access: { // 15.7.3 CreateDecoratorAccessObject (kind, name) // 2. If _kind_ is ~field~, ~method~, ~accessor~, or ~getter~, then ... get: isPropertyDeclaration(member) || isGetAccessorDeclaration(member) || isMethodDeclaration(member), // 3. If _kind_ is ~field~, ~accessor~, or ~setter~, then ... set: isPropertyDeclaration(member) || isSetAccessorDeclaration(member) }, metadata: classInfo2.metadataReference }; if (isMethodOrAccessor(member)) { const methodExtraInitializersName = isStatic(member) ? classInfo2.staticMethodExtraInitializersName : classInfo2.instanceMethodExtraInitializersName; Debug.assertIsDefined(methodExtraInitializersName); let descriptor; if (isPrivateIdentifierClassElementDeclaration(member) && createDescriptor) { descriptor = createDescriptor(member, visitNodes2(modifiers, (node) => tryCast(node, isAsyncModifier), isModifier)); memberInfo.memberDescriptorName = descriptorName = createHelperVariable(member, "descriptor"); descriptor = factory2.createAssignment(descriptorName, descriptor); } const esDecorateExpression = emitHelpers().createESDecorateHelper(factory2.createThis(), descriptor ?? factory2.createNull(), memberDecoratorsName, context2, factory2.createNull(), methodExtraInitializersName); const esDecorateStatement = factory2.createExpressionStatement(esDecorateExpression); setSourceMapRange(esDecorateStatement, moveRangePastDecorators(member)); statements.push(esDecorateStatement); } else if (isPropertyDeclaration(member)) { initializersName = memberInfo.memberInitializersName ?? (memberInfo.memberInitializersName = createHelperVariable(member, "initializers")); extraInitializersName = memberInfo.memberExtraInitializersName ?? (memberInfo.memberExtraInitializersName = createHelperVariable(member, "extraInitializers")); if (isStatic(member)) { thisArg = classInfo2.classThis; } let descriptor; if (isPrivateIdentifierClassElementDeclaration(member) && hasAccessorModifier(member) && createDescriptor) { descriptor = createDescriptor( member, /*modifiers*/ void 0 ); memberInfo.memberDescriptorName = descriptorName = createHelperVariable(member, "descriptor"); descriptor = factory2.createAssignment(descriptorName, descriptor); } const esDecorateExpression = emitHelpers().createESDecorateHelper( isAutoAccessorPropertyDeclaration(member) ? factory2.createThis() : factory2.createNull(), descriptor ?? factory2.createNull(), memberDecoratorsName, context2, initializersName, extraInitializersName ); const esDecorateStatement = factory2.createExpressionStatement(esDecorateExpression); setSourceMapRange(esDecorateStatement, moveRangePastDecorators(member)); statements.push(esDecorateStatement); } } if (name === void 0) { enterName(); name = visitPropertyName(member.name); exitName(); } if (!some(modifiers) && (isMethodDeclaration(member) || isPropertyDeclaration(member))) { setEmitFlags(name, 1024 /* NoLeadingComments */); } return { modifiers, referencedName, name, initializersName, extraInitializersName, descriptorName, thisArg }; } function visitMethodDeclaration(node) { enterClassElement(node); const { modifiers, name, descriptorName } = partialTransformClassElement(node, classInfo, createMethodDescriptorObject); if (descriptorName) { exitClassElement(); return finishClassElement(createMethodDescriptorForwarder(modifiers, name, descriptorName), node); } else { const parameters = visitNodes2(node.parameters, visitor, isParameter); const body = visitNode(node.body, visitor, isBlock); exitClassElement(); return finishClassElement(factory2.updateMethodDeclaration( node, modifiers, node.asteriskToken, name, /*questionToken*/ void 0, /*typeParameters*/ void 0, parameters, /*type*/ void 0, body ), node); } } function visitGetAccessorDeclaration(node) { enterClassElement(node); const { modifiers, name, descriptorName } = partialTransformClassElement(node, classInfo, createGetAccessorDescriptorObject); if (descriptorName) { exitClassElement(); return finishClassElement(createGetAccessorDescriptorForwarder(modifiers, name, descriptorName), node); } else { const parameters = visitNodes2(node.parameters, visitor, isParameter); const body = visitNode(node.body, visitor, isBlock); exitClassElement(); return finishClassElement(factory2.updateGetAccessorDeclaration( node, modifiers, name, parameters, /*type*/ void 0, body ), node); } } function visitSetAccessorDeclaration(node) { enterClassElement(node); const { modifiers, name, descriptorName } = partialTransformClassElement(node, classInfo, createSetAccessorDescriptorObject); if (descriptorName) { exitClassElement(); return finishClassElement(createSetAccessorDescriptorForwarder(modifiers, name, descriptorName), node); } else { const parameters = visitNodes2(node.parameters, visitor, isParameter); const body = visitNode(node.body, visitor, isBlock); exitClassElement(); return finishClassElement(factory2.updateSetAccessorDeclaration(node, modifiers, name, parameters, body), node); } } function visitClassStaticBlockDeclaration(node) { enterClassElement(node); let result; if (isClassNamedEvaluationHelperBlock(node)) { result = visitEachChild(node, visitor, context); } else if (isClassThisAssignmentBlock(node)) { const savedClassThis = classThis; classThis = void 0; result = visitEachChild(node, visitor, context); classThis = savedClassThis; } else { node = visitEachChild(node, visitor, context); result = node; if (classInfo) { classInfo.hasStaticInitializers = true; if (some(classInfo.pendingStaticInitializers)) { const statements = []; for (const initializer of classInfo.pendingStaticInitializers) { const initializerStatement = factory2.createExpressionStatement(initializer); setSourceMapRange(initializerStatement, getSourceMapRange(initializer)); statements.push(initializerStatement); } const body = factory2.createBlock( statements, /*multiLine*/ true ); const staticBlock = factory2.createClassStaticBlockDeclaration(body); result = [staticBlock, result]; classInfo.pendingStaticInitializers = void 0; } } } exitClassElement(); return result; } function visitPropertyDeclaration(node) { if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) { node = transformNamedEvaluation(context, node, canIgnoreEmptyStringLiteralInAssignedName(node.initializer)); } enterClassElement(node); Debug.assert(!isAmbientPropertyDeclaration(node), "Not yet implemented."); const { modifiers, name, initializersName, extraInitializersName, descriptorName, thisArg } = partialTransformClassElement(node, classInfo, hasAccessorModifier(node) ? createAccessorPropertyDescriptorObject : void 0); startLexicalEnvironment(); let initializer = visitNode(node.initializer, visitor, isExpression); if (initializersName) { initializer = emitHelpers().createRunInitializersHelper( thisArg ?? factory2.createThis(), initializersName, initializer ?? factory2.createVoidZero() ); } if (isStatic(node) && classInfo && initializer) { classInfo.hasStaticInitializers = true; } const declarations = endLexicalEnvironment(); if (some(declarations)) { initializer = factory2.createImmediatelyInvokedArrowFunction([ ...declarations, factory2.createReturnStatement(initializer) ]); } if (classInfo) { if (isStatic(node)) { initializer = injectPendingInitializers( classInfo, /*isStatic*/ true, initializer ); if (extraInitializersName) { classInfo.pendingStaticInitializers ?? (classInfo.pendingStaticInitializers = []); classInfo.pendingStaticInitializers.push( emitHelpers().createRunInitializersHelper( classInfo.classThis ?? factory2.createThis(), extraInitializersName ) ); } } else { initializer = injectPendingInitializers( classInfo, /*isStatic*/ false, initializer ); if (extraInitializersName) { classInfo.pendingInstanceInitializers ?? (classInfo.pendingInstanceInitializers = []); classInfo.pendingInstanceInitializers.push( emitHelpers().createRunInitializersHelper( factory2.createThis(), extraInitializersName ) ); } } } exitClassElement(); if (hasAccessorModifier(node) && descriptorName) { const commentRange = getCommentRange(node); const sourceMapRange = getSourceMapRange(node); const name2 = node.name; let getterName = name2; let setterName = name2; if (isComputedPropertyName(name2) && !isSimpleInlineableExpression(name2.expression)) { const cacheAssignment = findComputedPropertyNameCacheAssignment(name2); if (cacheAssignment) { getterName = factory2.updateComputedPropertyName(name2, visitNode(name2.expression, visitor, isExpression)); setterName = factory2.updateComputedPropertyName(name2, cacheAssignment.left); } else { const temp = factory2.createTempVariable(hoistVariableDeclaration); setSourceMapRange(temp, name2.expression); const expression = visitNode(name2.expression, visitor, isExpression); const assignment = factory2.createAssignment(temp, expression); setSourceMapRange(assignment, name2.expression); getterName = factory2.updateComputedPropertyName(name2, assignment); setterName = factory2.updateComputedPropertyName(name2, temp); } } const modifiersWithoutAccessor = visitNodes2(modifiers, (node2) => node2.kind !== 129 /* AccessorKeyword */ ? node2 : void 0, isModifier); const backingField = createAccessorPropertyBackingField(factory2, node, modifiersWithoutAccessor, initializer); setOriginalNode(backingField, node); setEmitFlags(backingField, 3072 /* NoComments */); setSourceMapRange(backingField, sourceMapRange); setSourceMapRange(backingField.name, node.name); const getter = createGetAccessorDescriptorForwarder(modifiersWithoutAccessor, getterName, descriptorName); setOriginalNode(getter, node); setCommentRange(getter, commentRange); setSourceMapRange(getter, sourceMapRange); const setter = createSetAccessorDescriptorForwarder(modifiersWithoutAccessor, setterName, descriptorName); setOriginalNode(setter, node); setEmitFlags(setter, 3072 /* NoComments */); setSourceMapRange(setter, sourceMapRange); return [backingField, getter, setter]; } return finishClassElement(factory2.updatePropertyDeclaration( node, modifiers, name, /*questionOrExclamationToken*/ void 0, /*type*/ void 0, initializer ), node); } function visitThisExpression(node) { return classThis ?? node; } function visitCallExpression(node) { if (isSuperProperty(node.expression) && classThis) { const expression = visitNode(node.expression, visitor, isExpression); const argumentsList = visitNodes2(node.arguments, visitor, isExpression); const invocation = factory2.createFunctionCallCall(expression, classThis, argumentsList); setOriginalNode(invocation, node); setTextRange(invocation, node); return invocation; } return visitEachChild(node, visitor, context); } function visitTaggedTemplateExpression(node) { if (isSuperProperty(node.tag) && classThis) { const tag = visitNode(node.tag, visitor, isExpression); const boundTag = factory2.createFunctionBindCall(tag, classThis, []); setOriginalNode(boundTag, node); setTextRange(boundTag, node); const template = visitNode(node.template, visitor, isTemplateLiteral); return factory2.updateTaggedTemplateExpression( node, boundTag, /*typeArguments*/ void 0, template ); } return visitEachChild(node, visitor, context); } function visitPropertyAccessExpression(node) { if (isSuperProperty(node) && isIdentifier(node.name) && classThis && classSuper) { const propertyName = factory2.createStringLiteralFromNode(node.name); const superProperty = factory2.createReflectGetCall(classSuper, propertyName, classThis); setOriginalNode(superProperty, node.expression); setTextRange(superProperty, node.expression); return superProperty; } return visitEachChild(node, visitor, context); } function visitElementAccessExpression(node) { if (isSuperProperty(node) && classThis && classSuper) { const propertyName = visitNode(node.argumentExpression, visitor, isExpression); const superProperty = factory2.createReflectGetCall(classSuper, propertyName, classThis); setOriginalNode(superProperty, node.expression); setTextRange(superProperty, node.expression); return superProperty; } return visitEachChild(node, visitor, context); } function visitParameterDeclaration(node) { if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) { node = transformNamedEvaluation(context, node, canIgnoreEmptyStringLiteralInAssignedName(node.initializer)); } const updated = factory2.updateParameterDeclaration( node, /*modifiers*/ void 0, node.dotDotDotToken, visitNode(node.name, visitor, isBindingName), /*questionToken*/ void 0, /*type*/ void 0, visitNode(node.initializer, visitor, isExpression) ); if (updated !== node) { setCommentRange(updated, node); setTextRange(updated, moveRangePastModifiers(node)); setSourceMapRange(updated, moveRangePastModifiers(node)); setEmitFlags(updated.name, 64 /* NoTrailingSourceMap */); } return updated; } function isAnonymousClassNeedingAssignedName(node) { return isClassExpression(node) && !node.name && isDecoratedClassLike(node); } function canIgnoreEmptyStringLiteralInAssignedName(node) { const innerExpression = skipOuterExpressions(node); return isClassExpression(innerExpression) && !innerExpression.name && !classOrConstructorParameterIsDecorated( /*useLegacyDecorators*/ false, innerExpression ); } function visitForStatement(node) { return factory2.updateForStatement( node, visitNode(node.initializer, discardedValueVisitor, isForInitializer), visitNode(node.condition, visitor, isExpression), visitNode(node.incrementor, discardedValueVisitor, isExpression), visitIterationBody(node.statement, visitor, context) ); } function visitExpressionStatement(node) { return visitEachChild(node, discardedValueVisitor, context); } function visitBinaryExpression(node, discarded) { if (isDestructuringAssignment(node)) { const left = visitAssignmentPattern(node.left); const right = visitNode(node.right, visitor, isExpression); return factory2.updateBinaryExpression(node, left, node.operatorToken, right); } if (isAssignmentExpression(node)) { if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) { node = transformNamedEvaluation(context, node, canIgnoreEmptyStringLiteralInAssignedName(node.right)); return visitEachChild(node, visitor, context); } if (isSuperProperty(node.left) && classThis && classSuper) { let setterName = isElementAccessExpression(node.left) ? visitNode(node.left.argumentExpression, visitor, isExpression) : isIdentifier(node.left.name) ? factory2.createStringLiteralFromNode(node.left.name) : void 0; if (setterName) { let expression = visitNode(node.right, visitor, isExpression); if (isCompoundAssignment(node.operatorToken.kind)) { let getterName = setterName; if (!isSimpleInlineableExpression(setterName)) { getterName = factory2.createTempVariable(hoistVariableDeclaration); setterName = factory2.createAssignment(getterName, setterName); } const superPropertyGet = factory2.createReflectGetCall( classSuper, getterName, classThis ); setOriginalNode(superPropertyGet, node.left); setTextRange(superPropertyGet, node.left); expression = factory2.createBinaryExpression( superPropertyGet, getNonAssignmentOperatorForCompoundAssignment(node.operatorToken.kind), expression ); setTextRange(expression, node); } const temp = discarded ? void 0 : factory2.createTempVariable(hoistVariableDeclaration); if (temp) { expression = factory2.createAssignment(temp, expression); setTextRange(temp, node); } expression = factory2.createReflectSetCall( classSuper, setterName, expression, classThis ); setOriginalNode(expression, node); setTextRange(expression, node); if (temp) { expression = factory2.createComma(expression, temp); setTextRange(expression, node); } return expression; } } } if (node.operatorToken.kind === 28 /* CommaToken */) { const left = visitNode(node.left, discardedValueVisitor, isExpression); const right = visitNode(node.right, discarded ? discardedValueVisitor : visitor, isExpression); return factory2.updateBinaryExpression(node, left, node.operatorToken, right); } return visitEachChild(node, visitor, context); } function visitPreOrPostfixUnaryExpression(node, discarded) { if (node.operator === 46 /* PlusPlusToken */ || node.operator === 47 /* MinusMinusToken */) { const operand = skipParentheses(node.operand); if (isSuperProperty(operand) && classThis && classSuper) { let setterName = isElementAccessExpression(operand) ? visitNode(operand.argumentExpression, visitor, isExpression) : isIdentifier(operand.name) ? factory2.createStringLiteralFromNode(operand.name) : void 0; if (setterName) { let getterName = setterName; if (!isSimpleInlineableExpression(setterName)) { getterName = factory2.createTempVariable(hoistVariableDeclaration); setterName = factory2.createAssignment(getterName, setterName); } let expression = factory2.createReflectGetCall(classSuper, getterName, classThis); setOriginalNode(expression, node); setTextRange(expression, node); const temp = discarded ? void 0 : factory2.createTempVariable(hoistVariableDeclaration); expression = expandPreOrPostfixIncrementOrDecrementExpression(factory2, node, expression, hoistVariableDeclaration, temp); expression = factory2.createReflectSetCall(classSuper, setterName, expression, classThis); setOriginalNode(expression, node); setTextRange(expression, node); if (temp) { expression = factory2.createComma(expression, temp); setTextRange(expression, node); } return expression; } } } return visitEachChild(node, visitor, context); } function visitCommaListExpression(node, discarded) { const elements = discarded ? visitCommaListElements(node.elements, discardedValueVisitor) : visitCommaListElements(node.elements, visitor, discardedValueVisitor); return factory2.updateCommaListExpression(node, elements); } function visitReferencedPropertyName(node) { if (isPropertyNameLiteral(node) || isPrivateIdentifier(node)) { const referencedName2 = factory2.createStringLiteralFromNode(node); const name2 = visitNode(node, visitor, isPropertyName); return { referencedName: referencedName2, name: name2 }; } if (isPropertyNameLiteral(node.expression) && !isIdentifier(node.expression)) { const referencedName2 = factory2.createStringLiteralFromNode(node.expression); const name2 = visitNode(node, visitor, isPropertyName); return { referencedName: referencedName2, name: name2 }; } const referencedName = factory2.getGeneratedNameForNode(node); hoistVariableDeclaration(referencedName); const key = emitHelpers().createPropKeyHelper(visitNode(node.expression, visitor, isExpression)); const assignment = factory2.createAssignment(referencedName, key); const name = factory2.updateComputedPropertyName(node, injectPendingExpressions(assignment)); return { referencedName, name }; } function visitPropertyName(node) { if (isComputedPropertyName(node)) { return visitComputedPropertyName(node); } return visitNode(node, visitor, isPropertyName); } function visitComputedPropertyName(node) { let expression = visitNode(node.expression, visitor, isExpression); if (!isSimpleInlineableExpression(expression)) { expression = injectPendingExpressions(expression); } return factory2.updateComputedPropertyName(node, expression); } function visitPropertyAssignment(node) { if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) { node = transformNamedEvaluation(context, node, canIgnoreEmptyStringLiteralInAssignedName(node.initializer)); } return visitEachChild(node, visitor, context); } function visitVariableDeclaration(node) { if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) { node = transformNamedEvaluation(context, node, canIgnoreEmptyStringLiteralInAssignedName(node.initializer)); } return visitEachChild(node, visitor, context); } function visitBindingElement(node) { if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) { node = transformNamedEvaluation(context, node, canIgnoreEmptyStringLiteralInAssignedName(node.initializer)); } return visitEachChild(node, visitor, context); } function visitDestructuringAssignmentTarget(node) { if (isObjectLiteralExpression(node) || isArrayLiteralExpression(node)) { return visitAssignmentPattern(node); } if (isSuperProperty(node) && classThis && classSuper) { const propertyName = isElementAccessExpression(node) ? visitNode(node.argumentExpression, visitor, isExpression) : isIdentifier(node.name) ? factory2.createStringLiteralFromNode(node.name) : void 0; if (propertyName) { const paramName = factory2.createTempVariable( /*recordTempVariable*/ void 0 ); const expression = factory2.createAssignmentTargetWrapper( paramName, factory2.createReflectSetCall( classSuper, propertyName, paramName, classThis ) ); setOriginalNode(expression, node); setTextRange(expression, node); return expression; } } return visitEachChild(node, visitor, context); } function visitAssignmentElement(node) { if (isAssignmentExpression( node, /*excludeCompoundAssignment*/ true )) { if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) { node = transformNamedEvaluation(context, node, canIgnoreEmptyStringLiteralInAssignedName(node.right)); } const assignmentTarget = visitDestructuringAssignmentTarget(node.left); const initializer = visitNode(node.right, visitor, isExpression); return factory2.updateBinaryExpression(node, assignmentTarget, node.operatorToken, initializer); } else { return visitDestructuringAssignmentTarget(node); } } function visitAssignmentRestElement(node) { if (isLeftHandSideExpression(node.expression)) { const expression = visitDestructuringAssignmentTarget(node.expression); return factory2.updateSpreadElement(node, expression); } return visitEachChild(node, visitor, context); } function visitArrayAssignmentElement(node) { Debug.assertNode(node, isArrayBindingOrAssignmentElement); if (isSpreadElement(node)) return visitAssignmentRestElement(node); if (!isOmittedExpression(node)) return visitAssignmentElement(node); return visitEachChild(node, visitor, context); } function visitAssignmentProperty(node) { const name = visitNode(node.name, visitor, isPropertyName); if (isAssignmentExpression( node.initializer, /*excludeCompoundAssignment*/ true )) { const assignmentElement = visitAssignmentElement(node.initializer); return factory2.updatePropertyAssignment(node, name, assignmentElement); } if (isLeftHandSideExpression(node.initializer)) { const assignmentElement = visitDestructuringAssignmentTarget(node.initializer); return factory2.updatePropertyAssignment(node, name, assignmentElement); } return visitEachChild(node, visitor, context); } function visitShorthandAssignmentProperty(node) { if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) { node = transformNamedEvaluation(context, node, canIgnoreEmptyStringLiteralInAssignedName(node.objectAssignmentInitializer)); } return visitEachChild(node, visitor, context); } function visitAssignmentRestProperty(node) { if (isLeftHandSideExpression(node.expression)) { const expression = visitDestructuringAssignmentTarget(node.expression); return factory2.updateSpreadAssignment(node, expression); } return visitEachChild(node, visitor, context); } function visitObjectAssignmentElement(node) { Debug.assertNode(node, isObjectBindingOrAssignmentElement); if (isSpreadAssignment(node)) return visitAssignmentRestProperty(node); if (isShorthandPropertyAssignment(node)) return visitShorthandAssignmentProperty(node); if (isPropertyAssignment(node)) return visitAssignmentProperty(node); return visitEachChild(node, visitor, context); } function visitAssignmentPattern(node) { if (isArrayLiteralExpression(node)) { const elements = visitNodes2(node.elements, visitArrayAssignmentElement, isExpression); return factory2.updateArrayLiteralExpression(node, elements); } else { const properties = visitNodes2(node.properties, visitObjectAssignmentElement, isObjectLiteralElementLike); return factory2.updateObjectLiteralExpression(node, properties); } } function visitExportAssignment(node) { if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) { node = transformNamedEvaluation(context, node, canIgnoreEmptyStringLiteralInAssignedName(node.expression)); } return visitEachChild(node, visitor, context); } function visitParenthesizedExpression(node, discarded) { const visitorFunc = discarded ? discardedValueVisitor : visitor; const expression = visitNode(node.expression, visitorFunc, isExpression); return factory2.updateParenthesizedExpression(node, expression); } function visitPartiallyEmittedExpression(node, discarded) { const visitorFunc = discarded ? discardedValueVisitor : visitor; const expression = visitNode(node.expression, visitorFunc, isExpression); return factory2.updatePartiallyEmittedExpression(node, expression); } function injectPendingExpressionsCommon(pendingExpressions2, expression) { if (some(pendingExpressions2)) { if (expression) { if (isParenthesizedExpression(expression)) { pendingExpressions2.push(expression.expression); expression = factory2.updateParenthesizedExpression(expression, factory2.inlineExpressions(pendingExpressions2)); } else { pendingExpressions2.push(expression); expression = factory2.inlineExpressions(pendingExpressions2); } } else { expression = factory2.inlineExpressions(pendingExpressions2); } } return expression; } function injectPendingExpressions(expression) { const result = injectPendingExpressionsCommon(pendingExpressions, expression); Debug.assertIsDefined(result); if (result !== expression) { pendingExpressions = void 0; } return result; } function injectPendingInitializers(classInfo2, isStatic2, expression) { const result = injectPendingExpressionsCommon(isStatic2 ? classInfo2.pendingStaticInitializers : classInfo2.pendingInstanceInitializers, expression); if (result !== expression) { if (isStatic2) { classInfo2.pendingStaticInitializers = void 0; } else { classInfo2.pendingInstanceInitializers = void 0; } } return result; } function transformAllDecoratorsOfDeclaration(allDecorators) { if (!allDecorators) { return void 0; } const decoratorExpressions = []; addRange(decoratorExpressions, map(allDecorators.decorators, transformDecorator)); return decoratorExpressions; } function transformDecorator(decorator) { const expression = visitNode(decorator.expression, visitor, isExpression); setEmitFlags(expression, 3072 /* NoComments */); const innerExpression = skipOuterExpressions(expression); if (isAccessExpression(innerExpression)) { const { target, thisArg } = factory2.createCallBinding( expression, hoistVariableDeclaration, languageVersion, /*cacheIdentifiers*/ true ); return factory2.restoreOuterExpressions(expression, factory2.createFunctionBindCall(target, thisArg, [])); } return expression; } function createDescriptorMethod(original, name, modifiers, asteriskToken, kind, parameters, body) { const func = factory2.createFunctionExpression( modifiers, asteriskToken, /*name*/ void 0, /*typeParameters*/ void 0, parameters, /*type*/ void 0, body ?? factory2.createBlock([]) ); setOriginalNode(func, original); setSourceMapRange(func, moveRangePastDecorators(original)); setEmitFlags(func, 3072 /* NoComments */); const prefix = kind === "get" || kind === "set" ? kind : void 0; const functionName = factory2.createStringLiteralFromNode( name, /*isSingleQuote*/ void 0 ); const namedFunction = emitHelpers().createSetFunctionNameHelper(func, functionName, prefix); const method = factory2.createPropertyAssignment(factory2.createIdentifier(kind), namedFunction); setOriginalNode(method, original); setSourceMapRange(method, moveRangePastDecorators(original)); setEmitFlags(method, 3072 /* NoComments */); return method; } function createMethodDescriptorObject(node, modifiers) { return factory2.createObjectLiteralExpression([ createDescriptorMethod( node, node.name, modifiers, node.asteriskToken, "value", visitNodes2(node.parameters, visitor, isParameter), visitNode(node.body, visitor, isBlock) ) ]); } function createGetAccessorDescriptorObject(node, modifiers) { return factory2.createObjectLiteralExpression([ createDescriptorMethod( node, node.name, modifiers, /*asteriskToken*/ void 0, "get", [], visitNode(node.body, visitor, isBlock) ) ]); } function createSetAccessorDescriptorObject(node, modifiers) { return factory2.createObjectLiteralExpression([ createDescriptorMethod( node, node.name, modifiers, /*asteriskToken*/ void 0, "set", visitNodes2(node.parameters, visitor, isParameter), visitNode(node.body, visitor, isBlock) ) ]); } function createAccessorPropertyDescriptorObject(node, modifiers) { return factory2.createObjectLiteralExpression([ createDescriptorMethod( node, node.name, modifiers, /*asteriskToken*/ void 0, "get", [], factory2.createBlock([ factory2.createReturnStatement( factory2.createPropertyAccessExpression( factory2.createThis(), factory2.getGeneratedPrivateNameForNode(node.name) ) ) ]) ), createDescriptorMethod( node, node.name, modifiers, /*asteriskToken*/ void 0, "set", [factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, "value" )], factory2.createBlock([ factory2.createExpressionStatement( factory2.createAssignment( factory2.createPropertyAccessExpression( factory2.createThis(), factory2.getGeneratedPrivateNameForNode(node.name) ), factory2.createIdentifier("value") ) ) ]) ) ]); } function createMethodDescriptorForwarder(modifiers, name, descriptorName) { modifiers = visitNodes2(modifiers, (node) => isStaticModifier(node) ? node : void 0, isModifier); return factory2.createGetAccessorDeclaration( modifiers, name, [], /*type*/ void 0, factory2.createBlock([ factory2.createReturnStatement( factory2.createPropertyAccessExpression( descriptorName, factory2.createIdentifier("value") ) ) ]) ); } function createGetAccessorDescriptorForwarder(modifiers, name, descriptorName) { modifiers = visitNodes2(modifiers, (node) => isStaticModifier(node) ? node : void 0, isModifier); return factory2.createGetAccessorDeclaration( modifiers, name, [], /*type*/ void 0, factory2.createBlock([ factory2.createReturnStatement( factory2.createFunctionCallCall( factory2.createPropertyAccessExpression( descriptorName, factory2.createIdentifier("get") ), factory2.createThis(), [] ) ) ]) ); } function createSetAccessorDescriptorForwarder(modifiers, name, descriptorName) { modifiers = visitNodes2(modifiers, (node) => isStaticModifier(node) ? node : void 0, isModifier); return factory2.createSetAccessorDeclaration( modifiers, name, [factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, "value" )], factory2.createBlock([ factory2.createReturnStatement( factory2.createFunctionCallCall( factory2.createPropertyAccessExpression( descriptorName, factory2.createIdentifier("set") ), factory2.createThis(), [factory2.createIdentifier("value")] ) ) ]) ); } function createMetadata(name, classSuper2) { const varDecl = factory2.createVariableDeclaration( name, /*exclamationToken*/ void 0, /*type*/ void 0, factory2.createConditionalExpression( factory2.createLogicalAnd( factory2.createTypeCheck(factory2.createIdentifier("Symbol"), "function"), factory2.createPropertyAccessExpression(factory2.createIdentifier("Symbol"), "metadata") ), factory2.createToken(58 /* QuestionToken */), factory2.createCallExpression( factory2.createPropertyAccessExpression(factory2.createIdentifier("Object"), "create"), /*typeArguments*/ void 0, [classSuper2 ? createSymbolMetadataReference(classSuper2) : factory2.createNull()] ), factory2.createToken(59 /* ColonToken */), factory2.createVoidZero() ) ); return factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList([varDecl], 2 /* Const */) ); } function createSymbolMetadata(target, value) { const defineProperty = factory2.createObjectDefinePropertyCall( target, factory2.createPropertyAccessExpression(factory2.createIdentifier("Symbol"), "metadata"), factory2.createPropertyDescriptor( { configurable: true, writable: true, enumerable: true, value }, /*singleLine*/ true ) ); return setEmitFlags( factory2.createIfStatement(value, factory2.createExpressionStatement(defineProperty)), 1 /* SingleLine */ ); } function createSymbolMetadataReference(classSuper2) { return factory2.createBinaryExpression( factory2.createElementAccessExpression( classSuper2, factory2.createPropertyAccessExpression(factory2.createIdentifier("Symbol"), "metadata") ), 61 /* QuestionQuestionToken */, factory2.createNull() ); } } // src/compiler/transformers/es2017.ts function transformES2017(context) { const { factory: factory2, getEmitHelperFactory: emitHelpers, resumeLexicalEnvironment, endLexicalEnvironment, hoistVariableDeclaration } = context; const resolver = context.getEmitResolver(); const compilerOptions = context.getCompilerOptions(); const languageVersion = getEmitScriptTarget(compilerOptions); let enabledSubstitutions = 0 /* None */; let enclosingSuperContainerFlags = 0; let enclosingFunctionParameterNames; let capturedSuperProperties; let hasSuperElementAccess; let lexicalArgumentsBinding; const substitutedSuperAccessors = []; let contextFlags = 0 /* None */; const previousOnEmitNode = context.onEmitNode; const previousOnSubstituteNode = context.onSubstituteNode; context.onEmitNode = onEmitNode; context.onSubstituteNode = onSubstituteNode; return chainBundle(context, transformSourceFile); function transformSourceFile(node) { if (node.isDeclarationFile) { return node; } setContextFlag(1 /* NonTopLevel */, false); setContextFlag(2 /* HasLexicalThis */, !isEffectiveStrictModeSourceFile(node, compilerOptions)); const visited = visitEachChild(node, visitor, context); addEmitHelpers(visited, context.readEmitHelpers()); return visited; } function setContextFlag(flag, val) { contextFlags = val ? contextFlags | flag : contextFlags & ~flag; } function inContext(flags) { return (contextFlags & flags) !== 0; } function inTopLevelContext() { return !inContext(1 /* NonTopLevel */); } function inHasLexicalThisContext() { return inContext(2 /* HasLexicalThis */); } function doWithContext(flags, cb, value) { const contextFlagsToSet = flags & ~contextFlags; if (contextFlagsToSet) { setContextFlag( contextFlagsToSet, /*val*/ true ); const result = cb(value); setContextFlag( contextFlagsToSet, /*val*/ false ); return result; } return cb(value); } function visitDefault(node) { return visitEachChild(node, visitor, context); } function argumentsVisitor(node) { switch (node.kind) { case 219 /* FunctionExpression */: case 263 /* FunctionDeclaration */: case 175 /* MethodDeclaration */: case 178 /* GetAccessor */: case 179 /* SetAccessor */: case 177 /* Constructor */: return node; case 170 /* Parameter */: case 209 /* BindingElement */: case 261 /* VariableDeclaration */: break; case 80 /* Identifier */: if (lexicalArgumentsBinding && resolver.isArgumentsLocalBinding(node)) { return lexicalArgumentsBinding; } break; } return visitEachChild(node, argumentsVisitor, context); } function visitor(node) { if ((node.transformFlags & 256 /* ContainsES2017 */) === 0) { return lexicalArgumentsBinding ? argumentsVisitor(node) : node; } switch (node.kind) { case 134 /* AsyncKeyword */: return void 0; case 224 /* AwaitExpression */: return visitAwaitExpression(node); case 175 /* MethodDeclaration */: return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitMethodDeclaration, node); case 263 /* FunctionDeclaration */: return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitFunctionDeclaration, node); case 219 /* FunctionExpression */: return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitFunctionExpression, node); case 220 /* ArrowFunction */: return doWithContext(1 /* NonTopLevel */, visitArrowFunction, node); case 212 /* PropertyAccessExpression */: if (capturedSuperProperties && isPropertyAccessExpression(node) && node.expression.kind === 108 /* SuperKeyword */) { capturedSuperProperties.add(node.name.escapedText); } return visitEachChild(node, visitor, context); case 213 /* ElementAccessExpression */: if (capturedSuperProperties && node.expression.kind === 108 /* SuperKeyword */) { hasSuperElementAccess = true; } return visitEachChild(node, visitor, context); case 178 /* GetAccessor */: return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitGetAccessorDeclaration, node); case 179 /* SetAccessor */: return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitSetAccessorDeclaration, node); case 177 /* Constructor */: return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitConstructorDeclaration, node); case 264 /* ClassDeclaration */: case 232 /* ClassExpression */: return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitDefault, node); default: return visitEachChild(node, visitor, context); } } function asyncBodyVisitor(node) { if (isNodeWithPossibleHoistedDeclaration(node)) { switch (node.kind) { case 244 /* VariableStatement */: return visitVariableStatementInAsyncBody(node); case 249 /* ForStatement */: return visitForStatementInAsyncBody(node); case 250 /* ForInStatement */: return visitForInStatementInAsyncBody(node); case 251 /* ForOfStatement */: return visitForOfStatementInAsyncBody(node); case 300 /* CatchClause */: return visitCatchClauseInAsyncBody(node); case 242 /* Block */: case 256 /* SwitchStatement */: case 270 /* CaseBlock */: case 297 /* CaseClause */: case 298 /* DefaultClause */: case 259 /* TryStatement */: case 247 /* DoStatement */: case 248 /* WhileStatement */: case 246 /* IfStatement */: case 255 /* WithStatement */: case 257 /* LabeledStatement */: return visitEachChild(node, asyncBodyVisitor, context); default: return Debug.assertNever(node, "Unhandled node."); } } return visitor(node); } function visitCatchClauseInAsyncBody(node) { const catchClauseNames = /* @__PURE__ */ new Set(); recordDeclarationName(node.variableDeclaration, catchClauseNames); let catchClauseUnshadowedNames; catchClauseNames.forEach((_, escapedName) => { if (enclosingFunctionParameterNames.has(escapedName)) { if (!catchClauseUnshadowedNames) { catchClauseUnshadowedNames = new Set(enclosingFunctionParameterNames); } catchClauseUnshadowedNames.delete(escapedName); } }); if (catchClauseUnshadowedNames) { const savedEnclosingFunctionParameterNames = enclosingFunctionParameterNames; enclosingFunctionParameterNames = catchClauseUnshadowedNames; const result = visitEachChild(node, asyncBodyVisitor, context); enclosingFunctionParameterNames = savedEnclosingFunctionParameterNames; return result; } else { return visitEachChild(node, asyncBodyVisitor, context); } } function visitVariableStatementInAsyncBody(node) { if (isVariableDeclarationListWithCollidingName(node.declarationList)) { const expression = visitVariableDeclarationListWithCollidingNames( node.declarationList, /*hasReceiver*/ false ); return expression ? factory2.createExpressionStatement(expression) : void 0; } return visitEachChild(node, visitor, context); } function visitForInStatementInAsyncBody(node) { return factory2.updateForInStatement( node, isVariableDeclarationListWithCollidingName(node.initializer) ? visitVariableDeclarationListWithCollidingNames( node.initializer, /*hasReceiver*/ true ) : Debug.checkDefined(visitNode(node.initializer, visitor, isForInitializer)), Debug.checkDefined(visitNode(node.expression, visitor, isExpression)), visitIterationBody(node.statement, asyncBodyVisitor, context) ); } function visitForOfStatementInAsyncBody(node) { return factory2.updateForOfStatement( node, visitNode(node.awaitModifier, visitor, isAwaitKeyword), isVariableDeclarationListWithCollidingName(node.initializer) ? visitVariableDeclarationListWithCollidingNames( node.initializer, /*hasReceiver*/ true ) : Debug.checkDefined(visitNode(node.initializer, visitor, isForInitializer)), Debug.checkDefined(visitNode(node.expression, visitor, isExpression)), visitIterationBody(node.statement, asyncBodyVisitor, context) ); } function visitForStatementInAsyncBody(node) { const initializer = node.initializer; return factory2.updateForStatement( node, isVariableDeclarationListWithCollidingName(initializer) ? visitVariableDeclarationListWithCollidingNames( initializer, /*hasReceiver*/ false ) : visitNode(node.initializer, visitor, isForInitializer), visitNode(node.condition, visitor, isExpression), visitNode(node.incrementor, visitor, isExpression), visitIterationBody(node.statement, asyncBodyVisitor, context) ); } function visitAwaitExpression(node) { if (inTopLevelContext()) { return visitEachChild(node, visitor, context); } return setOriginalNode( setTextRange( factory2.createYieldExpression( /*asteriskToken*/ void 0, visitNode(node.expression, visitor, isExpression) ), node ), node ); } function visitConstructorDeclaration(node) { const savedLexicalArgumentsBinding = lexicalArgumentsBinding; lexicalArgumentsBinding = void 0; const updated = factory2.updateConstructorDeclaration( node, visitNodes2(node.modifiers, visitor, isModifier), visitParameterList(node.parameters, visitor, context), transformMethodBody(node) ); lexicalArgumentsBinding = savedLexicalArgumentsBinding; return updated; } function visitMethodDeclaration(node) { let parameters; const functionFlags = getFunctionFlags(node); const savedLexicalArgumentsBinding = lexicalArgumentsBinding; lexicalArgumentsBinding = void 0; const updated = factory2.updateMethodDeclaration( node, visitNodes2(node.modifiers, visitor, isModifierLike), node.asteriskToken, node.name, /*questionToken*/ void 0, /*typeParameters*/ void 0, parameters = functionFlags & 2 /* Async */ ? transformAsyncFunctionParameterList(node) : visitParameterList(node.parameters, visitor, context), /*type*/ void 0, functionFlags & 2 /* Async */ ? transformAsyncFunctionBody(node, parameters) : transformMethodBody(node) ); lexicalArgumentsBinding = savedLexicalArgumentsBinding; return updated; } function visitGetAccessorDeclaration(node) { const savedLexicalArgumentsBinding = lexicalArgumentsBinding; lexicalArgumentsBinding = void 0; const updated = factory2.updateGetAccessorDeclaration( node, visitNodes2(node.modifiers, visitor, isModifierLike), node.name, visitParameterList(node.parameters, visitor, context), /*type*/ void 0, transformMethodBody(node) ); lexicalArgumentsBinding = savedLexicalArgumentsBinding; return updated; } function visitSetAccessorDeclaration(node) { const savedLexicalArgumentsBinding = lexicalArgumentsBinding; lexicalArgumentsBinding = void 0; const updated = factory2.updateSetAccessorDeclaration( node, visitNodes2(node.modifiers, visitor, isModifierLike), node.name, visitParameterList(node.parameters, visitor, context), transformMethodBody(node) ); lexicalArgumentsBinding = savedLexicalArgumentsBinding; return updated; } function visitFunctionDeclaration(node) { let parameters; const savedLexicalArgumentsBinding = lexicalArgumentsBinding; lexicalArgumentsBinding = void 0; const functionFlags = getFunctionFlags(node); const updated = factory2.updateFunctionDeclaration( node, visitNodes2(node.modifiers, visitor, isModifierLike), node.asteriskToken, node.name, /*typeParameters*/ void 0, parameters = functionFlags & 2 /* Async */ ? transformAsyncFunctionParameterList(node) : visitParameterList(node.parameters, visitor, context), /*type*/ void 0, functionFlags & 2 /* Async */ ? transformAsyncFunctionBody(node, parameters) : visitFunctionBody(node.body, visitor, context) ); lexicalArgumentsBinding = savedLexicalArgumentsBinding; return updated; } function visitFunctionExpression(node) { let parameters; const savedLexicalArgumentsBinding = lexicalArgumentsBinding; lexicalArgumentsBinding = void 0; const functionFlags = getFunctionFlags(node); const updated = factory2.updateFunctionExpression( node, visitNodes2(node.modifiers, visitor, isModifier), node.asteriskToken, node.name, /*typeParameters*/ void 0, parameters = functionFlags & 2 /* Async */ ? transformAsyncFunctionParameterList(node) : visitParameterList(node.parameters, visitor, context), /*type*/ void 0, functionFlags & 2 /* Async */ ? transformAsyncFunctionBody(node, parameters) : visitFunctionBody(node.body, visitor, context) ); lexicalArgumentsBinding = savedLexicalArgumentsBinding; return updated; } function visitArrowFunction(node) { let parameters; const functionFlags = getFunctionFlags(node); return factory2.updateArrowFunction( node, visitNodes2(node.modifiers, visitor, isModifier), /*typeParameters*/ void 0, parameters = functionFlags & 2 /* Async */ ? transformAsyncFunctionParameterList(node) : visitParameterList(node.parameters, visitor, context), /*type*/ void 0, node.equalsGreaterThanToken, functionFlags & 2 /* Async */ ? transformAsyncFunctionBody(node, parameters) : visitFunctionBody(node.body, visitor, context) ); } function recordDeclarationName({ name }, names) { if (isIdentifier(name)) { names.add(name.escapedText); } else { for (const element of name.elements) { if (!isOmittedExpression(element)) { recordDeclarationName(element, names); } } } } function isVariableDeclarationListWithCollidingName(node) { return !!node && isVariableDeclarationList(node) && !(node.flags & 7 /* BlockScoped */) && node.declarations.some(collidesWithParameterName); } function visitVariableDeclarationListWithCollidingNames(node, hasReceiver) { hoistVariableDeclarationList(node); const variables = getInitializedVariables(node); if (variables.length === 0) { if (hasReceiver) { return visitNode(factory2.converters.convertToAssignmentElementTarget(node.declarations[0].name), visitor, isExpression); } return void 0; } return factory2.inlineExpressions(map(variables, transformInitializedVariable)); } function hoistVariableDeclarationList(node) { forEach(node.declarations, hoistVariable); } function hoistVariable({ name }) { if (isIdentifier(name)) { hoistVariableDeclaration(name); } else { for (const element of name.elements) { if (!isOmittedExpression(element)) { hoistVariable(element); } } } } function transformInitializedVariable(node) { const converted = setSourceMapRange( factory2.createAssignment( factory2.converters.convertToAssignmentElementTarget(node.name), node.initializer ), node ); return Debug.checkDefined(visitNode(converted, visitor, isExpression)); } function collidesWithParameterName({ name }) { if (isIdentifier(name)) { return enclosingFunctionParameterNames.has(name.escapedText); } else { for (const element of name.elements) { if (!isOmittedExpression(element) && collidesWithParameterName(element)) { return true; } } } return false; } function transformMethodBody(node) { Debug.assertIsDefined(node.body); const savedCapturedSuperProperties = capturedSuperProperties; const savedHasSuperElementAccess = hasSuperElementAccess; capturedSuperProperties = /* @__PURE__ */ new Set(); hasSuperElementAccess = false; let updated = visitFunctionBody(node.body, visitor, context); const originalMethod = getOriginalNode(node, isFunctionLikeDeclaration); const emitSuperHelpers = languageVersion >= 2 /* ES2015 */ && (resolver.hasNodeCheckFlag(node, 256 /* MethodWithSuperPropertyAssignmentInAsync */) || resolver.hasNodeCheckFlag(node, 128 /* MethodWithSuperPropertyAccessInAsync */)) && (getFunctionFlags(originalMethod) & 3 /* AsyncGenerator */) !== 3 /* AsyncGenerator */; if (emitSuperHelpers) { enableSubstitutionForAsyncMethodsWithSuper(); if (capturedSuperProperties.size) { const variableStatement = createSuperAccessVariableStatement(factory2, resolver, node, capturedSuperProperties); substitutedSuperAccessors[getNodeId(variableStatement)] = true; const statements = updated.statements.slice(); insertStatementsAfterStandardPrologue(statements, [variableStatement]); updated = factory2.updateBlock(updated, statements); } if (hasSuperElementAccess) { if (resolver.hasNodeCheckFlag(node, 256 /* MethodWithSuperPropertyAssignmentInAsync */)) { addEmitHelper(updated, advancedAsyncSuperHelper); } else if (resolver.hasNodeCheckFlag(node, 128 /* MethodWithSuperPropertyAccessInAsync */)) { addEmitHelper(updated, asyncSuperHelper); } } } capturedSuperProperties = savedCapturedSuperProperties; hasSuperElementAccess = savedHasSuperElementAccess; return updated; } function createCaptureArgumentsStatement() { Debug.assert(lexicalArgumentsBinding); const variable = factory2.createVariableDeclaration( lexicalArgumentsBinding, /*exclamationToken*/ void 0, /*type*/ void 0, factory2.createIdentifier("arguments") ); const statement = factory2.createVariableStatement( /*modifiers*/ void 0, [variable] ); startOnNewLine(statement); addEmitFlags(statement, 2097152 /* CustomPrologue */); return statement; } function transformAsyncFunctionParameterList(node) { if (isSimpleParameterList(node.parameters)) { return visitParameterList(node.parameters, visitor, context); } const newParameters = []; for (const parameter of node.parameters) { if (parameter.initializer || parameter.dotDotDotToken) { if (node.kind === 220 /* ArrowFunction */) { const restParameter = factory2.createParameterDeclaration( /*modifiers*/ void 0, factory2.createToken(26 /* DotDotDotToken */), factory2.createUniqueName("args", 8 /* ReservedInNestedScopes */) ); newParameters.push(restParameter); } break; } const newParameter = factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, factory2.getGeneratedNameForNode(parameter.name, 8 /* ReservedInNestedScopes */) ); newParameters.push(newParameter); } const newParametersArray = factory2.createNodeArray(newParameters); setTextRange(newParametersArray, node.parameters); return newParametersArray; } function transformAsyncFunctionBody(node, outerParameters) { const innerParameters = !isSimpleParameterList(node.parameters) ? visitParameterList(node.parameters, visitor, context) : void 0; resumeLexicalEnvironment(); const original = getOriginalNode(node, isFunctionLike); const nodeType = original.type; const promiseConstructor = languageVersion < 2 /* ES2015 */ ? getPromiseConstructor(nodeType) : void 0; const isArrowFunction2 = node.kind === 220 /* ArrowFunction */; const savedLexicalArgumentsBinding = lexicalArgumentsBinding; const hasLexicalArguments = resolver.hasNodeCheckFlag(node, 512 /* CaptureArguments */); const captureLexicalArguments = hasLexicalArguments && !lexicalArgumentsBinding; if (captureLexicalArguments) { lexicalArgumentsBinding = factory2.createUniqueName("arguments"); } let argumentsExpression; if (innerParameters) { if (isArrowFunction2) { const parameterBindings = []; Debug.assert(outerParameters.length <= node.parameters.length); for (let i = 0; i < node.parameters.length; i++) { Debug.assert(i < outerParameters.length); const originalParameter = node.parameters[i]; const outerParameter = outerParameters[i]; Debug.assertNode(outerParameter.name, isIdentifier); if (originalParameter.initializer || originalParameter.dotDotDotToken) { Debug.assert(i === outerParameters.length - 1); parameterBindings.push(factory2.createSpreadElement(outerParameter.name)); break; } parameterBindings.push(outerParameter.name); } argumentsExpression = factory2.createArrayLiteralExpression(parameterBindings); } else { argumentsExpression = factory2.createIdentifier("arguments"); } } const savedEnclosingFunctionParameterNames = enclosingFunctionParameterNames; enclosingFunctionParameterNames = /* @__PURE__ */ new Set(); for (const parameter of node.parameters) { recordDeclarationName(parameter, enclosingFunctionParameterNames); } const savedCapturedSuperProperties = capturedSuperProperties; const savedHasSuperElementAccess = hasSuperElementAccess; if (!isArrowFunction2) { capturedSuperProperties = /* @__PURE__ */ new Set(); hasSuperElementAccess = false; } const hasLexicalThis = inHasLexicalThisContext(); let asyncBody = transformAsyncFunctionBodyWorker(node.body); asyncBody = factory2.updateBlock(asyncBody, factory2.mergeLexicalEnvironment(asyncBody.statements, endLexicalEnvironment())); let result; if (!isArrowFunction2) { const statements = []; statements.push( factory2.createReturnStatement( emitHelpers().createAwaiterHelper( hasLexicalThis, argumentsExpression, promiseConstructor, innerParameters, asyncBody ) ) ); const emitSuperHelpers = languageVersion >= 2 /* ES2015 */ && (resolver.hasNodeCheckFlag(node, 256 /* MethodWithSuperPropertyAssignmentInAsync */) || resolver.hasNodeCheckFlag(node, 128 /* MethodWithSuperPropertyAccessInAsync */)); if (emitSuperHelpers) { enableSubstitutionForAsyncMethodsWithSuper(); if (capturedSuperProperties.size) { const variableStatement = createSuperAccessVariableStatement(factory2, resolver, node, capturedSuperProperties); substitutedSuperAccessors[getNodeId(variableStatement)] = true; insertStatementsAfterStandardPrologue(statements, [variableStatement]); } } if (captureLexicalArguments) { insertStatementsAfterStandardPrologue(statements, [createCaptureArgumentsStatement()]); } const block = factory2.createBlock( statements, /*multiLine*/ true ); setTextRange(block, node.body); if (emitSuperHelpers && hasSuperElementAccess) { if (resolver.hasNodeCheckFlag(node, 256 /* MethodWithSuperPropertyAssignmentInAsync */)) { addEmitHelper(block, advancedAsyncSuperHelper); } else if (resolver.hasNodeCheckFlag(node, 128 /* MethodWithSuperPropertyAccessInAsync */)) { addEmitHelper(block, asyncSuperHelper); } } result = block; } else { result = emitHelpers().createAwaiterHelper( hasLexicalThis, argumentsExpression, promiseConstructor, innerParameters, asyncBody ); if (captureLexicalArguments) { const block = factory2.converters.convertToFunctionBlock(result); result = factory2.updateBlock(block, factory2.mergeLexicalEnvironment(block.statements, [createCaptureArgumentsStatement()])); } } enclosingFunctionParameterNames = savedEnclosingFunctionParameterNames; if (!isArrowFunction2) { capturedSuperProperties = savedCapturedSuperProperties; hasSuperElementAccess = savedHasSuperElementAccess; lexicalArgumentsBinding = savedLexicalArgumentsBinding; } return result; } function transformAsyncFunctionBodyWorker(body, start) { if (isBlock(body)) { return factory2.updateBlock(body, visitNodes2(body.statements, asyncBodyVisitor, isStatement, start)); } else { return factory2.converters.convertToFunctionBlock(Debug.checkDefined(visitNode(body, asyncBodyVisitor, isConciseBody))); } } function getPromiseConstructor(type) { const typeName = type && getEntityNameFromTypeNode(type); if (typeName && isEntityName(typeName)) { const serializationKind = resolver.getTypeReferenceSerializationKind(typeName); if (serializationKind === 1 /* TypeWithConstructSignatureAndValue */ || serializationKind === 0 /* Unknown */) { return typeName; } } return void 0; } function enableSubstitutionForAsyncMethodsWithSuper() { if ((enabledSubstitutions & 1 /* AsyncMethodsWithSuper */) === 0) { enabledSubstitutions |= 1 /* AsyncMethodsWithSuper */; context.enableSubstitution(214 /* CallExpression */); context.enableSubstitution(212 /* PropertyAccessExpression */); context.enableSubstitution(213 /* ElementAccessExpression */); context.enableEmitNotification(264 /* ClassDeclaration */); context.enableEmitNotification(175 /* MethodDeclaration */); context.enableEmitNotification(178 /* GetAccessor */); context.enableEmitNotification(179 /* SetAccessor */); context.enableEmitNotification(177 /* Constructor */); context.enableEmitNotification(244 /* VariableStatement */); } } function onEmitNode(hint, node, emitCallback) { if (enabledSubstitutions & 1 /* AsyncMethodsWithSuper */ && isSuperContainer(node)) { const superContainerFlags = (resolver.hasNodeCheckFlag(node, 128 /* MethodWithSuperPropertyAccessInAsync */) ? 128 /* MethodWithSuperPropertyAccessInAsync */ : 0) | (resolver.hasNodeCheckFlag(node, 256 /* MethodWithSuperPropertyAssignmentInAsync */) ? 256 /* MethodWithSuperPropertyAssignmentInAsync */ : 0); if (superContainerFlags !== enclosingSuperContainerFlags) { const savedEnclosingSuperContainerFlags = enclosingSuperContainerFlags; enclosingSuperContainerFlags = superContainerFlags; previousOnEmitNode(hint, node, emitCallback); enclosingSuperContainerFlags = savedEnclosingSuperContainerFlags; return; } } else if (enabledSubstitutions && substitutedSuperAccessors[getNodeId(node)]) { const savedEnclosingSuperContainerFlags = enclosingSuperContainerFlags; enclosingSuperContainerFlags = 0; previousOnEmitNode(hint, node, emitCallback); enclosingSuperContainerFlags = savedEnclosingSuperContainerFlags; return; } previousOnEmitNode(hint, node, emitCallback); } function onSubstituteNode(hint, node) { node = previousOnSubstituteNode(hint, node); if (hint === 1 /* Expression */ && enclosingSuperContainerFlags) { return substituteExpression(node); } return node; } function substituteExpression(node) { switch (node.kind) { case 212 /* PropertyAccessExpression */: return substitutePropertyAccessExpression(node); case 213 /* ElementAccessExpression */: return substituteElementAccessExpression(node); case 214 /* CallExpression */: return substituteCallExpression(node); } return node; } function substitutePropertyAccessExpression(node) { if (node.expression.kind === 108 /* SuperKeyword */) { return setTextRange( factory2.createPropertyAccessExpression( factory2.createUniqueName("_super", 16 /* Optimistic */ | 32 /* FileLevel */), node.name ), node ); } return node; } function substituteElementAccessExpression(node) { if (node.expression.kind === 108 /* SuperKeyword */) { return createSuperElementAccessInAsyncMethod( node.argumentExpression, node ); } return node; } function substituteCallExpression(node) { const expression = node.expression; if (isSuperProperty(expression)) { const argumentExpression = isPropertyAccessExpression(expression) ? substitutePropertyAccessExpression(expression) : substituteElementAccessExpression(expression); return factory2.createCallExpression( factory2.createPropertyAccessExpression(argumentExpression, "call"), /*typeArguments*/ void 0, [ factory2.createThis(), ...node.arguments ] ); } return node; } function isSuperContainer(node) { const kind = node.kind; return kind === 264 /* ClassDeclaration */ || kind === 177 /* Constructor */ || kind === 175 /* MethodDeclaration */ || kind === 178 /* GetAccessor */ || kind === 179 /* SetAccessor */; } function createSuperElementAccessInAsyncMethod(argumentExpression, location) { if (enclosingSuperContainerFlags & 256 /* MethodWithSuperPropertyAssignmentInAsync */) { return setTextRange( factory2.createPropertyAccessExpression( factory2.createCallExpression( factory2.createUniqueName("_superIndex", 16 /* Optimistic */ | 32 /* FileLevel */), /*typeArguments*/ void 0, [argumentExpression] ), "value" ), location ); } else { return setTextRange( factory2.createCallExpression( factory2.createUniqueName("_superIndex", 16 /* Optimistic */ | 32 /* FileLevel */), /*typeArguments*/ void 0, [argumentExpression] ), location ); } } } function createSuperAccessVariableStatement(factory2, resolver, node, names) { const hasBinding = resolver.hasNodeCheckFlag(node, 256 /* MethodWithSuperPropertyAssignmentInAsync */); const accessors = []; names.forEach((_, key) => { const name = unescapeLeadingUnderscores(key); const getterAndSetter = []; getterAndSetter.push(factory2.createPropertyAssignment( "get", factory2.createArrowFunction( /*modifiers*/ void 0, /*typeParameters*/ void 0, /* parameters */ [], /*type*/ void 0, /*equalsGreaterThanToken*/ void 0, setEmitFlags( factory2.createPropertyAccessExpression( setEmitFlags( factory2.createSuper(), 8 /* NoSubstitution */ ), name ), 8 /* NoSubstitution */ ) ) )); if (hasBinding) { getterAndSetter.push( factory2.createPropertyAssignment( "set", factory2.createArrowFunction( /*modifiers*/ void 0, /*typeParameters*/ void 0, /* parameters */ [ factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, "v", /*questionToken*/ void 0, /*type*/ void 0, /*initializer*/ void 0 ) ], /*type*/ void 0, /*equalsGreaterThanToken*/ void 0, factory2.createAssignment( setEmitFlags( factory2.createPropertyAccessExpression( setEmitFlags( factory2.createSuper(), 8 /* NoSubstitution */ ), name ), 8 /* NoSubstitution */ ), factory2.createIdentifier("v") ) ) ) ); } accessors.push( factory2.createPropertyAssignment( name, factory2.createObjectLiteralExpression(getterAndSetter) ) ); }); return factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList( [ factory2.createVariableDeclaration( factory2.createUniqueName("_super", 16 /* Optimistic */ | 32 /* FileLevel */), /*exclamationToken*/ void 0, /*type*/ void 0, factory2.createCallExpression( factory2.createPropertyAccessExpression( factory2.createIdentifier("Object"), "create" ), /*typeArguments*/ void 0, [ factory2.createNull(), factory2.createObjectLiteralExpression( accessors, /*multiLine*/ true ) ] ) ) ], 2 /* Const */ ) ); } // src/compiler/transformers/es2018.ts function transformES2018(context) { const { factory: factory2, getEmitHelperFactory: emitHelpers, resumeLexicalEnvironment, endLexicalEnvironment, hoistVariableDeclaration } = context; const resolver = context.getEmitResolver(); const compilerOptions = context.getCompilerOptions(); const languageVersion = getEmitScriptTarget(compilerOptions); const previousOnEmitNode = context.onEmitNode; context.onEmitNode = onEmitNode; const previousOnSubstituteNode = context.onSubstituteNode; context.onSubstituteNode = onSubstituteNode; let exportedVariableStatement = false; let enabledSubstitutions = 0 /* None */; let enclosingFunctionFlags; let parametersWithPrecedingObjectRestOrSpread; let enclosingSuperContainerFlags = 0; let hierarchyFacts = 0; let currentSourceFile; let taggedTemplateStringDeclarations; let capturedSuperProperties; let hasSuperElementAccess; const substitutedSuperAccessors = []; return chainBundle(context, transformSourceFile); function affectsSubtree(excludeFacts, includeFacts) { return hierarchyFacts !== (hierarchyFacts & ~excludeFacts | includeFacts); } function enterSubtree(excludeFacts, includeFacts) { const ancestorFacts = hierarchyFacts; hierarchyFacts = (hierarchyFacts & ~excludeFacts | includeFacts) & 3 /* AncestorFactsMask */; return ancestorFacts; } function exitSubtree(ancestorFacts) { hierarchyFacts = ancestorFacts; } function recordTaggedTemplateString(temp) { taggedTemplateStringDeclarations = append( taggedTemplateStringDeclarations, factory2.createVariableDeclaration(temp) ); } function transformSourceFile(node) { if (node.isDeclarationFile) { return node; } currentSourceFile = node; const visited = visitSourceFile(node); addEmitHelpers(visited, context.readEmitHelpers()); currentSourceFile = void 0; taggedTemplateStringDeclarations = void 0; return visited; } function visitor(node) { return visitorWorker( node, /*expressionResultIsUnused*/ false ); } function visitorWithUnusedExpressionResult(node) { return visitorWorker( node, /*expressionResultIsUnused*/ true ); } function visitorNoAsyncModifier(node) { if (node.kind === 134 /* AsyncKeyword */) { return void 0; } return node; } function doWithHierarchyFacts(cb, value, excludeFacts, includeFacts) { if (affectsSubtree(excludeFacts, includeFacts)) { const ancestorFacts = enterSubtree(excludeFacts, includeFacts); const result = cb(value); exitSubtree(ancestorFacts); return result; } return cb(value); } function visitDefault(node) { return visitEachChild(node, visitor, context); } function visitorWorker(node, expressionResultIsUnused2) { if ((node.transformFlags & 128 /* ContainsES2018 */) === 0) { return node; } switch (node.kind) { case 224 /* AwaitExpression */: return visitAwaitExpression(node); case 230 /* YieldExpression */: return visitYieldExpression(node); case 254 /* ReturnStatement */: return visitReturnStatement(node); case 257 /* LabeledStatement */: return visitLabeledStatement(node); case 211 /* ObjectLiteralExpression */: return visitObjectLiteralExpression(node); case 227 /* BinaryExpression */: return visitBinaryExpression(node, expressionResultIsUnused2); case 357 /* CommaListExpression */: return visitCommaListExpression(node, expressionResultIsUnused2); case 300 /* CatchClause */: return visitCatchClause(node); case 244 /* VariableStatement */: return visitVariableStatement(node); case 261 /* VariableDeclaration */: return visitVariableDeclaration(node); case 247 /* DoStatement */: case 248 /* WhileStatement */: case 250 /* ForInStatement */: return doWithHierarchyFacts( visitDefault, node, 0 /* IterationStatementExcludes */, 2 /* IterationStatementIncludes */ ); case 251 /* ForOfStatement */: return visitForOfStatement( node, /*outermostLabeledStatement*/ void 0 ); case 249 /* ForStatement */: return doWithHierarchyFacts( visitForStatement, node, 0 /* IterationStatementExcludes */, 2 /* IterationStatementIncludes */ ); case 223 /* VoidExpression */: return visitVoidExpression(node); case 177 /* Constructor */: return doWithHierarchyFacts( visitConstructorDeclaration, node, 2 /* ClassOrFunctionExcludes */, 1 /* ClassOrFunctionIncludes */ ); case 175 /* MethodDeclaration */: return doWithHierarchyFacts( visitMethodDeclaration, node, 2 /* ClassOrFunctionExcludes */, 1 /* ClassOrFunctionIncludes */ ); case 178 /* GetAccessor */: return doWithHierarchyFacts( visitGetAccessorDeclaration, node, 2 /* ClassOrFunctionExcludes */, 1 /* ClassOrFunctionIncludes */ ); case 179 /* SetAccessor */: return doWithHierarchyFacts( visitSetAccessorDeclaration, node, 2 /* ClassOrFunctionExcludes */, 1 /* ClassOrFunctionIncludes */ ); case 263 /* FunctionDeclaration */: return doWithHierarchyFacts( visitFunctionDeclaration, node, 2 /* ClassOrFunctionExcludes */, 1 /* ClassOrFunctionIncludes */ ); case 219 /* FunctionExpression */: return doWithHierarchyFacts( visitFunctionExpression, node, 2 /* ClassOrFunctionExcludes */, 1 /* ClassOrFunctionIncludes */ ); case 220 /* ArrowFunction */: return doWithHierarchyFacts( visitArrowFunction, node, 2 /* ArrowFunctionExcludes */, 0 /* ArrowFunctionIncludes */ ); case 170 /* Parameter */: return visitParameter(node); case 245 /* ExpressionStatement */: return visitExpressionStatement(node); case 218 /* ParenthesizedExpression */: return visitParenthesizedExpression(node, expressionResultIsUnused2); case 216 /* TaggedTemplateExpression */: return visitTaggedTemplateExpression(node); case 212 /* PropertyAccessExpression */: if (capturedSuperProperties && isPropertyAccessExpression(node) && node.expression.kind === 108 /* SuperKeyword */) { capturedSuperProperties.add(node.name.escapedText); } return visitEachChild(node, visitor, context); case 213 /* ElementAccessExpression */: if (capturedSuperProperties && node.expression.kind === 108 /* SuperKeyword */) { hasSuperElementAccess = true; } return visitEachChild(node, visitor, context); case 264 /* ClassDeclaration */: case 232 /* ClassExpression */: return doWithHierarchyFacts( visitDefault, node, 2 /* ClassOrFunctionExcludes */, 1 /* ClassOrFunctionIncludes */ ); default: return visitEachChild(node, visitor, context); } } function visitAwaitExpression(node) { if (enclosingFunctionFlags & 2 /* Async */ && enclosingFunctionFlags & 1 /* Generator */) { return setOriginalNode( setTextRange( factory2.createYieldExpression( /*asteriskToken*/ void 0, emitHelpers().createAwaitHelper(visitNode(node.expression, visitor, isExpression)) ), /*location*/ node ), node ); } return visitEachChild(node, visitor, context); } function visitYieldExpression(node) { if (enclosingFunctionFlags & 2 /* Async */ && enclosingFunctionFlags & 1 /* Generator */) { if (node.asteriskToken) { const expression = visitNode(Debug.checkDefined(node.expression), visitor, isExpression); return setOriginalNode( setTextRange( factory2.createYieldExpression( /*asteriskToken*/ void 0, emitHelpers().createAwaitHelper( factory2.updateYieldExpression( node, node.asteriskToken, setTextRange( emitHelpers().createAsyncDelegatorHelper( setTextRange( emitHelpers().createAsyncValuesHelper(expression), expression ) ), expression ) ) ) ), node ), node ); } return setOriginalNode( setTextRange( factory2.createYieldExpression( /*asteriskToken*/ void 0, createDownlevelAwait( node.expression ? visitNode(node.expression, visitor, isExpression) : factory2.createVoidZero() ) ), node ), node ); } return visitEachChild(node, visitor, context); } function visitReturnStatement(node) { if (enclosingFunctionFlags & 2 /* Async */ && enclosingFunctionFlags & 1 /* Generator */) { return factory2.updateReturnStatement( node, createDownlevelAwait( node.expression ? visitNode(node.expression, visitor, isExpression) : factory2.createVoidZero() ) ); } return visitEachChild(node, visitor, context); } function visitLabeledStatement(node) { if (enclosingFunctionFlags & 2 /* Async */) { const statement = unwrapInnermostStatementOfLabel(node); if (statement.kind === 251 /* ForOfStatement */ && statement.awaitModifier) { return visitForOfStatement(statement, node); } return factory2.restoreEnclosingLabel(visitNode(statement, visitor, isStatement, factory2.liftToBlock), node); } return visitEachChild(node, visitor, context); } function chunkObjectLiteralElements(elements) { let chunkObject; const objects = []; for (const e of elements) { if (e.kind === 306 /* SpreadAssignment */) { if (chunkObject) { objects.push(factory2.createObjectLiteralExpression(chunkObject)); chunkObject = void 0; } const target = e.expression; objects.push(visitNode(target, visitor, isExpression)); } else { chunkObject = append( chunkObject, e.kind === 304 /* PropertyAssignment */ ? factory2.createPropertyAssignment(e.name, visitNode(e.initializer, visitor, isExpression)) : visitNode(e, visitor, isObjectLiteralElementLike) ); } } if (chunkObject) { objects.push(factory2.createObjectLiteralExpression(chunkObject)); } return objects; } function visitObjectLiteralExpression(node) { if (node.transformFlags & 65536 /* ContainsObjectRestOrSpread */) { const objects = chunkObjectLiteralElements(node.properties); if (objects.length && objects[0].kind !== 211 /* ObjectLiteralExpression */) { objects.unshift(factory2.createObjectLiteralExpression()); } let expression = objects[0]; if (objects.length > 1) { for (let i = 1; i < objects.length; i++) { expression = emitHelpers().createAssignHelper([expression, objects[i]]); } return expression; } else { return emitHelpers().createAssignHelper(objects); } } return visitEachChild(node, visitor, context); } function visitExpressionStatement(node) { return visitEachChild(node, visitorWithUnusedExpressionResult, context); } function visitParenthesizedExpression(node, expressionResultIsUnused2) { return visitEachChild(node, expressionResultIsUnused2 ? visitorWithUnusedExpressionResult : visitor, context); } function visitSourceFile(node) { const ancestorFacts = enterSubtree( 2 /* SourceFileExcludes */, isEffectiveStrictModeSourceFile(node, compilerOptions) ? 0 /* StrictModeSourceFileIncludes */ : 1 /* SourceFileIncludes */ ); exportedVariableStatement = false; const visited = visitEachChild(node, visitor, context); const statement = concatenate( visited.statements, taggedTemplateStringDeclarations && [ factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList(taggedTemplateStringDeclarations) ) ] ); const result = factory2.updateSourceFile(visited, setTextRange(factory2.createNodeArray(statement), node.statements)); exitSubtree(ancestorFacts); return result; } function visitTaggedTemplateExpression(node) { return processTaggedTemplateExpression( context, node, visitor, currentSourceFile, recordTaggedTemplateString, 0 /* LiftRestriction */ ); } function visitBinaryExpression(node, expressionResultIsUnused2) { if (isDestructuringAssignment(node) && containsObjectRestOrSpread(node.left)) { return flattenDestructuringAssignment( node, visitor, context, 1 /* ObjectRest */, !expressionResultIsUnused2 ); } if (node.operatorToken.kind === 28 /* CommaToken */) { return factory2.updateBinaryExpression( node, visitNode(node.left, visitorWithUnusedExpressionResult, isExpression), node.operatorToken, visitNode(node.right, expressionResultIsUnused2 ? visitorWithUnusedExpressionResult : visitor, isExpression) ); } return visitEachChild(node, visitor, context); } function visitCommaListExpression(node, expressionResultIsUnused2) { if (expressionResultIsUnused2) { return visitEachChild(node, visitorWithUnusedExpressionResult, context); } let result; for (let i = 0; i < node.elements.length; i++) { const element = node.elements[i]; const visited = visitNode(element, i < node.elements.length - 1 ? visitorWithUnusedExpressionResult : visitor, isExpression); if (result || visited !== element) { result || (result = node.elements.slice(0, i)); result.push(visited); } } const elements = result ? setTextRange(factory2.createNodeArray(result), node.elements) : node.elements; return factory2.updateCommaListExpression(node, elements); } function visitCatchClause(node) { if (node.variableDeclaration && isBindingPattern(node.variableDeclaration.name) && node.variableDeclaration.name.transformFlags & 65536 /* ContainsObjectRestOrSpread */) { const name = factory2.getGeneratedNameForNode(node.variableDeclaration.name); const updatedDecl = factory2.updateVariableDeclaration( node.variableDeclaration, node.variableDeclaration.name, /*exclamationToken*/ void 0, /*type*/ void 0, name ); const visitedBindings = flattenDestructuringBinding(updatedDecl, visitor, context, 1 /* ObjectRest */); let block = visitNode(node.block, visitor, isBlock); if (some(visitedBindings)) { block = factory2.updateBlock(block, [ factory2.createVariableStatement( /*modifiers*/ void 0, visitedBindings ), ...block.statements ]); } return factory2.updateCatchClause( node, factory2.updateVariableDeclaration( node.variableDeclaration, name, /*exclamationToken*/ void 0, /*type*/ void 0, /*initializer*/ void 0 ), block ); } return visitEachChild(node, visitor, context); } function visitVariableStatement(node) { if (hasSyntacticModifier(node, 32 /* Export */)) { const savedExportedVariableStatement = exportedVariableStatement; exportedVariableStatement = true; const visited = visitEachChild(node, visitor, context); exportedVariableStatement = savedExportedVariableStatement; return visited; } return visitEachChild(node, visitor, context); } function visitVariableDeclaration(node) { if (exportedVariableStatement) { const savedExportedVariableStatement = exportedVariableStatement; exportedVariableStatement = false; const visited = visitVariableDeclarationWorker( node, /*exportedVariableStatement*/ true ); exportedVariableStatement = savedExportedVariableStatement; return visited; } return visitVariableDeclarationWorker( node, /*exportedVariableStatement*/ false ); } function visitVariableDeclarationWorker(node, exportedVariableStatement2) { if (isBindingPattern(node.name) && node.name.transformFlags & 65536 /* ContainsObjectRestOrSpread */) { return flattenDestructuringBinding( node, visitor, context, 1 /* ObjectRest */, /*rval*/ void 0, exportedVariableStatement2 ); } return visitEachChild(node, visitor, context); } function visitForStatement(node) { return factory2.updateForStatement( node, visitNode(node.initializer, visitorWithUnusedExpressionResult, isForInitializer), visitNode(node.condition, visitor, isExpression), visitNode(node.incrementor, visitorWithUnusedExpressionResult, isExpression), visitIterationBody(node.statement, visitor, context) ); } function visitVoidExpression(node) { return visitEachChild(node, visitorWithUnusedExpressionResult, context); } function visitForOfStatement(node, outermostLabeledStatement) { const ancestorFacts = enterSubtree(0 /* IterationStatementExcludes */, 2 /* IterationStatementIncludes */); if (node.initializer.transformFlags & 65536 /* ContainsObjectRestOrSpread */ || isAssignmentPattern(node.initializer) && containsObjectRestOrSpread(node.initializer)) { node = transformForOfStatementWithObjectRest(node); } const result = node.awaitModifier ? transformForAwaitOfStatement(node, outermostLabeledStatement, ancestorFacts) : factory2.restoreEnclosingLabel(visitEachChild(node, visitor, context), outermostLabeledStatement); exitSubtree(ancestorFacts); return result; } function transformForOfStatementWithObjectRest(node) { const initializerWithoutParens = skipParentheses(node.initializer); if (isVariableDeclarationList(initializerWithoutParens) || isAssignmentPattern(initializerWithoutParens)) { let bodyLocation; let statementsLocation; const temp = factory2.createTempVariable( /*recordTempVariable*/ void 0 ); const statements = [createForOfBindingStatement(factory2, initializerWithoutParens, temp)]; if (isBlock(node.statement)) { addRange(statements, node.statement.statements); bodyLocation = node.statement; statementsLocation = node.statement.statements; } else if (node.statement) { append(statements, node.statement); bodyLocation = node.statement; statementsLocation = node.statement; } return factory2.updateForOfStatement( node, node.awaitModifier, setTextRange( factory2.createVariableDeclarationList( [ setTextRange(factory2.createVariableDeclaration(temp), node.initializer) ], 1 /* Let */ ), node.initializer ), node.expression, setTextRange( factory2.createBlock( setTextRange(factory2.createNodeArray(statements), statementsLocation), /*multiLine*/ true ), bodyLocation ) ); } return node; } function convertForOfStatementHead(node, boundValue, nonUserCode) { const value = factory2.createTempVariable(hoistVariableDeclaration); const iteratorValueExpression = factory2.createAssignment(value, boundValue); const iteratorValueStatement = factory2.createExpressionStatement(iteratorValueExpression); setSourceMapRange(iteratorValueStatement, node.expression); const exitNonUserCodeExpression = factory2.createAssignment(nonUserCode, factory2.createFalse()); const exitNonUserCodeStatement = factory2.createExpressionStatement(exitNonUserCodeExpression); setSourceMapRange(exitNonUserCodeStatement, node.expression); const statements = [iteratorValueStatement, exitNonUserCodeStatement]; const binding = createForOfBindingStatement(factory2, node.initializer, value); statements.push(visitNode(binding, visitor, isStatement)); let bodyLocation; let statementsLocation; const statement = visitIterationBody(node.statement, visitor, context); if (isBlock(statement)) { addRange(statements, statement.statements); bodyLocation = statement; statementsLocation = statement.statements; } else { statements.push(statement); } return setTextRange( factory2.createBlock( setTextRange(factory2.createNodeArray(statements), statementsLocation), /*multiLine*/ true ), bodyLocation ); } function createDownlevelAwait(expression) { return enclosingFunctionFlags & 1 /* Generator */ ? factory2.createYieldExpression( /*asteriskToken*/ void 0, emitHelpers().createAwaitHelper(expression) ) : factory2.createAwaitExpression(expression); } function transformForAwaitOfStatement(node, outermostLabeledStatement, ancestorFacts) { const expression = visitNode(node.expression, visitor, isExpression); const iterator = isIdentifier(expression) ? factory2.getGeneratedNameForNode(expression) : factory2.createTempVariable( /*recordTempVariable*/ void 0 ); const result = isIdentifier(expression) ? factory2.getGeneratedNameForNode(iterator) : factory2.createTempVariable( /*recordTempVariable*/ void 0 ); const nonUserCode = factory2.createTempVariable( /*recordTempVariable*/ void 0 ); const done = factory2.createTempVariable(hoistVariableDeclaration); const errorRecord = factory2.createUniqueName("e"); const catchVariable = factory2.getGeneratedNameForNode(errorRecord); const returnMethod = factory2.createTempVariable( /*recordTempVariable*/ void 0 ); const callValues = setTextRange(emitHelpers().createAsyncValuesHelper(expression), node.expression); const callNext = factory2.createCallExpression( factory2.createPropertyAccessExpression(iterator, "next"), /*typeArguments*/ void 0, [] ); const getDone = factory2.createPropertyAccessExpression(result, "done"); const getValue = factory2.createPropertyAccessExpression(result, "value"); const callReturn = factory2.createFunctionCallCall(returnMethod, iterator, []); hoistVariableDeclaration(errorRecord); hoistVariableDeclaration(returnMethod); const initializer = ancestorFacts & 2 /* IterationContainer */ ? factory2.inlineExpressions([factory2.createAssignment(errorRecord, factory2.createVoidZero()), callValues]) : callValues; const forStatement = setEmitFlags( setTextRange( factory2.createForStatement( /*initializer*/ setEmitFlags( setTextRange( factory2.createVariableDeclarationList([ factory2.createVariableDeclaration( nonUserCode, /*exclamationToken*/ void 0, /*type*/ void 0, factory2.createTrue() ), setTextRange(factory2.createVariableDeclaration( iterator, /*exclamationToken*/ void 0, /*type*/ void 0, initializer ), node.expression), factory2.createVariableDeclaration(result) ]), node.expression ), 4194304 /* NoHoisting */ ), /*condition*/ factory2.inlineExpressions([ factory2.createAssignment(result, createDownlevelAwait(callNext)), factory2.createAssignment(done, getDone), factory2.createLogicalNot(done) ]), /*incrementor*/ factory2.createAssignment(nonUserCode, factory2.createTrue()), /*statement*/ convertForOfStatementHead(node, getValue, nonUserCode) ), /*location*/ node ), 512 /* NoTokenTrailingSourceMaps */ ); setOriginalNode(forStatement, node); return factory2.createTryStatement( factory2.createBlock([ factory2.restoreEnclosingLabel( forStatement, outermostLabeledStatement ) ]), factory2.createCatchClause( factory2.createVariableDeclaration(catchVariable), setEmitFlags( factory2.createBlock([ factory2.createExpressionStatement( factory2.createAssignment( errorRecord, factory2.createObjectLiteralExpression([ factory2.createPropertyAssignment("error", catchVariable) ]) ) ) ]), 1 /* SingleLine */ ) ), factory2.createBlock([ factory2.createTryStatement( /*tryBlock*/ factory2.createBlock([ setEmitFlags( factory2.createIfStatement( factory2.createLogicalAnd( factory2.createLogicalAnd( factory2.createLogicalNot(nonUserCode), factory2.createLogicalNot(done) ), factory2.createAssignment( returnMethod, factory2.createPropertyAccessExpression(iterator, "return") ) ), factory2.createExpressionStatement(createDownlevelAwait(callReturn)) ), 1 /* SingleLine */ ) ]), /*catchClause*/ void 0, /*finallyBlock*/ setEmitFlags( factory2.createBlock([ setEmitFlags( factory2.createIfStatement( errorRecord, factory2.createThrowStatement( factory2.createPropertyAccessExpression(errorRecord, "error") ) ), 1 /* SingleLine */ ) ]), 1 /* SingleLine */ ) ) ]) ); } function parameterVisitor(node) { Debug.assertNode(node, isParameter); return visitParameter(node); } function visitParameter(node) { if (parametersWithPrecedingObjectRestOrSpread == null ? void 0 : parametersWithPrecedingObjectRestOrSpread.has(node)) { return factory2.updateParameterDeclaration( node, /*modifiers*/ void 0, node.dotDotDotToken, isBindingPattern(node.name) ? factory2.getGeneratedNameForNode(node) : node.name, /*questionToken*/ void 0, /*type*/ void 0, /*initializer*/ void 0 ); } if (node.transformFlags & 65536 /* ContainsObjectRestOrSpread */) { return factory2.updateParameterDeclaration( node, /*modifiers*/ void 0, node.dotDotDotToken, factory2.getGeneratedNameForNode(node), /*questionToken*/ void 0, /*type*/ void 0, visitNode(node.initializer, visitor, isExpression) ); } return visitEachChild(node, visitor, context); } function collectParametersWithPrecedingObjectRestOrSpread(node) { let parameters; for (const parameter of node.parameters) { if (parameters) { parameters.add(parameter); } else if (parameter.transformFlags & 65536 /* ContainsObjectRestOrSpread */) { parameters = /* @__PURE__ */ new Set(); } } return parameters; } function visitConstructorDeclaration(node) { const savedEnclosingFunctionFlags = enclosingFunctionFlags; const savedParametersWithPrecedingObjectRestOrSpread = parametersWithPrecedingObjectRestOrSpread; enclosingFunctionFlags = getFunctionFlags(node); parametersWithPrecedingObjectRestOrSpread = collectParametersWithPrecedingObjectRestOrSpread(node); const updated = factory2.updateConstructorDeclaration( node, node.modifiers, visitParameterList(node.parameters, parameterVisitor, context), transformFunctionBody(node) ); enclosingFunctionFlags = savedEnclosingFunctionFlags; parametersWithPrecedingObjectRestOrSpread = savedParametersWithPrecedingObjectRestOrSpread; return updated; } function visitGetAccessorDeclaration(node) { const savedEnclosingFunctionFlags = enclosingFunctionFlags; const savedParametersWithPrecedingObjectRestOrSpread = parametersWithPrecedingObjectRestOrSpread; enclosingFunctionFlags = getFunctionFlags(node); parametersWithPrecedingObjectRestOrSpread = collectParametersWithPrecedingObjectRestOrSpread(node); const updated = factory2.updateGetAccessorDeclaration( node, node.modifiers, visitNode(node.name, visitor, isPropertyName), visitParameterList(node.parameters, parameterVisitor, context), /*type*/ void 0, transformFunctionBody(node) ); enclosingFunctionFlags = savedEnclosingFunctionFlags; parametersWithPrecedingObjectRestOrSpread = savedParametersWithPrecedingObjectRestOrSpread; return updated; } function visitSetAccessorDeclaration(node) { const savedEnclosingFunctionFlags = enclosingFunctionFlags; const savedParametersWithPrecedingObjectRestOrSpread = parametersWithPrecedingObjectRestOrSpread; enclosingFunctionFlags = getFunctionFlags(node); parametersWithPrecedingObjectRestOrSpread = collectParametersWithPrecedingObjectRestOrSpread(node); const updated = factory2.updateSetAccessorDeclaration( node, node.modifiers, visitNode(node.name, visitor, isPropertyName), visitParameterList(node.parameters, parameterVisitor, context), transformFunctionBody(node) ); enclosingFunctionFlags = savedEnclosingFunctionFlags; parametersWithPrecedingObjectRestOrSpread = savedParametersWithPrecedingObjectRestOrSpread; return updated; } function visitMethodDeclaration(node) { const savedEnclosingFunctionFlags = enclosingFunctionFlags; const savedParametersWithPrecedingObjectRestOrSpread = parametersWithPrecedingObjectRestOrSpread; enclosingFunctionFlags = getFunctionFlags(node); parametersWithPrecedingObjectRestOrSpread = collectParametersWithPrecedingObjectRestOrSpread(node); const updated = factory2.updateMethodDeclaration( node, enclosingFunctionFlags & 1 /* Generator */ ? visitNodes2(node.modifiers, visitorNoAsyncModifier, isModifierLike) : node.modifiers, enclosingFunctionFlags & 2 /* Async */ ? void 0 : node.asteriskToken, visitNode(node.name, visitor, isPropertyName), visitNode( /*node*/ void 0, visitor, isQuestionToken ), /*typeParameters*/ void 0, enclosingFunctionFlags & 2 /* Async */ && enclosingFunctionFlags & 1 /* Generator */ ? transformAsyncGeneratorFunctionParameterList(node) : visitParameterList(node.parameters, parameterVisitor, context), /*type*/ void 0, enclosingFunctionFlags & 2 /* Async */ && enclosingFunctionFlags & 1 /* Generator */ ? transformAsyncGeneratorFunctionBody(node) : transformFunctionBody(node) ); enclosingFunctionFlags = savedEnclosingFunctionFlags; parametersWithPrecedingObjectRestOrSpread = savedParametersWithPrecedingObjectRestOrSpread; return updated; } function visitFunctionDeclaration(node) { const savedEnclosingFunctionFlags = enclosingFunctionFlags; const savedParametersWithPrecedingObjectRestOrSpread = parametersWithPrecedingObjectRestOrSpread; enclosingFunctionFlags = getFunctionFlags(node); parametersWithPrecedingObjectRestOrSpread = collectParametersWithPrecedingObjectRestOrSpread(node); const updated = factory2.updateFunctionDeclaration( node, enclosingFunctionFlags & 1 /* Generator */ ? visitNodes2(node.modifiers, visitorNoAsyncModifier, isModifier) : node.modifiers, enclosingFunctionFlags & 2 /* Async */ ? void 0 : node.asteriskToken, node.name, /*typeParameters*/ void 0, enclosingFunctionFlags & 2 /* Async */ && enclosingFunctionFlags & 1 /* Generator */ ? transformAsyncGeneratorFunctionParameterList(node) : visitParameterList(node.parameters, parameterVisitor, context), /*type*/ void 0, enclosingFunctionFlags & 2 /* Async */ && enclosingFunctionFlags & 1 /* Generator */ ? transformAsyncGeneratorFunctionBody(node) : transformFunctionBody(node) ); enclosingFunctionFlags = savedEnclosingFunctionFlags; parametersWithPrecedingObjectRestOrSpread = savedParametersWithPrecedingObjectRestOrSpread; return updated; } function visitArrowFunction(node) { const savedEnclosingFunctionFlags = enclosingFunctionFlags; const savedParametersWithPrecedingObjectRestOrSpread = parametersWithPrecedingObjectRestOrSpread; enclosingFunctionFlags = getFunctionFlags(node); parametersWithPrecedingObjectRestOrSpread = collectParametersWithPrecedingObjectRestOrSpread(node); const updated = factory2.updateArrowFunction( node, node.modifiers, /*typeParameters*/ void 0, visitParameterList(node.parameters, parameterVisitor, context), /*type*/ void 0, node.equalsGreaterThanToken, transformFunctionBody(node) ); enclosingFunctionFlags = savedEnclosingFunctionFlags; parametersWithPrecedingObjectRestOrSpread = savedParametersWithPrecedingObjectRestOrSpread; return updated; } function visitFunctionExpression(node) { const savedEnclosingFunctionFlags = enclosingFunctionFlags; const savedParametersWithPrecedingObjectRestOrSpread = parametersWithPrecedingObjectRestOrSpread; enclosingFunctionFlags = getFunctionFlags(node); parametersWithPrecedingObjectRestOrSpread = collectParametersWithPrecedingObjectRestOrSpread(node); const updated = factory2.updateFunctionExpression( node, enclosingFunctionFlags & 1 /* Generator */ ? visitNodes2(node.modifiers, visitorNoAsyncModifier, isModifier) : node.modifiers, enclosingFunctionFlags & 2 /* Async */ ? void 0 : node.asteriskToken, node.name, /*typeParameters*/ void 0, enclosingFunctionFlags & 2 /* Async */ && enclosingFunctionFlags & 1 /* Generator */ ? transformAsyncGeneratorFunctionParameterList(node) : visitParameterList(node.parameters, parameterVisitor, context), /*type*/ void 0, enclosingFunctionFlags & 2 /* Async */ && enclosingFunctionFlags & 1 /* Generator */ ? transformAsyncGeneratorFunctionBody(node) : transformFunctionBody(node) ); enclosingFunctionFlags = savedEnclosingFunctionFlags; parametersWithPrecedingObjectRestOrSpread = savedParametersWithPrecedingObjectRestOrSpread; return updated; } function transformAsyncGeneratorFunctionParameterList(node) { if (isSimpleParameterList(node.parameters)) { return visitParameterList(node.parameters, visitor, context); } const newParameters = []; for (const parameter of node.parameters) { if (parameter.initializer || parameter.dotDotDotToken) { break; } const newParameter = factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, factory2.getGeneratedNameForNode(parameter.name, 8 /* ReservedInNestedScopes */) ); newParameters.push(newParameter); } const newParametersArray = factory2.createNodeArray(newParameters); setTextRange(newParametersArray, node.parameters); return newParametersArray; } function transformAsyncGeneratorFunctionBody(node) { const innerParameters = !isSimpleParameterList(node.parameters) ? visitParameterList(node.parameters, visitor, context) : void 0; resumeLexicalEnvironment(); const savedCapturedSuperProperties = capturedSuperProperties; const savedHasSuperElementAccess = hasSuperElementAccess; capturedSuperProperties = /* @__PURE__ */ new Set(); hasSuperElementAccess = false; const outerStatements = []; let asyncBody = factory2.updateBlock(node.body, visitNodes2(node.body.statements, visitor, isStatement)); asyncBody = factory2.updateBlock(asyncBody, factory2.mergeLexicalEnvironment(asyncBody.statements, appendObjectRestAssignmentsIfNeeded(endLexicalEnvironment(), node))); const returnStatement = factory2.createReturnStatement( emitHelpers().createAsyncGeneratorHelper( factory2.createFunctionExpression( /*modifiers*/ void 0, factory2.createToken(42 /* AsteriskToken */), node.name && factory2.getGeneratedNameForNode(node.name), /*typeParameters*/ void 0, innerParameters ?? [], /*type*/ void 0, asyncBody ), !!(hierarchyFacts & 1 /* HasLexicalThis */) ) ); const emitSuperHelpers = languageVersion >= 2 /* ES2015 */ && (resolver.hasNodeCheckFlag(node, 256 /* MethodWithSuperPropertyAssignmentInAsync */) || resolver.hasNodeCheckFlag(node, 128 /* MethodWithSuperPropertyAccessInAsync */)); if (emitSuperHelpers) { enableSubstitutionForAsyncMethodsWithSuper(); const variableStatement = createSuperAccessVariableStatement(factory2, resolver, node, capturedSuperProperties); substitutedSuperAccessors[getNodeId(variableStatement)] = true; insertStatementsAfterStandardPrologue(outerStatements, [variableStatement]); } outerStatements.push(returnStatement); const block = factory2.updateBlock(node.body, outerStatements); if (emitSuperHelpers && hasSuperElementAccess) { if (resolver.hasNodeCheckFlag(node, 256 /* MethodWithSuperPropertyAssignmentInAsync */)) { addEmitHelper(block, advancedAsyncSuperHelper); } else if (resolver.hasNodeCheckFlag(node, 128 /* MethodWithSuperPropertyAccessInAsync */)) { addEmitHelper(block, asyncSuperHelper); } } capturedSuperProperties = savedCapturedSuperProperties; hasSuperElementAccess = savedHasSuperElementAccess; return block; } function transformFunctionBody(node) { resumeLexicalEnvironment(); let statementOffset = 0; const statements = []; const body = visitNode(node.body, visitor, isConciseBody) ?? factory2.createBlock([]); if (isBlock(body)) { statementOffset = factory2.copyPrologue( body.statements, statements, /*ensureUseStrict*/ false, visitor ); } addRange(statements, appendObjectRestAssignmentsIfNeeded( /*statements*/ void 0, node )); const leadingStatements = endLexicalEnvironment(); if (statementOffset > 0 || some(statements) || some(leadingStatements)) { const block = factory2.converters.convertToFunctionBlock( body, /*multiLine*/ true ); insertStatementsAfterStandardPrologue(statements, leadingStatements); addRange(statements, block.statements.slice(statementOffset)); return factory2.updateBlock(block, setTextRange(factory2.createNodeArray(statements), block.statements)); } return body; } function appendObjectRestAssignmentsIfNeeded(statements, node) { let containsPrecedingObjectRestOrSpread = false; for (const parameter of node.parameters) { if (containsPrecedingObjectRestOrSpread) { if (isBindingPattern(parameter.name)) { if (parameter.name.elements.length > 0) { const declarations = flattenDestructuringBinding( parameter, visitor, context, 0 /* All */, factory2.getGeneratedNameForNode(parameter) ); if (some(declarations)) { const declarationList = factory2.createVariableDeclarationList(declarations); const statement = factory2.createVariableStatement( /*modifiers*/ void 0, declarationList ); setEmitFlags(statement, 2097152 /* CustomPrologue */); statements = append(statements, statement); } } else if (parameter.initializer) { const name = factory2.getGeneratedNameForNode(parameter); const initializer = visitNode(parameter.initializer, visitor, isExpression); const assignment = factory2.createAssignment(name, initializer); const statement = factory2.createExpressionStatement(assignment); setEmitFlags(statement, 2097152 /* CustomPrologue */); statements = append(statements, statement); } } else if (parameter.initializer) { const name = factory2.cloneNode(parameter.name); setTextRange(name, parameter.name); setEmitFlags(name, 96 /* NoSourceMap */); const initializer = visitNode(parameter.initializer, visitor, isExpression); addEmitFlags(initializer, 96 /* NoSourceMap */ | 3072 /* NoComments */); const assignment = factory2.createAssignment(name, initializer); setTextRange(assignment, parameter); setEmitFlags(assignment, 3072 /* NoComments */); const block = factory2.createBlock([factory2.createExpressionStatement(assignment)]); setTextRange(block, parameter); setEmitFlags(block, 1 /* SingleLine */ | 64 /* NoTrailingSourceMap */ | 768 /* NoTokenSourceMaps */ | 3072 /* NoComments */); const typeCheck = factory2.createTypeCheck(factory2.cloneNode(parameter.name), "undefined"); const statement = factory2.createIfStatement(typeCheck, block); startOnNewLine(statement); setTextRange(statement, parameter); setEmitFlags(statement, 768 /* NoTokenSourceMaps */ | 64 /* NoTrailingSourceMap */ | 2097152 /* CustomPrologue */ | 3072 /* NoComments */); statements = append(statements, statement); } } else if (parameter.transformFlags & 65536 /* ContainsObjectRestOrSpread */) { containsPrecedingObjectRestOrSpread = true; const declarations = flattenDestructuringBinding( parameter, visitor, context, 1 /* ObjectRest */, factory2.getGeneratedNameForNode(parameter), /*hoistTempVariables*/ false, /*skipInitializer*/ true ); if (some(declarations)) { const declarationList = factory2.createVariableDeclarationList(declarations); const statement = factory2.createVariableStatement( /*modifiers*/ void 0, declarationList ); setEmitFlags(statement, 2097152 /* CustomPrologue */); statements = append(statements, statement); } } } return statements; } function enableSubstitutionForAsyncMethodsWithSuper() { if ((enabledSubstitutions & 1 /* AsyncMethodsWithSuper */) === 0) { enabledSubstitutions |= 1 /* AsyncMethodsWithSuper */; context.enableSubstitution(214 /* CallExpression */); context.enableSubstitution(212 /* PropertyAccessExpression */); context.enableSubstitution(213 /* ElementAccessExpression */); context.enableEmitNotification(264 /* ClassDeclaration */); context.enableEmitNotification(175 /* MethodDeclaration */); context.enableEmitNotification(178 /* GetAccessor */); context.enableEmitNotification(179 /* SetAccessor */); context.enableEmitNotification(177 /* Constructor */); context.enableEmitNotification(244 /* VariableStatement */); } } function onEmitNode(hint, node, emitCallback) { if (enabledSubstitutions & 1 /* AsyncMethodsWithSuper */ && isSuperContainer(node)) { const superContainerFlags = (resolver.hasNodeCheckFlag(node, 128 /* MethodWithSuperPropertyAccessInAsync */) ? 128 /* MethodWithSuperPropertyAccessInAsync */ : 0) | (resolver.hasNodeCheckFlag(node, 256 /* MethodWithSuperPropertyAssignmentInAsync */) ? 256 /* MethodWithSuperPropertyAssignmentInAsync */ : 0); if (superContainerFlags !== enclosingSuperContainerFlags) { const savedEnclosingSuperContainerFlags = enclosingSuperContainerFlags; enclosingSuperContainerFlags = superContainerFlags; previousOnEmitNode(hint, node, emitCallback); enclosingSuperContainerFlags = savedEnclosingSuperContainerFlags; return; } } else if (enabledSubstitutions && substitutedSuperAccessors[getNodeId(node)]) { const savedEnclosingSuperContainerFlags = enclosingSuperContainerFlags; enclosingSuperContainerFlags = 0; previousOnEmitNode(hint, node, emitCallback); enclosingSuperContainerFlags = savedEnclosingSuperContainerFlags; return; } previousOnEmitNode(hint, node, emitCallback); } function onSubstituteNode(hint, node) { node = previousOnSubstituteNode(hint, node); if (hint === 1 /* Expression */ && enclosingSuperContainerFlags) { return substituteExpression(node); } return node; } function substituteExpression(node) { switch (node.kind) { case 212 /* PropertyAccessExpression */: return substitutePropertyAccessExpression(node); case 213 /* ElementAccessExpression */: return substituteElementAccessExpression(node); case 214 /* CallExpression */: return substituteCallExpression(node); } return node; } function substitutePropertyAccessExpression(node) { if (node.expression.kind === 108 /* SuperKeyword */) { return setTextRange( factory2.createPropertyAccessExpression( factory2.createUniqueName("_super", 16 /* Optimistic */ | 32 /* FileLevel */), node.name ), node ); } return node; } function substituteElementAccessExpression(node) { if (node.expression.kind === 108 /* SuperKeyword */) { return createSuperElementAccessInAsyncMethod( node.argumentExpression, node ); } return node; } function substituteCallExpression(node) { const expression = node.expression; if (isSuperProperty(expression)) { const argumentExpression = isPropertyAccessExpression(expression) ? substitutePropertyAccessExpression(expression) : substituteElementAccessExpression(expression); return factory2.createCallExpression( factory2.createPropertyAccessExpression(argumentExpression, "call"), /*typeArguments*/ void 0, [ factory2.createThis(), ...node.arguments ] ); } return node; } function isSuperContainer(node) { const kind = node.kind; return kind === 264 /* ClassDeclaration */ || kind === 177 /* Constructor */ || kind === 175 /* MethodDeclaration */ || kind === 178 /* GetAccessor */ || kind === 179 /* SetAccessor */; } function createSuperElementAccessInAsyncMethod(argumentExpression, location) { if (enclosingSuperContainerFlags & 256 /* MethodWithSuperPropertyAssignmentInAsync */) { return setTextRange( factory2.createPropertyAccessExpression( factory2.createCallExpression( factory2.createIdentifier("_superIndex"), /*typeArguments*/ void 0, [argumentExpression] ), "value" ), location ); } else { return setTextRange( factory2.createCallExpression( factory2.createIdentifier("_superIndex"), /*typeArguments*/ void 0, [argumentExpression] ), location ); } } } // src/compiler/transformers/es2019.ts function transformES2019(context) { const factory2 = context.factory; return chainBundle(context, transformSourceFile); function transformSourceFile(node) { if (node.isDeclarationFile) { return node; } return visitEachChild(node, visitor, context); } function visitor(node) { if ((node.transformFlags & 64 /* ContainsES2019 */) === 0) { return node; } switch (node.kind) { case 300 /* CatchClause */: return visitCatchClause(node); default: return visitEachChild(node, visitor, context); } } function visitCatchClause(node) { if (!node.variableDeclaration) { return factory2.updateCatchClause( node, factory2.createVariableDeclaration(factory2.createTempVariable( /*recordTempVariable*/ void 0 )), visitNode(node.block, visitor, isBlock) ); } return visitEachChild(node, visitor, context); } } // src/compiler/transformers/es2020.ts function transformES2020(context) { const { factory: factory2, hoistVariableDeclaration } = context; return chainBundle(context, transformSourceFile); function transformSourceFile(node) { if (node.isDeclarationFile) { return node; } return visitEachChild(node, visitor, context); } function visitor(node) { if ((node.transformFlags & 32 /* ContainsES2020 */) === 0) { return node; } switch (node.kind) { case 214 /* CallExpression */: { const updated = visitNonOptionalCallExpression( node, /*captureThisArg*/ false ); Debug.assertNotNode(updated, isSyntheticReference); return updated; } case 212 /* PropertyAccessExpression */: case 213 /* ElementAccessExpression */: if (isOptionalChain(node)) { const updated = visitOptionalExpression( node, /*captureThisArg*/ false, /*isDelete*/ false ); Debug.assertNotNode(updated, isSyntheticReference); return updated; } return visitEachChild(node, visitor, context); case 227 /* BinaryExpression */: if (node.operatorToken.kind === 61 /* QuestionQuestionToken */) { return transformNullishCoalescingExpression(node); } return visitEachChild(node, visitor, context); case 221 /* DeleteExpression */: return visitDeleteExpression(node); default: return visitEachChild(node, visitor, context); } } function flattenChain(chain) { Debug.assertNotNode(chain, isNonNullChain); const links = [chain]; while (!chain.questionDotToken && !isTaggedTemplateExpression(chain)) { chain = cast(skipPartiallyEmittedExpressions(chain.expression), isOptionalChain); Debug.assertNotNode(chain, isNonNullChain); links.unshift(chain); } return { expression: chain.expression, chain: links }; } function visitNonOptionalParenthesizedExpression(node, captureThisArg, isDelete) { const expression = visitNonOptionalExpression(node.expression, captureThisArg, isDelete); if (isSyntheticReference(expression)) { return factory2.createSyntheticReferenceExpression(factory2.updateParenthesizedExpression(node, expression.expression), expression.thisArg); } return factory2.updateParenthesizedExpression(node, expression); } function visitNonOptionalPropertyOrElementAccessExpression(node, captureThisArg, isDelete) { if (isOptionalChain(node)) { return visitOptionalExpression(node, captureThisArg, isDelete); } let expression = visitNode(node.expression, visitor, isExpression); Debug.assertNotNode(expression, isSyntheticReference); let thisArg; if (captureThisArg) { if (!isSimpleCopiableExpression(expression)) { thisArg = factory2.createTempVariable(hoistVariableDeclaration); expression = factory2.createAssignment(thisArg, expression); } else { thisArg = expression; } } expression = node.kind === 212 /* PropertyAccessExpression */ ? factory2.updatePropertyAccessExpression(node, expression, visitNode(node.name, visitor, isIdentifier)) : factory2.updateElementAccessExpression(node, expression, visitNode(node.argumentExpression, visitor, isExpression)); return thisArg ? factory2.createSyntheticReferenceExpression(expression, thisArg) : expression; } function visitNonOptionalCallExpression(node, captureThisArg) { if (isOptionalChain(node)) { return visitOptionalExpression( node, captureThisArg, /*isDelete*/ false ); } if (isParenthesizedExpression(node.expression) && isOptionalChain(skipParentheses(node.expression))) { const expression = visitNonOptionalParenthesizedExpression( node.expression, /*captureThisArg*/ true, /*isDelete*/ false ); const args = visitNodes2(node.arguments, visitor, isExpression); if (isSyntheticReference(expression)) { return setTextRange(factory2.createFunctionCallCall(expression.expression, expression.thisArg, args), node); } return factory2.updateCallExpression( node, expression, /*typeArguments*/ void 0, args ); } return visitEachChild(node, visitor, context); } function visitNonOptionalExpression(node, captureThisArg, isDelete) { switch (node.kind) { case 218 /* ParenthesizedExpression */: return visitNonOptionalParenthesizedExpression(node, captureThisArg, isDelete); case 212 /* PropertyAccessExpression */: case 213 /* ElementAccessExpression */: return visitNonOptionalPropertyOrElementAccessExpression(node, captureThisArg, isDelete); case 214 /* CallExpression */: return visitNonOptionalCallExpression(node, captureThisArg); default: return visitNode(node, visitor, isExpression); } } function visitOptionalExpression(node, captureThisArg, isDelete) { const { expression, chain } = flattenChain(node); const left = visitNonOptionalExpression( skipPartiallyEmittedExpressions(expression), isCallChain(chain[0]), /*isDelete*/ false ); let leftThisArg = isSyntheticReference(left) ? left.thisArg : void 0; let capturedLeft = isSyntheticReference(left) ? left.expression : left; let leftExpression = factory2.restoreOuterExpressions(expression, capturedLeft, 8 /* PartiallyEmittedExpressions */); if (!isSimpleCopiableExpression(capturedLeft)) { capturedLeft = factory2.createTempVariable(hoistVariableDeclaration); leftExpression = factory2.createAssignment(capturedLeft, leftExpression); } let rightExpression = capturedLeft; let thisArg; for (let i = 0; i < chain.length; i++) { const segment = chain[i]; switch (segment.kind) { case 212 /* PropertyAccessExpression */: case 213 /* ElementAccessExpression */: if (i === chain.length - 1 && captureThisArg) { if (!isSimpleCopiableExpression(rightExpression)) { thisArg = factory2.createTempVariable(hoistVariableDeclaration); rightExpression = factory2.createAssignment(thisArg, rightExpression); } else { thisArg = rightExpression; } } rightExpression = segment.kind === 212 /* PropertyAccessExpression */ ? factory2.createPropertyAccessExpression(rightExpression, visitNode(segment.name, visitor, isIdentifier)) : factory2.createElementAccessExpression(rightExpression, visitNode(segment.argumentExpression, visitor, isExpression)); break; case 214 /* CallExpression */: if (i === 0 && leftThisArg) { if (!isGeneratedIdentifier(leftThisArg)) { leftThisArg = factory2.cloneNode(leftThisArg); addEmitFlags(leftThisArg, 3072 /* NoComments */); } rightExpression = factory2.createFunctionCallCall( rightExpression, leftThisArg.kind === 108 /* SuperKeyword */ ? factory2.createThis() : leftThisArg, visitNodes2(segment.arguments, visitor, isExpression) ); } else { rightExpression = factory2.createCallExpression( rightExpression, /*typeArguments*/ void 0, visitNodes2(segment.arguments, visitor, isExpression) ); } break; } setOriginalNode(rightExpression, segment); } const target = isDelete ? factory2.createConditionalExpression( createNotNullCondition( leftExpression, capturedLeft, /*invert*/ true ), /*questionToken*/ void 0, factory2.createTrue(), /*colonToken*/ void 0, factory2.createDeleteExpression(rightExpression) ) : factory2.createConditionalExpression( createNotNullCondition( leftExpression, capturedLeft, /*invert*/ true ), /*questionToken*/ void 0, factory2.createVoidZero(), /*colonToken*/ void 0, rightExpression ); setTextRange(target, node); return thisArg ? factory2.createSyntheticReferenceExpression(target, thisArg) : target; } function createNotNullCondition(left, right, invert) { return factory2.createBinaryExpression( factory2.createBinaryExpression( left, factory2.createToken(invert ? 37 /* EqualsEqualsEqualsToken */ : 38 /* ExclamationEqualsEqualsToken */), factory2.createNull() ), factory2.createToken(invert ? 57 /* BarBarToken */ : 56 /* AmpersandAmpersandToken */), factory2.createBinaryExpression( right, factory2.createToken(invert ? 37 /* EqualsEqualsEqualsToken */ : 38 /* ExclamationEqualsEqualsToken */), factory2.createVoidZero() ) ); } function transformNullishCoalescingExpression(node) { let left = visitNode(node.left, visitor, isExpression); let right = left; if (!isSimpleCopiableExpression(left)) { right = factory2.createTempVariable(hoistVariableDeclaration); left = factory2.createAssignment(right, left); } return setTextRange( factory2.createConditionalExpression( createNotNullCondition(left, right), /*questionToken*/ void 0, right, /*colonToken*/ void 0, visitNode(node.right, visitor, isExpression) ), node ); } function visitDeleteExpression(node) { return isOptionalChain(skipParentheses(node.expression)) ? setOriginalNode(visitNonOptionalExpression( node.expression, /*captureThisArg*/ false, /*isDelete*/ true ), node) : factory2.updateDeleteExpression(node, visitNode(node.expression, visitor, isExpression)); } } // src/compiler/transformers/es2021.ts function transformES2021(context) { const { hoistVariableDeclaration, factory: factory2 } = context; return chainBundle(context, transformSourceFile); function transformSourceFile(node) { if (node.isDeclarationFile) { return node; } return visitEachChild(node, visitor, context); } function visitor(node) { if ((node.transformFlags & 16 /* ContainsES2021 */) === 0) { return node; } if (isLogicalOrCoalescingAssignmentExpression(node)) { return transformLogicalAssignment(node); } return visitEachChild(node, visitor, context); } function transformLogicalAssignment(binaryExpression) { const operator = binaryExpression.operatorToken; const nonAssignmentOperator = getNonAssignmentOperatorForCompoundAssignment(operator.kind); let left = skipParentheses(visitNode(binaryExpression.left, visitor, isLeftHandSideExpression)); let assignmentTarget = left; const right = skipParentheses(visitNode(binaryExpression.right, visitor, isExpression)); if (isAccessExpression(left)) { const propertyAccessTargetSimpleCopiable = isSimpleCopiableExpression(left.expression); const propertyAccessTarget = propertyAccessTargetSimpleCopiable ? left.expression : factory2.createTempVariable(hoistVariableDeclaration); const propertyAccessTargetAssignment = propertyAccessTargetSimpleCopiable ? left.expression : factory2.createAssignment( propertyAccessTarget, left.expression ); if (isPropertyAccessExpression(left)) { assignmentTarget = factory2.createPropertyAccessExpression( propertyAccessTarget, left.name ); left = factory2.createPropertyAccessExpression( propertyAccessTargetAssignment, left.name ); } else { const elementAccessArgumentSimpleCopiable = isSimpleCopiableExpression(left.argumentExpression); const elementAccessArgument = elementAccessArgumentSimpleCopiable ? left.argumentExpression : factory2.createTempVariable(hoistVariableDeclaration); assignmentTarget = factory2.createElementAccessExpression( propertyAccessTarget, elementAccessArgument ); left = factory2.createElementAccessExpression( propertyAccessTargetAssignment, elementAccessArgumentSimpleCopiable ? left.argumentExpression : factory2.createAssignment( elementAccessArgument, left.argumentExpression ) ); } } return factory2.createBinaryExpression( left, nonAssignmentOperator, factory2.createParenthesizedExpression( factory2.createAssignment( assignmentTarget, right ) ) ); } } // src/compiler/transformers/esnext.ts function transformESNext(context) { const { factory: factory2, getEmitHelperFactory: emitHelpers, hoistVariableDeclaration, startLexicalEnvironment, endLexicalEnvironment } = context; let exportBindings; let exportVars; let defaultExportBinding; let exportEqualsBinding; return chainBundle(context, transformSourceFile); function transformSourceFile(node) { if (node.isDeclarationFile) { return node; } const visited = visitNode(node, visitor, isSourceFile); addEmitHelpers(visited, context.readEmitHelpers()); exportVars = void 0; exportBindings = void 0; defaultExportBinding = void 0; return visited; } function visitor(node) { if ((node.transformFlags & 4 /* ContainsESNext */) === 0) { return node; } switch (node.kind) { case 308 /* SourceFile */: return visitSourceFile(node); case 242 /* Block */: return visitBlock(node); case 249 /* ForStatement */: return visitForStatement(node); case 251 /* ForOfStatement */: return visitForOfStatement(node); case 256 /* SwitchStatement */: return visitSwitchStatement(node); default: return visitEachChild(node, visitor, context); } } function visitSourceFile(node) { const usingKind = getUsingKindOfStatements(node.statements); if (usingKind) { startLexicalEnvironment(); exportBindings = new IdentifierNameMap(); exportVars = []; const prologueCount = countPrologueStatements(node.statements); const topLevelStatements = []; addRange(topLevelStatements, visitArray(node.statements, visitor, isStatement, 0, prologueCount)); let pos = prologueCount; while (pos < node.statements.length) { const statement = node.statements[pos]; if (getUsingKind(statement) !== 0 /* None */) { if (pos > prologueCount) { addRange(topLevelStatements, visitNodes2(node.statements, visitor, isStatement, prologueCount, pos - prologueCount)); } break; } pos++; } Debug.assert(pos < node.statements.length, "Should have encountered at least one 'using' statement."); const envBinding = createEnvBinding(); const bodyStatements = transformUsingDeclarations(node.statements, pos, node.statements.length, envBinding, topLevelStatements); if (exportBindings.size) { append( topLevelStatements, factory2.createExportDeclaration( /*modifiers*/ void 0, /*isTypeOnly*/ false, factory2.createNamedExports(arrayFrom(exportBindings.values())) ) ); } addRange(topLevelStatements, endLexicalEnvironment()); if (exportVars.length) { topLevelStatements.push(factory2.createVariableStatement( factory2.createModifiersFromModifierFlags(32 /* Export */), factory2.createVariableDeclarationList( exportVars, 1 /* Let */ ) )); } addRange(topLevelStatements, createDownlevelUsingStatements(bodyStatements, envBinding, usingKind === 2 /* Async */)); if (exportEqualsBinding) { topLevelStatements.push(factory2.createExportAssignment( /*modifiers*/ void 0, /*isExportEquals*/ true, exportEqualsBinding )); } return factory2.updateSourceFile(node, topLevelStatements); } return visitEachChild(node, visitor, context); } function visitBlock(node) { const usingKind = getUsingKindOfStatements(node.statements); if (usingKind) { const prologueCount = countPrologueStatements(node.statements); const envBinding = createEnvBinding(); return factory2.updateBlock( node, [ ...visitArray(node.statements, visitor, isStatement, 0, prologueCount), ...createDownlevelUsingStatements( transformUsingDeclarations( node.statements, prologueCount, node.statements.length, envBinding, /*topLevelStatements*/ void 0 ), envBinding, usingKind === 2 /* Async */ ) ] ); } return visitEachChild(node, visitor, context); } function visitForStatement(node) { if (node.initializer && isUsingVariableDeclarationList(node.initializer)) { return visitNode( factory2.createBlock([ factory2.createVariableStatement( /*modifiers*/ void 0, node.initializer ), factory2.updateForStatement( node, /*initializer*/ void 0, node.condition, node.incrementor, node.statement ) ]), visitor, isStatement ); } return visitEachChild(node, visitor, context); } function visitForOfStatement(node) { if (isUsingVariableDeclarationList(node.initializer)) { const forInitializer = node.initializer; const forDecl = firstOrUndefined(forInitializer.declarations) || factory2.createVariableDeclaration(factory2.createTempVariable( /*recordTempVariable*/ void 0 )); const isAwaitUsing = getUsingKindOfVariableDeclarationList(forInitializer) === 2 /* Async */; const temp = factory2.getGeneratedNameForNode(forDecl.name); const usingVar = factory2.updateVariableDeclaration( forDecl, forDecl.name, /*exclamationToken*/ void 0, /*type*/ void 0, temp ); const usingVarList = factory2.createVariableDeclarationList([usingVar], isAwaitUsing ? 6 /* AwaitUsing */ : 4 /* Using */); const usingVarStatement = factory2.createVariableStatement( /*modifiers*/ void 0, usingVarList ); return visitNode( factory2.updateForOfStatement( node, node.awaitModifier, factory2.createVariableDeclarationList([ factory2.createVariableDeclaration(temp) ], 2 /* Const */), node.expression, isBlock(node.statement) ? factory2.updateBlock(node.statement, [ usingVarStatement, ...node.statement.statements ]) : factory2.createBlock( [ usingVarStatement, node.statement ], /*multiLine*/ true ) ), visitor, isStatement ); } return visitEachChild(node, visitor, context); } function visitCaseOrDefaultClause(node, envBinding) { if (getUsingKindOfStatements(node.statements) !== 0 /* None */) { if (isCaseClause(node)) { return factory2.updateCaseClause( node, visitNode(node.expression, visitor, isExpression), transformUsingDeclarations( node.statements, /*start*/ 0, node.statements.length, envBinding, /*topLevelStatements*/ void 0 ) ); } else { return factory2.updateDefaultClause( node, transformUsingDeclarations( node.statements, /*start*/ 0, node.statements.length, envBinding, /*topLevelStatements*/ void 0 ) ); } } return visitEachChild(node, visitor, context); } function visitSwitchStatement(node) { const usingKind = getUsingKindOfCaseOrDefaultClauses(node.caseBlock.clauses); if (usingKind) { const envBinding = createEnvBinding(); return createDownlevelUsingStatements( [ factory2.updateSwitchStatement( node, visitNode(node.expression, visitor, isExpression), factory2.updateCaseBlock( node.caseBlock, node.caseBlock.clauses.map((clause) => visitCaseOrDefaultClause(clause, envBinding)) ) ) ], envBinding, usingKind === 2 /* Async */ ); } return visitEachChild(node, visitor, context); } function transformUsingDeclarations(statementsIn, start, end, envBinding, topLevelStatements) { const statements = []; for (let i = start; i < end; i++) { const statement = statementsIn[i]; const usingKind = getUsingKind(statement); if (usingKind) { Debug.assertNode(statement, isVariableStatement); const declarations = []; for (let declaration of statement.declarationList.declarations) { if (!isIdentifier(declaration.name)) { declarations.length = 0; break; } if (isNamedEvaluation(declaration)) { declaration = transformNamedEvaluation(context, declaration); } const initializer = visitNode(declaration.initializer, visitor, isExpression) ?? factory2.createVoidZero(); declarations.push(factory2.updateVariableDeclaration( declaration, declaration.name, /*exclamationToken*/ void 0, /*type*/ void 0, emitHelpers().createAddDisposableResourceHelper( envBinding, initializer, usingKind === 2 /* Async */ ) )); } if (declarations.length) { const varList = factory2.createVariableDeclarationList(declarations, 2 /* Const */); setOriginalNode(varList, statement.declarationList); setTextRange(varList, statement.declarationList); hoistOrAppendNode(factory2.updateVariableStatement( statement, /*modifiers*/ void 0, varList )); continue; } } const result = visitor(statement); if (isArray(result)) { result.forEach(hoistOrAppendNode); } else if (result) { hoistOrAppendNode(result); } } return statements; function hoistOrAppendNode(node) { Debug.assertNode(node, isStatement); append(statements, hoist(node)); } function hoist(node) { if (!topLevelStatements) return node; switch (node.kind) { case 273 /* ImportDeclaration */: case 272 /* ImportEqualsDeclaration */: case 279 /* ExportDeclaration */: case 263 /* FunctionDeclaration */: return hoistImportOrExportOrHoistedDeclaration(node, topLevelStatements); case 278 /* ExportAssignment */: return hoistExportAssignment(node); case 264 /* ClassDeclaration */: return hoistClassDeclaration(node); case 244 /* VariableStatement */: return hoistVariableStatement(node); } return node; } } function hoistImportOrExportOrHoistedDeclaration(node, topLevelStatements) { topLevelStatements.push(node); return void 0; } function hoistExportAssignment(node) { return node.isExportEquals ? hoistExportEquals(node) : hoistExportDefault(node); } function hoistExportDefault(node) { if (defaultExportBinding) { return node; } defaultExportBinding = factory2.createUniqueName("_default", 8 /* ReservedInNestedScopes */ | 32 /* FileLevel */ | 16 /* Optimistic */); hoistBindingIdentifier( defaultExportBinding, /*isExport*/ true, "default", node ); let expression = node.expression; let innerExpression = skipOuterExpressions(expression); if (isNamedEvaluation(innerExpression)) { innerExpression = transformNamedEvaluation( context, innerExpression, /*ignoreEmptyStringLiteral*/ false, "default" ); expression = factory2.restoreOuterExpressions(expression, innerExpression); } const assignment = factory2.createAssignment(defaultExportBinding, expression); return factory2.createExpressionStatement(assignment); } function hoistExportEquals(node) { if (exportEqualsBinding) { return node; } exportEqualsBinding = factory2.createUniqueName("_default", 8 /* ReservedInNestedScopes */ | 32 /* FileLevel */ | 16 /* Optimistic */); hoistVariableDeclaration(exportEqualsBinding); const assignment = factory2.createAssignment(exportEqualsBinding, node.expression); return factory2.createExpressionStatement(assignment); } function hoistClassDeclaration(node) { if (!node.name && defaultExportBinding) { return node; } const isExported = hasSyntacticModifier(node, 32 /* Export */); const isDefault = hasSyntacticModifier(node, 2048 /* Default */); let expression = factory2.converters.convertToClassExpression(node); if (node.name) { hoistBindingIdentifier( factory2.getLocalName(node), isExported && !isDefault, /*exportAlias*/ void 0, node ); expression = factory2.createAssignment(factory2.getDeclarationName(node), expression); if (isNamedEvaluation(expression)) { expression = transformNamedEvaluation( context, expression, /*ignoreEmptyStringLiteral*/ false ); } setOriginalNode(expression, node); setSourceMapRange(expression, node); setCommentRange(expression, node); } if (isDefault && !defaultExportBinding) { defaultExportBinding = factory2.createUniqueName("_default", 8 /* ReservedInNestedScopes */ | 32 /* FileLevel */ | 16 /* Optimistic */); hoistBindingIdentifier( defaultExportBinding, /*isExport*/ true, "default", node ); expression = factory2.createAssignment(defaultExportBinding, expression); if (isNamedEvaluation(expression)) { expression = transformNamedEvaluation( context, expression, /*ignoreEmptyStringLiteral*/ false, "default" ); } setOriginalNode(expression, node); } return factory2.createExpressionStatement(expression); } function hoistVariableStatement(node) { let expressions; const isExported = hasSyntacticModifier(node, 32 /* Export */); for (const variable of node.declarationList.declarations) { hoistBindingElement(variable, isExported, variable); if (variable.initializer) { expressions = append(expressions, hoistInitializedVariable(variable)); } } if (expressions) { const statement = factory2.createExpressionStatement(factory2.inlineExpressions(expressions)); setOriginalNode(statement, node); setCommentRange(statement, node); setSourceMapRange(statement, node); return statement; } return void 0; } function hoistInitializedVariable(node) { Debug.assertIsDefined(node.initializer); let target; if (isIdentifier(node.name)) { target = factory2.cloneNode(node.name); setEmitFlags(target, getEmitFlags(target) & ~(32768 /* LocalName */ | 16384 /* ExportName */ | 65536 /* InternalName */)); } else { target = factory2.converters.convertToAssignmentPattern(node.name); } const assignment = factory2.createAssignment(target, node.initializer); setOriginalNode(assignment, node); setCommentRange(assignment, node); setSourceMapRange(assignment, node); return assignment; } function hoistBindingElement(node, isExportedDeclaration, original) { if (isBindingPattern(node.name)) { for (const element of node.name.elements) { if (!isOmittedExpression(element)) { hoistBindingElement(element, isExportedDeclaration, original); } } } else { hoistBindingIdentifier( node.name, isExportedDeclaration, /*exportAlias*/ void 0, original ); } } function hoistBindingIdentifier(node, isExport, exportAlias, original) { const name = isGeneratedIdentifier(node) ? node : factory2.cloneNode(node); if (isExport) { if (exportAlias === void 0 && !isLocalName(name)) { const varDecl = factory2.createVariableDeclaration(name); if (original) { setOriginalNode(varDecl, original); } exportVars.push(varDecl); return; } const localName = exportAlias !== void 0 ? name : void 0; const exportName = exportAlias !== void 0 ? exportAlias : name; const specifier = factory2.createExportSpecifier( /*isTypeOnly*/ false, localName, exportName ); if (original) { setOriginalNode(specifier, original); } exportBindings.set(name, specifier); } hoistVariableDeclaration(name); } function createEnvBinding() { return factory2.createUniqueName("env"); } function createDownlevelUsingStatements(bodyStatements, envBinding, async) { const statements = []; const envObject = factory2.createObjectLiteralExpression([ factory2.createPropertyAssignment("stack", factory2.createArrayLiteralExpression()), factory2.createPropertyAssignment("error", factory2.createVoidZero()), factory2.createPropertyAssignment("hasError", factory2.createFalse()) ]); const envVar = factory2.createVariableDeclaration( envBinding, /*exclamationToken*/ void 0, /*type*/ void 0, envObject ); const envVarList = factory2.createVariableDeclarationList([envVar], 2 /* Const */); const envVarStatement = factory2.createVariableStatement( /*modifiers*/ void 0, envVarList ); statements.push(envVarStatement); const tryBlock = factory2.createBlock( bodyStatements, /*multiLine*/ true ); const bodyCatchBinding = factory2.createUniqueName("e"); const catchClause = factory2.createCatchClause( bodyCatchBinding, factory2.createBlock( [ factory2.createExpressionStatement( factory2.createAssignment( factory2.createPropertyAccessExpression(envBinding, "error"), bodyCatchBinding ) ), factory2.createExpressionStatement( factory2.createAssignment( factory2.createPropertyAccessExpression(envBinding, "hasError"), factory2.createTrue() ) ) ], /*multiLine*/ true ) ); let finallyBlock; if (async) { const result = factory2.createUniqueName("result"); finallyBlock = factory2.createBlock( [ factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList([ factory2.createVariableDeclaration( result, /*exclamationToken*/ void 0, /*type*/ void 0, emitHelpers().createDisposeResourcesHelper(envBinding) ) ], 2 /* Const */) ), factory2.createIfStatement(result, factory2.createExpressionStatement(factory2.createAwaitExpression(result))) ], /*multiLine*/ true ); } else { finallyBlock = factory2.createBlock( [ factory2.createExpressionStatement( emitHelpers().createDisposeResourcesHelper(envBinding) ) ], /*multiLine*/ true ); } const tryStatement = factory2.createTryStatement(tryBlock, catchClause, finallyBlock); statements.push(tryStatement); return statements; } } function countPrologueStatements(statements) { for (let i = 0; i < statements.length; i++) { if (!isPrologueDirective(statements[i]) && !isCustomPrologue(statements[i])) { return i; } } return 0; } function isUsingVariableDeclarationList(node) { return isVariableDeclarationList(node) && getUsingKindOfVariableDeclarationList(node) !== 0 /* None */; } function getUsingKindOfVariableDeclarationList(node) { return (node.flags & 7 /* BlockScoped */) === 6 /* AwaitUsing */ ? 2 /* Async */ : (node.flags & 7 /* BlockScoped */) === 4 /* Using */ ? 1 /* Sync */ : 0 /* None */; } function getUsingKindOfVariableStatement(node) { return getUsingKindOfVariableDeclarationList(node.declarationList); } function getUsingKind(statement) { return isVariableStatement(statement) ? getUsingKindOfVariableStatement(statement) : 0 /* None */; } function getUsingKindOfStatements(statements) { let result = 0 /* None */; for (const statement of statements) { const usingKind = getUsingKind(statement); if (usingKind === 2 /* Async */) return 2 /* Async */; if (usingKind > result) result = usingKind; } return result; } function getUsingKindOfCaseOrDefaultClauses(clauses) { let result = 0 /* None */; for (const clause of clauses) { const usingKind = getUsingKindOfStatements(clause.statements); if (usingKind === 2 /* Async */) return 2 /* Async */; if (usingKind > result) result = usingKind; } return result; } // src/compiler/transformers/jsx.ts function transformJsx(context) { const { factory: factory2, getEmitHelperFactory: emitHelpers } = context; const compilerOptions = context.getCompilerOptions(); let currentSourceFile; let currentFileState; return chainBundle(context, transformSourceFile); function getCurrentFileNameExpression() { if (currentFileState.filenameDeclaration) { return currentFileState.filenameDeclaration.name; } const declaration = factory2.createVariableDeclaration( factory2.createUniqueName("_jsxFileName", 16 /* Optimistic */ | 32 /* FileLevel */), /*exclamationToken*/ void 0, /*type*/ void 0, factory2.createStringLiteral(currentSourceFile.fileName) ); currentFileState.filenameDeclaration = declaration; return currentFileState.filenameDeclaration.name; } function getJsxFactoryCalleePrimitive(isStaticChildren) { return compilerOptions.jsx === 5 /* ReactJSXDev */ ? "jsxDEV" : isStaticChildren ? "jsxs" : "jsx"; } function getJsxFactoryCallee(isStaticChildren) { const type = getJsxFactoryCalleePrimitive(isStaticChildren); return getImplicitImportForName(type); } function getImplicitJsxFragmentReference() { return getImplicitImportForName("Fragment"); } function getImplicitImportForName(name) { var _a, _b; const importSource = name === "createElement" ? currentFileState.importSpecifier : getJSXRuntimeImport(currentFileState.importSpecifier, compilerOptions); const existing = (_b = (_a = currentFileState.utilizedImplicitRuntimeImports) == null ? void 0 : _a.get(importSource)) == null ? void 0 : _b.get(name); if (existing) { return existing.name; } if (!currentFileState.utilizedImplicitRuntimeImports) { currentFileState.utilizedImplicitRuntimeImports = /* @__PURE__ */ new Map(); } let specifierSourceImports = currentFileState.utilizedImplicitRuntimeImports.get(importSource); if (!specifierSourceImports) { specifierSourceImports = /* @__PURE__ */ new Map(); currentFileState.utilizedImplicitRuntimeImports.set(importSource, specifierSourceImports); } const generatedName = factory2.createUniqueName(`_${name}`, 16 /* Optimistic */ | 32 /* FileLevel */ | 64 /* AllowNameSubstitution */); const specifier = factory2.createImportSpecifier( /*isTypeOnly*/ false, factory2.createIdentifier(name), generatedName ); setIdentifierGeneratedImportReference(generatedName, specifier); specifierSourceImports.set(name, specifier); return generatedName; } function transformSourceFile(node) { if (node.isDeclarationFile) { return node; } currentSourceFile = node; currentFileState = {}; currentFileState.importSpecifier = getJSXImplicitImportBase(compilerOptions, node); let visited = visitEachChild(node, visitor, context); addEmitHelpers(visited, context.readEmitHelpers()); let statements = visited.statements; if (currentFileState.filenameDeclaration) { statements = insertStatementAfterCustomPrologue(statements.slice(), factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList([currentFileState.filenameDeclaration], 2 /* Const */) )); } if (currentFileState.utilizedImplicitRuntimeImports) { for (const [importSource, importSpecifiersMap] of arrayFrom(currentFileState.utilizedImplicitRuntimeImports.entries())) { if (isExternalModule(node)) { const importStatement = factory2.createImportDeclaration( /*modifiers*/ void 0, factory2.createImportClause( /*phaseModifier*/ void 0, /*name*/ void 0, factory2.createNamedImports(arrayFrom(importSpecifiersMap.values())) ), factory2.createStringLiteral(importSource), /*attributes*/ void 0 ); setParentRecursive( importStatement, /*incremental*/ false ); statements = insertStatementAfterCustomPrologue(statements.slice(), importStatement); } else if (isExternalOrCommonJsModule(node)) { const requireStatement = factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList([ factory2.createVariableDeclaration( factory2.createObjectBindingPattern(arrayFrom(importSpecifiersMap.values(), (s) => factory2.createBindingElement( /*dotDotDotToken*/ void 0, s.propertyName, s.name ))), /*exclamationToken*/ void 0, /*type*/ void 0, factory2.createCallExpression( factory2.createIdentifier("require"), /*typeArguments*/ void 0, [factory2.createStringLiteral(importSource)] ) ) ], 2 /* Const */) ); setParentRecursive( requireStatement, /*incremental*/ false ); statements = insertStatementAfterCustomPrologue(statements.slice(), requireStatement); } else { } } } if (statements !== visited.statements) { visited = factory2.updateSourceFile(visited, statements); } currentFileState = void 0; return visited; } function visitor(node) { if (node.transformFlags & 2 /* ContainsJsx */) { return visitorWorker(node); } else { return node; } } function visitorWorker(node) { switch (node.kind) { case 285 /* JsxElement */: return visitJsxElement( node, /*isChild*/ false ); case 286 /* JsxSelfClosingElement */: return visitJsxSelfClosingElement( node, /*isChild*/ false ); case 289 /* JsxFragment */: return visitJsxFragment( node, /*isChild*/ false ); case 295 /* JsxExpression */: return visitJsxExpression(node); default: return visitEachChild(node, visitor, context); } } function transformJsxChildToExpression(node) { switch (node.kind) { case 12 /* JsxText */: return visitJsxText(node); case 295 /* JsxExpression */: return visitJsxExpression(node); case 285 /* JsxElement */: return visitJsxElement( node, /*isChild*/ true ); case 286 /* JsxSelfClosingElement */: return visitJsxSelfClosingElement( node, /*isChild*/ true ); case 289 /* JsxFragment */: return visitJsxFragment( node, /*isChild*/ true ); default: return Debug.failBadSyntaxKind(node); } } function hasProto(obj) { return obj.properties.some( (p) => isPropertyAssignment(p) && (isIdentifier(p.name) && idText(p.name) === "__proto__" || isStringLiteral(p.name) && p.name.text === "__proto__") ); } function hasKeyAfterPropsSpread(node) { let spread = false; for (const elem of node.attributes.properties) { if (isJsxSpreadAttribute(elem) && (!isObjectLiteralExpression(elem.expression) || elem.expression.properties.some(isSpreadAssignment))) { spread = true; } else if (spread && isJsxAttribute(elem) && isIdentifier(elem.name) && elem.name.escapedText === "key") { return true; } } return false; } function shouldUseCreateElement(node) { return currentFileState.importSpecifier === void 0 || hasKeyAfterPropsSpread(node); } function visitJsxElement(node, isChild) { const tagTransform = shouldUseCreateElement(node.openingElement) ? visitJsxOpeningLikeElementCreateElement : visitJsxOpeningLikeElementJSX; return tagTransform( node.openingElement, node.children, isChild, /*location*/ node ); } function visitJsxSelfClosingElement(node, isChild) { const tagTransform = shouldUseCreateElement(node) ? visitJsxOpeningLikeElementCreateElement : visitJsxOpeningLikeElementJSX; return tagTransform( node, /*children*/ void 0, isChild, /*location*/ node ); } function visitJsxFragment(node, isChild) { const tagTransform = currentFileState.importSpecifier === void 0 ? visitJsxOpeningFragmentCreateElement : visitJsxOpeningFragmentJSX; return tagTransform( node.openingFragment, node.children, isChild, /*location*/ node ); } function convertJsxChildrenToChildrenPropObject(children) { const prop = convertJsxChildrenToChildrenPropAssignment(children); return prop && factory2.createObjectLiteralExpression([prop]); } function convertJsxChildrenToChildrenPropAssignment(children) { const nonWhitespaceChildren = getSemanticJsxChildren(children); if (length(nonWhitespaceChildren) === 1 && !nonWhitespaceChildren[0].dotDotDotToken) { const result2 = transformJsxChildToExpression(nonWhitespaceChildren[0]); return result2 && factory2.createPropertyAssignment("children", result2); } const result = mapDefined(children, transformJsxChildToExpression); return length(result) ? factory2.createPropertyAssignment("children", factory2.createArrayLiteralExpression(result)) : void 0; } function visitJsxOpeningLikeElementJSX(node, children, isChild, location) { const tagName = getTagName(node); const childrenProp = children && children.length ? convertJsxChildrenToChildrenPropAssignment(children) : void 0; const keyAttr = find(node.attributes.properties, (p) => !!p.name && isIdentifier(p.name) && p.name.escapedText === "key"); const attrs = keyAttr ? filter(node.attributes.properties, (p) => p !== keyAttr) : node.attributes.properties; const objectProperties = length(attrs) ? transformJsxAttributesToObjectProps(attrs, childrenProp) : factory2.createObjectLiteralExpression(childrenProp ? [childrenProp] : emptyArray); return visitJsxOpeningLikeElementOrFragmentJSX( tagName, objectProperties, keyAttr, children || emptyArray, isChild, location ); } function visitJsxOpeningLikeElementOrFragmentJSX(tagName, objectProperties, keyAttr, children, isChild, location) { var _a; const nonWhitespaceChildren = getSemanticJsxChildren(children); const isStaticChildren = length(nonWhitespaceChildren) > 1 || !!((_a = nonWhitespaceChildren[0]) == null ? void 0 : _a.dotDotDotToken); const args = [tagName, objectProperties]; if (keyAttr) { args.push(transformJsxAttributeInitializer(keyAttr.initializer)); } if (compilerOptions.jsx === 5 /* ReactJSXDev */) { const originalFile = getOriginalNode(currentSourceFile); if (originalFile && isSourceFile(originalFile)) { if (keyAttr === void 0) { args.push(factory2.createVoidZero()); } args.push(isStaticChildren ? factory2.createTrue() : factory2.createFalse()); const lineCol = getLineAndCharacterOfPosition(originalFile, location.pos); args.push(factory2.createObjectLiteralExpression([ factory2.createPropertyAssignment("fileName", getCurrentFileNameExpression()), factory2.createPropertyAssignment("lineNumber", factory2.createNumericLiteral(lineCol.line + 1)), factory2.createPropertyAssignment("columnNumber", factory2.createNumericLiteral(lineCol.character + 1)) ])); args.push(factory2.createThis()); } } const element = setTextRange( factory2.createCallExpression( getJsxFactoryCallee(isStaticChildren), /*typeArguments*/ void 0, args ), location ); if (isChild) { startOnNewLine(element); } return element; } function visitJsxOpeningLikeElementCreateElement(node, children, isChild, location) { const tagName = getTagName(node); const attrs = node.attributes.properties; const objectProperties = length(attrs) ? transformJsxAttributesToObjectProps(attrs) : factory2.createNull(); const callee = currentFileState.importSpecifier === void 0 ? createJsxFactoryExpression( factory2, context.getEmitResolver().getJsxFactoryEntity(currentSourceFile), compilerOptions.reactNamespace, // TODO: GH#18217 node ) : getImplicitImportForName("createElement"); const element = createExpressionForJsxElement( factory2, callee, tagName, objectProperties, mapDefined(children, transformJsxChildToExpression), location ); if (isChild) { startOnNewLine(element); } return element; } function visitJsxOpeningFragmentJSX(_node, children, isChild, location) { let childrenProps; if (children && children.length) { const result = convertJsxChildrenToChildrenPropObject(children); if (result) { childrenProps = result; } } return visitJsxOpeningLikeElementOrFragmentJSX( getImplicitJsxFragmentReference(), childrenProps || factory2.createObjectLiteralExpression([]), /*keyAttr*/ void 0, children, isChild, location ); } function visitJsxOpeningFragmentCreateElement(node, children, isChild, location) { const element = createExpressionForJsxFragment( factory2, context.getEmitResolver().getJsxFactoryEntity(currentSourceFile), context.getEmitResolver().getJsxFragmentFactoryEntity(currentSourceFile), compilerOptions.reactNamespace, // TODO: GH#18217 mapDefined(children, transformJsxChildToExpression), node, location ); if (isChild) { startOnNewLine(element); } return element; } function transformJsxSpreadAttributeToProps(node) { if (isObjectLiteralExpression(node.expression) && !hasProto(node.expression)) { return sameMap(node.expression.properties, (p) => Debug.checkDefined(visitNode(p, visitor, isObjectLiteralElementLike))); } return factory2.createSpreadAssignment(Debug.checkDefined(visitNode(node.expression, visitor, isExpression))); } function transformJsxAttributesToObjectProps(attrs, children) { const target = getEmitScriptTarget(compilerOptions); return target && target >= 5 /* ES2018 */ ? factory2.createObjectLiteralExpression(transformJsxAttributesToProps(attrs, children)) : transformJsxAttributesToExpression(attrs, children); } function transformJsxAttributesToProps(attrs, children) { const props = flatten(spanMap(attrs, isJsxSpreadAttribute, (attrs2, isSpread) => flatten(map(attrs2, (attr) => isSpread ? transformJsxSpreadAttributeToProps(attr) : transformJsxAttributeToObjectLiteralElement(attr))))); if (children) { props.push(children); } return props; } function transformJsxAttributesToExpression(attrs, children) { const expressions = []; let properties = []; for (const attr of attrs) { if (isJsxSpreadAttribute(attr)) { if (isObjectLiteralExpression(attr.expression) && !hasProto(attr.expression)) { for (const prop of attr.expression.properties) { if (isSpreadAssignment(prop)) { finishObjectLiteralIfNeeded(); expressions.push(Debug.checkDefined(visitNode(prop.expression, visitor, isExpression))); continue; } properties.push(Debug.checkDefined(visitNode(prop, visitor))); } continue; } finishObjectLiteralIfNeeded(); expressions.push(Debug.checkDefined(visitNode(attr.expression, visitor, isExpression))); continue; } properties.push(transformJsxAttributeToObjectLiteralElement(attr)); } if (children) { properties.push(children); } finishObjectLiteralIfNeeded(); if (expressions.length && !isObjectLiteralExpression(expressions[0])) { expressions.unshift(factory2.createObjectLiteralExpression()); } return singleOrUndefined(expressions) || emitHelpers().createAssignHelper(expressions); function finishObjectLiteralIfNeeded() { if (properties.length) { expressions.push(factory2.createObjectLiteralExpression(properties)); properties = []; } } } function transformJsxAttributeToObjectLiteralElement(node) { const name = getAttributeName(node); const expression = transformJsxAttributeInitializer(node.initializer); return factory2.createPropertyAssignment(name, expression); } function transformJsxAttributeInitializer(node) { if (node === void 0) { return factory2.createTrue(); } if (node.kind === 11 /* StringLiteral */) { const singleQuote = node.singleQuote !== void 0 ? node.singleQuote : !isStringDoubleQuoted(node, currentSourceFile); const literal = factory2.createStringLiteral(tryDecodeEntities(node.text) || node.text, singleQuote); return setTextRange(literal, node); } if (node.kind === 295 /* JsxExpression */) { if (node.expression === void 0) { return factory2.createTrue(); } return Debug.checkDefined(visitNode(node.expression, visitor, isExpression)); } if (isJsxElement(node)) { return visitJsxElement( node, /*isChild*/ false ); } if (isJsxSelfClosingElement(node)) { return visitJsxSelfClosingElement( node, /*isChild*/ false ); } if (isJsxFragment(node)) { return visitJsxFragment( node, /*isChild*/ false ); } return Debug.failBadSyntaxKind(node); } function visitJsxText(node) { const fixed = fixupWhitespaceAndDecodeEntities(node.text); return fixed === void 0 ? void 0 : factory2.createStringLiteral(fixed); } function fixupWhitespaceAndDecodeEntities(text) { let acc; let firstNonWhitespace = 0; let lastNonWhitespace = -1; for (let i = 0; i < text.length; i++) { const c = text.charCodeAt(i); if (isLineBreak(c)) { if (firstNonWhitespace !== -1 && lastNonWhitespace !== -1) { acc = addLineOfJsxText(acc, text.substr(firstNonWhitespace, lastNonWhitespace - firstNonWhitespace + 1)); } firstNonWhitespace = -1; } else if (!isWhiteSpaceSingleLine(c)) { lastNonWhitespace = i; if (firstNonWhitespace === -1) { firstNonWhitespace = i; } } } return firstNonWhitespace !== -1 ? addLineOfJsxText(acc, text.substr(firstNonWhitespace)) : acc; } function addLineOfJsxText(acc, trimmedLine) { const decoded = decodeEntities(trimmedLine); return acc === void 0 ? decoded : acc + " " + decoded; } function decodeEntities(text) { return text.replace(/&((#((\d+)|x([\da-fA-F]+)))|(\w+));/g, (match, _all, _number, _digits, decimal, hex, word) => { if (decimal) { return utf16EncodeAsString(parseInt(decimal, 10)); } else if (hex) { return utf16EncodeAsString(parseInt(hex, 16)); } else { const ch = entities.get(word); return ch ? utf16EncodeAsString(ch) : match; } }); } function tryDecodeEntities(text) { const decoded = decodeEntities(text); return decoded === text ? void 0 : decoded; } function getTagName(node) { if (node.kind === 285 /* JsxElement */) { return getTagName(node.openingElement); } else { const tagName = node.tagName; if (isIdentifier(tagName) && isIntrinsicJsxName(tagName.escapedText)) { return factory2.createStringLiteral(idText(tagName)); } else if (isJsxNamespacedName(tagName)) { return factory2.createStringLiteral(idText(tagName.namespace) + ":" + idText(tagName.name)); } else { return createExpressionFromEntityName(factory2, tagName); } } } function getAttributeName(node) { const name = node.name; if (isIdentifier(name)) { const text = idText(name); return /^[A-Z_]\w*$/i.test(text) ? name : factory2.createStringLiteral(text); } return factory2.createStringLiteral(idText(name.namespace) + ":" + idText(name.name)); } function visitJsxExpression(node) { const expression = visitNode(node.expression, visitor, isExpression); return node.dotDotDotToken ? factory2.createSpreadElement(expression) : expression; } } var entities = new Map(Object.entries({ quot: 34, amp: 38, apos: 39, lt: 60, gt: 62, nbsp: 160, iexcl: 161, cent: 162, pound: 163, curren: 164, yen: 165, brvbar: 166, sect: 167, uml: 168, copy: 169, ordf: 170, laquo: 171, not: 172, shy: 173, reg: 174, macr: 175, deg: 176, plusmn: 177, sup2: 178, sup3: 179, acute: 180, micro: 181, para: 182, middot: 183, cedil: 184, sup1: 185, ordm: 186, raquo: 187, frac14: 188, frac12: 189, frac34: 190, iquest: 191, Agrave: 192, Aacute: 193, Acirc: 194, Atilde: 195, Auml: 196, Aring: 197, AElig: 198, Ccedil: 199, Egrave: 200, Eacute: 201, Ecirc: 202, Euml: 203, Igrave: 204, Iacute: 205, Icirc: 206, Iuml: 207, ETH: 208, Ntilde: 209, Ograve: 210, Oacute: 211, Ocirc: 212, Otilde: 213, Ouml: 214, times: 215, Oslash: 216, Ugrave: 217, Uacute: 218, Ucirc: 219, Uuml: 220, Yacute: 221, THORN: 222, szlig: 223, agrave: 224, aacute: 225, acirc: 226, atilde: 227, auml: 228, aring: 229, aelig: 230, ccedil: 231, egrave: 232, eacute: 233, ecirc: 234, euml: 235, igrave: 236, iacute: 237, icirc: 238, iuml: 239, eth: 240, ntilde: 241, ograve: 242, oacute: 243, ocirc: 244, otilde: 245, ouml: 246, divide: 247, oslash: 248, ugrave: 249, uacute: 250, ucirc: 251, uuml: 252, yacute: 253, thorn: 254, yuml: 255, OElig: 338, oelig: 339, Scaron: 352, scaron: 353, Yuml: 376, fnof: 402, circ: 710, tilde: 732, Alpha: 913, Beta: 914, Gamma: 915, Delta: 916, Epsilon: 917, Zeta: 918, Eta: 919, Theta: 920, Iota: 921, Kappa: 922, Lambda: 923, Mu: 924, Nu: 925, Xi: 926, Omicron: 927, Pi: 928, Rho: 929, Sigma: 931, Tau: 932, Upsilon: 933, Phi: 934, Chi: 935, Psi: 936, Omega: 937, alpha: 945, beta: 946, gamma: 947, delta: 948, epsilon: 949, zeta: 950, eta: 951, theta: 952, iota: 953, kappa: 954, lambda: 955, mu: 956, nu: 957, xi: 958, omicron: 959, pi: 960, rho: 961, sigmaf: 962, sigma: 963, tau: 964, upsilon: 965, phi: 966, chi: 967, psi: 968, omega: 969, thetasym: 977, upsih: 978, piv: 982, ensp: 8194, emsp: 8195, thinsp: 8201, zwnj: 8204, zwj: 8205, lrm: 8206, rlm: 8207, ndash: 8211, mdash: 8212, lsquo: 8216, rsquo: 8217, sbquo: 8218, ldquo: 8220, rdquo: 8221, bdquo: 8222, dagger: 8224, Dagger: 8225, bull: 8226, hellip: 8230, permil: 8240, prime: 8242, Prime: 8243, lsaquo: 8249, rsaquo: 8250, oline: 8254, frasl: 8260, euro: 8364, image: 8465, weierp: 8472, real: 8476, trade: 8482, alefsym: 8501, larr: 8592, uarr: 8593, rarr: 8594, darr: 8595, harr: 8596, crarr: 8629, lArr: 8656, uArr: 8657, rArr: 8658, dArr: 8659, hArr: 8660, forall: 8704, part: 8706, exist: 8707, empty: 8709, nabla: 8711, isin: 8712, notin: 8713, ni: 8715, prod: 8719, sum: 8721, minus: 8722, lowast: 8727, radic: 8730, prop: 8733, infin: 8734, ang: 8736, and: 8743, or: 8744, cap: 8745, cup: 8746, int: 8747, there4: 8756, sim: 8764, cong: 8773, asymp: 8776, ne: 8800, equiv: 8801, le: 8804, ge: 8805, sub: 8834, sup: 8835, nsub: 8836, sube: 8838, supe: 8839, oplus: 8853, otimes: 8855, perp: 8869, sdot: 8901, lceil: 8968, rceil: 8969, lfloor: 8970, rfloor: 8971, lang: 9001, rang: 9002, loz: 9674, spades: 9824, clubs: 9827, hearts: 9829, diams: 9830 })); // src/compiler/transformers/es2016.ts function transformES2016(context) { const { factory: factory2, hoistVariableDeclaration } = context; return chainBundle(context, transformSourceFile); function transformSourceFile(node) { if (node.isDeclarationFile) { return node; } return visitEachChild(node, visitor, context); } function visitor(node) { if ((node.transformFlags & 512 /* ContainsES2016 */) === 0) { return node; } switch (node.kind) { case 227 /* BinaryExpression */: return visitBinaryExpression(node); default: return visitEachChild(node, visitor, context); } } function visitBinaryExpression(node) { switch (node.operatorToken.kind) { case 68 /* AsteriskAsteriskEqualsToken */: return visitExponentiationAssignmentExpression(node); case 43 /* AsteriskAsteriskToken */: return visitExponentiationExpression(node); default: return visitEachChild(node, visitor, context); } } function visitExponentiationAssignmentExpression(node) { let target; let value; const left = visitNode(node.left, visitor, isExpression); const right = visitNode(node.right, visitor, isExpression); if (isElementAccessExpression(left)) { const expressionTemp = factory2.createTempVariable(hoistVariableDeclaration); const argumentExpressionTemp = factory2.createTempVariable(hoistVariableDeclaration); target = setTextRange( factory2.createElementAccessExpression( setTextRange(factory2.createAssignment(expressionTemp, left.expression), left.expression), setTextRange(factory2.createAssignment(argumentExpressionTemp, left.argumentExpression), left.argumentExpression) ), left ); value = setTextRange( factory2.createElementAccessExpression( expressionTemp, argumentExpressionTemp ), left ); } else if (isPropertyAccessExpression(left)) { const expressionTemp = factory2.createTempVariable(hoistVariableDeclaration); target = setTextRange( factory2.createPropertyAccessExpression( setTextRange(factory2.createAssignment(expressionTemp, left.expression), left.expression), left.name ), left ); value = setTextRange( factory2.createPropertyAccessExpression( expressionTemp, left.name ), left ); } else { target = left; value = left; } return setTextRange( factory2.createAssignment( target, setTextRange(factory2.createGlobalMethodCall("Math", "pow", [value, right]), node) ), node ); } function visitExponentiationExpression(node) { const left = visitNode(node.left, visitor, isExpression); const right = visitNode(node.right, visitor, isExpression); return setTextRange(factory2.createGlobalMethodCall("Math", "pow", [left, right]), node); } } // src/compiler/transformers/es2015.ts function createSpreadSegment(kind, expression) { return { kind, expression }; } function transformES2015(context) { const { factory: factory2, getEmitHelperFactory: emitHelpers, startLexicalEnvironment, resumeLexicalEnvironment, endLexicalEnvironment, hoistVariableDeclaration } = context; const compilerOptions = context.getCompilerOptions(); const resolver = context.getEmitResolver(); const previousOnSubstituteNode = context.onSubstituteNode; const previousOnEmitNode = context.onEmitNode; context.onEmitNode = onEmitNode; context.onSubstituteNode = onSubstituteNode; let currentSourceFile; let currentText; let hierarchyFacts; let taggedTemplateStringDeclarations; function recordTaggedTemplateString(temp) { taggedTemplateStringDeclarations = append( taggedTemplateStringDeclarations, factory2.createVariableDeclaration(temp) ); } let convertedLoopState; let enabledSubstitutions = 0 /* None */; return chainBundle(context, transformSourceFile); function transformSourceFile(node) { if (node.isDeclarationFile) { return node; } currentSourceFile = node; currentText = node.text; const visited = visitSourceFile(node); addEmitHelpers(visited, context.readEmitHelpers()); currentSourceFile = void 0; currentText = void 0; taggedTemplateStringDeclarations = void 0; hierarchyFacts = 0 /* None */; return visited; } function enterSubtree(excludeFacts, includeFacts) { const ancestorFacts = hierarchyFacts; hierarchyFacts = (hierarchyFacts & ~excludeFacts | includeFacts) & 32767 /* AncestorFactsMask */; return ancestorFacts; } function exitSubtree(ancestorFacts, excludeFacts, includeFacts) { hierarchyFacts = (hierarchyFacts & ~excludeFacts | includeFacts) & -32768 /* SubtreeFactsMask */ | ancestorFacts; } function isReturnVoidStatementInConstructorWithCapturedSuper(node) { return (hierarchyFacts & 8192 /* ConstructorWithSuperCall */) !== 0 && node.kind === 254 /* ReturnStatement */ && !node.expression; } function isOrMayContainReturnCompletion(node) { return node.transformFlags & 4194304 /* ContainsHoistedDeclarationOrCompletion */ && (isReturnStatement(node) || isIfStatement(node) || isWithStatement(node) || isSwitchStatement(node) || isCaseBlock(node) || isCaseClause(node) || isDefaultClause(node) || isTryStatement(node) || isCatchClause(node) || isLabeledStatement(node) || isIterationStatement( node, /*lookInLabeledStatements*/ false ) || isBlock(node)); } function shouldVisitNode(node) { return (node.transformFlags & 1024 /* ContainsES2015 */) !== 0 || convertedLoopState !== void 0 || hierarchyFacts & 8192 /* ConstructorWithSuperCall */ && isOrMayContainReturnCompletion(node) || isIterationStatement( node, /*lookInLabeledStatements*/ false ) && shouldConvertIterationStatement(node) || (getInternalEmitFlags(node) & 1 /* TypeScriptClassWrapper */) !== 0; } function visitor(node) { return shouldVisitNode(node) ? visitorWorker( node, /*expressionResultIsUnused*/ false ) : node; } function visitorWithUnusedExpressionResult(node) { return shouldVisitNode(node) ? visitorWorker( node, /*expressionResultIsUnused*/ true ) : node; } function classWrapperStatementVisitor(node) { if (shouldVisitNode(node)) { const original = getOriginalNode(node); if (isPropertyDeclaration(original) && hasStaticModifier(original)) { const ancestorFacts = enterSubtree( 32670 /* StaticInitializerExcludes */, 16449 /* StaticInitializerIncludes */ ); const result = visitorWorker( node, /*expressionResultIsUnused*/ false ); exitSubtree(ancestorFacts, 229376 /* FunctionSubtreeExcludes */, 0 /* None */); return result; } return visitorWorker( node, /*expressionResultIsUnused*/ false ); } return node; } function callExpressionVisitor(node) { if (node.kind === 108 /* SuperKeyword */) { return visitSuperKeyword( node, /*isExpressionOfCall*/ true ); } return visitor(node); } function visitorWorker(node, expressionResultIsUnused2) { switch (node.kind) { case 126 /* StaticKeyword */: return void 0; // elide static keyword case 264 /* ClassDeclaration */: return visitClassDeclaration(node); case 232 /* ClassExpression */: return visitClassExpression(node); case 170 /* Parameter */: return visitParameter(node); case 263 /* FunctionDeclaration */: return visitFunctionDeclaration(node); case 220 /* ArrowFunction */: return visitArrowFunction(node); case 219 /* FunctionExpression */: return visitFunctionExpression(node); case 261 /* VariableDeclaration */: return visitVariableDeclaration(node); case 80 /* Identifier */: return visitIdentifier(node); case 262 /* VariableDeclarationList */: return visitVariableDeclarationList(node); case 256 /* SwitchStatement */: return visitSwitchStatement(node); case 270 /* CaseBlock */: return visitCaseBlock(node); case 242 /* Block */: return visitBlock( node, /*isFunctionBody*/ false ); case 253 /* BreakStatement */: case 252 /* ContinueStatement */: return visitBreakOrContinueStatement(node); case 257 /* LabeledStatement */: return visitLabeledStatement(node); case 247 /* DoStatement */: case 248 /* WhileStatement */: return visitDoOrWhileStatement( node, /*outermostLabeledStatement*/ void 0 ); case 249 /* ForStatement */: return visitForStatement( node, /*outermostLabeledStatement*/ void 0 ); case 250 /* ForInStatement */: return visitForInStatement( node, /*outermostLabeledStatement*/ void 0 ); case 251 /* ForOfStatement */: return visitForOfStatement( node, /*outermostLabeledStatement*/ void 0 ); case 245 /* ExpressionStatement */: return visitExpressionStatement(node); case 211 /* ObjectLiteralExpression */: return visitObjectLiteralExpression(node); case 300 /* CatchClause */: return visitCatchClause(node); case 305 /* ShorthandPropertyAssignment */: return visitShorthandPropertyAssignment(node); case 168 /* ComputedPropertyName */: return visitComputedPropertyName(node); case 210 /* ArrayLiteralExpression */: return visitArrayLiteralExpression(node); case 214 /* CallExpression */: return visitCallExpression(node); case 215 /* NewExpression */: return visitNewExpression(node); case 218 /* ParenthesizedExpression */: return visitParenthesizedExpression(node, expressionResultIsUnused2); case 227 /* BinaryExpression */: return visitBinaryExpression(node, expressionResultIsUnused2); case 357 /* CommaListExpression */: return visitCommaListExpression(node, expressionResultIsUnused2); case 15 /* NoSubstitutionTemplateLiteral */: case 16 /* TemplateHead */: case 17 /* TemplateMiddle */: case 18 /* TemplateTail */: return visitTemplateLiteral(node); case 11 /* StringLiteral */: return visitStringLiteral(node); case 9 /* NumericLiteral */: return visitNumericLiteral(node); case 216 /* TaggedTemplateExpression */: return visitTaggedTemplateExpression(node); case 229 /* TemplateExpression */: return visitTemplateExpression(node); case 230 /* YieldExpression */: return visitYieldExpression(node); case 231 /* SpreadElement */: return visitSpreadElement(node); case 108 /* SuperKeyword */: return visitSuperKeyword( node, /*isExpressionOfCall*/ false ); case 110 /* ThisKeyword */: return visitThisKeyword(node); case 237 /* MetaProperty */: return visitMetaProperty(node); case 175 /* MethodDeclaration */: return visitMethodDeclaration(node); case 178 /* GetAccessor */: case 179 /* SetAccessor */: return visitAccessorDeclaration(node); case 244 /* VariableStatement */: return visitVariableStatement(node); case 254 /* ReturnStatement */: return visitReturnStatement(node); case 223 /* VoidExpression */: return visitVoidExpression(node); default: return visitEachChild(node, visitor, context); } } function visitSourceFile(node) { const ancestorFacts = enterSubtree(8064 /* SourceFileExcludes */, 64 /* SourceFileIncludes */); const prologue = []; const statements = []; startLexicalEnvironment(); const statementOffset = factory2.copyPrologue( node.statements, prologue, /*ensureUseStrict*/ false, visitor ); addRange(statements, visitNodes2(node.statements, visitor, isStatement, statementOffset)); if (taggedTemplateStringDeclarations) { statements.push( factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList(taggedTemplateStringDeclarations) ) ); } factory2.mergeLexicalEnvironment(prologue, endLexicalEnvironment()); insertCaptureThisForNodeIfNeeded(prologue, node); exitSubtree(ancestorFacts, 0 /* None */, 0 /* None */); return factory2.updateSourceFile( node, setTextRange(factory2.createNodeArray(concatenate(prologue, statements)), node.statements) ); } function visitSwitchStatement(node) { if (convertedLoopState !== void 0) { const savedAllowedNonLabeledJumps = convertedLoopState.allowedNonLabeledJumps; convertedLoopState.allowedNonLabeledJumps |= 2 /* Break */; const result = visitEachChild(node, visitor, context); convertedLoopState.allowedNonLabeledJumps = savedAllowedNonLabeledJumps; return result; } return visitEachChild(node, visitor, context); } function visitCaseBlock(node) { const ancestorFacts = enterSubtree(7104 /* BlockScopeExcludes */, 0 /* BlockScopeIncludes */); const updated = visitEachChild(node, visitor, context); exitSubtree(ancestorFacts, 0 /* None */, 0 /* None */); return updated; } function returnCapturedThis(node) { return setOriginalNode(factory2.createReturnStatement(createCapturedThis()), node); } function createCapturedThis() { return factory2.createUniqueName("_this", 16 /* Optimistic */ | 32 /* FileLevel */); } function visitReturnStatement(node) { if (convertedLoopState) { convertedLoopState.nonLocalJumps |= 8 /* Return */; if (isReturnVoidStatementInConstructorWithCapturedSuper(node)) { node = returnCapturedThis(node); } return factory2.createReturnStatement( factory2.createObjectLiteralExpression( [ factory2.createPropertyAssignment( factory2.createIdentifier("value"), node.expression ? Debug.checkDefined(visitNode(node.expression, visitor, isExpression)) : factory2.createVoidZero() ) ] ) ); } else if (isReturnVoidStatementInConstructorWithCapturedSuper(node)) { return returnCapturedThis(node); } return visitEachChild(node, visitor, context); } function visitThisKeyword(node) { hierarchyFacts |= 65536 /* LexicalThis */; if (hierarchyFacts & 2 /* ArrowFunction */ && !(hierarchyFacts & 16384 /* StaticInitializer */)) { hierarchyFacts |= 131072 /* CapturedLexicalThis */; } if (convertedLoopState) { if (hierarchyFacts & 2 /* ArrowFunction */) { convertedLoopState.containsLexicalThis = true; return node; } return convertedLoopState.thisName || (convertedLoopState.thisName = factory2.createUniqueName("this")); } return node; } function visitVoidExpression(node) { return visitEachChild(node, visitorWithUnusedExpressionResult, context); } function visitIdentifier(node) { if (convertedLoopState) { if (resolver.isArgumentsLocalBinding(node)) { return convertedLoopState.argumentsName || (convertedLoopState.argumentsName = factory2.createUniqueName("arguments")); } } if (node.flags & 256 /* IdentifierHasExtendedUnicodeEscape */) { return setOriginalNode( setTextRange( factory2.createIdentifier(unescapeLeadingUnderscores(node.escapedText)), node ), node ); } return node; } function visitBreakOrContinueStatement(node) { if (convertedLoopState) { const jump = node.kind === 253 /* BreakStatement */ ? 2 /* Break */ : 4 /* Continue */; const canUseBreakOrContinue = node.label && convertedLoopState.labels && convertedLoopState.labels.get(idText(node.label)) || !node.label && convertedLoopState.allowedNonLabeledJumps & jump; if (!canUseBreakOrContinue) { let labelMarker; const label = node.label; if (!label) { if (node.kind === 253 /* BreakStatement */) { convertedLoopState.nonLocalJumps |= 2 /* Break */; labelMarker = "break"; } else { convertedLoopState.nonLocalJumps |= 4 /* Continue */; labelMarker = "continue"; } } else { if (node.kind === 253 /* BreakStatement */) { labelMarker = `break-${label.escapedText}`; setLabeledJump( convertedLoopState, /*isBreak*/ true, idText(label), labelMarker ); } else { labelMarker = `continue-${label.escapedText}`; setLabeledJump( convertedLoopState, /*isBreak*/ false, idText(label), labelMarker ); } } let returnExpression = factory2.createStringLiteral(labelMarker); if (convertedLoopState.loopOutParameters.length) { const outParams = convertedLoopState.loopOutParameters; let expr; for (let i = 0; i < outParams.length; i++) { const copyExpr = copyOutParameter(outParams[i], 1 /* ToOutParameter */); if (i === 0) { expr = copyExpr; } else { expr = factory2.createBinaryExpression(expr, 28 /* CommaToken */, copyExpr); } } returnExpression = factory2.createBinaryExpression(expr, 28 /* CommaToken */, returnExpression); } return factory2.createReturnStatement(returnExpression); } } return visitEachChild(node, visitor, context); } function visitClassDeclaration(node) { const variable = factory2.createVariableDeclaration( factory2.getLocalName( node, /*allowComments*/ true ), /*exclamationToken*/ void 0, /*type*/ void 0, transformClassLikeDeclarationToExpression(node) ); setOriginalNode(variable, node); const statements = []; const statement = factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList([variable]) ); setOriginalNode(statement, node); setTextRange(statement, node); startOnNewLine(statement); statements.push(statement); if (hasSyntacticModifier(node, 32 /* Export */)) { const exportStatement = hasSyntacticModifier(node, 2048 /* Default */) ? factory2.createExportDefault(factory2.getLocalName(node)) : factory2.createExternalModuleExport(factory2.getLocalName(node)); setOriginalNode(exportStatement, statement); statements.push(exportStatement); } return singleOrMany(statements); } function visitClassExpression(node) { return transformClassLikeDeclarationToExpression(node); } function transformClassLikeDeclarationToExpression(node) { if (node.name) { enableSubstitutionsForBlockScopedBindings(); } const extendsClauseElement = getClassExtendsHeritageElement(node); const classFunction = factory2.createFunctionExpression( /*modifiers*/ void 0, /*asteriskToken*/ void 0, /*name*/ void 0, /*typeParameters*/ void 0, extendsClauseElement ? [factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, createSyntheticSuper() )] : [], /*type*/ void 0, transformClassBody(node, extendsClauseElement) ); setEmitFlags(classFunction, getEmitFlags(node) & 131072 /* Indented */ | 1048576 /* ReuseTempVariableScope */); const inner = factory2.createPartiallyEmittedExpression(classFunction); setTextRangeEnd(inner, node.end); setEmitFlags(inner, 3072 /* NoComments */); const outer = factory2.createPartiallyEmittedExpression(inner); setTextRangeEnd(outer, skipTrivia(currentText, node.pos)); setEmitFlags(outer, 3072 /* NoComments */); const result = factory2.createParenthesizedExpression( factory2.createCallExpression( outer, /*typeArguments*/ void 0, extendsClauseElement ? [Debug.checkDefined(visitNode(extendsClauseElement.expression, visitor, isExpression))] : [] ) ); addSyntheticLeadingComment(result, 3 /* MultiLineCommentTrivia */, "* @class "); return result; } function transformClassBody(node, extendsClauseElement) { const statements = []; const name = factory2.getInternalName(node); const constructorLikeName = isIdentifierANonContextualKeyword(name) ? factory2.getGeneratedNameForNode(name) : name; startLexicalEnvironment(); addExtendsHelperIfNeeded(statements, node, extendsClauseElement); addConstructor(statements, node, constructorLikeName, extendsClauseElement); addClassMembers(statements, node); const closingBraceLocation = createTokenRange(skipTrivia(currentText, node.members.end), 20 /* CloseBraceToken */); const outer = factory2.createPartiallyEmittedExpression(constructorLikeName); setTextRangeEnd(outer, closingBraceLocation.end); setEmitFlags(outer, 3072 /* NoComments */); const statement = factory2.createReturnStatement(outer); setTextRangePos(statement, closingBraceLocation.pos); setEmitFlags(statement, 3072 /* NoComments */ | 768 /* NoTokenSourceMaps */); statements.push(statement); insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment()); const block = factory2.createBlock( setTextRange( factory2.createNodeArray(statements), /*location*/ node.members ), /*multiLine*/ true ); setEmitFlags(block, 3072 /* NoComments */); return block; } function addExtendsHelperIfNeeded(statements, node, extendsClauseElement) { if (extendsClauseElement) { statements.push( setTextRange( factory2.createExpressionStatement( emitHelpers().createExtendsHelper(factory2.getInternalName(node)) ), /*location*/ extendsClauseElement ) ); } } function addConstructor(statements, node, name, extendsClauseElement) { const savedConvertedLoopState = convertedLoopState; convertedLoopState = void 0; const ancestorFacts = enterSubtree(32662 /* ConstructorExcludes */, 73 /* ConstructorIncludes */); const constructor = getFirstConstructorWithBody(node); const hasSynthesizedSuper = hasSynthesizedDefaultSuperCall(constructor, extendsClauseElement !== void 0); const constructorFunction = factory2.createFunctionDeclaration( /*modifiers*/ void 0, /*asteriskToken*/ void 0, name, /*typeParameters*/ void 0, transformConstructorParameters(constructor, hasSynthesizedSuper), /*type*/ void 0, transformConstructorBody(constructor, node, extendsClauseElement, hasSynthesizedSuper) ); setTextRange(constructorFunction, constructor || node); if (extendsClauseElement) { setEmitFlags(constructorFunction, 16 /* CapturesThis */); } statements.push(constructorFunction); exitSubtree(ancestorFacts, 229376 /* FunctionSubtreeExcludes */, 0 /* None */); convertedLoopState = savedConvertedLoopState; } function transformConstructorParameters(constructor, hasSynthesizedSuper) { return visitParameterList(constructor && !hasSynthesizedSuper ? constructor.parameters : void 0, visitor, context) || []; } function createDefaultConstructorBody(node, isDerivedClass) { const statements = []; resumeLexicalEnvironment(); factory2.mergeLexicalEnvironment(statements, endLexicalEnvironment()); if (isDerivedClass) { statements.push(factory2.createReturnStatement(createDefaultSuperCallOrThis())); } const statementsArray = factory2.createNodeArray(statements); setTextRange(statementsArray, node.members); const block = factory2.createBlock( statementsArray, /*multiLine*/ true ); setTextRange(block, node); setEmitFlags(block, 3072 /* NoComments */); return block; } function isUninitializedVariableStatement(node) { return isVariableStatement(node) && every(node.declarationList.declarations, (decl) => isIdentifier(decl.name) && !decl.initializer); } function containsSuperCall(node) { if (isSuperCall(node)) { return true; } if (!(node.transformFlags & 134217728 /* ContainsLexicalSuper */)) { return false; } switch (node.kind) { // stop at function boundaries case 220 /* ArrowFunction */: case 219 /* FunctionExpression */: case 263 /* FunctionDeclaration */: case 177 /* Constructor */: case 176 /* ClassStaticBlockDeclaration */: return false; // only step into computed property names for class and object literal elements case 178 /* GetAccessor */: case 179 /* SetAccessor */: case 175 /* MethodDeclaration */: case 173 /* PropertyDeclaration */: { const named = node; if (isComputedPropertyName(named.name)) { return !!forEachChild(named.name, containsSuperCall); } return false; } } return !!forEachChild(node, containsSuperCall); } function transformConstructorBody(constructor, node, extendsClauseElement, hasSynthesizedSuper) { const isDerivedClass = !!extendsClauseElement && skipOuterExpressions(extendsClauseElement.expression).kind !== 106 /* NullKeyword */; if (!constructor) return createDefaultConstructorBody(node, isDerivedClass); const prologue = []; const statements = []; resumeLexicalEnvironment(); const standardPrologueEnd = factory2.copyStandardPrologue( constructor.body.statements, prologue, /*statementOffset*/ 0 ); if (hasSynthesizedSuper || containsSuperCall(constructor.body)) { hierarchyFacts |= 8192 /* ConstructorWithSuperCall */; } addRange(statements, visitNodes2(constructor.body.statements, visitor, isStatement, standardPrologueEnd)); const mayReplaceThis = isDerivedClass || hierarchyFacts & 8192 /* ConstructorWithSuperCall */; addDefaultValueAssignmentsIfNeeded2(prologue, constructor); addRestParameterIfNeeded(prologue, constructor, hasSynthesizedSuper); insertCaptureNewTargetIfNeeded(prologue, constructor); if (mayReplaceThis) { insertCaptureThisForNode(prologue, constructor, createActualThis()); } else { insertCaptureThisForNodeIfNeeded(prologue, constructor); } factory2.mergeLexicalEnvironment(prologue, endLexicalEnvironment()); if (mayReplaceThis && !isSufficientlyCoveredByReturnStatements(constructor.body)) { statements.push(factory2.createReturnStatement(createCapturedThis())); } const body = factory2.createBlock( setTextRange( factory2.createNodeArray( [ ...prologue, ...statements ] ), /*location*/ constructor.body.statements ), /*multiLine*/ true ); setTextRange(body, constructor.body); return simplifyConstructor(body, constructor.body, hasSynthesizedSuper); } function isCapturedThis(node) { return isGeneratedIdentifier(node) && idText(node) === "_this"; } function isSyntheticSuper(node) { return isGeneratedIdentifier(node) && idText(node) === "_super"; } function isThisCapturingVariableStatement(node) { return isVariableStatement(node) && node.declarationList.declarations.length === 1 && isThisCapturingVariableDeclaration(node.declarationList.declarations[0]); } function isThisCapturingVariableDeclaration(node) { return isVariableDeclaration(node) && isCapturedThis(node.name) && !!node.initializer; } function isThisCapturingAssignment(node) { return isAssignmentExpression( node, /*excludeCompoundAssignment*/ true ) && isCapturedThis(node.left); } function isTransformedSuperCall(node) { return isCallExpression(node) && isPropertyAccessExpression(node.expression) && isSyntheticSuper(node.expression.expression) && isIdentifier(node.expression.name) && (idText(node.expression.name) === "call" || idText(node.expression.name) === "apply") && node.arguments.length >= 1 && node.arguments[0].kind === 110 /* ThisKeyword */; } function isTransformedSuperCallWithFallback(node) { return isBinaryExpression(node) && node.operatorToken.kind === 57 /* BarBarToken */ && node.right.kind === 110 /* ThisKeyword */ && isTransformedSuperCall(node.left); } function isImplicitSuperCall(node) { return isBinaryExpression(node) && node.operatorToken.kind === 56 /* AmpersandAmpersandToken */ && isBinaryExpression(node.left) && node.left.operatorToken.kind === 38 /* ExclamationEqualsEqualsToken */ && isSyntheticSuper(node.left.left) && node.left.right.kind === 106 /* NullKeyword */ && isTransformedSuperCall(node.right) && idText(node.right.expression.name) === "apply"; } function isImplicitSuperCallWithFallback(node) { return isBinaryExpression(node) && node.operatorToken.kind === 57 /* BarBarToken */ && node.right.kind === 110 /* ThisKeyword */ && isImplicitSuperCall(node.left); } function isThisCapturingTransformedSuperCallWithFallback(node) { return isThisCapturingAssignment(node) && isTransformedSuperCallWithFallback(node.right); } function isThisCapturingImplicitSuperCallWithFallback(node) { return isThisCapturingAssignment(node) && isImplicitSuperCallWithFallback(node.right); } function isTransformedSuperCallLike(node) { return isTransformedSuperCall(node) || isTransformedSuperCallWithFallback(node) || isThisCapturingTransformedSuperCallWithFallback(node) || isImplicitSuperCall(node) || isImplicitSuperCallWithFallback(node) || isThisCapturingImplicitSuperCallWithFallback(node); } function simplifyConstructorInlineSuperInThisCaptureVariable(body) { for (let i = 0; i < body.statements.length - 1; i++) { const statement = body.statements[i]; if (!isThisCapturingVariableStatement(statement)) { continue; } const varDecl = statement.declarationList.declarations[0]; if (varDecl.initializer.kind !== 110 /* ThisKeyword */) { continue; } const thisCaptureStatementIndex = i; let superCallIndex = i + 1; while (superCallIndex < body.statements.length) { const statement2 = body.statements[superCallIndex]; if (isExpressionStatement(statement2)) { if (isTransformedSuperCallLike(skipOuterExpressions(statement2.expression))) { break; } } if (isUninitializedVariableStatement(statement2)) { superCallIndex++; continue; } return body; } const following = body.statements[superCallIndex]; let expression = following.expression; if (isThisCapturingAssignment(expression)) { expression = expression.right; } const newVarDecl = factory2.updateVariableDeclaration( varDecl, varDecl.name, /*exclamationToken*/ void 0, /*type*/ void 0, expression ); const newDeclList = factory2.updateVariableDeclarationList(statement.declarationList, [newVarDecl]); const newVarStatement = factory2.createVariableStatement(statement.modifiers, newDeclList); setOriginalNode(newVarStatement, following); setTextRange(newVarStatement, following); const newStatements = factory2.createNodeArray([ ...body.statements.slice(0, thisCaptureStatementIndex), // copy statements preceding to `var _this` ...body.statements.slice(thisCaptureStatementIndex + 1, superCallIndex), // copy intervening temp variables newVarStatement, ...body.statements.slice(superCallIndex + 1) // copy statements following `super.call(this, ...)` ]); setTextRange(newStatements, body.statements); return factory2.updateBlock(body, newStatements); } return body; } function simplifyConstructorInlineSuperReturn(body, original) { for (const statement of original.statements) { if (statement.transformFlags & 134217728 /* ContainsLexicalSuper */ && !getSuperCallFromStatement(statement)) { return body; } } const canElideThisCapturingVariable = !(original.transformFlags & 16384 /* ContainsLexicalThis */) && !(hierarchyFacts & 65536 /* LexicalThis */) && !(hierarchyFacts & 131072 /* CapturedLexicalThis */); for (let i = body.statements.length - 1; i > 0; i--) { const statement = body.statements[i]; if (isReturnStatement(statement) && statement.expression && isCapturedThis(statement.expression)) { const preceding = body.statements[i - 1]; let expression; if (isExpressionStatement(preceding) && isThisCapturingTransformedSuperCallWithFallback(skipOuterExpressions(preceding.expression))) { expression = preceding.expression; } else if (canElideThisCapturingVariable && isThisCapturingVariableStatement(preceding)) { const varDecl = preceding.declarationList.declarations[0]; if (isTransformedSuperCallLike(skipOuterExpressions(varDecl.initializer))) { expression = factory2.createAssignment( createCapturedThis(), varDecl.initializer ); } } if (!expression) { break; } const newReturnStatement = factory2.createReturnStatement(expression); setOriginalNode(newReturnStatement, preceding); setTextRange(newReturnStatement, preceding); const newStatements = factory2.createNodeArray([ ...body.statements.slice(0, i - 1), // copy all statements preceding `_super.call(this, ...)` newReturnStatement, ...body.statements.slice(i + 1) // copy all statements following `return _this;` ]); setTextRange(newStatements, body.statements); return factory2.updateBlock(body, newStatements); } } return body; } function elideUnusedThisCaptureWorker(node) { if (isThisCapturingVariableStatement(node)) { const varDecl = node.declarationList.declarations[0]; if (varDecl.initializer.kind === 110 /* ThisKeyword */) { return void 0; } } else if (isThisCapturingAssignment(node)) { return factory2.createPartiallyEmittedExpression(node.right, node); } switch (node.kind) { // stop at function boundaries case 220 /* ArrowFunction */: case 219 /* FunctionExpression */: case 263 /* FunctionDeclaration */: case 177 /* Constructor */: case 176 /* ClassStaticBlockDeclaration */: return node; // only step into computed property names for class and object literal elements case 178 /* GetAccessor */: case 179 /* SetAccessor */: case 175 /* MethodDeclaration */: case 173 /* PropertyDeclaration */: { const named = node; if (isComputedPropertyName(named.name)) { return factory2.replacePropertyName(named, visitEachChild( named.name, elideUnusedThisCaptureWorker, /*context*/ void 0 )); } return node; } } return visitEachChild( node, elideUnusedThisCaptureWorker, /*context*/ void 0 ); } function simplifyConstructorElideUnusedThisCapture(body, original) { if (original.transformFlags & 16384 /* ContainsLexicalThis */ || hierarchyFacts & 65536 /* LexicalThis */ || hierarchyFacts & 131072 /* CapturedLexicalThis */) { return body; } for (const statement of original.statements) { if (statement.transformFlags & 134217728 /* ContainsLexicalSuper */ && !getSuperCallFromStatement(statement)) { return body; } } return factory2.updateBlock(body, visitNodes2(body.statements, elideUnusedThisCaptureWorker, isStatement)); } function injectSuperPresenceCheckWorker(node) { if (isTransformedSuperCall(node) && node.arguments.length === 2 && isIdentifier(node.arguments[1]) && idText(node.arguments[1]) === "arguments") { return factory2.createLogicalAnd( factory2.createStrictInequality( createSyntheticSuper(), factory2.createNull() ), node ); } switch (node.kind) { // stop at function boundaries case 220 /* ArrowFunction */: case 219 /* FunctionExpression */: case 263 /* FunctionDeclaration */: case 177 /* Constructor */: case 176 /* ClassStaticBlockDeclaration */: return node; // only step into computed property names for class and object literal elements case 178 /* GetAccessor */: case 179 /* SetAccessor */: case 175 /* MethodDeclaration */: case 173 /* PropertyDeclaration */: { const named = node; if (isComputedPropertyName(named.name)) { return factory2.replacePropertyName(named, visitEachChild( named.name, injectSuperPresenceCheckWorker, /*context*/ void 0 )); } return node; } } return visitEachChild( node, injectSuperPresenceCheckWorker, /*context*/ void 0 ); } function complicateConstructorInjectSuperPresenceCheck(body) { return factory2.updateBlock(body, visitNodes2(body.statements, injectSuperPresenceCheckWorker, isStatement)); } function simplifyConstructor(body, original, hasSynthesizedSuper) { const inputBody = body; body = simplifyConstructorInlineSuperInThisCaptureVariable(body); body = simplifyConstructorInlineSuperReturn(body, original); if (body !== inputBody) { body = simplifyConstructorElideUnusedThisCapture(body, original); } if (hasSynthesizedSuper) { body = complicateConstructorInjectSuperPresenceCheck(body); } return body; } function isSufficientlyCoveredByReturnStatements(statement) { if (statement.kind === 254 /* ReturnStatement */) { return true; } else if (statement.kind === 246 /* IfStatement */) { const ifStatement = statement; if (ifStatement.elseStatement) { return isSufficientlyCoveredByReturnStatements(ifStatement.thenStatement) && isSufficientlyCoveredByReturnStatements(ifStatement.elseStatement); } } else if (statement.kind === 242 /* Block */) { const lastStatement = lastOrUndefined(statement.statements); if (lastStatement && isSufficientlyCoveredByReturnStatements(lastStatement)) { return true; } } return false; } function createActualThis() { return setEmitFlags(factory2.createThis(), 8 /* NoSubstitution */); } function createDefaultSuperCallOrThis() { return factory2.createLogicalOr( factory2.createLogicalAnd( factory2.createStrictInequality( createSyntheticSuper(), factory2.createNull() ), factory2.createFunctionApplyCall( createSyntheticSuper(), createActualThis(), factory2.createIdentifier("arguments") ) ), createActualThis() ); } function visitParameter(node) { if (node.dotDotDotToken) { return void 0; } else if (isBindingPattern(node.name)) { return setOriginalNode( setTextRange( factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, factory2.getGeneratedNameForNode(node), /*questionToken*/ void 0, /*type*/ void 0, /*initializer*/ void 0 ), /*location*/ node ), /*original*/ node ); } else if (node.initializer) { return setOriginalNode( setTextRange( factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, node.name, /*questionToken*/ void 0, /*type*/ void 0, /*initializer*/ void 0 ), /*location*/ node ), /*original*/ node ); } else { return node; } } function hasDefaultValueOrBindingPattern(node) { return node.initializer !== void 0 || isBindingPattern(node.name); } function addDefaultValueAssignmentsIfNeeded2(statements, node) { if (!some(node.parameters, hasDefaultValueOrBindingPattern)) { return false; } let added = false; for (const parameter of node.parameters) { const { name, initializer, dotDotDotToken } = parameter; if (dotDotDotToken) { continue; } if (isBindingPattern(name)) { added = insertDefaultValueAssignmentForBindingPattern(statements, parameter, name, initializer) || added; } else if (initializer) { insertDefaultValueAssignmentForInitializer(statements, parameter, name, initializer); added = true; } } return added; } function insertDefaultValueAssignmentForBindingPattern(statements, parameter, name, initializer) { if (name.elements.length > 0) { insertStatementAfterCustomPrologue( statements, setEmitFlags( factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList( flattenDestructuringBinding( parameter, visitor, context, 0 /* All */, factory2.getGeneratedNameForNode(parameter) ) ) ), 2097152 /* CustomPrologue */ ) ); return true; } else if (initializer) { insertStatementAfterCustomPrologue( statements, setEmitFlags( factory2.createExpressionStatement( factory2.createAssignment( factory2.getGeneratedNameForNode(parameter), Debug.checkDefined(visitNode(initializer, visitor, isExpression)) ) ), 2097152 /* CustomPrologue */ ) ); return true; } return false; } function insertDefaultValueAssignmentForInitializer(statements, parameter, name, initializer) { initializer = Debug.checkDefined(visitNode(initializer, visitor, isExpression)); const statement = factory2.createIfStatement( factory2.createTypeCheck(factory2.cloneNode(name), "undefined"), setEmitFlags( setTextRange( factory2.createBlock([ factory2.createExpressionStatement( setEmitFlags( setTextRange( factory2.createAssignment( // TODO(rbuckton): Does this need to be parented? setEmitFlags(setParent(setTextRange(factory2.cloneNode(name), name), name.parent), 96 /* NoSourceMap */), setEmitFlags(initializer, 96 /* NoSourceMap */ | getEmitFlags(initializer) | 3072 /* NoComments */) ), parameter ), 3072 /* NoComments */ ) ) ]), parameter ), 1 /* SingleLine */ | 64 /* NoTrailingSourceMap */ | 768 /* NoTokenSourceMaps */ | 3072 /* NoComments */ ) ); startOnNewLine(statement); setTextRange(statement, parameter); setEmitFlags(statement, 768 /* NoTokenSourceMaps */ | 64 /* NoTrailingSourceMap */ | 2097152 /* CustomPrologue */ | 3072 /* NoComments */); insertStatementAfterCustomPrologue(statements, statement); } function shouldAddRestParameter(node, inConstructorWithSynthesizedSuper) { return !!(node && node.dotDotDotToken && !inConstructorWithSynthesizedSuper); } function addRestParameterIfNeeded(statements, node, inConstructorWithSynthesizedSuper) { const prologueStatements = []; const parameter = lastOrUndefined(node.parameters); if (!shouldAddRestParameter(parameter, inConstructorWithSynthesizedSuper)) { return false; } const declarationName = parameter.name.kind === 80 /* Identifier */ ? setParent(setTextRange(factory2.cloneNode(parameter.name), parameter.name), parameter.name.parent) : factory2.createTempVariable( /*recordTempVariable*/ void 0 ); setEmitFlags(declarationName, 96 /* NoSourceMap */); const expressionName = parameter.name.kind === 80 /* Identifier */ ? factory2.cloneNode(parameter.name) : declarationName; const restIndex = node.parameters.length - 1; const temp = factory2.createLoopVariable(); prologueStatements.push( setEmitFlags( setTextRange( factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList([ factory2.createVariableDeclaration( declarationName, /*exclamationToken*/ void 0, /*type*/ void 0, factory2.createArrayLiteralExpression([]) ) ]) ), /*location*/ parameter ), 2097152 /* CustomPrologue */ ) ); const forStatement = factory2.createForStatement( setTextRange( factory2.createVariableDeclarationList([ factory2.createVariableDeclaration( temp, /*exclamationToken*/ void 0, /*type*/ void 0, factory2.createNumericLiteral(restIndex) ) ]), parameter ), setTextRange( factory2.createLessThan( temp, factory2.createPropertyAccessExpression(factory2.createIdentifier("arguments"), "length") ), parameter ), setTextRange(factory2.createPostfixIncrement(temp), parameter), factory2.createBlock([ startOnNewLine( setTextRange( factory2.createExpressionStatement( factory2.createAssignment( factory2.createElementAccessExpression( expressionName, restIndex === 0 ? temp : factory2.createSubtract(temp, factory2.createNumericLiteral(restIndex)) ), factory2.createElementAccessExpression(factory2.createIdentifier("arguments"), temp) ) ), /*location*/ parameter ) ) ]) ); setEmitFlags(forStatement, 2097152 /* CustomPrologue */); startOnNewLine(forStatement); prologueStatements.push(forStatement); if (parameter.name.kind !== 80 /* Identifier */) { prologueStatements.push( setEmitFlags( setTextRange( factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList( flattenDestructuringBinding(parameter, visitor, context, 0 /* All */, expressionName) ) ), parameter ), 2097152 /* CustomPrologue */ ) ); } insertStatementsAfterCustomPrologue(statements, prologueStatements); return true; } function insertCaptureThisForNodeIfNeeded(statements, node) { if (hierarchyFacts & 131072 /* CapturedLexicalThis */ && node.kind !== 220 /* ArrowFunction */) { insertCaptureThisForNode(statements, node, factory2.createThis()); return true; } return false; } function insertCaptureThisForNode(statements, node, initializer) { enableSubstitutionsForCapturedThis(); const captureThisStatement = factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList([ factory2.createVariableDeclaration( createCapturedThis(), /*exclamationToken*/ void 0, /*type*/ void 0, initializer ) ]) ); setEmitFlags(captureThisStatement, 3072 /* NoComments */ | 2097152 /* CustomPrologue */); setSourceMapRange(captureThisStatement, node); insertStatementAfterCustomPrologue(statements, captureThisStatement); } function insertCaptureNewTargetIfNeeded(statements, node) { if (hierarchyFacts & 32768 /* NewTarget */) { let newTarget; switch (node.kind) { case 220 /* ArrowFunction */: return statements; case 175 /* MethodDeclaration */: case 178 /* GetAccessor */: case 179 /* SetAccessor */: newTarget = factory2.createVoidZero(); break; case 177 /* Constructor */: newTarget = factory2.createPropertyAccessExpression( setEmitFlags(factory2.createThis(), 8 /* NoSubstitution */), "constructor" ); break; case 263 /* FunctionDeclaration */: case 219 /* FunctionExpression */: newTarget = factory2.createConditionalExpression( factory2.createLogicalAnd( setEmitFlags(factory2.createThis(), 8 /* NoSubstitution */), factory2.createBinaryExpression( setEmitFlags(factory2.createThis(), 8 /* NoSubstitution */), 104 /* InstanceOfKeyword */, factory2.getLocalName(node) ) ), /*questionToken*/ void 0, factory2.createPropertyAccessExpression( setEmitFlags(factory2.createThis(), 8 /* NoSubstitution */), "constructor" ), /*colonToken*/ void 0, factory2.createVoidZero() ); break; default: return Debug.failBadSyntaxKind(node); } const captureNewTargetStatement = factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList([ factory2.createVariableDeclaration( factory2.createUniqueName("_newTarget", 16 /* Optimistic */ | 32 /* FileLevel */), /*exclamationToken*/ void 0, /*type*/ void 0, newTarget ) ]) ); setEmitFlags(captureNewTargetStatement, 3072 /* NoComments */ | 2097152 /* CustomPrologue */); insertStatementAfterCustomPrologue(statements, captureNewTargetStatement); } return statements; } function addClassMembers(statements, node) { for (const member of node.members) { switch (member.kind) { case 241 /* SemicolonClassElement */: statements.push(transformSemicolonClassElementToStatement(member)); break; case 175 /* MethodDeclaration */: statements.push(transformClassMethodDeclarationToStatement(getClassMemberPrefix(node, member), member, node)); break; case 178 /* GetAccessor */: case 179 /* SetAccessor */: const accessors = getAllAccessorDeclarations(node.members, member); if (member === accessors.firstAccessor) { statements.push(transformAccessorsToStatement(getClassMemberPrefix(node, member), accessors, node)); } break; case 177 /* Constructor */: case 176 /* ClassStaticBlockDeclaration */: break; default: Debug.failBadSyntaxKind(member, currentSourceFile && currentSourceFile.fileName); break; } } } function transformSemicolonClassElementToStatement(member) { return setTextRange(factory2.createEmptyStatement(), member); } function transformClassMethodDeclarationToStatement(receiver, member, container) { const commentRange = getCommentRange(member); const sourceMapRange = getSourceMapRange(member); const memberFunction = transformFunctionLikeToExpression( member, /*location*/ member, /*name*/ void 0, container ); const propertyName = visitNode(member.name, visitor, isPropertyName); Debug.assert(propertyName); let e; if (!isPrivateIdentifier(propertyName) && getUseDefineForClassFields(context.getCompilerOptions())) { const name = isComputedPropertyName(propertyName) ? propertyName.expression : isIdentifier(propertyName) ? factory2.createStringLiteral(unescapeLeadingUnderscores(propertyName.escapedText)) : propertyName; e = factory2.createObjectDefinePropertyCall(receiver, name, factory2.createPropertyDescriptor({ value: memberFunction, enumerable: false, writable: true, configurable: true })); } else { const memberName = createMemberAccessForPropertyName( factory2, receiver, propertyName, /*location*/ member.name ); e = factory2.createAssignment(memberName, memberFunction); } setEmitFlags(memberFunction, 3072 /* NoComments */); setSourceMapRange(memberFunction, sourceMapRange); const statement = setTextRange( factory2.createExpressionStatement(e), /*location*/ member ); setOriginalNode(statement, member); setCommentRange(statement, commentRange); setEmitFlags(statement, 96 /* NoSourceMap */); return statement; } function transformAccessorsToStatement(receiver, accessors, container) { const statement = factory2.createExpressionStatement(transformAccessorsToExpression( receiver, accessors, container, /*startsOnNewLine*/ false )); setEmitFlags(statement, 3072 /* NoComments */); setSourceMapRange(statement, getSourceMapRange(accessors.firstAccessor)); return statement; } function transformAccessorsToExpression(receiver, { firstAccessor, getAccessor, setAccessor }, container, startsOnNewLine) { const target = setParent(setTextRange(factory2.cloneNode(receiver), receiver), receiver.parent); setEmitFlags(target, 3072 /* NoComments */ | 64 /* NoTrailingSourceMap */); setSourceMapRange(target, firstAccessor.name); const visitedAccessorName = visitNode(firstAccessor.name, visitor, isPropertyName); Debug.assert(visitedAccessorName); if (isPrivateIdentifier(visitedAccessorName)) { return Debug.failBadSyntaxKind(visitedAccessorName, "Encountered unhandled private identifier while transforming ES2015."); } const propertyName = createExpressionForPropertyName(factory2, visitedAccessorName); setEmitFlags(propertyName, 3072 /* NoComments */ | 32 /* NoLeadingSourceMap */); setSourceMapRange(propertyName, firstAccessor.name); const properties = []; if (getAccessor) { const getterFunction = transformFunctionLikeToExpression( getAccessor, /*location*/ void 0, /*name*/ void 0, container ); setSourceMapRange(getterFunction, getSourceMapRange(getAccessor)); setEmitFlags(getterFunction, 1024 /* NoLeadingComments */); const getter = factory2.createPropertyAssignment("get", getterFunction); setCommentRange(getter, getCommentRange(getAccessor)); properties.push(getter); } if (setAccessor) { const setterFunction = transformFunctionLikeToExpression( setAccessor, /*location*/ void 0, /*name*/ void 0, container ); setSourceMapRange(setterFunction, getSourceMapRange(setAccessor)); setEmitFlags(setterFunction, 1024 /* NoLeadingComments */); const setter = factory2.createPropertyAssignment("set", setterFunction); setCommentRange(setter, getCommentRange(setAccessor)); properties.push(setter); } properties.push( factory2.createPropertyAssignment("enumerable", getAccessor || setAccessor ? factory2.createFalse() : factory2.createTrue()), factory2.createPropertyAssignment("configurable", factory2.createTrue()) ); const call = factory2.createCallExpression( factory2.createPropertyAccessExpression(factory2.createIdentifier("Object"), "defineProperty"), /*typeArguments*/ void 0, [ target, propertyName, factory2.createObjectLiteralExpression( properties, /*multiLine*/ true ) ] ); if (startsOnNewLine) { startOnNewLine(call); } return call; } function visitArrowFunction(node) { if (node.transformFlags & 16384 /* ContainsLexicalThis */ && !(hierarchyFacts & 16384 /* StaticInitializer */)) { hierarchyFacts |= 131072 /* CapturedLexicalThis */; } const savedConvertedLoopState = convertedLoopState; convertedLoopState = void 0; const ancestorFacts = enterSubtree(15232 /* ArrowFunctionExcludes */, 66 /* ArrowFunctionIncludes */); const func = factory2.createFunctionExpression( /*modifiers*/ void 0, /*asteriskToken*/ void 0, /*name*/ void 0, /*typeParameters*/ void 0, visitParameterList(node.parameters, visitor, context), /*type*/ void 0, transformFunctionBody(node) ); setTextRange(func, node); setOriginalNode(func, node); setEmitFlags(func, 16 /* CapturesThis */); exitSubtree(ancestorFacts, 0 /* ArrowFunctionSubtreeExcludes */, 0 /* None */); convertedLoopState = savedConvertedLoopState; return func; } function visitFunctionExpression(node) { const ancestorFacts = getEmitFlags(node) & 524288 /* AsyncFunctionBody */ ? enterSubtree(32662 /* AsyncFunctionBodyExcludes */, 69 /* AsyncFunctionBodyIncludes */) : enterSubtree(32670 /* FunctionExcludes */, 65 /* FunctionIncludes */); const savedConvertedLoopState = convertedLoopState; convertedLoopState = void 0; const parameters = visitParameterList(node.parameters, visitor, context); const body = transformFunctionBody(node); const name = hierarchyFacts & 32768 /* NewTarget */ ? factory2.getLocalName(node) : node.name; exitSubtree(ancestorFacts, 229376 /* FunctionSubtreeExcludes */, 0 /* None */); convertedLoopState = savedConvertedLoopState; return factory2.updateFunctionExpression( node, /*modifiers*/ void 0, node.asteriskToken, name, /*typeParameters*/ void 0, parameters, /*type*/ void 0, body ); } function visitFunctionDeclaration(node) { const savedConvertedLoopState = convertedLoopState; convertedLoopState = void 0; const ancestorFacts = enterSubtree(32670 /* FunctionExcludes */, 65 /* FunctionIncludes */); const parameters = visitParameterList(node.parameters, visitor, context); const body = transformFunctionBody(node); const name = hierarchyFacts & 32768 /* NewTarget */ ? factory2.getLocalName(node) : node.name; exitSubtree(ancestorFacts, 229376 /* FunctionSubtreeExcludes */, 0 /* None */); convertedLoopState = savedConvertedLoopState; return factory2.updateFunctionDeclaration( node, visitNodes2(node.modifiers, visitor, isModifier), node.asteriskToken, name, /*typeParameters*/ void 0, parameters, /*type*/ void 0, body ); } function transformFunctionLikeToExpression(node, location, name, container) { const savedConvertedLoopState = convertedLoopState; convertedLoopState = void 0; const ancestorFacts = container && isClassLike(container) && !isStatic(node) ? enterSubtree(32670 /* FunctionExcludes */, 65 /* FunctionIncludes */ | 8 /* NonStaticClassElement */) : enterSubtree(32670 /* FunctionExcludes */, 65 /* FunctionIncludes */); const parameters = visitParameterList(node.parameters, visitor, context); const body = transformFunctionBody(node); if (hierarchyFacts & 32768 /* NewTarget */ && !name && (node.kind === 263 /* FunctionDeclaration */ || node.kind === 219 /* FunctionExpression */)) { name = factory2.getGeneratedNameForNode(node); } exitSubtree(ancestorFacts, 229376 /* FunctionSubtreeExcludes */, 0 /* None */); convertedLoopState = savedConvertedLoopState; return setOriginalNode( setTextRange( factory2.createFunctionExpression( /*modifiers*/ void 0, node.asteriskToken, name, /*typeParameters*/ void 0, parameters, /*type*/ void 0, body ), location ), /*original*/ node ); } function transformFunctionBody(node) { let multiLine = false; let singleLine = false; let statementsLocation; let closeBraceLocation; const prologue = []; const statements = []; const body = node.body; let statementOffset; resumeLexicalEnvironment(); if (isBlock(body)) { statementOffset = factory2.copyStandardPrologue( body.statements, prologue, 0, /*ensureUseStrict*/ false ); statementOffset = factory2.copyCustomPrologue(body.statements, statements, statementOffset, visitor, isHoistedFunction); statementOffset = factory2.copyCustomPrologue(body.statements, statements, statementOffset, visitor, isHoistedVariableStatement); } multiLine = addDefaultValueAssignmentsIfNeeded2(statements, node) || multiLine; multiLine = addRestParameterIfNeeded( statements, node, /*inConstructorWithSynthesizedSuper*/ false ) || multiLine; if (isBlock(body)) { statementOffset = factory2.copyCustomPrologue(body.statements, statements, statementOffset, visitor); statementsLocation = body.statements; addRange(statements, visitNodes2(body.statements, visitor, isStatement, statementOffset)); if (!multiLine && body.multiLine) { multiLine = true; } } else { Debug.assert(node.kind === 220 /* ArrowFunction */); statementsLocation = moveRangeEnd(body, -1); const equalsGreaterThanToken = node.equalsGreaterThanToken; if (!nodeIsSynthesized(equalsGreaterThanToken) && !nodeIsSynthesized(body)) { if (rangeEndIsOnSameLineAsRangeStart(equalsGreaterThanToken, body, currentSourceFile)) { singleLine = true; } else { multiLine = true; } } const expression = visitNode(body, visitor, isExpression); const returnStatement = factory2.createReturnStatement(expression); setTextRange(returnStatement, body); moveSyntheticComments(returnStatement, body); setEmitFlags(returnStatement, 768 /* NoTokenSourceMaps */ | 64 /* NoTrailingSourceMap */ | 2048 /* NoTrailingComments */); statements.push(returnStatement); closeBraceLocation = body; } factory2.mergeLexicalEnvironment(prologue, endLexicalEnvironment()); insertCaptureNewTargetIfNeeded(prologue, node); insertCaptureThisForNodeIfNeeded(prologue, node); if (some(prologue)) { multiLine = true; } statements.unshift(...prologue); if (isBlock(body) && arrayIsEqualTo(statements, body.statements)) { return body; } const block = factory2.createBlock(setTextRange(factory2.createNodeArray(statements), statementsLocation), multiLine); setTextRange(block, node.body); if (!multiLine && singleLine) { setEmitFlags(block, 1 /* SingleLine */); } if (closeBraceLocation) { setTokenSourceMapRange(block, 20 /* CloseBraceToken */, closeBraceLocation); } setOriginalNode(block, node.body); return block; } function visitBlock(node, isFunctionBody) { if (isFunctionBody) { return visitEachChild(node, visitor, context); } const ancestorFacts = hierarchyFacts & 256 /* IterationStatement */ ? enterSubtree(7104 /* IterationStatementBlockExcludes */, 512 /* IterationStatementBlockIncludes */) : enterSubtree(6976 /* BlockExcludes */, 128 /* BlockIncludes */); const updated = visitEachChild(node, visitor, context); exitSubtree(ancestorFacts, 0 /* None */, 0 /* None */); return updated; } function visitExpressionStatement(node) { return visitEachChild(node, visitorWithUnusedExpressionResult, context); } function visitParenthesizedExpression(node, expressionResultIsUnused2) { return visitEachChild(node, expressionResultIsUnused2 ? visitorWithUnusedExpressionResult : visitor, context); } function visitBinaryExpression(node, expressionResultIsUnused2) { if (isDestructuringAssignment(node)) { return flattenDestructuringAssignment( node, visitor, context, 0 /* All */, !expressionResultIsUnused2 ); } if (node.operatorToken.kind === 28 /* CommaToken */) { return factory2.updateBinaryExpression( node, Debug.checkDefined(visitNode(node.left, visitorWithUnusedExpressionResult, isExpression)), node.operatorToken, Debug.checkDefined(visitNode(node.right, expressionResultIsUnused2 ? visitorWithUnusedExpressionResult : visitor, isExpression)) ); } return visitEachChild(node, visitor, context); } function visitCommaListExpression(node, expressionResultIsUnused2) { if (expressionResultIsUnused2) { return visitEachChild(node, visitorWithUnusedExpressionResult, context); } let result; for (let i = 0; i < node.elements.length; i++) { const element = node.elements[i]; const visited = visitNode(element, i < node.elements.length - 1 ? visitorWithUnusedExpressionResult : visitor, isExpression); if (result || visited !== element) { result || (result = node.elements.slice(0, i)); Debug.assert(visited); result.push(visited); } } const elements = result ? setTextRange(factory2.createNodeArray(result), node.elements) : node.elements; return factory2.updateCommaListExpression(node, elements); } function isVariableStatementOfTypeScriptClassWrapper(node) { return node.declarationList.declarations.length === 1 && !!node.declarationList.declarations[0].initializer && !!(getInternalEmitFlags(node.declarationList.declarations[0].initializer) & 1 /* TypeScriptClassWrapper */); } function visitVariableStatement(node) { const ancestorFacts = enterSubtree(0 /* None */, hasSyntacticModifier(node, 32 /* Export */) ? 32 /* ExportedVariableStatement */ : 0 /* None */); let updated; if (convertedLoopState && (node.declarationList.flags & 7 /* BlockScoped */) === 0 && !isVariableStatementOfTypeScriptClassWrapper(node)) { let assignments; for (const decl of node.declarationList.declarations) { hoistVariableDeclarationDeclaredInConvertedLoop(convertedLoopState, decl); if (decl.initializer) { let assignment; if (isBindingPattern(decl.name)) { assignment = flattenDestructuringAssignment( decl, visitor, context, 0 /* All */ ); } else { assignment = factory2.createBinaryExpression(decl.name, 64 /* EqualsToken */, Debug.checkDefined(visitNode(decl.initializer, visitor, isExpression))); setTextRange(assignment, decl); } assignments = append(assignments, assignment); } } if (assignments) { updated = setTextRange(factory2.createExpressionStatement(factory2.inlineExpressions(assignments)), node); } else { updated = void 0; } } else { updated = visitEachChild(node, visitor, context); } exitSubtree(ancestorFacts, 0 /* None */, 0 /* None */); return updated; } function visitVariableDeclarationList(node) { if (node.flags & 7 /* BlockScoped */ || node.transformFlags & 524288 /* ContainsBindingPattern */) { if (node.flags & 7 /* BlockScoped */) { enableSubstitutionsForBlockScopedBindings(); } const declarations = visitNodes2( node.declarations, node.flags & 1 /* Let */ ? visitVariableDeclarationInLetDeclarationList : visitVariableDeclaration, isVariableDeclaration ); const declarationList = factory2.createVariableDeclarationList(declarations); setOriginalNode(declarationList, node); setTextRange(declarationList, node); setCommentRange(declarationList, node); if (node.transformFlags & 524288 /* ContainsBindingPattern */ && (isBindingPattern(node.declarations[0].name) || isBindingPattern(last(node.declarations).name))) { setSourceMapRange(declarationList, getRangeUnion(declarations)); } return declarationList; } return visitEachChild(node, visitor, context); } function getRangeUnion(declarations) { let pos = -1, end = -1; for (const node of declarations) { pos = pos === -1 ? node.pos : node.pos === -1 ? pos : Math.min(pos, node.pos); end = Math.max(end, node.end); } return createRange(pos, end); } function shouldEmitExplicitInitializerForLetDeclaration(node) { const isCapturedInFunction = resolver.hasNodeCheckFlag(node, 16384 /* CapturedBlockScopedBinding */); const isDeclaredInLoop = resolver.hasNodeCheckFlag(node, 32768 /* BlockScopedBindingInLoop */); const emittedAsTopLevel = (hierarchyFacts & 64 /* TopLevel */) !== 0 || isCapturedInFunction && isDeclaredInLoop && (hierarchyFacts & 512 /* IterationStatementBlock */) !== 0; const emitExplicitInitializer = !emittedAsTopLevel && (hierarchyFacts & 4096 /* ForInOrForOfStatement */) === 0 && (!resolver.isDeclarationWithCollidingName(node) || isDeclaredInLoop && !isCapturedInFunction && (hierarchyFacts & (2048 /* ForStatement */ | 4096 /* ForInOrForOfStatement */)) === 0); return emitExplicitInitializer; } function visitVariableDeclarationInLetDeclarationList(node) { const name = node.name; if (isBindingPattern(name)) { return visitVariableDeclaration(node); } if (!node.initializer && shouldEmitExplicitInitializerForLetDeclaration(node)) { return factory2.updateVariableDeclaration( node, node.name, /*exclamationToken*/ void 0, /*type*/ void 0, factory2.createVoidZero() ); } return visitEachChild(node, visitor, context); } function visitVariableDeclaration(node) { const ancestorFacts = enterSubtree(32 /* ExportedVariableStatement */, 0 /* None */); let updated; if (isBindingPattern(node.name)) { updated = flattenDestructuringBinding( node, visitor, context, 0 /* All */, /*rval*/ void 0, (ancestorFacts & 32 /* ExportedVariableStatement */) !== 0 ); } else { updated = visitEachChild(node, visitor, context); } exitSubtree(ancestorFacts, 0 /* None */, 0 /* None */); return updated; } function recordLabel(node) { convertedLoopState.labels.set(idText(node.label), true); } function resetLabel(node) { convertedLoopState.labels.set(idText(node.label), false); } function visitLabeledStatement(node) { if (convertedLoopState && !convertedLoopState.labels) { convertedLoopState.labels = /* @__PURE__ */ new Map(); } const statement = unwrapInnermostStatementOfLabel(node, convertedLoopState && recordLabel); return isIterationStatement( statement, /*lookInLabeledStatements*/ false ) ? visitIterationStatement( statement, /*outermostLabeledStatement*/ node ) : factory2.restoreEnclosingLabel(visitNode(statement, visitor, isStatement, factory2.liftToBlock) ?? setTextRange(factory2.createEmptyStatement(), statement), node, convertedLoopState && resetLabel); } function visitIterationStatement(node, outermostLabeledStatement) { switch (node.kind) { case 247 /* DoStatement */: case 248 /* WhileStatement */: return visitDoOrWhileStatement(node, outermostLabeledStatement); case 249 /* ForStatement */: return visitForStatement(node, outermostLabeledStatement); case 250 /* ForInStatement */: return visitForInStatement(node, outermostLabeledStatement); case 251 /* ForOfStatement */: return visitForOfStatement(node, outermostLabeledStatement); } } function visitIterationStatementWithFacts(excludeFacts, includeFacts, node, outermostLabeledStatement, convert) { const ancestorFacts = enterSubtree(excludeFacts, includeFacts); const updated = convertIterationStatementBodyIfNecessary(node, outermostLabeledStatement, ancestorFacts, convert); exitSubtree(ancestorFacts, 0 /* None */, 0 /* None */); return updated; } function visitDoOrWhileStatement(node, outermostLabeledStatement) { return visitIterationStatementWithFacts( 0 /* DoOrWhileStatementExcludes */, 1280 /* DoOrWhileStatementIncludes */, node, outermostLabeledStatement ); } function visitForStatement(node, outermostLabeledStatement) { return visitIterationStatementWithFacts( 5056 /* ForStatementExcludes */, 3328 /* ForStatementIncludes */, node, outermostLabeledStatement ); } function visitEachChildOfForStatement2(node) { return factory2.updateForStatement( node, visitNode(node.initializer, visitorWithUnusedExpressionResult, isForInitializer), visitNode(node.condition, visitor, isExpression), visitNode(node.incrementor, visitorWithUnusedExpressionResult, isExpression), Debug.checkDefined(visitNode(node.statement, visitor, isStatement, factory2.liftToBlock)) ); } function visitForInStatement(node, outermostLabeledStatement) { return visitIterationStatementWithFacts( 3008 /* ForInOrForOfStatementExcludes */, 5376 /* ForInOrForOfStatementIncludes */, node, outermostLabeledStatement ); } function visitForOfStatement(node, outermostLabeledStatement) { return visitIterationStatementWithFacts( 3008 /* ForInOrForOfStatementExcludes */, 5376 /* ForInOrForOfStatementIncludes */, node, outermostLabeledStatement, compilerOptions.downlevelIteration ? convertForOfStatementForIterable : convertForOfStatementForArray ); } function convertForOfStatementHead(node, boundValue, convertedLoopBodyStatements) { const statements = []; const initializer = node.initializer; if (isVariableDeclarationList(initializer)) { if (node.initializer.flags & 7 /* BlockScoped */) { enableSubstitutionsForBlockScopedBindings(); } const firstOriginalDeclaration = firstOrUndefined(initializer.declarations); if (firstOriginalDeclaration && isBindingPattern(firstOriginalDeclaration.name)) { const declarations = flattenDestructuringBinding( firstOriginalDeclaration, visitor, context, 0 /* All */, boundValue ); const declarationList = setTextRange(factory2.createVariableDeclarationList(declarations), node.initializer); setOriginalNode(declarationList, node.initializer); setSourceMapRange(declarationList, createRange(declarations[0].pos, last(declarations).end)); statements.push( factory2.createVariableStatement( /*modifiers*/ void 0, declarationList ) ); } else { statements.push( setTextRange( factory2.createVariableStatement( /*modifiers*/ void 0, setOriginalNode( setTextRange( factory2.createVariableDeclarationList([ factory2.createVariableDeclaration( firstOriginalDeclaration ? firstOriginalDeclaration.name : factory2.createTempVariable( /*recordTempVariable*/ void 0 ), /*exclamationToken*/ void 0, /*type*/ void 0, boundValue ) ]), moveRangePos(initializer, -1) ), initializer ) ), moveRangeEnd(initializer, -1) ) ); } } else { const assignment = factory2.createAssignment(initializer, boundValue); if (isDestructuringAssignment(assignment)) { statements.push(factory2.createExpressionStatement(visitBinaryExpression( assignment, /*expressionResultIsUnused*/ true ))); } else { setTextRangeEnd(assignment, initializer.end); statements.push(setTextRange(factory2.createExpressionStatement(Debug.checkDefined(visitNode(assignment, visitor, isExpression))), moveRangeEnd(initializer, -1))); } } if (convertedLoopBodyStatements) { return createSyntheticBlockForConvertedStatements(addRange(statements, convertedLoopBodyStatements)); } else { const statement = visitNode(node.statement, visitor, isStatement, factory2.liftToBlock); Debug.assert(statement); if (isBlock(statement)) { return factory2.updateBlock(statement, setTextRange(factory2.createNodeArray(concatenate(statements, statement.statements)), statement.statements)); } else { statements.push(statement); return createSyntheticBlockForConvertedStatements(statements); } } } function createSyntheticBlockForConvertedStatements(statements) { return setEmitFlags( factory2.createBlock( factory2.createNodeArray(statements), /*multiLine*/ true ), 96 /* NoSourceMap */ | 768 /* NoTokenSourceMaps */ ); } function convertForOfStatementForArray(node, outermostLabeledStatement, convertedLoopBodyStatements) { const expression = visitNode(node.expression, visitor, isExpression); Debug.assert(expression); const counter = factory2.createLoopVariable(); const rhsReference = isIdentifier(expression) ? factory2.getGeneratedNameForNode(expression) : factory2.createTempVariable( /*recordTempVariable*/ void 0 ); setEmitFlags(expression, 96 /* NoSourceMap */ | getEmitFlags(expression)); const forStatement = setTextRange( factory2.createForStatement( /*initializer*/ setEmitFlags( setTextRange( factory2.createVariableDeclarationList([ setTextRange(factory2.createVariableDeclaration( counter, /*exclamationToken*/ void 0, /*type*/ void 0, factory2.createNumericLiteral(0) ), moveRangePos(node.expression, -1)), setTextRange(factory2.createVariableDeclaration( rhsReference, /*exclamationToken*/ void 0, /*type*/ void 0, expression ), node.expression) ]), node.expression ), 4194304 /* NoHoisting */ ), /*condition*/ setTextRange( factory2.createLessThan( counter, factory2.createPropertyAccessExpression(rhsReference, "length") ), node.expression ), /*incrementor*/ setTextRange(factory2.createPostfixIncrement(counter), node.expression), /*statement*/ convertForOfStatementHead( node, factory2.createElementAccessExpression(rhsReference, counter), convertedLoopBodyStatements ) ), /*location*/ node ); setEmitFlags(forStatement, 512 /* NoTokenTrailingSourceMaps */); setTextRange(forStatement, node); return factory2.restoreEnclosingLabel(forStatement, outermostLabeledStatement, convertedLoopState && resetLabel); } function convertForOfStatementForIterable(node, outermostLabeledStatement, convertedLoopBodyStatements, ancestorFacts) { const expression = visitNode(node.expression, visitor, isExpression); Debug.assert(expression); const iterator = isIdentifier(expression) ? factory2.getGeneratedNameForNode(expression) : factory2.createTempVariable( /*recordTempVariable*/ void 0 ); const result = isIdentifier(expression) ? factory2.getGeneratedNameForNode(iterator) : factory2.createTempVariable( /*recordTempVariable*/ void 0 ); const errorRecord = factory2.createUniqueName("e"); const catchVariable = factory2.getGeneratedNameForNode(errorRecord); const returnMethod = factory2.createTempVariable( /*recordTempVariable*/ void 0 ); const values = setTextRange(emitHelpers().createValuesHelper(expression), node.expression); const next = factory2.createCallExpression( factory2.createPropertyAccessExpression(iterator, "next"), /*typeArguments*/ void 0, [] ); hoistVariableDeclaration(errorRecord); hoistVariableDeclaration(returnMethod); const initializer = ancestorFacts & 1024 /* IterationContainer */ ? factory2.inlineExpressions([factory2.createAssignment(errorRecord, factory2.createVoidZero()), values]) : values; const forStatement = setEmitFlags( setTextRange( factory2.createForStatement( /*initializer*/ setEmitFlags( setTextRange( factory2.createVariableDeclarationList([ setTextRange(factory2.createVariableDeclaration( iterator, /*exclamationToken*/ void 0, /*type*/ void 0, initializer ), node.expression), factory2.createVariableDeclaration( result, /*exclamationToken*/ void 0, /*type*/ void 0, next ) ]), node.expression ), 4194304 /* NoHoisting */ ), /*condition*/ factory2.createLogicalNot(factory2.createPropertyAccessExpression(result, "done")), /*incrementor*/ factory2.createAssignment(result, next), /*statement*/ convertForOfStatementHead( node, factory2.createPropertyAccessExpression(result, "value"), convertedLoopBodyStatements ) ), /*location*/ node ), 512 /* NoTokenTrailingSourceMaps */ ); return factory2.createTryStatement( factory2.createBlock([ factory2.restoreEnclosingLabel( forStatement, outermostLabeledStatement, convertedLoopState && resetLabel ) ]), factory2.createCatchClause( factory2.createVariableDeclaration(catchVariable), setEmitFlags( factory2.createBlock([ factory2.createExpressionStatement( factory2.createAssignment( errorRecord, factory2.createObjectLiteralExpression([ factory2.createPropertyAssignment("error", catchVariable) ]) ) ) ]), 1 /* SingleLine */ ) ), factory2.createBlock([ factory2.createTryStatement( /*tryBlock*/ factory2.createBlock([ setEmitFlags( factory2.createIfStatement( factory2.createLogicalAnd( factory2.createLogicalAnd( result, factory2.createLogicalNot( factory2.createPropertyAccessExpression(result, "done") ) ), factory2.createAssignment( returnMethod, factory2.createPropertyAccessExpression(iterator, "return") ) ), factory2.createExpressionStatement( factory2.createFunctionCallCall(returnMethod, iterator, []) ) ), 1 /* SingleLine */ ) ]), /*catchClause*/ void 0, /*finallyBlock*/ setEmitFlags( factory2.createBlock([ setEmitFlags( factory2.createIfStatement( errorRecord, factory2.createThrowStatement( factory2.createPropertyAccessExpression(errorRecord, "error") ) ), 1 /* SingleLine */ ) ]), 1 /* SingleLine */ ) ) ]) ); } function visitObjectLiteralExpression(node) { const properties = node.properties; let numInitialProperties = -1, hasComputed = false; for (let i = 0; i < properties.length; i++) { const property = properties[i]; if (property.transformFlags & 1048576 /* ContainsYield */ && hierarchyFacts & 4 /* AsyncFunctionBody */ || (hasComputed = Debug.checkDefined(property.name).kind === 168 /* ComputedPropertyName */)) { numInitialProperties = i; break; } } if (numInitialProperties < 0) { return visitEachChild(node, visitor, context); } const temp = factory2.createTempVariable(hoistVariableDeclaration); const expressions = []; const assignment = factory2.createAssignment( temp, setEmitFlags( factory2.createObjectLiteralExpression( visitNodes2(properties, visitor, isObjectLiteralElementLike, 0, numInitialProperties), node.multiLine ), hasComputed ? 131072 /* Indented */ : 0 ) ); if (node.multiLine) { startOnNewLine(assignment); } expressions.push(assignment); addObjectLiteralMembers(expressions, node, temp, numInitialProperties); expressions.push(node.multiLine ? startOnNewLine(setParent(setTextRange(factory2.cloneNode(temp), temp), temp.parent)) : temp); return factory2.inlineExpressions(expressions); } function shouldConvertPartOfIterationStatement(node) { return resolver.hasNodeCheckFlag(node, 8192 /* ContainsCapturedBlockScopeBinding */); } function shouldConvertInitializerOfForStatement(node) { return isForStatement(node) && !!node.initializer && shouldConvertPartOfIterationStatement(node.initializer); } function shouldConvertConditionOfForStatement(node) { return isForStatement(node) && !!node.condition && shouldConvertPartOfIterationStatement(node.condition); } function shouldConvertIncrementorOfForStatement(node) { return isForStatement(node) && !!node.incrementor && shouldConvertPartOfIterationStatement(node.incrementor); } function shouldConvertIterationStatement(node) { return shouldConvertBodyOfIterationStatement(node) || shouldConvertInitializerOfForStatement(node); } function shouldConvertBodyOfIterationStatement(node) { return resolver.hasNodeCheckFlag(node, 4096 /* LoopWithCapturedBlockScopedBinding */); } function hoistVariableDeclarationDeclaredInConvertedLoop(state, node) { if (!state.hoistedLocalVariables) { state.hoistedLocalVariables = []; } visit(node.name); function visit(node2) { if (node2.kind === 80 /* Identifier */) { state.hoistedLocalVariables.push(node2); } else { for (const element of node2.elements) { if (!isOmittedExpression(element)) { visit(element.name); } } } } } function convertIterationStatementBodyIfNecessary(node, outermostLabeledStatement, ancestorFacts, convert) { if (!shouldConvertIterationStatement(node)) { let saveAllowedNonLabeledJumps; if (convertedLoopState) { saveAllowedNonLabeledJumps = convertedLoopState.allowedNonLabeledJumps; convertedLoopState.allowedNonLabeledJumps = 2 /* Break */ | 4 /* Continue */; } const result = convert ? convert( node, outermostLabeledStatement, /*convertedLoopBodyStatements*/ void 0, ancestorFacts ) : factory2.restoreEnclosingLabel( isForStatement(node) ? visitEachChildOfForStatement2(node) : visitEachChild(node, visitor, context), outermostLabeledStatement, convertedLoopState && resetLabel ); if (convertedLoopState) { convertedLoopState.allowedNonLabeledJumps = saveAllowedNonLabeledJumps; } return result; } const currentState = createConvertedLoopState(node); const statements = []; const outerConvertedLoopState = convertedLoopState; convertedLoopState = currentState; const initializerFunction = shouldConvertInitializerOfForStatement(node) ? createFunctionForInitializerOfForStatement(node, currentState) : void 0; const bodyFunction = shouldConvertBodyOfIterationStatement(node) ? createFunctionForBodyOfIterationStatement(node, currentState, outerConvertedLoopState) : void 0; convertedLoopState = outerConvertedLoopState; if (initializerFunction) statements.push(initializerFunction.functionDeclaration); if (bodyFunction) statements.push(bodyFunction.functionDeclaration); addExtraDeclarationsForConvertedLoop(statements, currentState, outerConvertedLoopState); if (initializerFunction) { statements.push(generateCallToConvertedLoopInitializer(initializerFunction.functionName, initializerFunction.containsYield)); } let loop; if (bodyFunction) { if (convert) { loop = convert(node, outermostLabeledStatement, bodyFunction.part, ancestorFacts); } else { const clone = convertIterationStatementCore(node, initializerFunction, factory2.createBlock( bodyFunction.part, /*multiLine*/ true )); loop = factory2.restoreEnclosingLabel(clone, outermostLabeledStatement, convertedLoopState && resetLabel); } } else { const clone = convertIterationStatementCore(node, initializerFunction, Debug.checkDefined(visitNode(node.statement, visitor, isStatement, factory2.liftToBlock))); loop = factory2.restoreEnclosingLabel(clone, outermostLabeledStatement, convertedLoopState && resetLabel); } statements.push(loop); return statements; } function convertIterationStatementCore(node, initializerFunction, convertedLoopBody) { switch (node.kind) { case 249 /* ForStatement */: return convertForStatement(node, initializerFunction, convertedLoopBody); case 250 /* ForInStatement */: return convertForInStatement(node, convertedLoopBody); case 251 /* ForOfStatement */: return convertForOfStatement(node, convertedLoopBody); case 247 /* DoStatement */: return convertDoStatement(node, convertedLoopBody); case 248 /* WhileStatement */: return convertWhileStatement(node, convertedLoopBody); default: return Debug.failBadSyntaxKind(node, "IterationStatement expected"); } } function convertForStatement(node, initializerFunction, convertedLoopBody) { const shouldConvertCondition = node.condition && shouldConvertPartOfIterationStatement(node.condition); const shouldConvertIncrementor = shouldConvertCondition || node.incrementor && shouldConvertPartOfIterationStatement(node.incrementor); return factory2.updateForStatement( node, visitNode(initializerFunction ? initializerFunction.part : node.initializer, visitorWithUnusedExpressionResult, isForInitializer), visitNode(shouldConvertCondition ? void 0 : node.condition, visitor, isExpression), visitNode(shouldConvertIncrementor ? void 0 : node.incrementor, visitorWithUnusedExpressionResult, isExpression), convertedLoopBody ); } function convertForOfStatement(node, convertedLoopBody) { return factory2.updateForOfStatement( node, /*awaitModifier*/ void 0, Debug.checkDefined(visitNode(node.initializer, visitor, isForInitializer)), Debug.checkDefined(visitNode(node.expression, visitor, isExpression)), convertedLoopBody ); } function convertForInStatement(node, convertedLoopBody) { return factory2.updateForInStatement( node, Debug.checkDefined(visitNode(node.initializer, visitor, isForInitializer)), Debug.checkDefined(visitNode(node.expression, visitor, isExpression)), convertedLoopBody ); } function convertDoStatement(node, convertedLoopBody) { return factory2.updateDoStatement( node, convertedLoopBody, Debug.checkDefined(visitNode(node.expression, visitor, isExpression)) ); } function convertWhileStatement(node, convertedLoopBody) { return factory2.updateWhileStatement( node, Debug.checkDefined(visitNode(node.expression, visitor, isExpression)), convertedLoopBody ); } function createConvertedLoopState(node) { let loopInitializer; switch (node.kind) { case 249 /* ForStatement */: case 250 /* ForInStatement */: case 251 /* ForOfStatement */: const initializer = node.initializer; if (initializer && initializer.kind === 262 /* VariableDeclarationList */) { loopInitializer = initializer; } break; } const loopParameters = []; const loopOutParameters = []; if (loopInitializer && getCombinedNodeFlags(loopInitializer) & 7 /* BlockScoped */) { const hasCapturedBindingsInForHead = shouldConvertInitializerOfForStatement(node) || shouldConvertConditionOfForStatement(node) || shouldConvertIncrementorOfForStatement(node); for (const decl of loopInitializer.declarations) { processLoopVariableDeclaration(node, decl, loopParameters, loopOutParameters, hasCapturedBindingsInForHead); } } const currentState = { loopParameters, loopOutParameters }; if (convertedLoopState) { if (convertedLoopState.argumentsName) { currentState.argumentsName = convertedLoopState.argumentsName; } if (convertedLoopState.thisName) { currentState.thisName = convertedLoopState.thisName; } if (convertedLoopState.hoistedLocalVariables) { currentState.hoistedLocalVariables = convertedLoopState.hoistedLocalVariables; } } return currentState; } function addExtraDeclarationsForConvertedLoop(statements, state, outerState) { let extraVariableDeclarations; if (state.argumentsName) { if (outerState) { outerState.argumentsName = state.argumentsName; } else { (extraVariableDeclarations || (extraVariableDeclarations = [])).push( factory2.createVariableDeclaration( state.argumentsName, /*exclamationToken*/ void 0, /*type*/ void 0, factory2.createIdentifier("arguments") ) ); } } if (state.thisName) { if (outerState) { outerState.thisName = state.thisName; } else { (extraVariableDeclarations || (extraVariableDeclarations = [])).push( factory2.createVariableDeclaration( state.thisName, /*exclamationToken*/ void 0, /*type*/ void 0, factory2.createIdentifier("this") ) ); } } if (state.hoistedLocalVariables) { if (outerState) { outerState.hoistedLocalVariables = state.hoistedLocalVariables; } else { if (!extraVariableDeclarations) { extraVariableDeclarations = []; } for (const identifier of state.hoistedLocalVariables) { extraVariableDeclarations.push(factory2.createVariableDeclaration(identifier)); } } } if (state.loopOutParameters.length) { if (!extraVariableDeclarations) { extraVariableDeclarations = []; } for (const outParam of state.loopOutParameters) { extraVariableDeclarations.push(factory2.createVariableDeclaration(outParam.outParamName)); } } if (state.conditionVariable) { if (!extraVariableDeclarations) { extraVariableDeclarations = []; } extraVariableDeclarations.push(factory2.createVariableDeclaration( state.conditionVariable, /*exclamationToken*/ void 0, /*type*/ void 0, factory2.createFalse() )); } if (extraVariableDeclarations) { statements.push(factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList(extraVariableDeclarations) )); } } function createOutVariable(p) { return factory2.createVariableDeclaration( p.originalName, /*exclamationToken*/ void 0, /*type*/ void 0, p.outParamName ); } function createFunctionForInitializerOfForStatement(node, currentState) { const functionName = factory2.createUniqueName("_loop_init"); const containsYield = (node.initializer.transformFlags & 1048576 /* ContainsYield */) !== 0; let emitFlags = 0 /* None */; if (currentState.containsLexicalThis) emitFlags |= 16 /* CapturesThis */; if (containsYield && hierarchyFacts & 4 /* AsyncFunctionBody */) emitFlags |= 524288 /* AsyncFunctionBody */; const statements = []; statements.push(factory2.createVariableStatement( /*modifiers*/ void 0, node.initializer )); copyOutParameters(currentState.loopOutParameters, 2 /* Initializer */, 1 /* ToOutParameter */, statements); const functionDeclaration = factory2.createVariableStatement( /*modifiers*/ void 0, setEmitFlags( factory2.createVariableDeclarationList([ factory2.createVariableDeclaration( functionName, /*exclamationToken*/ void 0, /*type*/ void 0, setEmitFlags( factory2.createFunctionExpression( /*modifiers*/ void 0, containsYield ? factory2.createToken(42 /* AsteriskToken */) : void 0, /*name*/ void 0, /*typeParameters*/ void 0, /*parameters*/ void 0, /*type*/ void 0, Debug.checkDefined(visitNode( factory2.createBlock( statements, /*multiLine*/ true ), visitor, isBlock )) ), emitFlags ) ) ]), 4194304 /* NoHoisting */ ) ); const part = factory2.createVariableDeclarationList(map(currentState.loopOutParameters, createOutVariable)); return { functionName, containsYield, functionDeclaration, part }; } function createFunctionForBodyOfIterationStatement(node, currentState, outerState) { const functionName = factory2.createUniqueName("_loop"); startLexicalEnvironment(); const statement = visitNode(node.statement, visitor, isStatement, factory2.liftToBlock); const lexicalEnvironment = endLexicalEnvironment(); const statements = []; if (shouldConvertConditionOfForStatement(node) || shouldConvertIncrementorOfForStatement(node)) { currentState.conditionVariable = factory2.createUniqueName("inc"); if (node.incrementor) { statements.push(factory2.createIfStatement( currentState.conditionVariable, factory2.createExpressionStatement(Debug.checkDefined(visitNode(node.incrementor, visitor, isExpression))), factory2.createExpressionStatement(factory2.createAssignment(currentState.conditionVariable, factory2.createTrue())) )); } else { statements.push(factory2.createIfStatement( factory2.createLogicalNot(currentState.conditionVariable), factory2.createExpressionStatement(factory2.createAssignment(currentState.conditionVariable, factory2.createTrue())) )); } if (shouldConvertConditionOfForStatement(node)) { statements.push(factory2.createIfStatement( factory2.createPrefixUnaryExpression(54 /* ExclamationToken */, Debug.checkDefined(visitNode(node.condition, visitor, isExpression))), Debug.checkDefined(visitNode(factory2.createBreakStatement(), visitor, isStatement)) )); } } Debug.assert(statement); if (isBlock(statement)) { addRange(statements, statement.statements); } else { statements.push(statement); } copyOutParameters(currentState.loopOutParameters, 1 /* Body */, 1 /* ToOutParameter */, statements); insertStatementsAfterStandardPrologue(statements, lexicalEnvironment); const loopBody = factory2.createBlock( statements, /*multiLine*/ true ); if (isBlock(statement)) setOriginalNode(loopBody, statement); const containsYield = (node.statement.transformFlags & 1048576 /* ContainsYield */) !== 0; let emitFlags = 1048576 /* ReuseTempVariableScope */; if (currentState.containsLexicalThis) emitFlags |= 16 /* CapturesThis */; if (containsYield && (hierarchyFacts & 4 /* AsyncFunctionBody */) !== 0) emitFlags |= 524288 /* AsyncFunctionBody */; const functionDeclaration = factory2.createVariableStatement( /*modifiers*/ void 0, setEmitFlags( factory2.createVariableDeclarationList( [ factory2.createVariableDeclaration( functionName, /*exclamationToken*/ void 0, /*type*/ void 0, setEmitFlags( factory2.createFunctionExpression( /*modifiers*/ void 0, containsYield ? factory2.createToken(42 /* AsteriskToken */) : void 0, /*name*/ void 0, /*typeParameters*/ void 0, currentState.loopParameters, /*type*/ void 0, loopBody ), emitFlags ) ) ] ), 4194304 /* NoHoisting */ ) ); const part = generateCallToConvertedLoop(functionName, currentState, outerState, containsYield); return { functionName, containsYield, functionDeclaration, part }; } function copyOutParameter(outParam, copyDirection) { const source = copyDirection === 0 /* ToOriginal */ ? outParam.outParamName : outParam.originalName; const target = copyDirection === 0 /* ToOriginal */ ? outParam.originalName : outParam.outParamName; return factory2.createBinaryExpression(target, 64 /* EqualsToken */, source); } function copyOutParameters(outParams, partFlags, copyDirection, statements) { for (const outParam of outParams) { if (outParam.flags & partFlags) { statements.push(factory2.createExpressionStatement(copyOutParameter(outParam, copyDirection))); } } } function generateCallToConvertedLoopInitializer(initFunctionExpressionName, containsYield) { const call = factory2.createCallExpression( initFunctionExpressionName, /*typeArguments*/ void 0, [] ); const callResult = containsYield ? factory2.createYieldExpression( factory2.createToken(42 /* AsteriskToken */), setEmitFlags(call, 8388608 /* Iterator */) ) : call; return factory2.createExpressionStatement(callResult); } function generateCallToConvertedLoop(loopFunctionExpressionName, state, outerState, containsYield) { const statements = []; const isSimpleLoop = !(state.nonLocalJumps & ~4 /* Continue */) && !state.labeledNonLocalBreaks && !state.labeledNonLocalContinues; const call = factory2.createCallExpression( loopFunctionExpressionName, /*typeArguments*/ void 0, map(state.loopParameters, (p) => p.name) ); const callResult = containsYield ? factory2.createYieldExpression( factory2.createToken(42 /* AsteriskToken */), setEmitFlags(call, 8388608 /* Iterator */) ) : call; if (isSimpleLoop) { statements.push(factory2.createExpressionStatement(callResult)); copyOutParameters(state.loopOutParameters, 1 /* Body */, 0 /* ToOriginal */, statements); } else { const loopResultName = factory2.createUniqueName("state"); const stateVariable = factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList( [factory2.createVariableDeclaration( loopResultName, /*exclamationToken*/ void 0, /*type*/ void 0, callResult )] ) ); statements.push(stateVariable); copyOutParameters(state.loopOutParameters, 1 /* Body */, 0 /* ToOriginal */, statements); if (state.nonLocalJumps & 8 /* Return */) { let returnStatement; if (outerState) { outerState.nonLocalJumps |= 8 /* Return */; returnStatement = factory2.createReturnStatement(loopResultName); } else { returnStatement = factory2.createReturnStatement(factory2.createPropertyAccessExpression(loopResultName, "value")); } statements.push( factory2.createIfStatement( factory2.createTypeCheck(loopResultName, "object"), returnStatement ) ); } if (state.nonLocalJumps & 2 /* Break */) { statements.push( factory2.createIfStatement( factory2.createStrictEquality( loopResultName, factory2.createStringLiteral("break") ), factory2.createBreakStatement() ) ); } if (state.labeledNonLocalBreaks || state.labeledNonLocalContinues) { const caseClauses = []; processLabeledJumps( state.labeledNonLocalBreaks, /*isBreak*/ true, loopResultName, outerState, caseClauses ); processLabeledJumps( state.labeledNonLocalContinues, /*isBreak*/ false, loopResultName, outerState, caseClauses ); statements.push( factory2.createSwitchStatement( loopResultName, factory2.createCaseBlock(caseClauses) ) ); } } return statements; } function setLabeledJump(state, isBreak, labelText, labelMarker) { if (isBreak) { if (!state.labeledNonLocalBreaks) { state.labeledNonLocalBreaks = /* @__PURE__ */ new Map(); } state.labeledNonLocalBreaks.set(labelText, labelMarker); } else { if (!state.labeledNonLocalContinues) { state.labeledNonLocalContinues = /* @__PURE__ */ new Map(); } state.labeledNonLocalContinues.set(labelText, labelMarker); } } function processLabeledJumps(table, isBreak, loopResultName, outerLoop, caseClauses) { if (!table) { return; } table.forEach((labelMarker, labelText) => { const statements = []; if (!outerLoop || outerLoop.labels && outerLoop.labels.get(labelText)) { const label = factory2.createIdentifier(labelText); statements.push(isBreak ? factory2.createBreakStatement(label) : factory2.createContinueStatement(label)); } else { setLabeledJump(outerLoop, isBreak, labelText, labelMarker); statements.push(factory2.createReturnStatement(loopResultName)); } caseClauses.push(factory2.createCaseClause(factory2.createStringLiteral(labelMarker), statements)); }); } function processLoopVariableDeclaration(container, decl, loopParameters, loopOutParameters, hasCapturedBindingsInForHead) { const name = decl.name; if (isBindingPattern(name)) { for (const element of name.elements) { if (!isOmittedExpression(element)) { processLoopVariableDeclaration(container, element, loopParameters, loopOutParameters, hasCapturedBindingsInForHead); } } } else { loopParameters.push(factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, name )); const needsOutParam = resolver.hasNodeCheckFlag(decl, 65536 /* NeedsLoopOutParameter */); if (needsOutParam || hasCapturedBindingsInForHead) { const outParamName = factory2.createUniqueName("out_" + idText(name)); let flags = 0 /* None */; if (needsOutParam) { flags |= 1 /* Body */; } if (isForStatement(container)) { if (container.initializer && resolver.isBindingCapturedByNode(container.initializer, decl)) { flags |= 2 /* Initializer */; } if (container.condition && resolver.isBindingCapturedByNode(container.condition, decl) || container.incrementor && resolver.isBindingCapturedByNode(container.incrementor, decl)) { flags |= 1 /* Body */; } } loopOutParameters.push({ flags, originalName: name, outParamName }); } } } function addObjectLiteralMembers(expressions, node, receiver, start) { const properties = node.properties; const numProperties = properties.length; for (let i = start; i < numProperties; i++) { const property = properties[i]; switch (property.kind) { case 178 /* GetAccessor */: case 179 /* SetAccessor */: const accessors = getAllAccessorDeclarations(node.properties, property); if (property === accessors.firstAccessor) { expressions.push(transformAccessorsToExpression(receiver, accessors, node, !!node.multiLine)); } break; case 175 /* MethodDeclaration */: expressions.push(transformObjectLiteralMethodDeclarationToExpression(property, receiver, node, node.multiLine)); break; case 304 /* PropertyAssignment */: expressions.push(transformPropertyAssignmentToExpression(property, receiver, node.multiLine)); break; case 305 /* ShorthandPropertyAssignment */: expressions.push(transformShorthandPropertyAssignmentToExpression(property, receiver, node.multiLine)); break; default: Debug.failBadSyntaxKind(node); break; } } } function transformPropertyAssignmentToExpression(property, receiver, startsOnNewLine) { const expression = factory2.createAssignment( createMemberAccessForPropertyName( factory2, receiver, Debug.checkDefined(visitNode(property.name, visitor, isPropertyName)) ), Debug.checkDefined(visitNode(property.initializer, visitor, isExpression)) ); setTextRange(expression, property); if (startsOnNewLine) { startOnNewLine(expression); } return expression; } function transformShorthandPropertyAssignmentToExpression(property, receiver, startsOnNewLine) { const expression = factory2.createAssignment( createMemberAccessForPropertyName( factory2, receiver, Debug.checkDefined(visitNode(property.name, visitor, isPropertyName)) ), factory2.cloneNode(property.name) ); setTextRange(expression, property); if (startsOnNewLine) { startOnNewLine(expression); } return expression; } function transformObjectLiteralMethodDeclarationToExpression(method, receiver, container, startsOnNewLine) { const expression = factory2.createAssignment( createMemberAccessForPropertyName( factory2, receiver, Debug.checkDefined(visitNode(method.name, visitor, isPropertyName)) ), transformFunctionLikeToExpression( method, /*location*/ method, /*name*/ void 0, container ) ); setTextRange(expression, method); if (startsOnNewLine) { startOnNewLine(expression); } return expression; } function visitCatchClause(node) { const ancestorFacts = enterSubtree(7104 /* BlockScopeExcludes */, 0 /* BlockScopeIncludes */); let updated; Debug.assert(!!node.variableDeclaration, "Catch clause variable should always be present when downleveling ES2015."); if (isBindingPattern(node.variableDeclaration.name)) { const temp = factory2.createTempVariable( /*recordTempVariable*/ void 0 ); const newVariableDeclaration = factory2.createVariableDeclaration(temp); setTextRange(newVariableDeclaration, node.variableDeclaration); const vars = flattenDestructuringBinding( node.variableDeclaration, visitor, context, 0 /* All */, temp ); const list = factory2.createVariableDeclarationList(vars); setTextRange(list, node.variableDeclaration); const destructure = factory2.createVariableStatement( /*modifiers*/ void 0, list ); updated = factory2.updateCatchClause(node, newVariableDeclaration, addStatementToStartOfBlock(node.block, destructure)); } else { updated = visitEachChild(node, visitor, context); } exitSubtree(ancestorFacts, 0 /* None */, 0 /* None */); return updated; } function addStatementToStartOfBlock(block, statement) { const transformedStatements = visitNodes2(block.statements, visitor, isStatement); return factory2.updateBlock(block, [statement, ...transformedStatements]); } function visitMethodDeclaration(node) { Debug.assert(!isComputedPropertyName(node.name)); const functionExpression = transformFunctionLikeToExpression( node, /*location*/ moveRangePos(node, -1), /*name*/ void 0, /*container*/ void 0 ); setEmitFlags(functionExpression, 1024 /* NoLeadingComments */ | getEmitFlags(functionExpression)); return setTextRange( factory2.createPropertyAssignment( node.name, functionExpression ), /*location*/ node ); } function visitAccessorDeclaration(node) { Debug.assert(!isComputedPropertyName(node.name)); const savedConvertedLoopState = convertedLoopState; convertedLoopState = void 0; const ancestorFacts = enterSubtree(32670 /* FunctionExcludes */, 65 /* FunctionIncludes */); let updated; const parameters = visitParameterList(node.parameters, visitor, context); const body = transformFunctionBody(node); if (node.kind === 178 /* GetAccessor */) { updated = factory2.updateGetAccessorDeclaration(node, node.modifiers, node.name, parameters, node.type, body); } else { updated = factory2.updateSetAccessorDeclaration(node, node.modifiers, node.name, parameters, body); } exitSubtree(ancestorFacts, 229376 /* FunctionSubtreeExcludes */, 0 /* None */); convertedLoopState = savedConvertedLoopState; return updated; } function visitShorthandPropertyAssignment(node) { return setTextRange( factory2.createPropertyAssignment( node.name, visitIdentifier(factory2.cloneNode(node.name)) ), /*location*/ node ); } function visitComputedPropertyName(node) { return visitEachChild(node, visitor, context); } function visitYieldExpression(node) { return visitEachChild(node, visitor, context); } function visitArrayLiteralExpression(node) { if (some(node.elements, isSpreadElement)) { return transformAndSpreadElements( node.elements, /*isArgumentList*/ false, !!node.multiLine, /*hasTrailingComma*/ !!node.elements.hasTrailingComma ); } return visitEachChild(node, visitor, context); } function visitCallExpression(node) { if (getInternalEmitFlags(node) & 1 /* TypeScriptClassWrapper */) { return visitTypeScriptClassWrapper(node); } const expression = skipOuterExpressions(node.expression); if (expression.kind === 108 /* SuperKeyword */ || isSuperProperty(expression) || some(node.arguments, isSpreadElement)) { return visitCallExpressionWithPotentialCapturedThisAssignment( node, /*assignToCapturedThis*/ true ); } return factory2.updateCallExpression( node, Debug.checkDefined(visitNode(node.expression, callExpressionVisitor, isExpression)), /*typeArguments*/ void 0, visitNodes2(node.arguments, visitor, isExpression) ); } function visitTypeScriptClassWrapper(node) { const body = cast(cast(skipOuterExpressions(node.expression), isArrowFunction).body, isBlock); const isVariableStatementWithInitializer = (stmt) => isVariableStatement(stmt) && !!first(stmt.declarationList.declarations).initializer; const savedConvertedLoopState = convertedLoopState; convertedLoopState = void 0; const bodyStatements = visitNodes2(body.statements, classWrapperStatementVisitor, isStatement); convertedLoopState = savedConvertedLoopState; const classStatements = filter(bodyStatements, isVariableStatementWithInitializer); const remainingStatements = filter(bodyStatements, (stmt) => !isVariableStatementWithInitializer(stmt)); const varStatement = cast(first(classStatements), isVariableStatement); const variable = varStatement.declarationList.declarations[0]; const initializer = skipOuterExpressions(variable.initializer); let aliasAssignment = tryCast(initializer, isAssignmentExpression); if (!aliasAssignment && isBinaryExpression(initializer) && initializer.operatorToken.kind === 28 /* CommaToken */) { aliasAssignment = tryCast(initializer.left, isAssignmentExpression); } const call = cast(aliasAssignment ? skipOuterExpressions(aliasAssignment.right) : initializer, isCallExpression); const func = cast(skipOuterExpressions(call.expression), isFunctionExpression); const funcStatements = func.body.statements; let classBodyStart = 0; let classBodyEnd = -1; const statements = []; if (aliasAssignment) { const extendsCall = tryCast(funcStatements[classBodyStart], isExpressionStatement); if (extendsCall) { statements.push(extendsCall); classBodyStart++; } statements.push(funcStatements[classBodyStart]); classBodyStart++; statements.push( factory2.createExpressionStatement( factory2.createAssignment( aliasAssignment.left, cast(variable.name, isIdentifier) ) ) ); } while (!isReturnStatement(elementAt(funcStatements, classBodyEnd))) { classBodyEnd--; } addRange(statements, funcStatements, classBodyStart, classBodyEnd); if (classBodyEnd < -1) { addRange(statements, funcStatements, classBodyEnd + 1); } const returnStatement = tryCast(elementAt(funcStatements, classBodyEnd), isReturnStatement); for (const statement of remainingStatements) { if (isReturnStatement(statement) && (returnStatement == null ? void 0 : returnStatement.expression) && !isIdentifier(returnStatement.expression)) { statements.push(returnStatement); } else { statements.push(statement); } } addRange( statements, classStatements, /*start*/ 1 ); return factory2.restoreOuterExpressions( node.expression, factory2.restoreOuterExpressions( variable.initializer, factory2.restoreOuterExpressions( aliasAssignment && aliasAssignment.right, factory2.updateCallExpression( call, factory2.restoreOuterExpressions( call.expression, factory2.updateFunctionExpression( func, /*modifiers*/ void 0, /*asteriskToken*/ void 0, /*name*/ void 0, /*typeParameters*/ void 0, func.parameters, /*type*/ void 0, factory2.updateBlock( func.body, statements ) ) ), /*typeArguments*/ void 0, call.arguments ) ) ) ); } function visitCallExpressionWithPotentialCapturedThisAssignment(node, assignToCapturedThis) { if (node.transformFlags & 32768 /* ContainsRestOrSpread */ || node.expression.kind === 108 /* SuperKeyword */ || isSuperProperty(skipOuterExpressions(node.expression))) { const { target, thisArg } = factory2.createCallBinding(node.expression, hoistVariableDeclaration); if (node.expression.kind === 108 /* SuperKeyword */) { setEmitFlags(thisArg, 8 /* NoSubstitution */); } let resultingCall; if (node.transformFlags & 32768 /* ContainsRestOrSpread */) { resultingCall = factory2.createFunctionApplyCall( Debug.checkDefined(visitNode(target, callExpressionVisitor, isExpression)), node.expression.kind === 108 /* SuperKeyword */ ? thisArg : Debug.checkDefined(visitNode(thisArg, visitor, isExpression)), transformAndSpreadElements( node.arguments, /*isArgumentList*/ true, /*multiLine*/ false, /*hasTrailingComma*/ false ) ); } else { resultingCall = setTextRange( factory2.createFunctionCallCall( Debug.checkDefined(visitNode(target, callExpressionVisitor, isExpression)), node.expression.kind === 108 /* SuperKeyword */ ? thisArg : Debug.checkDefined(visitNode(thisArg, visitor, isExpression)), visitNodes2(node.arguments, visitor, isExpression) ), node ); } if (node.expression.kind === 108 /* SuperKeyword */) { const initializer = factory2.createLogicalOr( resultingCall, createActualThis() ); resultingCall = assignToCapturedThis ? factory2.createAssignment(createCapturedThis(), initializer) : initializer; } return setOriginalNode(resultingCall, node); } if (isSuperCall(node)) { hierarchyFacts |= 131072 /* CapturedLexicalThis */; } return visitEachChild(node, visitor, context); } function visitNewExpression(node) { if (some(node.arguments, isSpreadElement)) { const { target, thisArg } = factory2.createCallBinding(factory2.createPropertyAccessExpression(node.expression, "bind"), hoistVariableDeclaration); return factory2.createNewExpression( factory2.createFunctionApplyCall( Debug.checkDefined(visitNode(target, visitor, isExpression)), thisArg, transformAndSpreadElements( factory2.createNodeArray([factory2.createVoidZero(), ...node.arguments]), /*isArgumentList*/ true, /*multiLine*/ false, /*hasTrailingComma*/ false ) ), /*typeArguments*/ void 0, [] ); } return visitEachChild(node, visitor, context); } function transformAndSpreadElements(elements, isArgumentList, multiLine, hasTrailingComma) { const numElements = elements.length; const segments = flatten( // As we visit each element, we return one of two functions to use as the "key": // - `visitSpanOfSpreads` for one or more contiguous `...` spread expressions, i.e. `...a, ...b` in `[1, 2, ...a, ...b]` // - `visitSpanOfNonSpreads` for one or more contiguous non-spread elements, i.e. `1, 2`, in `[1, 2, ...a, ...b]` spanMap(elements, partitionSpread, (partition, visitPartition, _start, end) => visitPartition(partition, multiLine, hasTrailingComma && end === numElements)) ); if (segments.length === 1) { const firstSegment = segments[0]; if (isArgumentList && !compilerOptions.downlevelIteration || isPackedArrayLiteral(firstSegment.expression) || isCallToHelper(firstSegment.expression, "___spreadArray")) { return firstSegment.expression; } } const helpers = emitHelpers(); const startsWithSpread = segments[0].kind !== 0 /* None */; let expression = startsWithSpread ? factory2.createArrayLiteralExpression() : segments[0].expression; for (let i = startsWithSpread ? 0 : 1; i < segments.length; i++) { const segment = segments[i]; expression = helpers.createSpreadArrayHelper( expression, segment.expression, segment.kind === 1 /* UnpackedSpread */ && !isArgumentList ); } return expression; } function partitionSpread(node) { return isSpreadElement(node) ? visitSpanOfSpreads : visitSpanOfNonSpreads; } function visitSpanOfSpreads(chunk) { return map(chunk, visitExpressionOfSpread); } function visitExpressionOfSpread(node) { Debug.assertNode(node, isSpreadElement); let expression = visitNode(node.expression, visitor, isExpression); Debug.assert(expression); const isCallToReadHelper = isCallToHelper(expression, "___read"); let kind = isCallToReadHelper || isPackedArrayLiteral(expression) ? 2 /* PackedSpread */ : 1 /* UnpackedSpread */; if (compilerOptions.downlevelIteration && kind === 1 /* UnpackedSpread */ && !isArrayLiteralExpression(expression) && !isCallToReadHelper) { expression = emitHelpers().createReadHelper( expression, /*count*/ void 0 ); kind = 2 /* PackedSpread */; } return createSpreadSegment(kind, expression); } function visitSpanOfNonSpreads(chunk, multiLine, hasTrailingComma) { const expression = factory2.createArrayLiteralExpression( visitNodes2(factory2.createNodeArray(chunk, hasTrailingComma), visitor, isExpression), multiLine ); return createSpreadSegment(0 /* None */, expression); } function visitSpreadElement(node) { return visitNode(node.expression, visitor, isExpression); } function visitTemplateLiteral(node) { return setTextRange(factory2.createStringLiteral(node.text), node); } function visitStringLiteral(node) { if (node.hasExtendedUnicodeEscape) { return setTextRange(factory2.createStringLiteral(node.text), node); } return node; } function visitNumericLiteral(node) { if (node.numericLiteralFlags & 384 /* BinaryOrOctalSpecifier */) { return setTextRange(factory2.createNumericLiteral(node.text), node); } return node; } function visitTaggedTemplateExpression(node) { return processTaggedTemplateExpression( context, node, visitor, currentSourceFile, recordTaggedTemplateString, 1 /* All */ ); } function visitTemplateExpression(node) { let expression = factory2.createStringLiteral(node.head.text); for (const span of node.templateSpans) { const args = [Debug.checkDefined(visitNode(span.expression, visitor, isExpression))]; if (span.literal.text.length > 0) { args.push(factory2.createStringLiteral(span.literal.text)); } expression = factory2.createCallExpression( factory2.createPropertyAccessExpression(expression, "concat"), /*typeArguments*/ void 0, args ); } return setTextRange(expression, node); } function createSyntheticSuper() { return factory2.createUniqueName("_super", 16 /* Optimistic */ | 32 /* FileLevel */); } function visitSuperKeyword(node, isExpressionOfCall) { const expression = hierarchyFacts & 8 /* NonStaticClassElement */ && !isExpressionOfCall ? factory2.createPropertyAccessExpression(setOriginalNode(createSyntheticSuper(), node), "prototype") : createSyntheticSuper(); setOriginalNode(expression, node); setCommentRange(expression, node); setSourceMapRange(expression, node); return expression; } function visitMetaProperty(node) { if (node.keywordToken === 105 /* NewKeyword */ && node.name.escapedText === "target") { hierarchyFacts |= 32768 /* NewTarget */; return factory2.createUniqueName("_newTarget", 16 /* Optimistic */ | 32 /* FileLevel */); } return node; } function onEmitNode(hint, node, emitCallback) { if (enabledSubstitutions & 1 /* CapturedThis */ && isFunctionLike(node)) { const ancestorFacts = enterSubtree( 32670 /* FunctionExcludes */, getEmitFlags(node) & 16 /* CapturesThis */ ? 65 /* FunctionIncludes */ | 16 /* CapturesThis */ : 65 /* FunctionIncludes */ ); previousOnEmitNode(hint, node, emitCallback); exitSubtree(ancestorFacts, 0 /* None */, 0 /* None */); return; } previousOnEmitNode(hint, node, emitCallback); } function enableSubstitutionsForBlockScopedBindings() { if ((enabledSubstitutions & 2 /* BlockScopedBindings */) === 0) { enabledSubstitutions |= 2 /* BlockScopedBindings */; context.enableSubstitution(80 /* Identifier */); } } function enableSubstitutionsForCapturedThis() { if ((enabledSubstitutions & 1 /* CapturedThis */) === 0) { enabledSubstitutions |= 1 /* CapturedThis */; context.enableSubstitution(110 /* ThisKeyword */); context.enableEmitNotification(177 /* Constructor */); context.enableEmitNotification(175 /* MethodDeclaration */); context.enableEmitNotification(178 /* GetAccessor */); context.enableEmitNotification(179 /* SetAccessor */); context.enableEmitNotification(220 /* ArrowFunction */); context.enableEmitNotification(219 /* FunctionExpression */); context.enableEmitNotification(263 /* FunctionDeclaration */); } } function onSubstituteNode(hint, node) { node = previousOnSubstituteNode(hint, node); if (hint === 1 /* Expression */) { return substituteExpression(node); } if (isIdentifier(node)) { return substituteIdentifier(node); } return node; } function substituteIdentifier(node) { if (enabledSubstitutions & 2 /* BlockScopedBindings */ && !isInternalName(node)) { const original = getParseTreeNode(node, isIdentifier); if (original && isNameOfDeclarationWithCollidingName(original)) { return setTextRange(factory2.getGeneratedNameForNode(original), node); } } return node; } function isNameOfDeclarationWithCollidingName(node) { switch (node.parent.kind) { case 209 /* BindingElement */: case 264 /* ClassDeclaration */: case 267 /* EnumDeclaration */: case 261 /* VariableDeclaration */: return node.parent.name === node && resolver.isDeclarationWithCollidingName(node.parent); } return false; } function substituteExpression(node) { switch (node.kind) { case 80 /* Identifier */: return substituteExpressionIdentifier(node); case 110 /* ThisKeyword */: return substituteThisKeyword(node); } return node; } function substituteExpressionIdentifier(node) { if (enabledSubstitutions & 2 /* BlockScopedBindings */ && !isInternalName(node)) { const declaration = resolver.getReferencedDeclarationWithCollidingName(node); if (declaration && !(isClassLike(declaration) && isPartOfClassBody(declaration, node))) { return setTextRange(factory2.getGeneratedNameForNode(getNameOfDeclaration(declaration)), node); } } return node; } function isPartOfClassBody(declaration, node) { let currentNode = getParseTreeNode(node); if (!currentNode || currentNode === declaration || currentNode.end <= declaration.pos || currentNode.pos >= declaration.end) { return false; } const blockScope = getEnclosingBlockScopeContainer(declaration); while (currentNode) { if (currentNode === blockScope || currentNode === declaration) { return false; } if (isClassElement(currentNode) && currentNode.parent === declaration) { return true; } currentNode = currentNode.parent; } return false; } function substituteThisKeyword(node) { if (enabledSubstitutions & 1 /* CapturedThis */ && hierarchyFacts & 16 /* CapturesThis */) { return setTextRange(createCapturedThis(), node); } return node; } function getClassMemberPrefix(node, member) { return isStatic(member) ? factory2.getInternalName(node) : factory2.createPropertyAccessExpression(factory2.getInternalName(node), "prototype"); } function hasSynthesizedDefaultSuperCall(constructor, hasExtendsClause) { if (!constructor || !hasExtendsClause) { return false; } if (some(constructor.parameters)) { return false; } const statement = firstOrUndefined(constructor.body.statements); if (!statement || !nodeIsSynthesized(statement) || statement.kind !== 245 /* ExpressionStatement */) { return false; } const statementExpression = statement.expression; if (!nodeIsSynthesized(statementExpression) || statementExpression.kind !== 214 /* CallExpression */) { return false; } const callTarget = statementExpression.expression; if (!nodeIsSynthesized(callTarget) || callTarget.kind !== 108 /* SuperKeyword */) { return false; } const callArgument = singleOrUndefined(statementExpression.arguments); if (!callArgument || !nodeIsSynthesized(callArgument) || callArgument.kind !== 231 /* SpreadElement */) { return false; } const expression = callArgument.expression; return isIdentifier(expression) && expression.escapedText === "arguments"; } } // src/compiler/transformers/generators.ts function getInstructionName(instruction) { switch (instruction) { case 2 /* Return */: return "return"; case 3 /* Break */: return "break"; case 4 /* Yield */: return "yield"; case 5 /* YieldStar */: return "yield*"; case 7 /* Endfinally */: return "endfinally"; default: return void 0; } } function transformGenerators(context) { const { factory: factory2, getEmitHelperFactory: emitHelpers, resumeLexicalEnvironment, endLexicalEnvironment, hoistFunctionDeclaration, hoistVariableDeclaration } = context; const compilerOptions = context.getCompilerOptions(); const languageVersion = getEmitScriptTarget(compilerOptions); const resolver = context.getEmitResolver(); const previousOnSubstituteNode = context.onSubstituteNode; context.onSubstituteNode = onSubstituteNode; let renamedCatchVariables; let renamedCatchVariableDeclarations; let inGeneratorFunctionBody; let inStatementContainingYield; let blocks; let blockOffsets; let blockActions; let blockStack; let labelOffsets; let labelExpressions; let nextLabelId = 1; let operations; let operationArguments; let operationLocations; let state; let blockIndex = 0; let labelNumber = 0; let labelNumbers; let lastOperationWasAbrupt; let lastOperationWasCompletion; let clauses; let statements; let exceptionBlockStack; let currentExceptionBlock; let withBlockStack; return chainBundle(context, transformSourceFile); function transformSourceFile(node) { if (node.isDeclarationFile || (node.transformFlags & 2048 /* ContainsGenerator */) === 0) { return node; } const visited = visitEachChild(node, visitor, context); addEmitHelpers(visited, context.readEmitHelpers()); return visited; } function visitor(node) { const transformFlags = node.transformFlags; if (inStatementContainingYield) { return visitJavaScriptInStatementContainingYield(node); } else if (inGeneratorFunctionBody) { return visitJavaScriptInGeneratorFunctionBody(node); } else if (isFunctionLikeDeclaration(node) && node.asteriskToken) { return visitGenerator(node); } else if (transformFlags & 2048 /* ContainsGenerator */) { return visitEachChild(node, visitor, context); } else { return node; } } function visitJavaScriptInStatementContainingYield(node) { switch (node.kind) { case 247 /* DoStatement */: return visitDoStatement(node); case 248 /* WhileStatement */: return visitWhileStatement(node); case 256 /* SwitchStatement */: return visitSwitchStatement(node); case 257 /* LabeledStatement */: return visitLabeledStatement(node); default: return visitJavaScriptInGeneratorFunctionBody(node); } } function visitJavaScriptInGeneratorFunctionBody(node) { switch (node.kind) { case 263 /* FunctionDeclaration */: return visitFunctionDeclaration(node); case 219 /* FunctionExpression */: return visitFunctionExpression(node); case 178 /* GetAccessor */: case 179 /* SetAccessor */: return visitAccessorDeclaration(node); case 244 /* VariableStatement */: return visitVariableStatement(node); case 249 /* ForStatement */: return visitForStatement(node); case 250 /* ForInStatement */: return visitForInStatement(node); case 253 /* BreakStatement */: return visitBreakStatement(node); case 252 /* ContinueStatement */: return visitContinueStatement(node); case 254 /* ReturnStatement */: return visitReturnStatement(node); default: if (node.transformFlags & 1048576 /* ContainsYield */) { return visitJavaScriptContainingYield(node); } else if (node.transformFlags & (2048 /* ContainsGenerator */ | 4194304 /* ContainsHoistedDeclarationOrCompletion */)) { return visitEachChild(node, visitor, context); } else { return node; } } } function visitJavaScriptContainingYield(node) { switch (node.kind) { case 227 /* BinaryExpression */: return visitBinaryExpression(node); case 357 /* CommaListExpression */: return visitCommaListExpression(node); case 228 /* ConditionalExpression */: return visitConditionalExpression(node); case 230 /* YieldExpression */: return visitYieldExpression(node); case 210 /* ArrayLiteralExpression */: return visitArrayLiteralExpression(node); case 211 /* ObjectLiteralExpression */: return visitObjectLiteralExpression(node); case 213 /* ElementAccessExpression */: return visitElementAccessExpression(node); case 214 /* CallExpression */: return visitCallExpression(node); case 215 /* NewExpression */: return visitNewExpression(node); default: return visitEachChild(node, visitor, context); } } function visitGenerator(node) { switch (node.kind) { case 263 /* FunctionDeclaration */: return visitFunctionDeclaration(node); case 219 /* FunctionExpression */: return visitFunctionExpression(node); default: return Debug.failBadSyntaxKind(node); } } function visitFunctionDeclaration(node) { if (node.asteriskToken) { node = setOriginalNode( setTextRange( factory2.createFunctionDeclaration( node.modifiers, /*asteriskToken*/ void 0, node.name, /*typeParameters*/ void 0, visitParameterList(node.parameters, visitor, context), /*type*/ void 0, transformGeneratorFunctionBody(node.body) ), /*location*/ node ), node ); } else { const savedInGeneratorFunctionBody = inGeneratorFunctionBody; const savedInStatementContainingYield = inStatementContainingYield; inGeneratorFunctionBody = false; inStatementContainingYield = false; node = visitEachChild(node, visitor, context); inGeneratorFunctionBody = savedInGeneratorFunctionBody; inStatementContainingYield = savedInStatementContainingYield; } if (inGeneratorFunctionBody) { hoistFunctionDeclaration(node); return void 0; } else { return node; } } function visitFunctionExpression(node) { if (node.asteriskToken) { node = setOriginalNode( setTextRange( factory2.createFunctionExpression( /*modifiers*/ void 0, /*asteriskToken*/ void 0, node.name, /*typeParameters*/ void 0, visitParameterList(node.parameters, visitor, context), /*type*/ void 0, transformGeneratorFunctionBody(node.body) ), /*location*/ node ), node ); } else { const savedInGeneratorFunctionBody = inGeneratorFunctionBody; const savedInStatementContainingYield = inStatementContainingYield; inGeneratorFunctionBody = false; inStatementContainingYield = false; node = visitEachChild(node, visitor, context); inGeneratorFunctionBody = savedInGeneratorFunctionBody; inStatementContainingYield = savedInStatementContainingYield; } return node; } function visitAccessorDeclaration(node) { const savedInGeneratorFunctionBody = inGeneratorFunctionBody; const savedInStatementContainingYield = inStatementContainingYield; inGeneratorFunctionBody = false; inStatementContainingYield = false; node = visitEachChild(node, visitor, context); inGeneratorFunctionBody = savedInGeneratorFunctionBody; inStatementContainingYield = savedInStatementContainingYield; return node; } function transformGeneratorFunctionBody(body) { const statements2 = []; const savedInGeneratorFunctionBody = inGeneratorFunctionBody; const savedInStatementContainingYield = inStatementContainingYield; const savedBlocks = blocks; const savedBlockOffsets = blockOffsets; const savedBlockActions = blockActions; const savedBlockStack = blockStack; const savedLabelOffsets = labelOffsets; const savedLabelExpressions = labelExpressions; const savedNextLabelId = nextLabelId; const savedOperations = operations; const savedOperationArguments = operationArguments; const savedOperationLocations = operationLocations; const savedState = state; inGeneratorFunctionBody = true; inStatementContainingYield = false; blocks = void 0; blockOffsets = void 0; blockActions = void 0; blockStack = void 0; labelOffsets = void 0; labelExpressions = void 0; nextLabelId = 1; operations = void 0; operationArguments = void 0; operationLocations = void 0; state = factory2.createTempVariable( /*recordTempVariable*/ void 0 ); resumeLexicalEnvironment(); const statementOffset = factory2.copyPrologue( body.statements, statements2, /*ensureUseStrict*/ false, visitor ); transformAndEmitStatements(body.statements, statementOffset); const buildResult = build2(); insertStatementsAfterStandardPrologue(statements2, endLexicalEnvironment()); statements2.push(factory2.createReturnStatement(buildResult)); inGeneratorFunctionBody = savedInGeneratorFunctionBody; inStatementContainingYield = savedInStatementContainingYield; blocks = savedBlocks; blockOffsets = savedBlockOffsets; blockActions = savedBlockActions; blockStack = savedBlockStack; labelOffsets = savedLabelOffsets; labelExpressions = savedLabelExpressions; nextLabelId = savedNextLabelId; operations = savedOperations; operationArguments = savedOperationArguments; operationLocations = savedOperationLocations; state = savedState; return setTextRange(factory2.createBlock(statements2, body.multiLine), body); } function visitVariableStatement(node) { if (node.transformFlags & 1048576 /* ContainsYield */) { transformAndEmitVariableDeclarationList(node.declarationList); return void 0; } else { if (getEmitFlags(node) & 2097152 /* CustomPrologue */) { return node; } for (const variable of node.declarationList.declarations) { hoistVariableDeclaration(variable.name); } const variables = getInitializedVariables(node.declarationList); if (variables.length === 0) { return void 0; } return setSourceMapRange( factory2.createExpressionStatement( factory2.inlineExpressions( map(variables, transformInitializedVariable) ) ), node ); } } function visitBinaryExpression(node) { const assoc = getExpressionAssociativity(node); switch (assoc) { case 0 /* Left */: return visitLeftAssociativeBinaryExpression(node); case 1 /* Right */: return visitRightAssociativeBinaryExpression(node); default: return Debug.assertNever(assoc); } } function visitRightAssociativeBinaryExpression(node) { const { left, right } = node; if (containsYield(right)) { let target; switch (left.kind) { case 212 /* PropertyAccessExpression */: target = factory2.updatePropertyAccessExpression( left, cacheExpression(Debug.checkDefined(visitNode(left.expression, visitor, isLeftHandSideExpression))), left.name ); break; case 213 /* ElementAccessExpression */: target = factory2.updateElementAccessExpression(left, cacheExpression(Debug.checkDefined(visitNode(left.expression, visitor, isLeftHandSideExpression))), cacheExpression(Debug.checkDefined(visitNode(left.argumentExpression, visitor, isExpression)))); break; default: target = Debug.checkDefined(visitNode(left, visitor, isExpression)); break; } const operator = node.operatorToken.kind; if (isCompoundAssignment(operator)) { return setTextRange( factory2.createAssignment( target, setTextRange( factory2.createBinaryExpression( cacheExpression(target), getNonAssignmentOperatorForCompoundAssignment(operator), Debug.checkDefined(visitNode(right, visitor, isExpression)) ), node ) ), node ); } else { return factory2.updateBinaryExpression(node, target, node.operatorToken, Debug.checkDefined(visitNode(right, visitor, isExpression))); } } return visitEachChild(node, visitor, context); } function visitLeftAssociativeBinaryExpression(node) { if (containsYield(node.right)) { if (isLogicalOperator(node.operatorToken.kind)) { return visitLogicalBinaryExpression(node); } else if (node.operatorToken.kind === 28 /* CommaToken */) { return visitCommaExpression(node); } return factory2.updateBinaryExpression(node, cacheExpression(Debug.checkDefined(visitNode(node.left, visitor, isExpression))), node.operatorToken, Debug.checkDefined(visitNode(node.right, visitor, isExpression))); } return visitEachChild(node, visitor, context); } function visitCommaExpression(node) { let pendingExpressions = []; visit(node.left); visit(node.right); return factory2.inlineExpressions(pendingExpressions); function visit(node2) { if (isBinaryExpression(node2) && node2.operatorToken.kind === 28 /* CommaToken */) { visit(node2.left); visit(node2.right); } else { if (containsYield(node2) && pendingExpressions.length > 0) { emitWorker(1 /* Statement */, [factory2.createExpressionStatement(factory2.inlineExpressions(pendingExpressions))]); pendingExpressions = []; } pendingExpressions.push(Debug.checkDefined(visitNode(node2, visitor, isExpression))); } } } function visitCommaListExpression(node) { let pendingExpressions = []; for (const elem of node.elements) { if (isBinaryExpression(elem) && elem.operatorToken.kind === 28 /* CommaToken */) { pendingExpressions.push(visitCommaExpression(elem)); } else { if (containsYield(elem) && pendingExpressions.length > 0) { emitWorker(1 /* Statement */, [factory2.createExpressionStatement(factory2.inlineExpressions(pendingExpressions))]); pendingExpressions = []; } pendingExpressions.push(Debug.checkDefined(visitNode(elem, visitor, isExpression))); } } return factory2.inlineExpressions(pendingExpressions); } function visitLogicalBinaryExpression(node) { const resultLabel = defineLabel(); const resultLocal = declareLocal(); emitAssignment( resultLocal, Debug.checkDefined(visitNode(node.left, visitor, isExpression)), /*location*/ node.left ); if (node.operatorToken.kind === 56 /* AmpersandAmpersandToken */) { emitBreakWhenFalse( resultLabel, resultLocal, /*location*/ node.left ); } else { emitBreakWhenTrue( resultLabel, resultLocal, /*location*/ node.left ); } emitAssignment( resultLocal, Debug.checkDefined(visitNode(node.right, visitor, isExpression)), /*location*/ node.right ); markLabel(resultLabel); return resultLocal; } function visitConditionalExpression(node) { if (containsYield(node.whenTrue) || containsYield(node.whenFalse)) { const whenFalseLabel = defineLabel(); const resultLabel = defineLabel(); const resultLocal = declareLocal(); emitBreakWhenFalse( whenFalseLabel, Debug.checkDefined(visitNode(node.condition, visitor, isExpression)), /*location*/ node.condition ); emitAssignment( resultLocal, Debug.checkDefined(visitNode(node.whenTrue, visitor, isExpression)), /*location*/ node.whenTrue ); emitBreak(resultLabel); markLabel(whenFalseLabel); emitAssignment( resultLocal, Debug.checkDefined(visitNode(node.whenFalse, visitor, isExpression)), /*location*/ node.whenFalse ); markLabel(resultLabel); return resultLocal; } return visitEachChild(node, visitor, context); } function visitYieldExpression(node) { const resumeLabel = defineLabel(); const expression = visitNode(node.expression, visitor, isExpression); if (node.asteriskToken) { const iterator = (getEmitFlags(node.expression) & 8388608 /* Iterator */) === 0 ? setTextRange(emitHelpers().createValuesHelper(expression), node) : expression; emitYieldStar( iterator, /*location*/ node ); } else { emitYield( expression, /*location*/ node ); } markLabel(resumeLabel); return createGeneratorResume( /*location*/ node ); } function visitArrayLiteralExpression(node) { return visitElements( node.elements, /*leadingElement*/ void 0, /*location*/ void 0, node.multiLine ); } function visitElements(elements, leadingElement, location, multiLine) { const numInitialElements = countInitialNodesWithoutYield(elements); let temp; if (numInitialElements > 0) { temp = declareLocal(); const initialElements = visitNodes2(elements, visitor, isExpression, 0, numInitialElements); emitAssignment( temp, factory2.createArrayLiteralExpression( leadingElement ? [leadingElement, ...initialElements] : initialElements ) ); leadingElement = void 0; } const expressions = reduceLeft(elements, reduceElement, [], numInitialElements); return temp ? factory2.createArrayConcatCall(temp, [factory2.createArrayLiteralExpression(expressions, multiLine)]) : setTextRange( factory2.createArrayLiteralExpression(leadingElement ? [leadingElement, ...expressions] : expressions, multiLine), location ); function reduceElement(expressions2, element) { if (containsYield(element) && expressions2.length > 0) { const hasAssignedTemp = temp !== void 0; if (!temp) { temp = declareLocal(); } emitAssignment( temp, hasAssignedTemp ? factory2.createArrayConcatCall( temp, [factory2.createArrayLiteralExpression(expressions2, multiLine)] ) : factory2.createArrayLiteralExpression( leadingElement ? [leadingElement, ...expressions2] : expressions2, multiLine ) ); leadingElement = void 0; expressions2 = []; } expressions2.push(Debug.checkDefined(visitNode(element, visitor, isExpression))); return expressions2; } } function visitObjectLiteralExpression(node) { const properties = node.properties; const multiLine = node.multiLine; const numInitialProperties = countInitialNodesWithoutYield(properties); const temp = declareLocal(); emitAssignment( temp, factory2.createObjectLiteralExpression( visitNodes2(properties, visitor, isObjectLiteralElementLike, 0, numInitialProperties), multiLine ) ); const expressions = reduceLeft(properties, reduceProperty, [], numInitialProperties); expressions.push(multiLine ? startOnNewLine(setParent(setTextRange(factory2.cloneNode(temp), temp), temp.parent)) : temp); return factory2.inlineExpressions(expressions); function reduceProperty(expressions2, property) { if (containsYield(property) && expressions2.length > 0) { emitStatement(factory2.createExpressionStatement(factory2.inlineExpressions(expressions2))); expressions2 = []; } const expression = createExpressionForObjectLiteralElementLike(factory2, node, property, temp); const visited = visitNode(expression, visitor, isExpression); if (visited) { if (multiLine) { startOnNewLine(visited); } expressions2.push(visited); } return expressions2; } } function visitElementAccessExpression(node) { if (containsYield(node.argumentExpression)) { return factory2.updateElementAccessExpression(node, cacheExpression(Debug.checkDefined(visitNode(node.expression, visitor, isLeftHandSideExpression))), Debug.checkDefined(visitNode(node.argumentExpression, visitor, isExpression))); } return visitEachChild(node, visitor, context); } function visitCallExpression(node) { if (!isImportCall(node) && forEach(node.arguments, containsYield)) { const { target, thisArg } = factory2.createCallBinding( node.expression, hoistVariableDeclaration, languageVersion, /*cacheIdentifiers*/ true ); return setOriginalNode( setTextRange( factory2.createFunctionApplyCall( cacheExpression(Debug.checkDefined(visitNode(target, visitor, isLeftHandSideExpression))), thisArg, visitElements(node.arguments) ), node ), node ); } return visitEachChild(node, visitor, context); } function visitNewExpression(node) { if (forEach(node.arguments, containsYield)) { const { target, thisArg } = factory2.createCallBinding(factory2.createPropertyAccessExpression(node.expression, "bind"), hoistVariableDeclaration); return setOriginalNode( setTextRange( factory2.createNewExpression( factory2.createFunctionApplyCall( cacheExpression(Debug.checkDefined(visitNode(target, visitor, isExpression))), thisArg, visitElements( node.arguments, /*leadingElement*/ factory2.createVoidZero() ) ), /*typeArguments*/ void 0, [] ), node ), node ); } return visitEachChild(node, visitor, context); } function transformAndEmitStatements(statements2, start = 0) { const numStatements = statements2.length; for (let i = start; i < numStatements; i++) { transformAndEmitStatement(statements2[i]); } } function transformAndEmitEmbeddedStatement(node) { if (isBlock(node)) { transformAndEmitStatements(node.statements); } else { transformAndEmitStatement(node); } } function transformAndEmitStatement(node) { const savedInStatementContainingYield = inStatementContainingYield; if (!inStatementContainingYield) { inStatementContainingYield = containsYield(node); } transformAndEmitStatementWorker(node); inStatementContainingYield = savedInStatementContainingYield; } function transformAndEmitStatementWorker(node) { switch (node.kind) { case 242 /* Block */: return transformAndEmitBlock(node); case 245 /* ExpressionStatement */: return transformAndEmitExpressionStatement(node); case 246 /* IfStatement */: return transformAndEmitIfStatement(node); case 247 /* DoStatement */: return transformAndEmitDoStatement(node); case 248 /* WhileStatement */: return transformAndEmitWhileStatement(node); case 249 /* ForStatement */: return transformAndEmitForStatement(node); case 250 /* ForInStatement */: return transformAndEmitForInStatement(node); case 252 /* ContinueStatement */: return transformAndEmitContinueStatement(node); case 253 /* BreakStatement */: return transformAndEmitBreakStatement(node); case 254 /* ReturnStatement */: return transformAndEmitReturnStatement(node); case 255 /* WithStatement */: return transformAndEmitWithStatement(node); case 256 /* SwitchStatement */: return transformAndEmitSwitchStatement(node); case 257 /* LabeledStatement */: return transformAndEmitLabeledStatement(node); case 258 /* ThrowStatement */: return transformAndEmitThrowStatement(node); case 259 /* TryStatement */: return transformAndEmitTryStatement(node); default: return emitStatement(visitNode(node, visitor, isStatement)); } } function transformAndEmitBlock(node) { if (containsYield(node)) { transformAndEmitStatements(node.statements); } else { emitStatement(visitNode(node, visitor, isStatement)); } } function transformAndEmitExpressionStatement(node) { emitStatement(visitNode(node, visitor, isStatement)); } function transformAndEmitVariableDeclarationList(node) { for (const variable of node.declarations) { const name = factory2.cloneNode(variable.name); setCommentRange(name, variable.name); hoistVariableDeclaration(name); } const variables = getInitializedVariables(node); const numVariables = variables.length; let variablesWritten = 0; let pendingExpressions = []; while (variablesWritten < numVariables) { for (let i = variablesWritten; i < numVariables; i++) { const variable = variables[i]; if (containsYield(variable.initializer) && pendingExpressions.length > 0) { break; } pendingExpressions.push(transformInitializedVariable(variable)); } if (pendingExpressions.length) { emitStatement(factory2.createExpressionStatement(factory2.inlineExpressions(pendingExpressions))); variablesWritten += pendingExpressions.length; pendingExpressions = []; } } return void 0; } function transformInitializedVariable(node) { return setSourceMapRange( factory2.createAssignment( setSourceMapRange(factory2.cloneNode(node.name), node.name), Debug.checkDefined(visitNode(node.initializer, visitor, isExpression)) ), node ); } function transformAndEmitIfStatement(node) { if (containsYield(node)) { if (containsYield(node.thenStatement) || containsYield(node.elseStatement)) { const endLabel = defineLabel(); const elseLabel = node.elseStatement ? defineLabel() : void 0; emitBreakWhenFalse( node.elseStatement ? elseLabel : endLabel, Debug.checkDefined(visitNode(node.expression, visitor, isExpression)), /*location*/ node.expression ); transformAndEmitEmbeddedStatement(node.thenStatement); if (node.elseStatement) { emitBreak(endLabel); markLabel(elseLabel); transformAndEmitEmbeddedStatement(node.elseStatement); } markLabel(endLabel); } else { emitStatement(visitNode(node, visitor, isStatement)); } } else { emitStatement(visitNode(node, visitor, isStatement)); } } function transformAndEmitDoStatement(node) { if (containsYield(node)) { const conditionLabel = defineLabel(); const loopLabel = defineLabel(); beginLoopBlock( /*continueLabel*/ conditionLabel ); markLabel(loopLabel); transformAndEmitEmbeddedStatement(node.statement); markLabel(conditionLabel); emitBreakWhenTrue(loopLabel, Debug.checkDefined(visitNode(node.expression, visitor, isExpression))); endLoopBlock(); } else { emitStatement(visitNode(node, visitor, isStatement)); } } function visitDoStatement(node) { if (inStatementContainingYield) { beginScriptLoopBlock(); node = visitEachChild(node, visitor, context); endLoopBlock(); return node; } else { return visitEachChild(node, visitor, context); } } function transformAndEmitWhileStatement(node) { if (containsYield(node)) { const loopLabel = defineLabel(); const endLabel = beginLoopBlock(loopLabel); markLabel(loopLabel); emitBreakWhenFalse(endLabel, Debug.checkDefined(visitNode(node.expression, visitor, isExpression))); transformAndEmitEmbeddedStatement(node.statement); emitBreak(loopLabel); endLoopBlock(); } else { emitStatement(visitNode(node, visitor, isStatement)); } } function visitWhileStatement(node) { if (inStatementContainingYield) { beginScriptLoopBlock(); node = visitEachChild(node, visitor, context); endLoopBlock(); return node; } else { return visitEachChild(node, visitor, context); } } function transformAndEmitForStatement(node) { if (containsYield(node)) { const conditionLabel = defineLabel(); const incrementLabel = defineLabel(); const endLabel = beginLoopBlock(incrementLabel); if (node.initializer) { const initializer = node.initializer; if (isVariableDeclarationList(initializer)) { transformAndEmitVariableDeclarationList(initializer); } else { emitStatement( setTextRange( factory2.createExpressionStatement( Debug.checkDefined(visitNode(initializer, visitor, isExpression)) ), initializer ) ); } } markLabel(conditionLabel); if (node.condition) { emitBreakWhenFalse(endLabel, Debug.checkDefined(visitNode(node.condition, visitor, isExpression))); } transformAndEmitEmbeddedStatement(node.statement); markLabel(incrementLabel); if (node.incrementor) { emitStatement( setTextRange( factory2.createExpressionStatement( Debug.checkDefined(visitNode(node.incrementor, visitor, isExpression)) ), node.incrementor ) ); } emitBreak(conditionLabel); endLoopBlock(); } else { emitStatement(visitNode(node, visitor, isStatement)); } } function visitForStatement(node) { if (inStatementContainingYield) { beginScriptLoopBlock(); } const initializer = node.initializer; if (initializer && isVariableDeclarationList(initializer)) { for (const variable of initializer.declarations) { hoistVariableDeclaration(variable.name); } const variables = getInitializedVariables(initializer); node = factory2.updateForStatement( node, variables.length > 0 ? factory2.inlineExpressions(map(variables, transformInitializedVariable)) : void 0, visitNode(node.condition, visitor, isExpression), visitNode(node.incrementor, visitor, isExpression), visitIterationBody(node.statement, visitor, context) ); } else { node = visitEachChild(node, visitor, context); } if (inStatementContainingYield) { endLoopBlock(); } return node; } function transformAndEmitForInStatement(node) { if (containsYield(node)) { const obj = declareLocal(); const keysArray = declareLocal(); const key = declareLocal(); const keysIndex = factory2.createLoopVariable(); const initializer = node.initializer; hoistVariableDeclaration(keysIndex); emitAssignment(obj, Debug.checkDefined(visitNode(node.expression, visitor, isExpression))); emitAssignment(keysArray, factory2.createArrayLiteralExpression()); emitStatement( factory2.createForInStatement( key, obj, factory2.createExpressionStatement( factory2.createCallExpression( factory2.createPropertyAccessExpression(keysArray, "push"), /*typeArguments*/ void 0, [key] ) ) ) ); emitAssignment(keysIndex, factory2.createNumericLiteral(0)); const conditionLabel = defineLabel(); const incrementLabel = defineLabel(); const endLoopLabel = beginLoopBlock(incrementLabel); markLabel(conditionLabel); emitBreakWhenFalse(endLoopLabel, factory2.createLessThan(keysIndex, factory2.createPropertyAccessExpression(keysArray, "length"))); emitAssignment(key, factory2.createElementAccessExpression(keysArray, keysIndex)); emitBreakWhenFalse(incrementLabel, factory2.createBinaryExpression(key, 103 /* InKeyword */, obj)); let variable; if (isVariableDeclarationList(initializer)) { for (const variable2 of initializer.declarations) { hoistVariableDeclaration(variable2.name); } variable = factory2.cloneNode(initializer.declarations[0].name); } else { variable = Debug.checkDefined(visitNode(initializer, visitor, isExpression)); Debug.assert(isLeftHandSideExpression(variable)); } emitAssignment(variable, key); transformAndEmitEmbeddedStatement(node.statement); markLabel(incrementLabel); emitStatement(factory2.createExpressionStatement(factory2.createPostfixIncrement(keysIndex))); emitBreak(conditionLabel); endLoopBlock(); } else { emitStatement(visitNode(node, visitor, isStatement)); } } function visitForInStatement(node) { if (inStatementContainingYield) { beginScriptLoopBlock(); } const initializer = node.initializer; if (isVariableDeclarationList(initializer)) { for (const variable of initializer.declarations) { hoistVariableDeclaration(variable.name); } node = factory2.updateForInStatement(node, initializer.declarations[0].name, Debug.checkDefined(visitNode(node.expression, visitor, isExpression)), Debug.checkDefined(visitNode(node.statement, visitor, isStatement, factory2.liftToBlock))); } else { node = visitEachChild(node, visitor, context); } if (inStatementContainingYield) { endLoopBlock(); } return node; } function transformAndEmitContinueStatement(node) { const label = findContinueTarget(node.label ? idText(node.label) : void 0); if (label > 0) { emitBreak( label, /*location*/ node ); } else { emitStatement(node); } } function visitContinueStatement(node) { if (inStatementContainingYield) { const label = findContinueTarget(node.label && idText(node.label)); if (label > 0) { return createInlineBreak( label, /*location*/ node ); } } return visitEachChild(node, visitor, context); } function transformAndEmitBreakStatement(node) { const label = findBreakTarget(node.label ? idText(node.label) : void 0); if (label > 0) { emitBreak( label, /*location*/ node ); } else { emitStatement(node); } } function visitBreakStatement(node) { if (inStatementContainingYield) { const label = findBreakTarget(node.label && idText(node.label)); if (label > 0) { return createInlineBreak( label, /*location*/ node ); } } return visitEachChild(node, visitor, context); } function transformAndEmitReturnStatement(node) { emitReturn( visitNode(node.expression, visitor, isExpression), /*location*/ node ); } function visitReturnStatement(node) { return createInlineReturn( visitNode(node.expression, visitor, isExpression), /*location*/ node ); } function transformAndEmitWithStatement(node) { if (containsYield(node)) { beginWithBlock(cacheExpression(Debug.checkDefined(visitNode(node.expression, visitor, isExpression)))); transformAndEmitEmbeddedStatement(node.statement); endWithBlock(); } else { emitStatement(visitNode(node, visitor, isStatement)); } } function transformAndEmitSwitchStatement(node) { if (containsYield(node.caseBlock)) { const caseBlock = node.caseBlock; const numClauses = caseBlock.clauses.length; const endLabel = beginSwitchBlock(); const expression = cacheExpression(Debug.checkDefined(visitNode(node.expression, visitor, isExpression))); const clauseLabels = []; let defaultClauseIndex = -1; for (let i = 0; i < numClauses; i++) { const clause = caseBlock.clauses[i]; clauseLabels.push(defineLabel()); if (clause.kind === 298 /* DefaultClause */ && defaultClauseIndex === -1) { defaultClauseIndex = i; } } let clausesWritten = 0; let pendingClauses = []; while (clausesWritten < numClauses) { let defaultClausesSkipped = 0; for (let i = clausesWritten; i < numClauses; i++) { const clause = caseBlock.clauses[i]; if (clause.kind === 297 /* CaseClause */) { if (containsYield(clause.expression) && pendingClauses.length > 0) { break; } pendingClauses.push( factory2.createCaseClause( Debug.checkDefined(visitNode(clause.expression, visitor, isExpression)), [ createInlineBreak( clauseLabels[i], /*location*/ clause.expression ) ] ) ); } else { defaultClausesSkipped++; } } if (pendingClauses.length) { emitStatement(factory2.createSwitchStatement(expression, factory2.createCaseBlock(pendingClauses))); clausesWritten += pendingClauses.length; pendingClauses = []; } if (defaultClausesSkipped > 0) { clausesWritten += defaultClausesSkipped; defaultClausesSkipped = 0; } } if (defaultClauseIndex >= 0) { emitBreak(clauseLabels[defaultClauseIndex]); } else { emitBreak(endLabel); } for (let i = 0; i < numClauses; i++) { markLabel(clauseLabels[i]); transformAndEmitStatements(caseBlock.clauses[i].statements); } endSwitchBlock(); } else { emitStatement(visitNode(node, visitor, isStatement)); } } function visitSwitchStatement(node) { if (inStatementContainingYield) { beginScriptSwitchBlock(); } node = visitEachChild(node, visitor, context); if (inStatementContainingYield) { endSwitchBlock(); } return node; } function transformAndEmitLabeledStatement(node) { if (containsYield(node)) { beginLabeledBlock(idText(node.label)); transformAndEmitEmbeddedStatement(node.statement); endLabeledBlock(); } else { emitStatement(visitNode(node, visitor, isStatement)); } } function visitLabeledStatement(node) { if (inStatementContainingYield) { beginScriptLabeledBlock(idText(node.label)); } node = visitEachChild(node, visitor, context); if (inStatementContainingYield) { endLabeledBlock(); } return node; } function transformAndEmitThrowStatement(node) { emitThrow( Debug.checkDefined(visitNode(node.expression ?? factory2.createVoidZero(), visitor, isExpression)), /*location*/ node ); } function transformAndEmitTryStatement(node) { if (containsYield(node)) { beginExceptionBlock(); transformAndEmitEmbeddedStatement(node.tryBlock); if (node.catchClause) { beginCatchBlock(node.catchClause.variableDeclaration); transformAndEmitEmbeddedStatement(node.catchClause.block); } if (node.finallyBlock) { beginFinallyBlock(); transformAndEmitEmbeddedStatement(node.finallyBlock); } endExceptionBlock(); } else { emitStatement(visitEachChild(node, visitor, context)); } } function containsYield(node) { return !!node && (node.transformFlags & 1048576 /* ContainsYield */) !== 0; } function countInitialNodesWithoutYield(nodes) { const numNodes = nodes.length; for (let i = 0; i < numNodes; i++) { if (containsYield(nodes[i])) { return i; } } return -1; } function onSubstituteNode(hint, node) { node = previousOnSubstituteNode(hint, node); if (hint === 1 /* Expression */) { return substituteExpression(node); } return node; } function substituteExpression(node) { if (isIdentifier(node)) { return substituteExpressionIdentifier(node); } return node; } function substituteExpressionIdentifier(node) { if (!isGeneratedIdentifier(node) && renamedCatchVariables && renamedCatchVariables.has(idText(node))) { const original = getOriginalNode(node); if (isIdentifier(original) && original.parent) { const declaration = resolver.getReferencedValueDeclaration(original); if (declaration) { const name = renamedCatchVariableDeclarations[getOriginalNodeId(declaration)]; if (name) { const clone = setParent(setTextRange(factory2.cloneNode(name), name), name.parent); setSourceMapRange(clone, node); setCommentRange(clone, node); return clone; } } } } return node; } function cacheExpression(node) { if (isGeneratedIdentifier(node) || getEmitFlags(node) & 8192 /* HelperName */) { return node; } const temp = factory2.createTempVariable(hoistVariableDeclaration); emitAssignment( temp, node, /*location*/ node ); return temp; } function declareLocal(name) { const temp = name ? factory2.createUniqueName(name) : factory2.createTempVariable( /*recordTempVariable*/ void 0 ); hoistVariableDeclaration(temp); return temp; } function defineLabel() { if (!labelOffsets) { labelOffsets = []; } const label = nextLabelId; nextLabelId++; labelOffsets[label] = -1; return label; } function markLabel(label) { Debug.assert(labelOffsets !== void 0, "No labels were defined."); labelOffsets[label] = operations ? operations.length : 0; } function beginBlock(block) { if (!blocks) { blocks = []; blockActions = []; blockOffsets = []; blockStack = []; } const index = blockActions.length; blockActions[index] = 0 /* Open */; blockOffsets[index] = operations ? operations.length : 0; blocks[index] = block; blockStack.push(block); return index; } function endBlock() { const block = peekBlock(); if (block === void 0) return Debug.fail("beginBlock was never called."); const index = blockActions.length; blockActions[index] = 1 /* Close */; blockOffsets[index] = operations ? operations.length : 0; blocks[index] = block; blockStack.pop(); return block; } function peekBlock() { return lastOrUndefined(blockStack); } function peekBlockKind() { const block = peekBlock(); return block && block.kind; } function beginWithBlock(expression) { const startLabel = defineLabel(); const endLabel = defineLabel(); markLabel(startLabel); beginBlock({ kind: 1 /* With */, expression, startLabel, endLabel }); } function endWithBlock() { Debug.assert(peekBlockKind() === 1 /* With */); const block = endBlock(); markLabel(block.endLabel); } function beginExceptionBlock() { const startLabel = defineLabel(); const endLabel = defineLabel(); markLabel(startLabel); beginBlock({ kind: 0 /* Exception */, state: 0 /* Try */, startLabel, endLabel }); emitNop(); return endLabel; } function beginCatchBlock(variable) { Debug.assert(peekBlockKind() === 0 /* Exception */); let name; if (isGeneratedIdentifier(variable.name)) { name = variable.name; hoistVariableDeclaration(variable.name); } else { const text = idText(variable.name); name = declareLocal(text); if (!renamedCatchVariables) { renamedCatchVariables = /* @__PURE__ */ new Map(); renamedCatchVariableDeclarations = []; context.enableSubstitution(80 /* Identifier */); } renamedCatchVariables.set(text, true); renamedCatchVariableDeclarations[getOriginalNodeId(variable)] = name; } const exception = peekBlock(); Debug.assert(exception.state < 1 /* Catch */); const endLabel = exception.endLabel; emitBreak(endLabel); const catchLabel = defineLabel(); markLabel(catchLabel); exception.state = 1 /* Catch */; exception.catchVariable = name; exception.catchLabel = catchLabel; emitAssignment(name, factory2.createCallExpression( factory2.createPropertyAccessExpression(state, "sent"), /*typeArguments*/ void 0, [] )); emitNop(); } function beginFinallyBlock() { Debug.assert(peekBlockKind() === 0 /* Exception */); const exception = peekBlock(); Debug.assert(exception.state < 2 /* Finally */); const endLabel = exception.endLabel; emitBreak(endLabel); const finallyLabel = defineLabel(); markLabel(finallyLabel); exception.state = 2 /* Finally */; exception.finallyLabel = finallyLabel; } function endExceptionBlock() { Debug.assert(peekBlockKind() === 0 /* Exception */); const exception = endBlock(); const state2 = exception.state; if (state2 < 2 /* Finally */) { emitBreak(exception.endLabel); } else { emitEndfinally(); } markLabel(exception.endLabel); emitNop(); exception.state = 3 /* Done */; } function beginScriptLoopBlock() { beginBlock({ kind: 3 /* Loop */, isScript: true, breakLabel: -1, continueLabel: -1 }); } function beginLoopBlock(continueLabel) { const breakLabel = defineLabel(); beginBlock({ kind: 3 /* Loop */, isScript: false, breakLabel, continueLabel }); return breakLabel; } function endLoopBlock() { Debug.assert(peekBlockKind() === 3 /* Loop */); const block = endBlock(); const breakLabel = block.breakLabel; if (!block.isScript) { markLabel(breakLabel); } } function beginScriptSwitchBlock() { beginBlock({ kind: 2 /* Switch */, isScript: true, breakLabel: -1 }); } function beginSwitchBlock() { const breakLabel = defineLabel(); beginBlock({ kind: 2 /* Switch */, isScript: false, breakLabel }); return breakLabel; } function endSwitchBlock() { Debug.assert(peekBlockKind() === 2 /* Switch */); const block = endBlock(); const breakLabel = block.breakLabel; if (!block.isScript) { markLabel(breakLabel); } } function beginScriptLabeledBlock(labelText) { beginBlock({ kind: 4 /* Labeled */, isScript: true, labelText, breakLabel: -1 }); } function beginLabeledBlock(labelText) { const breakLabel = defineLabel(); beginBlock({ kind: 4 /* Labeled */, isScript: false, labelText, breakLabel }); } function endLabeledBlock() { Debug.assert(peekBlockKind() === 4 /* Labeled */); const block = endBlock(); if (!block.isScript) { markLabel(block.breakLabel); } } function supportsUnlabeledBreak(block) { return block.kind === 2 /* Switch */ || block.kind === 3 /* Loop */; } function supportsLabeledBreakOrContinue(block) { return block.kind === 4 /* Labeled */; } function supportsUnlabeledContinue(block) { return block.kind === 3 /* Loop */; } function hasImmediateContainingLabeledBlock(labelText, start) { for (let j = start; j >= 0; j--) { const containingBlock = blockStack[j]; if (supportsLabeledBreakOrContinue(containingBlock)) { if (containingBlock.labelText === labelText) { return true; } } else { break; } } return false; } function findBreakTarget(labelText) { if (blockStack) { if (labelText) { for (let i = blockStack.length - 1; i >= 0; i--) { const block = blockStack[i]; if (supportsLabeledBreakOrContinue(block) && block.labelText === labelText) { return block.breakLabel; } else if (supportsUnlabeledBreak(block) && hasImmediateContainingLabeledBlock(labelText, i - 1)) { return block.breakLabel; } } } else { for (let i = blockStack.length - 1; i >= 0; i--) { const block = blockStack[i]; if (supportsUnlabeledBreak(block)) { return block.breakLabel; } } } } return 0; } function findContinueTarget(labelText) { if (blockStack) { if (labelText) { for (let i = blockStack.length - 1; i >= 0; i--) { const block = blockStack[i]; if (supportsUnlabeledContinue(block) && hasImmediateContainingLabeledBlock(labelText, i - 1)) { return block.continueLabel; } } } else { for (let i = blockStack.length - 1; i >= 0; i--) { const block = blockStack[i]; if (supportsUnlabeledContinue(block)) { return block.continueLabel; } } } } return 0; } function createLabel(label) { if (label !== void 0 && label > 0) { if (labelExpressions === void 0) { labelExpressions = []; } const expression = factory2.createNumericLiteral(Number.MAX_SAFE_INTEGER); if (labelExpressions[label] === void 0) { labelExpressions[label] = [expression]; } else { labelExpressions[label].push(expression); } return expression; } return factory2.createOmittedExpression(); } function createInstruction(instruction) { const literal = factory2.createNumericLiteral(instruction); addSyntheticTrailingComment(literal, 3 /* MultiLineCommentTrivia */, getInstructionName(instruction)); return literal; } function createInlineBreak(label, location) { Debug.assertLessThan(0, label, "Invalid label"); return setTextRange( factory2.createReturnStatement( factory2.createArrayLiteralExpression([ createInstruction(3 /* Break */), createLabel(label) ]) ), location ); } function createInlineReturn(expression, location) { return setTextRange( factory2.createReturnStatement( factory2.createArrayLiteralExpression( expression ? [createInstruction(2 /* Return */), expression] : [createInstruction(2 /* Return */)] ) ), location ); } function createGeneratorResume(location) { return setTextRange( factory2.createCallExpression( factory2.createPropertyAccessExpression(state, "sent"), /*typeArguments*/ void 0, [] ), location ); } function emitNop() { emitWorker(0 /* Nop */); } function emitStatement(node) { if (node) { emitWorker(1 /* Statement */, [node]); } else { emitNop(); } } function emitAssignment(left, right, location) { emitWorker(2 /* Assign */, [left, right], location); } function emitBreak(label, location) { emitWorker(3 /* Break */, [label], location); } function emitBreakWhenTrue(label, condition, location) { emitWorker(4 /* BreakWhenTrue */, [label, condition], location); } function emitBreakWhenFalse(label, condition, location) { emitWorker(5 /* BreakWhenFalse */, [label, condition], location); } function emitYieldStar(expression, location) { emitWorker(7 /* YieldStar */, [expression], location); } function emitYield(expression, location) { emitWorker(6 /* Yield */, [expression], location); } function emitReturn(expression, location) { emitWorker(8 /* Return */, [expression], location); } function emitThrow(expression, location) { emitWorker(9 /* Throw */, [expression], location); } function emitEndfinally() { emitWorker(10 /* Endfinally */); } function emitWorker(code, args, location) { if (operations === void 0) { operations = []; operationArguments = []; operationLocations = []; } if (labelOffsets === void 0) { markLabel(defineLabel()); } const operationIndex = operations.length; operations[operationIndex] = code; operationArguments[operationIndex] = args; operationLocations[operationIndex] = location; } function build2() { blockIndex = 0; labelNumber = 0; labelNumbers = void 0; lastOperationWasAbrupt = false; lastOperationWasCompletion = false; clauses = void 0; statements = void 0; exceptionBlockStack = void 0; currentExceptionBlock = void 0; withBlockStack = void 0; const buildResult = buildStatements(); return emitHelpers().createGeneratorHelper( setEmitFlags( factory2.createFunctionExpression( /*modifiers*/ void 0, /*asteriskToken*/ void 0, /*name*/ void 0, /*typeParameters*/ void 0, [factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, state )], /*type*/ void 0, factory2.createBlock( buildResult, /*multiLine*/ buildResult.length > 0 ) ), 1048576 /* ReuseTempVariableScope */ ) ); } function buildStatements() { if (operations) { for (let operationIndex = 0; operationIndex < operations.length; operationIndex++) { writeOperation(operationIndex); } flushFinalLabel(operations.length); } else { flushFinalLabel(0); } if (clauses) { const labelExpression = factory2.createPropertyAccessExpression(state, "label"); const switchStatement = factory2.createSwitchStatement(labelExpression, factory2.createCaseBlock(clauses)); return [startOnNewLine(switchStatement)]; } if (statements) { return statements; } return []; } function flushLabel() { if (!statements) { return; } appendLabel( /*markLabelEnd*/ !lastOperationWasAbrupt ); lastOperationWasAbrupt = false; lastOperationWasCompletion = false; labelNumber++; } function flushFinalLabel(operationIndex) { if (isFinalLabelReachable(operationIndex)) { tryEnterLabel(operationIndex); withBlockStack = void 0; writeReturn( /*expression*/ void 0, /*operationLocation*/ void 0 ); } if (statements && clauses) { appendLabel( /*markLabelEnd*/ false ); } updateLabelExpressions(); } function isFinalLabelReachable(operationIndex) { if (!lastOperationWasCompletion) { return true; } if (!labelOffsets || !labelExpressions) { return false; } for (let label = 0; label < labelOffsets.length; label++) { if (labelOffsets[label] === operationIndex && labelExpressions[label]) { return true; } } return false; } function appendLabel(markLabelEnd) { if (!clauses) { clauses = []; } if (statements) { if (withBlockStack) { for (let i = withBlockStack.length - 1; i >= 0; i--) { const withBlock = withBlockStack[i]; statements = [factory2.createWithStatement(withBlock.expression, factory2.createBlock(statements))]; } } if (currentExceptionBlock) { const { startLabel, catchLabel, finallyLabel, endLabel } = currentExceptionBlock; statements.unshift( factory2.createExpressionStatement( factory2.createCallExpression( factory2.createPropertyAccessExpression(factory2.createPropertyAccessExpression(state, "trys"), "push"), /*typeArguments*/ void 0, [ factory2.createArrayLiteralExpression([ createLabel(startLabel), createLabel(catchLabel), createLabel(finallyLabel), createLabel(endLabel) ]) ] ) ) ); currentExceptionBlock = void 0; } if (markLabelEnd) { statements.push( factory2.createExpressionStatement( factory2.createAssignment( factory2.createPropertyAccessExpression(state, "label"), factory2.createNumericLiteral(labelNumber + 1) ) ) ); } } clauses.push( factory2.createCaseClause( factory2.createNumericLiteral(labelNumber), statements || [] ) ); statements = void 0; } function tryEnterLabel(operationIndex) { if (!labelOffsets) { return; } for (let label = 0; label < labelOffsets.length; label++) { if (labelOffsets[label] === operationIndex) { flushLabel(); if (labelNumbers === void 0) { labelNumbers = []; } if (labelNumbers[labelNumber] === void 0) { labelNumbers[labelNumber] = [label]; } else { labelNumbers[labelNumber].push(label); } } } } function updateLabelExpressions() { if (labelExpressions !== void 0 && labelNumbers !== void 0) { for (let labelNumber2 = 0; labelNumber2 < labelNumbers.length; labelNumber2++) { const labels = labelNumbers[labelNumber2]; if (labels !== void 0) { for (const label of labels) { const expressions = labelExpressions[label]; if (expressions !== void 0) { for (const expression of expressions) { expression.text = String(labelNumber2); } } } } } } } function tryEnterOrLeaveBlock(operationIndex) { if (blocks) { for (; blockIndex < blockActions.length && blockOffsets[blockIndex] <= operationIndex; blockIndex++) { const block = blocks[blockIndex]; const blockAction = blockActions[blockIndex]; switch (block.kind) { case 0 /* Exception */: if (blockAction === 0 /* Open */) { if (!exceptionBlockStack) { exceptionBlockStack = []; } if (!statements) { statements = []; } exceptionBlockStack.push(currentExceptionBlock); currentExceptionBlock = block; } else if (blockAction === 1 /* Close */) { currentExceptionBlock = exceptionBlockStack.pop(); } break; case 1 /* With */: if (blockAction === 0 /* Open */) { if (!withBlockStack) { withBlockStack = []; } withBlockStack.push(block); } else if (blockAction === 1 /* Close */) { withBlockStack.pop(); } break; } } } } function writeOperation(operationIndex) { tryEnterLabel(operationIndex); tryEnterOrLeaveBlock(operationIndex); if (lastOperationWasAbrupt) { return; } lastOperationWasAbrupt = false; lastOperationWasCompletion = false; const opcode = operations[operationIndex]; if (opcode === 0 /* Nop */) { return; } else if (opcode === 10 /* Endfinally */) { return writeEndfinally(); } const args = operationArguments[operationIndex]; if (opcode === 1 /* Statement */) { return writeStatement(args[0]); } const location = operationLocations[operationIndex]; switch (opcode) { case 2 /* Assign */: return writeAssign(args[0], args[1], location); case 3 /* Break */: return writeBreak(args[0], location); case 4 /* BreakWhenTrue */: return writeBreakWhenTrue(args[0], args[1], location); case 5 /* BreakWhenFalse */: return writeBreakWhenFalse(args[0], args[1], location); case 6 /* Yield */: return writeYield(args[0], location); case 7 /* YieldStar */: return writeYieldStar(args[0], location); case 8 /* Return */: return writeReturn(args[0], location); case 9 /* Throw */: return writeThrow(args[0], location); } } function writeStatement(statement) { if (statement) { if (!statements) { statements = [statement]; } else { statements.push(statement); } } } function writeAssign(left, right, operationLocation) { writeStatement(setTextRange(factory2.createExpressionStatement(factory2.createAssignment(left, right)), operationLocation)); } function writeThrow(expression, operationLocation) { lastOperationWasAbrupt = true; lastOperationWasCompletion = true; writeStatement(setTextRange(factory2.createThrowStatement(expression), operationLocation)); } function writeReturn(expression, operationLocation) { lastOperationWasAbrupt = true; lastOperationWasCompletion = true; writeStatement( setEmitFlags( setTextRange( factory2.createReturnStatement( factory2.createArrayLiteralExpression( expression ? [createInstruction(2 /* Return */), expression] : [createInstruction(2 /* Return */)] ) ), operationLocation ), 768 /* NoTokenSourceMaps */ ) ); } function writeBreak(label, operationLocation) { lastOperationWasAbrupt = true; writeStatement( setEmitFlags( setTextRange( factory2.createReturnStatement( factory2.createArrayLiteralExpression([ createInstruction(3 /* Break */), createLabel(label) ]) ), operationLocation ), 768 /* NoTokenSourceMaps */ ) ); } function writeBreakWhenTrue(label, condition, operationLocation) { writeStatement( setEmitFlags( factory2.createIfStatement( condition, setEmitFlags( setTextRange( factory2.createReturnStatement( factory2.createArrayLiteralExpression([ createInstruction(3 /* Break */), createLabel(label) ]) ), operationLocation ), 768 /* NoTokenSourceMaps */ ) ), 1 /* SingleLine */ ) ); } function writeBreakWhenFalse(label, condition, operationLocation) { writeStatement( setEmitFlags( factory2.createIfStatement( factory2.createLogicalNot(condition), setEmitFlags( setTextRange( factory2.createReturnStatement( factory2.createArrayLiteralExpression([ createInstruction(3 /* Break */), createLabel(label) ]) ), operationLocation ), 768 /* NoTokenSourceMaps */ ) ), 1 /* SingleLine */ ) ); } function writeYield(expression, operationLocation) { lastOperationWasAbrupt = true; writeStatement( setEmitFlags( setTextRange( factory2.createReturnStatement( factory2.createArrayLiteralExpression( expression ? [createInstruction(4 /* Yield */), expression] : [createInstruction(4 /* Yield */)] ) ), operationLocation ), 768 /* NoTokenSourceMaps */ ) ); } function writeYieldStar(expression, operationLocation) { lastOperationWasAbrupt = true; writeStatement( setEmitFlags( setTextRange( factory2.createReturnStatement( factory2.createArrayLiteralExpression([ createInstruction(5 /* YieldStar */), expression ]) ), operationLocation ), 768 /* NoTokenSourceMaps */ ) ); } function writeEndfinally() { lastOperationWasAbrupt = true; writeStatement( factory2.createReturnStatement( factory2.createArrayLiteralExpression([ createInstruction(7 /* Endfinally */) ]) ) ); } } // src/compiler/transformers/module/module.ts function transformModule(context) { function getTransformModuleDelegate(moduleKind2) { switch (moduleKind2) { case 2 /* AMD */: return transformAMDModule; case 3 /* UMD */: return transformUMDModule; default: return transformCommonJSModule; } } const { factory: factory2, getEmitHelperFactory: emitHelpers, startLexicalEnvironment, endLexicalEnvironment, hoistVariableDeclaration } = context; const compilerOptions = context.getCompilerOptions(); const resolver = context.getEmitResolver(); const host = context.getEmitHost(); const languageVersion = getEmitScriptTarget(compilerOptions); const moduleKind = getEmitModuleKind(compilerOptions); const previousOnSubstituteNode = context.onSubstituteNode; const previousOnEmitNode = context.onEmitNode; context.onSubstituteNode = onSubstituteNode; context.onEmitNode = onEmitNode; context.enableSubstitution(214 /* CallExpression */); context.enableSubstitution(216 /* TaggedTemplateExpression */); context.enableSubstitution(80 /* Identifier */); context.enableSubstitution(227 /* BinaryExpression */); context.enableSubstitution(305 /* ShorthandPropertyAssignment */); context.enableEmitNotification(308 /* SourceFile */); const moduleInfoMap = []; let currentSourceFile; let currentModuleInfo; let importsAndRequiresToRewriteOrShim; const noSubstitution = []; let needUMDDynamicImportHelper; return chainBundle(context, transformSourceFile); function transformSourceFile(node) { if (node.isDeclarationFile || !(isEffectiveExternalModule(node, compilerOptions) || node.transformFlags & 8388608 /* ContainsDynamicImport */ || isJsonSourceFile(node) && hasJsonModuleEmitEnabled(compilerOptions) && compilerOptions.outFile)) { return node; } currentSourceFile = node; currentModuleInfo = collectExternalModuleInfo(context, node); moduleInfoMap[getOriginalNodeId(node)] = currentModuleInfo; if (compilerOptions.rewriteRelativeImportExtensions) { forEachDynamicImportOrRequireCall( node, /*includeTypeSpaceImports*/ false, /*requireStringLiteralLikeArgument*/ false, (node2) => { if (!isStringLiteralLike(node2.arguments[0]) || shouldRewriteModuleSpecifier(node2.arguments[0].text, compilerOptions)) { importsAndRequiresToRewriteOrShim = append(importsAndRequiresToRewriteOrShim, node2); } } ); } const transformModule2 = getTransformModuleDelegate(moduleKind); const updated = transformModule2(node); currentSourceFile = void 0; currentModuleInfo = void 0; needUMDDynamicImportHelper = false; return updated; } function shouldEmitUnderscoreUnderscoreESModule() { if (hasJSFileExtension(currentSourceFile.fileName) && currentSourceFile.commonJsModuleIndicator && (!currentSourceFile.externalModuleIndicator || currentSourceFile.externalModuleIndicator === true)) { return false; } if (!currentModuleInfo.exportEquals && isExternalModule(currentSourceFile)) { return true; } return false; } function transformCommonJSModule(node) { startLexicalEnvironment(); const statements = []; const ensureUseStrict = getStrictOptionValue(compilerOptions, "alwaysStrict") || isExternalModule(currentSourceFile); const statementOffset = factory2.copyPrologue(node.statements, statements, ensureUseStrict && !isJsonSourceFile(node), topLevelVisitor); if (shouldEmitUnderscoreUnderscoreESModule()) { append(statements, createUnderscoreUnderscoreESModule()); } if (some(currentModuleInfo.exportedNames)) { const chunkSize = 50; for (let i = 0; i < currentModuleInfo.exportedNames.length; i += chunkSize) { append( statements, factory2.createExpressionStatement( reduceLeft( currentModuleInfo.exportedNames.slice(i, i + chunkSize), (prev, nextId) => nextId.kind === 11 /* StringLiteral */ ? factory2.createAssignment(factory2.createElementAccessExpression(factory2.createIdentifier("exports"), factory2.createStringLiteral(nextId.text)), prev) : factory2.createAssignment(factory2.createPropertyAccessExpression(factory2.createIdentifier("exports"), factory2.createIdentifier(idText(nextId))), prev), factory2.createVoidZero() ) ) ); } } for (const f of currentModuleInfo.exportedFunctions) { appendExportsOfHoistedDeclaration(statements, f); } append(statements, visitNode(currentModuleInfo.externalHelpersImportDeclaration, topLevelVisitor, isStatement)); addRange(statements, visitNodes2(node.statements, topLevelVisitor, isStatement, statementOffset)); addExportEqualsIfNeeded( statements, /*emitAsReturn*/ false ); insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment()); const updated = factory2.updateSourceFile(node, setTextRange(factory2.createNodeArray(statements), node.statements)); addEmitHelpers(updated, context.readEmitHelpers()); return updated; } function transformAMDModule(node) { const define = factory2.createIdentifier("define"); const moduleName = tryGetModuleNameFromFile(factory2, node, host, compilerOptions); const jsonSourceFile = isJsonSourceFile(node) && node; const { aliasedModuleNames, unaliasedModuleNames, importAliasNames } = collectAsynchronousDependencies( node, /*includeNonAmdDependencies*/ true ); const updated = factory2.updateSourceFile( node, setTextRange( factory2.createNodeArray([ factory2.createExpressionStatement( factory2.createCallExpression( define, /*typeArguments*/ void 0, [ // Add the module name (if provided). ...moduleName ? [moduleName] : [], // Add the dependency array argument: // // ["require", "exports", module1", "module2", ...] factory2.createArrayLiteralExpression( jsonSourceFile ? emptyArray : [ factory2.createStringLiteral("require"), factory2.createStringLiteral("exports"), ...aliasedModuleNames, ...unaliasedModuleNames ] ), // Add the module body function argument: // // function (require, exports, module1, module2) ... jsonSourceFile ? jsonSourceFile.statements.length ? jsonSourceFile.statements[0].expression : factory2.createObjectLiteralExpression() : factory2.createFunctionExpression( /*modifiers*/ void 0, /*asteriskToken*/ void 0, /*name*/ void 0, /*typeParameters*/ void 0, [ factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, "require" ), factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, "exports" ), ...importAliasNames ], /*type*/ void 0, transformAsynchronousModuleBody(node) ) ] ) ) ]), /*location*/ node.statements ) ); addEmitHelpers(updated, context.readEmitHelpers()); return updated; } function transformUMDModule(node) { const { aliasedModuleNames, unaliasedModuleNames, importAliasNames } = collectAsynchronousDependencies( node, /*includeNonAmdDependencies*/ false ); const moduleName = tryGetModuleNameFromFile(factory2, node, host, compilerOptions); const umdHeader = factory2.createFunctionExpression( /*modifiers*/ void 0, /*asteriskToken*/ void 0, /*name*/ void 0, /*typeParameters*/ void 0, [factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, "factory" )], /*type*/ void 0, setTextRange( factory2.createBlock( [ factory2.createIfStatement( factory2.createLogicalAnd( factory2.createTypeCheck(factory2.createIdentifier("module"), "object"), factory2.createTypeCheck(factory2.createPropertyAccessExpression(factory2.createIdentifier("module"), "exports"), "object") ), factory2.createBlock([ factory2.createVariableStatement( /*modifiers*/ void 0, [ factory2.createVariableDeclaration( "v", /*exclamationToken*/ void 0, /*type*/ void 0, factory2.createCallExpression( factory2.createIdentifier("factory"), /*typeArguments*/ void 0, [ factory2.createIdentifier("require"), factory2.createIdentifier("exports") ] ) ) ] ), setEmitFlags( factory2.createIfStatement( factory2.createStrictInequality( factory2.createIdentifier("v"), factory2.createIdentifier("undefined") ), factory2.createExpressionStatement( factory2.createAssignment( factory2.createPropertyAccessExpression(factory2.createIdentifier("module"), "exports"), factory2.createIdentifier("v") ) ) ), 1 /* SingleLine */ ) ]), factory2.createIfStatement( factory2.createLogicalAnd( factory2.createTypeCheck(factory2.createIdentifier("define"), "function"), factory2.createPropertyAccessExpression(factory2.createIdentifier("define"), "amd") ), factory2.createBlock([ factory2.createExpressionStatement( factory2.createCallExpression( factory2.createIdentifier("define"), /*typeArguments*/ void 0, [ // Add the module name (if provided). ...moduleName ? [moduleName] : [], factory2.createArrayLiteralExpression([ factory2.createStringLiteral("require"), factory2.createStringLiteral("exports"), ...aliasedModuleNames, ...unaliasedModuleNames ]), factory2.createIdentifier("factory") ] ) ) ]) ) ) ], /*multiLine*/ true ), /*location*/ void 0 ) ); const updated = factory2.updateSourceFile( node, setTextRange( factory2.createNodeArray([ factory2.createExpressionStatement( factory2.createCallExpression( umdHeader, /*typeArguments*/ void 0, [ // Add the module body function argument: // // function (require, exports) ... factory2.createFunctionExpression( /*modifiers*/ void 0, /*asteriskToken*/ void 0, /*name*/ void 0, /*typeParameters*/ void 0, [ factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, "require" ), factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, "exports" ), ...importAliasNames ], /*type*/ void 0, transformAsynchronousModuleBody(node) ) ] ) ) ]), /*location*/ node.statements ) ); addEmitHelpers(updated, context.readEmitHelpers()); return updated; } function collectAsynchronousDependencies(node, includeNonAmdDependencies) { const aliasedModuleNames = []; const unaliasedModuleNames = []; const importAliasNames = []; for (const amdDependency of node.amdDependencies) { if (amdDependency.name) { aliasedModuleNames.push(factory2.createStringLiteral(amdDependency.path)); importAliasNames.push(factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, amdDependency.name )); } else { unaliasedModuleNames.push(factory2.createStringLiteral(amdDependency.path)); } } for (const importNode of currentModuleInfo.externalImports) { const externalModuleName = getExternalModuleNameLiteral(factory2, importNode, currentSourceFile, host, resolver, compilerOptions); const importAliasName = getLocalNameForExternalImport(factory2, importNode, currentSourceFile); if (externalModuleName) { if (includeNonAmdDependencies && importAliasName) { setEmitFlags(importAliasName, 8 /* NoSubstitution */); aliasedModuleNames.push(externalModuleName); importAliasNames.push(factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, importAliasName )); } else { unaliasedModuleNames.push(externalModuleName); } } } return { aliasedModuleNames, unaliasedModuleNames, importAliasNames }; } function getAMDImportExpressionForImport(node) { if (isImportEqualsDeclaration(node) || isExportDeclaration(node) || !getExternalModuleNameLiteral(factory2, node, currentSourceFile, host, resolver, compilerOptions)) { return void 0; } const name = getLocalNameForExternalImport(factory2, node, currentSourceFile); const expr = getHelperExpressionForImport(node, name); if (expr === name) { return void 0; } return factory2.createExpressionStatement(factory2.createAssignment(name, expr)); } function transformAsynchronousModuleBody(node) { startLexicalEnvironment(); const statements = []; const statementOffset = factory2.copyPrologue( node.statements, statements, /*ensureUseStrict*/ true, topLevelVisitor ); if (shouldEmitUnderscoreUnderscoreESModule()) { append(statements, createUnderscoreUnderscoreESModule()); } if (some(currentModuleInfo.exportedNames)) { append( statements, factory2.createExpressionStatement(reduceLeft(currentModuleInfo.exportedNames, (prev, nextId) => nextId.kind === 11 /* StringLiteral */ ? factory2.createAssignment(factory2.createElementAccessExpression(factory2.createIdentifier("exports"), factory2.createStringLiteral(nextId.text)), prev) : factory2.createAssignment(factory2.createPropertyAccessExpression(factory2.createIdentifier("exports"), factory2.createIdentifier(idText(nextId))), prev), factory2.createVoidZero())) ); } for (const f of currentModuleInfo.exportedFunctions) { appendExportsOfHoistedDeclaration(statements, f); } append(statements, visitNode(currentModuleInfo.externalHelpersImportDeclaration, topLevelVisitor, isStatement)); if (moduleKind === 2 /* AMD */) { addRange(statements, mapDefined(currentModuleInfo.externalImports, getAMDImportExpressionForImport)); } addRange(statements, visitNodes2(node.statements, topLevelVisitor, isStatement, statementOffset)); addExportEqualsIfNeeded( statements, /*emitAsReturn*/ true ); insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment()); const body = factory2.createBlock( statements, /*multiLine*/ true ); if (needUMDDynamicImportHelper) { addEmitHelper(body, dynamicImportUMDHelper); } return body; } function addExportEqualsIfNeeded(statements, emitAsReturn) { if (currentModuleInfo.exportEquals) { const expressionResult = visitNode(currentModuleInfo.exportEquals.expression, visitor, isExpression); if (expressionResult) { if (emitAsReturn) { const statement = factory2.createReturnStatement(expressionResult); setTextRange(statement, currentModuleInfo.exportEquals); setEmitFlags(statement, 768 /* NoTokenSourceMaps */ | 3072 /* NoComments */); statements.push(statement); } else { const statement = factory2.createExpressionStatement( factory2.createAssignment( factory2.createPropertyAccessExpression( factory2.createIdentifier("module"), "exports" ), expressionResult ) ); setTextRange(statement, currentModuleInfo.exportEquals); setEmitFlags(statement, 3072 /* NoComments */); statements.push(statement); } } } } function topLevelVisitor(node) { switch (node.kind) { case 273 /* ImportDeclaration */: return visitTopLevelImportDeclaration(node); case 272 /* ImportEqualsDeclaration */: return visitTopLevelImportEqualsDeclaration(node); case 279 /* ExportDeclaration */: return visitTopLevelExportDeclaration(node); case 278 /* ExportAssignment */: return visitTopLevelExportAssignment(node); default: return topLevelNestedVisitor(node); } } function topLevelNestedVisitor(node) { switch (node.kind) { case 244 /* VariableStatement */: return visitVariableStatement(node); case 263 /* FunctionDeclaration */: return visitFunctionDeclaration(node); case 264 /* ClassDeclaration */: return visitClassDeclaration(node); case 249 /* ForStatement */: return visitForStatement( node, /*isTopLevel*/ true ); case 250 /* ForInStatement */: return visitForInStatement(node); case 251 /* ForOfStatement */: return visitForOfStatement(node); case 247 /* DoStatement */: return visitDoStatement(node); case 248 /* WhileStatement */: return visitWhileStatement(node); case 257 /* LabeledStatement */: return visitLabeledStatement(node); case 255 /* WithStatement */: return visitWithStatement(node); case 246 /* IfStatement */: return visitIfStatement(node); case 256 /* SwitchStatement */: return visitSwitchStatement(node); case 270 /* CaseBlock */: return visitCaseBlock(node); case 297 /* CaseClause */: return visitCaseClause(node); case 298 /* DefaultClause */: return visitDefaultClause(node); case 259 /* TryStatement */: return visitTryStatement(node); case 300 /* CatchClause */: return visitCatchClause(node); case 242 /* Block */: return visitBlock(node); default: return visitor(node); } } function visitorWorker(node, valueIsDiscarded) { if (!(node.transformFlags & (8388608 /* ContainsDynamicImport */ | 4096 /* ContainsDestructuringAssignment */ | 268435456 /* ContainsUpdateExpressionForIdentifier */)) && !(importsAndRequiresToRewriteOrShim == null ? void 0 : importsAndRequiresToRewriteOrShim.length)) { return node; } switch (node.kind) { case 249 /* ForStatement */: return visitForStatement( node, /*isTopLevel*/ false ); case 245 /* ExpressionStatement */: return visitExpressionStatement(node); case 218 /* ParenthesizedExpression */: return visitParenthesizedExpression(node, valueIsDiscarded); case 356 /* PartiallyEmittedExpression */: return visitPartiallyEmittedExpression(node, valueIsDiscarded); case 214 /* CallExpression */: const needsRewrite = node === firstOrUndefined(importsAndRequiresToRewriteOrShim); if (needsRewrite) { importsAndRequiresToRewriteOrShim.shift(); } if (isImportCall(node) && host.shouldTransformImportCall(currentSourceFile)) { return visitImportCallExpression(node, needsRewrite); } else if (needsRewrite) { return shimOrRewriteImportOrRequireCall(node); } break; case 227 /* BinaryExpression */: if (isDestructuringAssignment(node)) { return visitDestructuringAssignment(node, valueIsDiscarded); } break; case 225 /* PrefixUnaryExpression */: case 226 /* PostfixUnaryExpression */: return visitPreOrPostfixUnaryExpression(node, valueIsDiscarded); } return visitEachChild(node, visitor, context); } function visitor(node) { return visitorWorker( node, /*valueIsDiscarded*/ false ); } function discardedValueVisitor(node) { return visitorWorker( node, /*valueIsDiscarded*/ true ); } function destructuringNeedsFlattening(node) { if (isObjectLiteralExpression(node)) { for (const elem of node.properties) { switch (elem.kind) { case 304 /* PropertyAssignment */: if (destructuringNeedsFlattening(elem.initializer)) { return true; } break; case 305 /* ShorthandPropertyAssignment */: if (destructuringNeedsFlattening(elem.name)) { return true; } break; case 306 /* SpreadAssignment */: if (destructuringNeedsFlattening(elem.expression)) { return true; } break; case 175 /* MethodDeclaration */: case 178 /* GetAccessor */: case 179 /* SetAccessor */: return false; default: Debug.assertNever(elem, "Unhandled object member kind"); } } } else if (isArrayLiteralExpression(node)) { for (const elem of node.elements) { if (isSpreadElement(elem)) { if (destructuringNeedsFlattening(elem.expression)) { return true; } } else if (destructuringNeedsFlattening(elem)) { return true; } } } else if (isIdentifier(node)) { return length(getExports(node)) > (isExportName(node) ? 1 : 0); } return false; } function visitDestructuringAssignment(node, valueIsDiscarded) { if (destructuringNeedsFlattening(node.left)) { return flattenDestructuringAssignment(node, visitor, context, 0 /* All */, !valueIsDiscarded, createAllExportExpressions); } return visitEachChild(node, visitor, context); } function visitForStatement(node, isTopLevel) { if (isTopLevel && node.initializer && isVariableDeclarationList(node.initializer) && !(node.initializer.flags & 7 /* BlockScoped */)) { const exportStatements = appendExportsOfVariableDeclarationList( /*statements*/ void 0, node.initializer, /*isForInOrOfInitializer*/ false ); if (exportStatements) { const statements = []; const varDeclList = visitNode(node.initializer, discardedValueVisitor, isVariableDeclarationList); const varStatement = factory2.createVariableStatement( /*modifiers*/ void 0, varDeclList ); statements.push(varStatement); addRange(statements, exportStatements); const condition = visitNode(node.condition, visitor, isExpression); const incrementor = visitNode(node.incrementor, discardedValueVisitor, isExpression); const body = visitIterationBody(node.statement, isTopLevel ? topLevelNestedVisitor : visitor, context); statements.push(factory2.updateForStatement( node, /*initializer*/ void 0, condition, incrementor, body )); return statements; } } return factory2.updateForStatement( node, visitNode(node.initializer, discardedValueVisitor, isForInitializer), visitNode(node.condition, visitor, isExpression), visitNode(node.incrementor, discardedValueVisitor, isExpression), visitIterationBody(node.statement, isTopLevel ? topLevelNestedVisitor : visitor, context) ); } function visitForInStatement(node) { if (isVariableDeclarationList(node.initializer) && !(node.initializer.flags & 7 /* BlockScoped */)) { const exportStatements = appendExportsOfVariableDeclarationList( /*statements*/ void 0, node.initializer, /*isForInOrOfInitializer*/ true ); if (some(exportStatements)) { const initializer = visitNode(node.initializer, discardedValueVisitor, isForInitializer); const expression = visitNode(node.expression, visitor, isExpression); const body = visitIterationBody(node.statement, topLevelNestedVisitor, context); const mergedBody = isBlock(body) ? factory2.updateBlock(body, [...exportStatements, ...body.statements]) : factory2.createBlock( [...exportStatements, body], /*multiLine*/ true ); return factory2.updateForInStatement(node, initializer, expression, mergedBody); } } return factory2.updateForInStatement( node, visitNode(node.initializer, discardedValueVisitor, isForInitializer), visitNode(node.expression, visitor, isExpression), visitIterationBody(node.statement, topLevelNestedVisitor, context) ); } function visitForOfStatement(node) { if (isVariableDeclarationList(node.initializer) && !(node.initializer.flags & 7 /* BlockScoped */)) { const exportStatements = appendExportsOfVariableDeclarationList( /*statements*/ void 0, node.initializer, /*isForInOrOfInitializer*/ true ); const initializer = visitNode(node.initializer, discardedValueVisitor, isForInitializer); const expression = visitNode(node.expression, visitor, isExpression); let body = visitIterationBody(node.statement, topLevelNestedVisitor, context); if (some(exportStatements)) { body = isBlock(body) ? factory2.updateBlock(body, [...exportStatements, ...body.statements]) : factory2.createBlock( [...exportStatements, body], /*multiLine*/ true ); } return factory2.updateForOfStatement(node, node.awaitModifier, initializer, expression, body); } return factory2.updateForOfStatement( node, node.awaitModifier, visitNode(node.initializer, discardedValueVisitor, isForInitializer), visitNode(node.expression, visitor, isExpression), visitIterationBody(node.statement, topLevelNestedVisitor, context) ); } function visitDoStatement(node) { return factory2.updateDoStatement( node, visitIterationBody(node.statement, topLevelNestedVisitor, context), visitNode(node.expression, visitor, isExpression) ); } function visitWhileStatement(node) { return factory2.updateWhileStatement( node, visitNode(node.expression, visitor, isExpression), visitIterationBody(node.statement, topLevelNestedVisitor, context) ); } function visitLabeledStatement(node) { return factory2.updateLabeledStatement( node, node.label, visitNode(node.statement, topLevelNestedVisitor, isStatement, factory2.liftToBlock) ?? setTextRange(factory2.createEmptyStatement(), node.statement) ); } function visitWithStatement(node) { return factory2.updateWithStatement( node, visitNode(node.expression, visitor, isExpression), Debug.checkDefined(visitNode(node.statement, topLevelNestedVisitor, isStatement, factory2.liftToBlock)) ); } function visitIfStatement(node) { return factory2.updateIfStatement( node, visitNode(node.expression, visitor, isExpression), visitNode(node.thenStatement, topLevelNestedVisitor, isStatement, factory2.liftToBlock) ?? factory2.createBlock([]), visitNode(node.elseStatement, topLevelNestedVisitor, isStatement, factory2.liftToBlock) ); } function visitSwitchStatement(node) { return factory2.updateSwitchStatement( node, visitNode(node.expression, visitor, isExpression), Debug.checkDefined(visitNode(node.caseBlock, topLevelNestedVisitor, isCaseBlock)) ); } function visitCaseBlock(node) { return factory2.updateCaseBlock( node, visitNodes2(node.clauses, topLevelNestedVisitor, isCaseOrDefaultClause) ); } function visitCaseClause(node) { return factory2.updateCaseClause( node, visitNode(node.expression, visitor, isExpression), visitNodes2(node.statements, topLevelNestedVisitor, isStatement) ); } function visitDefaultClause(node) { return visitEachChild(node, topLevelNestedVisitor, context); } function visitTryStatement(node) { return visitEachChild(node, topLevelNestedVisitor, context); } function visitCatchClause(node) { return factory2.updateCatchClause( node, node.variableDeclaration, Debug.checkDefined(visitNode(node.block, topLevelNestedVisitor, isBlock)) ); } function visitBlock(node) { node = visitEachChild(node, topLevelNestedVisitor, context); return node; } function visitExpressionStatement(node) { return factory2.updateExpressionStatement( node, visitNode(node.expression, discardedValueVisitor, isExpression) ); } function visitParenthesizedExpression(node, valueIsDiscarded) { return factory2.updateParenthesizedExpression(node, visitNode(node.expression, valueIsDiscarded ? discardedValueVisitor : visitor, isExpression)); } function visitPartiallyEmittedExpression(node, valueIsDiscarded) { return factory2.updatePartiallyEmittedExpression(node, visitNode(node.expression, valueIsDiscarded ? discardedValueVisitor : visitor, isExpression)); } function visitPreOrPostfixUnaryExpression(node, valueIsDiscarded) { if ((node.operator === 46 /* PlusPlusToken */ || node.operator === 47 /* MinusMinusToken */) && isIdentifier(node.operand) && !isGeneratedIdentifier(node.operand) && !isLocalName(node.operand) && !isDeclarationNameOfEnumOrNamespace(node.operand)) { const exportedNames = getExports(node.operand); if (exportedNames) { let temp; let expression = visitNode(node.operand, visitor, isExpression); if (isPrefixUnaryExpression(node)) { expression = factory2.updatePrefixUnaryExpression(node, expression); } else { expression = factory2.updatePostfixUnaryExpression(node, expression); if (!valueIsDiscarded) { temp = factory2.createTempVariable(hoistVariableDeclaration); expression = factory2.createAssignment(temp, expression); setTextRange(expression, node); } expression = factory2.createComma(expression, factory2.cloneNode(node.operand)); setTextRange(expression, node); } for (const exportName of exportedNames) { noSubstitution[getNodeId(expression)] = true; expression = createExportExpression(exportName, expression); setTextRange(expression, node); } if (temp) { noSubstitution[getNodeId(expression)] = true; expression = factory2.createComma(expression, temp); setTextRange(expression, node); } return expression; } } return visitEachChild(node, visitor, context); } function shimOrRewriteImportOrRequireCall(node) { return factory2.updateCallExpression( node, node.expression, /*typeArguments*/ void 0, visitNodes2(node.arguments, (arg) => { if (arg === node.arguments[0]) { return isStringLiteralLike(arg) ? rewriteModuleSpecifier(arg, compilerOptions) : emitHelpers().createRewriteRelativeImportExtensionsHelper(arg); } return visitor(arg); }, isExpression) ); } function visitImportCallExpression(node, rewriteOrShim) { if (moduleKind === 0 /* None */ && languageVersion >= 7 /* ES2020 */) { return visitEachChild(node, visitor, context); } const externalModuleName = getExternalModuleNameLiteral(factory2, node, currentSourceFile, host, resolver, compilerOptions); const firstArgument = visitNode(firstOrUndefined(node.arguments), visitor, isExpression); const argument = externalModuleName && (!firstArgument || !isStringLiteral(firstArgument) || firstArgument.text !== externalModuleName.text) ? externalModuleName : firstArgument && rewriteOrShim ? isStringLiteral(firstArgument) ? rewriteModuleSpecifier(firstArgument, compilerOptions) : emitHelpers().createRewriteRelativeImportExtensionsHelper(firstArgument) : firstArgument; const containsLexicalThis = !!(node.transformFlags & 16384 /* ContainsLexicalThis */); switch (compilerOptions.module) { case 2 /* AMD */: return createImportCallExpressionAMD(argument, containsLexicalThis); case 3 /* UMD */: return createImportCallExpressionUMD(argument ?? factory2.createVoidZero(), containsLexicalThis); case 1 /* CommonJS */: default: return createImportCallExpressionCommonJS(argument); } } function createImportCallExpressionUMD(arg, containsLexicalThis) { needUMDDynamicImportHelper = true; if (isSimpleCopiableExpression(arg)) { const argClone = isGeneratedIdentifier(arg) ? arg : isStringLiteral(arg) ? factory2.createStringLiteralFromNode(arg) : setEmitFlags(setTextRange(factory2.cloneNode(arg), arg), 3072 /* NoComments */); return factory2.createConditionalExpression( /*condition*/ factory2.createIdentifier("__syncRequire"), /*questionToken*/ void 0, /*whenTrue*/ createImportCallExpressionCommonJS(arg), /*colonToken*/ void 0, /*whenFalse*/ createImportCallExpressionAMD(argClone, containsLexicalThis) ); } else { const temp = factory2.createTempVariable(hoistVariableDeclaration); return factory2.createComma( factory2.createAssignment(temp, arg), factory2.createConditionalExpression( /*condition*/ factory2.createIdentifier("__syncRequire"), /*questionToken*/ void 0, /*whenTrue*/ createImportCallExpressionCommonJS( temp, /*isInlineable*/ true ), /*colonToken*/ void 0, /*whenFalse*/ createImportCallExpressionAMD(temp, containsLexicalThis) ) ); } } function createImportCallExpressionAMD(arg, containsLexicalThis) { const resolve = factory2.createUniqueName("resolve"); const reject = factory2.createUniqueName("reject"); const parameters = [ factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, /*name*/ resolve ), factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, /*name*/ reject ) ]; const body = factory2.createBlock([ factory2.createExpressionStatement( factory2.createCallExpression( factory2.createIdentifier("require"), /*typeArguments*/ void 0, [factory2.createArrayLiteralExpression([arg || factory2.createOmittedExpression()]), resolve, reject] ) ) ]); let func; if (languageVersion >= 2 /* ES2015 */) { func = factory2.createArrowFunction( /*modifiers*/ void 0, /*typeParameters*/ void 0, parameters, /*type*/ void 0, /*equalsGreaterThanToken*/ void 0, body ); } else { func = factory2.createFunctionExpression( /*modifiers*/ void 0, /*asteriskToken*/ void 0, /*name*/ void 0, /*typeParameters*/ void 0, parameters, /*type*/ void 0, body ); if (containsLexicalThis) { setEmitFlags(func, 16 /* CapturesThis */); } } const promise = factory2.createNewExpression( factory2.createIdentifier("Promise"), /*typeArguments*/ void 0, [func] ); if (getESModuleInterop(compilerOptions)) { return factory2.createCallExpression( factory2.createPropertyAccessExpression(promise, factory2.createIdentifier("then")), /*typeArguments*/ void 0, [emitHelpers().createImportStarCallbackHelper()] ); } return promise; } function createImportCallExpressionCommonJS(arg, isInlineable) { const needSyncEval = arg && !isSimpleInlineableExpression(arg) && !isInlineable; const promiseResolveCall = factory2.createCallExpression( factory2.createPropertyAccessExpression(factory2.createIdentifier("Promise"), "resolve"), /*typeArguments*/ void 0, /*argumentsArray*/ needSyncEval ? languageVersion >= 2 /* ES2015 */ ? [ factory2.createTemplateExpression(factory2.createTemplateHead(""), [ factory2.createTemplateSpan(arg, factory2.createTemplateTail("")) ]) ] : [ factory2.createCallExpression( factory2.createPropertyAccessExpression(factory2.createStringLiteral(""), "concat"), /*typeArguments*/ void 0, [arg] ) ] : [] ); let requireCall = factory2.createCallExpression( factory2.createIdentifier("require"), /*typeArguments*/ void 0, needSyncEval ? [factory2.createIdentifier("s")] : arg ? [arg] : [] ); if (getESModuleInterop(compilerOptions)) { requireCall = emitHelpers().createImportStarHelper(requireCall); } const parameters = needSyncEval ? [ factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, /*name*/ "s" ) ] : []; let func; if (languageVersion >= 2 /* ES2015 */) { func = factory2.createArrowFunction( /*modifiers*/ void 0, /*typeParameters*/ void 0, /*parameters*/ parameters, /*type*/ void 0, /*equalsGreaterThanToken*/ void 0, requireCall ); } else { func = factory2.createFunctionExpression( /*modifiers*/ void 0, /*asteriskToken*/ void 0, /*name*/ void 0, /*typeParameters*/ void 0, /*parameters*/ parameters, /*type*/ void 0, factory2.createBlock([factory2.createReturnStatement(requireCall)]) ); } const downleveledImport = factory2.createCallExpression( factory2.createPropertyAccessExpression(promiseResolveCall, "then"), /*typeArguments*/ void 0, [func] ); return downleveledImport; } function getHelperExpressionForExport(node, innerExpr) { if (!getESModuleInterop(compilerOptions) || getInternalEmitFlags(node) & 2 /* NeverApplyImportHelper */) { return innerExpr; } if (getExportNeedsImportStarHelper(node)) { return emitHelpers().createImportStarHelper(innerExpr); } return innerExpr; } function getHelperExpressionForImport(node, innerExpr) { if (!getESModuleInterop(compilerOptions) || getInternalEmitFlags(node) & 2 /* NeverApplyImportHelper */) { return innerExpr; } if (getImportNeedsImportStarHelper(node)) { return emitHelpers().createImportStarHelper(innerExpr); } if (getImportNeedsImportDefaultHelper(node)) { return emitHelpers().createImportDefaultHelper(innerExpr); } return innerExpr; } function visitTopLevelImportDeclaration(node) { let statements; const namespaceDeclaration = getNamespaceDeclarationNode(node); if (moduleKind !== 2 /* AMD */) { if (!node.importClause) { return setOriginalNode(setTextRange(factory2.createExpressionStatement(createRequireCall(node)), node), node); } else { const variables = []; if (namespaceDeclaration && !isDefaultImport(node)) { variables.push( factory2.createVariableDeclaration( factory2.cloneNode(namespaceDeclaration.name), /*exclamationToken*/ void 0, /*type*/ void 0, getHelperExpressionForImport(node, createRequireCall(node)) ) ); } else { variables.push( factory2.createVariableDeclaration( factory2.getGeneratedNameForNode(node), /*exclamationToken*/ void 0, /*type*/ void 0, getHelperExpressionForImport(node, createRequireCall(node)) ) ); if (namespaceDeclaration && isDefaultImport(node)) { variables.push( factory2.createVariableDeclaration( factory2.cloneNode(namespaceDeclaration.name), /*exclamationToken*/ void 0, /*type*/ void 0, factory2.getGeneratedNameForNode(node) ) ); } } statements = append( statements, setOriginalNode( setTextRange( factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList( variables, languageVersion >= 2 /* ES2015 */ ? 2 /* Const */ : 0 /* None */ ) ), /*location*/ node ), /*original*/ node ) ); } } else if (namespaceDeclaration && isDefaultImport(node)) { statements = append( statements, factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList( [ setOriginalNode( setTextRange( factory2.createVariableDeclaration( factory2.cloneNode(namespaceDeclaration.name), /*exclamationToken*/ void 0, /*type*/ void 0, factory2.getGeneratedNameForNode(node) ), /*location*/ node ), /*original*/ node ) ], languageVersion >= 2 /* ES2015 */ ? 2 /* Const */ : 0 /* None */ ) ) ); } statements = appendExportsOfImportDeclaration(statements, node); return singleOrMany(statements); } function createRequireCall(importNode) { const moduleName = getExternalModuleNameLiteral(factory2, importNode, currentSourceFile, host, resolver, compilerOptions); const args = []; if (moduleName) { args.push(rewriteModuleSpecifier(moduleName, compilerOptions)); } return factory2.createCallExpression( factory2.createIdentifier("require"), /*typeArguments*/ void 0, args ); } function visitTopLevelImportEqualsDeclaration(node) { Debug.assert(isExternalModuleImportEqualsDeclaration(node), "import= for internal module references should be handled in an earlier transformer."); let statements; if (moduleKind !== 2 /* AMD */) { if (hasSyntacticModifier(node, 32 /* Export */)) { statements = append( statements, setOriginalNode( setTextRange( factory2.createExpressionStatement( createExportExpression( node.name, createRequireCall(node) ) ), node ), node ) ); } else { statements = append( statements, setOriginalNode( setTextRange( factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList( [ factory2.createVariableDeclaration( factory2.cloneNode(node.name), /*exclamationToken*/ void 0, /*type*/ void 0, createRequireCall(node) ) ], /*flags*/ languageVersion >= 2 /* ES2015 */ ? 2 /* Const */ : 0 /* None */ ) ), node ), node ) ); } } else { if (hasSyntacticModifier(node, 32 /* Export */)) { statements = append( statements, setOriginalNode( setTextRange( factory2.createExpressionStatement( createExportExpression(factory2.getExportName(node), factory2.getLocalName(node)) ), node ), node ) ); } } statements = appendExportsOfImportEqualsDeclaration(statements, node); return singleOrMany(statements); } function visitTopLevelExportDeclaration(node) { if (!node.moduleSpecifier) { return void 0; } const generatedName = factory2.getGeneratedNameForNode(node); if (node.exportClause && isNamedExports(node.exportClause)) { const statements = []; if (moduleKind !== 2 /* AMD */) { statements.push( setOriginalNode( setTextRange( factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList([ factory2.createVariableDeclaration( generatedName, /*exclamationToken*/ void 0, /*type*/ void 0, createRequireCall(node) ) ]) ), /*location*/ node ), /* original */ node ) ); } for (const specifier of node.exportClause.elements) { const specifierName = specifier.propertyName || specifier.name; const exportNeedsImportDefault = !!getESModuleInterop(compilerOptions) && !(getInternalEmitFlags(node) & 2 /* NeverApplyImportHelper */) && moduleExportNameIsDefault(specifierName); const target = exportNeedsImportDefault ? emitHelpers().createImportDefaultHelper(generatedName) : generatedName; const exportedValue = specifierName.kind === 11 /* StringLiteral */ ? factory2.createElementAccessExpression(target, specifierName) : factory2.createPropertyAccessExpression(target, specifierName); statements.push( setOriginalNode( setTextRange( factory2.createExpressionStatement( createExportExpression( specifier.name.kind === 11 /* StringLiteral */ ? factory2.cloneNode(specifier.name) : factory2.getExportName(specifier), exportedValue, /*location*/ void 0, /*liveBinding*/ true ) ), specifier ), specifier ) ); } return singleOrMany(statements); } else if (node.exportClause) { const statements = []; statements.push( setOriginalNode( setTextRange( factory2.createExpressionStatement( createExportExpression( factory2.cloneNode(node.exportClause.name), getHelperExpressionForExport( node, moduleKind !== 2 /* AMD */ ? createRequireCall(node) : isExportNamespaceAsDefaultDeclaration(node) ? generatedName : node.exportClause.name.kind === 11 /* StringLiteral */ ? generatedName : factory2.createIdentifier(idText(node.exportClause.name)) ) ) ), node ), node ) ); return singleOrMany(statements); } else { return setOriginalNode( setTextRange( factory2.createExpressionStatement( emitHelpers().createExportStarHelper(moduleKind !== 2 /* AMD */ ? createRequireCall(node) : generatedName) ), node ), node ); } } function visitTopLevelExportAssignment(node) { if (node.isExportEquals) { return void 0; } return createExportStatement( factory2.createIdentifier("default"), visitNode(node.expression, visitor, isExpression), /*location*/ node, /*allowComments*/ true ); } function visitFunctionDeclaration(node) { let statements; if (hasSyntacticModifier(node, 32 /* Export */)) { statements = append( statements, setOriginalNode( setTextRange( factory2.createFunctionDeclaration( visitNodes2(node.modifiers, modifierVisitor, isModifier), node.asteriskToken, factory2.getDeclarationName( node, /*allowComments*/ true, /*allowSourceMaps*/ true ), /*typeParameters*/ void 0, visitNodes2(node.parameters, visitor, isParameter), /*type*/ void 0, visitEachChild(node.body, visitor, context) ), /*location*/ node ), /*original*/ node ) ); } else { statements = append(statements, visitEachChild(node, visitor, context)); } return singleOrMany(statements); } function visitClassDeclaration(node) { let statements; if (hasSyntacticModifier(node, 32 /* Export */)) { statements = append( statements, setOriginalNode( setTextRange( factory2.createClassDeclaration( visitNodes2(node.modifiers, modifierVisitor, isModifierLike), factory2.getDeclarationName( node, /*allowComments*/ true, /*allowSourceMaps*/ true ), /*typeParameters*/ void 0, visitNodes2(node.heritageClauses, visitor, isHeritageClause), visitNodes2(node.members, visitor, isClassElement) ), node ), node ) ); } else { statements = append(statements, visitEachChild(node, visitor, context)); } statements = appendExportsOfHoistedDeclaration(statements, node); return singleOrMany(statements); } function visitVariableStatement(node) { let statements; let variables; let expressions; if (hasSyntacticModifier(node, 32 /* Export */)) { let modifiers; let removeCommentsOnExpressions = false; for (const variable of node.declarationList.declarations) { if (isIdentifier(variable.name) && isLocalName(variable.name)) { if (!modifiers) { modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier); } if (variable.initializer) { const updatedVariable = factory2.updateVariableDeclaration( variable, variable.name, /*exclamationToken*/ void 0, /*type*/ void 0, createExportExpression( variable.name, visitNode(variable.initializer, visitor, isExpression) ) ); variables = append(variables, updatedVariable); } else { variables = append(variables, variable); } } else if (variable.initializer) { if (!isBindingPattern(variable.name) && (isArrowFunction(variable.initializer) || isFunctionExpression(variable.initializer) || isClassExpression(variable.initializer))) { const expression = factory2.createAssignment( setTextRange( factory2.createPropertyAccessExpression( factory2.createIdentifier("exports"), variable.name ), /*location*/ variable.name ), factory2.createIdentifier(getTextOfIdentifierOrLiteral(variable.name)) ); const updatedVariable = factory2.createVariableDeclaration( variable.name, variable.exclamationToken, variable.type, visitNode(variable.initializer, visitor, isExpression) ); variables = append(variables, updatedVariable); expressions = append(expressions, expression); removeCommentsOnExpressions = true; } else { expressions = append(expressions, transformInitializedVariable(variable)); } } } if (variables) { statements = append(statements, factory2.updateVariableStatement(node, modifiers, factory2.updateVariableDeclarationList(node.declarationList, variables))); } if (expressions) { const statement = setOriginalNode(setTextRange(factory2.createExpressionStatement(factory2.inlineExpressions(expressions)), node), node); if (removeCommentsOnExpressions) { removeAllComments(statement); } statements = append(statements, statement); } } else { statements = append(statements, visitEachChild(node, visitor, context)); } statements = appendExportsOfVariableStatement(statements, node); return singleOrMany(statements); } function createAllExportExpressions(name, value, location) { const exportedNames = getExports(name); if (exportedNames) { let expression = isExportName(name) ? value : factory2.createAssignment(name, value); for (const exportName of exportedNames) { setEmitFlags(expression, 8 /* NoSubstitution */); expression = createExportExpression( exportName, expression, /*location*/ location ); } return expression; } return factory2.createAssignment(name, value); } function transformInitializedVariable(node) { if (isBindingPattern(node.name)) { return flattenDestructuringAssignment( visitNode(node, visitor, isInitializedVariable), visitor, context, 0 /* All */, /*needsValue*/ false, createAllExportExpressions ); } else { return factory2.createAssignment( setTextRange( factory2.createPropertyAccessExpression( factory2.createIdentifier("exports"), node.name ), /*location*/ node.name ), node.initializer ? visitNode(node.initializer, visitor, isExpression) : factory2.createVoidZero() ); } } function appendExportsOfImportDeclaration(statements, decl) { if (currentModuleInfo.exportEquals) { return statements; } const importClause = decl.importClause; if (!importClause) { return statements; } const seen = new IdentifierNameMap(); if (importClause.name) { statements = appendExportsOfDeclaration(statements, seen, importClause); } const namedBindings = importClause.namedBindings; if (namedBindings) { switch (namedBindings.kind) { case 275 /* NamespaceImport */: statements = appendExportsOfDeclaration(statements, seen, namedBindings); break; case 276 /* NamedImports */: for (const importBinding of namedBindings.elements) { statements = appendExportsOfDeclaration( statements, seen, importBinding, /*liveBinding*/ true ); } break; } } return statements; } function appendExportsOfImportEqualsDeclaration(statements, decl) { if (currentModuleInfo.exportEquals) { return statements; } return appendExportsOfDeclaration(statements, new IdentifierNameMap(), decl); } function appendExportsOfVariableStatement(statements, node) { return appendExportsOfVariableDeclarationList( statements, node.declarationList, /*isForInOrOfInitializer*/ false ); } function appendExportsOfVariableDeclarationList(statements, node, isForInOrOfInitializer) { if (currentModuleInfo.exportEquals) { return statements; } for (const decl of node.declarations) { statements = appendExportsOfBindingElement(statements, decl, isForInOrOfInitializer); } return statements; } function appendExportsOfBindingElement(statements, decl, isForInOrOfInitializer) { if (currentModuleInfo.exportEquals) { return statements; } if (isBindingPattern(decl.name)) { for (const element of decl.name.elements) { if (!isOmittedExpression(element)) { statements = appendExportsOfBindingElement(statements, element, isForInOrOfInitializer); } } } else if (!isGeneratedIdentifier(decl.name) && (!isVariableDeclaration(decl) || decl.initializer || isForInOrOfInitializer)) { statements = appendExportsOfDeclaration(statements, new IdentifierNameMap(), decl); } return statements; } function appendExportsOfHoistedDeclaration(statements, decl) { if (currentModuleInfo.exportEquals) { return statements; } const seen = new IdentifierNameMap(); if (hasSyntacticModifier(decl, 32 /* Export */)) { const exportName = hasSyntacticModifier(decl, 2048 /* Default */) ? factory2.createIdentifier("default") : factory2.getDeclarationName(decl); statements = appendExportStatement( statements, seen, exportName, factory2.getLocalName(decl), /*location*/ decl ); } if (decl.name) { statements = appendExportsOfDeclaration(statements, seen, decl); } return statements; } function appendExportsOfDeclaration(statements, seen, decl, liveBinding) { const name = factory2.getDeclarationName(decl); const exportSpecifiers = currentModuleInfo.exportSpecifiers.get(name); if (exportSpecifiers) { for (const exportSpecifier of exportSpecifiers) { statements = appendExportStatement( statements, seen, exportSpecifier.name, name, /*location*/ exportSpecifier.name, /*allowComments*/ void 0, liveBinding ); } } return statements; } function appendExportStatement(statements, seen, exportName, expression, location, allowComments, liveBinding) { if (exportName.kind !== 11 /* StringLiteral */) { if (seen.has(exportName)) { return statements; } seen.set(exportName, true); } statements = append(statements, createExportStatement(exportName, expression, location, allowComments, liveBinding)); return statements; } function createUnderscoreUnderscoreESModule() { const statement = factory2.createExpressionStatement( factory2.createCallExpression( factory2.createPropertyAccessExpression(factory2.createIdentifier("Object"), "defineProperty"), /*typeArguments*/ void 0, [ factory2.createIdentifier("exports"), factory2.createStringLiteral("__esModule"), factory2.createObjectLiteralExpression([ factory2.createPropertyAssignment("value", factory2.createTrue()) ]) ] ) ); setEmitFlags(statement, 2097152 /* CustomPrologue */); return statement; } function createExportStatement(name, value, location, allowComments, liveBinding) { const statement = setTextRange(factory2.createExpressionStatement(createExportExpression( name, value, /*location*/ void 0, liveBinding )), location); startOnNewLine(statement); if (!allowComments) { setEmitFlags(statement, 3072 /* NoComments */); } return statement; } function createExportExpression(name, value, location, liveBinding) { return setTextRange( liveBinding ? factory2.createCallExpression( factory2.createPropertyAccessExpression( factory2.createIdentifier("Object"), "defineProperty" ), /*typeArguments*/ void 0, [ factory2.createIdentifier("exports"), factory2.createStringLiteralFromNode(name), factory2.createObjectLiteralExpression([ factory2.createPropertyAssignment("enumerable", factory2.createTrue()), factory2.createPropertyAssignment( "get", factory2.createFunctionExpression( /*modifiers*/ void 0, /*asteriskToken*/ void 0, /*name*/ void 0, /*typeParameters*/ void 0, /*parameters*/ [], /*type*/ void 0, factory2.createBlock([factory2.createReturnStatement(value)]) ) ) ]) ] ) : factory2.createAssignment( name.kind === 11 /* StringLiteral */ ? factory2.createElementAccessExpression( factory2.createIdentifier("exports"), factory2.cloneNode(name) ) : factory2.createPropertyAccessExpression( factory2.createIdentifier("exports"), factory2.cloneNode(name) ), value ), location ); } function modifierVisitor(node) { switch (node.kind) { case 95 /* ExportKeyword */: case 90 /* DefaultKeyword */: return void 0; } return node; } function onEmitNode(hint, node, emitCallback) { if (node.kind === 308 /* SourceFile */) { currentSourceFile = node; currentModuleInfo = moduleInfoMap[getOriginalNodeId(currentSourceFile)]; previousOnEmitNode(hint, node, emitCallback); currentSourceFile = void 0; currentModuleInfo = void 0; } else { previousOnEmitNode(hint, node, emitCallback); } } function onSubstituteNode(hint, node) { node = previousOnSubstituteNode(hint, node); if (node.id && noSubstitution[node.id]) { return node; } if (hint === 1 /* Expression */) { return substituteExpression(node); } else if (isShorthandPropertyAssignment(node)) { return substituteShorthandPropertyAssignment(node); } return node; } function substituteShorthandPropertyAssignment(node) { const name = node.name; const exportedOrImportedName = substituteExpressionIdentifier(name); if (exportedOrImportedName !== name) { if (node.objectAssignmentInitializer) { const initializer = factory2.createAssignment(exportedOrImportedName, node.objectAssignmentInitializer); return setTextRange(factory2.createPropertyAssignment(name, initializer), node); } return setTextRange(factory2.createPropertyAssignment(name, exportedOrImportedName), node); } return node; } function substituteExpression(node) { switch (node.kind) { case 80 /* Identifier */: return substituteExpressionIdentifier(node); case 214 /* CallExpression */: return substituteCallExpression(node); case 216 /* TaggedTemplateExpression */: return substituteTaggedTemplateExpression(node); case 227 /* BinaryExpression */: return substituteBinaryExpression(node); } return node; } function substituteCallExpression(node) { if (isIdentifier(node.expression)) { const expression = substituteExpressionIdentifier(node.expression); noSubstitution[getNodeId(expression)] = true; if (!isIdentifier(expression) && !(getEmitFlags(node.expression) & 8192 /* HelperName */)) { return addInternalEmitFlags( factory2.updateCallExpression( node, expression, /*typeArguments*/ void 0, node.arguments ), 16 /* IndirectCall */ ); } } return node; } function substituteTaggedTemplateExpression(node) { if (isIdentifier(node.tag)) { const tag = substituteExpressionIdentifier(node.tag); noSubstitution[getNodeId(tag)] = true; if (!isIdentifier(tag) && !(getEmitFlags(node.tag) & 8192 /* HelperName */)) { return addInternalEmitFlags( factory2.updateTaggedTemplateExpression( node, tag, /*typeArguments*/ void 0, node.template ), 16 /* IndirectCall */ ); } } return node; } function substituteExpressionIdentifier(node) { var _a, _b; if (getEmitFlags(node) & 8192 /* HelperName */) { const externalHelpersModuleName = getExternalHelpersModuleName(currentSourceFile); if (externalHelpersModuleName) { return factory2.createPropertyAccessExpression(externalHelpersModuleName, node); } return node; } else if (!(isGeneratedIdentifier(node) && !(node.emitNode.autoGenerate.flags & 64 /* AllowNameSubstitution */)) && !isLocalName(node)) { const exportContainer = resolver.getReferencedExportContainer(node, isExportName(node)); if (exportContainer && exportContainer.kind === 308 /* SourceFile */) { return setTextRange( factory2.createPropertyAccessExpression( factory2.createIdentifier("exports"), factory2.cloneNode(node) ), /*location*/ node ); } const importDeclaration = resolver.getReferencedImportDeclaration(node); if (importDeclaration) { if (isImportClause(importDeclaration)) { return setTextRange( factory2.createPropertyAccessExpression( factory2.getGeneratedNameForNode(importDeclaration.parent), factory2.createIdentifier("default") ), /*location*/ node ); } else if (isImportSpecifier(importDeclaration)) { const name = importDeclaration.propertyName || importDeclaration.name; const target = factory2.getGeneratedNameForNode(((_b = (_a = importDeclaration.parent) == null ? void 0 : _a.parent) == null ? void 0 : _b.parent) || importDeclaration); return setTextRange( name.kind === 11 /* StringLiteral */ ? factory2.createElementAccessExpression(target, factory2.cloneNode(name)) : factory2.createPropertyAccessExpression(target, factory2.cloneNode(name)), /*location*/ node ); } } } return node; } function substituteBinaryExpression(node) { if (isAssignmentOperator(node.operatorToken.kind) && isIdentifier(node.left) && (!isGeneratedIdentifier(node.left) || isFileLevelReservedGeneratedIdentifier(node.left)) && !isLocalName(node.left)) { const exportedNames = getExports(node.left); if (exportedNames) { let expression = node; for (const exportName of exportedNames) { noSubstitution[getNodeId(expression)] = true; expression = createExportExpression( exportName, expression, /*location*/ node ); } return expression; } } return node; } function getExports(name) { if (!isGeneratedIdentifier(name)) { const importDeclaration = resolver.getReferencedImportDeclaration(name); if (importDeclaration) { return currentModuleInfo == null ? void 0 : currentModuleInfo.exportedBindings[getOriginalNodeId(importDeclaration)]; } const bindingsSet = /* @__PURE__ */ new Set(); const declarations = resolver.getReferencedValueDeclarations(name); if (declarations) { for (const declaration of declarations) { const bindings = currentModuleInfo == null ? void 0 : currentModuleInfo.exportedBindings[getOriginalNodeId(declaration)]; if (bindings) { for (const binding of bindings) { bindingsSet.add(binding); } } } if (bindingsSet.size) { return arrayFrom(bindingsSet); } } } else if (isFileLevelReservedGeneratedIdentifier(name)) { const exportSpecifiers = currentModuleInfo == null ? void 0 : currentModuleInfo.exportSpecifiers.get(name); if (exportSpecifiers) { const exportedNames = []; for (const exportSpecifier of exportSpecifiers) { exportedNames.push(exportSpecifier.name); } return exportedNames; } } } } var dynamicImportUMDHelper = { name: "typescript:dynamicimport-sync-require", scoped: true, text: ` var __syncRequire = typeof module === "object" && typeof module.exports === "object";` }; // src/compiler/transformers/module/system.ts function transformSystemModule(context) { const { factory: factory2, startLexicalEnvironment, endLexicalEnvironment, hoistVariableDeclaration } = context; const compilerOptions = context.getCompilerOptions(); const resolver = context.getEmitResolver(); const host = context.getEmitHost(); const previousOnSubstituteNode = context.onSubstituteNode; const previousOnEmitNode = context.onEmitNode; context.onSubstituteNode = onSubstituteNode; context.onEmitNode = onEmitNode; context.enableSubstitution(80 /* Identifier */); context.enableSubstitution(305 /* ShorthandPropertyAssignment */); context.enableSubstitution(227 /* BinaryExpression */); context.enableSubstitution(237 /* MetaProperty */); context.enableEmitNotification(308 /* SourceFile */); const moduleInfoMap = []; const exportFunctionsMap = []; const noSubstitutionMap = []; const contextObjectMap = []; let currentSourceFile; let moduleInfo; let exportFunction; let contextObject; let hoistedStatements; let enclosingBlockScopedContainer; let noSubstitution; return chainBundle(context, transformSourceFile); function transformSourceFile(node) { if (node.isDeclarationFile || !(isEffectiveExternalModule(node, compilerOptions) || node.transformFlags & 8388608 /* ContainsDynamicImport */)) { return node; } const id = getOriginalNodeId(node); currentSourceFile = node; enclosingBlockScopedContainer = node; moduleInfo = moduleInfoMap[id] = collectExternalModuleInfo(context, node); exportFunction = factory2.createUniqueName("exports"); exportFunctionsMap[id] = exportFunction; contextObject = contextObjectMap[id] = factory2.createUniqueName("context"); const dependencyGroups = collectDependencyGroups(moduleInfo.externalImports); const moduleBodyBlock = createSystemModuleBody(node, dependencyGroups); const moduleBodyFunction = factory2.createFunctionExpression( /*modifiers*/ void 0, /*asteriskToken*/ void 0, /*name*/ void 0, /*typeParameters*/ void 0, [ factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, exportFunction ), factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, contextObject ) ], /*type*/ void 0, moduleBodyBlock ); const moduleName = tryGetModuleNameFromFile(factory2, node, host, compilerOptions); const dependencies = factory2.createArrayLiteralExpression(map(dependencyGroups, (dependencyGroup) => dependencyGroup.name)); const updated = setEmitFlags( factory2.updateSourceFile( node, setTextRange( factory2.createNodeArray([ factory2.createExpressionStatement( factory2.createCallExpression( factory2.createPropertyAccessExpression(factory2.createIdentifier("System"), "register"), /*typeArguments*/ void 0, moduleName ? [moduleName, dependencies, moduleBodyFunction] : [dependencies, moduleBodyFunction] ) ) ]), node.statements ) ), 2048 /* NoTrailingComments */ ); if (!compilerOptions.outFile) { moveEmitHelpers(updated, moduleBodyBlock, (helper) => !helper.scoped); } if (noSubstitution) { noSubstitutionMap[id] = noSubstitution; noSubstitution = void 0; } currentSourceFile = void 0; moduleInfo = void 0; exportFunction = void 0; contextObject = void 0; hoistedStatements = void 0; enclosingBlockScopedContainer = void 0; return updated; } function collectDependencyGroups(externalImports) { const groupIndices = /* @__PURE__ */ new Map(); const dependencyGroups = []; for (const externalImport of externalImports) { const externalModuleName = getExternalModuleNameLiteral(factory2, externalImport, currentSourceFile, host, resolver, compilerOptions); if (externalModuleName) { const text = externalModuleName.text; const groupIndex = groupIndices.get(text); if (groupIndex !== void 0) { dependencyGroups[groupIndex].externalImports.push(externalImport); } else { groupIndices.set(text, dependencyGroups.length); dependencyGroups.push({ name: externalModuleName, externalImports: [externalImport] }); } } } return dependencyGroups; } function createSystemModuleBody(node, dependencyGroups) { const statements = []; startLexicalEnvironment(); const ensureUseStrict = getStrictOptionValue(compilerOptions, "alwaysStrict") || isExternalModule(currentSourceFile); const statementOffset = factory2.copyPrologue(node.statements, statements, ensureUseStrict, topLevelVisitor); statements.push( factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList([ factory2.createVariableDeclaration( "__moduleName", /*exclamationToken*/ void 0, /*type*/ void 0, factory2.createLogicalAnd( contextObject, factory2.createPropertyAccessExpression(contextObject, "id") ) ) ]) ) ); visitNode(moduleInfo.externalHelpersImportDeclaration, topLevelVisitor, isStatement); const executeStatements = visitNodes2(node.statements, topLevelVisitor, isStatement, statementOffset); addRange(statements, hoistedStatements); insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment()); const exportStarFunction = addExportStarIfNeeded(statements); const modifiers = node.transformFlags & 2097152 /* ContainsAwait */ ? factory2.createModifiersFromModifierFlags(1024 /* Async */) : void 0; const moduleObject = factory2.createObjectLiteralExpression( [ factory2.createPropertyAssignment("setters", createSettersArray(exportStarFunction, dependencyGroups)), factory2.createPropertyAssignment( "execute", factory2.createFunctionExpression( modifiers, /*asteriskToken*/ void 0, /*name*/ void 0, /*typeParameters*/ void 0, /*parameters*/ [], /*type*/ void 0, factory2.createBlock( executeStatements, /*multiLine*/ true ) ) ) ], /*multiLine*/ true ); statements.push(factory2.createReturnStatement(moduleObject)); return factory2.createBlock( statements, /*multiLine*/ true ); } function addExportStarIfNeeded(statements) { if (!moduleInfo.hasExportStarsToExportValues) { return; } if (!some(moduleInfo.exportedNames) && moduleInfo.exportedFunctions.size === 0 && moduleInfo.exportSpecifiers.size === 0) { let hasExportDeclarationWithExportClause = false; for (const externalImport of moduleInfo.externalImports) { if (externalImport.kind === 279 /* ExportDeclaration */ && externalImport.exportClause) { hasExportDeclarationWithExportClause = true; break; } } if (!hasExportDeclarationWithExportClause) { const exportStarFunction2 = createExportStarFunction( /*localNames*/ void 0 ); statements.push(exportStarFunction2); return exportStarFunction2.name; } } const exportedNames = []; if (moduleInfo.exportedNames) { for (const exportedLocalName of moduleInfo.exportedNames) { if (moduleExportNameIsDefault(exportedLocalName)) { continue; } exportedNames.push( factory2.createPropertyAssignment( factory2.createStringLiteralFromNode(exportedLocalName), factory2.createTrue() ) ); } } for (const f of moduleInfo.exportedFunctions) { if (hasSyntacticModifier(f, 2048 /* Default */)) { continue; } Debug.assert(!!f.name); exportedNames.push( factory2.createPropertyAssignment( factory2.createStringLiteralFromNode(f.name), factory2.createTrue() ) ); } const exportedNamesStorageRef = factory2.createUniqueName("exportedNames"); statements.push( factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList([ factory2.createVariableDeclaration( exportedNamesStorageRef, /*exclamationToken*/ void 0, /*type*/ void 0, factory2.createObjectLiteralExpression( exportedNames, /*multiLine*/ true ) ) ]) ) ); const exportStarFunction = createExportStarFunction(exportedNamesStorageRef); statements.push(exportStarFunction); return exportStarFunction.name; } function createExportStarFunction(localNames) { const exportStarFunction = factory2.createUniqueName("exportStar"); const m = factory2.createIdentifier("m"); const n = factory2.createIdentifier("n"); const exports2 = factory2.createIdentifier("exports"); let condition = factory2.createStrictInequality(n, factory2.createStringLiteral("default")); if (localNames) { condition = factory2.createLogicalAnd( condition, factory2.createLogicalNot( factory2.createCallExpression( factory2.createPropertyAccessExpression(localNames, "hasOwnProperty"), /*typeArguments*/ void 0, [n] ) ) ); } return factory2.createFunctionDeclaration( /*modifiers*/ void 0, /*asteriskToken*/ void 0, exportStarFunction, /*typeParameters*/ void 0, [factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, m )], /*type*/ void 0, factory2.createBlock( [ factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList([ factory2.createVariableDeclaration( exports2, /*exclamationToken*/ void 0, /*type*/ void 0, factory2.createObjectLiteralExpression([]) ) ]) ), factory2.createForInStatement( factory2.createVariableDeclarationList([ factory2.createVariableDeclaration(n) ]), m, factory2.createBlock([ setEmitFlags( factory2.createIfStatement( condition, factory2.createExpressionStatement( factory2.createAssignment( factory2.createElementAccessExpression(exports2, n), factory2.createElementAccessExpression(m, n) ) ) ), 1 /* SingleLine */ ) ]) ), factory2.createExpressionStatement( factory2.createCallExpression( exportFunction, /*typeArguments*/ void 0, [exports2] ) ) ], /*multiLine*/ true ) ); } function createSettersArray(exportStarFunction, dependencyGroups) { const setters = []; for (const group2 of dependencyGroups) { const localName = forEach(group2.externalImports, (i) => getLocalNameForExternalImport(factory2, i, currentSourceFile)); const parameterName = localName ? factory2.getGeneratedNameForNode(localName) : factory2.createUniqueName(""); const statements = []; for (const entry of group2.externalImports) { const importVariableName = getLocalNameForExternalImport(factory2, entry, currentSourceFile); switch (entry.kind) { case 273 /* ImportDeclaration */: if (!entry.importClause) { break; } // falls through case 272 /* ImportEqualsDeclaration */: Debug.assert(importVariableName !== void 0); statements.push( factory2.createExpressionStatement( factory2.createAssignment(importVariableName, parameterName) ) ); if (hasSyntacticModifier(entry, 32 /* Export */)) { statements.push( factory2.createExpressionStatement( factory2.createCallExpression( exportFunction, /*typeArguments*/ void 0, [ factory2.createStringLiteral(idText(importVariableName)), parameterName ] ) ) ); } break; case 279 /* ExportDeclaration */: Debug.assert(importVariableName !== void 0); if (entry.exportClause) { if (isNamedExports(entry.exportClause)) { const properties = []; for (const e of entry.exportClause.elements) { properties.push( factory2.createPropertyAssignment( factory2.createStringLiteral(moduleExportNameTextUnescaped(e.name)), factory2.createElementAccessExpression( parameterName, factory2.createStringLiteral(moduleExportNameTextUnescaped(e.propertyName || e.name)) ) ) ); } statements.push( factory2.createExpressionStatement( factory2.createCallExpression( exportFunction, /*typeArguments*/ void 0, [factory2.createObjectLiteralExpression( properties, /*multiLine*/ true )] ) ) ); } else { statements.push( factory2.createExpressionStatement( factory2.createCallExpression( exportFunction, /*typeArguments*/ void 0, [ factory2.createStringLiteral(moduleExportNameTextUnescaped(entry.exportClause.name)), parameterName ] ) ) ); } } else { statements.push( factory2.createExpressionStatement( factory2.createCallExpression( exportStarFunction, /*typeArguments*/ void 0, [parameterName] ) ) ); } break; } } setters.push( factory2.createFunctionExpression( /*modifiers*/ void 0, /*asteriskToken*/ void 0, /*name*/ void 0, /*typeParameters*/ void 0, [factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, parameterName )], /*type*/ void 0, factory2.createBlock( statements, /*multiLine*/ true ) ) ); } return factory2.createArrayLiteralExpression( setters, /*multiLine*/ true ); } function topLevelVisitor(node) { switch (node.kind) { case 273 /* ImportDeclaration */: return visitImportDeclaration(node); case 272 /* ImportEqualsDeclaration */: return visitImportEqualsDeclaration(node); case 279 /* ExportDeclaration */: return visitExportDeclaration(node); case 278 /* ExportAssignment */: return visitExportAssignment(node); default: return topLevelNestedVisitor(node); } } function visitImportDeclaration(node) { let statements; if (node.importClause) { hoistVariableDeclaration(getLocalNameForExternalImport(factory2, node, currentSourceFile)); } return singleOrMany(appendExportsOfImportDeclaration(statements, node)); } function visitExportDeclaration(node) { Debug.assertIsDefined(node); return void 0; } function visitImportEqualsDeclaration(node) { Debug.assert(isExternalModuleImportEqualsDeclaration(node), "import= for internal module references should be handled in an earlier transformer."); let statements; hoistVariableDeclaration(getLocalNameForExternalImport(factory2, node, currentSourceFile)); return singleOrMany(appendExportsOfImportEqualsDeclaration(statements, node)); } function visitExportAssignment(node) { if (node.isExportEquals) { return void 0; } const expression = visitNode(node.expression, visitor, isExpression); return createExportStatement( factory2.createIdentifier("default"), expression, /*allowComments*/ true ); } function visitFunctionDeclaration(node) { if (hasSyntacticModifier(node, 32 /* Export */)) { hoistedStatements = append( hoistedStatements, factory2.updateFunctionDeclaration( node, visitNodes2(node.modifiers, modifierVisitor, isModifierLike), node.asteriskToken, factory2.getDeclarationName( node, /*allowComments*/ true, /*allowSourceMaps*/ true ), /*typeParameters*/ void 0, visitNodes2(node.parameters, visitor, isParameter), /*type*/ void 0, visitNode(node.body, visitor, isBlock) ) ); } else { hoistedStatements = append(hoistedStatements, visitEachChild(node, visitor, context)); } hoistedStatements = appendExportsOfHoistedDeclaration(hoistedStatements, node); return void 0; } function visitClassDeclaration(node) { let statements; const name = factory2.getLocalName(node); hoistVariableDeclaration(name); statements = append( statements, setTextRange( factory2.createExpressionStatement( factory2.createAssignment( name, setTextRange( factory2.createClassExpression( visitNodes2(node.modifiers, modifierVisitor, isModifierLike), node.name, /*typeParameters*/ void 0, visitNodes2(node.heritageClauses, visitor, isHeritageClause), visitNodes2(node.members, visitor, isClassElement) ), node ) ) ), node ) ); statements = appendExportsOfHoistedDeclaration(statements, node); return singleOrMany(statements); } function visitVariableStatement(node) { if (!shouldHoistVariableDeclarationList(node.declarationList)) { return visitNode(node, visitor, isStatement); } let statements; if (isVarUsing(node.declarationList) || isVarAwaitUsing(node.declarationList)) { const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifierLike); const declarations = []; for (const variable of node.declarationList.declarations) { declarations.push(factory2.updateVariableDeclaration( variable, factory2.getGeneratedNameForNode(variable.name), /*exclamationToken*/ void 0, /*type*/ void 0, transformInitializedVariable( variable, /*isExportedDeclaration*/ false ) )); } const declarationList = factory2.updateVariableDeclarationList( node.declarationList, declarations ); statements = append(statements, factory2.updateVariableStatement(node, modifiers, declarationList)); } else { let expressions; const isExportedDeclaration = hasSyntacticModifier(node, 32 /* Export */); for (const variable of node.declarationList.declarations) { if (variable.initializer) { expressions = append(expressions, transformInitializedVariable(variable, isExportedDeclaration)); } else { hoistBindingElement(variable); } } if (expressions) { statements = append(statements, setTextRange(factory2.createExpressionStatement(factory2.inlineExpressions(expressions)), node)); } } statements = appendExportsOfVariableStatement( statements, node, /*exportSelf*/ false ); return singleOrMany(statements); } function hoistBindingElement(node) { if (isBindingPattern(node.name)) { for (const element of node.name.elements) { if (!isOmittedExpression(element)) { hoistBindingElement(element); } } } else { hoistVariableDeclaration(factory2.cloneNode(node.name)); } } function shouldHoistVariableDeclarationList(node) { return (getEmitFlags(node) & 4194304 /* NoHoisting */) === 0 && (enclosingBlockScopedContainer.kind === 308 /* SourceFile */ || (getOriginalNode(node).flags & 7 /* BlockScoped */) === 0); } function transformInitializedVariable(node, isExportedDeclaration) { const createAssignment = isExportedDeclaration ? createExportedVariableAssignment : createNonExportedVariableAssignment; return isBindingPattern(node.name) ? flattenDestructuringAssignment( node, visitor, context, 0 /* All */, /*needsValue*/ false, createAssignment ) : node.initializer ? createAssignment(node.name, visitNode(node.initializer, visitor, isExpression)) : node.name; } function createExportedVariableAssignment(name, value, location) { return createVariableAssignment( name, value, location, /*isExportedDeclaration*/ true ); } function createNonExportedVariableAssignment(name, value, location) { return createVariableAssignment( name, value, location, /*isExportedDeclaration*/ false ); } function createVariableAssignment(name, value, location, isExportedDeclaration) { hoistVariableDeclaration(factory2.cloneNode(name)); return isExportedDeclaration ? createExportExpression(name, preventSubstitution(setTextRange(factory2.createAssignment(name, value), location))) : preventSubstitution(setTextRange(factory2.createAssignment(name, value), location)); } function appendExportsOfImportDeclaration(statements, decl) { if (moduleInfo.exportEquals) { return statements; } const importClause = decl.importClause; if (!importClause) { return statements; } if (importClause.name) { statements = appendExportsOfDeclaration(statements, importClause); } const namedBindings = importClause.namedBindings; if (namedBindings) { switch (namedBindings.kind) { case 275 /* NamespaceImport */: statements = appendExportsOfDeclaration(statements, namedBindings); break; case 276 /* NamedImports */: for (const importBinding of namedBindings.elements) { statements = appendExportsOfDeclaration(statements, importBinding); } break; } } return statements; } function appendExportsOfImportEqualsDeclaration(statements, decl) { if (moduleInfo.exportEquals) { return statements; } return appendExportsOfDeclaration(statements, decl); } function appendExportsOfVariableStatement(statements, node, exportSelf) { if (moduleInfo.exportEquals) { return statements; } for (const decl of node.declarationList.declarations) { if (decl.initializer || exportSelf) { statements = appendExportsOfBindingElement(statements, decl, exportSelf); } } return statements; } function appendExportsOfBindingElement(statements, decl, exportSelf) { if (moduleInfo.exportEquals) { return statements; } if (isBindingPattern(decl.name)) { for (const element of decl.name.elements) { if (!isOmittedExpression(element)) { statements = appendExportsOfBindingElement(statements, element, exportSelf); } } } else if (!isGeneratedIdentifier(decl.name)) { let excludeName; if (exportSelf) { statements = appendExportStatement(statements, decl.name, factory2.getLocalName(decl)); excludeName = idText(decl.name); } statements = appendExportsOfDeclaration(statements, decl, excludeName); } return statements; } function appendExportsOfHoistedDeclaration(statements, decl) { if (moduleInfo.exportEquals) { return statements; } let excludeName; if (hasSyntacticModifier(decl, 32 /* Export */)) { const exportName = hasSyntacticModifier(decl, 2048 /* Default */) ? factory2.createStringLiteral("default") : decl.name; statements = appendExportStatement(statements, exportName, factory2.getLocalName(decl)); excludeName = getTextOfIdentifierOrLiteral(exportName); } if (decl.name) { statements = appendExportsOfDeclaration(statements, decl, excludeName); } return statements; } function appendExportsOfDeclaration(statements, decl, excludeName) { if (moduleInfo.exportEquals) { return statements; } const name = factory2.getDeclarationName(decl); const exportSpecifiers = moduleInfo.exportSpecifiers.get(name); if (exportSpecifiers) { for (const exportSpecifier of exportSpecifiers) { if (moduleExportNameTextUnescaped(exportSpecifier.name) !== excludeName) { statements = appendExportStatement(statements, exportSpecifier.name, name); } } } return statements; } function appendExportStatement(statements, exportName, expression, allowComments) { statements = append(statements, createExportStatement(exportName, expression, allowComments)); return statements; } function createExportStatement(name, value, allowComments) { const statement = factory2.createExpressionStatement(createExportExpression(name, value)); startOnNewLine(statement); if (!allowComments) { setEmitFlags(statement, 3072 /* NoComments */); } return statement; } function createExportExpression(name, value) { const exportName = isIdentifier(name) ? factory2.createStringLiteralFromNode(name) : name; setEmitFlags(value, getEmitFlags(value) | 3072 /* NoComments */); return setCommentRange(factory2.createCallExpression( exportFunction, /*typeArguments*/ void 0, [exportName, value] ), value); } function topLevelNestedVisitor(node) { switch (node.kind) { case 244 /* VariableStatement */: return visitVariableStatement(node); case 263 /* FunctionDeclaration */: return visitFunctionDeclaration(node); case 264 /* ClassDeclaration */: return visitClassDeclaration(node); case 249 /* ForStatement */: return visitForStatement( node, /*isTopLevel*/ true ); case 250 /* ForInStatement */: return visitForInStatement(node); case 251 /* ForOfStatement */: return visitForOfStatement(node); case 247 /* DoStatement */: return visitDoStatement(node); case 248 /* WhileStatement */: return visitWhileStatement(node); case 257 /* LabeledStatement */: return visitLabeledStatement(node); case 255 /* WithStatement */: return visitWithStatement(node); case 246 /* IfStatement */: return visitIfStatement(node); case 256 /* SwitchStatement */: return visitSwitchStatement(node); case 270 /* CaseBlock */: return visitCaseBlock(node); case 297 /* CaseClause */: return visitCaseClause(node); case 298 /* DefaultClause */: return visitDefaultClause(node); case 259 /* TryStatement */: return visitTryStatement(node); case 300 /* CatchClause */: return visitCatchClause(node); case 242 /* Block */: return visitBlock(node); default: return visitor(node); } } function visitForStatement(node, isTopLevel) { const savedEnclosingBlockScopedContainer = enclosingBlockScopedContainer; enclosingBlockScopedContainer = node; node = factory2.updateForStatement( node, visitNode(node.initializer, isTopLevel ? visitForInitializer : discardedValueVisitor, isForInitializer), visitNode(node.condition, visitor, isExpression), visitNode(node.incrementor, discardedValueVisitor, isExpression), visitIterationBody(node.statement, isTopLevel ? topLevelNestedVisitor : visitor, context) ); enclosingBlockScopedContainer = savedEnclosingBlockScopedContainer; return node; } function visitForInStatement(node) { const savedEnclosingBlockScopedContainer = enclosingBlockScopedContainer; enclosingBlockScopedContainer = node; node = factory2.updateForInStatement( node, visitForInitializer(node.initializer), visitNode(node.expression, visitor, isExpression), visitIterationBody(node.statement, topLevelNestedVisitor, context) ); enclosingBlockScopedContainer = savedEnclosingBlockScopedContainer; return node; } function visitForOfStatement(node) { const savedEnclosingBlockScopedContainer = enclosingBlockScopedContainer; enclosingBlockScopedContainer = node; node = factory2.updateForOfStatement( node, node.awaitModifier, visitForInitializer(node.initializer), visitNode(node.expression, visitor, isExpression), visitIterationBody(node.statement, topLevelNestedVisitor, context) ); enclosingBlockScopedContainer = savedEnclosingBlockScopedContainer; return node; } function shouldHoistForInitializer(node) { return isVariableDeclarationList(node) && shouldHoistVariableDeclarationList(node); } function visitForInitializer(node) { if (shouldHoistForInitializer(node)) { let expressions; for (const variable of node.declarations) { expressions = append(expressions, transformInitializedVariable( variable, /*isExportedDeclaration*/ false )); if (!variable.initializer) { hoistBindingElement(variable); } } return expressions ? factory2.inlineExpressions(expressions) : factory2.createOmittedExpression(); } else { return visitNode(node, discardedValueVisitor, isForInitializer); } } function visitDoStatement(node) { return factory2.updateDoStatement( node, visitIterationBody(node.statement, topLevelNestedVisitor, context), visitNode(node.expression, visitor, isExpression) ); } function visitWhileStatement(node) { return factory2.updateWhileStatement( node, visitNode(node.expression, visitor, isExpression), visitIterationBody(node.statement, topLevelNestedVisitor, context) ); } function visitLabeledStatement(node) { return factory2.updateLabeledStatement( node, node.label, visitNode(node.statement, topLevelNestedVisitor, isStatement, factory2.liftToBlock) ?? factory2.createExpressionStatement(factory2.createIdentifier("")) ); } function visitWithStatement(node) { return factory2.updateWithStatement( node, visitNode(node.expression, visitor, isExpression), Debug.checkDefined(visitNode(node.statement, topLevelNestedVisitor, isStatement, factory2.liftToBlock)) ); } function visitIfStatement(node) { return factory2.updateIfStatement( node, visitNode(node.expression, visitor, isExpression), visitNode(node.thenStatement, topLevelNestedVisitor, isStatement, factory2.liftToBlock) ?? factory2.createBlock([]), visitNode(node.elseStatement, topLevelNestedVisitor, isStatement, factory2.liftToBlock) ); } function visitSwitchStatement(node) { return factory2.updateSwitchStatement( node, visitNode(node.expression, visitor, isExpression), Debug.checkDefined(visitNode(node.caseBlock, topLevelNestedVisitor, isCaseBlock)) ); } function visitCaseBlock(node) { const savedEnclosingBlockScopedContainer = enclosingBlockScopedContainer; enclosingBlockScopedContainer = node; node = factory2.updateCaseBlock( node, visitNodes2(node.clauses, topLevelNestedVisitor, isCaseOrDefaultClause) ); enclosingBlockScopedContainer = savedEnclosingBlockScopedContainer; return node; } function visitCaseClause(node) { return factory2.updateCaseClause( node, visitNode(node.expression, visitor, isExpression), visitNodes2(node.statements, topLevelNestedVisitor, isStatement) ); } function visitDefaultClause(node) { return visitEachChild(node, topLevelNestedVisitor, context); } function visitTryStatement(node) { return visitEachChild(node, topLevelNestedVisitor, context); } function visitCatchClause(node) { const savedEnclosingBlockScopedContainer = enclosingBlockScopedContainer; enclosingBlockScopedContainer = node; node = factory2.updateCatchClause( node, node.variableDeclaration, Debug.checkDefined(visitNode(node.block, topLevelNestedVisitor, isBlock)) ); enclosingBlockScopedContainer = savedEnclosingBlockScopedContainer; return node; } function visitBlock(node) { const savedEnclosingBlockScopedContainer = enclosingBlockScopedContainer; enclosingBlockScopedContainer = node; node = visitEachChild(node, topLevelNestedVisitor, context); enclosingBlockScopedContainer = savedEnclosingBlockScopedContainer; return node; } function visitorWorker(node, valueIsDiscarded) { if (!(node.transformFlags & (4096 /* ContainsDestructuringAssignment */ | 8388608 /* ContainsDynamicImport */ | 268435456 /* ContainsUpdateExpressionForIdentifier */))) { return node; } switch (node.kind) { case 249 /* ForStatement */: return visitForStatement( node, /*isTopLevel*/ false ); case 245 /* ExpressionStatement */: return visitExpressionStatement(node); case 218 /* ParenthesizedExpression */: return visitParenthesizedExpression(node, valueIsDiscarded); case 356 /* PartiallyEmittedExpression */: return visitPartiallyEmittedExpression(node, valueIsDiscarded); case 227 /* BinaryExpression */: if (isDestructuringAssignment(node)) { return visitDestructuringAssignment(node, valueIsDiscarded); } break; case 214 /* CallExpression */: if (isImportCall(node)) { return visitImportCallExpression(node); } break; case 225 /* PrefixUnaryExpression */: case 226 /* PostfixUnaryExpression */: return visitPrefixOrPostfixUnaryExpression(node, valueIsDiscarded); } return visitEachChild(node, visitor, context); } function visitor(node) { return visitorWorker( node, /*valueIsDiscarded*/ false ); } function discardedValueVisitor(node) { return visitorWorker( node, /*valueIsDiscarded*/ true ); } function visitExpressionStatement(node) { return factory2.updateExpressionStatement(node, visitNode(node.expression, discardedValueVisitor, isExpression)); } function visitParenthesizedExpression(node, valueIsDiscarded) { return factory2.updateParenthesizedExpression(node, visitNode(node.expression, valueIsDiscarded ? discardedValueVisitor : visitor, isExpression)); } function visitPartiallyEmittedExpression(node, valueIsDiscarded) { return factory2.updatePartiallyEmittedExpression(node, visitNode(node.expression, valueIsDiscarded ? discardedValueVisitor : visitor, isExpression)); } function visitImportCallExpression(node) { const externalModuleName = getExternalModuleNameLiteral(factory2, node, currentSourceFile, host, resolver, compilerOptions); const firstArgument = visitNode(firstOrUndefined(node.arguments), visitor, isExpression); const argument = externalModuleName && (!firstArgument || !isStringLiteral(firstArgument) || firstArgument.text !== externalModuleName.text) ? externalModuleName : firstArgument; return factory2.createCallExpression( factory2.createPropertyAccessExpression( contextObject, factory2.createIdentifier("import") ), /*typeArguments*/ void 0, argument ? [argument] : [] ); } function visitDestructuringAssignment(node, valueIsDiscarded) { if (hasExportedReferenceInDestructuringTarget(node.left)) { return flattenDestructuringAssignment( node, visitor, context, 0 /* All */, !valueIsDiscarded ); } return visitEachChild(node, visitor, context); } function hasExportedReferenceInDestructuringTarget(node) { if (isAssignmentExpression( node, /*excludeCompoundAssignment*/ true )) { return hasExportedReferenceInDestructuringTarget(node.left); } else if (isSpreadElement(node)) { return hasExportedReferenceInDestructuringTarget(node.expression); } else if (isObjectLiteralExpression(node)) { return some(node.properties, hasExportedReferenceInDestructuringTarget); } else if (isArrayLiteralExpression(node)) { return some(node.elements, hasExportedReferenceInDestructuringTarget); } else if (isShorthandPropertyAssignment(node)) { return hasExportedReferenceInDestructuringTarget(node.name); } else if (isPropertyAssignment(node)) { return hasExportedReferenceInDestructuringTarget(node.initializer); } else if (isIdentifier(node)) { const container = resolver.getReferencedExportContainer(node); return container !== void 0 && container.kind === 308 /* SourceFile */; } else { return false; } } function visitPrefixOrPostfixUnaryExpression(node, valueIsDiscarded) { if ((node.operator === 46 /* PlusPlusToken */ || node.operator === 47 /* MinusMinusToken */) && isIdentifier(node.operand) && !isGeneratedIdentifier(node.operand) && !isLocalName(node.operand) && !isDeclarationNameOfEnumOrNamespace(node.operand)) { const exportedNames = getExports(node.operand); if (exportedNames) { let temp; let expression = visitNode(node.operand, visitor, isExpression); if (isPrefixUnaryExpression(node)) { expression = factory2.updatePrefixUnaryExpression(node, expression); } else { expression = factory2.updatePostfixUnaryExpression(node, expression); if (!valueIsDiscarded) { temp = factory2.createTempVariable(hoistVariableDeclaration); expression = factory2.createAssignment(temp, expression); setTextRange(expression, node); } expression = factory2.createComma(expression, factory2.cloneNode(node.operand)); setTextRange(expression, node); } for (const exportName of exportedNames) { expression = createExportExpression(exportName, preventSubstitution(expression)); } if (temp) { expression = factory2.createComma(expression, temp); setTextRange(expression, node); } return expression; } } return visitEachChild(node, visitor, context); } function modifierVisitor(node) { switch (node.kind) { case 95 /* ExportKeyword */: case 90 /* DefaultKeyword */: return void 0; } return node; } function onEmitNode(hint, node, emitCallback) { if (node.kind === 308 /* SourceFile */) { const id = getOriginalNodeId(node); currentSourceFile = node; moduleInfo = moduleInfoMap[id]; exportFunction = exportFunctionsMap[id]; noSubstitution = noSubstitutionMap[id]; contextObject = contextObjectMap[id]; if (noSubstitution) { delete noSubstitutionMap[id]; } previousOnEmitNode(hint, node, emitCallback); currentSourceFile = void 0; moduleInfo = void 0; exportFunction = void 0; contextObject = void 0; noSubstitution = void 0; } else { previousOnEmitNode(hint, node, emitCallback); } } function onSubstituteNode(hint, node) { node = previousOnSubstituteNode(hint, node); if (isSubstitutionPrevented(node)) { return node; } if (hint === 1 /* Expression */) { return substituteExpression(node); } else if (hint === 4 /* Unspecified */) { return substituteUnspecified(node); } return node; } function substituteUnspecified(node) { switch (node.kind) { case 305 /* ShorthandPropertyAssignment */: return substituteShorthandPropertyAssignment(node); } return node; } function substituteShorthandPropertyAssignment(node) { var _a, _b; const name = node.name; if (!isGeneratedIdentifier(name) && !isLocalName(name)) { const importDeclaration = resolver.getReferencedImportDeclaration(name); if (importDeclaration) { if (isImportClause(importDeclaration)) { return setTextRange( factory2.createPropertyAssignment( factory2.cloneNode(name), factory2.createPropertyAccessExpression( factory2.getGeneratedNameForNode(importDeclaration.parent), factory2.createIdentifier("default") ) ), /*location*/ node ); } else if (isImportSpecifier(importDeclaration)) { const importedName = importDeclaration.propertyName || importDeclaration.name; const target = factory2.getGeneratedNameForNode(((_b = (_a = importDeclaration.parent) == null ? void 0 : _a.parent) == null ? void 0 : _b.parent) || importDeclaration); return setTextRange( factory2.createPropertyAssignment( factory2.cloneNode(name), importedName.kind === 11 /* StringLiteral */ ? factory2.createElementAccessExpression(target, factory2.cloneNode(importedName)) : factory2.createPropertyAccessExpression(target, factory2.cloneNode(importedName)) ), /*location*/ node ); } } } return node; } function substituteExpression(node) { switch (node.kind) { case 80 /* Identifier */: return substituteExpressionIdentifier(node); case 227 /* BinaryExpression */: return substituteBinaryExpression(node); case 237 /* MetaProperty */: return substituteMetaProperty(node); } return node; } function substituteExpressionIdentifier(node) { var _a, _b; if (getEmitFlags(node) & 8192 /* HelperName */) { const externalHelpersModuleName = getExternalHelpersModuleName(currentSourceFile); if (externalHelpersModuleName) { return factory2.createPropertyAccessExpression(externalHelpersModuleName, node); } return node; } if (!isGeneratedIdentifier(node) && !isLocalName(node)) { const importDeclaration = resolver.getReferencedImportDeclaration(node); if (importDeclaration) { if (isImportClause(importDeclaration)) { return setTextRange( factory2.createPropertyAccessExpression( factory2.getGeneratedNameForNode(importDeclaration.parent), factory2.createIdentifier("default") ), /*location*/ node ); } else if (isImportSpecifier(importDeclaration)) { const importedName = importDeclaration.propertyName || importDeclaration.name; const target = factory2.getGeneratedNameForNode(((_b = (_a = importDeclaration.parent) == null ? void 0 : _a.parent) == null ? void 0 : _b.parent) || importDeclaration); return setTextRange( importedName.kind === 11 /* StringLiteral */ ? factory2.createElementAccessExpression(target, factory2.cloneNode(importedName)) : factory2.createPropertyAccessExpression(target, factory2.cloneNode(importedName)), /*location*/ node ); } } } return node; } function substituteBinaryExpression(node) { if (isAssignmentOperator(node.operatorToken.kind) && isIdentifier(node.left) && (!isGeneratedIdentifier(node.left) || isFileLevelReservedGeneratedIdentifier(node.left)) && !isLocalName(node.left)) { const exportedNames = getExports(node.left); if (exportedNames) { let expression = node; for (const exportName of exportedNames) { expression = createExportExpression(exportName, preventSubstitution(expression)); } return expression; } } return node; } function substituteMetaProperty(node) { if (isImportMeta(node)) { return factory2.createPropertyAccessExpression(contextObject, factory2.createIdentifier("meta")); } return node; } function getExports(name) { let exportedNames; const valueDeclaration = getReferencedDeclaration(name); if (valueDeclaration) { const exportContainer = resolver.getReferencedExportContainer( name, /*prefixLocals*/ false ); if (exportContainer && exportContainer.kind === 308 /* SourceFile */) { exportedNames = append(exportedNames, factory2.getDeclarationName(valueDeclaration)); } exportedNames = addRange(exportedNames, moduleInfo == null ? void 0 : moduleInfo.exportedBindings[getOriginalNodeId(valueDeclaration)]); } else if (isGeneratedIdentifier(name) && isFileLevelReservedGeneratedIdentifier(name)) { const exportSpecifiers = moduleInfo == null ? void 0 : moduleInfo.exportSpecifiers.get(name); if (exportSpecifiers) { const exportedNames2 = []; for (const exportSpecifier of exportSpecifiers) { exportedNames2.push(exportSpecifier.name); } return exportedNames2; } } return exportedNames; } function getReferencedDeclaration(name) { if (!isGeneratedIdentifier(name)) { const importDeclaration = resolver.getReferencedImportDeclaration(name); if (importDeclaration) return importDeclaration; const valueDeclaration = resolver.getReferencedValueDeclaration(name); if (valueDeclaration && (moduleInfo == null ? void 0 : moduleInfo.exportedBindings[getOriginalNodeId(valueDeclaration)])) return valueDeclaration; const declarations = resolver.getReferencedValueDeclarations(name); if (declarations) { for (const declaration of declarations) { if (declaration !== valueDeclaration && (moduleInfo == null ? void 0 : moduleInfo.exportedBindings[getOriginalNodeId(declaration)])) return declaration; } } return valueDeclaration; } } function preventSubstitution(node) { if (noSubstitution === void 0) noSubstitution = []; noSubstitution[getNodeId(node)] = true; return node; } function isSubstitutionPrevented(node) { return noSubstitution && node.id && noSubstitution[node.id]; } } // src/compiler/transformers/module/esnextAnd2015.ts function transformECMAScriptModule(context) { const { factory: factory2, getEmitHelperFactory: emitHelpers } = context; const host = context.getEmitHost(); const resolver = context.getEmitResolver(); const compilerOptions = context.getCompilerOptions(); const languageVersion = getEmitScriptTarget(compilerOptions); const previousOnEmitNode = context.onEmitNode; const previousOnSubstituteNode = context.onSubstituteNode; context.onEmitNode = onEmitNode; context.onSubstituteNode = onSubstituteNode; context.enableEmitNotification(308 /* SourceFile */); context.enableSubstitution(80 /* Identifier */); const noSubstitution = /* @__PURE__ */ new Set(); let importsAndRequiresToRewriteOrShim; let helperNameSubstitutions; let currentSourceFile; let importRequireStatements; return chainBundle(context, transformSourceFile); function transformSourceFile(node) { if (node.isDeclarationFile) { return node; } if (isExternalModule(node) || getIsolatedModules(compilerOptions)) { currentSourceFile = node; importRequireStatements = void 0; if (compilerOptions.rewriteRelativeImportExtensions && (currentSourceFile.flags & 4194304 /* PossiblyContainsDynamicImport */ || isInJSFile(node))) { forEachDynamicImportOrRequireCall( node, /*includeTypeSpaceImports*/ false, /*requireStringLiteralLikeArgument*/ false, (node2) => { if (!isStringLiteralLike(node2.arguments[0]) || shouldRewriteModuleSpecifier(node2.arguments[0].text, compilerOptions)) { importsAndRequiresToRewriteOrShim = append(importsAndRequiresToRewriteOrShim, node2); } } ); } let result = updateExternalModule(node); addEmitHelpers(result, context.readEmitHelpers()); currentSourceFile = void 0; if (importRequireStatements) { result = factory2.updateSourceFile( result, setTextRange(factory2.createNodeArray(insertStatementsAfterCustomPrologue(result.statements.slice(), importRequireStatements)), result.statements) ); } if (!isExternalModule(node) || getEmitModuleKind(compilerOptions) === 200 /* Preserve */ || some(result.statements, isExternalModuleIndicator)) { return result; } return factory2.updateSourceFile( result, setTextRange(factory2.createNodeArray([...result.statements, createEmptyExports(factory2)]), result.statements) ); } return node; } function updateExternalModule(node) { const externalHelpersImportDeclaration = createExternalHelpersImportDeclarationIfNeeded(factory2, emitHelpers(), node, compilerOptions); if (externalHelpersImportDeclaration) { const statements = []; const statementOffset = factory2.copyPrologue(node.statements, statements); addRange(statements, visitArray([externalHelpersImportDeclaration], visitor, isStatement)); addRange(statements, visitNodes2(node.statements, visitor, isStatement, statementOffset)); return factory2.updateSourceFile( node, setTextRange(factory2.createNodeArray(statements), node.statements) ); } else { return visitEachChild(node, visitor, context); } } function visitor(node) { switch (node.kind) { case 272 /* ImportEqualsDeclaration */: return getEmitModuleKind(compilerOptions) >= 100 /* Node16 */ ? visitImportEqualsDeclaration(node) : void 0; case 278 /* ExportAssignment */: return visitExportAssignment(node); case 279 /* ExportDeclaration */: const exportDecl = node; return visitExportDeclaration(exportDecl); case 273 /* ImportDeclaration */: return visitImportDeclaration(node); case 214 /* CallExpression */: if (node === (importsAndRequiresToRewriteOrShim == null ? void 0 : importsAndRequiresToRewriteOrShim[0])) { return visitImportOrRequireCall(importsAndRequiresToRewriteOrShim.shift()); } // fallthrough default: if ((importsAndRequiresToRewriteOrShim == null ? void 0 : importsAndRequiresToRewriteOrShim.length) && rangeContainsRange(node, importsAndRequiresToRewriteOrShim[0])) { return visitEachChild(node, visitor, context); } } return node; } function visitImportDeclaration(node) { if (!compilerOptions.rewriteRelativeImportExtensions) { return node; } const updatedModuleSpecifier = rewriteModuleSpecifier(node.moduleSpecifier, compilerOptions); if (updatedModuleSpecifier === node.moduleSpecifier) { return node; } return factory2.updateImportDeclaration( node, node.modifiers, node.importClause, updatedModuleSpecifier, node.attributes ); } function visitImportOrRequireCall(node) { return factory2.updateCallExpression( node, node.expression, node.typeArguments, [ isStringLiteralLike(node.arguments[0]) ? rewriteModuleSpecifier(node.arguments[0], compilerOptions) : emitHelpers().createRewriteRelativeImportExtensionsHelper(node.arguments[0]), ...node.arguments.slice(1) ] ); } function createRequireCall(importNode) { const moduleName = getExternalModuleNameLiteral(factory2, importNode, Debug.checkDefined(currentSourceFile), host, resolver, compilerOptions); const args = []; if (moduleName) { args.push(rewriteModuleSpecifier(moduleName, compilerOptions)); } if (getEmitModuleKind(compilerOptions) === 200 /* Preserve */) { return factory2.createCallExpression( factory2.createIdentifier("require"), /*typeArguments*/ void 0, args ); } if (!importRequireStatements) { const createRequireName = factory2.createUniqueName("_createRequire", 16 /* Optimistic */ | 32 /* FileLevel */); const importStatement = factory2.createImportDeclaration( /*modifiers*/ void 0, factory2.createImportClause( /*phaseModifier*/ void 0, /*name*/ void 0, factory2.createNamedImports([ factory2.createImportSpecifier( /*isTypeOnly*/ false, factory2.createIdentifier("createRequire"), createRequireName ) ]) ), factory2.createStringLiteral("module"), /*attributes*/ void 0 ); const requireHelperName = factory2.createUniqueName("__require", 16 /* Optimistic */ | 32 /* FileLevel */); const requireStatement = factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList( [ factory2.createVariableDeclaration( requireHelperName, /*exclamationToken*/ void 0, /*type*/ void 0, factory2.createCallExpression( factory2.cloneNode(createRequireName), /*typeArguments*/ void 0, [ factory2.createPropertyAccessExpression(factory2.createMetaProperty(102 /* ImportKeyword */, factory2.createIdentifier("meta")), factory2.createIdentifier("url")) ] ) ) ], /*flags*/ languageVersion >= 2 /* ES2015 */ ? 2 /* Const */ : 0 /* None */ ) ); importRequireStatements = [importStatement, requireStatement]; } const name = importRequireStatements[1].declarationList.declarations[0].name; Debug.assertNode(name, isIdentifier); return factory2.createCallExpression( factory2.cloneNode(name), /*typeArguments*/ void 0, args ); } function visitImportEqualsDeclaration(node) { Debug.assert(isExternalModuleImportEqualsDeclaration(node), "import= for internal module references should be handled in an earlier transformer."); let statements; statements = append( statements, setOriginalNode( setTextRange( factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList( [ factory2.createVariableDeclaration( factory2.cloneNode(node.name), /*exclamationToken*/ void 0, /*type*/ void 0, createRequireCall(node) ) ], /*flags*/ languageVersion >= 2 /* ES2015 */ ? 2 /* Const */ : 0 /* None */ ) ), node ), node ) ); statements = appendExportsOfImportEqualsDeclaration(statements, node); return singleOrMany(statements); } function appendExportsOfImportEqualsDeclaration(statements, node) { if (hasSyntacticModifier(node, 32 /* Export */)) { statements = append( statements, factory2.createExportDeclaration( /*modifiers*/ void 0, node.isTypeOnly, factory2.createNamedExports([factory2.createExportSpecifier( /*isTypeOnly*/ false, /*propertyName*/ void 0, idText(node.name) )]) ) ); } return statements; } function visitExportAssignment(node) { if (node.isExportEquals) { if (getEmitModuleKind(compilerOptions) === 200 /* Preserve */) { const statement = setOriginalNode( factory2.createExpressionStatement( factory2.createAssignment( factory2.createPropertyAccessExpression( factory2.createIdentifier("module"), "exports" ), node.expression ) ), node ); return statement; } return void 0; } return node; } function visitExportDeclaration(node) { const updatedModuleSpecifier = rewriteModuleSpecifier(node.moduleSpecifier, compilerOptions); if (compilerOptions.module !== void 0 && compilerOptions.module > 5 /* ES2015 */ || !node.exportClause || !isNamespaceExport(node.exportClause) || !node.moduleSpecifier) { return !node.moduleSpecifier || updatedModuleSpecifier === node.moduleSpecifier ? node : factory2.updateExportDeclaration( node, node.modifiers, node.isTypeOnly, node.exportClause, updatedModuleSpecifier, node.attributes ); } const oldIdentifier = node.exportClause.name; const synthName = factory2.getGeneratedNameForNode(oldIdentifier); const importDecl = factory2.createImportDeclaration( /*modifiers*/ void 0, factory2.createImportClause( /*phaseModifier*/ void 0, /*name*/ void 0, factory2.createNamespaceImport( synthName ) ), updatedModuleSpecifier, node.attributes ); setOriginalNode(importDecl, node.exportClause); const exportDecl = isExportNamespaceAsDefaultDeclaration(node) ? factory2.createExportDefault(synthName) : factory2.createExportDeclaration( /*modifiers*/ void 0, /*isTypeOnly*/ false, factory2.createNamedExports([factory2.createExportSpecifier( /*isTypeOnly*/ false, synthName, oldIdentifier )]) ); setOriginalNode(exportDecl, node); return [importDecl, exportDecl]; } function onEmitNode(hint, node, emitCallback) { if (isSourceFile(node)) { if ((isExternalModule(node) || getIsolatedModules(compilerOptions)) && compilerOptions.importHelpers) { helperNameSubstitutions = /* @__PURE__ */ new Map(); } currentSourceFile = node; previousOnEmitNode(hint, node, emitCallback); currentSourceFile = void 0; helperNameSubstitutions = void 0; } else { previousOnEmitNode(hint, node, emitCallback); } } function onSubstituteNode(hint, node) { node = previousOnSubstituteNode(hint, node); if (node.id && noSubstitution.has(node.id)) { return node; } if (isIdentifier(node) && getEmitFlags(node) & 8192 /* HelperName */) { return substituteHelperName(node); } return node; } function substituteHelperName(node) { const externalHelpersModuleName = currentSourceFile && getExternalHelpersModuleName(currentSourceFile); if (externalHelpersModuleName) { noSubstitution.add(getNodeId(node)); return factory2.createPropertyAccessExpression(externalHelpersModuleName, node); } if (helperNameSubstitutions) { const name = idText(node); let substitution = helperNameSubstitutions.get(name); if (!substitution) { helperNameSubstitutions.set(name, substitution = factory2.createUniqueName(name, 16 /* Optimistic */ | 32 /* FileLevel */)); } return substitution; } return node; } } // src/compiler/transformers/module/impliedNodeFormatDependent.ts function transformImpliedNodeFormatDependentModule(context) { const previousOnSubstituteNode = context.onSubstituteNode; const previousOnEmitNode = context.onEmitNode; const esmTransform = transformECMAScriptModule(context); const esmOnSubstituteNode = context.onSubstituteNode; const esmOnEmitNode = context.onEmitNode; context.onSubstituteNode = previousOnSubstituteNode; context.onEmitNode = previousOnEmitNode; const cjsTransform = transformModule(context); const cjsOnSubstituteNode = context.onSubstituteNode; const cjsOnEmitNode = context.onEmitNode; const getEmitModuleFormatOfFile = (file) => context.getEmitHost().getEmitModuleFormatOfFile(file); context.onSubstituteNode = onSubstituteNode; context.onEmitNode = onEmitNode; context.enableSubstitution(308 /* SourceFile */); context.enableEmitNotification(308 /* SourceFile */); let currentSourceFile; return transformSourceFileOrBundle; function onSubstituteNode(hint, node) { if (isSourceFile(node)) { currentSourceFile = node; return previousOnSubstituteNode(hint, node); } else { if (!currentSourceFile) { return previousOnSubstituteNode(hint, node); } if (getEmitModuleFormatOfFile(currentSourceFile) >= 5 /* ES2015 */) { return esmOnSubstituteNode(hint, node); } return cjsOnSubstituteNode(hint, node); } } function onEmitNode(hint, node, emitCallback) { if (isSourceFile(node)) { currentSourceFile = node; } if (!currentSourceFile) { return previousOnEmitNode(hint, node, emitCallback); } if (getEmitModuleFormatOfFile(currentSourceFile) >= 5 /* ES2015 */) { return esmOnEmitNode(hint, node, emitCallback); } return cjsOnEmitNode(hint, node, emitCallback); } function getModuleTransformForFile(file) { return getEmitModuleFormatOfFile(file) >= 5 /* ES2015 */ ? esmTransform : cjsTransform; } function transformSourceFile(node) { if (node.isDeclarationFile) { return node; } currentSourceFile = node; const result = getModuleTransformForFile(node)(node); currentSourceFile = void 0; Debug.assert(isSourceFile(result)); return result; } function transformSourceFileOrBundle(node) { return node.kind === 308 /* SourceFile */ ? transformSourceFile(node) : transformBundle(node); } function transformBundle(node) { return context.factory.createBundle(map(node.sourceFiles, transformSourceFile)); } } // src/compiler/transformers/declarations/diagnostics.ts function canProduceDiagnostics(node) { return isVariableDeclaration(node) || isPropertyDeclaration(node) || isPropertySignature(node) || isBindingElement(node) || isSetAccessor(node) || isGetAccessor(node) || isConstructSignatureDeclaration(node) || isCallSignatureDeclaration(node) || isMethodDeclaration(node) || isMethodSignature(node) || isFunctionDeclaration(node) || isParameter(node) || isTypeParameterDeclaration(node) || isExpressionWithTypeArguments(node) || isImportEqualsDeclaration(node) || isTypeAliasDeclaration(node) || isConstructorDeclaration(node) || isIndexSignatureDeclaration(node) || isPropertyAccessExpression(node) || isElementAccessExpression(node) || isBinaryExpression(node) || isJSDocTypeAlias(node); } function createGetSymbolAccessibilityDiagnosticForNodeName(node) { if (isSetAccessor(node) || isGetAccessor(node)) { return getAccessorNameVisibilityError; } else if (isMethodSignature(node) || isMethodDeclaration(node)) { return getMethodNameVisibilityError; } else { return createGetSymbolAccessibilityDiagnosticForNode(node); } function getAccessorNameVisibilityError(symbolAccessibilityResult) { const diagnosticMessage = getAccessorNameVisibilityDiagnosticMessage(symbolAccessibilityResult); return diagnosticMessage !== void 0 ? { diagnosticMessage, errorNode: node, typeName: node.name } : void 0; } function getAccessorNameVisibilityDiagnosticMessage(symbolAccessibilityResult) { if (isStatic(node)) { return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_private_name_1; } else if (node.parent.kind === 264 /* ClassDeclaration */) { return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Public_property_0_of_exported_class_has_or_is_using_private_name_1; } else { return symbolAccessibilityResult.errorModuleName ? Diagnostics.Property_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Property_0_of_exported_interface_has_or_is_using_private_name_1; } } function getMethodNameVisibilityError(symbolAccessibilityResult) { const diagnosticMessage = getMethodNameVisibilityDiagnosticMessage(symbolAccessibilityResult); return diagnosticMessage !== void 0 ? { diagnosticMessage, errorNode: node, typeName: node.name } : void 0; } function getMethodNameVisibilityDiagnosticMessage(symbolAccessibilityResult) { if (isStatic(node)) { return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Public_static_method_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Public_static_method_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Public_static_method_0_of_exported_class_has_or_is_using_private_name_1; } else if (node.parent.kind === 264 /* ClassDeclaration */) { return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Public_method_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Public_method_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Public_method_0_of_exported_class_has_or_is_using_private_name_1; } else { return symbolAccessibilityResult.errorModuleName ? Diagnostics.Method_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Method_0_of_exported_interface_has_or_is_using_private_name_1; } } } function createGetSymbolAccessibilityDiagnosticForNode(node) { if (isVariableDeclaration(node) || isPropertyDeclaration(node) || isPropertySignature(node) || isPropertyAccessExpression(node) || isElementAccessExpression(node) || isBinaryExpression(node) || isBindingElement(node) || isConstructorDeclaration(node)) { return getVariableDeclarationTypeVisibilityError; } else if (isSetAccessor(node) || isGetAccessor(node)) { return getAccessorDeclarationTypeVisibilityError; } else if (isConstructSignatureDeclaration(node) || isCallSignatureDeclaration(node) || isMethodDeclaration(node) || isMethodSignature(node) || isFunctionDeclaration(node) || isIndexSignatureDeclaration(node)) { return getReturnTypeVisibilityError; } else if (isParameter(node)) { if (isParameterPropertyDeclaration(node, node.parent) && hasSyntacticModifier(node.parent, 2 /* Private */)) { return getVariableDeclarationTypeVisibilityError; } return getParameterDeclarationTypeVisibilityError; } else if (isTypeParameterDeclaration(node)) { return getTypeParameterConstraintVisibilityError; } else if (isExpressionWithTypeArguments(node)) { return getHeritageClauseVisibilityError; } else if (isImportEqualsDeclaration(node)) { return getImportEntityNameVisibilityError; } else if (isTypeAliasDeclaration(node) || isJSDocTypeAlias(node)) { return getTypeAliasDeclarationVisibilityError; } else { return Debug.assertNever(node, `Attempted to set a declaration diagnostic context for unhandled node kind: ${Debug.formatSyntaxKind(node.kind)}`); } function getVariableDeclarationTypeVisibilityDiagnosticMessage(symbolAccessibilityResult) { if (node.kind === 261 /* VariableDeclaration */ || node.kind === 209 /* BindingElement */) { return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Exported_variable_0_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Exported_variable_0_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Exported_variable_0_has_or_is_using_private_name_1; } else if (node.kind === 173 /* PropertyDeclaration */ || node.kind === 212 /* PropertyAccessExpression */ || node.kind === 213 /* ElementAccessExpression */ || node.kind === 227 /* BinaryExpression */ || node.kind === 172 /* PropertySignature */ || node.kind === 170 /* Parameter */ && hasSyntacticModifier(node.parent, 2 /* Private */)) { if (isStatic(node)) { return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_private_name_1; } else if (node.parent.kind === 264 /* ClassDeclaration */ || node.kind === 170 /* Parameter */) { return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Public_property_0_of_exported_class_has_or_is_using_private_name_1; } else { return symbolAccessibilityResult.errorModuleName ? Diagnostics.Property_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Property_0_of_exported_interface_has_or_is_using_private_name_1; } } } function getVariableDeclarationTypeVisibilityError(symbolAccessibilityResult) { const diagnosticMessage = getVariableDeclarationTypeVisibilityDiagnosticMessage(symbolAccessibilityResult); return diagnosticMessage !== void 0 ? { diagnosticMessage, errorNode: node, typeName: node.name } : void 0; } function getAccessorDeclarationTypeVisibilityError(symbolAccessibilityResult) { let diagnosticMessage; if (node.kind === 179 /* SetAccessor */) { if (isStatic(node)) { diagnosticMessage = symbolAccessibilityResult.errorModuleName ? Diagnostics.Parameter_type_of_public_static_setter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_type_of_public_static_setter_0_from_exported_class_has_or_is_using_private_name_1; } else { diagnosticMessage = symbolAccessibilityResult.errorModuleName ? Diagnostics.Parameter_type_of_public_setter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_type_of_public_setter_0_from_exported_class_has_or_is_using_private_name_1; } } else { if (isStatic(node)) { diagnosticMessage = symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_private_name_1; } else { diagnosticMessage = symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Return_type_of_public_getter_0_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Return_type_of_public_getter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Return_type_of_public_getter_0_from_exported_class_has_or_is_using_private_name_1; } } return { diagnosticMessage, errorNode: node.name, typeName: node.name }; } function getReturnTypeVisibilityError(symbolAccessibilityResult) { let diagnosticMessage; switch (node.kind) { case 181 /* ConstructSignature */: diagnosticMessage = symbolAccessibilityResult.errorModuleName ? Diagnostics.Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 : Diagnostics.Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_0; break; case 180 /* CallSignature */: diagnosticMessage = symbolAccessibilityResult.errorModuleName ? Diagnostics.Return_type_of_call_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 : Diagnostics.Return_type_of_call_signature_from_exported_interface_has_or_is_using_private_name_0; break; case 182 /* IndexSignature */: diagnosticMessage = symbolAccessibilityResult.errorModuleName ? Diagnostics.Return_type_of_index_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 : Diagnostics.Return_type_of_index_signature_from_exported_interface_has_or_is_using_private_name_0; break; case 175 /* MethodDeclaration */: case 174 /* MethodSignature */: if (isStatic(node)) { diagnosticMessage = symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named : Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_private_module_1 : Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_private_name_0; } else if (node.parent.kind === 264 /* ClassDeclaration */) { diagnosticMessage = symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named : Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_private_module_1 : Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_private_name_0; } else { diagnosticMessage = symbolAccessibilityResult.errorModuleName ? Diagnostics.Return_type_of_method_from_exported_interface_has_or_is_using_name_0_from_private_module_1 : Diagnostics.Return_type_of_method_from_exported_interface_has_or_is_using_private_name_0; } break; case 263 /* FunctionDeclaration */: diagnosticMessage = symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Return_type_of_exported_function_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named : Diagnostics.Return_type_of_exported_function_has_or_is_using_name_0_from_private_module_1 : Diagnostics.Return_type_of_exported_function_has_or_is_using_private_name_0; break; default: return Debug.fail("This is unknown kind for signature: " + node.kind); } return { diagnosticMessage, errorNode: node.name || node }; } function getParameterDeclarationTypeVisibilityError(symbolAccessibilityResult) { const diagnosticMessage = getParameterDeclarationTypeVisibilityDiagnosticMessage(symbolAccessibilityResult); return diagnosticMessage !== void 0 ? { diagnosticMessage, errorNode: node, typeName: node.name } : void 0; } function getParameterDeclarationTypeVisibilityDiagnosticMessage(symbolAccessibilityResult) { switch (node.parent.kind) { case 177 /* Constructor */: return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_private_name_1; case 181 /* ConstructSignature */: case 186 /* ConstructorType */: return symbolAccessibilityResult.errorModuleName ? Diagnostics.Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1; case 180 /* CallSignature */: return symbolAccessibilityResult.errorModuleName ? Diagnostics.Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1; case 182 /* IndexSignature */: return symbolAccessibilityResult.errorModuleName ? Diagnostics.Parameter_0_of_index_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_index_signature_from_exported_interface_has_or_is_using_private_name_1; case 175 /* MethodDeclaration */: case 174 /* MethodSignature */: if (isStatic(node.parent)) { return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1; } else if (node.parent.parent.kind === 264 /* ClassDeclaration */) { return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1; } else { return symbolAccessibilityResult.errorModuleName ? Diagnostics.Parameter_0_of_method_from_exported_interface_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1; } case 263 /* FunctionDeclaration */: case 185 /* FunctionType */: return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Parameter_0_of_exported_function_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Parameter_0_of_exported_function_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_exported_function_has_or_is_using_private_name_1; case 179 /* SetAccessor */: case 178 /* GetAccessor */: return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Parameter_0_of_accessor_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Parameter_0_of_accessor_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_accessor_has_or_is_using_private_name_1; default: return Debug.fail(`Unknown parent for parameter: ${Debug.formatSyntaxKind(node.parent.kind)}`); } } function getTypeParameterConstraintVisibilityError() { let diagnosticMessage; switch (node.parent.kind) { case 264 /* ClassDeclaration */: diagnosticMessage = Diagnostics.Type_parameter_0_of_exported_class_has_or_is_using_private_name_1; break; case 265 /* InterfaceDeclaration */: diagnosticMessage = Diagnostics.Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1; break; case 201 /* MappedType */: diagnosticMessage = Diagnostics.Type_parameter_0_of_exported_mapped_object_type_is_using_private_name_1; break; case 186 /* ConstructorType */: case 181 /* ConstructSignature */: diagnosticMessage = Diagnostics.Type_parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1; break; case 180 /* CallSignature */: diagnosticMessage = Diagnostics.Type_parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1; break; case 175 /* MethodDeclaration */: case 174 /* MethodSignature */: if (isStatic(node.parent)) { diagnosticMessage = Diagnostics.Type_parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1; } else if (node.parent.parent.kind === 264 /* ClassDeclaration */) { diagnosticMessage = Diagnostics.Type_parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1; } else { diagnosticMessage = Diagnostics.Type_parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1; } break; case 185 /* FunctionType */: case 263 /* FunctionDeclaration */: diagnosticMessage = Diagnostics.Type_parameter_0_of_exported_function_has_or_is_using_private_name_1; break; case 196 /* InferType */: diagnosticMessage = Diagnostics.Extends_clause_for_inferred_type_0_has_or_is_using_private_name_1; break; case 266 /* TypeAliasDeclaration */: diagnosticMessage = Diagnostics.Type_parameter_0_of_exported_type_alias_has_or_is_using_private_name_1; break; default: return Debug.fail("This is unknown parent for type parameter: " + node.parent.kind); } return { diagnosticMessage, errorNode: node, typeName: node.name }; } function getHeritageClauseVisibilityError() { let diagnosticMessage; if (isClassDeclaration(node.parent.parent)) { diagnosticMessage = isHeritageClause(node.parent) && node.parent.token === 119 /* ImplementsKeyword */ ? Diagnostics.Implements_clause_of_exported_class_0_has_or_is_using_private_name_1 : node.parent.parent.name ? Diagnostics.extends_clause_of_exported_class_0_has_or_is_using_private_name_1 : Diagnostics.extends_clause_of_exported_class_has_or_is_using_private_name_0; } else { diagnosticMessage = Diagnostics.extends_clause_of_exported_interface_0_has_or_is_using_private_name_1; } return { diagnosticMessage, errorNode: node, typeName: getNameOfDeclaration(node.parent.parent) }; } function getImportEntityNameVisibilityError() { return { diagnosticMessage: Diagnostics.Import_declaration_0_is_using_private_name_1, errorNode: node, typeName: node.name }; } function getTypeAliasDeclarationVisibilityError(symbolAccessibilityResult) { return { diagnosticMessage: symbolAccessibilityResult.errorModuleName ? Diagnostics.Exported_type_alias_0_has_or_is_using_private_name_1_from_module_2 : Diagnostics.Exported_type_alias_0_has_or_is_using_private_name_1, errorNode: isJSDocTypeAlias(node) ? Debug.checkDefined(node.typeExpression) : node.type, typeName: isJSDocTypeAlias(node) ? getNameOfDeclaration(node) : node.name }; } } function createGetIsolatedDeclarationErrors(resolver) { const relatedSuggestionByDeclarationKind = { [220 /* ArrowFunction */]: Diagnostics.Add_a_return_type_to_the_function_expression, [219 /* FunctionExpression */]: Diagnostics.Add_a_return_type_to_the_function_expression, [175 /* MethodDeclaration */]: Diagnostics.Add_a_return_type_to_the_method, [178 /* GetAccessor */]: Diagnostics.Add_a_return_type_to_the_get_accessor_declaration, [179 /* SetAccessor */]: Diagnostics.Add_a_type_to_parameter_of_the_set_accessor_declaration, [263 /* FunctionDeclaration */]: Diagnostics.Add_a_return_type_to_the_function_declaration, [181 /* ConstructSignature */]: Diagnostics.Add_a_return_type_to_the_function_declaration, [170 /* Parameter */]: Diagnostics.Add_a_type_annotation_to_the_parameter_0, [261 /* VariableDeclaration */]: Diagnostics.Add_a_type_annotation_to_the_variable_0, [173 /* PropertyDeclaration */]: Diagnostics.Add_a_type_annotation_to_the_property_0, [172 /* PropertySignature */]: Diagnostics.Add_a_type_annotation_to_the_property_0, [278 /* ExportAssignment */]: Diagnostics.Move_the_expression_in_default_export_to_a_variable_and_add_a_type_annotation_to_it }; const errorByDeclarationKind = { [219 /* FunctionExpression */]: Diagnostics.Function_must_have_an_explicit_return_type_annotation_with_isolatedDeclarations, [263 /* FunctionDeclaration */]: Diagnostics.Function_must_have_an_explicit_return_type_annotation_with_isolatedDeclarations, [220 /* ArrowFunction */]: Diagnostics.Function_must_have_an_explicit_return_type_annotation_with_isolatedDeclarations, [175 /* MethodDeclaration */]: Diagnostics.Method_must_have_an_explicit_return_type_annotation_with_isolatedDeclarations, [181 /* ConstructSignature */]: Diagnostics.Method_must_have_an_explicit_return_type_annotation_with_isolatedDeclarations, [178 /* GetAccessor */]: Diagnostics.At_least_one_accessor_must_have_an_explicit_type_annotation_with_isolatedDeclarations, [179 /* SetAccessor */]: Diagnostics.At_least_one_accessor_must_have_an_explicit_type_annotation_with_isolatedDeclarations, [170 /* Parameter */]: Diagnostics.Parameter_must_have_an_explicit_type_annotation_with_isolatedDeclarations, [261 /* VariableDeclaration */]: Diagnostics.Variable_must_have_an_explicit_type_annotation_with_isolatedDeclarations, [173 /* PropertyDeclaration */]: Diagnostics.Property_must_have_an_explicit_type_annotation_with_isolatedDeclarations, [172 /* PropertySignature */]: Diagnostics.Property_must_have_an_explicit_type_annotation_with_isolatedDeclarations, [168 /* ComputedPropertyName */]: Diagnostics.Computed_property_names_on_class_or_object_literals_cannot_be_inferred_with_isolatedDeclarations, [306 /* SpreadAssignment */]: Diagnostics.Objects_that_contain_spread_assignments_can_t_be_inferred_with_isolatedDeclarations, [305 /* ShorthandPropertyAssignment */]: Diagnostics.Objects_that_contain_shorthand_properties_can_t_be_inferred_with_isolatedDeclarations, [210 /* ArrayLiteralExpression */]: Diagnostics.Only_const_arrays_can_be_inferred_with_isolatedDeclarations, [278 /* ExportAssignment */]: Diagnostics.Default_exports_can_t_be_inferred_with_isolatedDeclarations, [231 /* SpreadElement */]: Diagnostics.Arrays_with_spread_elements_can_t_inferred_with_isolatedDeclarations }; return getDiagnostic; function getDiagnostic(node) { const heritageClause = findAncestor(node, isHeritageClause); if (heritageClause) { return createDiagnosticForNode(node, Diagnostics.Extends_clause_can_t_contain_an_expression_with_isolatedDeclarations); } if ((isPartOfTypeNode(node) || isTypeQueryNode(node.parent)) && (isEntityName(node) || isEntityNameExpression(node))) { return createEntityInTypeNodeError(node); } Debug.type(node); switch (node.kind) { case 178 /* GetAccessor */: case 179 /* SetAccessor */: return createAccessorTypeError(node); case 168 /* ComputedPropertyName */: case 305 /* ShorthandPropertyAssignment */: case 306 /* SpreadAssignment */: return createObjectLiteralError(node); case 210 /* ArrayLiteralExpression */: case 231 /* SpreadElement */: return createArrayLiteralError(node); case 175 /* MethodDeclaration */: case 181 /* ConstructSignature */: case 219 /* FunctionExpression */: case 220 /* ArrowFunction */: case 263 /* FunctionDeclaration */: return createReturnTypeError(node); case 209 /* BindingElement */: return createBindingElementError(node); case 173 /* PropertyDeclaration */: case 261 /* VariableDeclaration */: return createVariableOrPropertyError(node); case 170 /* Parameter */: return createParameterError(node); case 304 /* PropertyAssignment */: return createExpressionError(node.initializer); case 232 /* ClassExpression */: return createClassExpressionError(node); default: assertType(node); return createExpressionError(node); } } function findNearestDeclaration(node) { const result = findAncestor(node, (n) => isExportAssignment(n) || isStatement(n) || isVariableDeclaration(n) || isPropertyDeclaration(n) || isParameter(n)); if (!result) return void 0; if (isExportAssignment(result)) return result; if (isReturnStatement(result)) { return findAncestor(result, (n) => isFunctionLikeDeclaration(n) && !isConstructorDeclaration(n)); } return isStatement(result) ? void 0 : result; } function createAccessorTypeError(node) { const { getAccessor, setAccessor } = getAllAccessorDeclarations(node.symbol.declarations, node); const targetNode = (isSetAccessor(node) ? node.parameters[0] : node) ?? node; const diag2 = createDiagnosticForNode(targetNode, errorByDeclarationKind[node.kind]); if (setAccessor) { addRelatedInfo(diag2, createDiagnosticForNode(setAccessor, relatedSuggestionByDeclarationKind[setAccessor.kind])); } if (getAccessor) { addRelatedInfo(diag2, createDiagnosticForNode(getAccessor, relatedSuggestionByDeclarationKind[getAccessor.kind])); } return diag2; } function addParentDeclarationRelatedInfo(node, diag2) { const parentDeclaration = findNearestDeclaration(node); if (parentDeclaration) { const targetStr = isExportAssignment(parentDeclaration) || !parentDeclaration.name ? "" : getTextOfNode( parentDeclaration.name, /*includeTrivia*/ false ); addRelatedInfo(diag2, createDiagnosticForNode(parentDeclaration, relatedSuggestionByDeclarationKind[parentDeclaration.kind], targetStr)); } return diag2; } function createObjectLiteralError(node) { const diag2 = createDiagnosticForNode(node, errorByDeclarationKind[node.kind]); addParentDeclarationRelatedInfo(node, diag2); return diag2; } function createArrayLiteralError(node) { const diag2 = createDiagnosticForNode(node, errorByDeclarationKind[node.kind]); addParentDeclarationRelatedInfo(node, diag2); return diag2; } function createReturnTypeError(node) { const diag2 = createDiagnosticForNode(node, errorByDeclarationKind[node.kind]); addParentDeclarationRelatedInfo(node, diag2); addRelatedInfo(diag2, createDiagnosticForNode(node, relatedSuggestionByDeclarationKind[node.kind])); return diag2; } function createBindingElementError(node) { return createDiagnosticForNode(node, Diagnostics.Binding_elements_can_t_be_exported_directly_with_isolatedDeclarations); } function createVariableOrPropertyError(node) { const diag2 = createDiagnosticForNode(node, errorByDeclarationKind[node.kind]); const targetStr = getTextOfNode( node.name, /*includeTrivia*/ false ); addRelatedInfo(diag2, createDiagnosticForNode(node, relatedSuggestionByDeclarationKind[node.kind], targetStr)); return diag2; } function createParameterError(node) { if (isSetAccessor(node.parent)) { return createAccessorTypeError(node.parent); } const addUndefined = resolver.requiresAddingImplicitUndefined(node, node.parent); if (!addUndefined && node.initializer) { return createExpressionError(node.initializer); } const message = addUndefined ? Diagnostics.Declaration_emit_for_this_parameter_requires_implicitly_adding_undefined_to_its_type_This_is_not_supported_with_isolatedDeclarations : errorByDeclarationKind[node.kind]; const diag2 = createDiagnosticForNode(node, message); const targetStr = getTextOfNode( node.name, /*includeTrivia*/ false ); addRelatedInfo(diag2, createDiagnosticForNode(node, relatedSuggestionByDeclarationKind[node.kind], targetStr)); return diag2; } function createClassExpressionError(node) { return createExpressionError(node, Diagnostics.Inference_from_class_expressions_is_not_supported_with_isolatedDeclarations); } function createEntityInTypeNodeError(node) { const diag2 = createDiagnosticForNode(node, Diagnostics.Type_containing_private_name_0_can_t_be_used_with_isolatedDeclarations, getTextOfNode( node, /*includeTrivia*/ false )); addParentDeclarationRelatedInfo(node, diag2); return diag2; } function createExpressionError(node, diagnosticMessage) { const parentDeclaration = findNearestDeclaration(node); let diag2; if (parentDeclaration) { const targetStr = isExportAssignment(parentDeclaration) || !parentDeclaration.name ? "" : getTextOfNode( parentDeclaration.name, /*includeTrivia*/ false ); const parent = findAncestor(node.parent, (n) => isExportAssignment(n) || (isStatement(n) ? "quit" : !isParenthesizedExpression(n) && !isTypeAssertionExpression(n) && !isAsExpression(n))); if (parentDeclaration === parent) { diag2 = createDiagnosticForNode(node, diagnosticMessage ?? errorByDeclarationKind[parentDeclaration.kind]); addRelatedInfo(diag2, createDiagnosticForNode(parentDeclaration, relatedSuggestionByDeclarationKind[parentDeclaration.kind], targetStr)); } else { diag2 = createDiagnosticForNode(node, diagnosticMessage ?? Diagnostics.Expression_type_can_t_be_inferred_with_isolatedDeclarations); addRelatedInfo(diag2, createDiagnosticForNode(parentDeclaration, relatedSuggestionByDeclarationKind[parentDeclaration.kind], targetStr)); addRelatedInfo(diag2, createDiagnosticForNode(node, Diagnostics.Add_satisfies_and_a_type_assertion_to_this_expression_satisfies_T_as_T_to_make_the_type_explicit)); } } else { diag2 = createDiagnosticForNode(node, diagnosticMessage ?? Diagnostics.Expression_type_can_t_be_inferred_with_isolatedDeclarations); } return diag2; } } // src/compiler/transformers/declarations.ts function getDeclarationDiagnostics(host, resolver, file) { const compilerOptions = host.getCompilerOptions(); const files = filter(getSourceFilesToEmit(host, file), isSourceFileNotJson); return contains(files, file) ? transformNodes( resolver, host, factory, compilerOptions, [file], [transformDeclarations], /*allowDtsFiles*/ false ).diagnostics : void 0; } var declarationEmitNodeBuilderFlags = 1024 /* MultilineObjectLiterals */ | 2048 /* WriteClassExpressionAsTypeLiteral */ | 4096 /* UseTypeOfFunction */ | 8 /* UseStructuralFallback */ | 524288 /* AllowEmptyTuple */ | 4 /* GenerateNamesForShadowedTypeParams */ | 1 /* NoTruncation */; var declarationEmitInternalNodeBuilderFlags = 8 /* AllowUnresolvedNames */; function transformDeclarations(context) { const throwDiagnostic = () => Debug.fail("Diagnostic emitted without context"); let getSymbolAccessibilityDiagnostic = throwDiagnostic; let needsDeclare = true; let isBundledEmit = false; let resultHasExternalModuleIndicator = false; let needsScopeFixMarker = false; let resultHasScopeMarker = false; let enclosingDeclaration; let lateMarkedStatements; let lateStatementReplacementMap; let suppressNewDiagnosticContexts; const { factory: factory2 } = context; const host = context.getEmitHost(); let restoreFallbackNode = () => void 0; const symbolTracker = { trackSymbol, reportInaccessibleThisError, reportInaccessibleUniqueSymbolError, reportCyclicStructureError, reportPrivateInBaseOfClassExpression, reportLikelyUnsafeImportRequiredError, reportTruncationError, moduleResolverHost: host, reportNonlocalAugmentation, reportNonSerializableProperty, reportInferenceFallback, pushErrorFallbackNode(node) { const currentFallback = errorFallbackNode; const currentRestore = restoreFallbackNode; restoreFallbackNode = () => { restoreFallbackNode = currentRestore; errorFallbackNode = currentFallback; }; errorFallbackNode = node; }, popErrorFallbackNode() { restoreFallbackNode(); } }; let errorNameNode; let errorFallbackNode; let currentSourceFile; let rawReferencedFiles; let rawTypeReferenceDirectives; let rawLibReferenceDirectives; const resolver = context.getEmitResolver(); const options = context.getCompilerOptions(); const getIsolatedDeclarationError = createGetIsolatedDeclarationErrors(resolver); const { stripInternal, isolatedDeclarations } = options; return transformRoot; function reportExpandoFunctionErrors(node) { resolver.getPropertiesOfContainerFunction(node).forEach((p) => { if (isExpandoPropertyDeclaration(p.valueDeclaration)) { const errorTarget = isBinaryExpression(p.valueDeclaration) ? p.valueDeclaration.left : p.valueDeclaration; context.addDiagnostic(createDiagnosticForNode( errorTarget, Diagnostics.Assigning_properties_to_functions_without_declaring_them_is_not_supported_with_isolatedDeclarations_Add_an_explicit_declaration_for_the_properties_assigned_to_this_function )); } }); } function reportInferenceFallback(node) { if (!isolatedDeclarations || isSourceFileJS(currentSourceFile)) return; if (getSourceFileOfNode(node) !== currentSourceFile) return; if (isVariableDeclaration(node) && resolver.isExpandoFunctionDeclaration(node)) { reportExpandoFunctionErrors(node); } else { context.addDiagnostic(getIsolatedDeclarationError(node)); } } function handleSymbolAccessibilityError(symbolAccessibilityResult) { if (symbolAccessibilityResult.accessibility === 0 /* Accessible */) { if (symbolAccessibilityResult.aliasesToMakeVisible) { if (!lateMarkedStatements) { lateMarkedStatements = symbolAccessibilityResult.aliasesToMakeVisible; } else { for (const ref of symbolAccessibilityResult.aliasesToMakeVisible) { pushIfUnique(lateMarkedStatements, ref); } } } } else if (symbolAccessibilityResult.accessibility !== 3 /* NotResolved */) { const errorInfo = getSymbolAccessibilityDiagnostic(symbolAccessibilityResult); if (errorInfo) { if (errorInfo.typeName) { context.addDiagnostic(createDiagnosticForNode(symbolAccessibilityResult.errorNode || errorInfo.errorNode, errorInfo.diagnosticMessage, getTextOfNode(errorInfo.typeName), symbolAccessibilityResult.errorSymbolName, symbolAccessibilityResult.errorModuleName)); } else { context.addDiagnostic(createDiagnosticForNode(symbolAccessibilityResult.errorNode || errorInfo.errorNode, errorInfo.diagnosticMessage, symbolAccessibilityResult.errorSymbolName, symbolAccessibilityResult.errorModuleName)); } return true; } } return false; } function trackSymbol(symbol, enclosingDeclaration2, meaning) { if (symbol.flags & 262144 /* TypeParameter */) return false; const issuedDiagnostic = handleSymbolAccessibilityError(resolver.isSymbolAccessible( symbol, enclosingDeclaration2, meaning, /*shouldComputeAliasToMarkVisible*/ true )); return issuedDiagnostic; } function reportPrivateInBaseOfClassExpression(propertyName) { if (errorNameNode || errorFallbackNode) { context.addDiagnostic( addRelatedInfo( createDiagnosticForNode(errorNameNode || errorFallbackNode, Diagnostics.Property_0_of_exported_anonymous_class_type_may_not_be_private_or_protected, propertyName), ...isVariableDeclaration((errorNameNode || errorFallbackNode).parent) ? [createDiagnosticForNode(errorNameNode || errorFallbackNode, Diagnostics.Add_a_type_annotation_to_the_variable_0, errorDeclarationNameWithFallback())] : [] ) ); } } function errorDeclarationNameWithFallback() { return errorNameNode ? declarationNameToString(errorNameNode) : errorFallbackNode && getNameOfDeclaration(errorFallbackNode) ? declarationNameToString(getNameOfDeclaration(errorFallbackNode)) : errorFallbackNode && isExportAssignment(errorFallbackNode) ? errorFallbackNode.isExportEquals ? "export=" : "default" : "(Missing)"; } function reportInaccessibleUniqueSymbolError() { if (errorNameNode || errorFallbackNode) { context.addDiagnostic(createDiagnosticForNode(errorNameNode || errorFallbackNode, Diagnostics.The_inferred_type_of_0_references_an_inaccessible_1_type_A_type_annotation_is_necessary, errorDeclarationNameWithFallback(), "unique symbol")); } } function reportCyclicStructureError() { if (errorNameNode || errorFallbackNode) { context.addDiagnostic(createDiagnosticForNode(errorNameNode || errorFallbackNode, Diagnostics.The_inferred_type_of_0_references_a_type_with_a_cyclic_structure_which_cannot_be_trivially_serialized_A_type_annotation_is_necessary, errorDeclarationNameWithFallback())); } } function reportInaccessibleThisError() { if (errorNameNode || errorFallbackNode) { context.addDiagnostic(createDiagnosticForNode(errorNameNode || errorFallbackNode, Diagnostics.The_inferred_type_of_0_references_an_inaccessible_1_type_A_type_annotation_is_necessary, errorDeclarationNameWithFallback(), "this")); } } function reportLikelyUnsafeImportRequiredError(specifier) { if (errorNameNode || errorFallbackNode) { context.addDiagnostic(createDiagnosticForNode(errorNameNode || errorFallbackNode, Diagnostics.The_inferred_type_of_0_cannot_be_named_without_a_reference_to_1_This_is_likely_not_portable_A_type_annotation_is_necessary, errorDeclarationNameWithFallback(), specifier)); } } function reportTruncationError() { if (errorNameNode || errorFallbackNode) { context.addDiagnostic(createDiagnosticForNode(errorNameNode || errorFallbackNode, Diagnostics.The_inferred_type_of_this_node_exceeds_the_maximum_length_the_compiler_will_serialize_An_explicit_type_annotation_is_needed)); } } function reportNonlocalAugmentation(containingFile, parentSymbol, symbol) { var _a; const primaryDeclaration = (_a = parentSymbol.declarations) == null ? void 0 : _a.find((d) => getSourceFileOfNode(d) === containingFile); const augmentingDeclarations = filter(symbol.declarations, (d) => getSourceFileOfNode(d) !== containingFile); if (primaryDeclaration && augmentingDeclarations) { for (const augmentations of augmentingDeclarations) { context.addDiagnostic(addRelatedInfo( createDiagnosticForNode(augmentations, Diagnostics.Declaration_augments_declaration_in_another_file_This_cannot_be_serialized), createDiagnosticForNode(primaryDeclaration, Diagnostics.This_is_the_declaration_being_augmented_Consider_moving_the_augmenting_declaration_into_the_same_file) )); } } } function reportNonSerializableProperty(propertyName) { if (errorNameNode || errorFallbackNode) { context.addDiagnostic(createDiagnosticForNode(errorNameNode || errorFallbackNode, Diagnostics.The_type_of_this_node_cannot_be_serialized_because_its_property_0_cannot_be_serialized, propertyName)); } } function transformDeclarationsForJS(sourceFile) { const oldDiag = getSymbolAccessibilityDiagnostic; getSymbolAccessibilityDiagnostic = (s) => s.errorNode && canProduceDiagnostics(s.errorNode) ? createGetSymbolAccessibilityDiagnosticForNode(s.errorNode)(s) : { diagnosticMessage: s.errorModuleName ? Diagnostics.Declaration_emit_for_this_file_requires_using_private_name_0_from_module_1_An_explicit_type_annotation_may_unblock_declaration_emit : Diagnostics.Declaration_emit_for_this_file_requires_using_private_name_0_An_explicit_type_annotation_may_unblock_declaration_emit, errorNode: s.errorNode || sourceFile }; const result = resolver.getDeclarationStatementsForSourceFile(sourceFile, declarationEmitNodeBuilderFlags, declarationEmitInternalNodeBuilderFlags, symbolTracker); getSymbolAccessibilityDiagnostic = oldDiag; return result; } function transformRoot(node) { if (node.kind === 308 /* SourceFile */ && node.isDeclarationFile) { return node; } if (node.kind === 309 /* Bundle */) { isBundledEmit = true; rawReferencedFiles = []; rawTypeReferenceDirectives = []; rawLibReferenceDirectives = []; let hasNoDefaultLib = false; const bundle = factory2.createBundle( map(node.sourceFiles, (sourceFile) => { if (sourceFile.isDeclarationFile) return void 0; hasNoDefaultLib = hasNoDefaultLib || sourceFile.hasNoDefaultLib; currentSourceFile = sourceFile; enclosingDeclaration = sourceFile; lateMarkedStatements = void 0; suppressNewDiagnosticContexts = false; lateStatementReplacementMap = /* @__PURE__ */ new Map(); getSymbolAccessibilityDiagnostic = throwDiagnostic; needsScopeFixMarker = false; resultHasScopeMarker = false; collectFileReferences(sourceFile); if (isExternalOrCommonJsModule(sourceFile) || isJsonSourceFile(sourceFile)) { resultHasExternalModuleIndicator = false; needsDeclare = false; const statements = isSourceFileJS(sourceFile) ? factory2.createNodeArray(transformDeclarationsForJS(sourceFile)) : visitNodes2(sourceFile.statements, visitDeclarationStatements, isStatement); const newFile = factory2.updateSourceFile( sourceFile, [factory2.createModuleDeclaration( [factory2.createModifier(138 /* DeclareKeyword */)], factory2.createStringLiteral(getResolvedExternalModuleName(context.getEmitHost(), sourceFile)), factory2.createModuleBlock(setTextRange(factory2.createNodeArray(transformAndReplaceLatePaintedStatements(statements)), sourceFile.statements)) )], /*isDeclarationFile*/ true, /*referencedFiles*/ [], /*typeReferences*/ [], /*hasNoDefaultLib*/ false, /*libReferences*/ [] ); return newFile; } needsDeclare = true; const updated = isSourceFileJS(sourceFile) ? factory2.createNodeArray(transformDeclarationsForJS(sourceFile)) : visitNodes2(sourceFile.statements, visitDeclarationStatements, isStatement); return factory2.updateSourceFile( sourceFile, transformAndReplaceLatePaintedStatements(updated), /*isDeclarationFile*/ true, /*referencedFiles*/ [], /*typeReferences*/ [], /*hasNoDefaultLib*/ false, /*libReferences*/ [] ); }) ); const outputFilePath2 = getDirectoryPath(normalizeSlashes(getOutputPathsFor( node, host, /*forceDtsPaths*/ true ).declarationFilePath)); bundle.syntheticFileReferences = getReferencedFiles(outputFilePath2); bundle.syntheticTypeReferences = getTypeReferences(); bundle.syntheticLibReferences = getLibReferences(); bundle.hasNoDefaultLib = hasNoDefaultLib; return bundle; } needsDeclare = true; needsScopeFixMarker = false; resultHasScopeMarker = false; enclosingDeclaration = node; currentSourceFile = node; getSymbolAccessibilityDiagnostic = throwDiagnostic; isBundledEmit = false; resultHasExternalModuleIndicator = false; suppressNewDiagnosticContexts = false; lateMarkedStatements = void 0; lateStatementReplacementMap = /* @__PURE__ */ new Map(); rawReferencedFiles = []; rawTypeReferenceDirectives = []; rawLibReferenceDirectives = []; collectFileReferences(currentSourceFile); let combinedStatements; if (isSourceFileJS(currentSourceFile)) { combinedStatements = factory2.createNodeArray(transformDeclarationsForJS(node)); } else { const statements = visitNodes2(node.statements, visitDeclarationStatements, isStatement); combinedStatements = setTextRange(factory2.createNodeArray(transformAndReplaceLatePaintedStatements(statements)), node.statements); if (isExternalModule(node) && (!resultHasExternalModuleIndicator || needsScopeFixMarker && !resultHasScopeMarker)) { combinedStatements = setTextRange(factory2.createNodeArray([...combinedStatements, createEmptyExports(factory2)]), combinedStatements); } } const outputFilePath = getDirectoryPath(normalizeSlashes(getOutputPathsFor( node, host, /*forceDtsPaths*/ true ).declarationFilePath)); return factory2.updateSourceFile( node, combinedStatements, /*isDeclarationFile*/ true, getReferencedFiles(outputFilePath), getTypeReferences(), node.hasNoDefaultLib, getLibReferences() ); function collectFileReferences(sourceFile) { rawReferencedFiles = concatenate(rawReferencedFiles, map(sourceFile.referencedFiles, (f) => [sourceFile, f])); rawTypeReferenceDirectives = concatenate(rawTypeReferenceDirectives, sourceFile.typeReferenceDirectives); rawLibReferenceDirectives = concatenate(rawLibReferenceDirectives, sourceFile.libReferenceDirectives); } function copyFileReferenceAsSynthetic(ref) { const newRef = { ...ref }; newRef.pos = -1; newRef.end = -1; return newRef; } function getTypeReferences() { return mapDefined(rawTypeReferenceDirectives, (ref) => { if (!ref.preserve) return void 0; return copyFileReferenceAsSynthetic(ref); }); } function getLibReferences() { return mapDefined(rawLibReferenceDirectives, (ref) => { if (!ref.preserve) return void 0; return copyFileReferenceAsSynthetic(ref); }); } function getReferencedFiles(outputFilePath2) { return mapDefined(rawReferencedFiles, ([sourceFile, ref]) => { if (!ref.preserve) return void 0; const file = host.getSourceFileFromReference(sourceFile, ref); if (!file) { return void 0; } let declFileName; if (file.isDeclarationFile) { declFileName = file.fileName; } else { if (isBundledEmit && contains(node.sourceFiles, file)) return; const paths = getOutputPathsFor( file, host, /*forceDtsPaths*/ true ); declFileName = paths.declarationFilePath || paths.jsFilePath || file.fileName; } if (!declFileName) return void 0; const fileName = getRelativePathToDirectoryOrUrl( outputFilePath2, declFileName, host.getCurrentDirectory(), host.getCanonicalFileName, /*isAbsolutePathAnUrl*/ false ); const newRef = copyFileReferenceAsSynthetic(ref); newRef.fileName = fileName; return newRef; }); } } function filterBindingPatternInitializers(name) { if (name.kind === 80 /* Identifier */) { return name; } else { if (name.kind === 208 /* ArrayBindingPattern */) { return factory2.updateArrayBindingPattern(name, visitNodes2(name.elements, visitBindingElement, isArrayBindingElement)); } else { return factory2.updateObjectBindingPattern(name, visitNodes2(name.elements, visitBindingElement, isBindingElement)); } } function visitBindingElement(elem) { if (elem.kind === 233 /* OmittedExpression */) { return elem; } if (elem.propertyName && isComputedPropertyName(elem.propertyName) && isEntityNameExpression(elem.propertyName.expression)) { checkEntityNameVisibility(elem.propertyName.expression, enclosingDeclaration); } return factory2.updateBindingElement( elem, elem.dotDotDotToken, elem.propertyName, filterBindingPatternInitializers(elem.name), /*initializer*/ void 0 ); } } function ensureParameter(p, modifierMask) { let oldDiag; if (!suppressNewDiagnosticContexts) { oldDiag = getSymbolAccessibilityDiagnostic; getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(p); } const newParam = factory2.updateParameterDeclaration( p, maskModifiers(factory2, p, modifierMask), p.dotDotDotToken, filterBindingPatternInitializers(p.name), resolver.isOptionalParameter(p) ? p.questionToken || factory2.createToken(58 /* QuestionToken */) : void 0, ensureType( p, /*ignorePrivate*/ true ), // Ignore private param props, since this type is going straight back into a param ensureNoInitializer(p) ); if (!suppressNewDiagnosticContexts) { getSymbolAccessibilityDiagnostic = oldDiag; } return newParam; } function shouldPrintWithInitializer(node) { return canHaveLiteralInitializer(node) && !!node.initializer && resolver.isLiteralConstDeclaration(getParseTreeNode(node)); } function ensureNoInitializer(node) { if (shouldPrintWithInitializer(node)) { const unwrappedInitializer = unwrapParenthesizedExpression(node.initializer); if (!isPrimitiveLiteralValue(unwrappedInitializer)) { reportInferenceFallback(node); } return resolver.createLiteralConstValue(getParseTreeNode(node, canHaveLiteralInitializer), symbolTracker); } return void 0; } function ensureType(node, ignorePrivate) { if (!ignorePrivate && hasEffectiveModifier(node, 2 /* Private */)) { return; } if (shouldPrintWithInitializer(node)) { return; } if (!isExportAssignment(node) && !isBindingElement(node) && node.type && (!isParameter(node) || !resolver.requiresAddingImplicitUndefined(node, enclosingDeclaration))) { return visitNode(node.type, visitDeclarationSubtree, isTypeNode); } const oldErrorNameNode = errorNameNode; errorNameNode = node.name; let oldDiag; if (!suppressNewDiagnosticContexts) { oldDiag = getSymbolAccessibilityDiagnostic; if (canProduceDiagnostics(node)) { getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(node); } } let typeNode; if (hasInferredType(node)) { typeNode = resolver.createTypeOfDeclaration(node, enclosingDeclaration, declarationEmitNodeBuilderFlags, declarationEmitInternalNodeBuilderFlags, symbolTracker); } else if (isFunctionLike(node)) { typeNode = resolver.createReturnTypeOfSignatureDeclaration(node, enclosingDeclaration, declarationEmitNodeBuilderFlags, declarationEmitInternalNodeBuilderFlags, symbolTracker); } else { Debug.assertNever(node); } errorNameNode = oldErrorNameNode; if (!suppressNewDiagnosticContexts) { getSymbolAccessibilityDiagnostic = oldDiag; } return typeNode ?? factory2.createKeywordTypeNode(133 /* AnyKeyword */); } function isDeclarationAndNotVisible(node) { node = getParseTreeNode(node); switch (node.kind) { case 263 /* FunctionDeclaration */: case 268 /* ModuleDeclaration */: case 265 /* InterfaceDeclaration */: case 264 /* ClassDeclaration */: case 266 /* TypeAliasDeclaration */: case 267 /* EnumDeclaration */: return !resolver.isDeclarationVisible(node); // The following should be doing their own visibility checks based on filtering their members case 261 /* VariableDeclaration */: return !getBindingNameVisible(node); case 272 /* ImportEqualsDeclaration */: case 273 /* ImportDeclaration */: case 279 /* ExportDeclaration */: case 278 /* ExportAssignment */: return false; case 176 /* ClassStaticBlockDeclaration */: return true; } return false; } function shouldEmitFunctionProperties(input) { var _a; if (input.body) { return true; } const overloadSignatures = (_a = input.symbol.declarations) == null ? void 0 : _a.filter((decl) => isFunctionDeclaration(decl) && !decl.body); return !overloadSignatures || overloadSignatures.indexOf(input) === overloadSignatures.length - 1; } function getBindingNameVisible(elem) { if (isOmittedExpression(elem)) { return false; } if (isBindingPattern(elem.name)) { return some(elem.name.elements, getBindingNameVisible); } else { return resolver.isDeclarationVisible(elem); } } function updateParamsList(node, params, modifierMask) { if (hasEffectiveModifier(node, 2 /* Private */)) { return factory2.createNodeArray(); } const newParams = map(params, (p) => ensureParameter(p, modifierMask)); if (!newParams) { return factory2.createNodeArray(); } return factory2.createNodeArray(newParams, params.hasTrailingComma); } function updateAccessorParamsList(input, isPrivate) { let newParams; if (!isPrivate) { const thisParameter = getThisParameter(input); if (thisParameter) { newParams = [ensureParameter(thisParameter)]; } } if (isSetAccessorDeclaration(input)) { let newValueParameter; if (!isPrivate) { const valueParameter = getSetAccessorValueParameter(input); if (valueParameter) { newValueParameter = ensureParameter(valueParameter); } } if (!newValueParameter) { newValueParameter = factory2.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, "value" ); } newParams = append(newParams, newValueParameter); } return factory2.createNodeArray(newParams || emptyArray); } function ensureTypeParams(node, params) { return hasEffectiveModifier(node, 2 /* Private */) ? void 0 : visitNodes2(params, visitDeclarationSubtree, isTypeParameterDeclaration); } function isEnclosingDeclaration(node) { return isSourceFile(node) || isTypeAliasDeclaration(node) || isModuleDeclaration(node) || isClassDeclaration(node) || isInterfaceDeclaration(node) || isFunctionLike(node) || isIndexSignatureDeclaration(node) || isMappedTypeNode(node); } function checkEntityNameVisibility(entityName, enclosingDeclaration2) { const visibilityResult = resolver.isEntityNameVisible(entityName, enclosingDeclaration2); handleSymbolAccessibilityError(visibilityResult); } function preserveJsDoc(updated, original) { if (hasJSDocNodes(updated) && hasJSDocNodes(original)) { updated.jsDoc = original.jsDoc; } return setCommentRange(updated, getCommentRange(original)); } function rewriteModuleSpecifier2(parent, input) { if (!input) return void 0; resultHasExternalModuleIndicator = resultHasExternalModuleIndicator || parent.kind !== 268 /* ModuleDeclaration */ && parent.kind !== 206 /* ImportType */; if (isStringLiteralLike(input)) { if (isBundledEmit) { const newName = getExternalModuleNameFromDeclaration(context.getEmitHost(), resolver, parent); if (newName) { return factory2.createStringLiteral(newName); } } } return input; } function transformImportEqualsDeclaration(decl) { if (!resolver.isDeclarationVisible(decl)) return; if (decl.moduleReference.kind === 284 /* ExternalModuleReference */) { const specifier = getExternalModuleImportEqualsDeclarationExpression(decl); return factory2.updateImportEqualsDeclaration( decl, decl.modifiers, decl.isTypeOnly, decl.name, factory2.updateExternalModuleReference(decl.moduleReference, rewriteModuleSpecifier2(decl, specifier)) ); } else { const oldDiag = getSymbolAccessibilityDiagnostic; getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(decl); checkEntityNameVisibility(decl.moduleReference, enclosingDeclaration); getSymbolAccessibilityDiagnostic = oldDiag; return decl; } } function transformImportDeclaration(decl) { if (!decl.importClause) { return factory2.updateImportDeclaration( decl, decl.modifiers, decl.importClause, rewriteModuleSpecifier2(decl, decl.moduleSpecifier), tryGetResolutionModeOverride(decl.attributes) ); } const phaseModifier = decl.importClause.phaseModifier === 166 /* DeferKeyword */ ? void 0 : decl.importClause.phaseModifier; const visibleDefaultBinding = decl.importClause && decl.importClause.name && resolver.isDeclarationVisible(decl.importClause) ? decl.importClause.name : void 0; if (!decl.importClause.namedBindings) { return visibleDefaultBinding && factory2.updateImportDeclaration( decl, decl.modifiers, factory2.updateImportClause( decl.importClause, phaseModifier, visibleDefaultBinding, /*namedBindings*/ void 0 ), rewriteModuleSpecifier2(decl, decl.moduleSpecifier), tryGetResolutionModeOverride(decl.attributes) ); } if (decl.importClause.namedBindings.kind === 275 /* NamespaceImport */) { const namedBindings = resolver.isDeclarationVisible(decl.importClause.namedBindings) ? decl.importClause.namedBindings : ( /*namedBindings*/ void 0 ); return visibleDefaultBinding || namedBindings ? factory2.updateImportDeclaration( decl, decl.modifiers, factory2.updateImportClause( decl.importClause, phaseModifier, visibleDefaultBinding, namedBindings ), rewriteModuleSpecifier2(decl, decl.moduleSpecifier), tryGetResolutionModeOverride(decl.attributes) ) : void 0; } const bindingList = mapDefined(decl.importClause.namedBindings.elements, (b) => resolver.isDeclarationVisible(b) ? b : void 0); if (bindingList && bindingList.length || visibleDefaultBinding) { return factory2.updateImportDeclaration( decl, decl.modifiers, factory2.updateImportClause( decl.importClause, phaseModifier, visibleDefaultBinding, bindingList && bindingList.length ? factory2.updateNamedImports(decl.importClause.namedBindings, bindingList) : void 0 ), rewriteModuleSpecifier2(decl, decl.moduleSpecifier), tryGetResolutionModeOverride(decl.attributes) ); } if (resolver.isImportRequiredByAugmentation(decl)) { if (isolatedDeclarations) { context.addDiagnostic(createDiagnosticForNode(decl, Diagnostics.Declaration_emit_for_this_file_requires_preserving_this_import_for_augmentations_This_is_not_supported_with_isolatedDeclarations)); } return factory2.updateImportDeclaration( decl, decl.modifiers, /*importClause*/ void 0, rewriteModuleSpecifier2(decl, decl.moduleSpecifier), tryGetResolutionModeOverride(decl.attributes) ); } } function tryGetResolutionModeOverride(node) { const mode = getResolutionModeOverride(node); return node && mode !== void 0 ? node : void 0; } function transformAndReplaceLatePaintedStatements(statements) { while (length(lateMarkedStatements)) { const i = lateMarkedStatements.shift(); if (!isLateVisibilityPaintedStatement(i)) { return Debug.fail(`Late replaced statement was found which is not handled by the declaration transformer!: ${Debug.formatSyntaxKind(i.kind)}`); } const priorNeedsDeclare = needsDeclare; needsDeclare = i.parent && isSourceFile(i.parent) && !(isExternalModule(i.parent) && isBundledEmit); const result = transformTopLevelDeclaration(i); needsDeclare = priorNeedsDeclare; lateStatementReplacementMap.set(getOriginalNodeId(i), result); } return visitNodes2(statements, visitLateVisibilityMarkedStatements, isStatement); function visitLateVisibilityMarkedStatements(statement) { if (isLateVisibilityPaintedStatement(statement)) { const key = getOriginalNodeId(statement); if (lateStatementReplacementMap.has(key)) { const result = lateStatementReplacementMap.get(key); lateStatementReplacementMap.delete(key); if (result) { if (isArray(result) ? some(result, needsScopeMarker) : needsScopeMarker(result)) { needsScopeFixMarker = true; } if (isSourceFile(statement.parent) && (isArray(result) ? some(result, isExternalModuleIndicator) : isExternalModuleIndicator(result))) { resultHasExternalModuleIndicator = true; } } return result; } } return statement; } } function visitDeclarationSubtree(input) { if (shouldStripInternal(input)) return; if (isDeclaration(input)) { if (isDeclarationAndNotVisible(input)) return; if (hasDynamicName(input)) { if (isolatedDeclarations) { if (!resolver.isDefinitelyReferenceToGlobalSymbolObject(input.name.expression)) { if (isClassDeclaration(input.parent) || isObjectLiteralExpression(input.parent)) { context.addDiagnostic(createDiagnosticForNode(input, Diagnostics.Computed_property_names_on_class_or_object_literals_cannot_be_inferred_with_isolatedDeclarations)); return; } else if ( // Type declarations just need to double-check that the input computed name is an entity name expression (isInterfaceDeclaration(input.parent) || isTypeLiteralNode(input.parent)) && !isEntityNameExpression(input.name.expression) ) { context.addDiagnostic(createDiagnosticForNode(input, Diagnostics.Computed_properties_must_be_number_or_string_literals_variables_or_dotted_expressions_with_isolatedDeclarations)); return; } } } else if (!resolver.isLateBound(getParseTreeNode(input)) || !isEntityNameExpression(input.name.expression)) { return; } } } if (isFunctionLike(input) && resolver.isImplementationOfOverload(input)) return; if (isSemicolonClassElement(input)) return; let previousEnclosingDeclaration; if (isEnclosingDeclaration(input)) { previousEnclosingDeclaration = enclosingDeclaration; enclosingDeclaration = input; } const oldDiag = getSymbolAccessibilityDiagnostic; const canProduceDiagnostic = canProduceDiagnostics(input); const oldWithinObjectLiteralType = suppressNewDiagnosticContexts; let shouldEnterSuppressNewDiagnosticsContextContext = (input.kind === 188 /* TypeLiteral */ || input.kind === 201 /* MappedType */) && input.parent.kind !== 266 /* TypeAliasDeclaration */; if (isMethodDeclaration(input) || isMethodSignature(input)) { if (hasEffectiveModifier(input, 2 /* Private */)) { if (input.symbol && input.symbol.declarations && input.symbol.declarations[0] !== input) return; return cleanup(factory2.createPropertyDeclaration( ensureModifiers(input), input.name, /*questionOrExclamationToken*/ void 0, /*type*/ void 0, /*initializer*/ void 0 )); } } if (canProduceDiagnostic && !suppressNewDiagnosticContexts) { getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(input); } if (isTypeQueryNode(input)) { checkEntityNameVisibility(input.exprName, enclosingDeclaration); } if (shouldEnterSuppressNewDiagnosticsContextContext) { suppressNewDiagnosticContexts = true; } if (isProcessedComponent(input)) { switch (input.kind) { case 234 /* ExpressionWithTypeArguments */: { if (isEntityName(input.expression) || isEntityNameExpression(input.expression)) { checkEntityNameVisibility(input.expression, enclosingDeclaration); } const node = visitEachChild(input, visitDeclarationSubtree, context); return cleanup(factory2.updateExpressionWithTypeArguments(node, node.expression, node.typeArguments)); } case 184 /* TypeReference */: { checkEntityNameVisibility(input.typeName, enclosingDeclaration); const node = visitEachChild(input, visitDeclarationSubtree, context); return cleanup(factory2.updateTypeReferenceNode(node, node.typeName, node.typeArguments)); } case 181 /* ConstructSignature */: return cleanup(factory2.updateConstructSignature( input, ensureTypeParams(input, input.typeParameters), updateParamsList(input, input.parameters), ensureType(input) )); case 177 /* Constructor */: { const ctor = factory2.createConstructorDeclaration( /*modifiers*/ ensureModifiers(input), updateParamsList(input, input.parameters, 0 /* None */), /*body*/ void 0 ); return cleanup(ctor); } case 175 /* MethodDeclaration */: { if (isPrivateIdentifier(input.name)) { return cleanup( /*returnValue*/ void 0 ); } const sig = factory2.createMethodDeclaration( ensureModifiers(input), /*asteriskToken*/ void 0, input.name, input.questionToken, ensureTypeParams(input, input.typeParameters), updateParamsList(input, input.parameters), ensureType(input), /*body*/ void 0 ); return cleanup(sig); } case 178 /* GetAccessor */: { if (isPrivateIdentifier(input.name)) { return cleanup( /*returnValue*/ void 0 ); } return cleanup(factory2.updateGetAccessorDeclaration( input, ensureModifiers(input), input.name, updateAccessorParamsList(input, hasEffectiveModifier(input, 2 /* Private */)), ensureType(input), /*body*/ void 0 )); } case 179 /* SetAccessor */: { if (isPrivateIdentifier(input.name)) { return cleanup( /*returnValue*/ void 0 ); } return cleanup(factory2.updateSetAccessorDeclaration( input, ensureModifiers(input), input.name, updateAccessorParamsList(input, hasEffectiveModifier(input, 2 /* Private */)), /*body*/ void 0 )); } case 173 /* PropertyDeclaration */: if (isPrivateIdentifier(input.name)) { return cleanup( /*returnValue*/ void 0 ); } return cleanup(factory2.updatePropertyDeclaration( input, ensureModifiers(input), input.name, input.questionToken, ensureType(input), ensureNoInitializer(input) )); case 172 /* PropertySignature */: if (isPrivateIdentifier(input.name)) { return cleanup( /*returnValue*/ void 0 ); } return cleanup(factory2.updatePropertySignature( input, ensureModifiers(input), input.name, input.questionToken, ensureType(input) )); case 174 /* MethodSignature */: { if (isPrivateIdentifier(input.name)) { return cleanup( /*returnValue*/ void 0 ); } return cleanup(factory2.updateMethodSignature( input, ensureModifiers(input), input.name, input.questionToken, ensureTypeParams(input, input.typeParameters), updateParamsList(input, input.parameters), ensureType(input) )); } case 180 /* CallSignature */: { return cleanup( factory2.updateCallSignature( input, ensureTypeParams(input, input.typeParameters), updateParamsList(input, input.parameters), ensureType(input) ) ); } case 182 /* IndexSignature */: { return cleanup(factory2.updateIndexSignature( input, ensureModifiers(input), updateParamsList(input, input.parameters), visitNode(input.type, visitDeclarationSubtree, isTypeNode) || factory2.createKeywordTypeNode(133 /* AnyKeyword */) )); } case 261 /* VariableDeclaration */: { if (isBindingPattern(input.name)) { return recreateBindingPattern(input.name); } shouldEnterSuppressNewDiagnosticsContextContext = true; suppressNewDiagnosticContexts = true; return cleanup(factory2.updateVariableDeclaration( input, input.name, /*exclamationToken*/ void 0, ensureType(input), ensureNoInitializer(input) )); } case 169 /* TypeParameter */: { if (isPrivateMethodTypeParameter(input) && (input.default || input.constraint)) { return cleanup(factory2.updateTypeParameterDeclaration( input, input.modifiers, input.name, /*constraint*/ void 0, /*defaultType*/ void 0 )); } return cleanup(visitEachChild(input, visitDeclarationSubtree, context)); } case 195 /* ConditionalType */: { const checkType = visitNode(input.checkType, visitDeclarationSubtree, isTypeNode); const extendsType = visitNode(input.extendsType, visitDeclarationSubtree, isTypeNode); const oldEnclosingDecl = enclosingDeclaration; enclosingDeclaration = input.trueType; const trueType = visitNode(input.trueType, visitDeclarationSubtree, isTypeNode); enclosingDeclaration = oldEnclosingDecl; const falseType = visitNode(input.falseType, visitDeclarationSubtree, isTypeNode); Debug.assert(checkType); Debug.assert(extendsType); Debug.assert(trueType); Debug.assert(falseType); return cleanup(factory2.updateConditionalTypeNode(input, checkType, extendsType, trueType, falseType)); } case 185 /* FunctionType */: { return cleanup(factory2.updateFunctionTypeNode( input, visitNodes2(input.typeParameters, visitDeclarationSubtree, isTypeParameterDeclaration), updateParamsList(input, input.parameters), Debug.checkDefined(visitNode(input.type, visitDeclarationSubtree, isTypeNode)) )); } case 186 /* ConstructorType */: { return cleanup(factory2.updateConstructorTypeNode( input, ensureModifiers(input), visitNodes2(input.typeParameters, visitDeclarationSubtree, isTypeParameterDeclaration), updateParamsList(input, input.parameters), Debug.checkDefined(visitNode(input.type, visitDeclarationSubtree, isTypeNode)) )); } case 206 /* ImportType */: { if (!isLiteralImportTypeNode(input)) return cleanup(input); return cleanup(factory2.updateImportTypeNode( input, factory2.updateLiteralTypeNode(input.argument, rewriteModuleSpecifier2(input, input.argument.literal)), input.attributes, input.qualifier, visitNodes2(input.typeArguments, visitDeclarationSubtree, isTypeNode), input.isTypeOf )); } default: Debug.assertNever(input, `Attempted to process unhandled node kind: ${Debug.formatSyntaxKind(input.kind)}`); } } if (isTupleTypeNode(input) && getLineAndCharacterOfPosition(currentSourceFile, input.pos).line === getLineAndCharacterOfPosition(currentSourceFile, input.end).line) { setEmitFlags(input, 1 /* SingleLine */); } return cleanup(visitEachChild(input, visitDeclarationSubtree, context)); function cleanup(returnValue) { if (returnValue && canProduceDiagnostic && hasDynamicName(input)) { checkName(input); } if (isEnclosingDeclaration(input)) { enclosingDeclaration = previousEnclosingDeclaration; } if (canProduceDiagnostic && !suppressNewDiagnosticContexts) { getSymbolAccessibilityDiagnostic = oldDiag; } if (shouldEnterSuppressNewDiagnosticsContextContext) { suppressNewDiagnosticContexts = oldWithinObjectLiteralType; } if (returnValue === input) { return returnValue; } return returnValue && setOriginalNode(preserveJsDoc(returnValue, input), input); } } function isPrivateMethodTypeParameter(node) { return node.parent.kind === 175 /* MethodDeclaration */ && hasEffectiveModifier(node.parent, 2 /* Private */); } function visitDeclarationStatements(input) { if (!isPreservedDeclarationStatement(input)) { return; } if (shouldStripInternal(input)) return; switch (input.kind) { case 279 /* ExportDeclaration */: { if (isSourceFile(input.parent)) { resultHasExternalModuleIndicator = true; } resultHasScopeMarker = true; return factory2.updateExportDeclaration( input, input.modifiers, input.isTypeOnly, input.exportClause, rewriteModuleSpecifier2(input, input.moduleSpecifier), tryGetResolutionModeOverride(input.attributes) ); } case 278 /* ExportAssignment */: { if (isSourceFile(input.parent)) { resultHasExternalModuleIndicator = true; } resultHasScopeMarker = true; if (input.expression.kind === 80 /* Identifier */) { return input; } else { const newId = factory2.createUniqueName("_default", 16 /* Optimistic */); getSymbolAccessibilityDiagnostic = () => ({ diagnosticMessage: Diagnostics.Default_export_of_the_module_has_or_is_using_private_name_0, errorNode: input }); errorFallbackNode = input; const type = ensureType(input); const varDecl = factory2.createVariableDeclaration( newId, /*exclamationToken*/ void 0, type, /*initializer*/ void 0 ); errorFallbackNode = void 0; const statement = factory2.createVariableStatement(needsDeclare ? [factory2.createModifier(138 /* DeclareKeyword */)] : [], factory2.createVariableDeclarationList([varDecl], 2 /* Const */)); preserveJsDoc(statement, input); removeAllComments(input); return [statement, factory2.updateExportAssignment(input, input.modifiers, newId)]; } } } const result = transformTopLevelDeclaration(input); lateStatementReplacementMap.set(getOriginalNodeId(input), result); return input; } function stripExportModifiers(statement) { if (isImportEqualsDeclaration(statement) || hasEffectiveModifier(statement, 2048 /* Default */) || !canHaveModifiers(statement)) { return statement; } const modifiers = factory2.createModifiersFromModifierFlags(getEffectiveModifierFlags(statement) & (131071 /* All */ ^ 32 /* Export */)); return factory2.replaceModifiers(statement, modifiers); } function updateModuleDeclarationAndKeyword(node, modifiers, name, body) { const updated = factory2.updateModuleDeclaration(node, modifiers, name, body); if (isAmbientModule(updated) || updated.flags & 32 /* Namespace */) { return updated; } const fixed = factory2.createModuleDeclaration( updated.modifiers, updated.name, updated.body, updated.flags | 32 /* Namespace */ ); setOriginalNode(fixed, updated); setTextRange(fixed, updated); return fixed; } function transformTopLevelDeclaration(input) { if (lateMarkedStatements) { while (orderedRemoveItem(lateMarkedStatements, input)) ; } if (shouldStripInternal(input)) return; switch (input.kind) { case 272 /* ImportEqualsDeclaration */: { return transformImportEqualsDeclaration(input); } case 273 /* ImportDeclaration */: { return transformImportDeclaration(input); } } if (isDeclaration(input) && isDeclarationAndNotVisible(input)) return; if (isJSDocImportTag(input)) return; if (isFunctionLike(input) && resolver.isImplementationOfOverload(input)) return; let previousEnclosingDeclaration; if (isEnclosingDeclaration(input)) { previousEnclosingDeclaration = enclosingDeclaration; enclosingDeclaration = input; } const canProdiceDiagnostic = canProduceDiagnostics(input); const oldDiag = getSymbolAccessibilityDiagnostic; if (canProdiceDiagnostic) { getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(input); } const previousNeedsDeclare = needsDeclare; switch (input.kind) { case 266 /* TypeAliasDeclaration */: { needsDeclare = false; const clean2 = cleanup(factory2.updateTypeAliasDeclaration( input, ensureModifiers(input), input.name, visitNodes2(input.typeParameters, visitDeclarationSubtree, isTypeParameterDeclaration), Debug.checkDefined(visitNode(input.type, visitDeclarationSubtree, isTypeNode)) )); needsDeclare = previousNeedsDeclare; return clean2; } case 265 /* InterfaceDeclaration */: { return cleanup(factory2.updateInterfaceDeclaration( input, ensureModifiers(input), input.name, ensureTypeParams(input, input.typeParameters), transformHeritageClauses(input.heritageClauses), visitNodes2(input.members, visitDeclarationSubtree, isTypeElement) )); } case 263 /* FunctionDeclaration */: { const clean2 = cleanup(factory2.updateFunctionDeclaration( input, ensureModifiers(input), /*asteriskToken*/ void 0, input.name, ensureTypeParams(input, input.typeParameters), updateParamsList(input, input.parameters), ensureType(input), /*body*/ void 0 )); if (clean2 && resolver.isExpandoFunctionDeclaration(input) && shouldEmitFunctionProperties(input)) { const props = resolver.getPropertiesOfContainerFunction(input); if (isolatedDeclarations) { reportExpandoFunctionErrors(input); } const fakespace = parseNodeFactory.createModuleDeclaration( /*modifiers*/ void 0, clean2.name || factory2.createIdentifier("_default"), factory2.createModuleBlock([]), 32 /* Namespace */ ); setParent(fakespace, enclosingDeclaration); fakespace.locals = createSymbolTable(props); fakespace.symbol = props[0].parent; const exportMappings = []; let declarations = mapDefined(props, (p) => { if (!isExpandoPropertyDeclaration(p.valueDeclaration)) { return void 0; } const nameStr = unescapeLeadingUnderscores(p.escapedName); if (!isIdentifierText(nameStr, 99 /* ESNext */)) { return void 0; } getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(p.valueDeclaration); const type = resolver.createTypeOfDeclaration(p.valueDeclaration, fakespace, declarationEmitNodeBuilderFlags, declarationEmitInternalNodeBuilderFlags | 2 /* NoSyntacticPrinter */, symbolTracker); getSymbolAccessibilityDiagnostic = oldDiag; const isNonContextualKeywordName = isStringANonContextualKeyword(nameStr); const name = isNonContextualKeywordName ? factory2.getGeneratedNameForNode(p.valueDeclaration) : factory2.createIdentifier(nameStr); if (isNonContextualKeywordName) { exportMappings.push([name, nameStr]); } const varDecl = factory2.createVariableDeclaration( name, /*exclamationToken*/ void 0, type, /*initializer*/ void 0 ); return factory2.createVariableStatement(isNonContextualKeywordName ? void 0 : [factory2.createToken(95 /* ExportKeyword */)], factory2.createVariableDeclarationList([varDecl])); }); if (!exportMappings.length) { declarations = mapDefined(declarations, (declaration) => factory2.replaceModifiers(declaration, 0 /* None */)); } else { declarations.push(factory2.createExportDeclaration( /*modifiers*/ void 0, /*isTypeOnly*/ false, factory2.createNamedExports(map(exportMappings, ([gen, exp]) => { return factory2.createExportSpecifier( /*isTypeOnly*/ false, gen, exp ); })) )); } const namespaceDecl = factory2.createModuleDeclaration(ensureModifiers(input), input.name, factory2.createModuleBlock(declarations), 32 /* Namespace */); if (!hasEffectiveModifier(clean2, 2048 /* Default */)) { return [clean2, namespaceDecl]; } const modifiers = factory2.createModifiersFromModifierFlags(getEffectiveModifierFlags(clean2) & ~2080 /* ExportDefault */ | 128 /* Ambient */); const cleanDeclaration = factory2.updateFunctionDeclaration( clean2, modifiers, /*asteriskToken*/ void 0, clean2.name, clean2.typeParameters, clean2.parameters, clean2.type, /*body*/ void 0 ); const namespaceDeclaration = factory2.updateModuleDeclaration( namespaceDecl, modifiers, namespaceDecl.name, namespaceDecl.body ); const exportDefaultDeclaration = factory2.createExportAssignment( /*modifiers*/ void 0, /*isExportEquals*/ false, namespaceDecl.name ); if (isSourceFile(input.parent)) { resultHasExternalModuleIndicator = true; } resultHasScopeMarker = true; return [cleanDeclaration, namespaceDeclaration, exportDefaultDeclaration]; } else { return clean2; } } case 268 /* ModuleDeclaration */: { needsDeclare = false; const inner = input.body; if (inner && inner.kind === 269 /* ModuleBlock */) { const oldNeedsScopeFix = needsScopeFixMarker; const oldHasScopeFix = resultHasScopeMarker; resultHasScopeMarker = false; needsScopeFixMarker = false; const statements = visitNodes2(inner.statements, visitDeclarationStatements, isStatement); let lateStatements = transformAndReplaceLatePaintedStatements(statements); if (input.flags & 33554432 /* Ambient */) { needsScopeFixMarker = false; } if (!isGlobalScopeAugmentation(input) && !hasScopeMarker2(lateStatements) && !resultHasScopeMarker) { if (needsScopeFixMarker) { lateStatements = factory2.createNodeArray([...lateStatements, createEmptyExports(factory2)]); } else { lateStatements = visitNodes2(lateStatements, stripExportModifiers, isStatement); } } const body = factory2.updateModuleBlock(inner, lateStatements); needsDeclare = previousNeedsDeclare; needsScopeFixMarker = oldNeedsScopeFix; resultHasScopeMarker = oldHasScopeFix; const mods = ensureModifiers(input); return cleanup(updateModuleDeclarationAndKeyword( input, mods, isExternalModuleAugmentation(input) ? rewriteModuleSpecifier2(input, input.name) : input.name, body )); } else { needsDeclare = previousNeedsDeclare; const mods = ensureModifiers(input); needsDeclare = false; visitNode(inner, visitDeclarationStatements); const id = getOriginalNodeId(inner); const body = lateStatementReplacementMap.get(id); lateStatementReplacementMap.delete(id); return cleanup(updateModuleDeclarationAndKeyword( input, mods, input.name, body )); } } case 264 /* ClassDeclaration */: { errorNameNode = input.name; errorFallbackNode = input; const modifiers = factory2.createNodeArray(ensureModifiers(input)); const typeParameters = ensureTypeParams(input, input.typeParameters); const ctor = getFirstConstructorWithBody(input); let parameterProperties; if (ctor) { const oldDiag2 = getSymbolAccessibilityDiagnostic; parameterProperties = compact(flatMap(ctor.parameters, (param) => { if (!hasSyntacticModifier(param, 31 /* ParameterPropertyModifier */) || shouldStripInternal(param)) return; getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(param); if (param.name.kind === 80 /* Identifier */) { return preserveJsDoc( factory2.createPropertyDeclaration( ensureModifiers(param), param.name, param.questionToken, ensureType(param), ensureNoInitializer(param) ), param ); } else { return walkBindingPattern(param.name); } function walkBindingPattern(pattern) { let elems; for (const elem of pattern.elements) { if (isOmittedExpression(elem)) continue; if (isBindingPattern(elem.name)) { elems = concatenate(elems, walkBindingPattern(elem.name)); } elems = elems || []; elems.push(factory2.createPropertyDeclaration( ensureModifiers(param), elem.name, /*questionOrExclamationToken*/ void 0, ensureType(elem), /*initializer*/ void 0 )); } return elems; } })); getSymbolAccessibilityDiagnostic = oldDiag2; } const hasPrivateIdentifier = some(input.members, (member) => !!member.name && isPrivateIdentifier(member.name)); const privateIdentifier = hasPrivateIdentifier ? [ factory2.createPropertyDeclaration( /*modifiers*/ void 0, factory2.createPrivateIdentifier("#private"), /*questionOrExclamationToken*/ void 0, /*type*/ void 0, /*initializer*/ void 0 ) ] : void 0; const lateIndexes = resolver.createLateBoundIndexSignatures(input, enclosingDeclaration, declarationEmitNodeBuilderFlags, declarationEmitInternalNodeBuilderFlags, symbolTracker); const memberNodes = concatenate(concatenate(concatenate(privateIdentifier, lateIndexes), parameterProperties), visitNodes2(input.members, visitDeclarationSubtree, isClassElement)); const members = factory2.createNodeArray(memberNodes); const extendsClause = getEffectiveBaseTypeNode(input); if (extendsClause && !isEntityNameExpression(extendsClause.expression) && extendsClause.expression.kind !== 106 /* NullKeyword */) { const oldId = input.name ? unescapeLeadingUnderscores(input.name.escapedText) : "default"; const newId = factory2.createUniqueName(`${oldId}_base`, 16 /* Optimistic */); getSymbolAccessibilityDiagnostic = () => ({ diagnosticMessage: Diagnostics.extends_clause_of_exported_class_0_has_or_is_using_private_name_1, errorNode: extendsClause, typeName: input.name }); const varDecl = factory2.createVariableDeclaration( newId, /*exclamationToken*/ void 0, resolver.createTypeOfExpression(extendsClause.expression, input, declarationEmitNodeBuilderFlags, declarationEmitInternalNodeBuilderFlags, symbolTracker), /*initializer*/ void 0 ); const statement = factory2.createVariableStatement(needsDeclare ? [factory2.createModifier(138 /* DeclareKeyword */)] : [], factory2.createVariableDeclarationList([varDecl], 2 /* Const */)); const heritageClauses = factory2.createNodeArray(map(input.heritageClauses, (clause) => { if (clause.token === 96 /* ExtendsKeyword */) { const oldDiag2 = getSymbolAccessibilityDiagnostic; getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(clause.types[0]); const newClause = factory2.updateHeritageClause(clause, map(clause.types, (t) => factory2.updateExpressionWithTypeArguments(t, newId, visitNodes2(t.typeArguments, visitDeclarationSubtree, isTypeNode)))); getSymbolAccessibilityDiagnostic = oldDiag2; return newClause; } return factory2.updateHeritageClause(clause, visitNodes2(factory2.createNodeArray(filter(clause.types, (t) => isEntityNameExpression(t.expression) || t.expression.kind === 106 /* NullKeyword */)), visitDeclarationSubtree, isExpressionWithTypeArguments)); })); return [ statement, cleanup(factory2.updateClassDeclaration( input, modifiers, input.name, typeParameters, heritageClauses, members )) ]; } else { const heritageClauses = transformHeritageClauses(input.heritageClauses); return cleanup(factory2.updateClassDeclaration( input, modifiers, input.name, typeParameters, heritageClauses, members )); } } case 244 /* VariableStatement */: { return cleanup(transformVariableStatement(input)); } case 267 /* EnumDeclaration */: { return cleanup(factory2.updateEnumDeclaration( input, factory2.createNodeArray(ensureModifiers(input)), input.name, factory2.createNodeArray(mapDefined(input.members, (m) => { if (shouldStripInternal(m)) return; const enumValue = resolver.getEnumMemberValue(m); const constValue = enumValue == null ? void 0 : enumValue.value; if (isolatedDeclarations && m.initializer && (enumValue == null ? void 0 : enumValue.hasExternalReferences) && // This will be its own compiler error instead, so don't report. !isComputedPropertyName(m.name)) { context.addDiagnostic(createDiagnosticForNode(m, Diagnostics.Enum_member_initializers_must_be_computable_without_references_to_external_symbols_with_isolatedDeclarations)); } const newInitializer = constValue === void 0 ? void 0 : typeof constValue === "string" ? factory2.createStringLiteral(constValue) : constValue < 0 ? factory2.createPrefixUnaryExpression(41 /* MinusToken */, factory2.createNumericLiteral(-constValue)) : factory2.createNumericLiteral(constValue); return preserveJsDoc(factory2.updateEnumMember(m, m.name, newInitializer), m); })) )); } } return Debug.assertNever(input, `Unhandled top-level node in declaration emit: ${Debug.formatSyntaxKind(input.kind)}`); function cleanup(node) { if (isEnclosingDeclaration(input)) { enclosingDeclaration = previousEnclosingDeclaration; } if (canProdiceDiagnostic) { getSymbolAccessibilityDiagnostic = oldDiag; } if (input.kind === 268 /* ModuleDeclaration */) { needsDeclare = previousNeedsDeclare; } if (node === input) { return node; } errorFallbackNode = void 0; errorNameNode = void 0; return node && setOriginalNode(preserveJsDoc(node, input), input); } } function transformVariableStatement(input) { if (!forEach(input.declarationList.declarations, getBindingNameVisible)) return; const nodes = visitNodes2(input.declarationList.declarations, visitDeclarationSubtree, isVariableDeclaration); if (!length(nodes)) return; const modifiers = factory2.createNodeArray(ensureModifiers(input)); let declList; if (isVarUsing(input.declarationList) || isVarAwaitUsing(input.declarationList)) { declList = factory2.createVariableDeclarationList(nodes, 2 /* Const */); setOriginalNode(declList, input.declarationList); setTextRange(declList, input.declarationList); setCommentRange(declList, input.declarationList); } else { declList = factory2.updateVariableDeclarationList(input.declarationList, nodes); } return factory2.updateVariableStatement(input, modifiers, declList); } function recreateBindingPattern(d) { return flatten(mapDefined(d.elements, (e) => recreateBindingElement(e))); } function recreateBindingElement(e) { if (e.kind === 233 /* OmittedExpression */) { return; } if (e.name) { if (!getBindingNameVisible(e)) return; if (isBindingPattern(e.name)) { return recreateBindingPattern(e.name); } else { return factory2.createVariableDeclaration( e.name, /*exclamationToken*/ void 0, ensureType(e), /*initializer*/ void 0 ); } } } function checkName(node) { let oldDiag; if (!suppressNewDiagnosticContexts) { oldDiag = getSymbolAccessibilityDiagnostic; getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNodeName(node); } errorNameNode = node.name; Debug.assert(hasDynamicName(node)); const decl = node; const entityName = decl.name.expression; checkEntityNameVisibility(entityName, enclosingDeclaration); if (!suppressNewDiagnosticContexts) { getSymbolAccessibilityDiagnostic = oldDiag; } errorNameNode = void 0; } function shouldStripInternal(node) { return !!stripInternal && !!node && isInternalDeclaration(node, currentSourceFile); } function isScopeMarker2(node) { return isExportAssignment(node) || isExportDeclaration(node); } function hasScopeMarker2(statements) { return some(statements, isScopeMarker2); } function ensureModifiers(node) { const currentFlags = getEffectiveModifierFlags(node); const newFlags = ensureModifierFlags(node); if (currentFlags === newFlags) { return visitArray(node.modifiers, (n) => tryCast(n, isModifier), isModifier); } return factory2.createModifiersFromModifierFlags(newFlags); } function ensureModifierFlags(node) { let mask = 131071 /* All */ ^ (1 /* Public */ | 1024 /* Async */ | 16 /* Override */); let additions = needsDeclare && !isAlwaysType(node) ? 128 /* Ambient */ : 0 /* None */; const parentIsFile = node.parent.kind === 308 /* SourceFile */; if (!parentIsFile || isBundledEmit && parentIsFile && isExternalModule(node.parent)) { mask ^= 128 /* Ambient */; additions = 0 /* None */; } return maskModifierFlags(node, mask, additions); } function transformHeritageClauses(nodes) { return factory2.createNodeArray(filter( map(nodes, (clause) => factory2.updateHeritageClause( clause, visitNodes2( factory2.createNodeArray(filter(clause.types, (t) => { return isEntityNameExpression(t.expression) || clause.token === 96 /* ExtendsKeyword */ && t.expression.kind === 106 /* NullKeyword */; })), visitDeclarationSubtree, isExpressionWithTypeArguments ) )), (clause) => clause.types && !!clause.types.length )); } } function isAlwaysType(node) { if (node.kind === 265 /* InterfaceDeclaration */) { return true; } return false; } function maskModifiers(factory2, node, modifierMask, modifierAdditions) { return factory2.createModifiersFromModifierFlags(maskModifierFlags(node, modifierMask, modifierAdditions)); } function maskModifierFlags(node, modifierMask = 131071 /* All */ ^ 1 /* Public */, modifierAdditions = 0 /* None */) { let flags = getEffectiveModifierFlags(node) & modifierMask | modifierAdditions; if (flags & 2048 /* Default */ && !(flags & 32 /* Export */)) { flags ^= 32 /* Export */; } if (flags & 2048 /* Default */ && flags & 128 /* Ambient */) { flags ^= 128 /* Ambient */; } return flags; } function canHaveLiteralInitializer(node) { switch (node.kind) { case 173 /* PropertyDeclaration */: case 172 /* PropertySignature */: return !hasEffectiveModifier(node, 2 /* Private */); case 170 /* Parameter */: case 261 /* VariableDeclaration */: return true; } return false; } function isPreservedDeclarationStatement(node) { switch (node.kind) { case 263 /* FunctionDeclaration */: case 268 /* ModuleDeclaration */: case 272 /* ImportEqualsDeclaration */: case 265 /* InterfaceDeclaration */: case 264 /* ClassDeclaration */: case 266 /* TypeAliasDeclaration */: case 267 /* EnumDeclaration */: case 244 /* VariableStatement */: case 273 /* ImportDeclaration */: case 279 /* ExportDeclaration */: case 278 /* ExportAssignment */: return true; } return false; } function isProcessedComponent(node) { switch (node.kind) { case 181 /* ConstructSignature */: case 177 /* Constructor */: case 175 /* MethodDeclaration */: case 178 /* GetAccessor */: case 179 /* SetAccessor */: case 173 /* PropertyDeclaration */: case 172 /* PropertySignature */: case 174 /* MethodSignature */: case 180 /* CallSignature */: case 182 /* IndexSignature */: case 261 /* VariableDeclaration */: case 169 /* TypeParameter */: case 234 /* ExpressionWithTypeArguments */: case 184 /* TypeReference */: case 195 /* ConditionalType */: case 185 /* FunctionType */: case 186 /* ConstructorType */: case 206 /* ImportType */: return true; } return false; } // src/compiler/transformer.ts function getModuleTransformer(moduleKind) { switch (moduleKind) { case 200 /* Preserve */: return transformECMAScriptModule; case 99 /* ESNext */: case 7 /* ES2022 */: case 6 /* ES2020 */: case 5 /* ES2015 */: case 100 /* Node16 */: case 101 /* Node18 */: case 102 /* Node20 */: case 199 /* NodeNext */: case 1 /* CommonJS */: return transformImpliedNodeFormatDependentModule; case 4 /* System */: return transformSystemModule; default: return transformModule; } } var noTransformers = { scriptTransformers: emptyArray, declarationTransformers: emptyArray }; function getTransformers(compilerOptions, customTransformers, emitOnly) { return { scriptTransformers: getScriptTransformers(compilerOptions, customTransformers, emitOnly), declarationTransformers: getDeclarationTransformers(customTransformers) }; } function getScriptTransformers(compilerOptions, customTransformers, emitOnly) { if (emitOnly) return emptyArray; const languageVersion = getEmitScriptTarget(compilerOptions); const moduleKind = getEmitModuleKind(compilerOptions); const useDefineForClassFields = getUseDefineForClassFields(compilerOptions); const transformers = []; addRange(transformers, customTransformers && map(customTransformers.before, wrapScriptTransformerFactory)); transformers.push(transformTypeScript); if (compilerOptions.experimentalDecorators) { transformers.push(transformLegacyDecorators); } if (getJSXTransformEnabled(compilerOptions)) { transformers.push(transformJsx); } if (languageVersion < 99 /* ESNext */) { transformers.push(transformESNext); } if (!compilerOptions.experimentalDecorators && (languageVersion < 99 /* ESNext */ || !useDefineForClassFields)) { transformers.push(transformESDecorators); } transformers.push(transformClassFields); if (languageVersion < 8 /* ES2021 */) { transformers.push(transformES2021); } if (languageVersion < 7 /* ES2020 */) { transformers.push(transformES2020); } if (languageVersion < 6 /* ES2019 */) { transformers.push(transformES2019); } if (languageVersion < 5 /* ES2018 */) { transformers.push(transformES2018); } if (languageVersion < 4 /* ES2017 */) { transformers.push(transformES2017); } if (languageVersion < 3 /* ES2016 */) { transformers.push(transformES2016); } if (languageVersion < 2 /* ES2015 */) { transformers.push(transformES2015); transformers.push(transformGenerators); } transformers.push(getModuleTransformer(moduleKind)); addRange(transformers, customTransformers && map(customTransformers.after, wrapScriptTransformerFactory)); return transformers; } function getDeclarationTransformers(customTransformers) { const transformers = []; transformers.push(transformDeclarations); addRange(transformers, customTransformers && map(customTransformers.afterDeclarations, wrapDeclarationTransformerFactory)); return transformers; } function wrapCustomTransformer(transformer) { return (node) => isBundle(node) ? transformer.transformBundle(node) : transformer.transformSourceFile(node); } function wrapCustomTransformerFactory(transformer, handleDefault) { return (context) => { const customTransformer = transformer(context); return typeof customTransformer === "function" ? handleDefault(context, customTransformer) : wrapCustomTransformer(customTransformer); }; } function wrapScriptTransformerFactory(transformer) { return wrapCustomTransformerFactory(transformer, chainBundle); } function wrapDeclarationTransformerFactory(transformer) { return wrapCustomTransformerFactory(transformer, (_, node) => node); } function noEmitSubstitution(_hint, node) { return node; } function noEmitNotification(hint, node, callback) { callback(hint, node); } function transformNodes(resolver, host, factory2, options, nodes, transformers, allowDtsFiles) { var _a, _b; const enabledSyntaxKindFeatures = new Array(359 /* Count */); let lexicalEnvironmentVariableDeclarations; let lexicalEnvironmentFunctionDeclarations; let lexicalEnvironmentStatements; let lexicalEnvironmentFlags = 0 /* None */; let lexicalEnvironmentVariableDeclarationsStack = []; let lexicalEnvironmentFunctionDeclarationsStack = []; let lexicalEnvironmentStatementsStack = []; let lexicalEnvironmentFlagsStack = []; let lexicalEnvironmentStackOffset = 0; let lexicalEnvironmentSuspended = false; let blockScopedVariableDeclarationsStack = []; let blockScopeStackOffset = 0; let blockScopedVariableDeclarations; let emitHelpers; let onSubstituteNode = noEmitSubstitution; let onEmitNode = noEmitNotification; let state = 0 /* Uninitialized */; const diagnostics = []; const context = { factory: factory2, getCompilerOptions: () => options, getEmitResolver: () => resolver, // TODO: GH#18217 getEmitHost: () => host, // TODO: GH#18217 getEmitHelperFactory: memoize(() => createEmitHelperFactory(context)), startLexicalEnvironment, suspendLexicalEnvironment, resumeLexicalEnvironment, endLexicalEnvironment, setLexicalEnvironmentFlags, getLexicalEnvironmentFlags, hoistVariableDeclaration, hoistFunctionDeclaration, addInitializationStatement, startBlockScope, endBlockScope, addBlockScopedVariable, requestEmitHelper, readEmitHelpers, enableSubstitution, enableEmitNotification, isSubstitutionEnabled, isEmitNotificationEnabled, get onSubstituteNode() { return onSubstituteNode; }, set onSubstituteNode(value) { Debug.assert(state < 1 /* Initialized */, "Cannot modify transformation hooks after initialization has completed."); Debug.assert(value !== void 0, "Value must not be 'undefined'"); onSubstituteNode = value; }, get onEmitNode() { return onEmitNode; }, set onEmitNode(value) { Debug.assert(state < 1 /* Initialized */, "Cannot modify transformation hooks after initialization has completed."); Debug.assert(value !== void 0, "Value must not be 'undefined'"); onEmitNode = value; }, addDiagnostic(diag2) { diagnostics.push(diag2); } }; for (const node of nodes) { disposeEmitNodes(getSourceFileOfNode(getParseTreeNode(node))); } mark("beforeTransform"); const transformersWithContext = transformers.map((t) => t(context)); const transformation = (node) => { for (const transform of transformersWithContext) { node = transform(node); } return node; }; state = 1 /* Initialized */; const transformed = []; for (const node of nodes) { (_a = tracing) == null ? void 0 : _a.push(tracing.Phase.Emit, "transformNodes", node.kind === 308 /* SourceFile */ ? { path: node.path } : { kind: node.kind, pos: node.pos, end: node.end }); transformed.push((allowDtsFiles ? transformation : transformRoot)(node)); (_b = tracing) == null ? void 0 : _b.pop(); } state = 2 /* Completed */; mark("afterTransform"); measure("transformTime", "beforeTransform", "afterTransform"); return { transformed, substituteNode, emitNodeWithNotification, isEmitNotificationEnabled, dispose, diagnostics }; function transformRoot(node) { return node && (!isSourceFile(node) || !node.isDeclarationFile) ? transformation(node) : node; } function enableSubstitution(kind) { Debug.assert(state < 2 /* Completed */, "Cannot modify the transformation context after transformation has completed."); enabledSyntaxKindFeatures[kind] |= 1 /* Substitution */; } function isSubstitutionEnabled(node) { return (enabledSyntaxKindFeatures[node.kind] & 1 /* Substitution */) !== 0 && (getEmitFlags(node) & 8 /* NoSubstitution */) === 0; } function substituteNode(hint, node) { Debug.assert(state < 3 /* Disposed */, "Cannot substitute a node after the result is disposed."); return node && isSubstitutionEnabled(node) && onSubstituteNode(hint, node) || node; } function enableEmitNotification(kind) { Debug.assert(state < 2 /* Completed */, "Cannot modify the transformation context after transformation has completed."); enabledSyntaxKindFeatures[kind] |= 2 /* EmitNotifications */; } function isEmitNotificationEnabled(node) { return (enabledSyntaxKindFeatures[node.kind] & 2 /* EmitNotifications */) !== 0 || (getEmitFlags(node) & 4 /* AdviseOnEmitNode */) !== 0; } function emitNodeWithNotification(hint, node, emitCallback) { Debug.assert(state < 3 /* Disposed */, "Cannot invoke TransformationResult callbacks after the result is disposed."); if (node) { if (isEmitNotificationEnabled(node)) { onEmitNode(hint, node, emitCallback); } else { emitCallback(hint, node); } } } function hoistVariableDeclaration(name) { Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the lexical environment during initialization."); Debug.assert(state < 2 /* Completed */, "Cannot modify the lexical environment after transformation has completed."); const decl = setEmitFlags(factory2.createVariableDeclaration(name), 128 /* NoNestedSourceMaps */); if (!lexicalEnvironmentVariableDeclarations) { lexicalEnvironmentVariableDeclarations = [decl]; } else { lexicalEnvironmentVariableDeclarations.push(decl); } if (lexicalEnvironmentFlags & 1 /* InParameters */) { lexicalEnvironmentFlags |= 2 /* VariablesHoistedInParameters */; } } function hoistFunctionDeclaration(func) { Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the lexical environment during initialization."); Debug.assert(state < 2 /* Completed */, "Cannot modify the lexical environment after transformation has completed."); setEmitFlags(func, 2097152 /* CustomPrologue */); if (!lexicalEnvironmentFunctionDeclarations) { lexicalEnvironmentFunctionDeclarations = [func]; } else { lexicalEnvironmentFunctionDeclarations.push(func); } } function addInitializationStatement(node) { Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the lexical environment during initialization."); Debug.assert(state < 2 /* Completed */, "Cannot modify the lexical environment after transformation has completed."); setEmitFlags(node, 2097152 /* CustomPrologue */); if (!lexicalEnvironmentStatements) { lexicalEnvironmentStatements = [node]; } else { lexicalEnvironmentStatements.push(node); } } function startLexicalEnvironment() { Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the lexical environment during initialization."); Debug.assert(state < 2 /* Completed */, "Cannot modify the lexical environment after transformation has completed."); Debug.assert(!lexicalEnvironmentSuspended, "Lexical environment is suspended."); lexicalEnvironmentVariableDeclarationsStack[lexicalEnvironmentStackOffset] = lexicalEnvironmentVariableDeclarations; lexicalEnvironmentFunctionDeclarationsStack[lexicalEnvironmentStackOffset] = lexicalEnvironmentFunctionDeclarations; lexicalEnvironmentStatementsStack[lexicalEnvironmentStackOffset] = lexicalEnvironmentStatements; lexicalEnvironmentFlagsStack[lexicalEnvironmentStackOffset] = lexicalEnvironmentFlags; lexicalEnvironmentStackOffset++; lexicalEnvironmentVariableDeclarations = void 0; lexicalEnvironmentFunctionDeclarations = void 0; lexicalEnvironmentStatements = void 0; lexicalEnvironmentFlags = 0 /* None */; } function suspendLexicalEnvironment() { Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the lexical environment during initialization."); Debug.assert(state < 2 /* Completed */, "Cannot modify the lexical environment after transformation has completed."); Debug.assert(!lexicalEnvironmentSuspended, "Lexical environment is already suspended."); lexicalEnvironmentSuspended = true; } function resumeLexicalEnvironment() { Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the lexical environment during initialization."); Debug.assert(state < 2 /* Completed */, "Cannot modify the lexical environment after transformation has completed."); Debug.assert(lexicalEnvironmentSuspended, "Lexical environment is not suspended."); lexicalEnvironmentSuspended = false; } function endLexicalEnvironment() { Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the lexical environment during initialization."); Debug.assert(state < 2 /* Completed */, "Cannot modify the lexical environment after transformation has completed."); Debug.assert(!lexicalEnvironmentSuspended, "Lexical environment is suspended."); let statements; if (lexicalEnvironmentVariableDeclarations || lexicalEnvironmentFunctionDeclarations || lexicalEnvironmentStatements) { if (lexicalEnvironmentFunctionDeclarations) { statements = [...lexicalEnvironmentFunctionDeclarations]; } if (lexicalEnvironmentVariableDeclarations) { const statement = factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList(lexicalEnvironmentVariableDeclarations) ); setEmitFlags(statement, 2097152 /* CustomPrologue */); if (!statements) { statements = [statement]; } else { statements.push(statement); } } if (lexicalEnvironmentStatements) { if (!statements) { statements = [...lexicalEnvironmentStatements]; } else { statements = [...statements, ...lexicalEnvironmentStatements]; } } } lexicalEnvironmentStackOffset--; lexicalEnvironmentVariableDeclarations = lexicalEnvironmentVariableDeclarationsStack[lexicalEnvironmentStackOffset]; lexicalEnvironmentFunctionDeclarations = lexicalEnvironmentFunctionDeclarationsStack[lexicalEnvironmentStackOffset]; lexicalEnvironmentStatements = lexicalEnvironmentStatementsStack[lexicalEnvironmentStackOffset]; lexicalEnvironmentFlags = lexicalEnvironmentFlagsStack[lexicalEnvironmentStackOffset]; if (lexicalEnvironmentStackOffset === 0) { lexicalEnvironmentVariableDeclarationsStack = []; lexicalEnvironmentFunctionDeclarationsStack = []; lexicalEnvironmentStatementsStack = []; lexicalEnvironmentFlagsStack = []; } return statements; } function setLexicalEnvironmentFlags(flags, value) { lexicalEnvironmentFlags = value ? lexicalEnvironmentFlags | flags : lexicalEnvironmentFlags & ~flags; } function getLexicalEnvironmentFlags() { return lexicalEnvironmentFlags; } function startBlockScope() { Debug.assert(state > 0 /* Uninitialized */, "Cannot start a block scope during initialization."); Debug.assert(state < 2 /* Completed */, "Cannot start a block scope after transformation has completed."); blockScopedVariableDeclarationsStack[blockScopeStackOffset] = blockScopedVariableDeclarations; blockScopeStackOffset++; blockScopedVariableDeclarations = void 0; } function endBlockScope() { Debug.assert(state > 0 /* Uninitialized */, "Cannot end a block scope during initialization."); Debug.assert(state < 2 /* Completed */, "Cannot end a block scope after transformation has completed."); const statements = some(blockScopedVariableDeclarations) ? [ factory2.createVariableStatement( /*modifiers*/ void 0, factory2.createVariableDeclarationList( blockScopedVariableDeclarations.map((identifier) => factory2.createVariableDeclaration(identifier)), 1 /* Let */ ) ) ] : void 0; blockScopeStackOffset--; blockScopedVariableDeclarations = blockScopedVariableDeclarationsStack[blockScopeStackOffset]; if (blockScopeStackOffset === 0) { blockScopedVariableDeclarationsStack = []; } return statements; } function addBlockScopedVariable(name) { Debug.assert(blockScopeStackOffset > 0, "Cannot add a block scoped variable outside of an iteration body."); (blockScopedVariableDeclarations || (blockScopedVariableDeclarations = [])).push(name); } function requestEmitHelper(helper) { Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the transformation context during initialization."); Debug.assert(state < 2 /* Completed */, "Cannot modify the transformation context after transformation has completed."); Debug.assert(!helper.scoped, "Cannot request a scoped emit helper."); if (helper.dependencies) { for (const h of helper.dependencies) { requestEmitHelper(h); } } emitHelpers = append(emitHelpers, helper); } function readEmitHelpers() { Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the transformation context during initialization."); Debug.assert(state < 2 /* Completed */, "Cannot modify the transformation context after transformation has completed."); const helpers = emitHelpers; emitHelpers = void 0; return helpers; } function dispose() { if (state < 3 /* Disposed */) { for (const node of nodes) { disposeEmitNodes(getSourceFileOfNode(getParseTreeNode(node))); } lexicalEnvironmentVariableDeclarations = void 0; lexicalEnvironmentVariableDeclarationsStack = void 0; lexicalEnvironmentFunctionDeclarations = void 0; lexicalEnvironmentFunctionDeclarationsStack = void 0; onSubstituteNode = void 0; onEmitNode = void 0; emitHelpers = void 0; state = 3 /* Disposed */; } } } var nullTransformationContext = { factory, // eslint-disable-line object-shorthand getCompilerOptions: () => ({}), getEmitResolver: notImplemented, getEmitHost: notImplemented, getEmitHelperFactory: notImplemented, startLexicalEnvironment: noop, resumeLexicalEnvironment: noop, suspendLexicalEnvironment: noop, endLexicalEnvironment: returnUndefined, setLexicalEnvironmentFlags: noop, getLexicalEnvironmentFlags: () => 0, hoistVariableDeclaration: noop, hoistFunctionDeclaration: noop, addInitializationStatement: noop, startBlockScope: noop, endBlockScope: returnUndefined, addBlockScopedVariable: noop, requestEmitHelper: noop, readEmitHelpers: notImplemented, enableSubstitution: noop, enableEmitNotification: noop, isSubstitutionEnabled: notImplemented, isEmitNotificationEnabled: notImplemented, onSubstituteNode: noEmitSubstitution, onEmitNode: noEmitNotification, addDiagnostic: noop }; // src/compiler/emitter.ts var brackets = createBracketsMap(); function isBuildInfoFile(file) { return fileExtensionIs(file, ".tsbuildinfo" /* TsBuildInfo */); } function forEachEmittedFile(host, action, sourceFilesOrTargetSourceFile, forceDtsEmit = false, onlyBuildInfo, includeBuildInfo) { const sourceFiles = isArray(sourceFilesOrTargetSourceFile) ? sourceFilesOrTargetSourceFile : getSourceFilesToEmit(host, sourceFilesOrTargetSourceFile, forceDtsEmit); const options = host.getCompilerOptions(); if (!onlyBuildInfo) { if (options.outFile) { if (sourceFiles.length) { const bundle = factory.createBundle(sourceFiles); const result = action(getOutputPathsFor(bundle, host, forceDtsEmit), bundle); if (result) { return result; } } } else { for (const sourceFile of sourceFiles) { const result = action(getOutputPathsFor(sourceFile, host, forceDtsEmit), sourceFile); if (result) { return result; } } } } if (includeBuildInfo) { const buildInfoPath = getTsBuildInfoEmitOutputFilePath(options); if (buildInfoPath) return action( { buildInfoPath }, /*sourceFileOrBundle*/ void 0 ); } } function getTsBuildInfoEmitOutputFilePath(options) { const configFile = options.configFilePath; if (!canEmitTsBuildInfo(options)) return void 0; if (options.tsBuildInfoFile) return options.tsBuildInfoFile; const outPath = options.outFile; let buildInfoExtensionLess; if (outPath) { buildInfoExtensionLess = removeFileExtension(outPath); } else { if (!configFile) return void 0; const configFileExtensionLess = removeFileExtension(configFile); buildInfoExtensionLess = options.outDir ? options.rootDir ? resolvePath(options.outDir, getRelativePathFromDirectory( options.rootDir, configFileExtensionLess, /*ignoreCase*/ true )) : combinePaths(options.outDir, getBaseFileName(configFileExtensionLess)) : configFileExtensionLess; } return buildInfoExtensionLess + ".tsbuildinfo" /* TsBuildInfo */; } function canEmitTsBuildInfo(options) { return isIncrementalCompilation(options) || !!options.tscBuild; } function getOutputPathsForBundle(options, forceDtsPaths) { const outPath = options.outFile; const jsFilePath = options.emitDeclarationOnly ? void 0 : outPath; const sourceMapFilePath = jsFilePath && getSourceMapFilePath(jsFilePath, options); const declarationFilePath = forceDtsPaths || getEmitDeclarations(options) ? removeFileExtension(outPath) + ".d.ts" /* Dts */ : void 0; const declarationMapPath = declarationFilePath && getAreDeclarationMapsEnabled(options) ? declarationFilePath + ".map" : void 0; return { jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath }; } function getOutputPathsFor(sourceFile, host, forceDtsPaths) { const options = host.getCompilerOptions(); if (sourceFile.kind === 309 /* Bundle */) { return getOutputPathsForBundle(options, forceDtsPaths); } else { const ownOutputFilePath = getOwnEmitOutputFilePath(sourceFile.fileName, host, getOutputExtension(sourceFile.fileName, options)); const isJsonFile = isJsonSourceFile(sourceFile); const isJsonEmittedToSameLocation = isJsonFile && comparePaths(sourceFile.fileName, ownOutputFilePath, host.getCurrentDirectory(), !host.useCaseSensitiveFileNames()) === 0 /* EqualTo */; const jsFilePath = options.emitDeclarationOnly || isJsonEmittedToSameLocation ? void 0 : ownOutputFilePath; const sourceMapFilePath = !jsFilePath || isJsonSourceFile(sourceFile) ? void 0 : getSourceMapFilePath(jsFilePath, options); const declarationFilePath = forceDtsPaths || getEmitDeclarations(options) && !isJsonFile ? getDeclarationEmitOutputFilePath(sourceFile.fileName, host) : void 0; const declarationMapPath = declarationFilePath && getAreDeclarationMapsEnabled(options) ? declarationFilePath + ".map" : void 0; return { jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath }; } } function getSourceMapFilePath(jsFilePath, options) { return options.sourceMap && !options.inlineSourceMap ? jsFilePath + ".map" : void 0; } function getOutputExtension(fileName, options) { return fileExtensionIs(fileName, ".json" /* Json */) ? ".json" /* Json */ : options.jsx === 1 /* Preserve */ && fileExtensionIsOneOf(fileName, [".jsx" /* Jsx */, ".tsx" /* Tsx */]) ? ".jsx" /* Jsx */ : fileExtensionIsOneOf(fileName, [".mts" /* Mts */, ".mjs" /* Mjs */]) ? ".mjs" /* Mjs */ : fileExtensionIsOneOf(fileName, [".cts" /* Cts */, ".cjs" /* Cjs */]) ? ".cjs" /* Cjs */ : ".js" /* Js */; } function getOutputPathWithoutChangingExt(inputFileName, ignoreCase, outputDir, getCommonSourceDirectory2) { return outputDir ? resolvePath( outputDir, getRelativePathFromDirectory(getCommonSourceDirectory2(), inputFileName, ignoreCase) ) : inputFileName; } function getOutputDeclarationFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2 = () => getCommonSourceDirectoryOfConfig(configFile, ignoreCase)) { return getOutputDeclarationFileNameWorker(inputFileName, configFile.options, ignoreCase, getCommonSourceDirectory2); } function getOutputDeclarationFileNameWorker(inputFileName, options, ignoreCase, getCommonSourceDirectory2) { return changeExtension( getOutputPathWithoutChangingExt(inputFileName, ignoreCase, options.declarationDir || options.outDir, getCommonSourceDirectory2), getDeclarationEmitExtensionForPath(inputFileName) ); } function getOutputJSFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2 = () => getCommonSourceDirectoryOfConfig(configFile, ignoreCase)) { if (configFile.options.emitDeclarationOnly) return void 0; const isJsonFile = fileExtensionIs(inputFileName, ".json" /* Json */); const outputFileName = getOutputJSFileNameWorker(inputFileName, configFile.options, ignoreCase, getCommonSourceDirectory2); return !isJsonFile || comparePaths(inputFileName, outputFileName, Debug.checkDefined(configFile.options.configFilePath), ignoreCase) !== 0 /* EqualTo */ ? outputFileName : void 0; } function getOutputJSFileNameWorker(inputFileName, options, ignoreCase, getCommonSourceDirectory2) { return changeExtension( getOutputPathWithoutChangingExt(inputFileName, ignoreCase, options.outDir, getCommonSourceDirectory2), getOutputExtension(inputFileName, options) ); } function createAddOutput() { let outputs; return { addOutput, getOutputs }; function addOutput(path) { if (path) { (outputs || (outputs = [])).push(path); } } function getOutputs() { return outputs || emptyArray; } } function getSingleOutputFileNames(configFile, addOutput) { const { jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath } = getOutputPathsForBundle( configFile.options, /*forceDtsPaths*/ false ); addOutput(jsFilePath); addOutput(sourceMapFilePath); addOutput(declarationFilePath); addOutput(declarationMapPath); } function getOwnOutputFileNames(configFile, inputFileName, ignoreCase, addOutput, getCommonSourceDirectory2) { if (isDeclarationFileName(inputFileName)) return; const js = getOutputJSFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2); addOutput(js); if (fileExtensionIs(inputFileName, ".json" /* Json */)) return; if (js && configFile.options.sourceMap) { addOutput(`${js}.map`); } if (getEmitDeclarations(configFile.options)) { const dts = getOutputDeclarationFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2); addOutput(dts); if (configFile.options.declarationMap) { addOutput(`${dts}.map`); } } } function getCommonSourceDirectory(options, emittedFiles, currentDirectory, getCanonicalFileName, checkSourceFilesBelongToPath) { let commonSourceDirectory; if (options.rootDir) { commonSourceDirectory = getNormalizedAbsolutePath(options.rootDir, currentDirectory); checkSourceFilesBelongToPath == null ? void 0 : checkSourceFilesBelongToPath(options.rootDir); } else if (options.composite && options.configFilePath) { commonSourceDirectory = getDirectoryPath(normalizeSlashes(options.configFilePath)); checkSourceFilesBelongToPath == null ? void 0 : checkSourceFilesBelongToPath(commonSourceDirectory); } else { commonSourceDirectory = computeCommonSourceDirectoryOfFilenames(emittedFiles(), currentDirectory, getCanonicalFileName); } if (commonSourceDirectory && commonSourceDirectory[commonSourceDirectory.length - 1] !== directorySeparator) { commonSourceDirectory += directorySeparator; } return commonSourceDirectory; } function getCommonSourceDirectoryOfConfig({ options, fileNames }, ignoreCase) { return getCommonSourceDirectory( options, () => filter(fileNames, (file) => !(options.noEmitForJsFiles && fileExtensionIsOneOf(file, supportedJSExtensionsFlat)) && !isDeclarationFileName(file)), getDirectoryPath(normalizeSlashes(Debug.checkDefined(options.configFilePath))), createGetCanonicalFileName(!ignoreCase) ); } function getAllProjectOutputs(configFile, ignoreCase) { const { addOutput, getOutputs } = createAddOutput(); if (configFile.options.outFile) { getSingleOutputFileNames(configFile, addOutput); } else { const getCommonSourceDirectory2 = memoize(() => getCommonSourceDirectoryOfConfig(configFile, ignoreCase)); for (const inputFileName of configFile.fileNames) { getOwnOutputFileNames(configFile, inputFileName, ignoreCase, addOutput, getCommonSourceDirectory2); } } addOutput(getTsBuildInfoEmitOutputFilePath(configFile.options)); return getOutputs(); } function getFirstProjectOutput(configFile, ignoreCase) { if (configFile.options.outFile) { const { jsFilePath, declarationFilePath } = getOutputPathsForBundle( configFile.options, /*forceDtsPaths*/ false ); return Debug.checkDefined(jsFilePath || declarationFilePath, `project ${configFile.options.configFilePath} expected to have at least one output`); } const getCommonSourceDirectory2 = memoize(() => getCommonSourceDirectoryOfConfig(configFile, ignoreCase)); for (const inputFileName of configFile.fileNames) { if (isDeclarationFileName(inputFileName)) continue; const jsFilePath = getOutputJSFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2); if (jsFilePath) return jsFilePath; if (fileExtensionIs(inputFileName, ".json" /* Json */)) continue; if (getEmitDeclarations(configFile.options)) { return getOutputDeclarationFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2); } } const buildInfoPath = getTsBuildInfoEmitOutputFilePath(configFile.options); if (buildInfoPath) return buildInfoPath; return Debug.fail(`project ${configFile.options.configFilePath} expected to have at least one output`); } function emitResolverSkipsTypeChecking(emitOnly, forceDtsEmit) { return !!forceDtsEmit && !!emitOnly; } function emitFiles(resolver, host, targetSourceFile, { scriptTransformers, declarationTransformers }, emitOnly, onlyBuildInfo, forceDtsEmit, skipBuildInfo) { var compilerOptions = host.getCompilerOptions(); var sourceMapDataList = compilerOptions.sourceMap || compilerOptions.inlineSourceMap || getAreDeclarationMapsEnabled(compilerOptions) ? [] : void 0; var emittedFilesList = compilerOptions.listEmittedFiles ? [] : void 0; var emitterDiagnostics = createDiagnosticCollection(); var newLine = getNewLineCharacter(compilerOptions); var writer = createTextWriter(newLine); var { enter, exit } = createTimer("printTime", "beforePrint", "afterPrint"); var emitSkipped = false; enter(); forEachEmittedFile( host, emitSourceFileOrBundle, getSourceFilesToEmit(host, targetSourceFile, forceDtsEmit), forceDtsEmit, onlyBuildInfo, !targetSourceFile && !skipBuildInfo ); exit(); return { emitSkipped, diagnostics: emitterDiagnostics.getDiagnostics(), emittedFiles: emittedFilesList, sourceMaps: sourceMapDataList }; function emitSourceFileOrBundle({ jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath, buildInfoPath }, sourceFileOrBundle) { var _a, _b, _c, _d, _e, _f; (_a = tracing) == null ? void 0 : _a.push(tracing.Phase.Emit, "emitJsFileOrBundle", { jsFilePath }); emitJsFileOrBundle(sourceFileOrBundle, jsFilePath, sourceMapFilePath); (_b = tracing) == null ? void 0 : _b.pop(); (_c = tracing) == null ? void 0 : _c.push(tracing.Phase.Emit, "emitDeclarationFileOrBundle", { declarationFilePath }); emitDeclarationFileOrBundle(sourceFileOrBundle, declarationFilePath, declarationMapPath); (_d = tracing) == null ? void 0 : _d.pop(); (_e = tracing) == null ? void 0 : _e.push(tracing.Phase.Emit, "emitBuildInfo", { buildInfoPath }); emitBuildInfo(buildInfoPath); (_f = tracing) == null ? void 0 : _f.pop(); } function emitBuildInfo(buildInfoPath) { if (!buildInfoPath || targetSourceFile) return; if (host.isEmitBlocked(buildInfoPath)) { emitSkipped = true; return; } const buildInfo = host.getBuildInfo() || { version }; writeFile( host, emitterDiagnostics, buildInfoPath, getBuildInfoText(buildInfo), /*writeByteOrderMark*/ false, /*sourceFiles*/ void 0, { buildInfo } ); emittedFilesList == null ? void 0 : emittedFilesList.push(buildInfoPath); } function emitJsFileOrBundle(sourceFileOrBundle, jsFilePath, sourceMapFilePath) { if (!sourceFileOrBundle || emitOnly || !jsFilePath) { return; } if (host.isEmitBlocked(jsFilePath) || compilerOptions.noEmit) { emitSkipped = true; return; } (isSourceFile(sourceFileOrBundle) ? [sourceFileOrBundle] : filter(sourceFileOrBundle.sourceFiles, isSourceFileNotJson)).forEach( (sourceFile) => { if (compilerOptions.noCheck || !canIncludeBindAndCheckDiagnostics(sourceFile, compilerOptions)) markLinkedReferences(sourceFile); } ); const transform = transformNodes( resolver, host, factory, compilerOptions, [sourceFileOrBundle], scriptTransformers, /*allowDtsFiles*/ false ); const printerOptions = { removeComments: compilerOptions.removeComments, newLine: compilerOptions.newLine, noEmitHelpers: compilerOptions.noEmitHelpers, module: getEmitModuleKind(compilerOptions), moduleResolution: getEmitModuleResolutionKind(compilerOptions), target: getEmitScriptTarget(compilerOptions), sourceMap: compilerOptions.sourceMap, inlineSourceMap: compilerOptions.inlineSourceMap, inlineSources: compilerOptions.inlineSources, extendedDiagnostics: compilerOptions.extendedDiagnostics }; const printer = createPrinter(printerOptions, { // resolver hooks hasGlobalName: resolver.hasGlobalName, // transform hooks onEmitNode: transform.emitNodeWithNotification, isEmitNotificationEnabled: transform.isEmitNotificationEnabled, substituteNode: transform.substituteNode }); Debug.assert(transform.transformed.length === 1, "Should only see one output from the transform"); printSourceFileOrBundle(jsFilePath, sourceMapFilePath, transform, printer, compilerOptions); transform.dispose(); if (emittedFilesList) { emittedFilesList.push(jsFilePath); if (sourceMapFilePath) { emittedFilesList.push(sourceMapFilePath); } } } function emitDeclarationFileOrBundle(sourceFileOrBundle, declarationFilePath, declarationMapPath) { if (!sourceFileOrBundle || emitOnly === 0 /* Js */) return; if (!declarationFilePath) { if (emitOnly || compilerOptions.emitDeclarationOnly) emitSkipped = true; return; } const sourceFiles = isSourceFile(sourceFileOrBundle) ? [sourceFileOrBundle] : sourceFileOrBundle.sourceFiles; const filesForEmit = forceDtsEmit ? sourceFiles : filter(sourceFiles, isSourceFileNotJson); const inputListOrBundle = compilerOptions.outFile ? [factory.createBundle(filesForEmit)] : filesForEmit; filesForEmit.forEach((sourceFile) => { if (emitOnly && !getEmitDeclarations(compilerOptions) || compilerOptions.noCheck || emitResolverSkipsTypeChecking(emitOnly, forceDtsEmit) || !canIncludeBindAndCheckDiagnostics(sourceFile, compilerOptions)) { collectLinkedAliases(sourceFile); } }); const declarationTransform = transformNodes( resolver, host, factory, compilerOptions, inputListOrBundle, declarationTransformers, /*allowDtsFiles*/ false ); if (length(declarationTransform.diagnostics)) { for (const diagnostic of declarationTransform.diagnostics) { emitterDiagnostics.add(diagnostic); } } const declBlocked = !!declarationTransform.diagnostics && !!declarationTransform.diagnostics.length || !!host.isEmitBlocked(declarationFilePath) || !!compilerOptions.noEmit; emitSkipped = emitSkipped || declBlocked; if (!declBlocked || forceDtsEmit) { Debug.assert(declarationTransform.transformed.length === 1, "Should only see one output from the decl transform"); const printerOptions = { removeComments: compilerOptions.removeComments, newLine: compilerOptions.newLine, noEmitHelpers: true, module: compilerOptions.module, moduleResolution: compilerOptions.moduleResolution, target: compilerOptions.target, sourceMap: emitOnly !== 2 /* BuilderSignature */ && compilerOptions.declarationMap, inlineSourceMap: compilerOptions.inlineSourceMap, extendedDiagnostics: compilerOptions.extendedDiagnostics, onlyPrintJsDocStyle: true, omitBraceSourceMapPositions: true }; const declarationPrinter = createPrinter(printerOptions, { // resolver hooks hasGlobalName: resolver.hasGlobalName, // transform hooks onEmitNode: declarationTransform.emitNodeWithNotification, isEmitNotificationEnabled: declarationTransform.isEmitNotificationEnabled, substituteNode: declarationTransform.substituteNode }); const dtsWritten = printSourceFileOrBundle( declarationFilePath, declarationMapPath, declarationTransform, declarationPrinter, { sourceMap: printerOptions.sourceMap, sourceRoot: compilerOptions.sourceRoot, mapRoot: compilerOptions.mapRoot, extendedDiagnostics: compilerOptions.extendedDiagnostics // Explicitly do not passthru either `inline` option } ); if (emittedFilesList) { if (dtsWritten) emittedFilesList.push(declarationFilePath); if (declarationMapPath) { emittedFilesList.push(declarationMapPath); } } } declarationTransform.dispose(); } function collectLinkedAliases(node) { if (isExportAssignment(node)) { if (node.expression.kind === 80 /* Identifier */) { resolver.collectLinkedAliases( node.expression, /*setVisibility*/ true ); } return; } else if (isExportSpecifier(node)) { resolver.collectLinkedAliases( node.propertyName || node.name, /*setVisibility*/ true ); return; } forEachChild(node, collectLinkedAliases); } function markLinkedReferences(file) { if (isSourceFileJS(file)) return; forEachChildRecursively(file, (n) => { if (isImportEqualsDeclaration(n) && !(getSyntacticModifierFlags(n) & 32 /* Export */)) return "skip"; if (isImportDeclaration(n)) return "skip"; resolver.markLinkedReferences(n); }); } function printSourceFileOrBundle(jsFilePath, sourceMapFilePath, transform, printer, mapOptions) { const sourceFileOrBundle = transform.transformed[0]; const bundle = sourceFileOrBundle.kind === 309 /* Bundle */ ? sourceFileOrBundle : void 0; const sourceFile = sourceFileOrBundle.kind === 308 /* SourceFile */ ? sourceFileOrBundle : void 0; const sourceFiles = bundle ? bundle.sourceFiles : [sourceFile]; let sourceMapGenerator; if (shouldEmitSourceMaps(mapOptions, sourceFileOrBundle)) { sourceMapGenerator = createSourceMapGenerator( host, getBaseFileName(normalizeSlashes(jsFilePath)), getSourceRoot(mapOptions), getSourceMapDirectory(mapOptions, jsFilePath, sourceFile), mapOptions ); } if (bundle) { printer.writeBundle(bundle, writer, sourceMapGenerator); } else { printer.writeFile(sourceFile, writer, sourceMapGenerator); } let sourceMapUrlPos; if (sourceMapGenerator) { if (sourceMapDataList) { sourceMapDataList.push({ inputSourceFileNames: sourceMapGenerator.getSources(), sourceMap: sourceMapGenerator.toJSON() }); } const sourceMappingURL = getSourceMappingURL( mapOptions, sourceMapGenerator, jsFilePath, sourceMapFilePath, sourceFile ); if (sourceMappingURL) { if (!writer.isAtStartOfLine()) writer.rawWrite(newLine); sourceMapUrlPos = writer.getTextPos(); writer.writeComment(`//# ${"sourceMappingURL"}=${sourceMappingURL}`); } if (sourceMapFilePath) { const sourceMap = sourceMapGenerator.toString(); writeFile( host, emitterDiagnostics, sourceMapFilePath, sourceMap, /*writeByteOrderMark*/ false, sourceFiles ); } } else { writer.writeLine(); } const text = writer.getText(); const data = { sourceMapUrlPos, diagnostics: transform.diagnostics }; writeFile(host, emitterDiagnostics, jsFilePath, text, !!compilerOptions.emitBOM, sourceFiles, data); writer.clear(); return !data.skippedDtsWrite; } function shouldEmitSourceMaps(mapOptions, sourceFileOrBundle) { return (mapOptions.sourceMap || mapOptions.inlineSourceMap) && (sourceFileOrBundle.kind !== 308 /* SourceFile */ || !fileExtensionIs(sourceFileOrBundle.fileName, ".json" /* Json */)); } function getSourceRoot(mapOptions) { const sourceRoot = normalizeSlashes(mapOptions.sourceRoot || ""); return sourceRoot ? ensureTrailingDirectorySeparator(sourceRoot) : sourceRoot; } function getSourceMapDirectory(mapOptions, filePath, sourceFile) { if (mapOptions.sourceRoot) return host.getCommonSourceDirectory(); if (mapOptions.mapRoot) { let sourceMapDir = normalizeSlashes(mapOptions.mapRoot); if (sourceFile) { sourceMapDir = getDirectoryPath(getSourceFilePathInNewDir(sourceFile.fileName, host, sourceMapDir)); } if (getRootLength(sourceMapDir) === 0) { sourceMapDir = combinePaths(host.getCommonSourceDirectory(), sourceMapDir); } return sourceMapDir; } return getDirectoryPath(normalizePath(filePath)); } function getSourceMappingURL(mapOptions, sourceMapGenerator, filePath, sourceMapFilePath, sourceFile) { if (mapOptions.inlineSourceMap) { const sourceMapText = sourceMapGenerator.toString(); const base64SourceMapText = base64encode(sys, sourceMapText); return `data:application/json;base64,${base64SourceMapText}`; } const sourceMapFile = getBaseFileName(normalizeSlashes(Debug.checkDefined(sourceMapFilePath))); if (mapOptions.mapRoot) { let sourceMapDir = normalizeSlashes(mapOptions.mapRoot); if (sourceFile) { sourceMapDir = getDirectoryPath(getSourceFilePathInNewDir(sourceFile.fileName, host, sourceMapDir)); } if (getRootLength(sourceMapDir) === 0) { sourceMapDir = combinePaths(host.getCommonSourceDirectory(), sourceMapDir); return encodeURI( getRelativePathToDirectoryOrUrl( getDirectoryPath(normalizePath(filePath)), // get the relative sourceMapDir path based on jsFilePath combinePaths(sourceMapDir, sourceMapFile), // this is where user expects to see sourceMap host.getCurrentDirectory(), host.getCanonicalFileName, /*isAbsolutePathAnUrl*/ true ) ); } else { return encodeURI(combinePaths(sourceMapDir, sourceMapFile)); } } return encodeURI(sourceMapFile); } } function getBuildInfoText(buildInfo) { return JSON.stringify(buildInfo); } function getBuildInfo(buildInfoFile, buildInfoText) { return readJsonOrUndefined(buildInfoFile, buildInfoText); } var notImplementedResolver = { hasGlobalName: notImplemented, getReferencedExportContainer: notImplemented, getReferencedImportDeclaration: notImplemented, getReferencedDeclarationWithCollidingName: notImplemented, isDeclarationWithCollidingName: notImplemented, isValueAliasDeclaration: notImplemented, isReferencedAliasDeclaration: notImplemented, isTopLevelValueImportEqualsWithEntityName: notImplemented, hasNodeCheckFlag: notImplemented, isDeclarationVisible: notImplemented, isLateBound: (_node) => false, collectLinkedAliases: notImplemented, markLinkedReferences: notImplemented, isImplementationOfOverload: notImplemented, requiresAddingImplicitUndefined: notImplemented, isExpandoFunctionDeclaration: notImplemented, getPropertiesOfContainerFunction: notImplemented, createTypeOfDeclaration: notImplemented, createReturnTypeOfSignatureDeclaration: notImplemented, createTypeOfExpression: notImplemented, createLiteralConstValue: notImplemented, isSymbolAccessible: notImplemented, isEntityNameVisible: notImplemented, // Returns the constant value this property access resolves to: notImplemented, or 'undefined' for a non-constant getConstantValue: notImplemented, getEnumMemberValue: notImplemented, getReferencedValueDeclaration: notImplemented, getReferencedValueDeclarations: notImplemented, getTypeReferenceSerializationKind: notImplemented, isOptionalParameter: notImplemented, isArgumentsLocalBinding: notImplemented, getExternalModuleFileFromDeclaration: notImplemented, isLiteralConstDeclaration: notImplemented, getJsxFactoryEntity: notImplemented, getJsxFragmentFactoryEntity: notImplemented, isBindingCapturedByNode: notImplemented, getDeclarationStatementsForSourceFile: notImplemented, isImportRequiredByAugmentation: notImplemented, isDefinitelyReferenceToGlobalSymbolObject: notImplemented, createLateBoundIndexSignatures: notImplemented, symbolToDeclarations: notImplemented }; var createPrinterWithDefaults = /* @__PURE__ */ memoize(() => createPrinter({})); var createPrinterWithRemoveComments = /* @__PURE__ */ memoize(() => createPrinter({ removeComments: true })); var createPrinterWithRemoveCommentsNeverAsciiEscape = /* @__PURE__ */ memoize(() => createPrinter({ removeComments: true, neverAsciiEscape: true })); var createPrinterWithRemoveCommentsOmitTrailingSemicolon = /* @__PURE__ */ memoize(() => createPrinter({ removeComments: true, omitTrailingSemicolon: true })); function createPrinter(printerOptions = {}, handlers = {}) { var { hasGlobalName, onEmitNode = noEmitNotification, isEmitNotificationEnabled, substituteNode = noEmitSubstitution, onBeforeEmitNode, onAfterEmitNode, onBeforeEmitNodeArray, onAfterEmitNodeArray, onBeforeEmitToken, onAfterEmitToken } = handlers; var extendedDiagnostics = !!printerOptions.extendedDiagnostics; var omitBraceSourcePositions = !!printerOptions.omitBraceSourceMapPositions; var newLine = getNewLineCharacter(printerOptions); var moduleKind = getEmitModuleKind(printerOptions); var bundledHelpers = /* @__PURE__ */ new Map(); var currentSourceFile; var nodeIdToGeneratedName; var nodeIdToGeneratedPrivateName; var autoGeneratedIdToGeneratedName; var generatedNames; var formattedNameTempFlagsStack; var formattedNameTempFlags; var privateNameTempFlagsStack; var privateNameTempFlags; var tempFlagsStack; var tempFlags; var reservedNamesStack; var reservedNames; var reservedPrivateNamesStack; var reservedPrivateNames; var preserveSourceNewlines = printerOptions.preserveSourceNewlines; var nextListElementPos; var writer; var ownWriter; var write = writeBase; var isOwnFileEmit; var sourceMapsDisabled = true; var sourceMapGenerator; var sourceMapSource; var sourceMapSourceIndex = -1; var mostRecentlyAddedSourceMapSource; var mostRecentlyAddedSourceMapSourceIndex = -1; var containerPos = -1; var containerEnd = -1; var declarationListContainerEnd = -1; var currentLineMap; var detachedCommentsInfo; var hasWrittenComment = false; var commentsDisabled = !!printerOptions.removeComments; var lastSubstitution; var currentParenthesizerRule; var { enter: enterComment, exit: exitComment } = createTimerIf(extendedDiagnostics, "commentTime", "beforeComment", "afterComment"); var parenthesizer = factory.parenthesizer; var typeArgumentParenthesizerRuleSelector = { select: (index) => index === 0 ? parenthesizer.parenthesizeLeadingTypeArgument : void 0 }; var emitBinaryExpression = createEmitBinaryExpression(); reset(); return { // public API printNode, printList, printFile, printBundle, // internal API writeNode, writeList, writeFile: writeFile2, writeBundle }; function printNode(hint, node, sourceFile) { switch (hint) { case 0 /* SourceFile */: Debug.assert(isSourceFile(node), "Expected a SourceFile node."); break; case 2 /* IdentifierName */: Debug.assert(isIdentifier(node), "Expected an Identifier node."); break; case 1 /* Expression */: Debug.assert(isExpression(node), "Expected an Expression node."); break; } switch (node.kind) { case 308 /* SourceFile */: return printFile(node); case 309 /* Bundle */: return printBundle(node); } writeNode(hint, node, sourceFile, beginPrint()); return endPrint(); } function printList(format, nodes, sourceFile) { writeList(format, nodes, sourceFile, beginPrint()); return endPrint(); } function printBundle(bundle) { writeBundle( bundle, beginPrint(), /*sourceMapGenerator*/ void 0 ); return endPrint(); } function printFile(sourceFile) { writeFile2( sourceFile, beginPrint(), /*sourceMapGenerator*/ void 0 ); return endPrint(); } function writeNode(hint, node, sourceFile, output) { const previousWriter = writer; setWriter( output, /*_sourceMapGenerator*/ void 0 ); print(hint, node, sourceFile); reset(); writer = previousWriter; } function writeList(format, nodes, sourceFile, output) { const previousWriter = writer; setWriter( output, /*_sourceMapGenerator*/ void 0 ); if (sourceFile) { setSourceFile(sourceFile); } emitList( /*parentNode*/ void 0, nodes, format ); reset(); writer = previousWriter; } function writeBundle(bundle, output, sourceMapGenerator2) { isOwnFileEmit = false; const previousWriter = writer; setWriter(output, sourceMapGenerator2); emitShebangIfNeeded(bundle); emitPrologueDirectivesIfNeeded(bundle); emitHelpers(bundle); emitSyntheticTripleSlashReferencesIfNeeded(bundle); for (const sourceFile of bundle.sourceFiles) { print(0 /* SourceFile */, sourceFile, sourceFile); } reset(); writer = previousWriter; } function writeFile2(sourceFile, output, sourceMapGenerator2) { isOwnFileEmit = true; const previousWriter = writer; setWriter(output, sourceMapGenerator2); emitShebangIfNeeded(sourceFile); emitPrologueDirectivesIfNeeded(sourceFile); print(0 /* SourceFile */, sourceFile, sourceFile); reset(); writer = previousWriter; } function beginPrint() { return ownWriter || (ownWriter = createTextWriter(newLine)); } function endPrint() { const text = ownWriter.getText(); ownWriter.clear(); return text; } function print(hint, node, sourceFile) { if (sourceFile) { setSourceFile(sourceFile); } pipelineEmit( hint, node, /*parenthesizerRule*/ void 0 ); } function setSourceFile(sourceFile) { currentSourceFile = sourceFile; currentLineMap = void 0; detachedCommentsInfo = void 0; if (sourceFile) { setSourceMapSource(sourceFile); } } function setWriter(_writer, _sourceMapGenerator) { if (_writer && printerOptions.omitTrailingSemicolon) { _writer = getTrailingSemicolonDeferringWriter(_writer); } writer = _writer; sourceMapGenerator = _sourceMapGenerator; sourceMapsDisabled = !writer || !sourceMapGenerator; } function reset() { nodeIdToGeneratedName = []; nodeIdToGeneratedPrivateName = []; autoGeneratedIdToGeneratedName = []; generatedNames = /* @__PURE__ */ new Set(); formattedNameTempFlagsStack = []; formattedNameTempFlags = /* @__PURE__ */ new Map(); privateNameTempFlagsStack = []; privateNameTempFlags = 0 /* Auto */; tempFlagsStack = []; tempFlags = 0 /* Auto */; reservedNamesStack = []; reservedNames = void 0; reservedPrivateNamesStack = []; reservedPrivateNames = void 0; currentSourceFile = void 0; currentLineMap = void 0; detachedCommentsInfo = void 0; setWriter( /*output*/ void 0, /*_sourceMapGenerator*/ void 0 ); } function getCurrentLineMap() { return currentLineMap || (currentLineMap = getLineStarts(Debug.checkDefined(currentSourceFile))); } function emit(node, parenthesizerRule) { if (node === void 0) return; pipelineEmit(4 /* Unspecified */, node, parenthesizerRule); } function emitIdentifierName(node) { if (node === void 0) return; pipelineEmit( 2 /* IdentifierName */, node, /*parenthesizerRule*/ void 0 ); } function emitExpression(node, parenthesizerRule) { if (node === void 0) return; pipelineEmit(1 /* Expression */, node, parenthesizerRule); } function emitJsxAttributeValue(node) { pipelineEmit(isStringLiteral(node) ? 6 /* JsxAttributeValue */ : 4 /* Unspecified */, node); } function beforeEmitNode(node) { if (preserveSourceNewlines && getInternalEmitFlags(node) & 4 /* IgnoreSourceNewlines */) { preserveSourceNewlines = false; } } function afterEmitNode(savedPreserveSourceNewlines) { preserveSourceNewlines = savedPreserveSourceNewlines; } function pipelineEmit(emitHint, node, parenthesizerRule) { currentParenthesizerRule = parenthesizerRule; const pipelinePhase = getPipelinePhase(0 /* Notification */, emitHint, node); pipelinePhase(emitHint, node); currentParenthesizerRule = void 0; } function shouldEmitComments(node) { return !commentsDisabled && !isSourceFile(node); } function shouldEmitSourceMaps(node) { return !sourceMapsDisabled && !isSourceFile(node) && !isInJsonFile(node); } function getPipelinePhase(phase, emitHint, node) { switch (phase) { case 0 /* Notification */: if (onEmitNode !== noEmitNotification && (!isEmitNotificationEnabled || isEmitNotificationEnabled(node))) { return pipelineEmitWithNotification; } // falls through case 1 /* Substitution */: if (substituteNode !== noEmitSubstitution && (lastSubstitution = substituteNode(emitHint, node) || node) !== node) { if (currentParenthesizerRule) { lastSubstitution = currentParenthesizerRule(lastSubstitution); } return pipelineEmitWithSubstitution; } // falls through case 2 /* Comments */: if (shouldEmitComments(node)) { return pipelineEmitWithComments; } // falls through case 3 /* SourceMaps */: if (shouldEmitSourceMaps(node)) { return pipelineEmitWithSourceMaps; } // falls through case 4 /* Emit */: return pipelineEmitWithHint; default: return Debug.assertNever(phase); } } function getNextPipelinePhase(currentPhase, emitHint, node) { return getPipelinePhase(currentPhase + 1, emitHint, node); } function pipelineEmitWithNotification(hint, node) { const pipelinePhase = getNextPipelinePhase(0 /* Notification */, hint, node); onEmitNode(hint, node, pipelinePhase); } function pipelineEmitWithHint(hint, node) { onBeforeEmitNode == null ? void 0 : onBeforeEmitNode(node); if (preserveSourceNewlines) { const savedPreserveSourceNewlines = preserveSourceNewlines; beforeEmitNode(node); pipelineEmitWithHintWorker(hint, node); afterEmitNode(savedPreserveSourceNewlines); } else { pipelineEmitWithHintWorker(hint, node); } onAfterEmitNode == null ? void 0 : onAfterEmitNode(node); currentParenthesizerRule = void 0; } function pipelineEmitWithHintWorker(hint, node, allowSnippets = true) { if (allowSnippets) { const snippet = getSnippetElement(node); if (snippet) { return emitSnippetNode(hint, node, snippet); } } if (hint === 0 /* SourceFile */) return emitSourceFile(cast(node, isSourceFile)); if (hint === 2 /* IdentifierName */) return emitIdentifier(cast(node, isIdentifier)); if (hint === 6 /* JsxAttributeValue */) return emitLiteral( cast(node, isStringLiteral), /*jsxAttributeEscape*/ true ); if (hint === 3 /* MappedTypeParameter */) return emitMappedTypeParameter(cast(node, isTypeParameterDeclaration)); if (hint === 7 /* ImportTypeNodeAttributes */) return emitImportTypeNodeAttributes(cast(node, isImportAttributes)); if (hint === 5 /* EmbeddedStatement */) { Debug.assertNode(node, isEmptyStatement); return emitEmptyStatement( /*isEmbeddedStatement*/ true ); } if (hint === 4 /* Unspecified */) { switch (node.kind) { // Pseudo-literals case 16 /* TemplateHead */: case 17 /* TemplateMiddle */: case 18 /* TemplateTail */: return emitLiteral( node, /*jsxAttributeEscape*/ false ); // Identifiers case 80 /* Identifier */: return emitIdentifier(node); // PrivateIdentifiers case 81 /* PrivateIdentifier */: return emitPrivateIdentifier(node); // Parse tree nodes // Names case 167 /* QualifiedName */: return emitQualifiedName(node); case 168 /* ComputedPropertyName */: return emitComputedPropertyName(node); // Signature elements case 169 /* TypeParameter */: return emitTypeParameter(node); case 170 /* Parameter */: return emitParameter(node); case 171 /* Decorator */: return emitDecorator(node); // Type members case 172 /* PropertySignature */: return emitPropertySignature(node); case 173 /* PropertyDeclaration */: return emitPropertyDeclaration(node); case 174 /* MethodSignature */: return emitMethodSignature(node); case 175 /* MethodDeclaration */: return emitMethodDeclaration(node); case 176 /* ClassStaticBlockDeclaration */: return emitClassStaticBlockDeclaration(node); case 177 /* Constructor */: return emitConstructor(node); case 178 /* GetAccessor */: case 179 /* SetAccessor */: return emitAccessorDeclaration(node); case 180 /* CallSignature */: return emitCallSignature(node); case 181 /* ConstructSignature */: return emitConstructSignature(node); case 182 /* IndexSignature */: return emitIndexSignature(node); // Types case 183 /* TypePredicate */: return emitTypePredicate(node); case 184 /* TypeReference */: return emitTypeReference(node); case 185 /* FunctionType */: return emitFunctionType(node); case 186 /* ConstructorType */: return emitConstructorType(node); case 187 /* TypeQuery */: return emitTypeQuery(node); case 188 /* TypeLiteral */: return emitTypeLiteral(node); case 189 /* ArrayType */: return emitArrayType(node); case 190 /* TupleType */: return emitTupleType(node); case 191 /* OptionalType */: return emitOptionalType(node); // SyntaxKind.RestType is handled below case 193 /* UnionType */: return emitUnionType(node); case 194 /* IntersectionType */: return emitIntersectionType(node); case 195 /* ConditionalType */: return emitConditionalType(node); case 196 /* InferType */: return emitInferType(node); case 197 /* ParenthesizedType */: return emitParenthesizedType(node); case 234 /* ExpressionWithTypeArguments */: return emitExpressionWithTypeArguments(node); case 198 /* ThisType */: return emitThisType(); case 199 /* TypeOperator */: return emitTypeOperator(node); case 200 /* IndexedAccessType */: return emitIndexedAccessType(node); case 201 /* MappedType */: return emitMappedType(node); case 202 /* LiteralType */: return emitLiteralType(node); case 203 /* NamedTupleMember */: return emitNamedTupleMember(node); case 204 /* TemplateLiteralType */: return emitTemplateType(node); case 205 /* TemplateLiteralTypeSpan */: return emitTemplateTypeSpan(node); case 206 /* ImportType */: return emitImportTypeNode(node); // Binding patterns case 207 /* ObjectBindingPattern */: return emitObjectBindingPattern(node); case 208 /* ArrayBindingPattern */: return emitArrayBindingPattern(node); case 209 /* BindingElement */: return emitBindingElement(node); // Misc case 240 /* TemplateSpan */: return emitTemplateSpan(node); case 241 /* SemicolonClassElement */: return emitSemicolonClassElement(); // Statements case 242 /* Block */: return emitBlock(node); case 244 /* VariableStatement */: return emitVariableStatement(node); case 243 /* EmptyStatement */: return emitEmptyStatement( /*isEmbeddedStatement*/ false ); case 245 /* ExpressionStatement */: return emitExpressionStatement(node); case 246 /* IfStatement */: return emitIfStatement(node); case 247 /* DoStatement */: return emitDoStatement(node); case 248 /* WhileStatement */: return emitWhileStatement(node); case 249 /* ForStatement */: return emitForStatement(node); case 250 /* ForInStatement */: return emitForInStatement(node); case 251 /* ForOfStatement */: return emitForOfStatement(node); case 252 /* ContinueStatement */: return emitContinueStatement(node); case 253 /* BreakStatement */: return emitBreakStatement(node); case 254 /* ReturnStatement */: return emitReturnStatement(node); case 255 /* WithStatement */: return emitWithStatement(node); case 256 /* SwitchStatement */: return emitSwitchStatement(node); case 257 /* LabeledStatement */: return emitLabeledStatement(node); case 258 /* ThrowStatement */: return emitThrowStatement(node); case 259 /* TryStatement */: return emitTryStatement(node); case 260 /* DebuggerStatement */: return emitDebuggerStatement(node); // Declarations case 261 /* VariableDeclaration */: return emitVariableDeclaration(node); case 262 /* VariableDeclarationList */: return emitVariableDeclarationList(node); case 263 /* FunctionDeclaration */: return emitFunctionDeclaration(node); case 264 /* ClassDeclaration */: return emitClassDeclaration(node); case 265 /* InterfaceDeclaration */: return emitInterfaceDeclaration(node); case 266 /* TypeAliasDeclaration */: return emitTypeAliasDeclaration(node); case 267 /* EnumDeclaration */: return emitEnumDeclaration(node); case 268 /* ModuleDeclaration */: return emitModuleDeclaration(node); case 269 /* ModuleBlock */: return emitModuleBlock(node); case 270 /* CaseBlock */: return emitCaseBlock(node); case 271 /* NamespaceExportDeclaration */: return emitNamespaceExportDeclaration(node); case 272 /* ImportEqualsDeclaration */: return emitImportEqualsDeclaration(node); case 273 /* ImportDeclaration */: return emitImportDeclaration(node); case 274 /* ImportClause */: return emitImportClause(node); case 275 /* NamespaceImport */: return emitNamespaceImport(node); case 281 /* NamespaceExport */: return emitNamespaceExport(node); case 276 /* NamedImports */: return emitNamedImports(node); case 277 /* ImportSpecifier */: return emitImportSpecifier(node); case 278 /* ExportAssignment */: return emitExportAssignment(node); case 279 /* ExportDeclaration */: return emitExportDeclaration(node); case 280 /* NamedExports */: return emitNamedExports(node); case 282 /* ExportSpecifier */: return emitExportSpecifier(node); case 301 /* ImportAttributes */: return emitImportAttributes(node); case 302 /* ImportAttribute */: return emitImportAttribute(node); case 283 /* MissingDeclaration */: return; // Module references case 284 /* ExternalModuleReference */: return emitExternalModuleReference(node); // JSX (non-expression) case 12 /* JsxText */: return emitJsxText(node); case 287 /* JsxOpeningElement */: case 290 /* JsxOpeningFragment */: return emitJsxOpeningElementOrFragment(node); case 288 /* JsxClosingElement */: case 291 /* JsxClosingFragment */: return emitJsxClosingElementOrFragment(node); case 292 /* JsxAttribute */: return emitJsxAttribute(node); case 293 /* JsxAttributes */: return emitJsxAttributes(node); case 294 /* JsxSpreadAttribute */: return emitJsxSpreadAttribute(node); case 295 /* JsxExpression */: return emitJsxExpression(node); case 296 /* JsxNamespacedName */: return emitJsxNamespacedName(node); // Clauses case 297 /* CaseClause */: return emitCaseClause(node); case 298 /* DefaultClause */: return emitDefaultClause(node); case 299 /* HeritageClause */: return emitHeritageClause(node); case 300 /* CatchClause */: return emitCatchClause(node); // Property assignments case 304 /* PropertyAssignment */: return emitPropertyAssignment(node); case 305 /* ShorthandPropertyAssignment */: return emitShorthandPropertyAssignment(node); case 306 /* SpreadAssignment */: return emitSpreadAssignment(node); // Enum case 307 /* EnumMember */: return emitEnumMember(node); // Top-level nodes case 308 /* SourceFile */: return emitSourceFile(node); case 309 /* Bundle */: return Debug.fail("Bundles should be printed using printBundle"); // JSDoc nodes (only used in codefixes currently) case 310 /* JSDocTypeExpression */: return emitJSDocTypeExpression(node); case 311 /* JSDocNameReference */: return emitJSDocNameReference(node); case 313 /* JSDocAllType */: return writePunctuation("*"); case 314 /* JSDocUnknownType */: return writePunctuation("?"); case 315 /* JSDocNullableType */: return emitJSDocNullableType(node); case 316 /* JSDocNonNullableType */: return emitJSDocNonNullableType(node); case 317 /* JSDocOptionalType */: return emitJSDocOptionalType(node); case 318 /* JSDocFunctionType */: return emitJSDocFunctionType(node); case 192 /* RestType */: case 319 /* JSDocVariadicType */: return emitRestOrJSDocVariadicType(node); case 320 /* JSDocNamepathType */: return; case 321 /* JSDoc */: return emitJSDoc(node); case 323 /* JSDocTypeLiteral */: return emitJSDocTypeLiteral(node); case 324 /* JSDocSignature */: return emitJSDocSignature(node); case 328 /* JSDocTag */: case 333 /* JSDocClassTag */: case 338 /* JSDocOverrideTag */: return emitJSDocSimpleTag(node); case 329 /* JSDocAugmentsTag */: case 330 /* JSDocImplementsTag */: return emitJSDocHeritageTag(node); case 331 /* JSDocAuthorTag */: case 332 /* JSDocDeprecatedTag */: return; // SyntaxKind.JSDocClassTag (see JSDocTag, above) case 334 /* JSDocPublicTag */: case 335 /* JSDocPrivateTag */: case 336 /* JSDocProtectedTag */: case 337 /* JSDocReadonlyTag */: return; case 339 /* JSDocCallbackTag */: return emitJSDocCallbackTag(node); case 340 /* JSDocOverloadTag */: return emitJSDocOverloadTag(node); // SyntaxKind.JSDocEnumTag (see below) case 342 /* JSDocParameterTag */: case 349 /* JSDocPropertyTag */: return emitJSDocPropertyLikeTag(node); case 341 /* JSDocEnumTag */: case 343 /* JSDocReturnTag */: case 344 /* JSDocThisTag */: case 345 /* JSDocTypeTag */: case 350 /* JSDocThrowsTag */: case 351 /* JSDocSatisfiesTag */: return emitJSDocSimpleTypedTag(node); case 346 /* JSDocTemplateTag */: return emitJSDocTemplateTag(node); case 347 /* JSDocTypedefTag */: return emitJSDocTypedefTag(node); case 348 /* JSDocSeeTag */: return emitJSDocSeeTag(node); case 352 /* JSDocImportTag */: return emitJSDocImportTag(node); // SyntaxKind.JSDocPropertyTag (see JSDocParameterTag, above) // Transformation nodes case 354 /* NotEmittedStatement */: case 355 /* NotEmittedTypeElement */: return; } if (isExpression(node)) { hint = 1 /* Expression */; if (substituteNode !== noEmitSubstitution) { const substitute = substituteNode(hint, node) || node; if (substitute !== node) { node = substitute; if (currentParenthesizerRule) { node = currentParenthesizerRule(node); } } } } } if (hint === 1 /* Expression */) { switch (node.kind) { // Literals case 9 /* NumericLiteral */: case 10 /* BigIntLiteral */: return emitNumericOrBigIntLiteral(node); case 11 /* StringLiteral */: case 14 /* RegularExpressionLiteral */: case 15 /* NoSubstitutionTemplateLiteral */: return emitLiteral( node, /*jsxAttributeEscape*/ false ); // Identifiers case 80 /* Identifier */: return emitIdentifier(node); case 81 /* PrivateIdentifier */: return emitPrivateIdentifier(node); // Expressions case 210 /* ArrayLiteralExpression */: return emitArrayLiteralExpression(node); case 211 /* ObjectLiteralExpression */: return emitObjectLiteralExpression(node); case 212 /* PropertyAccessExpression */: return emitPropertyAccessExpression(node); case 213 /* ElementAccessExpression */: return emitElementAccessExpression(node); case 214 /* CallExpression */: return emitCallExpression(node); case 215 /* NewExpression */: return emitNewExpression(node); case 216 /* TaggedTemplateExpression */: return emitTaggedTemplateExpression(node); case 217 /* TypeAssertionExpression */: return emitTypeAssertionExpression(node); case 218 /* ParenthesizedExpression */: return emitParenthesizedExpression(node); case 219 /* FunctionExpression */: return emitFunctionExpression(node); case 220 /* ArrowFunction */: return emitArrowFunction(node); case 221 /* DeleteExpression */: return emitDeleteExpression(node); case 222 /* TypeOfExpression */: return emitTypeOfExpression(node); case 223 /* VoidExpression */: return emitVoidExpression(node); case 224 /* AwaitExpression */: return emitAwaitExpression(node); case 225 /* PrefixUnaryExpression */: return emitPrefixUnaryExpression(node); case 226 /* PostfixUnaryExpression */: return emitPostfixUnaryExpression(node); case 227 /* BinaryExpression */: return emitBinaryExpression(node); case 228 /* ConditionalExpression */: return emitConditionalExpression(node); case 229 /* TemplateExpression */: return emitTemplateExpression(node); case 230 /* YieldExpression */: return emitYieldExpression(node); case 231 /* SpreadElement */: return emitSpreadElement(node); case 232 /* ClassExpression */: return emitClassExpression(node); case 233 /* OmittedExpression */: return; case 235 /* AsExpression */: return emitAsExpression(node); case 236 /* NonNullExpression */: return emitNonNullExpression(node); case 234 /* ExpressionWithTypeArguments */: return emitExpressionWithTypeArguments(node); case 239 /* SatisfiesExpression */: return emitSatisfiesExpression(node); case 237 /* MetaProperty */: return emitMetaProperty(node); case 238 /* SyntheticExpression */: return Debug.fail("SyntheticExpression should never be printed."); case 283 /* MissingDeclaration */: return; // JSX case 285 /* JsxElement */: return emitJsxElement(node); case 286 /* JsxSelfClosingElement */: return emitJsxSelfClosingElement(node); case 289 /* JsxFragment */: return emitJsxFragment(node); // Synthesized list case 353 /* SyntaxList */: return Debug.fail("SyntaxList should not be printed"); // Transformation nodes case 354 /* NotEmittedStatement */: return; case 356 /* PartiallyEmittedExpression */: return emitPartiallyEmittedExpression(node); case 357 /* CommaListExpression */: return emitCommaList(node); case 358 /* SyntheticReferenceExpression */: return Debug.fail("SyntheticReferenceExpression should not be printed"); } } if (isKeyword(node.kind)) return writeTokenNode(node, writeKeyword); if (isTokenKind(node.kind)) return writeTokenNode(node, writePunctuation); Debug.fail(`Unhandled SyntaxKind: ${Debug.formatSyntaxKind(node.kind)}.`); } function emitMappedTypeParameter(node) { emit(node.name); writeSpace(); writeKeyword("in"); writeSpace(); emit(node.constraint); } function pipelineEmitWithSubstitution(hint, node) { const pipelinePhase = getNextPipelinePhase(1 /* Substitution */, hint, node); Debug.assertIsDefined(lastSubstitution); node = lastSubstitution; lastSubstitution = void 0; pipelinePhase(hint, node); } function emitHelpers(node) { let helpersEmitted = false; const bundle = node.kind === 309 /* Bundle */ ? node : void 0; if (bundle && moduleKind === 0 /* None */) { return; } const numNodes = bundle ? bundle.sourceFiles.length : 1; for (let i = 0; i < numNodes; i++) { const currentNode = bundle ? bundle.sourceFiles[i] : node; const sourceFile = isSourceFile(currentNode) ? currentNode : currentSourceFile; const shouldSkip = printerOptions.noEmitHelpers || !!sourceFile && hasRecordedExternalHelpers(sourceFile); const shouldBundle = isSourceFile(currentNode) && !isOwnFileEmit; const helpers = getSortedEmitHelpers(currentNode); if (helpers) { for (const helper of helpers) { if (!helper.scoped) { if (shouldSkip) continue; if (shouldBundle) { if (bundledHelpers.get(helper.name)) { continue; } bundledHelpers.set(helper.name, true); } } else if (bundle) { continue; } if (typeof helper.text === "string") { writeLines(helper.text); } else { writeLines(helper.text(makeFileLevelOptimisticUniqueName)); } helpersEmitted = true; } } } return helpersEmitted; } function getSortedEmitHelpers(node) { const helpers = getEmitHelpers(node); return helpers && toSorted(helpers, compareEmitHelpers); } function emitNumericOrBigIntLiteral(node) { emitLiteral( node, /*jsxAttributeEscape*/ false ); } function emitLiteral(node, jsxAttributeEscape) { const text = getLiteralTextOfNode( node, /*sourceFile*/ void 0, printerOptions.neverAsciiEscape, jsxAttributeEscape ); if ((printerOptions.sourceMap || printerOptions.inlineSourceMap) && (node.kind === 11 /* StringLiteral */ || isTemplateLiteralKind(node.kind))) { writeLiteral(text); } else { writeStringLiteral(text); } } function emitSnippetNode(hint, node, snippet) { switch (snippet.kind) { case 1 /* Placeholder */: emitPlaceholder(hint, node, snippet); break; case 0 /* TabStop */: emitTabStop(hint, node, snippet); break; } } function emitPlaceholder(hint, node, snippet) { nonEscapingWrite(`\${${snippet.order}:`); pipelineEmitWithHintWorker( hint, node, /*allowSnippets*/ false ); nonEscapingWrite(`}`); } function emitTabStop(hint, node, snippet) { Debug.assert(node.kind === 243 /* EmptyStatement */, `A tab stop cannot be attached to a node of kind ${Debug.formatSyntaxKind(node.kind)}.`); Debug.assert(hint !== 5 /* EmbeddedStatement */, `A tab stop cannot be attached to an embedded statement.`); nonEscapingWrite(`$${snippet.order}`); } function emitIdentifier(node) { const writeText = node.symbol ? writeSymbol : write; writeText(getTextOfNode2( node, /*includeTrivia*/ false ), node.symbol); emitList(node, getIdentifierTypeArguments(node), 53776 /* TypeParameters */); } function emitPrivateIdentifier(node) { write(getTextOfNode2( node, /*includeTrivia*/ false )); } function emitQualifiedName(node) { emitEntityName(node.left); writePunctuation("."); emit(node.right); } function emitEntityName(node) { if (node.kind === 80 /* Identifier */) { emitExpression(node); } else { emit(node); } } function emitComputedPropertyName(node) { writePunctuation("["); emitExpression(node.expression, parenthesizer.parenthesizeExpressionOfComputedPropertyName); writePunctuation("]"); } function emitTypeParameter(node) { emitModifierList(node, node.modifiers); emit(node.name); if (node.constraint) { writeSpace(); writeKeyword("extends"); writeSpace(); emit(node.constraint); } if (node.default) { writeSpace(); writeOperator("="); writeSpace(); emit(node.default); } } function emitParameter(node) { emitDecoratorsAndModifiers( node, node.modifiers, /*allowDecorators*/ true ); emit(node.dotDotDotToken); emitNodeWithWriter(node.name, writeParameter); emit(node.questionToken); if (node.parent && node.parent.kind === 318 /* JSDocFunctionType */ && !node.name) { emit(node.type); } else { emitTypeAnnotation(node.type); } emitInitializer(node.initializer, node.type ? node.type.end : node.questionToken ? node.questionToken.end : node.name ? node.name.end : node.modifiers ? node.modifiers.end : node.pos, node, parenthesizer.parenthesizeExpressionForDisallowedComma); } function emitDecorator(decorator) { writePunctuation("@"); emitExpression(decorator.expression, parenthesizer.parenthesizeLeftSideOfAccess); } function emitPropertySignature(node) { emitModifierList(node, node.modifiers); emitNodeWithWriter(node.name, writeProperty); emit(node.questionToken); emitTypeAnnotation(node.type); writeTrailingSemicolon(); } function emitPropertyDeclaration(node) { emitDecoratorsAndModifiers( node, node.modifiers, /*allowDecorators*/ true ); emit(node.name); emit(node.questionToken); emit(node.exclamationToken); emitTypeAnnotation(node.type); emitInitializer(node.initializer, node.type ? node.type.end : node.questionToken ? node.questionToken.end : node.name.end, node); writeTrailingSemicolon(); } function emitMethodSignature(node) { emitModifierList(node, node.modifiers); emit(node.name); emit(node.questionToken); emitSignatureAndBody(node, emitSignatureHead, emitEmptyFunctionBody); } function emitMethodDeclaration(node) { emitDecoratorsAndModifiers( node, node.modifiers, /*allowDecorators*/ true ); emit(node.asteriskToken); emit(node.name); emit(node.questionToken); emitSignatureAndBody(node, emitSignatureHead, emitFunctionBody); } function emitClassStaticBlockDeclaration(node) { writeKeyword("static"); pushNameGenerationScope(node); emitBlockFunctionBody(node.body); popNameGenerationScope(node); } function emitConstructor(node) { emitDecoratorsAndModifiers( node, node.modifiers, /*allowDecorators*/ false ); writeKeyword("constructor"); emitSignatureAndBody(node, emitSignatureHead, emitFunctionBody); } function emitAccessorDeclaration(node) { const pos = emitDecoratorsAndModifiers( node, node.modifiers, /*allowDecorators*/ true ); const token = node.kind === 178 /* GetAccessor */ ? 139 /* GetKeyword */ : 153 /* SetKeyword */; emitTokenWithComment(token, pos, writeKeyword, node); writeSpace(); emit(node.name); emitSignatureAndBody(node, emitSignatureHead, emitFunctionBody); } function emitCallSignature(node) { emitSignatureAndBody(node, emitSignatureHead, emitEmptyFunctionBody); } function emitConstructSignature(node) { writeKeyword("new"); writeSpace(); emitSignatureAndBody(node, emitSignatureHead, emitEmptyFunctionBody); } function emitIndexSignature(node) { emitDecoratorsAndModifiers( node, node.modifiers, /*allowDecorators*/ false ); emitParametersForIndexSignature(node, node.parameters); emitTypeAnnotation(node.type); writeTrailingSemicolon(); } function emitTemplateTypeSpan(node) { emit(node.type); emit(node.literal); } function emitSemicolonClassElement() { writeTrailingSemicolon(); } function emitTypePredicate(node) { if (node.assertsModifier) { emit(node.assertsModifier); writeSpace(); } emit(node.parameterName); if (node.type) { writeSpace(); writeKeyword("is"); writeSpace(); emit(node.type); } } function emitTypeReference(node) { emit(node.typeName); emitTypeArguments(node, node.typeArguments); } function emitFunctionType(node) { emitSignatureAndBody(node, emitFunctionTypeHead, emitFunctionTypeBody); } function emitFunctionTypeHead(node) { emitTypeParameters(node, node.typeParameters); emitParametersForArrow(node, node.parameters); writeSpace(); writePunctuation("=>"); } function emitFunctionTypeBody(node) { writeSpace(); emit(node.type); } function emitJSDocFunctionType(node) { writeKeyword("function"); emitParameters(node, node.parameters); writePunctuation(":"); emit(node.type); } function emitJSDocNullableType(node) { writePunctuation("?"); emit(node.type); } function emitJSDocNonNullableType(node) { writePunctuation("!"); emit(node.type); } function emitJSDocOptionalType(node) { emit(node.type); writePunctuation("="); } function emitConstructorType(node) { emitModifierList(node, node.modifiers); writeKeyword("new"); writeSpace(); emitSignatureAndBody(node, emitFunctionTypeHead, emitFunctionTypeBody); } function emitTypeQuery(node) { writeKeyword("typeof"); writeSpace(); emit(node.exprName); emitTypeArguments(node, node.typeArguments); } function emitTypeLiteral(node) { pushNameGenerationScope(node); forEach(node.members, generateMemberNames); writePunctuation("{"); const flags = getEmitFlags(node) & 1 /* SingleLine */ ? 768 /* SingleLineTypeLiteralMembers */ : 32897 /* MultiLineTypeLiteralMembers */; emitList(node, node.members, flags | 524288 /* NoSpaceIfEmpty */); writePunctuation("}"); popNameGenerationScope(node); } function emitArrayType(node) { emit(node.elementType, parenthesizer.parenthesizeNonArrayTypeOfPostfixType); writePunctuation("["); writePunctuation("]"); } function emitRestOrJSDocVariadicType(node) { writePunctuation("..."); emit(node.type); } function emitTupleType(node) { emitTokenWithComment(23 /* OpenBracketToken */, node.pos, writePunctuation, node); const flags = getEmitFlags(node) & 1 /* SingleLine */ ? 528 /* SingleLineTupleTypeElements */ : 657 /* MultiLineTupleTypeElements */; emitList(node, node.elements, flags | 524288 /* NoSpaceIfEmpty */, parenthesizer.parenthesizeElementTypeOfTupleType); emitTokenWithComment(24 /* CloseBracketToken */, node.elements.end, writePunctuation, node); } function emitNamedTupleMember(node) { emit(node.dotDotDotToken); emit(node.name); emit(node.questionToken); emitTokenWithComment(59 /* ColonToken */, node.name.end, writePunctuation, node); writeSpace(); emit(node.type); } function emitOptionalType(node) { emit(node.type, parenthesizer.parenthesizeTypeOfOptionalType); writePunctuation("?"); } function emitUnionType(node) { emitList(node, node.types, 516 /* UnionTypeConstituents */, parenthesizer.parenthesizeConstituentTypeOfUnionType); } function emitIntersectionType(node) { emitList(node, node.types, 520 /* IntersectionTypeConstituents */, parenthesizer.parenthesizeConstituentTypeOfIntersectionType); } function emitConditionalType(node) { emit(node.checkType, parenthesizer.parenthesizeCheckTypeOfConditionalType); writeSpace(); writeKeyword("extends"); writeSpace(); emit(node.extendsType, parenthesizer.parenthesizeExtendsTypeOfConditionalType); writeSpace(); writePunctuation("?"); writeSpace(); emit(node.trueType); writeSpace(); writePunctuation(":"); writeSpace(); emit(node.falseType); } function emitInferType(node) { writeKeyword("infer"); writeSpace(); emit(node.typeParameter); } function emitParenthesizedType(node) { writePunctuation("("); emit(node.type); writePunctuation(")"); } function emitThisType() { writeKeyword("this"); } function emitTypeOperator(node) { writeTokenText(node.operator, writeKeyword); writeSpace(); const parenthesizerRule = node.operator === 148 /* ReadonlyKeyword */ ? parenthesizer.parenthesizeOperandOfReadonlyTypeOperator : parenthesizer.parenthesizeOperandOfTypeOperator; emit(node.type, parenthesizerRule); } function emitIndexedAccessType(node) { emit(node.objectType, parenthesizer.parenthesizeNonArrayTypeOfPostfixType); writePunctuation("["); emit(node.indexType); writePunctuation("]"); } function emitMappedType(node) { const emitFlags = getEmitFlags(node); writePunctuation("{"); if (emitFlags & 1 /* SingleLine */) { writeSpace(); } else { writeLine(); increaseIndent(); } if (node.readonlyToken) { emit(node.readonlyToken); if (node.readonlyToken.kind !== 148 /* ReadonlyKeyword */) { writeKeyword("readonly"); } writeSpace(); } writePunctuation("["); pipelineEmit(3 /* MappedTypeParameter */, node.typeParameter); if (node.nameType) { writeSpace(); writeKeyword("as"); writeSpace(); emit(node.nameType); } writePunctuation("]"); if (node.questionToken) { emit(node.questionToken); if (node.questionToken.kind !== 58 /* QuestionToken */) { writePunctuation("?"); } } writePunctuation(":"); writeSpace(); emit(node.type); writeTrailingSemicolon(); if (emitFlags & 1 /* SingleLine */) { writeSpace(); } else { writeLine(); decreaseIndent(); } emitList(node, node.members, 2 /* PreserveLines */); writePunctuation("}"); } function emitLiteralType(node) { emitExpression(node.literal); } function emitTemplateType(node) { emit(node.head); emitList(node, node.templateSpans, 262144 /* TemplateExpressionSpans */); } function emitImportTypeNode(node) { if (node.isTypeOf) { writeKeyword("typeof"); writeSpace(); } writeKeyword("import"); writePunctuation("("); emit(node.argument); if (node.attributes) { writePunctuation(","); writeSpace(); pipelineEmit(7 /* ImportTypeNodeAttributes */, node.attributes); } writePunctuation(")"); if (node.qualifier) { writePunctuation("."); emit(node.qualifier); } emitTypeArguments(node, node.typeArguments); } function emitObjectBindingPattern(node) { writePunctuation("{"); emitList(node, node.elements, 525136 /* ObjectBindingPatternElements */); writePunctuation("}"); } function emitArrayBindingPattern(node) { writePunctuation("["); emitList(node, node.elements, 524880 /* ArrayBindingPatternElements */); writePunctuation("]"); } function emitBindingElement(node) { emit(node.dotDotDotToken); if (node.propertyName) { emit(node.propertyName); writePunctuation(":"); writeSpace(); } emit(node.name); emitInitializer(node.initializer, node.name.end, node, parenthesizer.parenthesizeExpressionForDisallowedComma); } function emitArrayLiteralExpression(node) { const elements = node.elements; const preferNewLine = node.multiLine ? 65536 /* PreferNewLine */ : 0 /* None */; emitExpressionList(node, elements, 8914 /* ArrayLiteralExpressionElements */ | preferNewLine, parenthesizer.parenthesizeExpressionForDisallowedComma); } function emitObjectLiteralExpression(node) { pushNameGenerationScope(node); forEach(node.properties, generateMemberNames); const indentedFlag = getEmitFlags(node) & 131072 /* Indented */; if (indentedFlag) { increaseIndent(); } const preferNewLine = node.multiLine ? 65536 /* PreferNewLine */ : 0 /* None */; const allowTrailingComma = currentSourceFile && currentSourceFile.languageVersion >= 1 /* ES5 */ && !isJsonSourceFile(currentSourceFile) ? 64 /* AllowTrailingComma */ : 0 /* None */; emitList(node, node.properties, 526226 /* ObjectLiteralExpressionProperties */ | allowTrailingComma | preferNewLine); if (indentedFlag) { decreaseIndent(); } popNameGenerationScope(node); } function emitPropertyAccessExpression(node) { emitExpression(node.expression, parenthesizer.parenthesizeLeftSideOfAccess); const token = node.questionDotToken || setTextRangePosEnd(factory.createToken(25 /* DotToken */), node.expression.end, node.name.pos); const linesBeforeDot = getLinesBetweenNodes(node, node.expression, token); const linesAfterDot = getLinesBetweenNodes(node, token, node.name); writeLinesAndIndent( linesBeforeDot, /*writeSpaceIfNotIndenting*/ false ); const shouldEmitDotDot = token.kind !== 29 /* QuestionDotToken */ && mayNeedDotDotForPropertyAccess(node.expression) && !writer.hasTrailingComment() && !writer.hasTrailingWhitespace(); if (shouldEmitDotDot) { writePunctuation("."); } if (node.questionDotToken) { emit(token); } else { emitTokenWithComment(token.kind, node.expression.end, writePunctuation, node); } writeLinesAndIndent( linesAfterDot, /*writeSpaceIfNotIndenting*/ false ); emit(node.name); decreaseIndentIf(linesBeforeDot, linesAfterDot); } function mayNeedDotDotForPropertyAccess(expression) { expression = skipPartiallyEmittedExpressions(expression); if (isNumericLiteral(expression)) { const text = getLiteralTextOfNode( expression, /*sourceFile*/ void 0, /*neverAsciiEscape*/ true, /*jsxAttributeEscape*/ false ); return !(expression.numericLiteralFlags & 448 /* WithSpecifier */) && !text.includes(tokenToString(25 /* DotToken */)) && !text.includes(String.fromCharCode(69 /* E */)) && !text.includes(String.fromCharCode(101 /* e */)); } else if (isAccessExpression(expression)) { const constantValue = getConstantValue(expression); return typeof constantValue === "number" && isFinite(constantValue) && constantValue >= 0 && Math.floor(constantValue) === constantValue; } } function emitElementAccessExpression(node) { emitExpression(node.expression, parenthesizer.parenthesizeLeftSideOfAccess); emit(node.questionDotToken); emitTokenWithComment(23 /* OpenBracketToken */, node.expression.end, writePunctuation, node); emitExpression(node.argumentExpression); emitTokenWithComment(24 /* CloseBracketToken */, node.argumentExpression.end, writePunctuation, node); } function emitCallExpression(node) { const indirectCall = getInternalEmitFlags(node) & 16 /* IndirectCall */; if (indirectCall) { writePunctuation("("); writeLiteral("0"); writePunctuation(","); writeSpace(); } emitExpression(node.expression, parenthesizer.parenthesizeLeftSideOfAccess); if (indirectCall) { writePunctuation(")"); } emit(node.questionDotToken); emitTypeArguments(node, node.typeArguments); emitExpressionList(node, node.arguments, 2576 /* CallExpressionArguments */, parenthesizer.parenthesizeExpressionForDisallowedComma); } function emitNewExpression(node) { emitTokenWithComment(105 /* NewKeyword */, node.pos, writeKeyword, node); writeSpace(); emitExpression(node.expression, parenthesizer.parenthesizeExpressionOfNew); emitTypeArguments(node, node.typeArguments); emitExpressionList(node, node.arguments, 18960 /* NewExpressionArguments */, parenthesizer.parenthesizeExpressionForDisallowedComma); } function emitTaggedTemplateExpression(node) { const indirectCall = getInternalEmitFlags(node) & 16 /* IndirectCall */; if (indirectCall) { writePunctuation("("); writeLiteral("0"); writePunctuation(","); writeSpace(); } emitExpression(node.tag, parenthesizer.parenthesizeLeftSideOfAccess); if (indirectCall) { writePunctuation(")"); } emitTypeArguments(node, node.typeArguments); writeSpace(); emitExpression(node.template); } function emitTypeAssertionExpression(node) { writePunctuation("<"); emit(node.type); writePunctuation(">"); emitExpression(node.expression, parenthesizer.parenthesizeOperandOfPrefixUnary); } function emitParenthesizedExpression(node) { const openParenPos = emitTokenWithComment(21 /* OpenParenToken */, node.pos, writePunctuation, node); const indented = writeLineSeparatorsAndIndentBefore(node.expression, node); emitExpression( node.expression, /*parenthesizerRule*/ void 0 ); writeLineSeparatorsAfter(node.expression, node); decreaseIndentIf(indented); emitTokenWithComment(22 /* CloseParenToken */, node.expression ? node.expression.end : openParenPos, writePunctuation, node); } function emitFunctionExpression(node) { generateNameIfNeeded(node.name); emitFunctionDeclarationOrExpression(node); } function emitArrowFunction(node) { emitModifierList(node, node.modifiers); emitSignatureAndBody(node, emitArrowFunctionHead, emitArrowFunctionBody); } function emitArrowFunctionHead(node) { emitTypeParameters(node, node.typeParameters); emitParametersForArrow(node, node.parameters); emitTypeAnnotation(node.type); writeSpace(); emit(node.equalsGreaterThanToken); } function emitArrowFunctionBody(node) { if (isBlock(node.body)) { emitBlockFunctionBody(node.body); } else { writeSpace(); emitExpression(node.body, parenthesizer.parenthesizeConciseBodyOfArrowFunction); } } function emitDeleteExpression(node) { emitTokenWithComment(91 /* DeleteKeyword */, node.pos, writeKeyword, node); writeSpace(); emitExpression(node.expression, parenthesizer.parenthesizeOperandOfPrefixUnary); } function emitTypeOfExpression(node) { emitTokenWithComment(114 /* TypeOfKeyword */, node.pos, writeKeyword, node); writeSpace(); emitExpression(node.expression, parenthesizer.parenthesizeOperandOfPrefixUnary); } function emitVoidExpression(node) { emitTokenWithComment(116 /* VoidKeyword */, node.pos, writeKeyword, node); writeSpace(); emitExpression(node.expression, parenthesizer.parenthesizeOperandOfPrefixUnary); } function emitAwaitExpression(node) { emitTokenWithComment(135 /* AwaitKeyword */, node.pos, writeKeyword, node); writeSpace(); emitExpression(node.expression, parenthesizer.parenthesizeOperandOfPrefixUnary); } function emitPrefixUnaryExpression(node) { writeTokenText(node.operator, writeOperator); if (shouldEmitWhitespaceBeforeOperand(node)) { writeSpace(); } emitExpression(node.operand, parenthesizer.parenthesizeOperandOfPrefixUnary); } function shouldEmitWhitespaceBeforeOperand(node) { const operand = node.operand; return operand.kind === 225 /* PrefixUnaryExpression */ && (node.operator === 40 /* PlusToken */ && (operand.operator === 40 /* PlusToken */ || operand.operator === 46 /* PlusPlusToken */) || node.operator === 41 /* MinusToken */ && (operand.operator === 41 /* MinusToken */ || operand.operator === 47 /* MinusMinusToken */)); } function emitPostfixUnaryExpression(node) { emitExpression(node.operand, parenthesizer.parenthesizeOperandOfPostfixUnary); writeTokenText(node.operator, writeOperator); } function createEmitBinaryExpression() { return createBinaryExpressionTrampoline( onEnter, onLeft, onOperator, onRight, onExit, /*foldState*/ void 0 ); function onEnter(node, state) { if (state) { state.stackIndex++; state.preserveSourceNewlinesStack[state.stackIndex] = preserveSourceNewlines; state.containerPosStack[state.stackIndex] = containerPos; state.containerEndStack[state.stackIndex] = containerEnd; state.declarationListContainerEndStack[state.stackIndex] = declarationListContainerEnd; const emitComments2 = state.shouldEmitCommentsStack[state.stackIndex] = shouldEmitComments(node); const emitSourceMaps = state.shouldEmitSourceMapsStack[state.stackIndex] = shouldEmitSourceMaps(node); onBeforeEmitNode == null ? void 0 : onBeforeEmitNode(node); if (emitComments2) emitCommentsBeforeNode(node); if (emitSourceMaps) emitSourceMapsBeforeNode(node); beforeEmitNode(node); } else { state = { stackIndex: 0, preserveSourceNewlinesStack: [void 0], containerPosStack: [-1], containerEndStack: [-1], declarationListContainerEndStack: [-1], shouldEmitCommentsStack: [false], shouldEmitSourceMapsStack: [false] }; } return state; } function onLeft(next, _workArea, parent) { return maybeEmitExpression(next, parent, "left"); } function onOperator(operatorToken, _state, node) { const isCommaOperator = operatorToken.kind !== 28 /* CommaToken */; const linesBeforeOperator = getLinesBetweenNodes(node, node.left, operatorToken); const linesAfterOperator = getLinesBetweenNodes(node, operatorToken, node.right); writeLinesAndIndent(linesBeforeOperator, isCommaOperator); emitLeadingCommentsOfPosition(operatorToken.pos); writeTokenNode(operatorToken, operatorToken.kind === 103 /* InKeyword */ ? writeKeyword : writeOperator); emitTrailingCommentsOfPosition( operatorToken.end, /*prefixSpace*/ true ); writeLinesAndIndent( linesAfterOperator, /*writeSpaceIfNotIndenting*/ true ); } function onRight(next, _workArea, parent) { return maybeEmitExpression(next, parent, "right"); } function onExit(node, state) { const linesBeforeOperator = getLinesBetweenNodes(node, node.left, node.operatorToken); const linesAfterOperator = getLinesBetweenNodes(node, node.operatorToken, node.right); decreaseIndentIf(linesBeforeOperator, linesAfterOperator); if (state.stackIndex > 0) { const savedPreserveSourceNewlines = state.preserveSourceNewlinesStack[state.stackIndex]; const savedContainerPos = state.containerPosStack[state.stackIndex]; const savedContainerEnd = state.containerEndStack[state.stackIndex]; const savedDeclarationListContainerEnd = state.declarationListContainerEndStack[state.stackIndex]; const shouldEmitComments2 = state.shouldEmitCommentsStack[state.stackIndex]; const shouldEmitSourceMaps2 = state.shouldEmitSourceMapsStack[state.stackIndex]; afterEmitNode(savedPreserveSourceNewlines); if (shouldEmitSourceMaps2) emitSourceMapsAfterNode(node); if (shouldEmitComments2) emitCommentsAfterNode(node, savedContainerPos, savedContainerEnd, savedDeclarationListContainerEnd); onAfterEmitNode == null ? void 0 : onAfterEmitNode(node); state.stackIndex--; } } function maybeEmitExpression(next, parent, side) { const parenthesizerRule = side === "left" ? parenthesizer.getParenthesizeLeftSideOfBinaryForOperator(parent.operatorToken.kind) : parenthesizer.getParenthesizeRightSideOfBinaryForOperator(parent.operatorToken.kind); let pipelinePhase = getPipelinePhase(0 /* Notification */, 1 /* Expression */, next); if (pipelinePhase === pipelineEmitWithSubstitution) { Debug.assertIsDefined(lastSubstitution); next = parenthesizerRule(cast(lastSubstitution, isExpression)); pipelinePhase = getNextPipelinePhase(1 /* Substitution */, 1 /* Expression */, next); lastSubstitution = void 0; } if (pipelinePhase === pipelineEmitWithComments || pipelinePhase === pipelineEmitWithSourceMaps || pipelinePhase === pipelineEmitWithHint) { if (isBinaryExpression(next)) { return next; } } currentParenthesizerRule = parenthesizerRule; pipelinePhase(1 /* Expression */, next); } } function emitConditionalExpression(node) { const linesBeforeQuestion = getLinesBetweenNodes(node, node.condition, node.questionToken); const linesAfterQuestion = getLinesBetweenNodes(node, node.questionToken, node.whenTrue); const linesBeforeColon = getLinesBetweenNodes(node, node.whenTrue, node.colonToken); const linesAfterColon = getLinesBetweenNodes(node, node.colonToken, node.whenFalse); emitExpression(node.condition, parenthesizer.parenthesizeConditionOfConditionalExpression); writeLinesAndIndent( linesBeforeQuestion, /*writeSpaceIfNotIndenting*/ true ); emit(node.questionToken); writeLinesAndIndent( linesAfterQuestion, /*writeSpaceIfNotIndenting*/ true ); emitExpression(node.whenTrue, parenthesizer.parenthesizeBranchOfConditionalExpression); decreaseIndentIf(linesBeforeQuestion, linesAfterQuestion); writeLinesAndIndent( linesBeforeColon, /*writeSpaceIfNotIndenting*/ true ); emit(node.colonToken); writeLinesAndIndent( linesAfterColon, /*writeSpaceIfNotIndenting*/ true ); emitExpression(node.whenFalse, parenthesizer.parenthesizeBranchOfConditionalExpression); decreaseIndentIf(linesBeforeColon, linesAfterColon); } function emitTemplateExpression(node) { emit(node.head); emitList(node, node.templateSpans, 262144 /* TemplateExpressionSpans */); } function emitYieldExpression(node) { emitTokenWithComment(127 /* YieldKeyword */, node.pos, writeKeyword, node); emit(node.asteriskToken); emitExpressionWithLeadingSpace(node.expression && parenthesizeExpressionForNoAsi(node.expression), parenthesizeExpressionForNoAsiAndDisallowedComma); } function emitSpreadElement(node) { emitTokenWithComment(26 /* DotDotDotToken */, node.pos, writePunctuation, node); emitExpression(node.expression, parenthesizer.parenthesizeExpressionForDisallowedComma); } function emitClassExpression(node) { generateNameIfNeeded(node.name); emitClassDeclarationOrExpression(node); } function emitExpressionWithTypeArguments(node) { emitExpression(node.expression, parenthesizer.parenthesizeLeftSideOfAccess); emitTypeArguments(node, node.typeArguments); } function emitAsExpression(node) { emitExpression( node.expression, /*parenthesizerRule*/ void 0 ); if (node.type) { writeSpace(); writeKeyword("as"); writeSpace(); emit(node.type); } } function emitNonNullExpression(node) { emitExpression(node.expression, parenthesizer.parenthesizeLeftSideOfAccess); writeOperator("!"); } function emitSatisfiesExpression(node) { emitExpression( node.expression, /*parenthesizerRule*/ void 0 ); if (node.type) { writeSpace(); writeKeyword("satisfies"); writeSpace(); emit(node.type); } } function emitMetaProperty(node) { writeToken(node.keywordToken, node.pos, writePunctuation); writePunctuation("."); emit(node.name); } function emitTemplateSpan(node) { emitExpression(node.expression); emit(node.literal); } function emitBlock(node) { emitBlockStatements( node, /*forceSingleLine*/ !node.multiLine && isEmptyBlock(node) ); } function emitBlockStatements(node, forceSingleLine) { emitTokenWithComment( 19 /* OpenBraceToken */, node.pos, writePunctuation, /*contextNode*/ node ); const format = forceSingleLine || getEmitFlags(node) & 1 /* SingleLine */ ? 768 /* SingleLineBlockStatements */ : 129 /* MultiLineBlockStatements */; emitList(node, node.statements, format); emitTokenWithComment( 20 /* CloseBraceToken */, node.statements.end, writePunctuation, /*contextNode*/ node, /*indentLeading*/ !!(format & 1 /* MultiLine */) ); } function emitVariableStatement(node) { emitDecoratorsAndModifiers( node, node.modifiers, /*allowDecorators*/ false ); emit(node.declarationList); writeTrailingSemicolon(); } function emitEmptyStatement(isEmbeddedStatement) { if (isEmbeddedStatement) { writePunctuation(";"); } else { writeTrailingSemicolon(); } } function emitExpressionStatement(node) { emitExpression(node.expression, parenthesizer.parenthesizeExpressionOfExpressionStatement); if (!currentSourceFile || !isJsonSourceFile(currentSourceFile) || nodeIsSynthesized(node.expression)) { writeTrailingSemicolon(); } } function emitIfStatement(node) { const openParenPos = emitTokenWithComment(101 /* IfKeyword */, node.pos, writeKeyword, node); writeSpace(); emitTokenWithComment(21 /* OpenParenToken */, openParenPos, writePunctuation, node); emitExpression(node.expression); emitTokenWithComment(22 /* CloseParenToken */, node.expression.end, writePunctuation, node); emitEmbeddedStatement(node, node.thenStatement); if (node.elseStatement) { writeLineOrSpace(node, node.thenStatement, node.elseStatement); emitTokenWithComment(93 /* ElseKeyword */, node.thenStatement.end, writeKeyword, node); if (node.elseStatement.kind === 246 /* IfStatement */) { writeSpace(); emit(node.elseStatement); } else { emitEmbeddedStatement(node, node.elseStatement); } } } function emitWhileClause(node, startPos) { const openParenPos = emitTokenWithComment(117 /* WhileKeyword */, startPos, writeKeyword, node); writeSpace(); emitTokenWithComment(21 /* OpenParenToken */, openParenPos, writePunctuation, node); emitExpression(node.expression); emitTokenWithComment(22 /* CloseParenToken */, node.expression.end, writePunctuation, node); } function emitDoStatement(node) { emitTokenWithComment(92 /* DoKeyword */, node.pos, writeKeyword, node); emitEmbeddedStatement(node, node.statement); if (isBlock(node.statement) && !preserveSourceNewlines) { writeSpace(); } else { writeLineOrSpace(node, node.statement, node.expression); } emitWhileClause(node, node.statement.end); writeTrailingSemicolon(); } function emitWhileStatement(node) { emitWhileClause(node, node.pos); emitEmbeddedStatement(node, node.statement); } function emitForStatement(node) { const openParenPos = emitTokenWithComment(99 /* ForKeyword */, node.pos, writeKeyword, node); writeSpace(); let pos = emitTokenWithComment( 21 /* OpenParenToken */, openParenPos, writePunctuation, /*contextNode*/ node ); emitForBinding(node.initializer); pos = emitTokenWithComment(27 /* SemicolonToken */, node.initializer ? node.initializer.end : pos, writePunctuation, node); emitExpressionWithLeadingSpace(node.condition); pos = emitTokenWithComment(27 /* SemicolonToken */, node.condition ? node.condition.end : pos, writePunctuation, node); emitExpressionWithLeadingSpace(node.incrementor); emitTokenWithComment(22 /* CloseParenToken */, node.incrementor ? node.incrementor.end : pos, writePunctuation, node); emitEmbeddedStatement(node, node.statement); } function emitForInStatement(node) { const openParenPos = emitTokenWithComment(99 /* ForKeyword */, node.pos, writeKeyword, node); writeSpace(); emitTokenWithComment(21 /* OpenParenToken */, openParenPos, writePunctuation, node); emitForBinding(node.initializer); writeSpace(); emitTokenWithComment(103 /* InKeyword */, node.initializer.end, writeKeyword, node); writeSpace(); emitExpression(node.expression); emitTokenWithComment(22 /* CloseParenToken */, node.expression.end, writePunctuation, node); emitEmbeddedStatement(node, node.statement); } function emitForOfStatement(node) { const openParenPos = emitTokenWithComment(99 /* ForKeyword */, node.pos, writeKeyword, node); writeSpace(); emitWithTrailingSpace(node.awaitModifier); emitTokenWithComment(21 /* OpenParenToken */, openParenPos, writePunctuation, node); emitForBinding(node.initializer); writeSpace(); emitTokenWithComment(165 /* OfKeyword */, node.initializer.end, writeKeyword, node); writeSpace(); emitExpression(node.expression); emitTokenWithComment(22 /* CloseParenToken */, node.expression.end, writePunctuation, node); emitEmbeddedStatement(node, node.statement); } function emitForBinding(node) { if (node !== void 0) { if (node.kind === 262 /* VariableDeclarationList */) { emit(node); } else { emitExpression(node); } } } function emitContinueStatement(node) { emitTokenWithComment(88 /* ContinueKeyword */, node.pos, writeKeyword, node); emitWithLeadingSpace(node.label); writeTrailingSemicolon(); } function emitBreakStatement(node) { emitTokenWithComment(83 /* BreakKeyword */, node.pos, writeKeyword, node); emitWithLeadingSpace(node.label); writeTrailingSemicolon(); } function emitTokenWithComment(token, pos, writer2, contextNode, indentLeading) { const node = getParseTreeNode(contextNode); const isSimilarNode = node && node.kind === contextNode.kind; const startPos = pos; if (isSimilarNode && currentSourceFile) { pos = skipTrivia(currentSourceFile.text, pos); } if (isSimilarNode && contextNode.pos !== startPos) { const needsIndent = indentLeading && currentSourceFile && !positionsAreOnSameLine(startPos, pos, currentSourceFile); if (needsIndent) { increaseIndent(); } emitLeadingCommentsOfPosition(startPos); if (needsIndent) { decreaseIndent(); } } if (!omitBraceSourcePositions && (token === 19 /* OpenBraceToken */ || token === 20 /* CloseBraceToken */)) { pos = writeToken(token, pos, writer2, contextNode); } else { pos = writeTokenText(token, writer2, pos); } if (isSimilarNode && contextNode.end !== pos) { const isJsxExprContext = contextNode.kind === 295 /* JsxExpression */; emitTrailingCommentsOfPosition( pos, /*prefixSpace*/ !isJsxExprContext, /*forceNoNewline*/ isJsxExprContext ); } return pos; } function commentWillEmitNewLine(node) { return node.kind === 2 /* SingleLineCommentTrivia */ || !!node.hasTrailingNewLine; } function willEmitLeadingNewLine(node) { if (!currentSourceFile) return false; const leadingCommentRanges = getLeadingCommentRanges(currentSourceFile.text, node.pos); if (leadingCommentRanges) { const parseNode = getParseTreeNode(node); if (parseNode && isParenthesizedExpression(parseNode.parent)) { return true; } } if (some(leadingCommentRanges, commentWillEmitNewLine)) return true; if (some(getSyntheticLeadingComments(node), commentWillEmitNewLine)) return true; if (isPartiallyEmittedExpression(node)) { if (node.pos !== node.expression.pos) { if (some(getTrailingCommentRanges(currentSourceFile.text, node.expression.pos), commentWillEmitNewLine)) return true; } return willEmitLeadingNewLine(node.expression); } return false; } function parenthesizeExpressionForNoAsi(node) { if (!commentsDisabled) { switch (node.kind) { case 356 /* PartiallyEmittedExpression */: if (willEmitLeadingNewLine(node)) { const parseNode = getParseTreeNode(node); if (parseNode && isParenthesizedExpression(parseNode)) { const parens = factory.createParenthesizedExpression(node.expression); setOriginalNode(parens, node); setTextRange(parens, parseNode); return parens; } return factory.createParenthesizedExpression(node); } return factory.updatePartiallyEmittedExpression( node, parenthesizeExpressionForNoAsi(node.expression) ); case 212 /* PropertyAccessExpression */: return factory.updatePropertyAccessExpression( node, parenthesizeExpressionForNoAsi(node.expression), node.name ); case 213 /* ElementAccessExpression */: return factory.updateElementAccessExpression( node, parenthesizeExpressionForNoAsi(node.expression), node.argumentExpression ); case 214 /* CallExpression */: return factory.updateCallExpression( node, parenthesizeExpressionForNoAsi(node.expression), node.typeArguments, node.arguments ); case 216 /* TaggedTemplateExpression */: return factory.updateTaggedTemplateExpression( node, parenthesizeExpressionForNoAsi(node.tag), node.typeArguments, node.template ); case 226 /* PostfixUnaryExpression */: return factory.updatePostfixUnaryExpression( node, parenthesizeExpressionForNoAsi(node.operand) ); case 227 /* BinaryExpression */: return factory.updateBinaryExpression( node, parenthesizeExpressionForNoAsi(node.left), node.operatorToken, node.right ); case 228 /* ConditionalExpression */: return factory.updateConditionalExpression( node, parenthesizeExpressionForNoAsi(node.condition), node.questionToken, node.whenTrue, node.colonToken, node.whenFalse ); case 235 /* AsExpression */: return factory.updateAsExpression( node, parenthesizeExpressionForNoAsi(node.expression), node.type ); case 239 /* SatisfiesExpression */: return factory.updateSatisfiesExpression( node, parenthesizeExpressionForNoAsi(node.expression), node.type ); case 236 /* NonNullExpression */: return factory.updateNonNullExpression( node, parenthesizeExpressionForNoAsi(node.expression) ); } } return node; } function parenthesizeExpressionForNoAsiAndDisallowedComma(node) { return parenthesizeExpressionForNoAsi(parenthesizer.parenthesizeExpressionForDisallowedComma(node)); } function emitReturnStatement(node) { emitTokenWithComment( 107 /* ReturnKeyword */, node.pos, writeKeyword, /*contextNode*/ node ); emitExpressionWithLeadingSpace(node.expression && parenthesizeExpressionForNoAsi(node.expression), parenthesizeExpressionForNoAsi); writeTrailingSemicolon(); } function emitWithStatement(node) { const openParenPos = emitTokenWithComment(118 /* WithKeyword */, node.pos, writeKeyword, node); writeSpace(); emitTokenWithComment(21 /* OpenParenToken */, openParenPos, writePunctuation, node); emitExpression(node.expression); emitTokenWithComment(22 /* CloseParenToken */, node.expression.end, writePunctuation, node); emitEmbeddedStatement(node, node.statement); } function emitSwitchStatement(node) { const openParenPos = emitTokenWithComment(109 /* SwitchKeyword */, node.pos, writeKeyword, node); writeSpace(); emitTokenWithComment(21 /* OpenParenToken */, openParenPos, writePunctuation, node); emitExpression(node.expression); emitTokenWithComment(22 /* CloseParenToken */, node.expression.end, writePunctuation, node); writeSpace(); emit(node.caseBlock); } function emitLabeledStatement(node) { emit(node.label); emitTokenWithComment(59 /* ColonToken */, node.label.end, writePunctuation, node); writeSpace(); emit(node.statement); } function emitThrowStatement(node) { emitTokenWithComment(111 /* ThrowKeyword */, node.pos, writeKeyword, node); emitExpressionWithLeadingSpace(parenthesizeExpressionForNoAsi(node.expression), parenthesizeExpressionForNoAsi); writeTrailingSemicolon(); } function emitTryStatement(node) { emitTokenWithComment(113 /* TryKeyword */, node.pos, writeKeyword, node); writeSpace(); emit(node.tryBlock); if (node.catchClause) { writeLineOrSpace(node, node.tryBlock, node.catchClause); emit(node.catchClause); } if (node.finallyBlock) { writeLineOrSpace(node, node.catchClause || node.tryBlock, node.finallyBlock); emitTokenWithComment(98 /* FinallyKeyword */, (node.catchClause || node.tryBlock).end, writeKeyword, node); writeSpace(); emit(node.finallyBlock); } } function emitDebuggerStatement(node) { writeToken(89 /* DebuggerKeyword */, node.pos, writeKeyword); writeTrailingSemicolon(); } function emitVariableDeclaration(node) { var _a, _b, _c; emit(node.name); emit(node.exclamationToken); emitTypeAnnotation(node.type); emitInitializer(node.initializer, ((_a = node.type) == null ? void 0 : _a.end) ?? ((_c = (_b = node.name.emitNode) == null ? void 0 : _b.typeNode) == null ? void 0 : _c.end) ?? node.name.end, node, parenthesizer.parenthesizeExpressionForDisallowedComma); } function emitVariableDeclarationList(node) { if (isVarAwaitUsing(node)) { writeKeyword("await"); writeSpace(); writeKeyword("using"); } else { const head = isLet(node) ? "let" : isVarConst(node) ? "const" : isVarUsing(node) ? "using" : "var"; writeKeyword(head); } writeSpace(); emitList(node, node.declarations, 528 /* VariableDeclarationList */); } function emitFunctionDeclaration(node) { emitFunctionDeclarationOrExpression(node); } function emitFunctionDeclarationOrExpression(node) { emitDecoratorsAndModifiers( node, node.modifiers, /*allowDecorators*/ false ); writeKeyword("function"); emit(node.asteriskToken); writeSpace(); emitIdentifierName(node.name); emitSignatureAndBody(node, emitSignatureHead, emitFunctionBody); } function emitSignatureAndBody(node, emitSignatureHead2, emitBody) { const indentedFlag = getEmitFlags(node) & 131072 /* Indented */; if (indentedFlag) { increaseIndent(); } pushNameGenerationScope(node); forEach(node.parameters, generateNames); emitSignatureHead2(node); emitBody(node); popNameGenerationScope(node); if (indentedFlag) { decreaseIndent(); } } function emitFunctionBody(node) { const body = node.body; if (body) { emitBlockFunctionBody(body); } else { writeTrailingSemicolon(); } } function emitEmptyFunctionBody(_node) { writeTrailingSemicolon(); } function emitSignatureHead(node) { emitTypeParameters(node, node.typeParameters); emitParameters(node, node.parameters); emitTypeAnnotation(node.type); } function shouldEmitBlockFunctionBodyOnSingleLine(body) { if (getEmitFlags(body) & 1 /* SingleLine */) { return true; } if (body.multiLine) { return false; } if (!nodeIsSynthesized(body) && currentSourceFile && !rangeIsOnSingleLine(body, currentSourceFile)) { return false; } if (getLeadingLineTerminatorCount(body, firstOrUndefined(body.statements), 2 /* PreserveLines */) || getClosingLineTerminatorCount(body, lastOrUndefined(body.statements), 2 /* PreserveLines */, body.statements)) { return false; } let previousStatement; for (const statement of body.statements) { if (getSeparatingLineTerminatorCount(previousStatement, statement, 2 /* PreserveLines */) > 0) { return false; } previousStatement = statement; } return true; } function emitBlockFunctionBody(body) { generateNames(body); onBeforeEmitNode == null ? void 0 : onBeforeEmitNode(body); writeSpace(); writePunctuation("{"); increaseIndent(); const emitBlockFunctionBody2 = shouldEmitBlockFunctionBodyOnSingleLine(body) ? emitBlockFunctionBodyOnSingleLine : emitBlockFunctionBodyWorker; emitBodyWithDetachedComments(body, body.statements, emitBlockFunctionBody2); decreaseIndent(); writeToken(20 /* CloseBraceToken */, body.statements.end, writePunctuation, body); onAfterEmitNode == null ? void 0 : onAfterEmitNode(body); } function emitBlockFunctionBodyOnSingleLine(body) { emitBlockFunctionBodyWorker( body, /*emitBlockFunctionBodyOnSingleLine*/ true ); } function emitBlockFunctionBodyWorker(body, emitBlockFunctionBodyOnSingleLine2) { const statementOffset = emitPrologueDirectives(body.statements); const pos = writer.getTextPos(); emitHelpers(body); if (statementOffset === 0 && pos === writer.getTextPos() && emitBlockFunctionBodyOnSingleLine2) { decreaseIndent(); emitList(body, body.statements, 768 /* SingleLineFunctionBodyStatements */); increaseIndent(); } else { emitList( body, body.statements, 1 /* MultiLineFunctionBodyStatements */, /*parenthesizerRule*/ void 0, statementOffset ); } } function emitClassDeclaration(node) { emitClassDeclarationOrExpression(node); } function emitClassDeclarationOrExpression(node) { emitDecoratorsAndModifiers( node, node.modifiers, /*allowDecorators*/ true ); emitTokenWithComment(86 /* ClassKeyword */, moveRangePastModifiers(node).pos, writeKeyword, node); if (node.name) { writeSpace(); emitIdentifierName(node.name); } const indentedFlag = getEmitFlags(node) & 131072 /* Indented */; if (indentedFlag) { increaseIndent(); } emitTypeParameters(node, node.typeParameters); emitList(node, node.heritageClauses, 0 /* ClassHeritageClauses */); writeSpace(); writePunctuation("{"); pushNameGenerationScope(node); forEach(node.members, generateMemberNames); emitList(node, node.members, 129 /* ClassMembers */); popNameGenerationScope(node); writePunctuation("}"); if (indentedFlag) { decreaseIndent(); } } function emitInterfaceDeclaration(node) { emitDecoratorsAndModifiers( node, node.modifiers, /*allowDecorators*/ false ); writeKeyword("interface"); writeSpace(); emit(node.name); emitTypeParameters(node, node.typeParameters); emitList(node, node.heritageClauses, 512 /* HeritageClauses */); writeSpace(); writePunctuation("{"); pushNameGenerationScope(node); forEach(node.members, generateMemberNames); emitList(node, node.members, 129 /* InterfaceMembers */); popNameGenerationScope(node); writePunctuation("}"); } function emitTypeAliasDeclaration(node) { emitDecoratorsAndModifiers( node, node.modifiers, /*allowDecorators*/ false ); writeKeyword("type"); writeSpace(); emit(node.name); emitTypeParameters(node, node.typeParameters); writeSpace(); writePunctuation("="); writeSpace(); emit(node.type); writeTrailingSemicolon(); } function emitEnumDeclaration(node) { emitDecoratorsAndModifiers( node, node.modifiers, /*allowDecorators*/ false ); writeKeyword("enum"); writeSpace(); emit(node.name); writeSpace(); writePunctuation("{"); emitList(node, node.members, 145 /* EnumMembers */); writePunctuation("}"); } function emitModuleDeclaration(node) { emitDecoratorsAndModifiers( node, node.modifiers, /*allowDecorators*/ false ); if (~node.flags & 2048 /* GlobalAugmentation */) { writeKeyword(node.flags & 32 /* Namespace */ ? "namespace" : "module"); writeSpace(); } emit(node.name); let body = node.body; if (!body) return writeTrailingSemicolon(); while (body && isModuleDeclaration(body)) { writePunctuation("."); emit(body.name); body = body.body; } writeSpace(); emit(body); } function emitModuleBlock(node) { pushNameGenerationScope(node); forEach(node.statements, generateNames); emitBlockStatements( node, /*forceSingleLine*/ isEmptyBlock(node) ); popNameGenerationScope(node); } function emitCaseBlock(node) { emitTokenWithComment(19 /* OpenBraceToken */, node.pos, writePunctuation, node); emitList(node, node.clauses, 129 /* CaseBlockClauses */); emitTokenWithComment( 20 /* CloseBraceToken */, node.clauses.end, writePunctuation, node, /*indentLeading*/ true ); } function emitImportEqualsDeclaration(node) { emitDecoratorsAndModifiers( node, node.modifiers, /*allowDecorators*/ false ); emitTokenWithComment(102 /* ImportKeyword */, node.modifiers ? node.modifiers.end : node.pos, writeKeyword, node); writeSpace(); if (node.isTypeOnly) { emitTokenWithComment(156 /* TypeKeyword */, node.pos, writeKeyword, node); writeSpace(); } emit(node.name); writeSpace(); emitTokenWithComment(64 /* EqualsToken */, node.name.end, writePunctuation, node); writeSpace(); emitModuleReference(node.moduleReference); writeTrailingSemicolon(); } function emitModuleReference(node) { if (node.kind === 80 /* Identifier */) { emitExpression(node); } else { emit(node); } } function emitImportDeclaration(node) { emitDecoratorsAndModifiers( node, node.modifiers, /*allowDecorators*/ false ); emitTokenWithComment(102 /* ImportKeyword */, node.modifiers ? node.modifiers.end : node.pos, writeKeyword, node); writeSpace(); if (node.importClause) { emit(node.importClause); writeSpace(); emitTokenWithComment(161 /* FromKeyword */, node.importClause.end, writeKeyword, node); writeSpace(); } emitExpression(node.moduleSpecifier); if (node.attributes) { emitWithLeadingSpace(node.attributes); } writeTrailingSemicolon(); } function emitImportClause(node) { if (node.phaseModifier !== void 0) { emitTokenWithComment(node.phaseModifier, node.pos, writeKeyword, node); writeSpace(); } emit(node.name); if (node.name && node.namedBindings) { emitTokenWithComment(28 /* CommaToken */, node.name.end, writePunctuation, node); writeSpace(); } emit(node.namedBindings); } function emitNamespaceImport(node) { const asPos = emitTokenWithComment(42 /* AsteriskToken */, node.pos, writePunctuation, node); writeSpace(); emitTokenWithComment(130 /* AsKeyword */, asPos, writeKeyword, node); writeSpace(); emit(node.name); } function emitNamedImports(node) { emitNamedImportsOrExports(node); } function emitImportSpecifier(node) { emitImportOrExportSpecifier(node); } function emitExportAssignment(node) { const nextPos = emitTokenWithComment(95 /* ExportKeyword */, node.pos, writeKeyword, node); writeSpace(); if (node.isExportEquals) { emitTokenWithComment(64 /* EqualsToken */, nextPos, writeOperator, node); } else { emitTokenWithComment(90 /* DefaultKeyword */, nextPos, writeKeyword, node); } writeSpace(); emitExpression( node.expression, node.isExportEquals ? parenthesizer.getParenthesizeRightSideOfBinaryForOperator(64 /* EqualsToken */) : parenthesizer.parenthesizeExpressionOfExportDefault ); writeTrailingSemicolon(); } function emitExportDeclaration(node) { emitDecoratorsAndModifiers( node, node.modifiers, /*allowDecorators*/ false ); let nextPos = emitTokenWithComment(95 /* ExportKeyword */, node.pos, writeKeyword, node); writeSpace(); if (node.isTypeOnly) { nextPos = emitTokenWithComment(156 /* TypeKeyword */, nextPos, writeKeyword, node); writeSpace(); } if (node.exportClause) { emit(node.exportClause); } else { nextPos = emitTokenWithComment(42 /* AsteriskToken */, nextPos, writePunctuation, node); } if (node.moduleSpecifier) { writeSpace(); const fromPos = node.exportClause ? node.exportClause.end : nextPos; emitTokenWithComment(161 /* FromKeyword */, fromPos, writeKeyword, node); writeSpace(); emitExpression(node.moduleSpecifier); } if (node.attributes) { emitWithLeadingSpace(node.attributes); } writeTrailingSemicolon(); } function emitImportTypeNodeAttributes(node) { writePunctuation("{"); writeSpace(); writeKeyword(node.token === 132 /* AssertKeyword */ ? "assert" : "with"); writePunctuation(":"); writeSpace(); const elements = node.elements; emitList(node, elements, 526226 /* ImportAttributes */); writeSpace(); writePunctuation("}"); } function emitImportAttributes(node) { emitTokenWithComment(node.token, node.pos, writeKeyword, node); writeSpace(); const elements = node.elements; emitList(node, elements, 526226 /* ImportAttributes */); } function emitImportAttribute(node) { emit(node.name); writePunctuation(":"); writeSpace(); const value = node.value; if ((getEmitFlags(value) & 1024 /* NoLeadingComments */) === 0) { const commentRange = getCommentRange(value); emitTrailingCommentsOfPosition(commentRange.pos); } emit(value); } function emitNamespaceExportDeclaration(node) { let nextPos = emitTokenWithComment(95 /* ExportKeyword */, node.pos, writeKeyword, node); writeSpace(); nextPos = emitTokenWithComment(130 /* AsKeyword */, nextPos, writeKeyword, node); writeSpace(); nextPos = emitTokenWithComment(145 /* NamespaceKeyword */, nextPos, writeKeyword, node); writeSpace(); emit(node.name); writeTrailingSemicolon(); } function emitNamespaceExport(node) { const asPos = emitTokenWithComment(42 /* AsteriskToken */, node.pos, writePunctuation, node); writeSpace(); emitTokenWithComment(130 /* AsKeyword */, asPos, writeKeyword, node); writeSpace(); emit(node.name); } function emitNamedExports(node) { emitNamedImportsOrExports(node); } function emitExportSpecifier(node) { emitImportOrExportSpecifier(node); } function emitNamedImportsOrExports(node) { writePunctuation("{"); emitList(node, node.elements, 525136 /* NamedImportsOrExportsElements */); writePunctuation("}"); } function emitImportOrExportSpecifier(node) { if (node.isTypeOnly) { writeKeyword("type"); writeSpace(); } if (node.propertyName) { emit(node.propertyName); writeSpace(); emitTokenWithComment(130 /* AsKeyword */, node.propertyName.end, writeKeyword, node); writeSpace(); } emit(node.name); } function emitExternalModuleReference(node) { writeKeyword("require"); writePunctuation("("); emitExpression(node.expression); writePunctuation(")"); } function emitJsxElement(node) { emit(node.openingElement); emitList(node, node.children, 262144 /* JsxElementOrFragmentChildren */); emit(node.closingElement); } function emitJsxSelfClosingElement(node) { writePunctuation("<"); emitJsxTagName(node.tagName); emitTypeArguments(node, node.typeArguments); writeSpace(); emit(node.attributes); writePunctuation("/>"); } function emitJsxFragment(node) { emit(node.openingFragment); emitList(node, node.children, 262144 /* JsxElementOrFragmentChildren */); emit(node.closingFragment); } function emitJsxOpeningElementOrFragment(node) { writePunctuation("<"); if (isJsxOpeningElement(node)) { const indented = writeLineSeparatorsAndIndentBefore(node.tagName, node); emitJsxTagName(node.tagName); emitTypeArguments(node, node.typeArguments); if (node.attributes.properties && node.attributes.properties.length > 0) { writeSpace(); } emit(node.attributes); writeLineSeparatorsAfter(node.attributes, node); decreaseIndentIf(indented); } writePunctuation(">"); } function emitJsxText(node) { writer.writeLiteral(node.text); } function emitJsxClosingElementOrFragment(node) { writePunctuation(""); } function emitJsxAttributes(node) { emitList(node, node.properties, 262656 /* JsxElementAttributes */); } function emitJsxAttribute(node) { emit(node.name); emitNodeWithPrefix("=", writePunctuation, node.initializer, emitJsxAttributeValue); } function emitJsxSpreadAttribute(node) { writePunctuation("{..."); emitExpression(node.expression); writePunctuation("}"); } function hasTrailingCommentsAtPosition(pos) { let result = false; forEachTrailingCommentRange((currentSourceFile == null ? void 0 : currentSourceFile.text) || "", pos + 1, () => result = true); return result; } function hasLeadingCommentsAtPosition(pos) { let result = false; forEachLeadingCommentRange((currentSourceFile == null ? void 0 : currentSourceFile.text) || "", pos + 1, () => result = true); return result; } function hasCommentsAtPosition(pos) { return hasTrailingCommentsAtPosition(pos) || hasLeadingCommentsAtPosition(pos); } function emitJsxExpression(node) { var _a; if (node.expression || !commentsDisabled && !nodeIsSynthesized(node) && hasCommentsAtPosition(node.pos)) { const isMultiline = currentSourceFile && !nodeIsSynthesized(node) && getLineAndCharacterOfPosition(currentSourceFile, node.pos).line !== getLineAndCharacterOfPosition(currentSourceFile, node.end).line; if (isMultiline) { writer.increaseIndent(); } const end = emitTokenWithComment(19 /* OpenBraceToken */, node.pos, writePunctuation, node); emit(node.dotDotDotToken); emitExpression(node.expression); emitTokenWithComment(20 /* CloseBraceToken */, ((_a = node.expression) == null ? void 0 : _a.end) || end, writePunctuation, node); if (isMultiline) { writer.decreaseIndent(); } } } function emitJsxNamespacedName(node) { emitIdentifierName(node.namespace); writePunctuation(":"); emitIdentifierName(node.name); } function emitJsxTagName(node) { if (node.kind === 80 /* Identifier */) { emitExpression(node); } else { emit(node); } } function emitCaseClause(node) { emitTokenWithComment(84 /* CaseKeyword */, node.pos, writeKeyword, node); writeSpace(); emitExpression(node.expression, parenthesizer.parenthesizeExpressionForDisallowedComma); emitCaseOrDefaultClauseRest(node, node.statements, node.expression.end); } function emitDefaultClause(node) { const pos = emitTokenWithComment(90 /* DefaultKeyword */, node.pos, writeKeyword, node); emitCaseOrDefaultClauseRest(node, node.statements, pos); } function emitCaseOrDefaultClauseRest(parentNode, statements, colonPos) { const emitAsSingleStatement = statements.length === 1 && // treat synthesized nodes as located on the same line for emit purposes (!currentSourceFile || nodeIsSynthesized(parentNode) || nodeIsSynthesized(statements[0]) || rangeStartPositionsAreOnSameLine(parentNode, statements[0], currentSourceFile)); let format = 163969 /* CaseOrDefaultClauseStatements */; if (emitAsSingleStatement) { writeToken(59 /* ColonToken */, colonPos, writePunctuation, parentNode); writeSpace(); format &= ~(1 /* MultiLine */ | 128 /* Indented */); } else { emitTokenWithComment(59 /* ColonToken */, colonPos, writePunctuation, parentNode); } emitList(parentNode, statements, format); } function emitHeritageClause(node) { writeSpace(); writeTokenText(node.token, writeKeyword); writeSpace(); emitList(node, node.types, 528 /* HeritageClauseTypes */); } function emitCatchClause(node) { const openParenPos = emitTokenWithComment(85 /* CatchKeyword */, node.pos, writeKeyword, node); writeSpace(); if (node.variableDeclaration) { emitTokenWithComment(21 /* OpenParenToken */, openParenPos, writePunctuation, node); emit(node.variableDeclaration); emitTokenWithComment(22 /* CloseParenToken */, node.variableDeclaration.end, writePunctuation, node); writeSpace(); } emit(node.block); } function emitPropertyAssignment(node) { emit(node.name); writePunctuation(":"); writeSpace(); const initializer = node.initializer; if ((getEmitFlags(initializer) & 1024 /* NoLeadingComments */) === 0) { const commentRange = getCommentRange(initializer); emitTrailingCommentsOfPosition(commentRange.pos); } emitExpression(initializer, parenthesizer.parenthesizeExpressionForDisallowedComma); } function emitShorthandPropertyAssignment(node) { emit(node.name); if (node.objectAssignmentInitializer) { writeSpace(); writePunctuation("="); writeSpace(); emitExpression(node.objectAssignmentInitializer, parenthesizer.parenthesizeExpressionForDisallowedComma); } } function emitSpreadAssignment(node) { if (node.expression) { emitTokenWithComment(26 /* DotDotDotToken */, node.pos, writePunctuation, node); emitExpression(node.expression, parenthesizer.parenthesizeExpressionForDisallowedComma); } } function emitEnumMember(node) { emit(node.name); emitInitializer(node.initializer, node.name.end, node, parenthesizer.parenthesizeExpressionForDisallowedComma); } function emitJSDoc(node) { write("/**"); if (node.comment) { const text = getTextOfJSDocComment(node.comment); if (text) { const lines = text.split(/\r\n?|\n/); for (const line of lines) { writeLine(); writeSpace(); writePunctuation("*"); writeSpace(); write(line); } } } if (node.tags) { if (node.tags.length === 1 && node.tags[0].kind === 345 /* JSDocTypeTag */ && !node.comment) { writeSpace(); emit(node.tags[0]); } else { emitList(node, node.tags, 33 /* JSDocComment */); } } writeSpace(); write("*/"); } function emitJSDocSimpleTypedTag(tag) { emitJSDocTagName(tag.tagName); emitJSDocTypeExpression(tag.typeExpression); emitJSDocComment(tag.comment); } function emitJSDocSeeTag(tag) { emitJSDocTagName(tag.tagName); emit(tag.name); emitJSDocComment(tag.comment); } function emitJSDocImportTag(tag) { emitJSDocTagName(tag.tagName); writeSpace(); if (tag.importClause) { emit(tag.importClause); writeSpace(); emitTokenWithComment(161 /* FromKeyword */, tag.importClause.end, writeKeyword, tag); writeSpace(); } emitExpression(tag.moduleSpecifier); if (tag.attributes) { emitWithLeadingSpace(tag.attributes); } emitJSDocComment(tag.comment); } function emitJSDocNameReference(node) { writeSpace(); writePunctuation("{"); emit(node.name); writePunctuation("}"); } function emitJSDocHeritageTag(tag) { emitJSDocTagName(tag.tagName); writeSpace(); writePunctuation("{"); emit(tag.class); writePunctuation("}"); emitJSDocComment(tag.comment); } function emitJSDocTemplateTag(tag) { emitJSDocTagName(tag.tagName); emitJSDocTypeExpression(tag.constraint); writeSpace(); emitList(tag, tag.typeParameters, 528 /* CommaListElements */); emitJSDocComment(tag.comment); } function emitJSDocTypedefTag(tag) { emitJSDocTagName(tag.tagName); if (tag.typeExpression) { if (tag.typeExpression.kind === 310 /* JSDocTypeExpression */) { emitJSDocTypeExpression(tag.typeExpression); } else { writeSpace(); writePunctuation("{"); write("Object"); if (tag.typeExpression.isArrayType) { writePunctuation("["); writePunctuation("]"); } writePunctuation("}"); } } if (tag.fullName) { writeSpace(); emit(tag.fullName); } emitJSDocComment(tag.comment); if (tag.typeExpression && tag.typeExpression.kind === 323 /* JSDocTypeLiteral */) { emitJSDocTypeLiteral(tag.typeExpression); } } function emitJSDocCallbackTag(tag) { emitJSDocTagName(tag.tagName); if (tag.name) { writeSpace(); emit(tag.name); } emitJSDocComment(tag.comment); emitJSDocSignature(tag.typeExpression); } function emitJSDocOverloadTag(tag) { emitJSDocComment(tag.comment); emitJSDocSignature(tag.typeExpression); } function emitJSDocSimpleTag(tag) { emitJSDocTagName(tag.tagName); emitJSDocComment(tag.comment); } function emitJSDocTypeLiteral(lit) { emitList(lit, factory.createNodeArray(lit.jsDocPropertyTags), 33 /* JSDocComment */); } function emitJSDocSignature(sig) { if (sig.typeParameters) { emitList(sig, factory.createNodeArray(sig.typeParameters), 33 /* JSDocComment */); } if (sig.parameters) { emitList(sig, factory.createNodeArray(sig.parameters), 33 /* JSDocComment */); } if (sig.type) { writeLine(); writeSpace(); writePunctuation("*"); writeSpace(); emit(sig.type); } } function emitJSDocPropertyLikeTag(param) { emitJSDocTagName(param.tagName); emitJSDocTypeExpression(param.typeExpression); writeSpace(); if (param.isBracketed) { writePunctuation("["); } emit(param.name); if (param.isBracketed) { writePunctuation("]"); } emitJSDocComment(param.comment); } function emitJSDocTagName(tagName) { writePunctuation("@"); emit(tagName); } function emitJSDocComment(comment) { const text = getTextOfJSDocComment(comment); if (text) { writeSpace(); write(text); } } function emitJSDocTypeExpression(typeExpression) { if (typeExpression) { writeSpace(); writePunctuation("{"); emit(typeExpression.type); writePunctuation("}"); } } function emitSourceFile(node) { writeLine(); const statements = node.statements; const shouldEmitDetachedComment = statements.length === 0 || !isPrologueDirective(statements[0]) || nodeIsSynthesized(statements[0]); if (shouldEmitDetachedComment) { emitBodyWithDetachedComments(node, statements, emitSourceFileWorker); return; } emitSourceFileWorker(node); } function emitSyntheticTripleSlashReferencesIfNeeded(node) { emitTripleSlashDirectives(!!node.hasNoDefaultLib, node.syntheticFileReferences || [], node.syntheticTypeReferences || [], node.syntheticLibReferences || []); } function emitTripleSlashDirectivesIfNeeded(node) { if (node.isDeclarationFile) emitTripleSlashDirectives(node.hasNoDefaultLib, node.referencedFiles, node.typeReferenceDirectives, node.libReferenceDirectives); } function emitTripleSlashDirectives(hasNoDefaultLib, files, types, libs2) { if (hasNoDefaultLib) { writeComment(`/// `); writeLine(); } if (currentSourceFile && currentSourceFile.moduleName) { writeComment(`/// `); writeLine(); } if (currentSourceFile && currentSourceFile.amdDependencies) { for (const dep of currentSourceFile.amdDependencies) { if (dep.name) { writeComment(`/// `); } else { writeComment(`/// `); } writeLine(); } } function writeDirectives(kind, directives) { for (const directive of directives) { const resolutionMode = directive.resolutionMode ? `resolution-mode="${directive.resolutionMode === 99 /* ESNext */ ? "import" : "require"}" ` : ""; const preserve = directive.preserve ? `preserve="true" ` : ""; writeComment(`/// `); writeLine(); } } writeDirectives("path", files); writeDirectives("types", types); writeDirectives("lib", libs2); } function emitSourceFileWorker(node) { const statements = node.statements; pushNameGenerationScope(node); forEach(node.statements, generateNames); emitHelpers(node); const index = findIndex(statements, (statement) => !isPrologueDirective(statement)); emitTripleSlashDirectivesIfNeeded(node); emitList( node, statements, 1 /* MultiLine */, /*parenthesizerRule*/ void 0, index === -1 ? statements.length : index ); popNameGenerationScope(node); } function emitPartiallyEmittedExpression(node) { const emitFlags = getEmitFlags(node); if (!(emitFlags & 1024 /* NoLeadingComments */) && node.pos !== node.expression.pos) { emitTrailingCommentsOfPosition(node.expression.pos); } emitExpression(node.expression); if (!(emitFlags & 2048 /* NoTrailingComments */) && node.end !== node.expression.end) { emitLeadingCommentsOfPosition(node.expression.end); } } function emitCommaList(node) { emitExpressionList( node, node.elements, 528 /* CommaListElements */, /*parenthesizerRule*/ void 0 ); } function emitPrologueDirectives(statements, sourceFile, seenPrologueDirectives) { let needsToSetSourceFile = !!sourceFile; for (let i = 0; i < statements.length; i++) { const statement = statements[i]; if (isPrologueDirective(statement)) { const shouldEmitPrologueDirective = seenPrologueDirectives ? !seenPrologueDirectives.has(statement.expression.text) : true; if (shouldEmitPrologueDirective) { if (needsToSetSourceFile) { needsToSetSourceFile = false; setSourceFile(sourceFile); } writeLine(); emit(statement); if (seenPrologueDirectives) { seenPrologueDirectives.add(statement.expression.text); } } } else { return i; } } return statements.length; } function emitPrologueDirectivesIfNeeded(sourceFileOrBundle) { if (isSourceFile(sourceFileOrBundle)) { emitPrologueDirectives(sourceFileOrBundle.statements, sourceFileOrBundle); } else { const seenPrologueDirectives = /* @__PURE__ */ new Set(); for (const sourceFile of sourceFileOrBundle.sourceFiles) { emitPrologueDirectives(sourceFile.statements, sourceFile, seenPrologueDirectives); } setSourceFile(void 0); } } function emitShebangIfNeeded(sourceFileOrBundle) { if (isSourceFile(sourceFileOrBundle)) { const shebang = getShebang(sourceFileOrBundle.text); if (shebang) { writeComment(shebang); writeLine(); return true; } } else { for (const sourceFile of sourceFileOrBundle.sourceFiles) { if (emitShebangIfNeeded(sourceFile)) { return true; } } } } function emitNodeWithWriter(node, writer2) { if (!node) return; const savedWrite = write; write = writer2; emit(node); write = savedWrite; } function emitDecoratorsAndModifiers(node, modifiers, allowDecorators) { if (modifiers == null ? void 0 : modifiers.length) { if (every(modifiers, isModifier)) { return emitModifierList(node, modifiers); } if (every(modifiers, isDecorator)) { if (allowDecorators) { return emitDecoratorList(node, modifiers); } return node.pos; } onBeforeEmitNodeArray == null ? void 0 : onBeforeEmitNodeArray(modifiers); let lastMode; let mode; let start = 0; let pos = 0; let lastModifier; while (start < modifiers.length) { while (pos < modifiers.length) { lastModifier = modifiers[pos]; mode = isDecorator(lastModifier) ? "decorators" : "modifiers"; if (lastMode === void 0) { lastMode = mode; } else if (mode !== lastMode) { break; } pos++; } const textRange = { pos: -1, end: -1 }; if (start === 0) textRange.pos = modifiers.pos; if (pos === modifiers.length - 1) textRange.end = modifiers.end; if (lastMode === "modifiers" || allowDecorators) { emitNodeListItems( emit, node, modifiers, lastMode === "modifiers" ? 2359808 /* Modifiers */ : 2146305 /* Decorators */, /*parenthesizerRule*/ void 0, start, pos - start, /*hasTrailingComma*/ false, textRange ); } start = pos; lastMode = mode; pos++; } onAfterEmitNodeArray == null ? void 0 : onAfterEmitNodeArray(modifiers); if (lastModifier && !positionIsSynthesized(lastModifier.end)) { return lastModifier.end; } } return node.pos; } function emitModifierList(node, modifiers) { emitList(node, modifiers, 2359808 /* Modifiers */); const lastModifier = lastOrUndefined(modifiers); return lastModifier && !positionIsSynthesized(lastModifier.end) ? lastModifier.end : node.pos; } function emitTypeAnnotation(node) { if (node) { writePunctuation(":"); writeSpace(); emit(node); } } function emitInitializer(node, equalCommentStartPos, container, parenthesizerRule) { if (node) { writeSpace(); emitTokenWithComment(64 /* EqualsToken */, equalCommentStartPos, writeOperator, container); writeSpace(); emitExpression(node, parenthesizerRule); } } function emitNodeWithPrefix(prefix, prefixWriter, node, emit2) { if (node) { prefixWriter(prefix); emit2(node); } } function emitWithLeadingSpace(node) { if (node) { writeSpace(); emit(node); } } function emitExpressionWithLeadingSpace(node, parenthesizerRule) { if (node) { writeSpace(); emitExpression(node, parenthesizerRule); } } function emitWithTrailingSpace(node) { if (node) { emit(node); writeSpace(); } } function emitEmbeddedStatement(parent, node) { if (isBlock(node) || getEmitFlags(parent) & 1 /* SingleLine */ || preserveSourceNewlines && !getLeadingLineTerminatorCount(parent, node, 0 /* None */)) { writeSpace(); emit(node); } else { writeLine(); increaseIndent(); if (isEmptyStatement(node)) { pipelineEmit(5 /* EmbeddedStatement */, node); } else { emit(node); } decreaseIndent(); } } function emitDecoratorList(parentNode, decorators) { emitList(parentNode, decorators, 2146305 /* Decorators */); const lastDecorator = lastOrUndefined(decorators); return lastDecorator && !positionIsSynthesized(lastDecorator.end) ? lastDecorator.end : parentNode.pos; } function emitTypeArguments(parentNode, typeArguments) { emitList(parentNode, typeArguments, 53776 /* TypeArguments */, typeArgumentParenthesizerRuleSelector); } function emitTypeParameters(parentNode, typeParameters) { if (isFunctionLike(parentNode) && parentNode.typeArguments) { return emitTypeArguments(parentNode, parentNode.typeArguments); } emitList(parentNode, typeParameters, 53776 /* TypeParameters */ | (isArrowFunction(parentNode) ? 64 /* AllowTrailingComma */ : 0 /* None */)); } function emitParameters(parentNode, parameters) { emitList(parentNode, parameters, 2576 /* Parameters */); } function canEmitSimpleArrowHead(parentNode, parameters) { const parameter = singleOrUndefined(parameters); return parameter && parameter.pos === parentNode.pos && isArrowFunction(parentNode) && !parentNode.type && !some(parentNode.modifiers) && !some(parentNode.typeParameters) && !some(parameter.modifiers) && !parameter.dotDotDotToken && !parameter.questionToken && !parameter.type && !parameter.initializer && isIdentifier(parameter.name); } function emitParametersForArrow(parentNode, parameters) { if (canEmitSimpleArrowHead(parentNode, parameters)) { emitList(parentNode, parameters, 2576 /* Parameters */ & ~2048 /* Parenthesis */); } else { emitParameters(parentNode, parameters); } } function emitParametersForIndexSignature(parentNode, parameters) { emitList(parentNode, parameters, 8848 /* IndexSignatureParameters */); } function writeDelimiter(format) { switch (format & 60 /* DelimitersMask */) { case 0 /* None */: break; case 16 /* CommaDelimited */: writePunctuation(","); break; case 4 /* BarDelimited */: writeSpace(); writePunctuation("|"); break; case 32 /* AsteriskDelimited */: writeSpace(); writePunctuation("*"); writeSpace(); break; case 8 /* AmpersandDelimited */: writeSpace(); writePunctuation("&"); break; } } function emitList(parentNode, children, format, parenthesizerRule, start, count) { emitNodeList( emit, parentNode, children, format | (parentNode && getEmitFlags(parentNode) & 2 /* MultiLine */ ? 65536 /* PreferNewLine */ : 0), parenthesizerRule, start, count ); } function emitExpressionList(parentNode, children, format, parenthesizerRule, start, count) { emitNodeList(emitExpression, parentNode, children, format, parenthesizerRule, start, count); } function emitNodeList(emit2, parentNode, children, format, parenthesizerRule, start = 0, count = children ? children.length - start : 0) { const isUndefined = children === void 0; if (isUndefined && format & 16384 /* OptionalIfUndefined */) { return; } const isEmpty = children === void 0 || start >= children.length || count === 0; if (isEmpty && format & 32768 /* OptionalIfEmpty */) { onBeforeEmitNodeArray == null ? void 0 : onBeforeEmitNodeArray(children); onAfterEmitNodeArray == null ? void 0 : onAfterEmitNodeArray(children); return; } if (format & 15360 /* BracketsMask */) { writePunctuation(getOpeningBracket(format)); if (isEmpty && children) { emitTrailingCommentsOfPosition( children.pos, /*prefixSpace*/ true ); } } onBeforeEmitNodeArray == null ? void 0 : onBeforeEmitNodeArray(children); if (isEmpty) { if (format & 1 /* MultiLine */ && !(preserveSourceNewlines && (!parentNode || currentSourceFile && rangeIsOnSingleLine(parentNode, currentSourceFile)))) { writeLine(); } else if (format & 256 /* SpaceBetweenBraces */ && !(format & 524288 /* NoSpaceIfEmpty */)) { writeSpace(); } } else { emitNodeListItems(emit2, parentNode, children, format, parenthesizerRule, start, count, children.hasTrailingComma, children); } onAfterEmitNodeArray == null ? void 0 : onAfterEmitNodeArray(children); if (format & 15360 /* BracketsMask */) { if (isEmpty && children) { emitLeadingCommentsOfPosition(children.end); } writePunctuation(getClosingBracket(format)); } } function emitNodeListItems(emit2, parentNode, children, format, parenthesizerRule, start, count, hasTrailingComma, childrenTextRange) { const mayEmitInterveningComments = (format & 262144 /* NoInterveningComments */) === 0; let shouldEmitInterveningComments = mayEmitInterveningComments; const leadingLineTerminatorCount = getLeadingLineTerminatorCount(parentNode, children[start], format); if (leadingLineTerminatorCount) { writeLine(leadingLineTerminatorCount); shouldEmitInterveningComments = false; } else if (format & 256 /* SpaceBetweenBraces */) { writeSpace(); } if (format & 128 /* Indented */) { increaseIndent(); } const emitListItem = getEmitListItem(emit2, parenthesizerRule); let previousSibling; let shouldDecreaseIndentAfterEmit = false; for (let i = 0; i < count; i++) { const child = children[start + i]; if (format & 32 /* AsteriskDelimited */) { writeLine(); writeDelimiter(format); } else if (previousSibling) { if (format & 60 /* DelimitersMask */ && previousSibling.end !== (parentNode ? parentNode.end : -1)) { const previousSiblingEmitFlags = getEmitFlags(previousSibling); if (!(previousSiblingEmitFlags & 2048 /* NoTrailingComments */)) { emitLeadingCommentsOfPosition(previousSibling.end); } } writeDelimiter(format); const separatingLineTerminatorCount = getSeparatingLineTerminatorCount(previousSibling, child, format); if (separatingLineTerminatorCount > 0) { if ((format & (3 /* LinesMask */ | 128 /* Indented */)) === 0 /* SingleLine */) { increaseIndent(); shouldDecreaseIndentAfterEmit = true; } if (shouldEmitInterveningComments && format & 60 /* DelimitersMask */ && !positionIsSynthesized(child.pos)) { const commentRange = getCommentRange(child); emitTrailingCommentsOfPosition( commentRange.pos, /*prefixSpace*/ !!(format & 512 /* SpaceBetweenSiblings */), /*forceNoNewline*/ true ); } writeLine(separatingLineTerminatorCount); shouldEmitInterveningComments = false; } else if (previousSibling && format & 512 /* SpaceBetweenSiblings */) { writeSpace(); } } if (shouldEmitInterveningComments) { const commentRange = getCommentRange(child); emitTrailingCommentsOfPosition(commentRange.pos); } else { shouldEmitInterveningComments = mayEmitInterveningComments; } nextListElementPos = child.pos; emitListItem(child, emit2, parenthesizerRule, i); if (shouldDecreaseIndentAfterEmit) { decreaseIndent(); shouldDecreaseIndentAfterEmit = false; } previousSibling = child; } const emitFlags = previousSibling ? getEmitFlags(previousSibling) : 0; const skipTrailingComments = commentsDisabled || !!(emitFlags & 2048 /* NoTrailingComments */); const emitTrailingComma = hasTrailingComma && format & 64 /* AllowTrailingComma */ && format & 16 /* CommaDelimited */; if (emitTrailingComma) { if (previousSibling && !skipTrailingComments) { emitTokenWithComment(28 /* CommaToken */, previousSibling.end, writePunctuation, previousSibling); } else { writePunctuation(","); } } if (previousSibling && (parentNode ? parentNode.end : -1) !== previousSibling.end && format & 60 /* DelimitersMask */ && !skipTrailingComments) { emitLeadingCommentsOfPosition(emitTrailingComma && (childrenTextRange == null ? void 0 : childrenTextRange.end) ? childrenTextRange.end : previousSibling.end); } if (format & 128 /* Indented */) { decreaseIndent(); } const closingLineTerminatorCount = getClosingLineTerminatorCount(parentNode, children[start + count - 1], format, childrenTextRange); if (closingLineTerminatorCount) { writeLine(closingLineTerminatorCount); } else if (format & (2097152 /* SpaceAfterList */ | 256 /* SpaceBetweenBraces */)) { writeSpace(); } } function writeLiteral(s) { writer.writeLiteral(s); } function writeStringLiteral(s) { writer.writeStringLiteral(s); } function writeBase(s) { writer.write(s); } function writeSymbol(s, sym) { writer.writeSymbol(s, sym); } function writePunctuation(s) { writer.writePunctuation(s); } function writeTrailingSemicolon() { writer.writeTrailingSemicolon(";"); } function writeKeyword(s) { writer.writeKeyword(s); } function writeOperator(s) { writer.writeOperator(s); } function writeParameter(s) { writer.writeParameter(s); } function writeComment(s) { writer.writeComment(s); } function writeSpace() { writer.writeSpace(" "); } function writeProperty(s) { writer.writeProperty(s); } function nonEscapingWrite(s) { if (writer.nonEscapingWrite) { writer.nonEscapingWrite(s); } else { writer.write(s); } } function writeLine(count = 1) { for (let i = 0; i < count; i++) { writer.writeLine(i > 0); } } function increaseIndent() { writer.increaseIndent(); } function decreaseIndent() { writer.decreaseIndent(); } function writeToken(token, pos, writer2, contextNode) { return !sourceMapsDisabled ? emitTokenWithSourceMap(contextNode, token, writer2, pos, writeTokenText) : writeTokenText(token, writer2, pos); } function writeTokenNode(node, writer2) { if (onBeforeEmitToken) { onBeforeEmitToken(node); } writer2(tokenToString(node.kind)); if (onAfterEmitToken) { onAfterEmitToken(node); } } function writeTokenText(token, writer2, pos) { const tokenString = tokenToString(token); writer2(tokenString); return pos < 0 ? pos : pos + tokenString.length; } function writeLineOrSpace(parentNode, prevChildNode, nextChildNode) { if (getEmitFlags(parentNode) & 1 /* SingleLine */) { writeSpace(); } else if (preserveSourceNewlines) { const lines = getLinesBetweenNodes(parentNode, prevChildNode, nextChildNode); if (lines) { writeLine(lines); } else { writeSpace(); } } else { writeLine(); } } function writeLines(text) { const lines = text.split(/\r\n?|\n/); const indentation = guessIndentation(lines); for (const lineText of lines) { const line = indentation ? lineText.slice(indentation) : lineText; if (line.length) { writeLine(); write(line); } } } function writeLinesAndIndent(lineCount, writeSpaceIfNotIndenting) { if (lineCount) { increaseIndent(); writeLine(lineCount); } else if (writeSpaceIfNotIndenting) { writeSpace(); } } function decreaseIndentIf(value1, value2) { if (value1) { decreaseIndent(); } if (value2) { decreaseIndent(); } } function getLeadingLineTerminatorCount(parentNode, firstChild, format) { if (format & 2 /* PreserveLines */ || preserveSourceNewlines) { if (format & 65536 /* PreferNewLine */) { return 1; } if (firstChild === void 0) { return !parentNode || currentSourceFile && rangeIsOnSingleLine(parentNode, currentSourceFile) ? 0 : 1; } if (firstChild.pos === nextListElementPos) { return 0; } if (firstChild.kind === 12 /* JsxText */) { return 0; } if (currentSourceFile && parentNode && !positionIsSynthesized(parentNode.pos) && !nodeIsSynthesized(firstChild) && (!firstChild.parent || getOriginalNode(firstChild.parent) === getOriginalNode(parentNode))) { if (preserveSourceNewlines) { return getEffectiveLines( (includeComments) => getLinesBetweenPositionAndPrecedingNonWhitespaceCharacter( firstChild.pos, parentNode.pos, currentSourceFile, includeComments ) ); } return rangeStartPositionsAreOnSameLine(parentNode, firstChild, currentSourceFile) ? 0 : 1; } if (synthesizedNodeStartsOnNewLine(firstChild, format)) { return 1; } } return format & 1 /* MultiLine */ ? 1 : 0; } function getSeparatingLineTerminatorCount(previousNode, nextNode, format) { if (format & 2 /* PreserveLines */ || preserveSourceNewlines) { if (previousNode === void 0 || nextNode === void 0) { return 0; } if (nextNode.kind === 12 /* JsxText */) { return 0; } else if (currentSourceFile && !nodeIsSynthesized(previousNode) && !nodeIsSynthesized(nextNode)) { if (preserveSourceNewlines && siblingNodePositionsAreComparable(previousNode, nextNode)) { return getEffectiveLines( (includeComments) => getLinesBetweenRangeEndAndRangeStart( previousNode, nextNode, currentSourceFile, includeComments ) ); } else if (!preserveSourceNewlines && originalNodesHaveSameParent(previousNode, nextNode)) { return rangeEndIsOnSameLineAsRangeStart(previousNode, nextNode, currentSourceFile) ? 0 : 1; } return format & 65536 /* PreferNewLine */ ? 1 : 0; } else if (synthesizedNodeStartsOnNewLine(previousNode, format) || synthesizedNodeStartsOnNewLine(nextNode, format)) { return 1; } } else if (getStartsOnNewLine(nextNode)) { return 1; } return format & 1 /* MultiLine */ ? 1 : 0; } function getClosingLineTerminatorCount(parentNode, lastChild, format, childrenTextRange) { if (format & 2 /* PreserveLines */ || preserveSourceNewlines) { if (format & 65536 /* PreferNewLine */) { return 1; } if (lastChild === void 0) { return !parentNode || currentSourceFile && rangeIsOnSingleLine(parentNode, currentSourceFile) ? 0 : 1; } if (currentSourceFile && parentNode && !positionIsSynthesized(parentNode.pos) && !nodeIsSynthesized(lastChild) && (!lastChild.parent || lastChild.parent === parentNode)) { if (preserveSourceNewlines) { const end = childrenTextRange && !positionIsSynthesized(childrenTextRange.end) ? childrenTextRange.end : lastChild.end; return getEffectiveLines( (includeComments) => getLinesBetweenPositionAndNextNonWhitespaceCharacter( end, parentNode.end, currentSourceFile, includeComments ) ); } return rangeEndPositionsAreOnSameLine(parentNode, lastChild, currentSourceFile) ? 0 : 1; } if (synthesizedNodeStartsOnNewLine(lastChild, format)) { return 1; } } if (format & 1 /* MultiLine */ && !(format & 131072 /* NoTrailingNewLine */)) { return 1; } return 0; } function getEffectiveLines(getLineDifference) { Debug.assert(!!preserveSourceNewlines); const lines = getLineDifference( /*includeComments*/ true ); if (lines === 0) { return getLineDifference( /*includeComments*/ false ); } return lines; } function writeLineSeparatorsAndIndentBefore(node, parent) { const leadingNewlines = preserveSourceNewlines && getLeadingLineTerminatorCount(parent, node, 0 /* None */); if (leadingNewlines) { writeLinesAndIndent( leadingNewlines, /*writeSpaceIfNotIndenting*/ false ); } return !!leadingNewlines; } function writeLineSeparatorsAfter(node, parent) { const trailingNewlines = preserveSourceNewlines && getClosingLineTerminatorCount( parent, node, 0 /* None */, /*childrenTextRange*/ void 0 ); if (trailingNewlines) { writeLine(trailingNewlines); } } function synthesizedNodeStartsOnNewLine(node, format) { if (nodeIsSynthesized(node)) { const startsOnNewLine = getStartsOnNewLine(node); if (startsOnNewLine === void 0) { return (format & 65536 /* PreferNewLine */) !== 0; } return startsOnNewLine; } return (format & 65536 /* PreferNewLine */) !== 0; } function getLinesBetweenNodes(parent, node1, node2) { if (getEmitFlags(parent) & 262144 /* NoIndentation */) { return 0; } parent = skipSynthesizedParentheses(parent); node1 = skipSynthesizedParentheses(node1); node2 = skipSynthesizedParentheses(node2); if (getStartsOnNewLine(node2)) { return 1; } if (currentSourceFile && !nodeIsSynthesized(parent) && !nodeIsSynthesized(node1) && !nodeIsSynthesized(node2)) { if (preserveSourceNewlines) { return getEffectiveLines( (includeComments) => getLinesBetweenRangeEndAndRangeStart( node1, node2, currentSourceFile, includeComments ) ); } return rangeEndIsOnSameLineAsRangeStart(node1, node2, currentSourceFile) ? 0 : 1; } return 0; } function isEmptyBlock(block) { return block.statements.length === 0 && (!currentSourceFile || rangeEndIsOnSameLineAsRangeStart(block, block, currentSourceFile)); } function skipSynthesizedParentheses(node) { while (node.kind === 218 /* ParenthesizedExpression */ && nodeIsSynthesized(node)) { node = node.expression; } return node; } function getTextOfNode2(node, includeTrivia) { if (isGeneratedIdentifier(node) || isGeneratedPrivateIdentifier(node)) { return generateName(node); } if (isStringLiteral(node) && node.textSourceNode) { return getTextOfNode2(node.textSourceNode, includeTrivia); } const sourceFile = currentSourceFile; const canUseSourceFile = !!sourceFile && !!node.parent && !nodeIsSynthesized(node); if (isMemberName(node)) { if (!canUseSourceFile || getSourceFileOfNode(node) !== getOriginalNode(sourceFile)) { return idText(node); } } else if (isJsxNamespacedName(node)) { if (!canUseSourceFile || getSourceFileOfNode(node) !== getOriginalNode(sourceFile)) { return getTextOfJsxNamespacedName(node); } } else { Debug.assertNode(node, isLiteralExpression); if (!canUseSourceFile) { return node.text; } } return getSourceTextOfNodeFromSourceFile(sourceFile, node, includeTrivia); } function getLiteralTextOfNode(node, sourceFile = currentSourceFile, neverAsciiEscape, jsxAttributeEscape) { if (node.kind === 11 /* StringLiteral */ && node.textSourceNode) { const textSourceNode = node.textSourceNode; if (isIdentifier(textSourceNode) || isPrivateIdentifier(textSourceNode) || isNumericLiteral(textSourceNode) || isJsxNamespacedName(textSourceNode)) { const text = isNumericLiteral(textSourceNode) ? textSourceNode.text : getTextOfNode2(textSourceNode); return jsxAttributeEscape ? `"${escapeJsxAttributeString(text)}"` : neverAsciiEscape || getEmitFlags(node) & 16777216 /* NoAsciiEscaping */ ? `"${escapeString(text)}"` : `"${escapeNonAsciiString(text)}"`; } else { return getLiteralTextOfNode(textSourceNode, getSourceFileOfNode(textSourceNode), neverAsciiEscape, jsxAttributeEscape); } } const flags = (neverAsciiEscape ? 1 /* NeverAsciiEscape */ : 0) | (jsxAttributeEscape ? 2 /* JsxAttributeEscape */ : 0) | (printerOptions.terminateUnterminatedLiterals ? 4 /* TerminateUnterminatedLiterals */ : 0) | (printerOptions.target && printerOptions.target >= 8 /* ES2021 */ ? 8 /* AllowNumericSeparator */ : 0); return getLiteralText(node, sourceFile, flags); } function pushNameGenerationScope(node) { privateNameTempFlagsStack.push(privateNameTempFlags); privateNameTempFlags = 0 /* Auto */; reservedPrivateNamesStack.push(reservedPrivateNames); if (node && getEmitFlags(node) & 1048576 /* ReuseTempVariableScope */) { return; } tempFlagsStack.push(tempFlags); tempFlags = 0 /* Auto */; formattedNameTempFlagsStack.push(formattedNameTempFlags); formattedNameTempFlags = void 0; reservedNamesStack.push(reservedNames); } function popNameGenerationScope(node) { privateNameTempFlags = privateNameTempFlagsStack.pop(); reservedPrivateNames = reservedPrivateNamesStack.pop(); if (node && getEmitFlags(node) & 1048576 /* ReuseTempVariableScope */) { return; } tempFlags = tempFlagsStack.pop(); formattedNameTempFlags = formattedNameTempFlagsStack.pop(); reservedNames = reservedNamesStack.pop(); } function reserveNameInNestedScopes(name) { if (!reservedNames || reservedNames === lastOrUndefined(reservedNamesStack)) { reservedNames = /* @__PURE__ */ new Set(); } reservedNames.add(name); } function reservePrivateNameInNestedScopes(name) { if (!reservedPrivateNames || reservedPrivateNames === lastOrUndefined(reservedPrivateNamesStack)) { reservedPrivateNames = /* @__PURE__ */ new Set(); } reservedPrivateNames.add(name); } function generateNames(node) { if (!node) return; switch (node.kind) { case 242 /* Block */: forEach(node.statements, generateNames); break; case 257 /* LabeledStatement */: case 255 /* WithStatement */: case 247 /* DoStatement */: case 248 /* WhileStatement */: generateNames(node.statement); break; case 246 /* IfStatement */: generateNames(node.thenStatement); generateNames(node.elseStatement); break; case 249 /* ForStatement */: case 251 /* ForOfStatement */: case 250 /* ForInStatement */: generateNames(node.initializer); generateNames(node.statement); break; case 256 /* SwitchStatement */: generateNames(node.caseBlock); break; case 270 /* CaseBlock */: forEach(node.clauses, generateNames); break; case 297 /* CaseClause */: case 298 /* DefaultClause */: forEach(node.statements, generateNames); break; case 259 /* TryStatement */: generateNames(node.tryBlock); generateNames(node.catchClause); generateNames(node.finallyBlock); break; case 300 /* CatchClause */: generateNames(node.variableDeclaration); generateNames(node.block); break; case 244 /* VariableStatement */: generateNames(node.declarationList); break; case 262 /* VariableDeclarationList */: forEach(node.declarations, generateNames); break; case 261 /* VariableDeclaration */: case 170 /* Parameter */: case 209 /* BindingElement */: case 264 /* ClassDeclaration */: generateNameIfNeeded(node.name); break; case 263 /* FunctionDeclaration */: generateNameIfNeeded(node.name); if (getEmitFlags(node) & 1048576 /* ReuseTempVariableScope */) { forEach(node.parameters, generateNames); generateNames(node.body); } break; case 207 /* ObjectBindingPattern */: case 208 /* ArrayBindingPattern */: forEach(node.elements, generateNames); break; case 273 /* ImportDeclaration */: generateNames(node.importClause); break; case 274 /* ImportClause */: generateNameIfNeeded(node.name); generateNames(node.namedBindings); break; case 275 /* NamespaceImport */: generateNameIfNeeded(node.name); break; case 281 /* NamespaceExport */: generateNameIfNeeded(node.name); break; case 276 /* NamedImports */: forEach(node.elements, generateNames); break; case 277 /* ImportSpecifier */: generateNameIfNeeded(node.propertyName || node.name); break; } } function generateMemberNames(node) { if (!node) return; switch (node.kind) { case 304 /* PropertyAssignment */: case 305 /* ShorthandPropertyAssignment */: case 173 /* PropertyDeclaration */: case 172 /* PropertySignature */: case 175 /* MethodDeclaration */: case 174 /* MethodSignature */: case 178 /* GetAccessor */: case 179 /* SetAccessor */: generateNameIfNeeded(node.name); break; } } function generateNameIfNeeded(name) { if (name) { if (isGeneratedIdentifier(name) || isGeneratedPrivateIdentifier(name)) { generateName(name); } else if (isBindingPattern(name)) { generateNames(name); } } } function generateName(name) { const autoGenerate = name.emitNode.autoGenerate; if ((autoGenerate.flags & 7 /* KindMask */) === 4 /* Node */) { return generateNameCached(getNodeForGeneratedName(name), isPrivateIdentifier(name), autoGenerate.flags, autoGenerate.prefix, autoGenerate.suffix); } else { const autoGenerateId = autoGenerate.id; return autoGeneratedIdToGeneratedName[autoGenerateId] || (autoGeneratedIdToGeneratedName[autoGenerateId] = makeName(name)); } } function generateNameCached(node, privateName, flags, prefix, suffix) { const nodeId = getNodeId(node); const cache = privateName ? nodeIdToGeneratedPrivateName : nodeIdToGeneratedName; return cache[nodeId] || (cache[nodeId] = generateNameForNode(node, privateName, flags ?? 0 /* None */, formatGeneratedNamePart(prefix, generateName), formatGeneratedNamePart(suffix))); } function isUniqueName(name, privateName) { return isFileLevelUniqueNameInCurrentFile(name, privateName) && !isReservedName(name, privateName) && !generatedNames.has(name); } function isReservedName(name, privateName) { let set; let stack; if (privateName) { set = reservedPrivateNames; stack = reservedPrivateNamesStack; } else { set = reservedNames; stack = reservedNamesStack; } if (set == null ? void 0 : set.has(name)) { return true; } for (let i = stack.length - 1; i >= 0; i--) { if (set === stack[i]) { continue; } set = stack[i]; if (set == null ? void 0 : set.has(name)) { return true; } } return false; } function isFileLevelUniqueNameInCurrentFile(name, _isPrivate) { return currentSourceFile ? isFileLevelUniqueName(currentSourceFile, name, hasGlobalName) : true; } function isUniqueLocalName(name, container) { for (let node = container; node && isNodeDescendantOf(node, container); node = node.nextContainer) { if (canHaveLocals(node) && node.locals) { const local = node.locals.get(escapeLeadingUnderscores(name)); if (local && local.flags & (111551 /* Value */ | 1048576 /* ExportValue */ | 2097152 /* Alias */)) { return false; } } } return true; } function getTempFlags(formattedNameKey) { switch (formattedNameKey) { case "": return tempFlags; case "#": return privateNameTempFlags; default: return (formattedNameTempFlags == null ? void 0 : formattedNameTempFlags.get(formattedNameKey)) ?? 0 /* Auto */; } } function setTempFlags(formattedNameKey, flags) { switch (formattedNameKey) { case "": tempFlags = flags; break; case "#": privateNameTempFlags = flags; break; default: formattedNameTempFlags ?? (formattedNameTempFlags = /* @__PURE__ */ new Map()); formattedNameTempFlags.set(formattedNameKey, flags); break; } } function makeTempVariableName(flags, reservedInNestedScopes, privateName, prefix, suffix) { if (prefix.length > 0 && prefix.charCodeAt(0) === 35 /* hash */) { prefix = prefix.slice(1); } const key = formatGeneratedName(privateName, prefix, "", suffix); let tempFlags2 = getTempFlags(key); if (flags && !(tempFlags2 & flags)) { const name = flags === 268435456 /* _i */ ? "_i" : "_n"; const fullName = formatGeneratedName(privateName, prefix, name, suffix); if (isUniqueName(fullName, privateName)) { tempFlags2 |= flags; if (privateName) { reservePrivateNameInNestedScopes(fullName); } else if (reservedInNestedScopes) { reserveNameInNestedScopes(fullName); } setTempFlags(key, tempFlags2); return fullName; } } while (true) { const count = tempFlags2 & 268435455 /* CountMask */; tempFlags2++; if (count !== 8 && count !== 13) { const name = count < 26 ? "_" + String.fromCharCode(97 /* a */ + count) : "_" + (count - 26); const fullName = formatGeneratedName(privateName, prefix, name, suffix); if (isUniqueName(fullName, privateName)) { if (privateName) { reservePrivateNameInNestedScopes(fullName); } else if (reservedInNestedScopes) { reserveNameInNestedScopes(fullName); } setTempFlags(key, tempFlags2); return fullName; } } } } function makeUniqueName(baseName, checkFn = isUniqueName, optimistic, scoped, privateName, prefix, suffix) { if (baseName.length > 0 && baseName.charCodeAt(0) === 35 /* hash */) { baseName = baseName.slice(1); } if (prefix.length > 0 && prefix.charCodeAt(0) === 35 /* hash */) { prefix = prefix.slice(1); } if (optimistic) { const fullName = formatGeneratedName(privateName, prefix, baseName, suffix); if (checkFn(fullName, privateName)) { if (privateName) { reservePrivateNameInNestedScopes(fullName); } else if (scoped) { reserveNameInNestedScopes(fullName); } else { generatedNames.add(fullName); } return fullName; } } if (baseName.charCodeAt(baseName.length - 1) !== 95 /* _ */) { baseName += "_"; } let i = 1; while (true) { const fullName = formatGeneratedName(privateName, prefix, baseName + i, suffix); if (checkFn(fullName, privateName)) { if (privateName) { reservePrivateNameInNestedScopes(fullName); } else if (scoped) { reserveNameInNestedScopes(fullName); } else { generatedNames.add(fullName); } return fullName; } i++; } } function makeFileLevelOptimisticUniqueName(name) { return makeUniqueName( name, isFileLevelUniqueNameInCurrentFile, /*optimistic*/ true, /*scoped*/ false, /*privateName*/ false, /*prefix*/ "", /*suffix*/ "" ); } function generateNameForModuleOrEnum(node) { const name = getTextOfNode2(node.name); return isUniqueLocalName(name, tryCast(node, canHaveLocals)) ? name : makeUniqueName( name, isUniqueName, /*optimistic*/ false, /*scoped*/ false, /*privateName*/ false, /*prefix*/ "", /*suffix*/ "" ); } function generateNameForImportOrExportDeclaration(node) { const expr = getExternalModuleName(node); const baseName = isStringLiteral(expr) ? makeIdentifierFromModuleName(expr.text) : "module"; return makeUniqueName( baseName, isUniqueName, /*optimistic*/ false, /*scoped*/ false, /*privateName*/ false, /*prefix*/ "", /*suffix*/ "" ); } function generateNameForExportDefault() { return makeUniqueName( "default", isUniqueName, /*optimistic*/ false, /*scoped*/ false, /*privateName*/ false, /*prefix*/ "", /*suffix*/ "" ); } function generateNameForClassExpression() { return makeUniqueName( "class", isUniqueName, /*optimistic*/ false, /*scoped*/ false, /*privateName*/ false, /*prefix*/ "", /*suffix*/ "" ); } function generateNameForMethodOrAccessor(node, privateName, prefix, suffix) { if (isIdentifier(node.name)) { return generateNameCached(node.name, privateName); } return makeTempVariableName( 0 /* Auto */, /*reservedInNestedScopes*/ false, privateName, prefix, suffix ); } function generateNameForNode(node, privateName, flags, prefix, suffix) { switch (node.kind) { case 80 /* Identifier */: case 81 /* PrivateIdentifier */: return makeUniqueName( getTextOfNode2(node), isUniqueName, !!(flags & 16 /* Optimistic */), !!(flags & 8 /* ReservedInNestedScopes */), privateName, prefix, suffix ); case 268 /* ModuleDeclaration */: case 267 /* EnumDeclaration */: Debug.assert(!prefix && !suffix && !privateName); return generateNameForModuleOrEnum(node); case 273 /* ImportDeclaration */: case 279 /* ExportDeclaration */: Debug.assert(!prefix && !suffix && !privateName); return generateNameForImportOrExportDeclaration(node); case 263 /* FunctionDeclaration */: case 264 /* ClassDeclaration */: { Debug.assert(!prefix && !suffix && !privateName); const name = node.name; if (name && !isGeneratedIdentifier(name)) { return generateNameForNode( name, /*privateName*/ false, flags, prefix, suffix ); } return generateNameForExportDefault(); } case 278 /* ExportAssignment */: Debug.assert(!prefix && !suffix && !privateName); return generateNameForExportDefault(); case 232 /* ClassExpression */: Debug.assert(!prefix && !suffix && !privateName); return generateNameForClassExpression(); case 175 /* MethodDeclaration */: case 178 /* GetAccessor */: case 179 /* SetAccessor */: return generateNameForMethodOrAccessor(node, privateName, prefix, suffix); case 168 /* ComputedPropertyName */: return makeTempVariableName( 0 /* Auto */, /*reservedInNestedScopes*/ true, privateName, prefix, suffix ); default: return makeTempVariableName( 0 /* Auto */, /*reservedInNestedScopes*/ false, privateName, prefix, suffix ); } } function makeName(name) { const autoGenerate = name.emitNode.autoGenerate; const prefix = formatGeneratedNamePart(autoGenerate.prefix, generateName); const suffix = formatGeneratedNamePart(autoGenerate.suffix); switch (autoGenerate.flags & 7 /* KindMask */) { case 1 /* Auto */: return makeTempVariableName(0 /* Auto */, !!(autoGenerate.flags & 8 /* ReservedInNestedScopes */), isPrivateIdentifier(name), prefix, suffix); case 2 /* Loop */: Debug.assertNode(name, isIdentifier); return makeTempVariableName( 268435456 /* _i */, !!(autoGenerate.flags & 8 /* ReservedInNestedScopes */), /*privateName*/ false, prefix, suffix ); case 3 /* Unique */: return makeUniqueName( idText(name), autoGenerate.flags & 32 /* FileLevel */ ? isFileLevelUniqueNameInCurrentFile : isUniqueName, !!(autoGenerate.flags & 16 /* Optimistic */), !!(autoGenerate.flags & 8 /* ReservedInNestedScopes */), isPrivateIdentifier(name), prefix, suffix ); } return Debug.fail(`Unsupported GeneratedIdentifierKind: ${Debug.formatEnum( autoGenerate.flags & 7 /* KindMask */, GeneratedIdentifierFlags, /*isFlags*/ true )}.`); } function pipelineEmitWithComments(hint, node) { const pipelinePhase = getNextPipelinePhase(2 /* Comments */, hint, node); const savedContainerPos = containerPos; const savedContainerEnd = containerEnd; const savedDeclarationListContainerEnd = declarationListContainerEnd; emitCommentsBeforeNode(node); pipelinePhase(hint, node); emitCommentsAfterNode(node, savedContainerPos, savedContainerEnd, savedDeclarationListContainerEnd); } function emitCommentsBeforeNode(node) { const emitFlags = getEmitFlags(node); const commentRange = getCommentRange(node); emitLeadingCommentsOfNode(node, emitFlags, commentRange.pos, commentRange.end); if (emitFlags & 4096 /* NoNestedComments */) { commentsDisabled = true; } } function emitCommentsAfterNode(node, savedContainerPos, savedContainerEnd, savedDeclarationListContainerEnd) { const emitFlags = getEmitFlags(node); const commentRange = getCommentRange(node); if (emitFlags & 4096 /* NoNestedComments */) { commentsDisabled = false; } emitTrailingCommentsOfNode(node, emitFlags, commentRange.pos, commentRange.end, savedContainerPos, savedContainerEnd, savedDeclarationListContainerEnd); const typeNode = getTypeNode(node); if (typeNode) { emitTrailingCommentsOfNode(node, emitFlags, typeNode.pos, typeNode.end, savedContainerPos, savedContainerEnd, savedDeclarationListContainerEnd); } } function emitLeadingCommentsOfNode(node, emitFlags, pos, end) { enterComment(); hasWrittenComment = false; const skipLeadingComments = pos < 0 || (emitFlags & 1024 /* NoLeadingComments */) !== 0 || node.kind === 12 /* JsxText */; const skipTrailingComments = end < 0 || (emitFlags & 2048 /* NoTrailingComments */) !== 0 || node.kind === 12 /* JsxText */; if ((pos > 0 || end > 0) && pos !== end) { if (!skipLeadingComments) { emitLeadingComments( pos, /*isEmittedNode*/ node.kind !== 354 /* NotEmittedStatement */ ); } if (!skipLeadingComments || pos >= 0 && (emitFlags & 1024 /* NoLeadingComments */) !== 0) { containerPos = pos; } if (!skipTrailingComments || end >= 0 && (emitFlags & 2048 /* NoTrailingComments */) !== 0) { containerEnd = end; if (node.kind === 262 /* VariableDeclarationList */) { declarationListContainerEnd = end; } } } forEach(getSyntheticLeadingComments(node), emitLeadingSynthesizedComment); exitComment(); } function emitTrailingCommentsOfNode(node, emitFlags, pos, end, savedContainerPos, savedContainerEnd, savedDeclarationListContainerEnd) { enterComment(); const skipTrailingComments = end < 0 || (emitFlags & 2048 /* NoTrailingComments */) !== 0 || node.kind === 12 /* JsxText */; forEach(getSyntheticTrailingComments(node), emitTrailingSynthesizedComment); if ((pos > 0 || end > 0) && pos !== end) { containerPos = savedContainerPos; containerEnd = savedContainerEnd; declarationListContainerEnd = savedDeclarationListContainerEnd; if (!skipTrailingComments && node.kind !== 354 /* NotEmittedStatement */) { emitTrailingComments(end); } } exitComment(); } function emitLeadingSynthesizedComment(comment) { if (comment.hasLeadingNewline || comment.kind === 2 /* SingleLineCommentTrivia */) { writer.writeLine(); } writeSynthesizedComment(comment); if (comment.hasTrailingNewLine || comment.kind === 2 /* SingleLineCommentTrivia */) { writer.writeLine(); } else { writer.writeSpace(" "); } } function emitTrailingSynthesizedComment(comment) { if (!writer.isAtStartOfLine()) { writer.writeSpace(" "); } writeSynthesizedComment(comment); if (comment.hasTrailingNewLine) { writer.writeLine(); } } function writeSynthesizedComment(comment) { const text = formatSynthesizedComment(comment); const lineMap = comment.kind === 3 /* MultiLineCommentTrivia */ ? computeLineStarts(text) : void 0; writeCommentRange(text, lineMap, writer, 0, text.length, newLine); } function formatSynthesizedComment(comment) { return comment.kind === 3 /* MultiLineCommentTrivia */ ? `/*${comment.text}*/` : `//${comment.text}`; } function emitBodyWithDetachedComments(node, detachedRange, emitCallback) { enterComment(); const { pos, end } = detachedRange; const emitFlags = getEmitFlags(node); const skipLeadingComments = pos < 0 || (emitFlags & 1024 /* NoLeadingComments */) !== 0; const skipTrailingComments = commentsDisabled || end < 0 || (emitFlags & 2048 /* NoTrailingComments */) !== 0; if (!skipLeadingComments) { emitDetachedCommentsAndUpdateCommentsInfo(detachedRange); } exitComment(); if (emitFlags & 4096 /* NoNestedComments */ && !commentsDisabled) { commentsDisabled = true; emitCallback(node); commentsDisabled = false; } else { emitCallback(node); } enterComment(); if (!skipTrailingComments) { emitLeadingComments( detachedRange.end, /*isEmittedNode*/ true ); if (hasWrittenComment && !writer.isAtStartOfLine()) { writer.writeLine(); } } exitComment(); } function originalNodesHaveSameParent(nodeA, nodeB) { nodeA = getOriginalNode(nodeA); return nodeA.parent && nodeA.parent === getOriginalNode(nodeB).parent; } function siblingNodePositionsAreComparable(previousNode, nextNode) { if (nextNode.pos < previousNode.end) { return false; } previousNode = getOriginalNode(previousNode); nextNode = getOriginalNode(nextNode); const parent = previousNode.parent; if (!parent || parent !== nextNode.parent) { return false; } const parentNodeArray = getContainingNodeArray(previousNode); const prevNodeIndex = parentNodeArray == null ? void 0 : parentNodeArray.indexOf(previousNode); return prevNodeIndex !== void 0 && prevNodeIndex > -1 && parentNodeArray.indexOf(nextNode) === prevNodeIndex + 1; } function emitLeadingComments(pos, isEmittedNode) { hasWrittenComment = false; if (isEmittedNode) { if (pos === 0 && (currentSourceFile == null ? void 0 : currentSourceFile.isDeclarationFile)) { forEachLeadingCommentToEmit(pos, emitNonTripleSlashLeadingComment); } else { forEachLeadingCommentToEmit(pos, emitLeadingComment); } } else if (pos === 0) { forEachLeadingCommentToEmit(pos, emitTripleSlashLeadingComment); } } function emitTripleSlashLeadingComment(commentPos, commentEnd, kind, hasTrailingNewLine, rangePos) { if (isTripleSlashComment(commentPos, commentEnd)) { emitLeadingComment(commentPos, commentEnd, kind, hasTrailingNewLine, rangePos); } } function emitNonTripleSlashLeadingComment(commentPos, commentEnd, kind, hasTrailingNewLine, rangePos) { if (!isTripleSlashComment(commentPos, commentEnd)) { emitLeadingComment(commentPos, commentEnd, kind, hasTrailingNewLine, rangePos); } } function shouldWriteComment(text, pos) { if (printerOptions.onlyPrintJsDocStyle) { return isJSDocLikeText(text, pos) || isPinnedComment(text, pos); } return true; } function emitLeadingComment(commentPos, commentEnd, kind, hasTrailingNewLine, rangePos) { if (!currentSourceFile || !shouldWriteComment(currentSourceFile.text, commentPos)) return; if (!hasWrittenComment) { emitNewLineBeforeLeadingCommentOfPosition(getCurrentLineMap(), writer, rangePos, commentPos); hasWrittenComment = true; } emitPos(commentPos); writeCommentRange(currentSourceFile.text, getCurrentLineMap(), writer, commentPos, commentEnd, newLine); emitPos(commentEnd); if (hasTrailingNewLine) { writer.writeLine(); } else if (kind === 3 /* MultiLineCommentTrivia */) { writer.writeSpace(" "); } } function emitLeadingCommentsOfPosition(pos) { if (commentsDisabled || pos === -1) { return; } emitLeadingComments( pos, /*isEmittedNode*/ true ); } function emitTrailingComments(pos) { forEachTrailingCommentToEmit(pos, emitTrailingComment); } function emitTrailingComment(commentPos, commentEnd, _kind, hasTrailingNewLine) { if (!currentSourceFile || !shouldWriteComment(currentSourceFile.text, commentPos)) return; if (!writer.isAtStartOfLine()) { writer.writeSpace(" "); } emitPos(commentPos); writeCommentRange(currentSourceFile.text, getCurrentLineMap(), writer, commentPos, commentEnd, newLine); emitPos(commentEnd); if (hasTrailingNewLine) { writer.writeLine(); } } function emitTrailingCommentsOfPosition(pos, prefixSpace, forceNoNewline) { if (commentsDisabled) { return; } enterComment(); forEachTrailingCommentToEmit(pos, prefixSpace ? emitTrailingComment : forceNoNewline ? emitTrailingCommentOfPositionNoNewline : emitTrailingCommentOfPosition); exitComment(); } function emitTrailingCommentOfPositionNoNewline(commentPos, commentEnd, kind) { if (!currentSourceFile) return; emitPos(commentPos); writeCommentRange(currentSourceFile.text, getCurrentLineMap(), writer, commentPos, commentEnd, newLine); emitPos(commentEnd); if (kind === 2 /* SingleLineCommentTrivia */) { writer.writeLine(); } } function emitTrailingCommentOfPosition(commentPos, commentEnd, _kind, hasTrailingNewLine) { if (!currentSourceFile) return; emitPos(commentPos); writeCommentRange(currentSourceFile.text, getCurrentLineMap(), writer, commentPos, commentEnd, newLine); emitPos(commentEnd); if (hasTrailingNewLine) { writer.writeLine(); } else { writer.writeSpace(" "); } } function forEachLeadingCommentToEmit(pos, cb) { if (currentSourceFile && (containerPos === -1 || pos !== containerPos)) { if (hasDetachedComments(pos)) { forEachLeadingCommentWithoutDetachedComments(cb); } else { forEachLeadingCommentRange( currentSourceFile.text, pos, cb, /*state*/ pos ); } } } function forEachTrailingCommentToEmit(end, cb) { if (currentSourceFile && (containerEnd === -1 || end !== containerEnd && end !== declarationListContainerEnd)) { forEachTrailingCommentRange(currentSourceFile.text, end, cb); } } function hasDetachedComments(pos) { return detachedCommentsInfo !== void 0 && last(detachedCommentsInfo).nodePos === pos; } function forEachLeadingCommentWithoutDetachedComments(cb) { if (!currentSourceFile) return; const pos = last(detachedCommentsInfo).detachedCommentEndPos; if (detachedCommentsInfo.length - 1) { detachedCommentsInfo.pop(); } else { detachedCommentsInfo = void 0; } forEachLeadingCommentRange( currentSourceFile.text, pos, cb, /*state*/ pos ); } function emitDetachedCommentsAndUpdateCommentsInfo(range) { const currentDetachedCommentInfo = currentSourceFile && emitDetachedComments(currentSourceFile.text, getCurrentLineMap(), writer, emitComment, range, newLine, commentsDisabled); if (currentDetachedCommentInfo) { if (detachedCommentsInfo) { detachedCommentsInfo.push(currentDetachedCommentInfo); } else { detachedCommentsInfo = [currentDetachedCommentInfo]; } } } function emitComment(text, lineMap, writer2, commentPos, commentEnd, newLine2) { if (!currentSourceFile || !shouldWriteComment(currentSourceFile.text, commentPos)) return; emitPos(commentPos); writeCommentRange(text, lineMap, writer2, commentPos, commentEnd, newLine2); emitPos(commentEnd); } function isTripleSlashComment(commentPos, commentEnd) { return !!currentSourceFile && isRecognizedTripleSlashComment(currentSourceFile.text, commentPos, commentEnd); } function pipelineEmitWithSourceMaps(hint, node) { const pipelinePhase = getNextPipelinePhase(3 /* SourceMaps */, hint, node); emitSourceMapsBeforeNode(node); pipelinePhase(hint, node); emitSourceMapsAfterNode(node); } function emitSourceMapsBeforeNode(node) { const emitFlags = getEmitFlags(node); const sourceMapRange = getSourceMapRange(node); const source = sourceMapRange.source || sourceMapSource; if (node.kind !== 354 /* NotEmittedStatement */ && (emitFlags & 32 /* NoLeadingSourceMap */) === 0 && sourceMapRange.pos >= 0) { emitSourcePos(sourceMapRange.source || sourceMapSource, skipSourceTrivia(source, sourceMapRange.pos)); } if (emitFlags & 128 /* NoNestedSourceMaps */) { sourceMapsDisabled = true; } } function emitSourceMapsAfterNode(node) { const emitFlags = getEmitFlags(node); const sourceMapRange = getSourceMapRange(node); if (emitFlags & 128 /* NoNestedSourceMaps */) { sourceMapsDisabled = false; } if (node.kind !== 354 /* NotEmittedStatement */ && (emitFlags & 64 /* NoTrailingSourceMap */) === 0 && sourceMapRange.end >= 0) { emitSourcePos(sourceMapRange.source || sourceMapSource, sourceMapRange.end); } } function skipSourceTrivia(source, pos) { return source.skipTrivia ? source.skipTrivia(pos) : skipTrivia(source.text, pos); } function emitPos(pos) { if (sourceMapsDisabled || positionIsSynthesized(pos) || isJsonSourceMapSource(sourceMapSource)) { return; } const { line: sourceLine, character: sourceCharacter } = getLineAndCharacterOfPosition(sourceMapSource, pos); sourceMapGenerator.addMapping( writer.getLine(), writer.getColumn(), sourceMapSourceIndex, sourceLine, sourceCharacter, /*nameIndex*/ void 0 ); } function emitSourcePos(source, pos) { if (source !== sourceMapSource) { const savedSourceMapSource = sourceMapSource; const savedSourceMapSourceIndex = sourceMapSourceIndex; setSourceMapSource(source); emitPos(pos); resetSourceMapSource(savedSourceMapSource, savedSourceMapSourceIndex); } else { emitPos(pos); } } function emitTokenWithSourceMap(node, token, writer2, tokenPos, emitCallback) { if (sourceMapsDisabled || node && isInJsonFile(node)) { return emitCallback(token, writer2, tokenPos); } const emitNode = node && node.emitNode; const emitFlags = emitNode && emitNode.flags || 0 /* None */; const range = emitNode && emitNode.tokenSourceMapRanges && emitNode.tokenSourceMapRanges[token]; const source = range && range.source || sourceMapSource; tokenPos = skipSourceTrivia(source, range ? range.pos : tokenPos); if ((emitFlags & 256 /* NoTokenLeadingSourceMaps */) === 0 && tokenPos >= 0) { emitSourcePos(source, tokenPos); } tokenPos = emitCallback(token, writer2, tokenPos); if (range) tokenPos = range.end; if ((emitFlags & 512 /* NoTokenTrailingSourceMaps */) === 0 && tokenPos >= 0) { emitSourcePos(source, tokenPos); } return tokenPos; } function setSourceMapSource(source) { if (sourceMapsDisabled) { return; } sourceMapSource = source; if (source === mostRecentlyAddedSourceMapSource) { sourceMapSourceIndex = mostRecentlyAddedSourceMapSourceIndex; return; } if (isJsonSourceMapSource(source)) { return; } sourceMapSourceIndex = sourceMapGenerator.addSource(source.fileName); if (printerOptions.inlineSources) { sourceMapGenerator.setSourceContent(sourceMapSourceIndex, source.text); } mostRecentlyAddedSourceMapSource = source; mostRecentlyAddedSourceMapSourceIndex = sourceMapSourceIndex; } function resetSourceMapSource(source, sourceIndex) { sourceMapSource = source; sourceMapSourceIndex = sourceIndex; } function isJsonSourceMapSource(sourceFile) { return fileExtensionIs(sourceFile.fileName, ".json" /* Json */); } } function createBracketsMap() { const brackets2 = []; brackets2[1024 /* Braces */] = ["{", "}"]; brackets2[2048 /* Parenthesis */] = ["(", ")"]; brackets2[4096 /* AngleBrackets */] = ["<", ">"]; brackets2[8192 /* SquareBrackets */] = ["[", "]"]; return brackets2; } function getOpeningBracket(format) { return brackets[format & 15360 /* BracketsMask */][0]; } function getClosingBracket(format) { return brackets[format & 15360 /* BracketsMask */][1]; } function emitListItemNoParenthesizer(node, emit, _parenthesizerRule, _index) { emit(node); } function emitListItemWithParenthesizerRuleSelector(node, emit, parenthesizerRuleSelector, index) { emit(node, parenthesizerRuleSelector.select(index)); } function emitListItemWithParenthesizerRule(node, emit, parenthesizerRule, _index) { emit(node, parenthesizerRule); } function getEmitListItem(emit, parenthesizerRule) { return emit.length === 1 ? emitListItemNoParenthesizer : typeof parenthesizerRule === "object" ? emitListItemWithParenthesizerRuleSelector : emitListItemWithParenthesizerRule; } // src/compiler/watchUtilities.ts function createCachedDirectoryStructureHost(host, currentDirectory, useCaseSensitiveFileNames2) { if (!host.getDirectories || !host.readDirectory) { return void 0; } const cachedReadDirectoryResult = /* @__PURE__ */ new Map(); const getCanonicalFileName = createGetCanonicalFileName(useCaseSensitiveFileNames2); return { useCaseSensitiveFileNames: useCaseSensitiveFileNames2, fileExists, readFile: (path, encoding) => host.readFile(path, encoding), directoryExists: host.directoryExists && directoryExists, getDirectories, readDirectory, createDirectory: host.createDirectory && createDirectory, writeFile: host.writeFile && writeFile2, addOrDeleteFileOrDirectory, addOrDeleteFile, clearCache, realpath: host.realpath && realpath }; function toPath3(fileName) { return toPath(fileName, currentDirectory, getCanonicalFileName); } function getCachedFileSystemEntries(rootDirPath) { return cachedReadDirectoryResult.get(ensureTrailingDirectorySeparator(rootDirPath)); } function getCachedFileSystemEntriesForBaseDir(path) { const entries = getCachedFileSystemEntries(getDirectoryPath(path)); if (!entries) { return entries; } if (!entries.sortedAndCanonicalizedFiles) { entries.sortedAndCanonicalizedFiles = entries.files.map(getCanonicalFileName).sort(); entries.sortedAndCanonicalizedDirectories = entries.directories.map(getCanonicalFileName).sort(); } return entries; } function getBaseNameOfFileName(fileName) { return getBaseFileName(normalizePath(fileName)); } function createCachedFileSystemEntries(rootDir, rootDirPath) { var _a; if (!host.realpath || ensureTrailingDirectorySeparator(toPath3(host.realpath(rootDir))) === rootDirPath) { const resultFromHost = { files: map(host.readDirectory( rootDir, /*extensions*/ void 0, /*exclude*/ void 0, /*include*/ ["*.*"] ), getBaseNameOfFileName) || [], directories: host.getDirectories(rootDir) || [] }; cachedReadDirectoryResult.set(ensureTrailingDirectorySeparator(rootDirPath), resultFromHost); return resultFromHost; } if ((_a = host.directoryExists) == null ? void 0 : _a.call(host, rootDir)) { cachedReadDirectoryResult.set(rootDirPath, false); return false; } return void 0; } function tryReadDirectory(rootDir, rootDirPath) { rootDirPath = ensureTrailingDirectorySeparator(rootDirPath); const cachedResult = getCachedFileSystemEntries(rootDirPath); if (cachedResult) { return cachedResult; } try { return createCachedFileSystemEntries(rootDir, rootDirPath); } catch { Debug.assert(!cachedReadDirectoryResult.has(ensureTrailingDirectorySeparator(rootDirPath))); return void 0; } } function hasEntry(entries, name) { const index = binarySearch(entries, name, identity, compareStringsCaseSensitive); return index >= 0; } function writeFile2(fileName, data, writeByteOrderMark) { const path = toPath3(fileName); const result = getCachedFileSystemEntriesForBaseDir(path); if (result) { updateFilesOfFileSystemEntry( result, getBaseNameOfFileName(fileName), /*fileExists*/ true ); } return host.writeFile(fileName, data, writeByteOrderMark); } function fileExists(fileName) { const path = toPath3(fileName); const result = getCachedFileSystemEntriesForBaseDir(path); return result && hasEntry(result.sortedAndCanonicalizedFiles, getCanonicalFileName(getBaseNameOfFileName(fileName))) || host.fileExists(fileName); } function directoryExists(dirPath) { const path = toPath3(dirPath); return cachedReadDirectoryResult.has(ensureTrailingDirectorySeparator(path)) || host.directoryExists(dirPath); } function createDirectory(dirPath) { const path = toPath3(dirPath); const result = getCachedFileSystemEntriesForBaseDir(path); if (result) { const baseName = getBaseNameOfFileName(dirPath); const canonicalizedBaseName = getCanonicalFileName(baseName); const canonicalizedDirectories = result.sortedAndCanonicalizedDirectories; if (insertSorted(canonicalizedDirectories, canonicalizedBaseName, compareStringsCaseSensitive)) { result.directories.push(baseName); } } host.createDirectory(dirPath); } function getDirectories(rootDir) { const rootDirPath = toPath3(rootDir); const result = tryReadDirectory(rootDir, rootDirPath); if (result) { return result.directories.slice(); } return host.getDirectories(rootDir); } function readDirectory(rootDir, extensions, excludes, includes, depth) { const rootDirPath = toPath3(rootDir); const rootResult = tryReadDirectory(rootDir, rootDirPath); let rootSymLinkResult; if (rootResult !== void 0) { return matchFiles(rootDir, extensions, excludes, includes, useCaseSensitiveFileNames2, currentDirectory, depth, getFileSystemEntries, realpath); } return host.readDirectory(rootDir, extensions, excludes, includes, depth); function getFileSystemEntries(dir) { const path = toPath3(dir); if (path === rootDirPath) { return rootResult || getFileSystemEntriesFromHost(dir, path); } const result = tryReadDirectory(dir, path); return result !== void 0 ? result || getFileSystemEntriesFromHost(dir, path) : emptyFileSystemEntries; } function getFileSystemEntriesFromHost(dir, path) { if (rootSymLinkResult && path === rootDirPath) return rootSymLinkResult; const result = { files: map(host.readDirectory( dir, /*extensions*/ void 0, /*exclude*/ void 0, /*include*/ ["*.*"] ), getBaseNameOfFileName) || emptyArray, directories: host.getDirectories(dir) || emptyArray }; if (path === rootDirPath) rootSymLinkResult = result; return result; } } function realpath(s) { return host.realpath ? host.realpath(s) : s; } function clearFirstAncestorEntry(fileOrDirectoryPath) { forEachAncestorDirectory( getDirectoryPath(fileOrDirectoryPath), (ancestor) => cachedReadDirectoryResult.delete(ensureTrailingDirectorySeparator(ancestor)) ? true : void 0 ); } function addOrDeleteFileOrDirectory(fileOrDirectory, fileOrDirectoryPath) { const existingResult = getCachedFileSystemEntries(fileOrDirectoryPath); if (existingResult !== void 0) { clearCache(); return void 0; } const parentResult = getCachedFileSystemEntriesForBaseDir(fileOrDirectoryPath); if (!parentResult) { clearFirstAncestorEntry(fileOrDirectoryPath); return void 0; } if (!host.directoryExists) { clearCache(); return void 0; } const baseName = getBaseNameOfFileName(fileOrDirectory); const fsQueryResult = { fileExists: host.fileExists(fileOrDirectory), directoryExists: host.directoryExists(fileOrDirectory) }; if (fsQueryResult.directoryExists || hasEntry(parentResult.sortedAndCanonicalizedDirectories, getCanonicalFileName(baseName))) { clearCache(); } else { updateFilesOfFileSystemEntry(parentResult, baseName, fsQueryResult.fileExists); } return fsQueryResult; } function addOrDeleteFile(fileName, filePath, eventKind) { if (eventKind === 1 /* Changed */) { return; } const parentResult = getCachedFileSystemEntriesForBaseDir(filePath); if (parentResult) { updateFilesOfFileSystemEntry(parentResult, getBaseNameOfFileName(fileName), eventKind === 0 /* Created */); } else { clearFirstAncestorEntry(filePath); } } function updateFilesOfFileSystemEntry(parentResult, baseName, fileExists2) { const canonicalizedFiles = parentResult.sortedAndCanonicalizedFiles; const canonicalizedBaseName = getCanonicalFileName(baseName); if (fileExists2) { if (insertSorted(canonicalizedFiles, canonicalizedBaseName, compareStringsCaseSensitive)) { parentResult.files.push(baseName); } } else { const sortedIndex = binarySearch(canonicalizedFiles, canonicalizedBaseName, identity, compareStringsCaseSensitive); if (sortedIndex >= 0) { canonicalizedFiles.splice(sortedIndex, 1); const unsortedIndex = parentResult.files.findIndex((entry) => getCanonicalFileName(entry) === canonicalizedBaseName); parentResult.files.splice(unsortedIndex, 1); } } } function clearCache() { cachedReadDirectoryResult.clear(); } } function updateSharedExtendedConfigFileWatcher(projectPath, options, extendedConfigFilesMap, createExtendedConfigFileWatch, toPath3) { var _a; const extendedConfigs = arrayToMap(((_a = options == null ? void 0 : options.configFile) == null ? void 0 : _a.extendedSourceFiles) || emptyArray, toPath3); extendedConfigFilesMap.forEach((watcher, extendedConfigFilePath) => { if (!extendedConfigs.has(extendedConfigFilePath)) { watcher.projects.delete(projectPath); watcher.close(); } }); extendedConfigs.forEach((extendedConfigFileName, extendedConfigFilePath) => { const existing = extendedConfigFilesMap.get(extendedConfigFilePath); if (existing) { existing.projects.add(projectPath); } else { extendedConfigFilesMap.set(extendedConfigFilePath, { projects: /* @__PURE__ */ new Set([projectPath]), watcher: createExtendedConfigFileWatch(extendedConfigFileName, extendedConfigFilePath), close: () => { const existing2 = extendedConfigFilesMap.get(extendedConfigFilePath); if (!existing2 || existing2.projects.size !== 0) return; existing2.watcher.close(); extendedConfigFilesMap.delete(extendedConfigFilePath); } }); } }); } function clearSharedExtendedConfigFileWatcher(projectPath, extendedConfigFilesMap) { extendedConfigFilesMap.forEach((watcher) => { if (watcher.projects.delete(projectPath)) watcher.close(); }); } function cleanExtendedConfigCache(extendedConfigCache, extendedConfigFilePath, toPath3) { if (!extendedConfigCache.delete(extendedConfigFilePath)) return; extendedConfigCache.forEach(({ extendedResult }, key) => { var _a; if ((_a = extendedResult.extendedSourceFiles) == null ? void 0 : _a.some((extendedFile) => toPath3(extendedFile) === extendedConfigFilePath)) { cleanExtendedConfigCache(extendedConfigCache, key, toPath3); } }); } function updateMissingFilePathsWatch(program, missingFileWatches, createMissingFileWatch) { mutateMap( missingFileWatches, program.getMissingFilePaths(), { // Watch the missing files createNewValue: createMissingFileWatch, // Files that are no longer missing (e.g. because they are no longer required) // should no longer be watched. onDeleteValue: closeFileWatcher } ); } function updateWatchingWildcardDirectories(existingWatchedForWildcards, wildcardDirectories, watchDirectory) { if (wildcardDirectories) { mutateMap( existingWatchedForWildcards, new Map(Object.entries(wildcardDirectories)), { // Create new watch and recursive info createNewValue: createWildcardDirectoryWatcher, // Close existing watch thats not needed any more onDeleteValue: closeFileWatcherOf, // Close existing watch that doesnt match in the flags onExistingValue: updateWildcardDirectoryWatcher } ); } else { clearMap(existingWatchedForWildcards, closeFileWatcherOf); } function createWildcardDirectoryWatcher(directory, flags) { return { watcher: watchDirectory(directory, flags), flags }; } function updateWildcardDirectoryWatcher(existingWatcher, flags, directory) { if (existingWatcher.flags === flags) { return; } existingWatcher.watcher.close(); existingWatchedForWildcards.set(directory, createWildcardDirectoryWatcher(directory, flags)); } } function isIgnoredFileFromWildCardWatching({ watchedDirPath, fileOrDirectory, fileOrDirectoryPath, configFileName, options, program, extraFileExtensions, currentDirectory, useCaseSensitiveFileNames: useCaseSensitiveFileNames2, writeLog, toPath: toPath3, getScriptKind }) { const newPath = removeIgnoredPath(fileOrDirectoryPath); if (!newPath) { writeLog(`Project: ${configFileName} Detected ignored path: ${fileOrDirectory}`); return true; } fileOrDirectoryPath = newPath; if (fileOrDirectoryPath === watchedDirPath) return false; if (hasExtension(fileOrDirectoryPath) && !(isSupportedSourceFileName(fileOrDirectory, options, extraFileExtensions) || isSupportedScriptKind())) { writeLog(`Project: ${configFileName} Detected file add/remove of non supported extension: ${fileOrDirectory}`); return true; } if (isExcludedFile(fileOrDirectory, options.configFile.configFileSpecs, getNormalizedAbsolutePath(getDirectoryPath(configFileName), currentDirectory), useCaseSensitiveFileNames2, currentDirectory)) { writeLog(`Project: ${configFileName} Detected excluded file: ${fileOrDirectory}`); return true; } if (!program) return false; if (options.outFile || options.outDir) return false; if (isDeclarationFileName(fileOrDirectoryPath)) { if (options.declarationDir) return false; } else if (!fileExtensionIsOneOf(fileOrDirectoryPath, supportedJSExtensionsFlat)) { return false; } const filePathWithoutExtension = removeFileExtension(fileOrDirectoryPath); const realProgram = isArray(program) ? void 0 : isBuilderProgram(program) ? program.getProgramOrUndefined() : program; const builderProgram = !realProgram && !isArray(program) ? program : void 0; if (hasSourceFile(filePathWithoutExtension + ".ts" /* Ts */) || hasSourceFile(filePathWithoutExtension + ".tsx" /* Tsx */)) { writeLog(`Project: ${configFileName} Detected output file: ${fileOrDirectory}`); return true; } return false; function hasSourceFile(file) { return realProgram ? !!realProgram.getSourceFileByPath(file) : builderProgram ? builderProgram.state.fileInfos.has(file) : !!find(program, (rootFile) => toPath3(rootFile) === file); } function isSupportedScriptKind() { if (!getScriptKind) return false; const scriptKind = getScriptKind(fileOrDirectory); switch (scriptKind) { case 3 /* TS */: case 4 /* TSX */: case 7 /* Deferred */: case 5 /* External */: return true; case 1 /* JS */: case 2 /* JSX */: return getAllowJSCompilerOption(options); case 6 /* JSON */: return getResolveJsonModule(options); case 0 /* Unknown */: return false; } } } function isEmittedFileOfProgram(program, file) { if (!program) { return false; } return program.isEmittedFile(file); } function getWatchFactory(host, watchLogLevel, log, getDetailWatchInfo) { setSysLog(watchLogLevel === 2 /* Verbose */ ? log : noop); const plainInvokeFactory = { watchFile: (file, callback, pollingInterval, options) => host.watchFile(file, callback, pollingInterval, options), watchDirectory: (directory, callback, flags, options) => host.watchDirectory(directory, callback, (flags & 1 /* Recursive */) !== 0, options) }; const triggerInvokingFactory = watchLogLevel !== 0 /* None */ ? { watchFile: createTriggerLoggingAddWatch("watchFile"), watchDirectory: createTriggerLoggingAddWatch("watchDirectory") } : void 0; const factory2 = watchLogLevel === 2 /* Verbose */ ? { watchFile: createFileWatcherWithLogging, watchDirectory: createDirectoryWatcherWithLogging } : triggerInvokingFactory || plainInvokeFactory; const excludeWatcherFactory = watchLogLevel === 2 /* Verbose */ ? createExcludeWatcherWithLogging : returnNoopFileWatcher; return { watchFile: createExcludeHandlingAddWatch("watchFile"), watchDirectory: createExcludeHandlingAddWatch("watchDirectory") }; function createExcludeHandlingAddWatch(key) { return (file, cb, flags, options, detailInfo1, detailInfo2) => { var _a; return !matchesExclude(file, key === "watchFile" ? options == null ? void 0 : options.excludeFiles : options == null ? void 0 : options.excludeDirectories, useCaseSensitiveFileNames2(), ((_a = host.getCurrentDirectory) == null ? void 0 : _a.call(host)) || "") ? factory2[key].call( /*thisArgs*/ void 0, file, cb, flags, options, detailInfo1, detailInfo2 ) : excludeWatcherFactory(file, flags, options, detailInfo1, detailInfo2); }; } function useCaseSensitiveFileNames2() { return typeof host.useCaseSensitiveFileNames === "boolean" ? host.useCaseSensitiveFileNames : host.useCaseSensitiveFileNames(); } function createExcludeWatcherWithLogging(file, flags, options, detailInfo1, detailInfo2) { log(`ExcludeWatcher:: Added:: ${getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo)}`); return { close: () => log(`ExcludeWatcher:: Close:: ${getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo)}`) }; } function createFileWatcherWithLogging(file, cb, flags, options, detailInfo1, detailInfo2) { log(`FileWatcher:: Added:: ${getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo)}`); const watcher = triggerInvokingFactory.watchFile(file, cb, flags, options, detailInfo1, detailInfo2); return { close: () => { log(`FileWatcher:: Close:: ${getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo)}`); watcher.close(); } }; } function createDirectoryWatcherWithLogging(file, cb, flags, options, detailInfo1, detailInfo2) { const watchInfo = `DirectoryWatcher:: Added:: ${getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo)}`; log(watchInfo); const start = timestamp(); const watcher = triggerInvokingFactory.watchDirectory(file, cb, flags, options, detailInfo1, detailInfo2); const elapsed = timestamp() - start; log(`Elapsed:: ${elapsed}ms ${watchInfo}`); return { close: () => { const watchInfo2 = `DirectoryWatcher:: Close:: ${getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo)}`; log(watchInfo2); const start2 = timestamp(); watcher.close(); const elapsed2 = timestamp() - start2; log(`Elapsed:: ${elapsed2}ms ${watchInfo2}`); } }; } function createTriggerLoggingAddWatch(key) { return (file, cb, flags, options, detailInfo1, detailInfo2) => plainInvokeFactory[key].call( /*thisArgs*/ void 0, file, (...args) => { const triggerredInfo = `${key === "watchFile" ? "FileWatcher" : "DirectoryWatcher"}:: Triggered with ${args[0]} ${args[1] !== void 0 ? args[1] : ""}:: ${getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo)}`; log(triggerredInfo); const start = timestamp(); cb.call( /*thisArg*/ void 0, ...args ); const elapsed = timestamp() - start; log(`Elapsed:: ${elapsed}ms ${triggerredInfo}`); }, flags, options, detailInfo1, detailInfo2 ); } function getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo2) { return `WatchInfo: ${file} ${flags} ${JSON.stringify(options)} ${getDetailWatchInfo2 ? getDetailWatchInfo2(detailInfo1, detailInfo2) : detailInfo2 === void 0 ? detailInfo1 : `${detailInfo1} ${detailInfo2}`}`; } } function getFallbackOptions(options) { const fallbackPolling = options == null ? void 0 : options.fallbackPolling; return { watchFile: fallbackPolling !== void 0 ? fallbackPolling : 1 /* PriorityPollingInterval */ }; } function closeFileWatcherOf(objWithWatcher) { objWithWatcher.watcher.close(); } // src/compiler/program.ts function findConfigFile(searchPath, fileExists, configName = "tsconfig.json") { return forEachAncestorDirectory(searchPath, (ancestor) => { const fileName = combinePaths(ancestor, configName); return fileExists(fileName) ? fileName : void 0; }); } function resolveTripleslashReference(moduleName, containingFile) { const basePath = getDirectoryPath(containingFile); const referencedFileName = isRootedDiskPath(moduleName) ? moduleName : combinePaths(basePath, moduleName); return normalizePath(referencedFileName); } function computeCommonSourceDirectoryOfFilenames(fileNames, currentDirectory, getCanonicalFileName) { let commonPathComponents; const failed2 = forEach(fileNames, (sourceFile) => { const sourcePathComponents = getNormalizedPathComponents(sourceFile, currentDirectory); sourcePathComponents.pop(); if (!commonPathComponents) { commonPathComponents = sourcePathComponents; return; } const n = Math.min(commonPathComponents.length, sourcePathComponents.length); for (let i = 0; i < n; i++) { if (getCanonicalFileName(commonPathComponents[i]) !== getCanonicalFileName(sourcePathComponents[i])) { if (i === 0) { return true; } commonPathComponents.length = i; break; } } if (sourcePathComponents.length < commonPathComponents.length) { commonPathComponents.length = sourcePathComponents.length; } }); if (failed2) { return ""; } if (!commonPathComponents) { return currentDirectory; } return getPathFromPathComponents(commonPathComponents); } function createCompilerHost(options, setParentNodes) { return createCompilerHostWorker(options, setParentNodes); } function createGetSourceFile(readFile, setParentNodes) { return (fileName, languageVersionOrOptions, onError) => { let text; try { mark("beforeIORead"); text = readFile(fileName); mark("afterIORead"); measure("I/O Read", "beforeIORead", "afterIORead"); } catch (e) { if (onError) { onError(e.message); } text = ""; } return text !== void 0 ? createSourceFile(fileName, text, languageVersionOrOptions, setParentNodes) : void 0; }; } function createWriteFileMeasuringIO(actualWriteFile, createDirectory, directoryExists) { return (fileName, data, writeByteOrderMark, onError) => { try { mark("beforeIOWrite"); writeFileEnsuringDirectories( fileName, data, writeByteOrderMark, actualWriteFile, createDirectory, directoryExists ); mark("afterIOWrite"); measure("I/O Write", "beforeIOWrite", "afterIOWrite"); } catch (e) { if (onError) { onError(e.message); } } }; } function createCompilerHostWorker(options, setParentNodes, system = sys) { const existingDirectories = /* @__PURE__ */ new Map(); const getCanonicalFileName = createGetCanonicalFileName(system.useCaseSensitiveFileNames); function directoryExists(directoryPath) { if (existingDirectories.has(directoryPath)) { return true; } if ((compilerHost.directoryExists || system.directoryExists)(directoryPath)) { existingDirectories.set(directoryPath, true); return true; } return false; } function getDefaultLibLocation() { return getDirectoryPath(normalizePath(system.getExecutingFilePath())); } const newLine = getNewLineCharacter(options); const realpath = system.realpath && ((path) => system.realpath(path)); const compilerHost = { getSourceFile: createGetSourceFile((fileName) => compilerHost.readFile(fileName), setParentNodes), getDefaultLibLocation, getDefaultLibFileName: (options2) => combinePaths(getDefaultLibLocation(), getDefaultLibFileName(options2)), writeFile: createWriteFileMeasuringIO( (path, data, writeByteOrderMark) => system.writeFile(path, data, writeByteOrderMark), (path) => (compilerHost.createDirectory || system.createDirectory)(path), (path) => directoryExists(path) ), getCurrentDirectory: memoize(() => system.getCurrentDirectory()), useCaseSensitiveFileNames: () => system.useCaseSensitiveFileNames, getCanonicalFileName, getNewLine: () => newLine, fileExists: (fileName) => system.fileExists(fileName), readFile: (fileName) => system.readFile(fileName), trace: (s) => system.write(s + newLine), directoryExists: (directoryName) => system.directoryExists(directoryName), getEnvironmentVariable: (name) => system.getEnvironmentVariable ? system.getEnvironmentVariable(name) : "", getDirectories: (path) => system.getDirectories(path), realpath, readDirectory: (path, extensions, include, exclude, depth) => system.readDirectory(path, extensions, include, exclude, depth), createDirectory: (d) => system.createDirectory(d), createHash: maybeBind(system, system.createHash) }; return compilerHost; } function changeCompilerHostLikeToUseCache(host, toPath3, getSourceFile) { const originalReadFile = host.readFile; const originalFileExists = host.fileExists; const originalDirectoryExists = host.directoryExists; const originalCreateDirectory = host.createDirectory; const originalWriteFile = host.writeFile; const readFileCache = /* @__PURE__ */ new Map(); const fileExistsCache = /* @__PURE__ */ new Map(); const directoryExistsCache = /* @__PURE__ */ new Map(); const sourceFileCache = /* @__PURE__ */ new Map(); const readFileWithCache = (fileName) => { const key = toPath3(fileName); const value = readFileCache.get(key); if (value !== void 0) return value !== false ? value : void 0; return setReadFileCache(key, fileName); }; const setReadFileCache = (key, fileName) => { const newValue = originalReadFile.call(host, fileName); readFileCache.set(key, newValue !== void 0 ? newValue : false); return newValue; }; host.readFile = (fileName) => { const key = toPath3(fileName); const value = readFileCache.get(key); if (value !== void 0) return value !== false ? value : void 0; if (!fileExtensionIs(fileName, ".json" /* Json */) && !isBuildInfoFile(fileName)) { return originalReadFile.call(host, fileName); } return setReadFileCache(key, fileName); }; const getSourceFileWithCache = getSourceFile ? (fileName, languageVersionOrOptions, onError, shouldCreateNewSourceFile) => { const key = toPath3(fileName); const impliedNodeFormat = typeof languageVersionOrOptions === "object" ? languageVersionOrOptions.impliedNodeFormat : void 0; const forImpliedNodeFormat = sourceFileCache.get(impliedNodeFormat); const value = forImpliedNodeFormat == null ? void 0 : forImpliedNodeFormat.get(key); if (value) return value; const sourceFile = getSourceFile(fileName, languageVersionOrOptions, onError, shouldCreateNewSourceFile); if (sourceFile && (isDeclarationFileName(fileName) || fileExtensionIs(fileName, ".json" /* Json */))) { sourceFileCache.set(impliedNodeFormat, (forImpliedNodeFormat || /* @__PURE__ */ new Map()).set(key, sourceFile)); } return sourceFile; } : void 0; host.fileExists = (fileName) => { const key = toPath3(fileName); const value = fileExistsCache.get(key); if (value !== void 0) return value; const newValue = originalFileExists.call(host, fileName); fileExistsCache.set(key, !!newValue); return newValue; }; if (originalWriteFile) { host.writeFile = (fileName, data, ...rest) => { const key = toPath3(fileName); fileExistsCache.delete(key); const value = readFileCache.get(key); if (value !== void 0 && value !== data) { readFileCache.delete(key); sourceFileCache.forEach((map2) => map2.delete(key)); } else if (getSourceFileWithCache) { sourceFileCache.forEach((map2) => { const sourceFile = map2.get(key); if (sourceFile && sourceFile.text !== data) { map2.delete(key); } }); } originalWriteFile.call(host, fileName, data, ...rest); }; } if (originalDirectoryExists) { host.directoryExists = (directory) => { const key = toPath3(directory); const value = directoryExistsCache.get(key); if (value !== void 0) return value; const newValue = originalDirectoryExists.call(host, directory); directoryExistsCache.set(key, !!newValue); return newValue; }; if (originalCreateDirectory) { host.createDirectory = (directory) => { const key = toPath3(directory); directoryExistsCache.delete(key); originalCreateDirectory.call(host, directory); }; } } return { originalReadFile, originalFileExists, originalDirectoryExists, originalCreateDirectory, originalWriteFile, getSourceFileWithCache, readFileWithCache }; } function formatDiagnostic(diagnostic, host) { const errorMessage = `${diagnosticCategoryName(diagnostic)} TS${diagnostic.code}: ${flattenDiagnosticMessageText(diagnostic.messageText, host.getNewLine())}${host.getNewLine()}`; if (diagnostic.file) { const { line, character } = getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start); const fileName = diagnostic.file.fileName; const relativeFileName = convertToRelativePath(fileName, host.getCurrentDirectory(), (fileName2) => host.getCanonicalFileName(fileName2)); return `${relativeFileName}(${line + 1},${character + 1}): ` + errorMessage; } return errorMessage; } var gutterStyleSequence = "\x1B[7m"; var gutterSeparator = " "; var resetEscapeSequence = "\x1B[0m"; var ellipsis = "..."; var halfIndent = " "; var indent = " "; function getCategoryFormat(category) { switch (category) { case 1 /* Error */: return "\x1B[91m" /* Red */; case 0 /* Warning */: return "\x1B[93m" /* Yellow */; case 2 /* Suggestion */: return Debug.fail("Should never get an Info diagnostic on the command line."); case 3 /* Message */: return "\x1B[94m" /* Blue */; } } function formatColorAndReset(text, formatStyle) { return formatStyle + text + resetEscapeSequence; } function formatCodeSpan(file, start, length2, indent2, squiggleColor, host) { const { line: firstLine, character: firstLineChar } = getLineAndCharacterOfPosition(file, start); const { line: lastLine, character: lastLineChar } = getLineAndCharacterOfPosition(file, start + length2); const lastLineInFile = getLineAndCharacterOfPosition(file, file.text.length).line; const hasMoreThanFiveLines = lastLine - firstLine >= 4; let gutterWidth = (lastLine + 1 + "").length; if (hasMoreThanFiveLines) { gutterWidth = Math.max(ellipsis.length, gutterWidth); } let context = ""; for (let i = firstLine; i <= lastLine; i++) { context += host.getNewLine(); if (hasMoreThanFiveLines && firstLine + 1 < i && i < lastLine - 1) { context += indent2 + formatColorAndReset(ellipsis.padStart(gutterWidth), gutterStyleSequence) + gutterSeparator + host.getNewLine(); i = lastLine - 1; } const lineStart = getPositionOfLineAndCharacter(file, i, 0); const lineEnd = i < lastLineInFile ? getPositionOfLineAndCharacter(file, i + 1, 0) : file.text.length; let lineContent = file.text.slice(lineStart, lineEnd); lineContent = lineContent.trimEnd(); lineContent = lineContent.replace(/\t/g, " "); context += indent2 + formatColorAndReset((i + 1 + "").padStart(gutterWidth), gutterStyleSequence) + gutterSeparator; context += lineContent + host.getNewLine(); context += indent2 + formatColorAndReset("".padStart(gutterWidth), gutterStyleSequence) + gutterSeparator; context += squiggleColor; if (i === firstLine) { const lastCharForLine = i === lastLine ? lastLineChar : void 0; context += lineContent.slice(0, firstLineChar).replace(/\S/g, " "); context += lineContent.slice(firstLineChar, lastCharForLine).replace(/./g, "~"); } else if (i === lastLine) { context += lineContent.slice(0, lastLineChar).replace(/./g, "~"); } else { context += lineContent.replace(/./g, "~"); } context += resetEscapeSequence; } return context; } function formatLocation(file, start, host, color = formatColorAndReset) { const { line: firstLine, character: firstLineChar } = getLineAndCharacterOfPosition(file, start); const relativeFileName = host ? convertToRelativePath(file.fileName, host.getCurrentDirectory(), (fileName) => host.getCanonicalFileName(fileName)) : file.fileName; let output = ""; output += color(relativeFileName, "\x1B[96m" /* Cyan */); output += ":"; output += color(`${firstLine + 1}`, "\x1B[93m" /* Yellow */); output += ":"; output += color(`${firstLineChar + 1}`, "\x1B[93m" /* Yellow */); return output; } function formatDiagnosticsWithColorAndContext(diagnostics, host) { let output = ""; for (const diagnostic of diagnostics) { if (diagnostic.file) { const { file, start } = diagnostic; output += formatLocation(file, start, host); output += " - "; } output += formatColorAndReset(diagnosticCategoryName(diagnostic), getCategoryFormat(diagnostic.category)); output += formatColorAndReset(` TS${diagnostic.code}: `, "\x1B[90m" /* Grey */); output += flattenDiagnosticMessageText(diagnostic.messageText, host.getNewLine()); if (diagnostic.file && diagnostic.code !== Diagnostics.File_appears_to_be_binary.code) { output += host.getNewLine(); output += formatCodeSpan(diagnostic.file, diagnostic.start, diagnostic.length, "", getCategoryFormat(diagnostic.category), host); } if (diagnostic.relatedInformation) { output += host.getNewLine(); for (const { file, start, length: length2, messageText } of diagnostic.relatedInformation) { if (file) { output += host.getNewLine(); output += halfIndent + formatLocation(file, start, host); output += formatCodeSpan(file, start, length2, indent, "\x1B[96m" /* Cyan */, host); } output += host.getNewLine(); output += indent + flattenDiagnosticMessageText(messageText, host.getNewLine()); } } output += host.getNewLine(); } return output; } function flattenDiagnosticMessageText(diag2, newLine, indent2 = 0) { if (isString(diag2)) { return diag2; } else if (diag2 === void 0) { return ""; } let result = ""; if (indent2) { result += newLine; for (let i = 0; i < indent2; i++) { result += " "; } } result += diag2.messageText; indent2++; if (diag2.next) { for (const kid of diag2.next) { result += flattenDiagnosticMessageText(kid, newLine, indent2); } } return result; } function getModeForFileReference(ref, containingFileMode) { return (isString(ref) ? containingFileMode : ref.resolutionMode) || containingFileMode; } function isExclusivelyTypeOnlyImportOrExport(decl) { var _a; if (isExportDeclaration(decl)) { return decl.isTypeOnly; } if ((_a = decl.importClause) == null ? void 0 : _a.isTypeOnly) { return true; } return false; } function getModeForUsageLocation(file, usage, compilerOptions) { return getModeForUsageLocationWorker(file, usage, compilerOptions); } function getModeForUsageLocationWorker(file, usage, compilerOptions) { if (isImportDeclaration(usage.parent) || isExportDeclaration(usage.parent) || isJSDocImportTag(usage.parent)) { const isTypeOnly = isExclusivelyTypeOnlyImportOrExport(usage.parent); if (isTypeOnly) { const override = getResolutionModeOverride(usage.parent.attributes); if (override) { return override; } } } if (usage.parent.parent && isImportTypeNode(usage.parent.parent)) { const override = getResolutionModeOverride(usage.parent.parent.attributes); if (override) { return override; } } if (compilerOptions && importSyntaxAffectsModuleResolution(compilerOptions)) { return getEmitSyntaxForUsageLocationWorker(file, usage, compilerOptions); } } function getEmitSyntaxForUsageLocationWorker(file, usage, compilerOptions) { var _a; if (!compilerOptions) { return void 0; } const exprParentParent = (_a = walkUpParenthesizedExpressions(usage.parent)) == null ? void 0 : _a.parent; if (exprParentParent && isImportEqualsDeclaration(exprParentParent) || isRequireCall( usage.parent, /*requireStringLiteralLikeArgument*/ false )) { return 1 /* CommonJS */; } if (isImportCall(walkUpParenthesizedExpressions(usage.parent))) { return shouldTransformImportCallWorker(file, compilerOptions) ? 1 /* CommonJS */ : 99 /* ESNext */; } const fileEmitMode = getEmitModuleFormatOfFileWorker(file, compilerOptions); return fileEmitMode === 1 /* CommonJS */ ? 1 /* CommonJS */ : emitModuleKindIsNonNodeESM(fileEmitMode) || fileEmitMode === 200 /* Preserve */ ? 99 /* ESNext */ : void 0; } function getResolutionModeOverride(node, grammarErrorOnNode) { if (!node) return void 0; if (length(node.elements) !== 1) { grammarErrorOnNode == null ? void 0 : grammarErrorOnNode( node, node.token === 118 /* WithKeyword */ ? Diagnostics.Type_import_attributes_should_have_exactly_one_key_resolution_mode_with_value_import_or_require : Diagnostics.Type_import_assertions_should_have_exactly_one_key_resolution_mode_with_value_import_or_require ); return void 0; } const elem = node.elements[0]; if (!isStringLiteralLike(elem.name)) return void 0; if (elem.name.text !== "resolution-mode") { grammarErrorOnNode == null ? void 0 : grammarErrorOnNode( elem.name, node.token === 118 /* WithKeyword */ ? Diagnostics.resolution_mode_is_the_only_valid_key_for_type_import_attributes : Diagnostics.resolution_mode_is_the_only_valid_key_for_type_import_assertions ); return void 0; } if (!isStringLiteralLike(elem.value)) return void 0; if (elem.value.text !== "import" && elem.value.text !== "require") { grammarErrorOnNode == null ? void 0 : grammarErrorOnNode(elem.value, Diagnostics.resolution_mode_should_be_either_require_or_import); return void 0; } return elem.value.text === "import" ? 99 /* ESNext */ : 1 /* CommonJS */; } var emptyResolution = { resolvedModule: void 0, resolvedTypeReferenceDirective: void 0 }; function getModuleResolutionName(literal) { return literal.text; } var moduleResolutionNameAndModeGetter = { getName: getModuleResolutionName, getMode: (entry, file, compilerOptions) => getModeForUsageLocation(file, entry, compilerOptions) }; function createModuleResolutionLoader(containingFile, redirectedReference, options, host, cache) { return { nameAndMode: moduleResolutionNameAndModeGetter, resolve: (moduleName, resolutionMode) => resolveModuleName( moduleName, containingFile, options, host, cache, redirectedReference, resolutionMode ) }; } function getTypeReferenceResolutionName(entry) { return !isString(entry) ? entry.fileName : entry; } var typeReferenceResolutionNameAndModeGetter = { getName: getTypeReferenceResolutionName, getMode: (entry, file, compilerOptions) => getModeForFileReference(entry, file && getDefaultResolutionModeForFileWorker(file, compilerOptions)) }; function createTypeReferenceResolutionLoader(containingFile, redirectedReference, options, host, cache) { return { nameAndMode: typeReferenceResolutionNameAndModeGetter, resolve: (typeRef, resoluionMode) => resolveTypeReferenceDirective( typeRef, containingFile, options, host, redirectedReference, cache, resoluionMode ) }; } function loadWithModeAwareCache(entries, containingFile, redirectedReference, options, containingSourceFile, host, resolutionCache, createLoader) { if (entries.length === 0) return emptyArray; const resolutions = []; const cache = /* @__PURE__ */ new Map(); const loader = createLoader(containingFile, redirectedReference, options, host, resolutionCache); for (const entry of entries) { const name = loader.nameAndMode.getName(entry); const mode = loader.nameAndMode.getMode(entry, containingSourceFile, (redirectedReference == null ? void 0 : redirectedReference.commandLine.options) || options); const key = createModeAwareCacheKey(name, mode); let result = cache.get(key); if (!result) { cache.set(key, result = loader.resolve(name, mode)); } resolutions.push(result); } return resolutions; } var inferredTypesContainingFile = "__inferred type names__.ts"; function getInferredLibraryNameResolveFrom(options, currentDirectory, libFileName) { const containingDirectory = options.configFilePath ? getDirectoryPath(options.configFilePath) : currentDirectory; return combinePaths(containingDirectory, `__lib_node_modules_lookup_${libFileName}__.ts`); } function getLibraryNameFromLibFileName(libFileName) { const components = libFileName.split("."); let path = components[1]; let i = 2; while (components[i] && components[i] !== "d") { path += (i === 2 ? "/" : "-") + components[i]; i++; } return "@typescript/lib-" + path; } function isReferencedFile(reason) { switch (reason == null ? void 0 : reason.kind) { case 3 /* Import */: case 4 /* ReferenceFile */: case 5 /* TypeReferenceDirective */: case 7 /* LibReferenceDirective */: return true; default: return false; } } function isReferenceFileLocation(location) { return location.pos !== void 0; } function getReferencedFileLocation(program, ref) { var _a, _b, _c, _d; const file = Debug.checkDefined(program.getSourceFileByPath(ref.file)); const { kind, index } = ref; let pos, end, packageId; switch (kind) { case 3 /* Import */: const importLiteral = getModuleNameStringLiteralAt(file, index); packageId = (_b = (_a = program.getResolvedModuleFromModuleSpecifier(importLiteral, file)) == null ? void 0 : _a.resolvedModule) == null ? void 0 : _b.packageId; if (importLiteral.pos === -1) return { file, packageId, text: importLiteral.text }; pos = skipTrivia(file.text, importLiteral.pos); end = importLiteral.end; break; case 4 /* ReferenceFile */: ({ pos, end } = file.referencedFiles[index]); break; case 5 /* TypeReferenceDirective */: ({ pos, end } = file.typeReferenceDirectives[index]); packageId = (_d = (_c = program.getResolvedTypeReferenceDirectiveFromTypeReferenceDirective(file.typeReferenceDirectives[index], file)) == null ? void 0 : _c.resolvedTypeReferenceDirective) == null ? void 0 : _d.packageId; break; case 7 /* LibReferenceDirective */: ({ pos, end } = file.libReferenceDirectives[index]); break; default: return Debug.assertNever(kind); } return { file, pos, end, packageId }; } function isProgramUptoDate(program, rootFileNames, newOptions, getSourceVersion, fileExists, hasInvalidatedResolutions, hasInvalidatedLibResolutions, hasChangedAutomaticTypeDirectiveNames, getParsedCommandLine, projectReferences) { if (!program || (hasChangedAutomaticTypeDirectiveNames == null ? void 0 : hasChangedAutomaticTypeDirectiveNames())) return false; if (!arrayIsEqualTo(program.getRootFileNames(), rootFileNames)) return false; let seenResolvedRefs; if (!arrayIsEqualTo(program.getProjectReferences(), projectReferences, projectReferenceUptoDate)) return false; if (program.getSourceFiles().some(sourceFileNotUptoDate)) return false; const missingPaths = program.getMissingFilePaths(); if (missingPaths && forEachEntry(missingPaths, fileExists)) return false; const currentOptions = program.getCompilerOptions(); if (!compareDataObjects(currentOptions, newOptions)) return false; if (program.resolvedLibReferences && forEachEntry(program.resolvedLibReferences, (_value, libFileName) => hasInvalidatedLibResolutions(libFileName))) return false; if (currentOptions.configFile && newOptions.configFile) return currentOptions.configFile.text === newOptions.configFile.text; return true; function sourceFileNotUptoDate(sourceFile) { return !sourceFileVersionUptoDate(sourceFile) || hasInvalidatedResolutions(sourceFile.path); } function sourceFileVersionUptoDate(sourceFile) { return sourceFile.version === getSourceVersion(sourceFile.resolvedPath, sourceFile.fileName); } function projectReferenceUptoDate(oldRef, newRef, index) { return projectReferenceIsEqualTo(oldRef, newRef) && resolvedProjectReferenceUptoDate(program.getResolvedProjectReferences()[index], oldRef); } function resolvedProjectReferenceUptoDate(oldResolvedRef, oldRef) { if (oldResolvedRef) { if (contains(seenResolvedRefs, oldResolvedRef)) return true; const refPath2 = resolveProjectReferencePath(oldRef); const newParsedCommandLine = getParsedCommandLine(refPath2); if (!newParsedCommandLine) return false; if (oldResolvedRef.commandLine.options.configFile !== newParsedCommandLine.options.configFile) return false; if (!arrayIsEqualTo(oldResolvedRef.commandLine.fileNames, newParsedCommandLine.fileNames)) return false; (seenResolvedRefs || (seenResolvedRefs = [])).push(oldResolvedRef); return !forEach( oldResolvedRef.references, (childResolvedRef, index) => !resolvedProjectReferenceUptoDate( childResolvedRef, oldResolvedRef.commandLine.projectReferences[index] ) ); } const refPath = resolveProjectReferencePath(oldRef); return !getParsedCommandLine(refPath); } } function getConfigFileParsingDiagnostics(configFileParseResult) { return configFileParseResult.options.configFile ? [...configFileParseResult.options.configFile.parseDiagnostics, ...configFileParseResult.errors] : configFileParseResult.errors; } function getImpliedNodeFormatForFileWorker(fileName, packageJsonInfoCache, host, options) { const moduleResolution = getEmitModuleResolutionKind(options); const shouldLookupFromPackageJson = 3 /* Node16 */ <= moduleResolution && moduleResolution <= 99 /* NodeNext */ || pathContainsNodeModules(fileName); return fileExtensionIsOneOf(fileName, [".d.mts" /* Dmts */, ".mts" /* Mts */, ".mjs" /* Mjs */]) ? 99 /* ESNext */ : fileExtensionIsOneOf(fileName, [".d.cts" /* Dcts */, ".cts" /* Cts */, ".cjs" /* Cjs */]) ? 1 /* CommonJS */ : shouldLookupFromPackageJson && fileExtensionIsOneOf(fileName, [".d.ts" /* Dts */, ".ts" /* Ts */, ".tsx" /* Tsx */, ".js" /* Js */, ".jsx" /* Jsx */]) ? lookupFromPackageJson() : void 0; function lookupFromPackageJson() { const state = getTemporaryModuleResolutionState(packageJsonInfoCache, host, options); const packageJsonLocations = []; state.failedLookupLocations = packageJsonLocations; state.affectingLocations = packageJsonLocations; const packageJsonScope = getPackageScopeForPath(getDirectoryPath(fileName), state); const impliedNodeFormat = (packageJsonScope == null ? void 0 : packageJsonScope.contents.packageJsonContent.type) === "module" ? 99 /* ESNext */ : 1 /* CommonJS */; return { impliedNodeFormat, packageJsonLocations, packageJsonScope }; } } var plainJSErrors = /* @__PURE__ */ new Set([ // binder errors Diagnostics.Cannot_redeclare_block_scoped_variable_0.code, Diagnostics.A_module_cannot_have_multiple_default_exports.code, Diagnostics.Another_export_default_is_here.code, Diagnostics.The_first_export_default_is_here.code, Diagnostics.Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module.code, Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode_Modules_are_automatically_in_strict_mode.code, Diagnostics.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here.code, Diagnostics.constructor_is_a_reserved_word.code, Diagnostics.delete_cannot_be_called_on_an_identifier_in_strict_mode.code, Diagnostics.Code_contained_in_a_class_is_evaluated_in_JavaScript_s_strict_mode_which_does_not_allow_this_use_of_0_For_more_information_see_https_Colon_Slash_Slashdeveloper_mozilla_org_Slashen_US_Slashdocs_SlashWeb_SlashJavaScript_SlashReference_SlashStrict_mode.code, Diagnostics.Invalid_use_of_0_Modules_are_automatically_in_strict_mode.code, Diagnostics.Invalid_use_of_0_in_strict_mode.code, Diagnostics.A_label_is_not_allowed_here.code, Diagnostics.with_statements_are_not_allowed_in_strict_mode.code, // grammar errors Diagnostics.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement.code, Diagnostics.A_break_statement_can_only_jump_to_a_label_of_an_enclosing_statement.code, Diagnostics.A_class_declaration_without_the_default_modifier_must_have_a_name.code, Diagnostics.A_class_member_cannot_have_the_0_keyword.code, Diagnostics.A_comma_expression_is_not_allowed_in_a_computed_property_name.code, Diagnostics.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement.code, Diagnostics.A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement.code, Diagnostics.A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement.code, Diagnostics.A_default_clause_cannot_appear_more_than_once_in_a_switch_statement.code, Diagnostics.A_default_export_must_be_at_the_top_level_of_a_file_or_module_declaration.code, Diagnostics.A_definite_assignment_assertion_is_not_permitted_in_this_context.code, Diagnostics.A_destructuring_declaration_must_have_an_initializer.code, Diagnostics.A_get_accessor_cannot_have_parameters.code, Diagnostics.A_rest_element_cannot_contain_a_binding_pattern.code, Diagnostics.A_rest_element_cannot_have_a_property_name.code, Diagnostics.A_rest_element_cannot_have_an_initializer.code, Diagnostics.A_rest_element_must_be_last_in_a_destructuring_pattern.code, Diagnostics.A_rest_parameter_cannot_have_an_initializer.code, Diagnostics.A_rest_parameter_must_be_last_in_a_parameter_list.code, Diagnostics.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma.code, Diagnostics.A_return_statement_cannot_be_used_inside_a_class_static_block.code, Diagnostics.A_set_accessor_cannot_have_rest_parameter.code, Diagnostics.A_set_accessor_must_have_exactly_one_parameter.code, Diagnostics.An_export_declaration_can_only_be_used_at_the_top_level_of_a_module.code, Diagnostics.An_export_declaration_cannot_have_modifiers.code, Diagnostics.An_import_declaration_can_only_be_used_at_the_top_level_of_a_module.code, Diagnostics.An_import_declaration_cannot_have_modifiers.code, Diagnostics.An_object_member_cannot_be_declared_optional.code, Diagnostics.Argument_of_dynamic_import_cannot_be_spread_element.code, Diagnostics.Cannot_assign_to_private_method_0_Private_methods_are_not_writable.code, Diagnostics.Cannot_redeclare_identifier_0_in_catch_clause.code, Diagnostics.Catch_clause_variable_cannot_have_an_initializer.code, Diagnostics.Class_decorators_can_t_be_used_with_static_private_identifier_Consider_removing_the_experimental_decorator.code, Diagnostics.Classes_can_only_extend_a_single_class.code, Diagnostics.Classes_may_not_have_a_field_named_constructor.code, Diagnostics.Did_you_mean_to_use_a_Colon_An_can_only_follow_a_property_name_when_the_containing_object_literal_is_part_of_a_destructuring_pattern.code, Diagnostics.Duplicate_label_0.code, Diagnostics.Dynamic_imports_can_only_accept_a_module_specifier_and_an_optional_set_of_attributes_as_arguments.code, Diagnostics.for_await_loops_cannot_be_used_inside_a_class_static_block.code, Diagnostics.JSX_attributes_must_only_be_assigned_a_non_empty_expression.code, Diagnostics.JSX_elements_cannot_have_multiple_attributes_with_the_same_name.code, Diagnostics.JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array.code, Diagnostics.JSX_property_access_expressions_cannot_include_JSX_namespace_names.code, Diagnostics.Jump_target_cannot_cross_function_boundary.code, Diagnostics.Line_terminator_not_permitted_before_arrow.code, Diagnostics.Modifiers_cannot_appear_here.code, Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement.code, Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement.code, Diagnostics.Private_identifiers_are_not_allowed_outside_class_bodies.code, Diagnostics.Private_identifiers_are_only_allowed_in_class_bodies_and_may_only_be_used_as_part_of_a_class_member_declaration_property_access_or_on_the_left_hand_side_of_an_in_expression.code, Diagnostics.Property_0_is_not_accessible_outside_class_1_because_it_has_a_private_identifier.code, Diagnostics.Tagged_template_expressions_are_not_permitted_in_an_optional_chain.code, Diagnostics.The_left_hand_side_of_a_for_of_statement_may_not_be_async.code, Diagnostics.The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer.code, Diagnostics.The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer.code, Diagnostics.Trailing_comma_not_allowed.code, Diagnostics.Variable_declaration_list_cannot_be_empty.code, Diagnostics._0_and_1_operations_cannot_be_mixed_without_parentheses.code, Diagnostics._0_expected.code, Diagnostics._0_is_not_a_valid_meta_property_for_keyword_1_Did_you_mean_2.code, Diagnostics._0_list_cannot_be_empty.code, Diagnostics._0_modifier_already_seen.code, Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration.code, Diagnostics._0_modifier_cannot_appear_on_a_module_or_namespace_element.code, Diagnostics._0_modifier_cannot_appear_on_a_parameter.code, Diagnostics._0_modifier_cannot_appear_on_class_elements_of_this_kind.code, Diagnostics._0_modifier_cannot_be_used_here.code, Diagnostics._0_modifier_must_precede_1_modifier.code, Diagnostics._0_declarations_can_only_be_declared_inside_a_block.code, Diagnostics._0_declarations_must_be_initialized.code, Diagnostics.extends_clause_already_seen.code, Diagnostics.let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations.code, Diagnostics.Class_constructor_may_not_be_a_generator.code, Diagnostics.Class_constructor_may_not_be_an_accessor.code, Diagnostics.await_expressions_are_only_allowed_within_async_functions_and_at_the_top_levels_of_modules.code, Diagnostics.await_using_statements_are_only_allowed_within_async_functions_and_at_the_top_levels_of_modules.code, Diagnostics.Private_field_0_must_be_declared_in_an_enclosing_class.code, // Type errors Diagnostics.This_condition_will_always_return_0_since_JavaScript_compares_objects_by_reference_not_value.code ]); function shouldProgramCreateNewSourceFiles(program, newOptions) { if (!program) return false; return optionsHaveChanges(program.getCompilerOptions(), newOptions, sourceFileAffectingCompilerOptions); } function createCreateProgramOptions(rootNames, options, host, oldProgram, configFileParsingDiagnostics, typeScriptVersion2) { return { rootNames, options, host, oldProgram, configFileParsingDiagnostics, typeScriptVersion: typeScriptVersion2 }; } function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _configFileParsingDiagnostics) { var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p; let _createProgramOptions = isArray(_rootNamesOrOptions) ? createCreateProgramOptions(_rootNamesOrOptions, _options, _host, _oldProgram, _configFileParsingDiagnostics) : _rootNamesOrOptions; const { rootNames, options, configFileParsingDiagnostics, projectReferences, typeScriptVersion: typeScriptVersion2, host: createProgramOptionsHost } = _createProgramOptions; let { oldProgram } = _createProgramOptions; _createProgramOptions = void 0; _rootNamesOrOptions = void 0; for (const option of commandLineOptionOfCustomType) { if (hasProperty(options, option.name)) { if (typeof options[option.name] === "string") { throw new Error(`${option.name} is a string value; tsconfig JSON must be parsed with parseJsonSourceFileConfigFileContent or getParsedCommandLineOfConfigFile before passing to createProgram`); } } } const reportInvalidIgnoreDeprecations = memoize(() => createOptionValueDiagnostic("ignoreDeprecations", Diagnostics.Invalid_value_for_ignoreDeprecations)); let processingDefaultLibFiles; let processingOtherFiles; let files; let symlinks; let typeChecker; let classifiableNames; let filesWithReferencesProcessed; let cachedBindAndCheckDiagnosticsForFile; let cachedDeclarationDiagnosticsForFile; const programDiagnostics = createProgramDiagnostics(getCompilerOptionsObjectLiteralSyntax); let automaticTypeDirectiveNames; let automaticTypeDirectiveResolutions; let resolvedLibReferences; let resolvedLibProcessing; let resolvedModules; let resolvedModulesProcessing; let resolvedTypeReferenceDirectiveNames; let resolvedTypeReferenceDirectiveNamesProcessing; let packageMap; const maxNodeModuleJsDepth = typeof options.maxNodeModuleJsDepth === "number" ? options.maxNodeModuleJsDepth : 0; let currentNodeModulesDepth = 0; const modulesWithElidedImports = /* @__PURE__ */ new Map(); const sourceFilesFoundSearchingNodeModules = /* @__PURE__ */ new Map(); (_a = tracing) == null ? void 0 : _a.push( tracing.Phase.Program, "createProgram", { configFilePath: options.configFilePath, rootDir: options.rootDir }, /*separateBeginAndEnd*/ true ); mark("beforeProgram"); const host = createProgramOptionsHost || createCompilerHost(options); const configParsingHost = parseConfigHostFromCompilerHostLike(host); let skipDefaultLib = options.noLib; const getDefaultLibraryFileName = memoize(() => host.getDefaultLibFileName(options)); const defaultLibraryPath = host.getDefaultLibLocation ? host.getDefaultLibLocation() : getDirectoryPath(getDefaultLibraryFileName()); let skipVerifyCompilerOptions = false; const currentDirectory = host.getCurrentDirectory(); const supportedExtensions = getSupportedExtensions(options); const supportedExtensionsWithJsonIfResolveJsonModule = getSupportedExtensionsWithJsonIfResolveJsonModule(options, supportedExtensions); const hasEmitBlockingDiagnostics = /* @__PURE__ */ new Map(); let _compilerOptionsObjectLiteralSyntax; let _compilerOptionsPropertySyntax; let moduleResolutionCache; let actualResolveModuleNamesWorker; const hasInvalidatedResolutions = host.hasInvalidatedResolutions || returnFalse; if (host.resolveModuleNameLiterals) { actualResolveModuleNamesWorker = host.resolveModuleNameLiterals.bind(host); moduleResolutionCache = (_b = host.getModuleResolutionCache) == null ? void 0 : _b.call(host); } else if (host.resolveModuleNames) { actualResolveModuleNamesWorker = (moduleNames, containingFile, redirectedReference, options2, containingSourceFile, reusedNames) => host.resolveModuleNames( moduleNames.map(getModuleResolutionName), containingFile, reusedNames == null ? void 0 : reusedNames.map(getModuleResolutionName), redirectedReference, options2, containingSourceFile ).map( (resolved) => resolved ? resolved.extension !== void 0 ? { resolvedModule: resolved } : ( // An older host may have omitted extension, in which case we should infer it from the file extension of resolvedFileName. { resolvedModule: { ...resolved, extension: extensionFromPath(resolved.resolvedFileName) } } ) : emptyResolution ); moduleResolutionCache = (_c = host.getModuleResolutionCache) == null ? void 0 : _c.call(host); } else { moduleResolutionCache = createModuleResolutionCache(currentDirectory, getCanonicalFileName, options); actualResolveModuleNamesWorker = (moduleNames, containingFile, redirectedReference, options2, containingSourceFile) => loadWithModeAwareCache( moduleNames, containingFile, redirectedReference, options2, containingSourceFile, host, moduleResolutionCache, createModuleResolutionLoader ); } let actualResolveTypeReferenceDirectiveNamesWorker; if (host.resolveTypeReferenceDirectiveReferences) { actualResolveTypeReferenceDirectiveNamesWorker = host.resolveTypeReferenceDirectiveReferences.bind(host); } else if (host.resolveTypeReferenceDirectives) { actualResolveTypeReferenceDirectiveNamesWorker = (typeDirectiveNames, containingFile, redirectedReference, options2, containingSourceFile) => host.resolveTypeReferenceDirectives( typeDirectiveNames.map(getTypeReferenceResolutionName), containingFile, redirectedReference, options2, containingSourceFile == null ? void 0 : containingSourceFile.impliedNodeFormat ).map((resolvedTypeReferenceDirective) => ({ resolvedTypeReferenceDirective })); } else { const typeReferenceDirectiveResolutionCache = createTypeReferenceDirectiveResolutionCache( currentDirectory, getCanonicalFileName, /*options*/ void 0, moduleResolutionCache == null ? void 0 : moduleResolutionCache.getPackageJsonInfoCache(), moduleResolutionCache == null ? void 0 : moduleResolutionCache.optionsToRedirectsKey ); actualResolveTypeReferenceDirectiveNamesWorker = (typeDirectiveNames, containingFile, redirectedReference, options2, containingSourceFile) => loadWithModeAwareCache( typeDirectiveNames, containingFile, redirectedReference, options2, containingSourceFile, host, typeReferenceDirectiveResolutionCache, createTypeReferenceResolutionLoader ); } const hasInvalidatedLibResolutions = host.hasInvalidatedLibResolutions || returnFalse; let actualResolveLibrary; if (host.resolveLibrary) { actualResolveLibrary = host.resolveLibrary.bind(host); } else { const libraryResolutionCache = createModuleResolutionCache(currentDirectory, getCanonicalFileName, options, moduleResolutionCache == null ? void 0 : moduleResolutionCache.getPackageJsonInfoCache()); actualResolveLibrary = (libraryName, resolveFrom, options2) => resolveLibrary(libraryName, resolveFrom, options2, host, libraryResolutionCache); } const packageIdToSourceFile = /* @__PURE__ */ new Map(); let sourceFileToPackageName = /* @__PURE__ */ new Map(); let redirectTargetsMap = createMultiMap(); let usesUriStyleNodeCoreModules; const filesByName = /* @__PURE__ */ new Map(); let missingFileNames = /* @__PURE__ */ new Map(); const filesByNameIgnoreCase = host.useCaseSensitiveFileNames() ? /* @__PURE__ */ new Map() : void 0; let resolvedProjectReferences; let projectReferenceRedirects; let mapSourceFileToResolvedRef; let mapOutputFileToResolvedRef; const useSourceOfProjectReferenceRedirect = !!((_d = host.useSourceOfProjectReferenceRedirect) == null ? void 0 : _d.call(host)) && !options.disableSourceOfProjectReferenceRedirect; const { onProgramCreateComplete, fileExists, directoryExists } = updateHostForUseSourceOfProjectReferenceRedirect({ compilerHost: host, getSymlinkCache, useSourceOfProjectReferenceRedirect, toPath: toPath3, getResolvedProjectReferences, getRedirectFromOutput, forEachResolvedProjectReference: forEachResolvedProjectReference2 }); const readFile = host.readFile.bind(host); (_e = tracing) == null ? void 0 : _e.push(tracing.Phase.Program, "shouldProgramCreateNewSourceFiles", { hasOldProgram: !!oldProgram }); const shouldCreateNewSourceFile = shouldProgramCreateNewSourceFiles(oldProgram, options); (_f = tracing) == null ? void 0 : _f.pop(); let structureIsReused; (_g = tracing) == null ? void 0 : _g.push(tracing.Phase.Program, "tryReuseStructureFromOldProgram", {}); structureIsReused = tryReuseStructureFromOldProgram(); (_h = tracing) == null ? void 0 : _h.pop(); if (structureIsReused !== 2 /* Completely */) { processingDefaultLibFiles = []; processingOtherFiles = []; if (projectReferences) { if (!resolvedProjectReferences) { resolvedProjectReferences = projectReferences.map(parseProjectReferenceConfigFile); } if (rootNames.length) { resolvedProjectReferences == null ? void 0 : resolvedProjectReferences.forEach((parsedRef, index) => { if (!parsedRef) return; const out = parsedRef.commandLine.options.outFile; if (useSourceOfProjectReferenceRedirect) { if (out || getEmitModuleKind(parsedRef.commandLine.options) === 0 /* None */) { for (const fileName of parsedRef.commandLine.fileNames) { processProjectReferenceFile(fileName, { kind: 1 /* SourceFromProjectReference */, index }); } } } else { if (out) { processProjectReferenceFile(changeExtension(out, ".d.ts"), { kind: 2 /* OutputFromProjectReference */, index }); } else if (getEmitModuleKind(parsedRef.commandLine.options) === 0 /* None */) { const getCommonSourceDirectory3 = memoize(() => getCommonSourceDirectoryOfConfig(parsedRef.commandLine, !host.useCaseSensitiveFileNames())); for (const fileName of parsedRef.commandLine.fileNames) { if (!isDeclarationFileName(fileName) && !fileExtensionIs(fileName, ".json" /* Json */)) { processProjectReferenceFile(getOutputDeclarationFileName(fileName, parsedRef.commandLine, !host.useCaseSensitiveFileNames(), getCommonSourceDirectory3), { kind: 2 /* OutputFromProjectReference */, index }); } } } } }); } } (_i = tracing) == null ? void 0 : _i.push(tracing.Phase.Program, "processRootFiles", { count: rootNames.length }); forEach(rootNames, (name, index) => processRootFile( name, /*isDefaultLib*/ false, /*ignoreNoDefaultLib*/ false, { kind: 0 /* RootFile */, index } )); (_j = tracing) == null ? void 0 : _j.pop(); automaticTypeDirectiveNames ?? (automaticTypeDirectiveNames = rootNames.length ? getAutomaticTypeDirectiveNames(options, host) : emptyArray); automaticTypeDirectiveResolutions = createModeAwareCache(); if (automaticTypeDirectiveNames.length) { (_k = tracing) == null ? void 0 : _k.push(tracing.Phase.Program, "processTypeReferences", { count: automaticTypeDirectiveNames.length }); const containingDirectory = options.configFilePath ? getDirectoryPath(options.configFilePath) : currentDirectory; const containingFilename = combinePaths(containingDirectory, inferredTypesContainingFile); const resolutions = resolveTypeReferenceDirectiveNamesReusingOldState(automaticTypeDirectiveNames, containingFilename); for (let i = 0; i < automaticTypeDirectiveNames.length; i++) { automaticTypeDirectiveResolutions.set( automaticTypeDirectiveNames[i], /*mode*/ void 0, resolutions[i] ); processTypeReferenceDirective( automaticTypeDirectiveNames[i], /*mode*/ void 0, resolutions[i], { kind: 8 /* AutomaticTypeDirectiveFile */, typeReference: automaticTypeDirectiveNames[i], packageId: (_m = (_l = resolutions[i]) == null ? void 0 : _l.resolvedTypeReferenceDirective) == null ? void 0 : _m.packageId } ); } (_n = tracing) == null ? void 0 : _n.pop(); } if (rootNames.length && !skipDefaultLib) { const defaultLibraryFileName = getDefaultLibraryFileName(); if (!options.lib && defaultLibraryFileName) { processRootFile( defaultLibraryFileName, /*isDefaultLib*/ true, /*ignoreNoDefaultLib*/ false, { kind: 6 /* LibFile */ } ); } else { forEach(options.lib, (libFileName, index) => { processRootFile( pathForLibFile(libFileName), /*isDefaultLib*/ true, /*ignoreNoDefaultLib*/ false, { kind: 6 /* LibFile */, index } ); }); } } files = toSorted(processingDefaultLibFiles, compareDefaultLibFiles).concat(processingOtherFiles); processingDefaultLibFiles = void 0; processingOtherFiles = void 0; filesWithReferencesProcessed = void 0; } if (oldProgram && host.onReleaseOldSourceFile) { const oldSourceFiles = oldProgram.getSourceFiles(); for (const oldSourceFile of oldSourceFiles) { const newFile = getSourceFileByPath(oldSourceFile.resolvedPath); if (shouldCreateNewSourceFile || !newFile || newFile.impliedNodeFormat !== oldSourceFile.impliedNodeFormat || // old file wasn't redirect but new file is oldSourceFile.resolvedPath === oldSourceFile.path && newFile.resolvedPath !== oldSourceFile.path) { host.onReleaseOldSourceFile(oldSourceFile, oldProgram.getCompilerOptions(), !!getSourceFileByPath(oldSourceFile.path), newFile); } } if (!host.getParsedCommandLine) { oldProgram.forEachResolvedProjectReference((resolvedProjectReference) => { if (!getResolvedProjectReferenceByPath(resolvedProjectReference.sourceFile.path)) { host.onReleaseOldSourceFile( resolvedProjectReference.sourceFile, oldProgram.getCompilerOptions(), /*hasSourceFileByPath*/ false, /*newSourceFileByResolvedPath*/ void 0 ); } }); } } if (oldProgram && host.onReleaseParsedCommandLine) { forEachProjectReference( oldProgram.getProjectReferences(), oldProgram.getResolvedProjectReferences(), (oldResolvedRef, parent, index) => { const oldReference = (parent == null ? void 0 : parent.commandLine.projectReferences[index]) || oldProgram.getProjectReferences()[index]; const oldRefPath = resolveProjectReferencePath(oldReference); if (!(projectReferenceRedirects == null ? void 0 : projectReferenceRedirects.has(toPath3(oldRefPath)))) { host.onReleaseParsedCommandLine(oldRefPath, oldResolvedRef, oldProgram.getCompilerOptions()); } } ); } oldProgram = void 0; resolvedLibProcessing = void 0; resolvedModulesProcessing = void 0; resolvedTypeReferenceDirectiveNamesProcessing = void 0; const program = { getRootFileNames: () => rootNames, getSourceFile, getSourceFileByPath, getSourceFiles: () => files, getMissingFilePaths: () => missingFileNames, getModuleResolutionCache: () => moduleResolutionCache, getFilesByNameMap: () => filesByName, getCompilerOptions: () => options, getSyntacticDiagnostics, getOptionsDiagnostics, getGlobalDiagnostics, getSemanticDiagnostics, getCachedSemanticDiagnostics, getSuggestionDiagnostics, getDeclarationDiagnostics: getDeclarationDiagnostics2, getBindAndCheckDiagnostics, getProgramDiagnostics, getTypeChecker, getClassifiableNames, getCommonSourceDirectory: getCommonSourceDirectory2, emit, getCurrentDirectory: () => currentDirectory, getNodeCount: () => getTypeChecker().getNodeCount(), getIdentifierCount: () => getTypeChecker().getIdentifierCount(), getSymbolCount: () => getTypeChecker().getSymbolCount(), getTypeCount: () => getTypeChecker().getTypeCount(), getInstantiationCount: () => getTypeChecker().getInstantiationCount(), getRelationCacheSizes: () => getTypeChecker().getRelationCacheSizes(), getFileProcessingDiagnostics: () => programDiagnostics.getFileProcessingDiagnostics(), getAutomaticTypeDirectiveNames: () => automaticTypeDirectiveNames, getAutomaticTypeDirectiveResolutions: () => automaticTypeDirectiveResolutions, isSourceFileFromExternalLibrary, isSourceFileDefaultLibrary, getModeForUsageLocation: getModeForUsageLocation2, getEmitSyntaxForUsageLocation, getModeForResolutionAtIndex, getSourceFileFromReference, getLibFileFromReference, sourceFileToPackageName, redirectTargetsMap, usesUriStyleNodeCoreModules, resolvedModules, resolvedTypeReferenceDirectiveNames, resolvedLibReferences, getProgramDiagnosticsContainer: () => programDiagnostics, getResolvedModule, getResolvedModuleFromModuleSpecifier, getResolvedTypeReferenceDirective, getResolvedTypeReferenceDirectiveFromTypeReferenceDirective, forEachResolvedModule, forEachResolvedTypeReferenceDirective, getCurrentPackagesMap: () => packageMap, typesPackageExists, packageBundlesTypes, isEmittedFile, getConfigFileParsingDiagnostics: getConfigFileParsingDiagnostics2, getProjectReferences, getResolvedProjectReferences, getRedirectFromSourceFile, getResolvedProjectReferenceByPath, forEachResolvedProjectReference: forEachResolvedProjectReference2, isSourceOfProjectReferenceRedirect, getRedirectFromOutput, getCompilerOptionsForFile, getDefaultResolutionModeForFile: getDefaultResolutionModeForFile2, getEmitModuleFormatOfFile, getImpliedNodeFormatForEmit, shouldTransformImportCall, emitBuildInfo, fileExists, readFile, directoryExists, getSymlinkCache, realpath: (_o = host.realpath) == null ? void 0 : _o.bind(host), useCaseSensitiveFileNames: () => host.useCaseSensitiveFileNames(), getCanonicalFileName, getFileIncludeReasons: () => programDiagnostics.getFileReasons(), structureIsReused, writeFile: writeFile2, getGlobalTypingsCacheLocation: maybeBind(host, host.getGlobalTypingsCacheLocation) }; onProgramCreateComplete(); if (!skipVerifyCompilerOptions) { verifyCompilerOptions(); } mark("afterProgram"); measure("Program", "beforeProgram", "afterProgram"); (_p = tracing) == null ? void 0 : _p.pop(); return program; function getResolvedModule(file, moduleName, mode) { var _a2; return (_a2 = resolvedModules == null ? void 0 : resolvedModules.get(file.path)) == null ? void 0 : _a2.get(moduleName, mode); } function getResolvedModuleFromModuleSpecifier(moduleSpecifier, sourceFile) { sourceFile ?? (sourceFile = getSourceFileOfNode(moduleSpecifier)); Debug.assertIsDefined(sourceFile, "`moduleSpecifier` must have a `SourceFile` ancestor. Use `program.getResolvedModule` instead to provide the containing file and resolution mode."); return getResolvedModule(sourceFile, moduleSpecifier.text, getModeForUsageLocation2(sourceFile, moduleSpecifier)); } function getResolvedTypeReferenceDirective(file, typeDirectiveName, mode) { var _a2; return (_a2 = resolvedTypeReferenceDirectiveNames == null ? void 0 : resolvedTypeReferenceDirectiveNames.get(file.path)) == null ? void 0 : _a2.get(typeDirectiveName, mode); } function getResolvedTypeReferenceDirectiveFromTypeReferenceDirective(typeRef, sourceFile) { return getResolvedTypeReferenceDirective( sourceFile, typeRef.fileName, getModeForTypeReferenceDirectiveInFile(typeRef, sourceFile) ); } function forEachResolvedModule(callback, file) { forEachResolution(resolvedModules, callback, file); } function forEachResolvedTypeReferenceDirective(callback, file) { forEachResolution(resolvedTypeReferenceDirectiveNames, callback, file); } function forEachResolution(resolutionCache, callback, file) { var _a2; if (file) (_a2 = resolutionCache == null ? void 0 : resolutionCache.get(file.path)) == null ? void 0 : _a2.forEach((resolution, name, mode) => callback(resolution, name, mode, file.path)); else resolutionCache == null ? void 0 : resolutionCache.forEach((resolutions, filePath) => resolutions.forEach((resolution, name, mode) => callback(resolution, name, mode, filePath))); } function getPackagesMap() { if (packageMap) return packageMap; packageMap = /* @__PURE__ */ new Map(); forEachResolvedModule(({ resolvedModule }) => { if (resolvedModule == null ? void 0 : resolvedModule.packageId) packageMap.set(resolvedModule.packageId.name, resolvedModule.extension === ".d.ts" /* Dts */ || !!packageMap.get(resolvedModule.packageId.name)); }); return packageMap; } function typesPackageExists(packageName) { return getPackagesMap().has(getTypesPackageName(packageName)); } function packageBundlesTypes(packageName) { return !!getPackagesMap().get(packageName); } function addResolutionDiagnostics(resolution) { var _a2; if (!((_a2 = resolution.resolutionDiagnostics) == null ? void 0 : _a2.length)) return; programDiagnostics.addFileProcessingDiagnostic({ kind: 2 /* ResolutionDiagnostics */, diagnostics: resolution.resolutionDiagnostics }); } function addResolutionDiagnosticsFromResolutionOrCache(containingFile, name, resolution, mode) { if (host.resolveModuleNameLiterals || !host.resolveModuleNames) return addResolutionDiagnostics(resolution); if (!moduleResolutionCache || isExternalModuleNameRelative(name)) return; const containingFileName = getNormalizedAbsolutePath(containingFile.originalFileName, currentDirectory); const containingDir = getDirectoryPath(containingFileName); const redirectedReference = getRedirectReferenceForResolution(containingFile); const fromCache = moduleResolutionCache.getFromNonRelativeNameCache(name, mode, containingDir, redirectedReference); if (fromCache) addResolutionDiagnostics(fromCache); } function resolveModuleNamesWorker(moduleNames, containingFile, reusedNames) { var _a2, _b2; const containingFileName = getNormalizedAbsolutePath(containingFile.originalFileName, currentDirectory); const redirectedReference = getRedirectReferenceForResolution(containingFile); (_a2 = tracing) == null ? void 0 : _a2.push(tracing.Phase.Program, "resolveModuleNamesWorker", { containingFileName }); mark("beforeResolveModule"); const result = actualResolveModuleNamesWorker( moduleNames, containingFileName, redirectedReference, options, containingFile, reusedNames ); mark("afterResolveModule"); measure("ResolveModule", "beforeResolveModule", "afterResolveModule"); (_b2 = tracing) == null ? void 0 : _b2.pop(); return result; } function resolveTypeReferenceDirectiveNamesWorker(typeDirectiveNames, containingFile, reusedNames) { var _a2, _b2; const containingSourceFile = !isString(containingFile) ? containingFile : void 0; const containingFileName = !isString(containingFile) ? getNormalizedAbsolutePath(containingFile.originalFileName, currentDirectory) : containingFile; const redirectedReference = containingSourceFile && getRedirectReferenceForResolution(containingSourceFile); (_a2 = tracing) == null ? void 0 : _a2.push(tracing.Phase.Program, "resolveTypeReferenceDirectiveNamesWorker", { containingFileName }); mark("beforeResolveTypeReference"); const result = actualResolveTypeReferenceDirectiveNamesWorker( typeDirectiveNames, containingFileName, redirectedReference, options, containingSourceFile, reusedNames ); mark("afterResolveTypeReference"); measure("ResolveTypeReference", "beforeResolveTypeReference", "afterResolveTypeReference"); (_b2 = tracing) == null ? void 0 : _b2.pop(); return result; } function getRedirectReferenceForResolution(file) { var _a2, _b2; const redirect = getRedirectFromSourceFile(file.originalFileName); if (redirect || !isDeclarationFileName(file.originalFileName)) return redirect == null ? void 0 : redirect.resolvedRef; const resultFromDts = (_a2 = getRedirectFromOutput(file.path)) == null ? void 0 : _a2.resolvedRef; if (resultFromDts) return resultFromDts; if (!host.realpath || !options.preserveSymlinks || !file.originalFileName.includes(nodeModulesPathPart)) return void 0; const realDeclarationPath = toPath3(host.realpath(file.originalFileName)); return realDeclarationPath === file.path ? void 0 : (_b2 = getRedirectFromOutput(realDeclarationPath)) == null ? void 0 : _b2.resolvedRef; } function compareDefaultLibFiles(a, b) { return compareValues(getDefaultLibFilePriority(a), getDefaultLibFilePriority(b)); } function getDefaultLibFilePriority(a) { if (containsPath( defaultLibraryPath, a.fileName, /*ignoreCase*/ false )) { const basename = getBaseFileName(a.fileName); if (basename === "lib.d.ts" || basename === "lib.es6.d.ts") return 0; const name = removeSuffix(removePrefix(basename, "lib."), ".d.ts"); const index = libs.indexOf(name); if (index !== -1) return index + 1; } return libs.length + 2; } function toPath3(fileName) { return toPath(fileName, currentDirectory, getCanonicalFileName); } function getCommonSourceDirectory2() { let commonSourceDirectory = programDiagnostics.getCommonSourceDirectory(); if (commonSourceDirectory !== void 0) { return commonSourceDirectory; } const emittedFiles = filter(files, (file) => sourceFileMayBeEmitted(file, program)); commonSourceDirectory = getCommonSourceDirectory( options, () => mapDefined(emittedFiles, (file) => file.isDeclarationFile ? void 0 : file.fileName), currentDirectory, getCanonicalFileName, (commonSourceDirectory2) => checkSourceFilesBelongToPath(emittedFiles, commonSourceDirectory2) ); programDiagnostics.setCommonSourceDirectory(commonSourceDirectory); return commonSourceDirectory; } function getClassifiableNames() { var _a2; if (!classifiableNames) { getTypeChecker(); classifiableNames = /* @__PURE__ */ new Set(); for (const sourceFile of files) { (_a2 = sourceFile.classifiableNames) == null ? void 0 : _a2.forEach((value) => classifiableNames.add(value)); } } return classifiableNames; } function resolveModuleNamesReusingOldState(moduleNames, containingFile) { return resolveNamesReusingOldState({ entries: moduleNames, containingFile, containingSourceFile: containingFile, redirectedReference: getRedirectReferenceForResolution(containingFile), nameAndModeGetter: moduleResolutionNameAndModeGetter, resolutionWorker: resolveModuleNamesWorker, getResolutionFromOldProgram: (name, mode) => oldProgram == null ? void 0 : oldProgram.getResolvedModule(containingFile, name, mode), getResolved: getResolvedModuleFromResolution, canReuseResolutionsInFile: () => containingFile === (oldProgram == null ? void 0 : oldProgram.getSourceFile(containingFile.fileName)) && !hasInvalidatedResolutions(containingFile.path), resolveToOwnAmbientModule: true }); } function resolveTypeReferenceDirectiveNamesReusingOldState(typeDirectiveNames, containingFile) { const containingSourceFile = !isString(containingFile) ? containingFile : void 0; return resolveNamesReusingOldState({ entries: typeDirectiveNames, containingFile, containingSourceFile, redirectedReference: containingSourceFile && getRedirectReferenceForResolution(containingSourceFile), nameAndModeGetter: typeReferenceResolutionNameAndModeGetter, resolutionWorker: resolveTypeReferenceDirectiveNamesWorker, getResolutionFromOldProgram: (name, mode) => { var _a2; return containingSourceFile ? oldProgram == null ? void 0 : oldProgram.getResolvedTypeReferenceDirective(containingSourceFile, name, mode) : (_a2 = oldProgram == null ? void 0 : oldProgram.getAutomaticTypeDirectiveResolutions()) == null ? void 0 : _a2.get(name, mode); }, getResolved: getResolvedTypeReferenceDirectiveFromResolution, canReuseResolutionsInFile: () => containingSourceFile ? containingSourceFile === (oldProgram == null ? void 0 : oldProgram.getSourceFile(containingSourceFile.fileName)) && !hasInvalidatedResolutions(containingSourceFile.path) : !hasInvalidatedResolutions(toPath3(containingFile)) }); } function resolveNamesReusingOldState({ entries, containingFile, containingSourceFile, redirectedReference, nameAndModeGetter, resolutionWorker, getResolutionFromOldProgram, getResolved, canReuseResolutionsInFile, resolveToOwnAmbientModule }) { if (!entries.length) return emptyArray; if (structureIsReused === 0 /* Not */ && (!resolveToOwnAmbientModule || !containingSourceFile.ambientModuleNames.length)) { return resolutionWorker( entries, containingFile, /*reusedNames*/ void 0 ); } let unknownEntries; let unknownEntryIndices; let result; let reusedNames; const reuseResolutions = canReuseResolutionsInFile(); for (let i = 0; i < entries.length; i++) { const entry = entries[i]; if (reuseResolutions) { const name = nameAndModeGetter.getName(entry); const mode = nameAndModeGetter.getMode(entry, containingSourceFile, (redirectedReference == null ? void 0 : redirectedReference.commandLine.options) ?? options); const oldResolution = getResolutionFromOldProgram(name, mode); const oldResolved = oldResolution && getResolved(oldResolution); if (oldResolved) { if (isTraceEnabled(options, host)) { trace( host, resolutionWorker === resolveModuleNamesWorker ? oldResolved.packageId ? Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2_with_Package_ID_3 : Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2 : oldResolved.packageId ? Diagnostics.Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_successfully_resolved_to_2_with_Package_ID_3 : Diagnostics.Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_successfully_resolved_to_2, name, containingSourceFile ? getNormalizedAbsolutePath(containingSourceFile.originalFileName, currentDirectory) : containingFile, oldResolved.resolvedFileName, oldResolved.packageId && packageIdToString(oldResolved.packageId) ); } (result ?? (result = new Array(entries.length)))[i] = oldResolution; (reusedNames ?? (reusedNames = [])).push(entry); continue; } } if (resolveToOwnAmbientModule) { const name = nameAndModeGetter.getName(entry); if (contains(containingSourceFile.ambientModuleNames, name)) { if (isTraceEnabled(options, host)) { trace( host, Diagnostics.Module_0_was_resolved_as_locally_declared_ambient_module_in_file_1, name, getNormalizedAbsolutePath(containingSourceFile.originalFileName, currentDirectory) ); } (result ?? (result = new Array(entries.length)))[i] = emptyResolution; continue; } } (unknownEntries ?? (unknownEntries = [])).push(entry); (unknownEntryIndices ?? (unknownEntryIndices = [])).push(i); } if (!unknownEntries) return result; const resolutions = resolutionWorker(unknownEntries, containingFile, reusedNames); if (!result) return resolutions; resolutions.forEach((resolution, index) => result[unknownEntryIndices[index]] = resolution); return result; } function canReuseProjectReferences() { return !forEachProjectReference( oldProgram.getProjectReferences(), oldProgram.getResolvedProjectReferences(), (oldResolvedRef, parent, index) => { const newRef = (parent ? parent.commandLine.projectReferences : projectReferences)[index]; const newResolvedRef = parseProjectReferenceConfigFile(newRef); if (oldResolvedRef) { return !newResolvedRef || newResolvedRef.sourceFile !== oldResolvedRef.sourceFile || !arrayIsEqualTo(oldResolvedRef.commandLine.fileNames, newResolvedRef.commandLine.fileNames); } else { return newResolvedRef !== void 0; } }, (oldProjectReferences, parent) => { const newReferences = parent ? getResolvedProjectReferenceByPath(parent.sourceFile.path).commandLine.projectReferences : projectReferences; return !arrayIsEqualTo(oldProjectReferences, newReferences, projectReferenceIsEqualTo); } ); } function tryReuseStructureFromOldProgram() { var _a2; if (!oldProgram) { return 0 /* Not */; } const oldOptions = oldProgram.getCompilerOptions(); if (changesAffectModuleResolution(oldOptions, options)) { return 0 /* Not */; } const oldRootNames = oldProgram.getRootFileNames(); if (!arrayIsEqualTo(oldRootNames, rootNames)) { return 0 /* Not */; } if (!canReuseProjectReferences()) { return 0 /* Not */; } if (projectReferences) { resolvedProjectReferences = projectReferences.map(parseProjectReferenceConfigFile); } const newSourceFiles = []; const modifiedSourceFiles = []; structureIsReused = 2 /* Completely */; if (forEachEntry(oldProgram.getMissingFilePaths(), (missingFileName) => host.fileExists(missingFileName))) { return 0 /* Not */; } const oldSourceFiles = oldProgram.getSourceFiles(); let SeenPackageName; ((SeenPackageName2) => { SeenPackageName2[SeenPackageName2["Exists"] = 0] = "Exists"; SeenPackageName2[SeenPackageName2["Modified"] = 1] = "Modified"; })(SeenPackageName || (SeenPackageName = {})); const seenPackageNames = /* @__PURE__ */ new Map(); for (const oldSourceFile of oldSourceFiles) { const sourceFileOptions = getCreateSourceFileOptions(oldSourceFile.fileName, moduleResolutionCache, host, options); let newSourceFile = host.getSourceFileByPath ? host.getSourceFileByPath( oldSourceFile.fileName, oldSourceFile.resolvedPath, sourceFileOptions, /*onError*/ void 0, shouldCreateNewSourceFile ) : host.getSourceFile( oldSourceFile.fileName, sourceFileOptions, /*onError*/ void 0, shouldCreateNewSourceFile ); if (!newSourceFile) { return 0 /* Not */; } newSourceFile.packageJsonLocations = ((_a2 = sourceFileOptions.packageJsonLocations) == null ? void 0 : _a2.length) ? sourceFileOptions.packageJsonLocations : void 0; newSourceFile.packageJsonScope = sourceFileOptions.packageJsonScope; Debug.assert(!newSourceFile.redirectInfo, "Host should not return a redirect source file from `getSourceFile`"); let fileChanged; if (oldSourceFile.redirectInfo) { if (newSourceFile !== oldSourceFile.redirectInfo.unredirected) { return 0 /* Not */; } fileChanged = false; newSourceFile = oldSourceFile; } else if (oldProgram.redirectTargetsMap.has(oldSourceFile.path)) { if (newSourceFile !== oldSourceFile) { return 0 /* Not */; } fileChanged = false; } else { fileChanged = newSourceFile !== oldSourceFile; } newSourceFile.path = oldSourceFile.path; newSourceFile.originalFileName = oldSourceFile.originalFileName; newSourceFile.resolvedPath = oldSourceFile.resolvedPath; newSourceFile.fileName = oldSourceFile.fileName; const packageName = oldProgram.sourceFileToPackageName.get(oldSourceFile.path); if (packageName !== void 0) { const prevKind = seenPackageNames.get(packageName); const newKind = fileChanged ? 1 /* Modified */ : 0 /* Exists */; if (prevKind !== void 0 && newKind === 1 /* Modified */ || prevKind === 1 /* Modified */) { return 0 /* Not */; } seenPackageNames.set(packageName, newKind); } if (fileChanged) { if (oldSourceFile.impliedNodeFormat !== newSourceFile.impliedNodeFormat) { structureIsReused = 1 /* SafeModules */; } else if (!arrayIsEqualTo(oldSourceFile.libReferenceDirectives, newSourceFile.libReferenceDirectives, fileReferenceIsEqualTo)) { structureIsReused = 1 /* SafeModules */; } else if (oldSourceFile.hasNoDefaultLib !== newSourceFile.hasNoDefaultLib) { structureIsReused = 1 /* SafeModules */; } else if (!arrayIsEqualTo(oldSourceFile.referencedFiles, newSourceFile.referencedFiles, fileReferenceIsEqualTo)) { structureIsReused = 1 /* SafeModules */; } else { collectExternalModuleReferences(newSourceFile); if (!arrayIsEqualTo(oldSourceFile.imports, newSourceFile.imports, moduleNameIsEqualTo)) { structureIsReused = 1 /* SafeModules */; } else if (!arrayIsEqualTo(oldSourceFile.moduleAugmentations, newSourceFile.moduleAugmentations, moduleNameIsEqualTo)) { structureIsReused = 1 /* SafeModules */; } else if ((oldSourceFile.flags & 12582912 /* PermanentlySetIncrementalFlags */) !== (newSourceFile.flags & 12582912 /* PermanentlySetIncrementalFlags */)) { structureIsReused = 1 /* SafeModules */; } else if (!arrayIsEqualTo(oldSourceFile.typeReferenceDirectives, newSourceFile.typeReferenceDirectives, fileReferenceIsEqualTo)) { structureIsReused = 1 /* SafeModules */; } } modifiedSourceFiles.push(newSourceFile); } else if (hasInvalidatedResolutions(oldSourceFile.path)) { structureIsReused = 1 /* SafeModules */; modifiedSourceFiles.push(newSourceFile); } newSourceFiles.push(newSourceFile); } if (structureIsReused !== 2 /* Completely */) { return structureIsReused; } for (const newSourceFile of modifiedSourceFiles) { const moduleNames = getModuleNames(newSourceFile); const resolutions = resolveModuleNamesReusingOldState(moduleNames, newSourceFile); (resolvedModulesProcessing ?? (resolvedModulesProcessing = /* @__PURE__ */ new Map())).set(newSourceFile.path, resolutions); const optionsForFile = getCompilerOptionsForFile(newSourceFile); const resolutionsChanged = hasChangesInResolutions( moduleNames, resolutions, (name) => oldProgram.getResolvedModule(newSourceFile, name.text, getModeForUsageLocationWorker(newSourceFile, name, optionsForFile)), moduleResolutionIsEqualTo ); if (resolutionsChanged) structureIsReused = 1 /* SafeModules */; const typesReferenceDirectives = newSourceFile.typeReferenceDirectives; const typeReferenceResolutions = resolveTypeReferenceDirectiveNamesReusingOldState(typesReferenceDirectives, newSourceFile); (resolvedTypeReferenceDirectiveNamesProcessing ?? (resolvedTypeReferenceDirectiveNamesProcessing = /* @__PURE__ */ new Map())).set(newSourceFile.path, typeReferenceResolutions); const typeReferenceResolutionsChanged = hasChangesInResolutions( typesReferenceDirectives, typeReferenceResolutions, (name) => oldProgram.getResolvedTypeReferenceDirective( newSourceFile, getTypeReferenceResolutionName(name), getModeForTypeReferenceDirectiveInFile(name, newSourceFile) ), typeDirectiveIsEqualTo ); if (typeReferenceResolutionsChanged) structureIsReused = 1 /* SafeModules */; } if (structureIsReused !== 2 /* Completely */) { return structureIsReused; } if (changesAffectingProgramStructure(oldOptions, options)) { return 1 /* SafeModules */; } if (oldProgram.resolvedLibReferences && forEachEntry(oldProgram.resolvedLibReferences, (resolution, libFileName) => pathForLibFileWorker(libFileName).actual !== resolution.actual)) { return 1 /* SafeModules */; } if (host.hasChangedAutomaticTypeDirectiveNames) { if (host.hasChangedAutomaticTypeDirectiveNames()) return 1 /* SafeModules */; } else { automaticTypeDirectiveNames = getAutomaticTypeDirectiveNames(options, host); if (!arrayIsEqualTo(oldProgram.getAutomaticTypeDirectiveNames(), automaticTypeDirectiveNames)) return 1 /* SafeModules */; } missingFileNames = oldProgram.getMissingFilePaths(); Debug.assert(newSourceFiles.length === oldProgram.getSourceFiles().length); for (const newSourceFile of newSourceFiles) { filesByName.set(newSourceFile.path, newSourceFile); } const oldFilesByNameMap = oldProgram.getFilesByNameMap(); oldFilesByNameMap.forEach((oldFile, path) => { if (!oldFile) { filesByName.set(path, oldFile); return; } if (oldFile.path === path) { if (oldProgram.isSourceFileFromExternalLibrary(oldFile)) { sourceFilesFoundSearchingNodeModules.set(oldFile.path, true); } return; } filesByName.set(path, filesByName.get(oldFile.path)); }); const isConfigIdentical = oldOptions.configFile && oldOptions.configFile === options.configFile || !oldOptions.configFile && !options.configFile && !optionsHaveChanges(oldOptions, options, optionDeclarations); programDiagnostics.reuseStateFromOldProgram(oldProgram.getProgramDiagnosticsContainer(), isConfigIdentical); skipVerifyCompilerOptions = isConfigIdentical; files = newSourceFiles; automaticTypeDirectiveNames = oldProgram.getAutomaticTypeDirectiveNames(); automaticTypeDirectiveResolutions = oldProgram.getAutomaticTypeDirectiveResolutions(); sourceFileToPackageName = oldProgram.sourceFileToPackageName; redirectTargetsMap = oldProgram.redirectTargetsMap; usesUriStyleNodeCoreModules = oldProgram.usesUriStyleNodeCoreModules; resolvedModules = oldProgram.resolvedModules; resolvedTypeReferenceDirectiveNames = oldProgram.resolvedTypeReferenceDirectiveNames; resolvedLibReferences = oldProgram.resolvedLibReferences; packageMap = oldProgram.getCurrentPackagesMap(); return 2 /* Completely */; } function getEmitHost(writeFileCallback) { return { getCanonicalFileName, getCommonSourceDirectory: program.getCommonSourceDirectory, getCompilerOptions: program.getCompilerOptions, getCurrentDirectory: () => currentDirectory, getSourceFile: program.getSourceFile, getSourceFileByPath: program.getSourceFileByPath, getSourceFiles: program.getSourceFiles, isSourceFileFromExternalLibrary, getRedirectFromSourceFile, isSourceOfProjectReferenceRedirect, getSymlinkCache, writeFile: writeFileCallback || writeFile2, isEmitBlocked, shouldTransformImportCall, getEmitModuleFormatOfFile, getDefaultResolutionModeForFile: getDefaultResolutionModeForFile2, getModeForResolutionAtIndex, readFile: (f) => host.readFile(f), fileExists: (f) => { const path = toPath3(f); if (getSourceFileByPath(path)) return true; if (missingFileNames.has(path)) return false; return host.fileExists(f); }, realpath: maybeBind(host, host.realpath), useCaseSensitiveFileNames: () => host.useCaseSensitiveFileNames(), getBuildInfo: () => { var _a2; return (_a2 = program.getBuildInfo) == null ? void 0 : _a2.call(program); }, getSourceFileFromReference: (file, ref) => program.getSourceFileFromReference(file, ref), redirectTargetsMap, getFileIncludeReasons: program.getFileIncludeReasons, createHash: maybeBind(host, host.createHash), getModuleResolutionCache: () => program.getModuleResolutionCache(), trace: maybeBind(host, host.trace), getGlobalTypingsCacheLocation: program.getGlobalTypingsCacheLocation }; } function writeFile2(fileName, text, writeByteOrderMark, onError, sourceFiles, data) { host.writeFile(fileName, text, writeByteOrderMark, onError, sourceFiles, data); } function emitBuildInfo(writeFileCallback) { var _a2, _b2; (_a2 = tracing) == null ? void 0 : _a2.push( tracing.Phase.Emit, "emitBuildInfo", {}, /*separateBeginAndEnd*/ true ); mark("beforeEmit"); const emitResult = emitFiles( notImplementedResolver, getEmitHost(writeFileCallback), /*targetSourceFile*/ void 0, /*transformers*/ noTransformers, /*emitOnly*/ false, /*onlyBuildInfo*/ true ); mark("afterEmit"); measure("Emit", "beforeEmit", "afterEmit"); (_b2 = tracing) == null ? void 0 : _b2.pop(); return emitResult; } function getResolvedProjectReferences() { return resolvedProjectReferences; } function getProjectReferences() { return projectReferences; } function isSourceFileFromExternalLibrary(file) { return !!sourceFilesFoundSearchingNodeModules.get(file.path); } function isSourceFileDefaultLibrary(file) { if (!file.isDeclarationFile) { return false; } if (file.hasNoDefaultLib) { return true; } if (options.noLib) { return false; } const equalityComparer = host.useCaseSensitiveFileNames() ? equateStringsCaseSensitive : equateStringsCaseInsensitive; if (!options.lib) { return equalityComparer(file.fileName, getDefaultLibraryFileName()); } else { return some(options.lib, (libFileName) => { const resolvedLib = resolvedLibReferences.get(libFileName); return !!resolvedLib && equalityComparer(file.fileName, resolvedLib.actual); }); } } function getTypeChecker() { return typeChecker || (typeChecker = createTypeChecker(program)); } function emit(sourceFile, writeFileCallback, cancellationToken, emitOnly, transformers, forceDtsEmit, skipBuildInfo) { var _a2, _b2; (_a2 = tracing) == null ? void 0 : _a2.push( tracing.Phase.Emit, "emit", { path: sourceFile == null ? void 0 : sourceFile.path }, /*separateBeginAndEnd*/ true ); const result = runWithCancellationToken( () => emitWorker( program, sourceFile, writeFileCallback, cancellationToken, emitOnly, transformers, forceDtsEmit, skipBuildInfo ) ); (_b2 = tracing) == null ? void 0 : _b2.pop(); return result; } function isEmitBlocked(emitFileName) { return hasEmitBlockingDiagnostics.has(toPath3(emitFileName)); } function emitWorker(program2, sourceFile, writeFileCallback, cancellationToken, emitOnly, customTransformers, forceDtsEmit, skipBuildInfo) { if (!forceDtsEmit) { const result = handleNoEmitOptions(program2, sourceFile, writeFileCallback, cancellationToken); if (result) return result; } const typeChecker2 = getTypeChecker(); const emitResolver = typeChecker2.getEmitResolver( options.outFile ? void 0 : sourceFile, cancellationToken, emitResolverSkipsTypeChecking(emitOnly, forceDtsEmit) ); mark("beforeEmit"); const emitResult = typeChecker2.runWithCancellationToken( cancellationToken, () => emitFiles( emitResolver, getEmitHost(writeFileCallback), sourceFile, getTransformers(options, customTransformers, emitOnly), emitOnly, /*onlyBuildInfo*/ false, forceDtsEmit, skipBuildInfo ) ); mark("afterEmit"); measure("Emit", "beforeEmit", "afterEmit"); return emitResult; } function getSourceFile(fileName) { return getSourceFileByPath(toPath3(fileName)); } function getSourceFileByPath(path) { return filesByName.get(path) || void 0; } function getDiagnosticsHelper(sourceFile, getDiagnostics, cancellationToken) { if (sourceFile) { return sortAndDeduplicateDiagnostics(getDiagnostics(sourceFile, cancellationToken)); } return sortAndDeduplicateDiagnostics(flatMap(program.getSourceFiles(), (sourceFile2) => { if (cancellationToken) { cancellationToken.throwIfCancellationRequested(); } return getDiagnostics(sourceFile2, cancellationToken); })); } function getSyntacticDiagnostics(sourceFile, cancellationToken) { return getDiagnosticsHelper(sourceFile, getSyntacticDiagnosticsForFile, cancellationToken); } function getSemanticDiagnostics(sourceFile, cancellationToken, nodesToCheck) { return getDiagnosticsHelper( sourceFile, (sourceFile2, cancellationToken2) => getSemanticDiagnosticsForFile(sourceFile2, cancellationToken2, nodesToCheck), cancellationToken ); } function getCachedSemanticDiagnostics(sourceFile) { return cachedBindAndCheckDiagnosticsForFile == null ? void 0 : cachedBindAndCheckDiagnosticsForFile.get(sourceFile.path); } function getBindAndCheckDiagnostics(sourceFile, cancellationToken) { return getBindAndCheckDiagnosticsForFile( sourceFile, cancellationToken, /*nodesToCheck*/ void 0 ); } function getProgramDiagnostics(sourceFile) { var _a2; if (skipTypeChecking(sourceFile, options, program)) { return emptyArray; } const programDiagnosticsInFile = programDiagnostics.getCombinedDiagnostics(program).getDiagnostics(sourceFile.fileName); if (!((_a2 = sourceFile.commentDirectives) == null ? void 0 : _a2.length)) { return programDiagnosticsInFile; } return getDiagnosticsWithPrecedingDirectives(sourceFile, sourceFile.commentDirectives, programDiagnosticsInFile).diagnostics; } function getDeclarationDiagnostics2(sourceFile, cancellationToken) { return getDiagnosticsHelper(sourceFile, getDeclarationDiagnosticsForFile, cancellationToken); } function getSyntacticDiagnosticsForFile(sourceFile) { if (isSourceFileJS(sourceFile)) { if (!sourceFile.additionalSyntacticDiagnostics) { sourceFile.additionalSyntacticDiagnostics = getJSSyntacticDiagnosticsForFile(sourceFile); } return concatenate(sourceFile.additionalSyntacticDiagnostics, sourceFile.parseDiagnostics); } return sourceFile.parseDiagnostics; } function runWithCancellationToken(func) { try { return func(); } catch (e) { if (e instanceof OperationCanceledException) { typeChecker = void 0; } throw e; } } function getSemanticDiagnosticsForFile(sourceFile, cancellationToken, nodesToCheck) { return concatenate( filterSemanticDiagnostics(getBindAndCheckDiagnosticsForFile(sourceFile, cancellationToken, nodesToCheck), options), getProgramDiagnostics(sourceFile) ); } function getBindAndCheckDiagnosticsForFile(sourceFile, cancellationToken, nodesToCheck) { if (nodesToCheck) { return getBindAndCheckDiagnosticsForFileNoCache(sourceFile, cancellationToken, nodesToCheck); } let result = cachedBindAndCheckDiagnosticsForFile == null ? void 0 : cachedBindAndCheckDiagnosticsForFile.get(sourceFile.path); if (!result) { (cachedBindAndCheckDiagnosticsForFile ?? (cachedBindAndCheckDiagnosticsForFile = /* @__PURE__ */ new Map())).set( sourceFile.path, result = getBindAndCheckDiagnosticsForFileNoCache(sourceFile, cancellationToken) ); } return result; } function getBindAndCheckDiagnosticsForFileNoCache(sourceFile, cancellationToken, nodesToCheck) { return runWithCancellationToken(() => { if (skipTypeChecking(sourceFile, options, program)) { return emptyArray; } const typeChecker2 = getTypeChecker(); Debug.assert(!!sourceFile.bindDiagnostics); const isJs = sourceFile.scriptKind === 1 /* JS */ || sourceFile.scriptKind === 2 /* JSX */; const isPlainJs = isPlainJsFile(sourceFile, options.checkJs); const isCheckJs = isJs && isCheckJsEnabledForFile(sourceFile, options); let bindDiagnostics = sourceFile.bindDiagnostics; let checkDiagnostics = typeChecker2.getDiagnostics(sourceFile, cancellationToken, nodesToCheck); if (isPlainJs) { bindDiagnostics = filter(bindDiagnostics, (d) => plainJSErrors.has(d.code)); checkDiagnostics = filter(checkDiagnostics, (d) => plainJSErrors.has(d.code)); } return getMergedBindAndCheckDiagnostics( sourceFile, !isPlainJs, !!nodesToCheck, bindDiagnostics, checkDiagnostics, isCheckJs ? sourceFile.jsDocDiagnostics : void 0 ); }); } function getMergedBindAndCheckDiagnostics(sourceFile, includeBindAndCheckDiagnostics, partialCheck, ...allDiagnostics) { var _a2; const flatDiagnostics = flatten(allDiagnostics); if (!includeBindAndCheckDiagnostics || !((_a2 = sourceFile.commentDirectives) == null ? void 0 : _a2.length)) { return flatDiagnostics; } const { diagnostics, directives } = getDiagnosticsWithPrecedingDirectives(sourceFile, sourceFile.commentDirectives, flatDiagnostics); if (partialCheck) { return diagnostics; } for (const errorExpectation of directives.getUnusedExpectations()) { diagnostics.push(createDiagnosticForRange(sourceFile, errorExpectation.range, Diagnostics.Unused_ts_expect_error_directive)); } return diagnostics; } function getDiagnosticsWithPrecedingDirectives(sourceFile, commentDirectives, flatDiagnostics) { const directives = createCommentDirectivesMap(sourceFile, commentDirectives); const diagnostics = flatDiagnostics.filter((diagnostic) => markPrecedingCommentDirectiveLine(diagnostic, directives) === -1); return { diagnostics, directives }; } function getSuggestionDiagnostics(sourceFile, cancellationToken) { return runWithCancellationToken(() => { return getTypeChecker().getSuggestionDiagnostics(sourceFile, cancellationToken); }); } function markPrecedingCommentDirectiveLine(diagnostic, directives) { const { file, start } = diagnostic; if (!file) { return -1; } const lineStarts = getLineStarts(file); let line = computeLineAndCharacterOfPosition(lineStarts, start).line - 1; while (line >= 0) { if (directives.markUsed(line)) { return line; } const lineText = file.text.slice(lineStarts[line], lineStarts[line + 1]).trim(); if (lineText !== "" && !/^\s*\/\/.*$/.test(lineText)) { return -1; } line--; } return -1; } function getJSSyntacticDiagnosticsForFile(sourceFile) { return runWithCancellationToken(() => { const diagnostics = []; walk(sourceFile, sourceFile); forEachChildRecursively(sourceFile, walk, walkArray); return diagnostics; function walk(node, parent) { switch (parent.kind) { case 170 /* Parameter */: case 173 /* PropertyDeclaration */: case 175 /* MethodDeclaration */: if (parent.questionToken === node) { diagnostics.push(createDiagnosticForNode2(node, Diagnostics.The_0_modifier_can_only_be_used_in_TypeScript_files, "?")); return "skip"; } // falls through case 174 /* MethodSignature */: case 177 /* Constructor */: case 178 /* GetAccessor */: case 179 /* SetAccessor */: case 219 /* FunctionExpression */: case 263 /* FunctionDeclaration */: case 220 /* ArrowFunction */: case 261 /* VariableDeclaration */: if (parent.type === node) { diagnostics.push(createDiagnosticForNode2(node, Diagnostics.Type_annotations_can_only_be_used_in_TypeScript_files)); return "skip"; } } switch (node.kind) { case 274 /* ImportClause */: if (node.isTypeOnly) { diagnostics.push(createDiagnosticForNode2(parent, Diagnostics._0_declarations_can_only_be_used_in_TypeScript_files, "import type")); return "skip"; } break; case 279 /* ExportDeclaration */: if (node.isTypeOnly) { diagnostics.push(createDiagnosticForNode2(node, Diagnostics._0_declarations_can_only_be_used_in_TypeScript_files, "export type")); return "skip"; } break; case 277 /* ImportSpecifier */: case 282 /* ExportSpecifier */: if (node.isTypeOnly) { diagnostics.push(createDiagnosticForNode2(node, Diagnostics._0_declarations_can_only_be_used_in_TypeScript_files, isImportSpecifier(node) ? "import...type" : "export...type")); return "skip"; } break; case 272 /* ImportEqualsDeclaration */: diagnostics.push(createDiagnosticForNode2(node, Diagnostics.import_can_only_be_used_in_TypeScript_files)); return "skip"; case 278 /* ExportAssignment */: if (node.isExportEquals) { diagnostics.push(createDiagnosticForNode2(node, Diagnostics.export_can_only_be_used_in_TypeScript_files)); return "skip"; } break; case 299 /* HeritageClause */: const heritageClause = node; if (heritageClause.token === 119 /* ImplementsKeyword */) { diagnostics.push(createDiagnosticForNode2(node, Diagnostics.implements_clauses_can_only_be_used_in_TypeScript_files)); return "skip"; } break; case 265 /* InterfaceDeclaration */: const interfaceKeyword = tokenToString(120 /* InterfaceKeyword */); Debug.assertIsDefined(interfaceKeyword); diagnostics.push(createDiagnosticForNode2(node, Diagnostics._0_declarations_can_only_be_used_in_TypeScript_files, interfaceKeyword)); return "skip"; case 268 /* ModuleDeclaration */: const moduleKeyword = node.flags & 32 /* Namespace */ ? tokenToString(145 /* NamespaceKeyword */) : tokenToString(144 /* ModuleKeyword */); Debug.assertIsDefined(moduleKeyword); diagnostics.push(createDiagnosticForNode2(node, Diagnostics._0_declarations_can_only_be_used_in_TypeScript_files, moduleKeyword)); return "skip"; case 266 /* TypeAliasDeclaration */: diagnostics.push(createDiagnosticForNode2(node, Diagnostics.Type_aliases_can_only_be_used_in_TypeScript_files)); return "skip"; case 177 /* Constructor */: case 175 /* MethodDeclaration */: case 263 /* FunctionDeclaration */: if (!node.body) { diagnostics.push(createDiagnosticForNode2(node, Diagnostics.Signature_declarations_can_only_be_used_in_TypeScript_files)); return "skip"; } return; case 267 /* EnumDeclaration */: const enumKeyword = Debug.checkDefined(tokenToString(94 /* EnumKeyword */)); diagnostics.push(createDiagnosticForNode2(node, Diagnostics._0_declarations_can_only_be_used_in_TypeScript_files, enumKeyword)); return "skip"; case 236 /* NonNullExpression */: diagnostics.push(createDiagnosticForNode2(node, Diagnostics.Non_null_assertions_can_only_be_used_in_TypeScript_files)); return "skip"; case 235 /* AsExpression */: diagnostics.push(createDiagnosticForNode2(node.type, Diagnostics.Type_assertion_expressions_can_only_be_used_in_TypeScript_files)); return "skip"; case 239 /* SatisfiesExpression */: diagnostics.push(createDiagnosticForNode2(node.type, Diagnostics.Type_satisfaction_expressions_can_only_be_used_in_TypeScript_files)); return "skip"; case 217 /* TypeAssertionExpression */: Debug.fail(); } } function walkArray(nodes, parent) { if (canHaveIllegalDecorators(parent)) { const decorator = find(parent.modifiers, isDecorator); if (decorator) { diagnostics.push(createDiagnosticForNode2(decorator, Diagnostics.Decorators_are_not_valid_here)); } } else if (canHaveDecorators(parent) && parent.modifiers) { const decoratorIndex = findIndex(parent.modifiers, isDecorator); if (decoratorIndex >= 0) { if (isParameter(parent) && !options.experimentalDecorators) { diagnostics.push(createDiagnosticForNode2(parent.modifiers[decoratorIndex], Diagnostics.Decorators_are_not_valid_here)); } else if (isClassDeclaration(parent)) { const exportIndex = findIndex(parent.modifiers, isExportModifier); if (exportIndex >= 0) { const defaultIndex = findIndex(parent.modifiers, isDefaultModifier); if (decoratorIndex > exportIndex && defaultIndex >= 0 && decoratorIndex < defaultIndex) { diagnostics.push(createDiagnosticForNode2(parent.modifiers[decoratorIndex], Diagnostics.Decorators_are_not_valid_here)); } else if (exportIndex >= 0 && decoratorIndex < exportIndex) { const trailingDecoratorIndex = findIndex(parent.modifiers, isDecorator, exportIndex); if (trailingDecoratorIndex >= 0) { diagnostics.push(addRelatedInfo( createDiagnosticForNode2(parent.modifiers[trailingDecoratorIndex], Diagnostics.Decorators_may_not_appear_after_export_or_export_default_if_they_also_appear_before_export), createDiagnosticForNode2(parent.modifiers[decoratorIndex], Diagnostics.Decorator_used_before_export_here) )); } } } } } } switch (parent.kind) { case 264 /* ClassDeclaration */: case 232 /* ClassExpression */: case 175 /* MethodDeclaration */: case 177 /* Constructor */: case 178 /* GetAccessor */: case 179 /* SetAccessor */: case 219 /* FunctionExpression */: case 263 /* FunctionDeclaration */: case 220 /* ArrowFunction */: if (nodes === parent.typeParameters) { diagnostics.push(createDiagnosticForNodeArray2(nodes, Diagnostics.Type_parameter_declarations_can_only_be_used_in_TypeScript_files)); return "skip"; } // falls through case 244 /* VariableStatement */: if (nodes === parent.modifiers) { checkModifiers(parent.modifiers, parent.kind === 244 /* VariableStatement */); return "skip"; } break; case 173 /* PropertyDeclaration */: if (nodes === parent.modifiers) { for (const modifier of nodes) { if (isModifier(modifier) && modifier.kind !== 126 /* StaticKeyword */ && modifier.kind !== 129 /* AccessorKeyword */) { diagnostics.push(createDiagnosticForNode2(modifier, Diagnostics.The_0_modifier_can_only_be_used_in_TypeScript_files, tokenToString(modifier.kind))); } } return "skip"; } break; case 170 /* Parameter */: if (nodes === parent.modifiers && some(nodes, isModifier)) { diagnostics.push(createDiagnosticForNodeArray2(nodes, Diagnostics.Parameter_modifiers_can_only_be_used_in_TypeScript_files)); return "skip"; } break; case 214 /* CallExpression */: case 215 /* NewExpression */: case 234 /* ExpressionWithTypeArguments */: case 286 /* JsxSelfClosingElement */: case 287 /* JsxOpeningElement */: case 216 /* TaggedTemplateExpression */: if (nodes === parent.typeArguments) { diagnostics.push(createDiagnosticForNodeArray2(nodes, Diagnostics.Type_arguments_can_only_be_used_in_TypeScript_files)); return "skip"; } break; } } function checkModifiers(modifiers, isConstValid) { for (const modifier of modifiers) { switch (modifier.kind) { case 87 /* ConstKeyword */: if (isConstValid) { continue; } // to report error, // falls through case 125 /* PublicKeyword */: case 123 /* PrivateKeyword */: case 124 /* ProtectedKeyword */: case 148 /* ReadonlyKeyword */: case 138 /* DeclareKeyword */: case 128 /* AbstractKeyword */: case 164 /* OverrideKeyword */: case 103 /* InKeyword */: case 147 /* OutKeyword */: diagnostics.push(createDiagnosticForNode2(modifier, Diagnostics.The_0_modifier_can_only_be_used_in_TypeScript_files, tokenToString(modifier.kind))); break; // These are all legal modifiers. case 126 /* StaticKeyword */: case 95 /* ExportKeyword */: case 90 /* DefaultKeyword */: case 129 /* AccessorKeyword */: } } } function createDiagnosticForNodeArray2(nodes, message, ...args) { const start = nodes.pos; return createFileDiagnostic(sourceFile, start, nodes.end - start, message, ...args); } function createDiagnosticForNode2(node, message, ...args) { return createDiagnosticForNodeInSourceFile(sourceFile, node, message, ...args); } }); } function getDeclarationDiagnosticsWorker(sourceFile, cancellationToken) { let result = cachedDeclarationDiagnosticsForFile == null ? void 0 : cachedDeclarationDiagnosticsForFile.get(sourceFile.path); if (!result) { (cachedDeclarationDiagnosticsForFile ?? (cachedDeclarationDiagnosticsForFile = /* @__PURE__ */ new Map())).set( sourceFile.path, result = getDeclarationDiagnosticsForFileNoCache(sourceFile, cancellationToken) ); } return result; } function getDeclarationDiagnosticsForFileNoCache(sourceFile, cancellationToken) { return runWithCancellationToken(() => { const resolver = getTypeChecker().getEmitResolver(sourceFile, cancellationToken); return getDeclarationDiagnostics(getEmitHost(noop), resolver, sourceFile) || emptyArray; }); } function getDeclarationDiagnosticsForFile(sourceFile, cancellationToken) { return sourceFile.isDeclarationFile ? emptyArray : getDeclarationDiagnosticsWorker(sourceFile, cancellationToken); } function getOptionsDiagnostics() { return sortAndDeduplicateDiagnostics(concatenate( programDiagnostics.getCombinedDiagnostics(program).getGlobalDiagnostics(), getOptionsDiagnosticsOfConfigFile() )); } function getOptionsDiagnosticsOfConfigFile() { if (!options.configFile) return emptyArray; let diagnostics = programDiagnostics.getCombinedDiagnostics(program).getDiagnostics(options.configFile.fileName); forEachResolvedProjectReference2((resolvedRef) => { diagnostics = concatenate(diagnostics, programDiagnostics.getCombinedDiagnostics(program).getDiagnostics(resolvedRef.sourceFile.fileName)); }); return diagnostics; } function getGlobalDiagnostics() { return rootNames.length ? sortAndDeduplicateDiagnostics(getTypeChecker().getGlobalDiagnostics().slice()) : emptyArray; } function getConfigFileParsingDiagnostics2() { return configFileParsingDiagnostics || emptyArray; } function processRootFile(fileName, isDefaultLib, ignoreNoDefaultLib, reason) { processSourceFile( normalizePath(fileName), isDefaultLib, ignoreNoDefaultLib, /*packageId*/ void 0, reason ); } function fileReferenceIsEqualTo(a, b) { return a.fileName === b.fileName; } function moduleNameIsEqualTo(a, b) { return a.kind === 80 /* Identifier */ ? b.kind === 80 /* Identifier */ && a.escapedText === b.escapedText : b.kind === 11 /* StringLiteral */ && a.text === b.text; } function createSyntheticImport(text, file) { const externalHelpersModuleReference = factory.createStringLiteral(text); const importDecl = factory.createImportDeclaration( /*modifiers*/ void 0, /*importClause*/ void 0, externalHelpersModuleReference ); addInternalEmitFlags(importDecl, 2 /* NeverApplyImportHelper */); setParent(externalHelpersModuleReference, importDecl); setParent(importDecl, file); externalHelpersModuleReference.flags &= ~16 /* Synthesized */; importDecl.flags &= ~16 /* Synthesized */; return externalHelpersModuleReference; } function collectExternalModuleReferences(file) { if (file.imports) { return; } const isJavaScriptFile = isSourceFileJS(file); const isExternalModuleFile = isExternalModule(file); let imports; let moduleAugmentations; let ambientModules; if (isJavaScriptFile || !file.isDeclarationFile && (getIsolatedModules(options) || isExternalModule(file))) { if (options.importHelpers) { imports = [createSyntheticImport(externalHelpersModuleNameText, file)]; } const jsxImport = getJSXRuntimeImport(getJSXImplicitImportBase(options, file), options); if (jsxImport) { (imports || (imports = [])).push(createSyntheticImport(jsxImport, file)); } } for (const node of file.statements) { collectModuleReferences( node, /*inAmbientModule*/ false ); } if (file.flags & 4194304 /* PossiblyContainsDynamicImport */ || isJavaScriptFile) { forEachDynamicImportOrRequireCall( file, /*includeTypeSpaceImports*/ true, /*requireStringLiteralLikeArgument*/ true, (node, moduleSpecifier) => { setParentRecursive( node, /*incremental*/ false ); imports = append(imports, moduleSpecifier); } ); } file.imports = imports || emptyArray; file.moduleAugmentations = moduleAugmentations || emptyArray; file.ambientModuleNames = ambientModules || emptyArray; return; function collectModuleReferences(node, inAmbientModule) { if (isAnyImportOrReExport(node)) { const moduleNameExpr = getExternalModuleName(node); if (moduleNameExpr && isStringLiteral(moduleNameExpr) && moduleNameExpr.text && (!inAmbientModule || !isExternalModuleNameRelative(moduleNameExpr.text))) { setParentRecursive( node, /*incremental*/ false ); imports = append(imports, moduleNameExpr); if (!usesUriStyleNodeCoreModules && currentNodeModulesDepth === 0 && !file.isDeclarationFile) { if (startsWith(moduleNameExpr.text, "node:") && !exclusivelyPrefixedNodeCoreModules.has(moduleNameExpr.text)) { usesUriStyleNodeCoreModules = true; } else if (usesUriStyleNodeCoreModules === void 0 && unprefixedNodeCoreModules.has(moduleNameExpr.text)) { usesUriStyleNodeCoreModules = false; } } } } else if (isModuleDeclaration(node)) { if (isAmbientModule(node) && (inAmbientModule || hasSyntacticModifier(node, 128 /* Ambient */) || file.isDeclarationFile)) { node.name.parent = node; const nameText = getTextOfIdentifierOrLiteral(node.name); if (isExternalModuleFile || inAmbientModule && !isExternalModuleNameRelative(nameText)) { (moduleAugmentations || (moduleAugmentations = [])).push(node.name); } else if (!inAmbientModule) { if (file.isDeclarationFile) { (ambientModules || (ambientModules = [])).push(nameText); } const body = node.body; if (body) { for (const statement of body.statements) { collectModuleReferences( statement, /*inAmbientModule*/ true ); } } } } } } } function getLibFileFromReference(ref) { var _a2; const libFileName = getLibFileNameFromLibReference(ref); const actualFileName = libFileName && ((_a2 = resolvedLibReferences == null ? void 0 : resolvedLibReferences.get(libFileName)) == null ? void 0 : _a2.actual); return actualFileName !== void 0 ? getSourceFile(actualFileName) : void 0; } function getSourceFileFromReference(referencingFile, ref) { return getSourceFileFromReferenceWorker(resolveTripleslashReference(ref.fileName, referencingFile.fileName), getSourceFile); } function getSourceFileFromReferenceWorker(fileName, getSourceFile2, fail, reason) { if (hasExtension(fileName)) { const canonicalFileName = host.getCanonicalFileName(fileName); if (!options.allowNonTsExtensions && !forEach(flatten(supportedExtensionsWithJsonIfResolveJsonModule), (extension) => fileExtensionIs(canonicalFileName, extension))) { if (fail) { if (hasJSFileExtension(canonicalFileName)) { fail(Diagnostics.File_0_is_a_JavaScript_file_Did_you_mean_to_enable_the_allowJs_option, fileName); } else { fail(Diagnostics.File_0_has_an_unsupported_extension_The_only_supported_extensions_are_1, fileName, "'" + flatten(supportedExtensions).join("', '") + "'"); } } return void 0; } const sourceFile = getSourceFile2(fileName); if (fail) { if (!sourceFile) { const redirect = getRedirectFromSourceFile(fileName); if (redirect == null ? void 0 : redirect.outputDts) { fail(Diagnostics.Output_file_0_has_not_been_built_from_source_file_1, redirect.outputDts, fileName); } else { fail(Diagnostics.File_0_not_found, fileName); } } else if (isReferencedFile(reason) && canonicalFileName === host.getCanonicalFileName(getSourceFileByPath(reason.file).fileName)) { fail(Diagnostics.A_file_cannot_have_a_reference_to_itself); } } return sourceFile; } else { const sourceFileNoExtension = options.allowNonTsExtensions && getSourceFile2(fileName); if (sourceFileNoExtension) return sourceFileNoExtension; if (fail && options.allowNonTsExtensions) { fail(Diagnostics.File_0_not_found, fileName); return void 0; } const sourceFileWithAddedExtension = forEach(supportedExtensions[0], (extension) => getSourceFile2(fileName + extension)); if (fail && !sourceFileWithAddedExtension) fail(Diagnostics.Could_not_resolve_the_path_0_with_the_extensions_Colon_1, fileName, "'" + flatten(supportedExtensions).join("', '") + "'"); return sourceFileWithAddedExtension; } } function processSourceFile(fileName, isDefaultLib, ignoreNoDefaultLib, packageId, reason) { getSourceFileFromReferenceWorker( fileName, (fileName2) => findSourceFile(fileName2, isDefaultLib, ignoreNoDefaultLib, reason, packageId), // TODO: GH#18217 (diagnostic, ...args) => addFilePreprocessingFileExplainingDiagnostic( /*file*/ void 0, reason, diagnostic, args ), reason ); } function processProjectReferenceFile(fileName, reason) { return processSourceFile( fileName, /*isDefaultLib*/ false, /*ignoreNoDefaultLib*/ false, /*packageId*/ void 0, reason ); } function reportFileNamesDifferOnlyInCasingError(fileName, existingFile, reason) { const hasExistingReasonToReportErrorOn = !isReferencedFile(reason) && some(programDiagnostics.getFileReasons().get(existingFile.path), isReferencedFile); if (hasExistingReasonToReportErrorOn) { addFilePreprocessingFileExplainingDiagnostic(existingFile, reason, Diagnostics.Already_included_file_name_0_differs_from_file_name_1_only_in_casing, [existingFile.fileName, fileName]); } else { addFilePreprocessingFileExplainingDiagnostic(existingFile, reason, Diagnostics.File_name_0_differs_from_already_included_file_name_1_only_in_casing, [fileName, existingFile.fileName]); } } function createRedirectedSourceFile(redirectTarget, unredirected, fileName, path, resolvedPath, originalFileName, sourceFileOptions) { var _a2; const redirect = parseNodeFactory.createRedirectedSourceFile({ redirectTarget, unredirected }); redirect.fileName = fileName; redirect.path = path; redirect.resolvedPath = resolvedPath; redirect.originalFileName = originalFileName; redirect.packageJsonLocations = ((_a2 = sourceFileOptions.packageJsonLocations) == null ? void 0 : _a2.length) ? sourceFileOptions.packageJsonLocations : void 0; redirect.packageJsonScope = sourceFileOptions.packageJsonScope; sourceFilesFoundSearchingNodeModules.set(path, currentNodeModulesDepth > 0); return redirect; } function findSourceFile(fileName, isDefaultLib, ignoreNoDefaultLib, reason, packageId) { var _a2, _b2; (_a2 = tracing) == null ? void 0 : _a2.push(tracing.Phase.Program, "findSourceFile", { fileName, isDefaultLib: isDefaultLib || void 0, fileIncludeKind: FileIncludeKind[reason.kind] }); const result = findSourceFileWorker(fileName, isDefaultLib, ignoreNoDefaultLib, reason, packageId); (_b2 = tracing) == null ? void 0 : _b2.pop(); return result; } function getCreateSourceFileOptions(fileName, moduleResolutionCache2, host2, options2) { const result = getImpliedNodeFormatForFileWorker(getNormalizedAbsolutePath(fileName, currentDirectory), moduleResolutionCache2 == null ? void 0 : moduleResolutionCache2.getPackageJsonInfoCache(), host2, options2); const languageVersion = getEmitScriptTarget(options2); const setExternalModuleIndicator2 = getSetExternalModuleIndicator(options2); return typeof result === "object" ? { ...result, languageVersion, setExternalModuleIndicator: setExternalModuleIndicator2, jsDocParsingMode: host2.jsDocParsingMode } : { languageVersion, impliedNodeFormat: result, setExternalModuleIndicator: setExternalModuleIndicator2, jsDocParsingMode: host2.jsDocParsingMode }; } function findSourceFileWorker(fileName, isDefaultLib, ignoreNoDefaultLib, reason, packageId) { var _a2, _b2; const path = toPath3(fileName); if (useSourceOfProjectReferenceRedirect) { let source = getRedirectFromOutput(path); if (!source && host.realpath && options.preserveSymlinks && isDeclarationFileName(fileName) && fileName.includes(nodeModulesPathPart)) { const realPath2 = toPath3(host.realpath(fileName)); if (realPath2 !== path) source = getRedirectFromOutput(realPath2); } if (source == null ? void 0 : source.source) { const file2 = findSourceFile(source.source, isDefaultLib, ignoreNoDefaultLib, reason, packageId); if (file2) addFileToFilesByName( file2, path, fileName, /*redirectedPath*/ void 0 ); return file2; } } const originalFileName = fileName; if (filesByName.has(path)) { const file2 = filesByName.get(path); const addedReason = addFileIncludeReason( file2 || void 0, reason, /*checkExisting*/ true ); if (file2 && addedReason && !(options.forceConsistentCasingInFileNames === false)) { const checkedName = file2.fileName; const isRedirect = toPath3(checkedName) !== toPath3(fileName); if (isRedirect) { fileName = ((_a2 = getRedirectFromSourceFile(fileName)) == null ? void 0 : _a2.outputDts) || fileName; } const checkedAbsolutePath = getNormalizedAbsolutePathWithoutRoot(checkedName, currentDirectory); const inputAbsolutePath = getNormalizedAbsolutePathWithoutRoot(fileName, currentDirectory); if (checkedAbsolutePath !== inputAbsolutePath) { reportFileNamesDifferOnlyInCasingError(fileName, file2, reason); } } if (file2 && sourceFilesFoundSearchingNodeModules.get(file2.path) && currentNodeModulesDepth === 0) { sourceFilesFoundSearchingNodeModules.set(file2.path, false); if (!options.noResolve) { processReferencedFiles(file2, isDefaultLib); processTypeReferenceDirectives(file2); } if (!options.noLib) { processLibReferenceDirectives(file2); } modulesWithElidedImports.set(file2.path, false); processImportedModules(file2); } else if (file2 && modulesWithElidedImports.get(file2.path)) { if (currentNodeModulesDepth < maxNodeModuleJsDepth) { modulesWithElidedImports.set(file2.path, false); processImportedModules(file2); } } return file2 || void 0; } let redirectedPath; if (!useSourceOfProjectReferenceRedirect) { const redirectProject = getRedirectFromSourceFile(fileName); if (redirectProject == null ? void 0 : redirectProject.outputDts) { if (redirectProject.resolvedRef.commandLine.options.outFile) { return void 0; } fileName = redirectProject.outputDts; redirectedPath = toPath3(redirectProject.outputDts); } } const sourceFileOptions = getCreateSourceFileOptions(fileName, moduleResolutionCache, host, options); const file = host.getSourceFile( fileName, sourceFileOptions, (hostErrorMessage) => addFilePreprocessingFileExplainingDiagnostic( /*file*/ void 0, reason, Diagnostics.Cannot_read_file_0_Colon_1, [fileName, hostErrorMessage] ), shouldCreateNewSourceFile ); if (packageId) { const packageIdKey = packageIdToString(packageId); const fileFromPackageId = packageIdToSourceFile.get(packageIdKey); if (fileFromPackageId) { const dupFile = createRedirectedSourceFile(fileFromPackageId, file, fileName, path, toPath3(fileName), originalFileName, sourceFileOptions); redirectTargetsMap.add(fileFromPackageId.path, fileName); addFileToFilesByName(dupFile, path, fileName, redirectedPath); addFileIncludeReason( dupFile, reason, /*checkExisting*/ false ); sourceFileToPackageName.set(path, packageIdToPackageName(packageId)); processingOtherFiles.push(dupFile); return dupFile; } else if (file) { packageIdToSourceFile.set(packageIdKey, file); sourceFileToPackageName.set(path, packageIdToPackageName(packageId)); } } addFileToFilesByName(file, path, fileName, redirectedPath); if (file) { sourceFilesFoundSearchingNodeModules.set(path, currentNodeModulesDepth > 0); file.fileName = fileName; file.path = path; file.resolvedPath = toPath3(fileName); file.originalFileName = originalFileName; file.packageJsonLocations = ((_b2 = sourceFileOptions.packageJsonLocations) == null ? void 0 : _b2.length) ? sourceFileOptions.packageJsonLocations : void 0; file.packageJsonScope = sourceFileOptions.packageJsonScope; addFileIncludeReason( file, reason, /*checkExisting*/ false ); if (host.useCaseSensitiveFileNames()) { const pathLowerCase = toFileNameLowerCase(path); const existingFile = filesByNameIgnoreCase.get(pathLowerCase); if (existingFile) { reportFileNamesDifferOnlyInCasingError(fileName, existingFile, reason); } else { filesByNameIgnoreCase.set(pathLowerCase, file); } } skipDefaultLib = skipDefaultLib || file.hasNoDefaultLib && !ignoreNoDefaultLib; if (!options.noResolve) { processReferencedFiles(file, isDefaultLib); processTypeReferenceDirectives(file); } if (!options.noLib) { processLibReferenceDirectives(file); } processImportedModules(file); if (isDefaultLib) { processingDefaultLibFiles.push(file); } else { processingOtherFiles.push(file); } (filesWithReferencesProcessed ?? (filesWithReferencesProcessed = /* @__PURE__ */ new Set())).add(file.path); } return file; } function addFileIncludeReason(file, reason, checkExisting) { if (file && (!checkExisting || !isReferencedFile(reason) || !(filesWithReferencesProcessed == null ? void 0 : filesWithReferencesProcessed.has(reason.file)))) { programDiagnostics.getFileReasons().add(file.path, reason); return true; } return false; } function addFileToFilesByName(file, path, fileName, redirectedPath) { if (redirectedPath) { updateFilesByNameMap(fileName, redirectedPath, file); updateFilesByNameMap(fileName, path, file || false); } else { updateFilesByNameMap(fileName, path, file); } } function updateFilesByNameMap(fileName, path, file) { filesByName.set(path, file); if (file !== void 0) missingFileNames.delete(path); else missingFileNames.set(path, fileName); } function getRedirectFromSourceFile(fileName) { return mapSourceFileToResolvedRef == null ? void 0 : mapSourceFileToResolvedRef.get(toPath3(fileName)); } function forEachResolvedProjectReference2(cb) { return forEachResolvedProjectReference(resolvedProjectReferences, cb); } function getRedirectFromOutput(path) { return mapOutputFileToResolvedRef == null ? void 0 : mapOutputFileToResolvedRef.get(path); } function isSourceOfProjectReferenceRedirect(fileName) { return useSourceOfProjectReferenceRedirect && !!getRedirectFromSourceFile(fileName); } function getResolvedProjectReferenceByPath(projectReferencePath) { if (!projectReferenceRedirects) { return void 0; } return projectReferenceRedirects.get(projectReferencePath) || void 0; } function processReferencedFiles(file, isDefaultLib) { forEach(file.referencedFiles, (ref, index) => { processSourceFile( resolveTripleslashReference(ref.fileName, file.fileName), isDefaultLib, /*ignoreNoDefaultLib*/ false, /*packageId*/ void 0, { kind: 4 /* ReferenceFile */, file: file.path, index } ); }); } function processTypeReferenceDirectives(file) { const typeDirectives = file.typeReferenceDirectives; if (!typeDirectives.length) return; const resolutions = (resolvedTypeReferenceDirectiveNamesProcessing == null ? void 0 : resolvedTypeReferenceDirectiveNamesProcessing.get(file.path)) || resolveTypeReferenceDirectiveNamesReusingOldState(typeDirectives, file); const resolutionsInFile = createModeAwareCache(); (resolvedTypeReferenceDirectiveNames ?? (resolvedTypeReferenceDirectiveNames = /* @__PURE__ */ new Map())).set(file.path, resolutionsInFile); for (let index = 0; index < typeDirectives.length; index++) { const ref = file.typeReferenceDirectives[index]; const resolvedTypeReferenceDirective = resolutions[index]; const fileName = ref.fileName; const mode = getModeForTypeReferenceDirectiveInFile(ref, file); resolutionsInFile.set(fileName, mode, resolvedTypeReferenceDirective); processTypeReferenceDirective(fileName, mode, resolvedTypeReferenceDirective, { kind: 5 /* TypeReferenceDirective */, file: file.path, index }); } } function getCompilerOptionsForFile(file) { var _a2; return ((_a2 = getRedirectReferenceForResolution(file)) == null ? void 0 : _a2.commandLine.options) || options; } function processTypeReferenceDirective(typeReferenceDirective, mode, resolution, reason) { var _a2, _b2; (_a2 = tracing) == null ? void 0 : _a2.push(tracing.Phase.Program, "processTypeReferenceDirective", { directive: typeReferenceDirective, hasResolved: !!resolution.resolvedTypeReferenceDirective, refKind: reason.kind, refPath: isReferencedFile(reason) ? reason.file : void 0 }); processTypeReferenceDirectiveWorker(typeReferenceDirective, mode, resolution, reason); (_b2 = tracing) == null ? void 0 : _b2.pop(); } function processTypeReferenceDirectiveWorker(typeReferenceDirective, mode, resolution, reason) { addResolutionDiagnostics(resolution); const { resolvedTypeReferenceDirective } = resolution; if (resolvedTypeReferenceDirective) { if (resolvedTypeReferenceDirective.isExternalLibraryImport) currentNodeModulesDepth++; processSourceFile( resolvedTypeReferenceDirective.resolvedFileName, /*isDefaultLib*/ false, /*ignoreNoDefaultLib*/ false, resolvedTypeReferenceDirective.packageId, reason ); if (resolvedTypeReferenceDirective.isExternalLibraryImport) currentNodeModulesDepth--; } else { addFilePreprocessingFileExplainingDiagnostic( /*file*/ void 0, reason, Diagnostics.Cannot_find_type_definition_file_for_0, [typeReferenceDirective] ); } } function pathForLibFile(libFileName) { const existing = resolvedLibReferences == null ? void 0 : resolvedLibReferences.get(libFileName); if (existing) return existing.actual; const result = pathForLibFileWorker(libFileName); (resolvedLibReferences ?? (resolvedLibReferences = /* @__PURE__ */ new Map())).set(libFileName, result); return result.actual; } function pathForLibFileWorker(libFileName) { var _a2, _b2, _c2, _d2, _e2; const existing = resolvedLibProcessing == null ? void 0 : resolvedLibProcessing.get(libFileName); if (existing) return existing; if (options.libReplacement === false) { const result2 = { resolution: { resolvedModule: void 0 }, actual: combinePaths(defaultLibraryPath, libFileName) }; (resolvedLibProcessing ?? (resolvedLibProcessing = /* @__PURE__ */ new Map())).set(libFileName, result2); return result2; } if (structureIsReused !== 0 /* Not */ && oldProgram && !hasInvalidatedLibResolutions(libFileName)) { const oldResolution = (_a2 = oldProgram.resolvedLibReferences) == null ? void 0 : _a2.get(libFileName); if (oldResolution) { if (oldResolution.resolution && isTraceEnabled(options, host)) { const libraryName2 = getLibraryNameFromLibFileName(libFileName); const resolveFrom2 = getInferredLibraryNameResolveFrom(options, currentDirectory, libFileName); trace( host, oldResolution.resolution.resolvedModule ? oldResolution.resolution.resolvedModule.packageId ? Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2_with_Package_ID_3 : Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2 : Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_not_resolved, libraryName2, getNormalizedAbsolutePath(resolveFrom2, currentDirectory), (_b2 = oldResolution.resolution.resolvedModule) == null ? void 0 : _b2.resolvedFileName, ((_c2 = oldResolution.resolution.resolvedModule) == null ? void 0 : _c2.packageId) && packageIdToString(oldResolution.resolution.resolvedModule.packageId) ); } (resolvedLibProcessing ?? (resolvedLibProcessing = /* @__PURE__ */ new Map())).set(libFileName, oldResolution); return oldResolution; } } const libraryName = getLibraryNameFromLibFileName(libFileName); const resolveFrom = getInferredLibraryNameResolveFrom(options, currentDirectory, libFileName); (_d2 = tracing) == null ? void 0 : _d2.push(tracing.Phase.Program, "resolveLibrary", { resolveFrom }); mark("beforeResolveLibrary"); const resolution = actualResolveLibrary(libraryName, resolveFrom, options, libFileName); mark("afterResolveLibrary"); measure("ResolveLibrary", "beforeResolveLibrary", "afterResolveLibrary"); (_e2 = tracing) == null ? void 0 : _e2.pop(); const result = { resolution, actual: resolution.resolvedModule ? resolution.resolvedModule.resolvedFileName : combinePaths(defaultLibraryPath, libFileName) }; (resolvedLibProcessing ?? (resolvedLibProcessing = /* @__PURE__ */ new Map())).set(libFileName, result); return result; } function processLibReferenceDirectives(file) { forEach(file.libReferenceDirectives, (libReference, index) => { const libFileName = getLibFileNameFromLibReference(libReference); if (libFileName) { processRootFile( pathForLibFile(libFileName), /*isDefaultLib*/ true, /*ignoreNoDefaultLib*/ true, { kind: 7 /* LibReferenceDirective */, file: file.path, index } ); } else { programDiagnostics.addFileProcessingDiagnostic({ kind: 0 /* FilePreprocessingLibReferenceDiagnostic */, reason: { kind: 7 /* LibReferenceDirective */, file: file.path, index } }); } }); } function getCanonicalFileName(fileName) { return host.getCanonicalFileName(fileName); } function processImportedModules(file) { collectExternalModuleReferences(file); if (file.imports.length || file.moduleAugmentations.length) { const moduleNames = getModuleNames(file); const resolutions = (resolvedModulesProcessing == null ? void 0 : resolvedModulesProcessing.get(file.path)) || resolveModuleNamesReusingOldState(moduleNames, file); Debug.assert(resolutions.length === moduleNames.length); const optionsForFile = getCompilerOptionsForFile(file); const resolutionsInFile = createModeAwareCache(); (resolvedModules ?? (resolvedModules = /* @__PURE__ */ new Map())).set(file.path, resolutionsInFile); for (let index = 0; index < moduleNames.length; index++) { const resolution = resolutions[index].resolvedModule; const moduleName = moduleNames[index].text; const mode = getModeForUsageLocationWorker(file, moduleNames[index], optionsForFile); resolutionsInFile.set(moduleName, mode, resolutions[index]); addResolutionDiagnosticsFromResolutionOrCache(file, moduleName, resolutions[index], mode); if (!resolution) { continue; } const isFromNodeModulesSearch = resolution.isExternalLibraryImport; const isJsFile = !resolutionExtensionIsTSOrJson(resolution.extension) && !getRedirectFromSourceFile(resolution.resolvedFileName); const isJsFileFromNodeModules = isFromNodeModulesSearch && isJsFile && (!resolution.originalPath || pathContainsNodeModules(resolution.resolvedFileName)); const resolvedFileName = resolution.resolvedFileName; if (isFromNodeModulesSearch) { currentNodeModulesDepth++; } const elideImport = isJsFileFromNodeModules && currentNodeModulesDepth > maxNodeModuleJsDepth; const shouldAddFile = resolvedFileName && !getResolutionDiagnostic(optionsForFile, resolution, file) && !optionsForFile.noResolve && index < file.imports.length && !elideImport && !(isJsFile && !getAllowJSCompilerOption(optionsForFile)) && (isInJSFile(file.imports[index]) || !(file.imports[index].flags & 16777216 /* JSDoc */)); if (elideImport) { modulesWithElidedImports.set(file.path, true); } else if (shouldAddFile) { findSourceFile( resolvedFileName, /*isDefaultLib*/ false, /*ignoreNoDefaultLib*/ false, { kind: 3 /* Import */, file: file.path, index }, resolution.packageId ); } if (isFromNodeModulesSearch) { currentNodeModulesDepth--; } } } } function checkSourceFilesBelongToPath(sourceFiles, rootDirectory) { let allFilesBelongToPath = true; const absoluteRootDirectoryPath = host.getCanonicalFileName(getNormalizedAbsolutePath(rootDirectory, currentDirectory)); for (const sourceFile of sourceFiles) { if (!sourceFile.isDeclarationFile) { const absoluteSourceFilePath = host.getCanonicalFileName(getNormalizedAbsolutePath(sourceFile.fileName, currentDirectory)); if (absoluteSourceFilePath.indexOf(absoluteRootDirectoryPath) !== 0) { programDiagnostics.addLazyConfigDiagnostic( sourceFile, Diagnostics.File_0_is_not_under_rootDir_1_rootDir_is_expected_to_contain_all_source_files, sourceFile.fileName, rootDirectory ); allFilesBelongToPath = false; } } } return allFilesBelongToPath; } function parseProjectReferenceConfigFile(ref) { if (!projectReferenceRedirects) { projectReferenceRedirects = /* @__PURE__ */ new Map(); } const refPath = resolveProjectReferencePath(ref); const sourceFilePath = toPath3(refPath); const fromCache = projectReferenceRedirects.get(sourceFilePath); if (fromCache !== void 0) { return fromCache || void 0; } let commandLine; let sourceFile; if (host.getParsedCommandLine) { commandLine = host.getParsedCommandLine(refPath); if (!commandLine) { addFileToFilesByName( /*file*/ void 0, sourceFilePath, refPath, /*redirectedPath*/ void 0 ); projectReferenceRedirects.set(sourceFilePath, false); return void 0; } sourceFile = Debug.checkDefined(commandLine.options.configFile); Debug.assert(!sourceFile.path || sourceFile.path === sourceFilePath); addFileToFilesByName( sourceFile, sourceFilePath, refPath, /*redirectedPath*/ void 0 ); } else { const basePath = getNormalizedAbsolutePath(getDirectoryPath(refPath), currentDirectory); sourceFile = host.getSourceFile(refPath, 100 /* JSON */); addFileToFilesByName( sourceFile, sourceFilePath, refPath, /*redirectedPath*/ void 0 ); if (sourceFile === void 0) { projectReferenceRedirects.set(sourceFilePath, false); return void 0; } commandLine = parseJsonSourceFileConfigFileContent( sourceFile, configParsingHost, basePath, /*existingOptions*/ void 0, refPath ); } sourceFile.fileName = refPath; sourceFile.path = sourceFilePath; sourceFile.resolvedPath = sourceFilePath; sourceFile.originalFileName = refPath; const resolvedRef = { commandLine, sourceFile }; projectReferenceRedirects.set(sourceFilePath, resolvedRef); if (options.configFile !== sourceFile) { mapSourceFileToResolvedRef ?? (mapSourceFileToResolvedRef = /* @__PURE__ */ new Map()); mapOutputFileToResolvedRef ?? (mapOutputFileToResolvedRef = /* @__PURE__ */ new Map()); let outDts; if (commandLine.options.outFile) { outDts = changeExtension(commandLine.options.outFile, ".d.ts" /* Dts */); mapOutputFileToResolvedRef == null ? void 0 : mapOutputFileToResolvedRef.set(toPath3(outDts), { resolvedRef }); } const getCommonSourceDirectory3 = memoize(() => getCommonSourceDirectoryOfConfig(resolvedRef.commandLine, !host.useCaseSensitiveFileNames())); commandLine.fileNames.forEach((fileName) => { const path = toPath3(fileName); let outputDts; if (!isDeclarationFileName(fileName) && !fileExtensionIs(fileName, ".json" /* Json */)) { if (!commandLine.options.outFile) { outputDts = getOutputDeclarationFileName(fileName, resolvedRef.commandLine, !host.useCaseSensitiveFileNames(), getCommonSourceDirectory3); mapOutputFileToResolvedRef.set(toPath3(outputDts), { resolvedRef, source: fileName }); } else { outputDts = outDts; } } mapSourceFileToResolvedRef.set(path, { resolvedRef, outputDts }); }); } if (commandLine.projectReferences) { resolvedRef.references = commandLine.projectReferences.map(parseProjectReferenceConfigFile); } return resolvedRef; } function verifyCompilerOptions() { if (options.strictPropertyInitialization && !getStrictOptionValue(options, "strictNullChecks")) { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1, "strictPropertyInitialization", "strictNullChecks"); } if (options.exactOptionalPropertyTypes && !getStrictOptionValue(options, "strictNullChecks")) { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1, "exactOptionalPropertyTypes", "strictNullChecks"); } if (options.isolatedModules || options.verbatimModuleSyntax) { if (options.outFile) { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_with_option_1, "outFile", options.verbatimModuleSyntax ? "verbatimModuleSyntax" : "isolatedModules"); } } if (options.isolatedDeclarations) { if (getAllowJSCompilerOption(options)) { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_with_option_1, "allowJs", "isolatedDeclarations"); } if (!getEmitDeclarations(options)) { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1_or_option_2, "isolatedDeclarations", "declaration", "composite"); } } if (options.inlineSourceMap) { if (options.sourceMap) { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_with_option_1, "sourceMap", "inlineSourceMap"); } if (options.mapRoot) { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_with_option_1, "mapRoot", "inlineSourceMap"); } } if (options.composite) { if (options.declaration === false) { createDiagnosticForOptionName(Diagnostics.Composite_projects_may_not_disable_declaration_emit, "declaration"); } if (options.incremental === false) { createDiagnosticForOptionName(Diagnostics.Composite_projects_may_not_disable_incremental_compilation, "declaration"); } } const outputFile = options.outFile; if (!options.tsBuildInfoFile && options.incremental && !outputFile && !options.configFilePath) { programDiagnostics.addConfigDiagnostic(createCompilerDiagnostic(Diagnostics.Option_incremental_can_only_be_specified_using_tsconfig_emitting_to_single_file_or_when_option_tsBuildInfoFile_is_specified)); } verifyDeprecatedCompilerOptions(); verifyProjectReferences(); if (options.composite) { const rootPaths = new Set(rootNames.map(toPath3)); for (const file of files) { if (sourceFileMayBeEmitted(file, program) && !rootPaths.has(file.path)) { programDiagnostics.addLazyConfigDiagnostic( file, Diagnostics.File_0_is_not_listed_within_the_file_list_of_project_1_Projects_must_list_all_files_or_use_an_include_pattern, file.fileName, options.configFilePath || "" ); } } } if (options.paths) { for (const key in options.paths) { if (!hasProperty(options.paths, key)) { continue; } if (!hasZeroOrOneAsteriskCharacter(key)) { createDiagnosticForOptionPaths( /*onKey*/ true, key, Diagnostics.Pattern_0_can_have_at_most_one_Asterisk_character, key ); } if (isArray(options.paths[key])) { const len = options.paths[key].length; if (len === 0) { createDiagnosticForOptionPaths( /*onKey*/ false, key, Diagnostics.Substitutions_for_pattern_0_shouldn_t_be_an_empty_array, key ); } for (let i = 0; i < len; i++) { const subst = options.paths[key][i]; const typeOfSubst = typeof subst; if (typeOfSubst === "string") { if (!hasZeroOrOneAsteriskCharacter(subst)) { createDiagnosticForOptionPathKeyValue(key, i, Diagnostics.Substitution_0_in_pattern_1_can_have_at_most_one_Asterisk_character, subst, key); } if (!options.baseUrl && !pathIsRelative(subst) && !pathIsAbsolute(subst)) { createDiagnosticForOptionPathKeyValue(key, i, Diagnostics.Non_relative_paths_are_not_allowed_when_baseUrl_is_not_set_Did_you_forget_a_leading_Slash); } } else { createDiagnosticForOptionPathKeyValue(key, i, Diagnostics.Substitution_0_for_pattern_1_has_incorrect_type_expected_string_got_2, subst, key, typeOfSubst); } } } else { createDiagnosticForOptionPaths( /*onKey*/ false, key, Diagnostics.Substitutions_for_pattern_0_should_be_an_array, key ); } } } if (!options.sourceMap && !options.inlineSourceMap) { if (options.inlineSources) { createDiagnosticForOptionName(Diagnostics.Option_0_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided, "inlineSources"); } if (options.sourceRoot) { createDiagnosticForOptionName(Diagnostics.Option_0_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided, "sourceRoot"); } } if (options.mapRoot && !(options.sourceMap || options.declarationMap)) { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1_or_option_2, "mapRoot", "sourceMap", "declarationMap"); } if (options.declarationDir) { if (!getEmitDeclarations(options)) { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1_or_option_2, "declarationDir", "declaration", "composite"); } if (outputFile) { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_with_option_1, "declarationDir", "outFile"); } } if (options.declarationMap && !getEmitDeclarations(options)) { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1_or_option_2, "declarationMap", "declaration", "composite"); } if (options.lib && options.noLib) { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_with_option_1, "lib", "noLib"); } const languageVersion = getEmitScriptTarget(options); const firstNonAmbientExternalModuleSourceFile = find(files, (f) => isExternalModule(f) && !f.isDeclarationFile); if (options.isolatedModules || options.verbatimModuleSyntax) { if (options.module === 0 /* None */ && languageVersion < 2 /* ES2015 */ && options.isolatedModules) { createDiagnosticForOptionName(Diagnostics.Option_isolatedModules_can_only_be_used_when_either_option_module_is_provided_or_option_target_is_ES2015_or_higher, "isolatedModules", "target"); } if (options.preserveConstEnums === false) { createDiagnosticForOptionName(Diagnostics.Option_preserveConstEnums_cannot_be_disabled_when_0_is_enabled, options.verbatimModuleSyntax ? "verbatimModuleSyntax" : "isolatedModules", "preserveConstEnums"); } } else if (firstNonAmbientExternalModuleSourceFile && languageVersion < 2 /* ES2015 */ && options.module === 0 /* None */) { const span = getErrorSpanForNode(firstNonAmbientExternalModuleSourceFile, typeof firstNonAmbientExternalModuleSourceFile.externalModuleIndicator === "boolean" ? firstNonAmbientExternalModuleSourceFile : firstNonAmbientExternalModuleSourceFile.externalModuleIndicator); programDiagnostics.addConfigDiagnostic(createFileDiagnostic(firstNonAmbientExternalModuleSourceFile, span.start, span.length, Diagnostics.Cannot_use_imports_exports_or_module_augmentations_when_module_is_none)); } if (outputFile && !options.emitDeclarationOnly) { if (options.module && !(options.module === 2 /* AMD */ || options.module === 4 /* System */)) { createDiagnosticForOptionName(Diagnostics.Only_amd_and_system_modules_are_supported_alongside_0, "outFile", "module"); } else if (options.module === void 0 && firstNonAmbientExternalModuleSourceFile) { const span = getErrorSpanForNode(firstNonAmbientExternalModuleSourceFile, typeof firstNonAmbientExternalModuleSourceFile.externalModuleIndicator === "boolean" ? firstNonAmbientExternalModuleSourceFile : firstNonAmbientExternalModuleSourceFile.externalModuleIndicator); programDiagnostics.addConfigDiagnostic(createFileDiagnostic(firstNonAmbientExternalModuleSourceFile, span.start, span.length, Diagnostics.Cannot_compile_modules_using_option_0_unless_the_module_flag_is_amd_or_system, "outFile")); } } if (getResolveJsonModule(options)) { if (getEmitModuleResolutionKind(options) === 1 /* Classic */) { createDiagnosticForOptionName(Diagnostics.Option_resolveJsonModule_cannot_be_specified_when_moduleResolution_is_set_to_classic, "resolveJsonModule"); } else if (!hasJsonModuleEmitEnabled(options)) { createDiagnosticForOptionName(Diagnostics.Option_resolveJsonModule_cannot_be_specified_when_module_is_set_to_none_system_or_umd, "resolveJsonModule", "module"); } } if (options.outDir || // there is --outDir specified options.rootDir || // there is --rootDir specified options.sourceRoot || // there is --sourceRoot specified options.mapRoot || // there is --mapRoot specified getEmitDeclarations(options) && options.declarationDir) { const dir = getCommonSourceDirectory2(); if (options.outDir && dir === "" && files.some((file) => getRootLength(file.fileName) > 1)) { createDiagnosticForOptionName(Diagnostics.Cannot_find_the_common_subdirectory_path_for_the_input_files, "outDir"); } } if (options.checkJs && !getAllowJSCompilerOption(options)) { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1, "checkJs", "allowJs"); } if (options.emitDeclarationOnly) { if (!getEmitDeclarations(options)) { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1_or_option_2, "emitDeclarationOnly", "declaration", "composite"); } } if (options.emitDecoratorMetadata && !options.experimentalDecorators) { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1, "emitDecoratorMetadata", "experimentalDecorators"); } if (options.jsxFactory) { if (options.reactNamespace) { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_with_option_1, "reactNamespace", "jsxFactory"); } if (options.jsx === 4 /* ReactJSX */ || options.jsx === 5 /* ReactJSXDev */) { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_when_option_jsx_is_1, "jsxFactory", inverseJsxOptionMap.get("" + options.jsx)); } if (!parseIsolatedEntityName(options.jsxFactory, languageVersion)) { createOptionValueDiagnostic("jsxFactory", Diagnostics.Invalid_value_for_jsxFactory_0_is_not_a_valid_identifier_or_qualified_name, options.jsxFactory); } } else if (options.reactNamespace && !isIdentifierText(options.reactNamespace, languageVersion)) { createOptionValueDiagnostic("reactNamespace", Diagnostics.Invalid_value_for_reactNamespace_0_is_not_a_valid_identifier, options.reactNamespace); } if (options.jsxFragmentFactory) { if (!options.jsxFactory) { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1, "jsxFragmentFactory", "jsxFactory"); } if (options.jsx === 4 /* ReactJSX */ || options.jsx === 5 /* ReactJSXDev */) { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_when_option_jsx_is_1, "jsxFragmentFactory", inverseJsxOptionMap.get("" + options.jsx)); } if (!parseIsolatedEntityName(options.jsxFragmentFactory, languageVersion)) { createOptionValueDiagnostic("jsxFragmentFactory", Diagnostics.Invalid_value_for_jsxFragmentFactory_0_is_not_a_valid_identifier_or_qualified_name, options.jsxFragmentFactory); } } if (options.reactNamespace) { if (options.jsx === 4 /* ReactJSX */ || options.jsx === 5 /* ReactJSXDev */) { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_when_option_jsx_is_1, "reactNamespace", inverseJsxOptionMap.get("" + options.jsx)); } } if (options.jsxImportSource) { if (options.jsx === 2 /* React */) { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_when_option_jsx_is_1, "jsxImportSource", inverseJsxOptionMap.get("" + options.jsx)); } } const moduleKind = getEmitModuleKind(options); if (options.verbatimModuleSyntax) { if (moduleKind === 2 /* AMD */ || moduleKind === 3 /* UMD */ || moduleKind === 4 /* System */) { createDiagnosticForOptionName(Diagnostics.Option_verbatimModuleSyntax_cannot_be_used_when_module_is_set_to_UMD_AMD_or_System, "verbatimModuleSyntax"); } } if (options.allowImportingTsExtensions && !(options.noEmit || options.emitDeclarationOnly || options.rewriteRelativeImportExtensions)) { createOptionValueDiagnostic("allowImportingTsExtensions", Diagnostics.Option_allowImportingTsExtensions_can_only_be_used_when_either_noEmit_or_emitDeclarationOnly_is_set); } const moduleResolution = getEmitModuleResolutionKind(options); if (options.resolvePackageJsonExports && !moduleResolutionSupportsPackageJsonExportsAndImports(moduleResolution)) { createDiagnosticForOptionName(Diagnostics.Option_0_can_only_be_used_when_moduleResolution_is_set_to_node16_nodenext_or_bundler, "resolvePackageJsonExports"); } if (options.resolvePackageJsonImports && !moduleResolutionSupportsPackageJsonExportsAndImports(moduleResolution)) { createDiagnosticForOptionName(Diagnostics.Option_0_can_only_be_used_when_moduleResolution_is_set_to_node16_nodenext_or_bundler, "resolvePackageJsonImports"); } if (options.customConditions && !moduleResolutionSupportsPackageJsonExportsAndImports(moduleResolution)) { createDiagnosticForOptionName(Diagnostics.Option_0_can_only_be_used_when_moduleResolution_is_set_to_node16_nodenext_or_bundler, "customConditions"); } if (moduleResolution === 100 /* Bundler */ && !emitModuleKindIsNonNodeESM(moduleKind) && moduleKind !== 200 /* Preserve */) { createOptionValueDiagnostic("moduleResolution", Diagnostics.Option_0_can_only_be_used_when_module_is_set_to_preserve_or_to_es2015_or_later, "bundler"); } if (ModuleKind[moduleKind] && (100 /* Node16 */ <= moduleKind && moduleKind <= 199 /* NodeNext */) && !(3 /* Node16 */ <= moduleResolution && moduleResolution <= 99 /* NodeNext */)) { const moduleKindName = ModuleKind[moduleKind]; const moduleResolutionName = ModuleResolutionKind[moduleKindName] ? moduleKindName : "Node16"; createOptionValueDiagnostic("moduleResolution", Diagnostics.Option_moduleResolution_must_be_set_to_0_or_left_unspecified_when_option_module_is_set_to_1, moduleResolutionName, moduleKindName); } else if (ModuleResolutionKind[moduleResolution] && (3 /* Node16 */ <= moduleResolution && moduleResolution <= 99 /* NodeNext */) && !(100 /* Node16 */ <= moduleKind && moduleKind <= 199 /* NodeNext */)) { const moduleResolutionName = ModuleResolutionKind[moduleResolution]; createOptionValueDiagnostic("module", Diagnostics.Option_module_must_be_set_to_0_when_option_moduleResolution_is_set_to_1, moduleResolutionName, moduleResolutionName); } if (!options.noEmit && !options.suppressOutputPathCheck) { const emitHost = getEmitHost(); const emitFilesSeen = /* @__PURE__ */ new Set(); forEachEmittedFile(emitHost, (emitFileNames) => { if (!options.emitDeclarationOnly) { verifyEmitFilePath(emitFileNames.jsFilePath, emitFilesSeen); } verifyEmitFilePath(emitFileNames.declarationFilePath, emitFilesSeen); }); } function verifyEmitFilePath(emitFileName, emitFilesSeen) { if (emitFileName) { const emitFilePath = toPath3(emitFileName); if (filesByName.has(emitFilePath)) { let chain; if (!options.configFilePath) { chain = chainDiagnosticMessages( /*details*/ void 0, Diagnostics.Adding_a_tsconfig_json_file_will_help_organize_projects_that_contain_both_TypeScript_and_JavaScript_files_Learn_more_at_https_Colon_Slash_Slashaka_ms_Slashtsconfig ); } chain = chainDiagnosticMessages(chain, Diagnostics.Cannot_write_file_0_because_it_would_overwrite_input_file, emitFileName); blockEmittingOfFile(emitFileName, createCompilerDiagnosticFromMessageChain(chain)); } const emitFileKey = !host.useCaseSensitiveFileNames() ? toFileNameLowerCase(emitFilePath) : emitFilePath; if (emitFilesSeen.has(emitFileKey)) { blockEmittingOfFile(emitFileName, createCompilerDiagnostic(Diagnostics.Cannot_write_file_0_because_it_would_be_overwritten_by_multiple_input_files, emitFileName)); } else { emitFilesSeen.add(emitFileKey); } } } } function getIgnoreDeprecationsVersion() { const ignoreDeprecations = options.ignoreDeprecations; if (ignoreDeprecations) { if (ignoreDeprecations === "5.0") { return new Version(ignoreDeprecations); } reportInvalidIgnoreDeprecations(); } return Version.zero; } function checkDeprecations(deprecatedIn, removedIn, createDiagnostic, fn) { const deprecatedInVersion = new Version(deprecatedIn); const removedInVersion = new Version(removedIn); const typescriptVersion = new Version(typeScriptVersion2 || versionMajorMinor); const ignoreDeprecationsVersion = getIgnoreDeprecationsVersion(); const mustBeRemoved = !(removedInVersion.compareTo(typescriptVersion) === 1 /* GreaterThan */); const canBeSilenced = !mustBeRemoved && ignoreDeprecationsVersion.compareTo(deprecatedInVersion) === -1 /* LessThan */; if (mustBeRemoved || canBeSilenced) { fn((name, value, useInstead) => { if (mustBeRemoved) { if (value === void 0) { createDiagnostic(name, value, useInstead, Diagnostics.Option_0_has_been_removed_Please_remove_it_from_your_configuration, name); } else { createDiagnostic(name, value, useInstead, Diagnostics.Option_0_1_has_been_removed_Please_remove_it_from_your_configuration, name, value); } } else { if (value === void 0) { createDiagnostic(name, value, useInstead, Diagnostics.Option_0_is_deprecated_and_will_stop_functioning_in_TypeScript_1_Specify_compilerOption_ignoreDeprecations_Colon_2_to_silence_this_error, name, removedIn, deprecatedIn); } else { createDiagnostic(name, value, useInstead, Diagnostics.Option_0_1_is_deprecated_and_will_stop_functioning_in_TypeScript_2_Specify_compilerOption_ignoreDeprecations_Colon_3_to_silence_this_error, name, value, removedIn, deprecatedIn); } } }); } } function verifyDeprecatedCompilerOptions() { function createDiagnostic(name, value, useInstead, message, ...args) { if (useInstead) { const details = chainDiagnosticMessages( /*details*/ void 0, Diagnostics.Use_0_instead, useInstead ); const chain = chainDiagnosticMessages(details, message, ...args); createDiagnosticForOption( /*onKey*/ !value, name, /*option2*/ void 0, chain ); } else { createDiagnosticForOption( /*onKey*/ !value, name, /*option2*/ void 0, message, ...args ); } } checkDeprecations("5.0", "5.5", createDiagnostic, (createDeprecatedDiagnostic) => { if (options.target === 0 /* ES3 */) { createDeprecatedDiagnostic("target", "ES3"); } if (options.noImplicitUseStrict) { createDeprecatedDiagnostic("noImplicitUseStrict"); } if (options.keyofStringsOnly) { createDeprecatedDiagnostic("keyofStringsOnly"); } if (options.suppressExcessPropertyErrors) { createDeprecatedDiagnostic("suppressExcessPropertyErrors"); } if (options.suppressImplicitAnyIndexErrors) { createDeprecatedDiagnostic("suppressImplicitAnyIndexErrors"); } if (options.noStrictGenericChecks) { createDeprecatedDiagnostic("noStrictGenericChecks"); } if (options.charset) { createDeprecatedDiagnostic("charset"); } if (options.out) { createDeprecatedDiagnostic( "out", /*value*/ void 0, "outFile" ); } if (options.importsNotUsedAsValues) { createDeprecatedDiagnostic( "importsNotUsedAsValues", /*value*/ void 0, "verbatimModuleSyntax" ); } if (options.preserveValueImports) { createDeprecatedDiagnostic( "preserveValueImports", /*value*/ void 0, "verbatimModuleSyntax" ); } }); } function verifyDeprecatedProjectReference(ref, parentFile, index) { function createDiagnostic(_name, _value, _useInstead, message, ...args) { createDiagnosticForReference(parentFile, index, message, ...args); } checkDeprecations("5.0", "5.5", createDiagnostic, (createDeprecatedDiagnostic) => { if (ref.prepend) { createDeprecatedDiagnostic("prepend"); } }); } function addFilePreprocessingFileExplainingDiagnostic(file, fileProcessingReason, diagnostic, args) { programDiagnostics.addFileProcessingDiagnostic({ kind: 1 /* FilePreprocessingFileExplainingDiagnostic */, file: file && file.path, fileProcessingReason, diagnostic, args }); } function verifyProjectReferences() { const buildInfoPath = !options.suppressOutputPathCheck ? getTsBuildInfoEmitOutputFilePath(options) : void 0; forEachProjectReference( projectReferences, resolvedProjectReferences, (resolvedRef, parent, index) => { const ref = (parent ? parent.commandLine.projectReferences : projectReferences)[index]; const parentFile = parent && parent.sourceFile; verifyDeprecatedProjectReference(ref, parentFile, index); if (!resolvedRef) { createDiagnosticForReference(parentFile, index, Diagnostics.File_0_not_found, ref.path); return; } const options2 = resolvedRef.commandLine.options; if (!options2.composite || options2.noEmit) { const inputs = parent ? parent.commandLine.fileNames : rootNames; if (inputs.length) { if (!options2.composite) createDiagnosticForReference(parentFile, index, Diagnostics.Referenced_project_0_must_have_setting_composite_Colon_true, ref.path); if (options2.noEmit) createDiagnosticForReference(parentFile, index, Diagnostics.Referenced_project_0_may_not_disable_emit, ref.path); } } if (!parent && buildInfoPath && buildInfoPath === getTsBuildInfoEmitOutputFilePath(options2)) { createDiagnosticForReference(parentFile, index, Diagnostics.Cannot_write_file_0_because_it_will_overwrite_tsbuildinfo_file_generated_by_referenced_project_1, buildInfoPath, ref.path); hasEmitBlockingDiagnostics.set(toPath3(buildInfoPath), true); } } ); } function createDiagnosticForOptionPathKeyValue(key, valueIndex, message, ...args) { let needCompilerDiagnostic = true; forEachOptionPathsSyntax((pathProp) => { if (isObjectLiteralExpression(pathProp.initializer)) { forEachPropertyAssignment(pathProp.initializer, key, (keyProps) => { const initializer = keyProps.initializer; if (isArrayLiteralExpression(initializer) && initializer.elements.length > valueIndex) { programDiagnostics.addConfigDiagnostic(createDiagnosticForNodeInSourceFile(options.configFile, initializer.elements[valueIndex], message, ...args)); needCompilerDiagnostic = false; } }); } }); if (needCompilerDiagnostic) { createCompilerOptionsDiagnostic(message, ...args); } } function createDiagnosticForOptionPaths(onKey, key, message, ...args) { let needCompilerDiagnostic = true; forEachOptionPathsSyntax((pathProp) => { if (isObjectLiteralExpression(pathProp.initializer) && createOptionDiagnosticInObjectLiteralSyntax( pathProp.initializer, onKey, key, /*key2*/ void 0, message, ...args )) { needCompilerDiagnostic = false; } }); if (needCompilerDiagnostic) { createCompilerOptionsDiagnostic(message, ...args); } } function forEachOptionPathsSyntax(callback) { return forEachOptionsSyntaxByName(getCompilerOptionsObjectLiteralSyntax(), "paths", callback); } function createDiagnosticForOptionName(message, option1, option2, option3) { createDiagnosticForOption( /*onKey*/ true, option1, option2, message, option1, option2, option3 ); } function createOptionValueDiagnostic(option1, message, ...args) { createDiagnosticForOption( /*onKey*/ false, option1, /*option2*/ void 0, message, ...args ); } function createDiagnosticForReference(sourceFile, index, message, ...args) { const referencesSyntax = forEachTsConfigPropArray(sourceFile || options.configFile, "references", (property) => isArrayLiteralExpression(property.initializer) ? property.initializer : void 0); if (referencesSyntax && referencesSyntax.elements.length > index) { programDiagnostics.addConfigDiagnostic(createDiagnosticForNodeInSourceFile(sourceFile || options.configFile, referencesSyntax.elements[index], message, ...args)); } else { programDiagnostics.addConfigDiagnostic(createCompilerDiagnostic(message, ...args)); } } function createDiagnosticForOption(onKey, option1, option2, message, ...args) { const compilerOptionsObjectLiteralSyntax = getCompilerOptionsObjectLiteralSyntax(); const needCompilerDiagnostic = !compilerOptionsObjectLiteralSyntax || !createOptionDiagnosticInObjectLiteralSyntax(compilerOptionsObjectLiteralSyntax, onKey, option1, option2, message, ...args); if (needCompilerDiagnostic) { createCompilerOptionsDiagnostic(message, ...args); } } function createCompilerOptionsDiagnostic(message, ...args) { const compilerOptionsProperty = getCompilerOptionsPropertySyntax(); if (compilerOptionsProperty) { if ("messageText" in message) { programDiagnostics.addConfigDiagnostic(createDiagnosticForNodeFromMessageChain(options.configFile, compilerOptionsProperty.name, message)); } else { programDiagnostics.addConfigDiagnostic(createDiagnosticForNodeInSourceFile(options.configFile, compilerOptionsProperty.name, message, ...args)); } } else if ("messageText" in message) { programDiagnostics.addConfigDiagnostic(createCompilerDiagnosticFromMessageChain(message)); } else { programDiagnostics.addConfigDiagnostic(createCompilerDiagnostic(message, ...args)); } } function getCompilerOptionsObjectLiteralSyntax() { if (_compilerOptionsObjectLiteralSyntax === void 0) { const compilerOptionsProperty = getCompilerOptionsPropertySyntax(); _compilerOptionsObjectLiteralSyntax = compilerOptionsProperty ? tryCast(compilerOptionsProperty.initializer, isObjectLiteralExpression) || false : false; } return _compilerOptionsObjectLiteralSyntax || void 0; } function getCompilerOptionsPropertySyntax() { if (_compilerOptionsPropertySyntax === void 0) { _compilerOptionsPropertySyntax = forEachPropertyAssignment( getTsConfigObjectLiteralExpression(options.configFile), "compilerOptions", identity ) || false; } return _compilerOptionsPropertySyntax || void 0; } function createOptionDiagnosticInObjectLiteralSyntax(objectLiteral, onKey, key1, key2, message, ...args) { let needsCompilerDiagnostic = false; forEachPropertyAssignment(objectLiteral, key1, (prop) => { if ("messageText" in message) { programDiagnostics.addConfigDiagnostic(createDiagnosticForNodeFromMessageChain(options.configFile, onKey ? prop.name : prop.initializer, message)); } else { programDiagnostics.addConfigDiagnostic(createDiagnosticForNodeInSourceFile(options.configFile, onKey ? prop.name : prop.initializer, message, ...args)); } needsCompilerDiagnostic = true; }, key2); return needsCompilerDiagnostic; } function blockEmittingOfFile(emitFileName, diag2) { hasEmitBlockingDiagnostics.set(toPath3(emitFileName), true); programDiagnostics.addConfigDiagnostic(diag2); } function isEmittedFile(file) { if (options.noEmit) { return false; } const filePath = toPath3(file); if (getSourceFileByPath(filePath)) { return false; } const out = options.outFile; if (out) { return isSameFile(filePath, out) || isSameFile(filePath, removeFileExtension(out) + ".d.ts" /* Dts */); } if (options.declarationDir && containsPath(options.declarationDir, filePath, currentDirectory, !host.useCaseSensitiveFileNames())) { return true; } if (options.outDir) { return containsPath(options.outDir, filePath, currentDirectory, !host.useCaseSensitiveFileNames()); } if (fileExtensionIsOneOf(filePath, supportedJSExtensionsFlat) || isDeclarationFileName(filePath)) { const filePathWithoutExtension = removeFileExtension(filePath); return !!getSourceFileByPath(filePathWithoutExtension + ".ts" /* Ts */) || !!getSourceFileByPath(filePathWithoutExtension + ".tsx" /* Tsx */); } return false; } function isSameFile(file1, file2) { return comparePaths(file1, file2, currentDirectory, !host.useCaseSensitiveFileNames()) === 0 /* EqualTo */; } function getSymlinkCache() { if (host.getSymlinkCache) { return host.getSymlinkCache(); } if (!symlinks) { symlinks = createSymlinkCache(currentDirectory, getCanonicalFileName); } if (files && !symlinks.hasProcessedResolutions()) { symlinks.setSymlinksFromResolutions(forEachResolvedModule, forEachResolvedTypeReferenceDirective, automaticTypeDirectiveResolutions); } return symlinks; } function getModeForUsageLocation2(file, usage) { return getModeForUsageLocationWorker(file, usage, getCompilerOptionsForFile(file)); } function getEmitSyntaxForUsageLocation(file, usage) { return getEmitSyntaxForUsageLocationWorker(file, usage, getCompilerOptionsForFile(file)); } function getModeForResolutionAtIndex(file, index) { return getModeForUsageLocation2(file, getModuleNameStringLiteralAt(file, index)); } function getDefaultResolutionModeForFile2(sourceFile) { return getDefaultResolutionModeForFileWorker(sourceFile, getCompilerOptionsForFile(sourceFile)); } function getImpliedNodeFormatForEmit(sourceFile) { return getImpliedNodeFormatForEmitWorker(sourceFile, getCompilerOptionsForFile(sourceFile)); } function getEmitModuleFormatOfFile(sourceFile) { return getEmitModuleFormatOfFileWorker(sourceFile, getCompilerOptionsForFile(sourceFile)); } function shouldTransformImportCall(sourceFile) { return shouldTransformImportCallWorker(sourceFile, getCompilerOptionsForFile(sourceFile)); } function getModeForTypeReferenceDirectiveInFile(ref, sourceFile) { return ref.resolutionMode || getDefaultResolutionModeForFile2(sourceFile); } } function shouldTransformImportCallWorker(sourceFile, options) { const moduleKind = getEmitModuleKind(options); if (100 /* Node16 */ <= moduleKind && moduleKind <= 199 /* NodeNext */ || moduleKind === 200 /* Preserve */) { return false; } return getEmitModuleFormatOfFileWorker(sourceFile, options) < 5 /* ES2015 */; } function getEmitModuleFormatOfFileWorker(sourceFile, options) { return getImpliedNodeFormatForEmitWorker(sourceFile, options) ?? getEmitModuleKind(options); } function getImpliedNodeFormatForEmitWorker(sourceFile, options) { var _a, _b; const moduleKind = getEmitModuleKind(options); if (100 /* Node16 */ <= moduleKind && moduleKind <= 199 /* NodeNext */) { return sourceFile.impliedNodeFormat; } if (sourceFile.impliedNodeFormat === 1 /* CommonJS */ && (((_a = sourceFile.packageJsonScope) == null ? void 0 : _a.contents.packageJsonContent.type) === "commonjs" || fileExtensionIsOneOf(sourceFile.fileName, [".cjs" /* Cjs */, ".cts" /* Cts */]))) { return 1 /* CommonJS */; } if (sourceFile.impliedNodeFormat === 99 /* ESNext */ && (((_b = sourceFile.packageJsonScope) == null ? void 0 : _b.contents.packageJsonContent.type) === "module" || fileExtensionIsOneOf(sourceFile.fileName, [".mjs" /* Mjs */, ".mts" /* Mts */]))) { return 99 /* ESNext */; } return void 0; } function getDefaultResolutionModeForFileWorker(sourceFile, options) { return importSyntaxAffectsModuleResolution(options) ? getImpliedNodeFormatForEmitWorker(sourceFile, options) : void 0; } function updateHostForUseSourceOfProjectReferenceRedirect(host) { let setOfDeclarationDirectories; const originalFileExists = host.compilerHost.fileExists; const originalDirectoryExists = host.compilerHost.directoryExists; const originalGetDirectories = host.compilerHost.getDirectories; const originalRealpath = host.compilerHost.realpath; if (!host.useSourceOfProjectReferenceRedirect) return { onProgramCreateComplete: noop, fileExists }; host.compilerHost.fileExists = fileExists; let directoryExists; if (originalDirectoryExists) { directoryExists = host.compilerHost.directoryExists = (path) => { if (originalDirectoryExists.call(host.compilerHost, path)) { handleDirectoryCouldBeSymlink(path); return true; } if (!host.getResolvedProjectReferences()) return false; if (!setOfDeclarationDirectories) { setOfDeclarationDirectories = /* @__PURE__ */ new Set(); host.forEachResolvedProjectReference((ref) => { const out = ref.commandLine.options.outFile; if (out) { setOfDeclarationDirectories.add(getDirectoryPath(host.toPath(out))); } else { const declarationDir = ref.commandLine.options.declarationDir || ref.commandLine.options.outDir; if (declarationDir) { setOfDeclarationDirectories.add(host.toPath(declarationDir)); } } }); } return fileOrDirectoryExistsUsingSource( path, /*isFile*/ false ); }; } if (originalGetDirectories) { host.compilerHost.getDirectories = (path) => !host.getResolvedProjectReferences() || originalDirectoryExists && originalDirectoryExists.call(host.compilerHost, path) ? originalGetDirectories.call(host.compilerHost, path) : []; } if (originalRealpath) { host.compilerHost.realpath = (s) => { var _a; return ((_a = host.getSymlinkCache().getSymlinkedFiles()) == null ? void 0 : _a.get(host.toPath(s))) || originalRealpath.call(host.compilerHost, s); }; } return { onProgramCreateComplete, fileExists, directoryExists }; function onProgramCreateComplete() { host.compilerHost.fileExists = originalFileExists; host.compilerHost.directoryExists = originalDirectoryExists; host.compilerHost.getDirectories = originalGetDirectories; } function fileExists(file) { if (originalFileExists.call(host.compilerHost, file)) return true; if (!host.getResolvedProjectReferences()) return false; if (!isDeclarationFileName(file)) return false; return fileOrDirectoryExistsUsingSource( file, /*isFile*/ true ); } function fileExistsIfProjectReferenceDts(file) { const source = host.getRedirectFromOutput(host.toPath(file)); return source !== void 0 ? isString(source.source) ? originalFileExists.call(host.compilerHost, source.source) : true : void 0; } function directoryExistsIfProjectReferenceDeclDir(dir) { const dirPath = host.toPath(dir); const dirPathWithTrailingDirectorySeparator = `${dirPath}${directorySeparator}`; return forEachKey( setOfDeclarationDirectories, (declDirPath) => dirPath === declDirPath || // Any parent directory of declaration dir startsWith(declDirPath, dirPathWithTrailingDirectorySeparator) || // Any directory inside declaration dir startsWith(dirPath, `${declDirPath}/`) ); } function handleDirectoryCouldBeSymlink(directory) { var _a; if (!host.getResolvedProjectReferences() || containsIgnoredPath(directory)) return; if (!originalRealpath || !directory.includes(nodeModulesPathPart)) return; const symlinkCache = host.getSymlinkCache(); const directoryPath = ensureTrailingDirectorySeparator(host.toPath(directory)); if ((_a = symlinkCache.getSymlinkedDirectories()) == null ? void 0 : _a.has(directoryPath)) return; const real = normalizePath(originalRealpath.call(host.compilerHost, directory)); let realPath2; if (real === directory || (realPath2 = ensureTrailingDirectorySeparator(host.toPath(real))) === directoryPath) { symlinkCache.setSymlinkedDirectory(directoryPath, false); return; } symlinkCache.setSymlinkedDirectory(directory, { real: ensureTrailingDirectorySeparator(real), realPath: realPath2 }); } function fileOrDirectoryExistsUsingSource(fileOrDirectory, isFile) { var _a; const fileOrDirectoryExistsUsingSource2 = isFile ? fileExistsIfProjectReferenceDts : directoryExistsIfProjectReferenceDeclDir; const result = fileOrDirectoryExistsUsingSource2(fileOrDirectory); if (result !== void 0) return result; const symlinkCache = host.getSymlinkCache(); const symlinkedDirectories = symlinkCache.getSymlinkedDirectories(); if (!symlinkedDirectories) return false; const fileOrDirectoryPath = host.toPath(fileOrDirectory); if (!fileOrDirectoryPath.includes(nodeModulesPathPart)) return false; if (isFile && ((_a = symlinkCache.getSymlinkedFiles()) == null ? void 0 : _a.has(fileOrDirectoryPath))) return true; return firstDefinedIterator( symlinkedDirectories.entries(), ([directoryPath, symlinkedDirectory]) => { if (!symlinkedDirectory || !startsWith(fileOrDirectoryPath, directoryPath)) return void 0; const result2 = fileOrDirectoryExistsUsingSource2(fileOrDirectoryPath.replace(directoryPath, symlinkedDirectory.realPath)); if (isFile && result2) { const absolutePath = getNormalizedAbsolutePath(fileOrDirectory, host.compilerHost.getCurrentDirectory()); symlinkCache.setSymlinkedFile( fileOrDirectoryPath, `${symlinkedDirectory.real}${absolutePath.replace(new RegExp(directoryPath, "i"), "")}` ); } return result2; } ) || false; } } var emitSkippedWithNoDiagnostics = { diagnostics: emptyArray, sourceMaps: void 0, emittedFiles: void 0, emitSkipped: true }; function handleNoEmitOptions(program, sourceFile, writeFile2, cancellationToken) { const options = program.getCompilerOptions(); if (options.noEmit) { return sourceFile ? emitSkippedWithNoDiagnostics : program.emitBuildInfo(writeFile2, cancellationToken); } if (!options.noEmitOnError) return void 0; let diagnostics = [ ...program.getOptionsDiagnostics(cancellationToken), ...program.getSyntacticDiagnostics(sourceFile, cancellationToken), ...program.getGlobalDiagnostics(cancellationToken), ...program.getSemanticDiagnostics(sourceFile, cancellationToken) ]; if (diagnostics.length === 0 && getEmitDeclarations(program.getCompilerOptions())) { diagnostics = program.getDeclarationDiagnostics( /*sourceFile*/ void 0, cancellationToken ); } if (!diagnostics.length) return void 0; let emittedFiles; if (!sourceFile) { const emitResult = program.emitBuildInfo(writeFile2, cancellationToken); if (emitResult.diagnostics) diagnostics = [...diagnostics, ...emitResult.diagnostics]; emittedFiles = emitResult.emittedFiles; } return { diagnostics, sourceMaps: void 0, emittedFiles, emitSkipped: true }; } function filterSemanticDiagnostics(diagnostic, option) { return filter(diagnostic, (d) => !d.skippedOn || !option[d.skippedOn]); } function parseConfigHostFromCompilerHostLike(host, directoryStructureHost = host) { return { fileExists: (f) => directoryStructureHost.fileExists(f), readDirectory(root, extensions, excludes, includes, depth) { Debug.assertIsDefined(directoryStructureHost.readDirectory, "'CompilerHost.readDirectory' must be implemented to correctly process 'projectReferences'"); return directoryStructureHost.readDirectory(root, extensions, excludes, includes, depth); }, readFile: (f) => directoryStructureHost.readFile(f), directoryExists: maybeBind(directoryStructureHost, directoryStructureHost.directoryExists), getDirectories: maybeBind(directoryStructureHost, directoryStructureHost.getDirectories), realpath: maybeBind(directoryStructureHost, directoryStructureHost.realpath), useCaseSensitiveFileNames: host.useCaseSensitiveFileNames(), getCurrentDirectory: () => host.getCurrentDirectory(), onUnRecoverableConfigFileDiagnostic: host.onUnRecoverableConfigFileDiagnostic || returnUndefined, trace: host.trace ? (s) => host.trace(s) : void 0 }; } function resolveProjectReferencePath(ref) { return resolveConfigFileProjectName(ref.path); } function getResolutionDiagnostic(options, { extension }, { isDeclarationFile }) { switch (extension) { case ".ts" /* Ts */: case ".d.ts" /* Dts */: case ".mts" /* Mts */: case ".d.mts" /* Dmts */: case ".cts" /* Cts */: case ".d.cts" /* Dcts */: return void 0; case ".tsx" /* Tsx */: return needJsx(); case ".jsx" /* Jsx */: return needJsx() || needAllowJs(); case ".js" /* Js */: case ".mjs" /* Mjs */: case ".cjs" /* Cjs */: return needAllowJs(); case ".json" /* Json */: return needResolveJsonModule(); default: return needAllowArbitraryExtensions(); } function needJsx() { return options.jsx ? void 0 : Diagnostics.Module_0_was_resolved_to_1_but_jsx_is_not_set; } function needAllowJs() { return getAllowJSCompilerOption(options) || !getStrictOptionValue(options, "noImplicitAny") ? void 0 : Diagnostics.Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type; } function needResolveJsonModule() { return getResolveJsonModule(options) ? void 0 : Diagnostics.Module_0_was_resolved_to_1_but_resolveJsonModule_is_not_used; } function needAllowArbitraryExtensions() { return isDeclarationFile || options.allowArbitraryExtensions ? void 0 : Diagnostics.Module_0_was_resolved_to_1_but_allowArbitraryExtensions_is_not_set; } } function getModuleNames({ imports, moduleAugmentations }) { const res = imports.map((i) => i); for (const aug of moduleAugmentations) { if (aug.kind === 11 /* StringLiteral */) { res.push(aug); } } return res; } function getModuleNameStringLiteralAt({ imports, moduleAugmentations }, index) { if (index < imports.length) return imports[index]; let augIndex = imports.length; for (const aug of moduleAugmentations) { if (aug.kind === 11 /* StringLiteral */) { if (index === augIndex) return aug; augIndex++; } } Debug.fail("should never ask for module name at index higher than possible module name"); } // src/compiler/programDiagnostics.ts function createProgramDiagnostics(getCompilerOptionsObjectLiteralSyntax) { let computedDiagnostics; let fileReasons = createMultiMap(); let fileProcessingDiagnostics; let commonSourceDirectory; let configDiagnostics; let lazyConfigDiagnostics; let fileReasonsToChain; let reasonToRelatedInfo; return { addConfigDiagnostic(diag2) { Debug.assert(computedDiagnostics === void 0, "Cannot modify program diagnostic state after requesting combined diagnostics"); (configDiagnostics ?? (configDiagnostics = createDiagnosticCollection())).add(diag2); }, addLazyConfigDiagnostic(file, message, ...args) { Debug.assert(computedDiagnostics === void 0, "Cannot modify program diagnostic state after requesting combined diagnostics"); (lazyConfigDiagnostics ?? (lazyConfigDiagnostics = [])).push({ file, diagnostic: message, args }); }, addFileProcessingDiagnostic(diag2) { Debug.assert(computedDiagnostics === void 0, "Cannot modify program diagnostic state after requesting combined diagnostics"); (fileProcessingDiagnostics ?? (fileProcessingDiagnostics = [])).push(diag2); }, setCommonSourceDirectory(directory) { commonSourceDirectory = directory; }, reuseStateFromOldProgram(oldProgramDiagnostics, isConfigIdentical) { fileReasons = oldProgramDiagnostics.getFileReasons(); fileProcessingDiagnostics = oldProgramDiagnostics.getFileProcessingDiagnostics(); if (isConfigIdentical) { commonSourceDirectory = oldProgramDiagnostics.getCommonSourceDirectory(); configDiagnostics = oldProgramDiagnostics.getConfigDiagnostics(); lazyConfigDiagnostics = oldProgramDiagnostics.getLazyConfigDiagnostics(); } }, getFileProcessingDiagnostics() { return fileProcessingDiagnostics; }, getFileReasons() { return fileReasons; }, getCommonSourceDirectory() { return commonSourceDirectory; }, getConfigDiagnostics() { return configDiagnostics; }, getLazyConfigDiagnostics() { return lazyConfigDiagnostics; }, getCombinedDiagnostics(program) { if (computedDiagnostics) { return computedDiagnostics; } computedDiagnostics = createDiagnosticCollection(); configDiagnostics == null ? void 0 : configDiagnostics.getDiagnostics().forEach((d) => computedDiagnostics.add(d)); fileProcessingDiagnostics == null ? void 0 : fileProcessingDiagnostics.forEach((diagnostic) => { switch (diagnostic.kind) { case 1 /* FilePreprocessingFileExplainingDiagnostic */: return computedDiagnostics.add( createDiagnosticExplainingFile( program, diagnostic.file && program.getSourceFileByPath(diagnostic.file), diagnostic.fileProcessingReason, diagnostic.diagnostic, diagnostic.args || emptyArray ) ); case 0 /* FilePreprocessingLibReferenceDiagnostic */: return computedDiagnostics.add(filePreprocessingLibreferenceDiagnostic(program, diagnostic)); case 2 /* ResolutionDiagnostics */: return diagnostic.diagnostics.forEach((d) => computedDiagnostics.add(d)); default: Debug.assertNever(diagnostic); } }); lazyConfigDiagnostics == null ? void 0 : lazyConfigDiagnostics.forEach( ({ file, diagnostic, args }) => computedDiagnostics.add( createDiagnosticExplainingFile( program, file, /*fileProcessingReason*/ void 0, diagnostic, args ) ) ); fileReasonsToChain = void 0; reasonToRelatedInfo = void 0; return computedDiagnostics; } }; function filePreprocessingLibreferenceDiagnostic(program, { reason }) { const { file, pos, end } = getReferencedFileLocation(program, reason); const libReference = file.libReferenceDirectives[reason.index]; const libName = getLibNameFromLibReference(libReference); const unqualifiedLibName = removeSuffix(removePrefix(libName, "lib."), ".d.ts"); const suggestion = getSpellingSuggestion(unqualifiedLibName, libs, identity); return createFileDiagnostic( file, Debug.checkDefined(pos), Debug.checkDefined(end) - pos, suggestion ? Diagnostics.Cannot_find_lib_definition_for_0_Did_you_mean_1 : Diagnostics.Cannot_find_lib_definition_for_0, libName, suggestion ); } function createDiagnosticExplainingFile(program, file, fileProcessingReason, diagnostic, args) { let seenReasons; let fileIncludeReasons; let relatedInfo; let fileIncludeReasonDetails; let redirectInfo; let chain; const reasons = file && fileReasons.get(file.path); let locationReason = isReferencedFile(fileProcessingReason) ? fileProcessingReason : void 0; let cachedChain = file && (fileReasonsToChain == null ? void 0 : fileReasonsToChain.get(file.path)); if (cachedChain) { if (cachedChain.fileIncludeReasonDetails) { seenReasons = new Set(reasons); reasons == null ? void 0 : reasons.forEach(populateRelatedInfo); } else { reasons == null ? void 0 : reasons.forEach(processReason); } redirectInfo = cachedChain.redirectInfo; } else { reasons == null ? void 0 : reasons.forEach(processReason); redirectInfo = file && explainIfFileIsRedirectAndImpliedFormat(file, program.getCompilerOptionsForFile(file)); } if (fileProcessingReason) processReason(fileProcessingReason); const processedExtraReason = (seenReasons == null ? void 0 : seenReasons.size) !== (reasons == null ? void 0 : reasons.length); if (locationReason && (seenReasons == null ? void 0 : seenReasons.size) === 1) seenReasons = void 0; if (seenReasons && cachedChain) { if (cachedChain.details && !processedExtraReason) { chain = chainDiagnosticMessages(cachedChain.details, diagnostic, ...args ?? emptyArray); } else if (cachedChain.fileIncludeReasonDetails) { if (!processedExtraReason) { if (!cachedFileIncludeDetailsHasProcessedExtraReason()) { fileIncludeReasonDetails = cachedChain.fileIncludeReasonDetails; } else { fileIncludeReasons = cachedChain.fileIncludeReasonDetails.next.slice(0, reasons.length); } } else { if (!cachedFileIncludeDetailsHasProcessedExtraReason()) { fileIncludeReasons = [...cachedChain.fileIncludeReasonDetails.next, fileIncludeReasons[0]]; } else { fileIncludeReasons = append(cachedChain.fileIncludeReasonDetails.next.slice(0, reasons.length), fileIncludeReasons[0]); } } } } if (!chain) { if (!fileIncludeReasonDetails) fileIncludeReasonDetails = seenReasons && chainDiagnosticMessages(fileIncludeReasons, Diagnostics.The_file_is_in_the_program_because_Colon); chain = chainDiagnosticMessages( redirectInfo ? fileIncludeReasonDetails ? [fileIncludeReasonDetails, ...redirectInfo] : redirectInfo : fileIncludeReasonDetails, diagnostic, ...args || emptyArray ); } if (file) { if (cachedChain) { if (!cachedChain.fileIncludeReasonDetails || !processedExtraReason && fileIncludeReasonDetails) { cachedChain.fileIncludeReasonDetails = fileIncludeReasonDetails; } } else { (fileReasonsToChain ?? (fileReasonsToChain = /* @__PURE__ */ new Map())).set(file.path, cachedChain = { fileIncludeReasonDetails, redirectInfo }); } if (!cachedChain.details && !processedExtraReason) cachedChain.details = chain.next; } const location = locationReason && getReferencedFileLocation(program, locationReason); return location && isReferenceFileLocation(location) ? createFileDiagnosticFromMessageChain(location.file, location.pos, location.end - location.pos, chain, relatedInfo) : createCompilerDiagnosticFromMessageChain(chain, relatedInfo); function processReason(reason) { if (seenReasons == null ? void 0 : seenReasons.has(reason)) return; (seenReasons ?? (seenReasons = /* @__PURE__ */ new Set())).add(reason); (fileIncludeReasons ?? (fileIncludeReasons = [])).push(fileIncludeReasonToDiagnostics(program, reason)); populateRelatedInfo(reason); } function populateRelatedInfo(reason) { if (!locationReason && isReferencedFile(reason)) { locationReason = reason; } else if (locationReason !== reason) { relatedInfo = append(relatedInfo, getFileIncludeReasonToRelatedInformation(program, reason)); } } function cachedFileIncludeDetailsHasProcessedExtraReason() { var _a; return ((_a = cachedChain.fileIncludeReasonDetails.next) == null ? void 0 : _a.length) !== (reasons == null ? void 0 : reasons.length); } } function getFileIncludeReasonToRelatedInformation(program, reason) { let relatedInfo = reasonToRelatedInfo == null ? void 0 : reasonToRelatedInfo.get(reason); if (relatedInfo === void 0) (reasonToRelatedInfo ?? (reasonToRelatedInfo = /* @__PURE__ */ new Map())).set(reason, relatedInfo = fileIncludeReasonToRelatedInformation(program, reason) ?? false); return relatedInfo || void 0; } function fileIncludeReasonToRelatedInformation(program, reason) { if (isReferencedFile(reason)) { const referenceLocation = getReferencedFileLocation(program, reason); let message2; switch (reason.kind) { case 3 /* Import */: message2 = Diagnostics.File_is_included_via_import_here; break; case 4 /* ReferenceFile */: message2 = Diagnostics.File_is_included_via_reference_here; break; case 5 /* TypeReferenceDirective */: message2 = Diagnostics.File_is_included_via_type_library_reference_here; break; case 7 /* LibReferenceDirective */: message2 = Diagnostics.File_is_included_via_library_reference_here; break; default: Debug.assertNever(reason); } return isReferenceFileLocation(referenceLocation) ? createFileDiagnostic( referenceLocation.file, referenceLocation.pos, referenceLocation.end - referenceLocation.pos, message2 ) : void 0; } const currentDirectory = program.getCurrentDirectory(); const rootNames = program.getRootFileNames(); const options = program.getCompilerOptions(); if (!options.configFile) return void 0; let configFileNode; let message; switch (reason.kind) { case 0 /* RootFile */: if (!options.configFile.configFileSpecs) return void 0; const fileName = getNormalizedAbsolutePath(rootNames[reason.index], currentDirectory); const matchedByFiles = getMatchedFileSpec(program, fileName); if (matchedByFiles) { configFileNode = getTsConfigPropArrayElementValue(options.configFile, "files", matchedByFiles); message = Diagnostics.File_is_matched_by_files_list_specified_here; break; } const matchedByInclude = getMatchedIncludeSpec(program, fileName); if (!matchedByInclude || !isString(matchedByInclude)) return void 0; configFileNode = getTsConfigPropArrayElementValue(options.configFile, "include", matchedByInclude); message = Diagnostics.File_is_matched_by_include_pattern_specified_here; break; case 1 /* SourceFromProjectReference */: case 2 /* OutputFromProjectReference */: const resolvedProjectReferences = program.getResolvedProjectReferences(); const projectReferences = program.getProjectReferences(); const referencedResolvedRef = Debug.checkDefined(resolvedProjectReferences == null ? void 0 : resolvedProjectReferences[reason.index]); const referenceInfo = forEachProjectReference( projectReferences, resolvedProjectReferences, (resolvedRef, parent, index2) => resolvedRef === referencedResolvedRef ? { sourceFile: (parent == null ? void 0 : parent.sourceFile) || options.configFile, index: index2 } : void 0 ); if (!referenceInfo) return void 0; const { sourceFile, index } = referenceInfo; const referencesSyntax = forEachTsConfigPropArray(sourceFile, "references", (property) => isArrayLiteralExpression(property.initializer) ? property.initializer : void 0); return referencesSyntax && referencesSyntax.elements.length > index ? createDiagnosticForNodeInSourceFile( sourceFile, referencesSyntax.elements[index], reason.kind === 2 /* OutputFromProjectReference */ ? Diagnostics.File_is_output_from_referenced_project_specified_here : Diagnostics.File_is_source_from_referenced_project_specified_here ) : void 0; case 8 /* AutomaticTypeDirectiveFile */: if (!options.types) return void 0; configFileNode = getOptionsSyntaxByArrayElementValue(getCompilerOptionsObjectLiteralSyntax(), "types", reason.typeReference); message = Diagnostics.File_is_entry_point_of_type_library_specified_here; break; case 6 /* LibFile */: if (reason.index !== void 0) { configFileNode = getOptionsSyntaxByArrayElementValue(getCompilerOptionsObjectLiteralSyntax(), "lib", options.lib[reason.index]); message = Diagnostics.File_is_library_specified_here; break; } const target = getNameOfScriptTarget(getEmitScriptTarget(options)); configFileNode = target ? getOptionsSyntaxByValue(getCompilerOptionsObjectLiteralSyntax(), "target", target) : void 0; message = Diagnostics.File_is_default_library_for_target_specified_here; break; default: Debug.assertNever(reason); } return configFileNode && createDiagnosticForNodeInSourceFile( options.configFile, configFileNode, message ); } } // src/compiler/builderState.ts var BuilderState; ((BuilderState2) => { function createManyToManyPathMap() { function create2(forward, reverse, deleted) { const map2 = { getKeys: (v) => reverse.get(v), getValues: (k) => forward.get(k), keys: () => forward.keys(), size: () => forward.size, deleteKey: (k) => { (deleted || (deleted = /* @__PURE__ */ new Set())).add(k); const set = forward.get(k); if (!set) { return false; } set.forEach((v) => deleteFromMultimap(reverse, v, k)); forward.delete(k); return true; }, set: (k, vSet) => { deleted == null ? void 0 : deleted.delete(k); const existingVSet = forward.get(k); forward.set(k, vSet); existingVSet == null ? void 0 : existingVSet.forEach((v) => { if (!vSet.has(v)) { deleteFromMultimap(reverse, v, k); } }); vSet.forEach((v) => { if (!(existingVSet == null ? void 0 : existingVSet.has(v))) { addToMultimap(reverse, v, k); } }); return map2; } }; return map2; } return create2( /* @__PURE__ */ new Map(), /* @__PURE__ */ new Map(), /*deleted*/ void 0 ); } BuilderState2.createManyToManyPathMap = createManyToManyPathMap; function addToMultimap(map2, k, v) { let set = map2.get(k); if (!set) { set = /* @__PURE__ */ new Set(); map2.set(k, set); } set.add(v); } function deleteFromMultimap(map2, k, v) { const set = map2.get(k); if (set == null ? void 0 : set.delete(v)) { if (!set.size) { map2.delete(k); } return true; } return false; } function getReferencedFilesFromImportedModuleSymbol(symbol) { return mapDefined(symbol.declarations, (declaration) => { var _a; return (_a = getSourceFileOfNode(declaration)) == null ? void 0 : _a.resolvedPath; }); } function getReferencedFilesFromImportLiteral(checker, importName) { const symbol = checker.getSymbolAtLocation(importName); return symbol && getReferencedFilesFromImportedModuleSymbol(symbol); } function getReferencedFileFromFileName(program, fileName, sourceFileDirectory, getCanonicalFileName) { var _a; return toPath(((_a = program.getRedirectFromSourceFile(fileName)) == null ? void 0 : _a.outputDts) || fileName, sourceFileDirectory, getCanonicalFileName); } function getReferencedFiles(program, sourceFile, getCanonicalFileName) { let referencedFiles; if (sourceFile.imports && sourceFile.imports.length > 0) { const checker = program.getTypeChecker(); for (const importName of sourceFile.imports) { const declarationSourceFilePaths = getReferencedFilesFromImportLiteral(checker, importName); declarationSourceFilePaths == null ? void 0 : declarationSourceFilePaths.forEach(addReferencedFile); } } const sourceFileDirectory = getDirectoryPath(sourceFile.resolvedPath); if (sourceFile.referencedFiles && sourceFile.referencedFiles.length > 0) { for (const referencedFile of sourceFile.referencedFiles) { const referencedPath = getReferencedFileFromFileName(program, referencedFile.fileName, sourceFileDirectory, getCanonicalFileName); addReferencedFile(referencedPath); } } program.forEachResolvedTypeReferenceDirective(({ resolvedTypeReferenceDirective }) => { if (!resolvedTypeReferenceDirective) { return; } const fileName = resolvedTypeReferenceDirective.resolvedFileName; const typeFilePath = getReferencedFileFromFileName(program, fileName, sourceFileDirectory, getCanonicalFileName); addReferencedFile(typeFilePath); }, sourceFile); if (sourceFile.moduleAugmentations.length) { const checker = program.getTypeChecker(); for (const moduleName of sourceFile.moduleAugmentations) { if (!isStringLiteral(moduleName)) continue; const symbol = checker.getSymbolAtLocation(moduleName); if (!symbol) continue; addReferenceFromAmbientModule(symbol); } } for (const ambientModule of program.getTypeChecker().getAmbientModules()) { if (ambientModule.declarations && ambientModule.declarations.length > 1) { addReferenceFromAmbientModule(ambientModule); } } return referencedFiles; function addReferenceFromAmbientModule(symbol) { if (!symbol.declarations) { return; } for (const declaration of symbol.declarations) { const declarationSourceFile = getSourceFileOfNode(declaration); if (declarationSourceFile && declarationSourceFile !== sourceFile) { addReferencedFile(declarationSourceFile.resolvedPath); } } } function addReferencedFile(referencedPath) { (referencedFiles || (referencedFiles = /* @__PURE__ */ new Set())).add(referencedPath); } } function canReuseOldState(newReferencedMap, oldState) { return oldState && !oldState.referencedMap === !newReferencedMap; } BuilderState2.canReuseOldState = canReuseOldState; function createReferencedMap(options) { return options.module !== 0 /* None */ && !options.outFile ? createManyToManyPathMap() : void 0; } BuilderState2.createReferencedMap = createReferencedMap; function create(newProgram, oldState, disableUseFileVersionAsSignature) { var _a, _b; const fileInfos = /* @__PURE__ */ new Map(); const options = newProgram.getCompilerOptions(); const referencedMap = createReferencedMap(options); const useOldState = canReuseOldState(referencedMap, oldState); newProgram.getTypeChecker(); for (const sourceFile of newProgram.getSourceFiles()) { const version2 = Debug.checkDefined(sourceFile.version, "Program intended to be used with Builder should have source files with versions set"); const oldUncommittedSignature = useOldState ? (_a = oldState.oldSignatures) == null ? void 0 : _a.get(sourceFile.resolvedPath) : void 0; const signature = oldUncommittedSignature === void 0 ? useOldState ? (_b = oldState.fileInfos.get(sourceFile.resolvedPath)) == null ? void 0 : _b.signature : void 0 : oldUncommittedSignature || void 0; if (referencedMap) { const newReferences = getReferencedFiles(newProgram, sourceFile, newProgram.getCanonicalFileName); if (newReferences) { referencedMap.set(sourceFile.resolvedPath, newReferences); } } fileInfos.set(sourceFile.resolvedPath, { version: version2, signature, // No need to calculate affectsGlobalScope with --out since its not used at all affectsGlobalScope: !options.outFile ? isFileAffectingGlobalScope(sourceFile) || void 0 : void 0, impliedFormat: sourceFile.impliedNodeFormat }); } return { fileInfos, referencedMap, useFileVersionAsSignature: !disableUseFileVersionAsSignature && !useOldState }; } BuilderState2.create = create; function releaseCache2(state) { state.allFilesExcludingDefaultLibraryFile = void 0; state.allFileNames = void 0; } BuilderState2.releaseCache = releaseCache2; function getFilesAffectedBy(state, programOfThisState, path, cancellationToken, host) { var _a; const result = getFilesAffectedByWithOldState( state, programOfThisState, path, cancellationToken, host ); (_a = state.oldSignatures) == null ? void 0 : _a.clear(); return result; } BuilderState2.getFilesAffectedBy = getFilesAffectedBy; function getFilesAffectedByWithOldState(state, programOfThisState, path, cancellationToken, host) { const sourceFile = programOfThisState.getSourceFileByPath(path); if (!sourceFile) { return emptyArray; } if (!updateShapeSignature(state, programOfThisState, sourceFile, cancellationToken, host)) { return [sourceFile]; } return (state.referencedMap ? getFilesAffectedByUpdatedShapeWhenModuleEmit : getFilesAffectedByUpdatedShapeWhenNonModuleEmit)(state, programOfThisState, sourceFile, cancellationToken, host); } BuilderState2.getFilesAffectedByWithOldState = getFilesAffectedByWithOldState; function updateSignatureOfFile(state, signature, path) { state.fileInfos.get(path).signature = signature; (state.hasCalledUpdateShapeSignature || (state.hasCalledUpdateShapeSignature = /* @__PURE__ */ new Set())).add(path); } BuilderState2.updateSignatureOfFile = updateSignatureOfFile; function computeDtsSignature(programOfThisState, sourceFile, cancellationToken, host, onNewSignature) { programOfThisState.emit( sourceFile, (fileName, text, _writeByteOrderMark, _onError, sourceFiles, data) => { Debug.assert(isDeclarationFileName(fileName), `File extension for signature expected to be dts: Got:: ${fileName}`); onNewSignature( computeSignatureWithDiagnostics( programOfThisState, sourceFile, text, host, data ), sourceFiles ); }, cancellationToken, 2 /* BuilderSignature */, /*customTransformers*/ void 0, /*forceDtsEmit*/ true ); } BuilderState2.computeDtsSignature = computeDtsSignature; function updateShapeSignature(state, programOfThisState, sourceFile, cancellationToken, host, useFileVersionAsSignature = state.useFileVersionAsSignature) { var _a; if ((_a = state.hasCalledUpdateShapeSignature) == null ? void 0 : _a.has(sourceFile.resolvedPath)) return false; const info = state.fileInfos.get(sourceFile.resolvedPath); const prevSignature = info.signature; let latestSignature; if (!sourceFile.isDeclarationFile && !useFileVersionAsSignature) { computeDtsSignature(programOfThisState, sourceFile, cancellationToken, host, (signature) => { latestSignature = signature; if (host.storeSignatureInfo) (state.signatureInfo ?? (state.signatureInfo = /* @__PURE__ */ new Map())).set(sourceFile.resolvedPath, 0 /* ComputedDts */); }); } if (latestSignature === void 0) { latestSignature = sourceFile.version; if (host.storeSignatureInfo) (state.signatureInfo ?? (state.signatureInfo = /* @__PURE__ */ new Map())).set(sourceFile.resolvedPath, 2 /* UsedVersion */); } (state.oldSignatures || (state.oldSignatures = /* @__PURE__ */ new Map())).set(sourceFile.resolvedPath, prevSignature || false); (state.hasCalledUpdateShapeSignature || (state.hasCalledUpdateShapeSignature = /* @__PURE__ */ new Set())).add(sourceFile.resolvedPath); info.signature = latestSignature; return latestSignature !== prevSignature; } BuilderState2.updateShapeSignature = updateShapeSignature; function getAllDependencies(state, programOfThisState, sourceFile) { const compilerOptions = programOfThisState.getCompilerOptions(); if (compilerOptions.outFile) { return getAllFileNames(state, programOfThisState); } if (!state.referencedMap || isFileAffectingGlobalScope(sourceFile)) { return getAllFileNames(state, programOfThisState); } const seenMap = /* @__PURE__ */ new Set(); const queue = [sourceFile.resolvedPath]; while (queue.length) { const path = queue.pop(); if (!seenMap.has(path)) { seenMap.add(path); const references = state.referencedMap.getValues(path); if (references) { for (const key of references.keys()) { queue.push(key); } } } } return arrayFrom(mapDefinedIterator(seenMap.keys(), (path) => { var _a; return ((_a = programOfThisState.getSourceFileByPath(path)) == null ? void 0 : _a.fileName) ?? path; })); } BuilderState2.getAllDependencies = getAllDependencies; function getAllFileNames(state, programOfThisState) { if (!state.allFileNames) { const sourceFiles = programOfThisState.getSourceFiles(); state.allFileNames = sourceFiles === emptyArray ? emptyArray : sourceFiles.map((file) => file.fileName); } return state.allFileNames; } function getReferencedByPaths(state, referencedFilePath) { const keys = state.referencedMap.getKeys(referencedFilePath); return keys ? arrayFrom(keys.keys()) : []; } BuilderState2.getReferencedByPaths = getReferencedByPaths; function containsOnlyAmbientModules(sourceFile) { for (const statement of sourceFile.statements) { if (!isModuleWithStringLiteralName(statement)) { return false; } } return true; } function containsGlobalScopeAugmentation(sourceFile) { return some(sourceFile.moduleAugmentations, (augmentation) => isGlobalScopeAugmentation(augmentation.parent)); } function isFileAffectingGlobalScope(sourceFile) { return containsGlobalScopeAugmentation(sourceFile) || !isExternalOrCommonJsModule(sourceFile) && !isJsonSourceFile(sourceFile) && !containsOnlyAmbientModules(sourceFile); } function getAllFilesExcludingDefaultLibraryFile(state, programOfThisState, firstSourceFile) { if (state.allFilesExcludingDefaultLibraryFile) { return state.allFilesExcludingDefaultLibraryFile; } let result; if (firstSourceFile) addSourceFile(firstSourceFile); for (const sourceFile of programOfThisState.getSourceFiles()) { if (sourceFile !== firstSourceFile) { addSourceFile(sourceFile); } } state.allFilesExcludingDefaultLibraryFile = result || emptyArray; return state.allFilesExcludingDefaultLibraryFile; function addSourceFile(sourceFile) { if (!programOfThisState.isSourceFileDefaultLibrary(sourceFile)) { (result || (result = [])).push(sourceFile); } } } BuilderState2.getAllFilesExcludingDefaultLibraryFile = getAllFilesExcludingDefaultLibraryFile; function getFilesAffectedByUpdatedShapeWhenNonModuleEmit(state, programOfThisState, sourceFileWithUpdatedShape) { const compilerOptions = programOfThisState.getCompilerOptions(); if (compilerOptions && compilerOptions.outFile) { return [sourceFileWithUpdatedShape]; } return getAllFilesExcludingDefaultLibraryFile(state, programOfThisState, sourceFileWithUpdatedShape); } function getFilesAffectedByUpdatedShapeWhenModuleEmit(state, programOfThisState, sourceFileWithUpdatedShape, cancellationToken, host) { if (isFileAffectingGlobalScope(sourceFileWithUpdatedShape)) { return getAllFilesExcludingDefaultLibraryFile(state, programOfThisState, sourceFileWithUpdatedShape); } const compilerOptions = programOfThisState.getCompilerOptions(); if (compilerOptions && (getIsolatedModules(compilerOptions) || compilerOptions.outFile)) { return [sourceFileWithUpdatedShape]; } const seenFileNamesMap = /* @__PURE__ */ new Map(); seenFileNamesMap.set(sourceFileWithUpdatedShape.resolvedPath, sourceFileWithUpdatedShape); const queue = getReferencedByPaths(state, sourceFileWithUpdatedShape.resolvedPath); while (queue.length > 0) { const currentPath = queue.pop(); if (!seenFileNamesMap.has(currentPath)) { const currentSourceFile = programOfThisState.getSourceFileByPath(currentPath); seenFileNamesMap.set(currentPath, currentSourceFile); if (currentSourceFile && updateShapeSignature(state, programOfThisState, currentSourceFile, cancellationToken, host)) { queue.push(...getReferencedByPaths(state, currentSourceFile.resolvedPath)); } } } return arrayFrom(mapDefinedIterator(seenFileNamesMap.values(), (value) => value)); } })(BuilderState || (BuilderState = {})); // src/compiler/builder.ts function isBuilderProgramStateWithDefinedProgram(state) { return state.program !== void 0; } function toBuilderProgramStateWithDefinedProgram(state) { Debug.assert(isBuilderProgramStateWithDefinedProgram(state)); return state; } function getBuilderFileEmit(options) { let result = 1 /* Js */; if (options.sourceMap) result = result | 2 /* JsMap */; if (options.inlineSourceMap) result = result | 4 /* JsInlineMap */; if (getEmitDeclarations(options)) result = result | 24 /* Dts */; if (options.declarationMap) result = result | 32 /* DtsMap */; if (options.emitDeclarationOnly) result = result & 56 /* AllDts */; return result; } function getPendingEmitKind(optionsOrEmitKind, oldOptionsOrEmitKind) { const oldEmitKind = oldOptionsOrEmitKind && (isNumber(oldOptionsOrEmitKind) ? oldOptionsOrEmitKind : getBuilderFileEmit(oldOptionsOrEmitKind)); const emitKind = isNumber(optionsOrEmitKind) ? optionsOrEmitKind : getBuilderFileEmit(optionsOrEmitKind); if (oldEmitKind === emitKind) return 0 /* None */; if (!oldEmitKind || !emitKind) return emitKind; const diff = oldEmitKind ^ emitKind; let result = 0 /* None */; if (diff & 7 /* AllJs */) result = emitKind & 7 /* AllJs */; if (diff & 8 /* DtsErrors */) result = result | emitKind & 8 /* DtsErrors */; if (diff & 48 /* AllDtsEmit */) result = result | emitKind & 48 /* AllDtsEmit */; return result; } function hasSameKeys(map1, map2) { return map1 === map2 || map1 !== void 0 && map2 !== void 0 && map1.size === map2.size && !forEachKey(map1, (key) => !map2.has(key)); } function createBuilderProgramState(newProgram, oldState) { var _a, _b; const state = BuilderState.create( newProgram, oldState, /*disableUseFileVersionAsSignature*/ false ); state.program = newProgram; const compilerOptions = newProgram.getCompilerOptions(); state.compilerOptions = compilerOptions; const outFilePath = compilerOptions.outFile; state.semanticDiagnosticsPerFile = /* @__PURE__ */ new Map(); if (outFilePath && compilerOptions.composite && (oldState == null ? void 0 : oldState.outSignature) && outFilePath === oldState.compilerOptions.outFile) { state.outSignature = oldState.outSignature && getEmitSignatureFromOldSignature(compilerOptions, oldState.compilerOptions, oldState.outSignature); } state.changedFilesSet = /* @__PURE__ */ new Set(); state.latestChangedDtsFile = compilerOptions.composite ? oldState == null ? void 0 : oldState.latestChangedDtsFile : void 0; state.checkPending = state.compilerOptions.noCheck ? true : void 0; const useOldState = BuilderState.canReuseOldState(state.referencedMap, oldState); const oldCompilerOptions = useOldState ? oldState.compilerOptions : void 0; let canCopySemanticDiagnostics = useOldState && !compilerOptionsAffectSemanticDiagnostics(compilerOptions, oldCompilerOptions); const canCopyEmitSignatures = compilerOptions.composite && (oldState == null ? void 0 : oldState.emitSignatures) && !outFilePath && !compilerOptionsAffectDeclarationPath(compilerOptions, oldState.compilerOptions); let canCopyEmitDiagnostics = true; if (useOldState) { (_a = oldState.changedFilesSet) == null ? void 0 : _a.forEach((value) => state.changedFilesSet.add(value)); if (!outFilePath && ((_b = oldState.affectedFilesPendingEmit) == null ? void 0 : _b.size)) { state.affectedFilesPendingEmit = new Map(oldState.affectedFilesPendingEmit); state.seenAffectedFiles = /* @__PURE__ */ new Set(); } state.programEmitPending = oldState.programEmitPending; if (outFilePath && state.changedFilesSet.size) { canCopySemanticDiagnostics = false; canCopyEmitDiagnostics = false; } state.hasErrorsFromOldState = oldState.hasErrors; } else { state.buildInfoEmitPending = isIncrementalCompilation(compilerOptions); } const referencedMap = state.referencedMap; const oldReferencedMap = useOldState ? oldState.referencedMap : void 0; const copyDeclarationFileDiagnostics = canCopySemanticDiagnostics && !compilerOptions.skipLibCheck === !oldCompilerOptions.skipLibCheck; const copyLibFileDiagnostics = copyDeclarationFileDiagnostics && !compilerOptions.skipDefaultLibCheck === !oldCompilerOptions.skipDefaultLibCheck; state.fileInfos.forEach((info, sourceFilePath) => { var _a2; let oldInfo; let newReferences; if (!useOldState || // File wasn't present in old state !(oldInfo = oldState.fileInfos.get(sourceFilePath)) || // versions dont match oldInfo.version !== info.version || // Implied formats dont match oldInfo.impliedFormat !== info.impliedFormat || // Referenced files changed !hasSameKeys(newReferences = referencedMap && referencedMap.getValues(sourceFilePath), oldReferencedMap && oldReferencedMap.getValues(sourceFilePath)) || // Referenced file was deleted in the new program newReferences && forEachKey(newReferences, (path) => !state.fileInfos.has(path) && oldState.fileInfos.has(path))) { addFileToChangeSet(sourceFilePath); } else { const sourceFile = newProgram.getSourceFileByPath(sourceFilePath); const emitDiagnostics = canCopyEmitDiagnostics ? (_a2 = oldState.emitDiagnosticsPerFile) == null ? void 0 : _a2.get(sourceFilePath) : void 0; if (emitDiagnostics) { (state.emitDiagnosticsPerFile ?? (state.emitDiagnosticsPerFile = /* @__PURE__ */ new Map())).set( sourceFilePath, oldState.hasReusableDiagnostic ? convertToDiagnostics(emitDiagnostics, sourceFilePath, newProgram) : repopulateDiagnostics(emitDiagnostics, newProgram) ); } if (canCopySemanticDiagnostics) { if (sourceFile.isDeclarationFile && !copyDeclarationFileDiagnostics) return; if (sourceFile.hasNoDefaultLib && !copyLibFileDiagnostics) return; const diagnostics = oldState.semanticDiagnosticsPerFile.get(sourceFilePath); if (diagnostics) { state.semanticDiagnosticsPerFile.set( sourceFilePath, oldState.hasReusableDiagnostic ? convertToDiagnostics(diagnostics, sourceFilePath, newProgram) : repopulateDiagnostics(diagnostics, newProgram) ); (state.semanticDiagnosticsFromOldState ?? (state.semanticDiagnosticsFromOldState = /* @__PURE__ */ new Set())).add(sourceFilePath); } } } if (canCopyEmitSignatures) { const oldEmitSignature = oldState.emitSignatures.get(sourceFilePath); if (oldEmitSignature) { (state.emitSignatures ?? (state.emitSignatures = /* @__PURE__ */ new Map())).set(sourceFilePath, getEmitSignatureFromOldSignature(compilerOptions, oldState.compilerOptions, oldEmitSignature)); } } }); if (useOldState && forEachEntry(oldState.fileInfos, (info, sourceFilePath) => { if (state.fileInfos.has(sourceFilePath)) return false; if (info.affectsGlobalScope) return true; state.buildInfoEmitPending = true; return !!outFilePath; })) { BuilderState.getAllFilesExcludingDefaultLibraryFile( state, newProgram, /*firstSourceFile*/ void 0 ).forEach((file) => addFileToChangeSet(file.resolvedPath)); } else if (oldCompilerOptions) { const pendingEmitKind = compilerOptionsAffectEmit(compilerOptions, oldCompilerOptions) ? getBuilderFileEmit(compilerOptions) : getPendingEmitKind(compilerOptions, oldCompilerOptions); if (pendingEmitKind !== 0 /* None */) { if (!outFilePath) { newProgram.getSourceFiles().forEach((f) => { if (!state.changedFilesSet.has(f.resolvedPath)) { addToAffectedFilesPendingEmit( state, f.resolvedPath, pendingEmitKind ); } }); Debug.assert(!state.seenAffectedFiles || !state.seenAffectedFiles.size); state.seenAffectedFiles = state.seenAffectedFiles || /* @__PURE__ */ new Set(); } else if (!state.changedFilesSet.size) { state.programEmitPending = state.programEmitPending ? state.programEmitPending | pendingEmitKind : pendingEmitKind; } state.buildInfoEmitPending = true; } } if (useOldState && state.semanticDiagnosticsPerFile.size !== state.fileInfos.size && oldState.checkPending !== state.checkPending) state.buildInfoEmitPending = true; return state; function addFileToChangeSet(path) { state.changedFilesSet.add(path); if (outFilePath) { canCopySemanticDiagnostics = false; canCopyEmitDiagnostics = false; state.semanticDiagnosticsFromOldState = void 0; state.semanticDiagnosticsPerFile.clear(); state.emitDiagnosticsPerFile = void 0; } state.buildInfoEmitPending = true; state.programEmitPending = void 0; } } function getEmitSignatureFromOldSignature(options, oldOptions, oldEmitSignature) { return !!options.declarationMap === !!oldOptions.declarationMap ? ( // Use same format of signature oldEmitSignature ) : ( // Convert to different format isString(oldEmitSignature) ? [oldEmitSignature] : oldEmitSignature[0] ); } function repopulateDiagnostics(diagnostics, newProgram) { if (!diagnostics.length) return diagnostics; return sameMap(diagnostics, (diag2) => { if (isString(diag2.messageText)) return diag2; const repopulatedChain = convertOrRepopulateDiagnosticMessageChain(diag2.messageText, diag2.file, newProgram, (chain) => { var _a; return (_a = chain.repopulateInfo) == null ? void 0 : _a.call(chain); }); return repopulatedChain === diag2.messageText ? diag2 : { ...diag2, messageText: repopulatedChain }; }); } function convertOrRepopulateDiagnosticMessageChain(chain, sourceFile, newProgram, repopulateInfo) { const info = repopulateInfo(chain); if (info === true) { return { ...createModeMismatchDetails(sourceFile), next: convertOrRepopulateDiagnosticMessageChainArray(chain.next, sourceFile, newProgram, repopulateInfo) }; } else if (info) { return { ...createModuleNotFoundChain(sourceFile, newProgram, info.moduleReference, info.mode, info.packageName || info.moduleReference), next: convertOrRepopulateDiagnosticMessageChainArray(chain.next, sourceFile, newProgram, repopulateInfo) }; } const next = convertOrRepopulateDiagnosticMessageChainArray(chain.next, sourceFile, newProgram, repopulateInfo); return next === chain.next ? chain : { ...chain, next }; } function convertOrRepopulateDiagnosticMessageChainArray(array, sourceFile, newProgram, repopulateInfo) { return sameMap(array, (chain) => convertOrRepopulateDiagnosticMessageChain(chain, sourceFile, newProgram, repopulateInfo)); } function convertToDiagnostics(diagnostics, diagnosticFilePath, newProgram) { if (!diagnostics.length) return emptyArray; let buildInfoDirectory; return diagnostics.map((diagnostic) => { const result = convertToDiagnosticRelatedInformation(diagnostic, diagnosticFilePath, newProgram, toPathInBuildInfoDirectory); result.reportsUnnecessary = diagnostic.reportsUnnecessary; result.reportsDeprecated = diagnostic.reportDeprecated; result.source = diagnostic.source; result.skippedOn = diagnostic.skippedOn; const { relatedInformation } = diagnostic; result.relatedInformation = relatedInformation ? relatedInformation.length ? relatedInformation.map((r) => convertToDiagnosticRelatedInformation(r, diagnosticFilePath, newProgram, toPathInBuildInfoDirectory)) : [] : void 0; return result; }); function toPathInBuildInfoDirectory(path) { buildInfoDirectory ?? (buildInfoDirectory = getDirectoryPath(getNormalizedAbsolutePath(getTsBuildInfoEmitOutputFilePath(newProgram.getCompilerOptions()), newProgram.getCurrentDirectory()))); return toPath(path, buildInfoDirectory, newProgram.getCanonicalFileName); } } function convertToDiagnosticRelatedInformation(diagnostic, diagnosticFilePath, newProgram, toPath3) { const { file } = diagnostic; const sourceFile = file !== false ? newProgram.getSourceFileByPath(file ? toPath3(file) : diagnosticFilePath) : void 0; return { ...diagnostic, file: sourceFile, messageText: isString(diagnostic.messageText) ? diagnostic.messageText : convertOrRepopulateDiagnosticMessageChain(diagnostic.messageText, sourceFile, newProgram, (chain) => chain.info) }; } function releaseCache(state) { BuilderState.releaseCache(state); state.program = void 0; } function assertSourceFileOkWithoutNextAffectedCall(state, sourceFile) { Debug.assert(!sourceFile || !state.affectedFiles || state.affectedFiles[state.affectedFilesIndex - 1] !== sourceFile || !state.semanticDiagnosticsPerFile.has(sourceFile.resolvedPath)); } function getNextAffectedFile(state, cancellationToken, host) { var _a; while (true) { const { affectedFiles } = state; if (affectedFiles) { const seenAffectedFiles = state.seenAffectedFiles; let affectedFilesIndex = state.affectedFilesIndex; while (affectedFilesIndex < affectedFiles.length) { const affectedFile = affectedFiles[affectedFilesIndex]; if (!seenAffectedFiles.has(affectedFile.resolvedPath)) { state.affectedFilesIndex = affectedFilesIndex; addToAffectedFilesPendingEmit( state, affectedFile.resolvedPath, getBuilderFileEmit(state.compilerOptions) ); handleDtsMayChangeOfAffectedFile( state, affectedFile, cancellationToken, host ); return affectedFile; } affectedFilesIndex++; } state.changedFilesSet.delete(state.currentChangedFilePath); state.currentChangedFilePath = void 0; (_a = state.oldSignatures) == null ? void 0 : _a.clear(); state.affectedFiles = void 0; } const nextKey = state.changedFilesSet.keys().next(); if (nextKey.done) { return void 0; } const compilerOptions = state.program.getCompilerOptions(); if (compilerOptions.outFile) return state.program; state.affectedFiles = BuilderState.getFilesAffectedByWithOldState( state, state.program, nextKey.value, cancellationToken, host ); state.currentChangedFilePath = nextKey.value; state.affectedFilesIndex = 0; if (!state.seenAffectedFiles) state.seenAffectedFiles = /* @__PURE__ */ new Set(); } } function clearAffectedFilesPendingEmit(state, emitOnlyDtsFiles, isForDtsErrors) { var _a, _b; if (!((_a = state.affectedFilesPendingEmit) == null ? void 0 : _a.size) && !state.programEmitPending) return; if (!emitOnlyDtsFiles && !isForDtsErrors) { state.affectedFilesPendingEmit = void 0; state.programEmitPending = void 0; } (_b = state.affectedFilesPendingEmit) == null ? void 0 : _b.forEach((emitKind, path) => { const pending = !isForDtsErrors ? emitKind & 7 /* AllJs */ : emitKind & (7 /* AllJs */ | 48 /* AllDtsEmit */); if (!pending) state.affectedFilesPendingEmit.delete(path); else state.affectedFilesPendingEmit.set(path, pending); }); if (state.programEmitPending) { const pending = !isForDtsErrors ? state.programEmitPending & 7 /* AllJs */ : state.programEmitPending & (7 /* AllJs */ | 48 /* AllDtsEmit */); if (!pending) state.programEmitPending = void 0; else state.programEmitPending = pending; } } function getPendingEmitKindWithSeen(optionsOrEmitKind, seenOldOptionsOrEmitKind, emitOnlyDtsFiles, isForDtsErrors) { let pendingKind = getPendingEmitKind(optionsOrEmitKind, seenOldOptionsOrEmitKind); if (emitOnlyDtsFiles) pendingKind = pendingKind & 56 /* AllDts */; if (isForDtsErrors) pendingKind = pendingKind & 8 /* DtsErrors */; return pendingKind; } function getBuilderFileEmitAllDts(isForDtsErrors) { return !isForDtsErrors ? 56 /* AllDts */ : 8 /* DtsErrors */; } function getNextAffectedFilePendingEmit(state, emitOnlyDtsFiles, isForDtsErrors) { var _a; if (!((_a = state.affectedFilesPendingEmit) == null ? void 0 : _a.size)) return void 0; return forEachEntry(state.affectedFilesPendingEmit, (emitKind, path) => { var _a2; const affectedFile = state.program.getSourceFileByPath(path); if (!affectedFile || !sourceFileMayBeEmitted(affectedFile, state.program)) { state.affectedFilesPendingEmit.delete(path); return void 0; } const seenKind = (_a2 = state.seenEmittedFiles) == null ? void 0 : _a2.get(affectedFile.resolvedPath); const pendingKind = getPendingEmitKindWithSeen( emitKind, seenKind, emitOnlyDtsFiles, isForDtsErrors ); if (pendingKind) return { affectedFile, emitKind: pendingKind }; }); } function getNextPendingEmitDiagnosticsFile(state, isForDtsErrors) { var _a; if (!((_a = state.emitDiagnosticsPerFile) == null ? void 0 : _a.size)) return void 0; return forEachEntry(state.emitDiagnosticsPerFile, (diagnostics, path) => { var _a2; const affectedFile = state.program.getSourceFileByPath(path); if (!affectedFile || !sourceFileMayBeEmitted(affectedFile, state.program)) { state.emitDiagnosticsPerFile.delete(path); return void 0; } const seenKind = ((_a2 = state.seenEmittedFiles) == null ? void 0 : _a2.get(affectedFile.resolvedPath)) || 0 /* None */; if (!(seenKind & getBuilderFileEmitAllDts(isForDtsErrors))) return { affectedFile, diagnostics, seenKind }; }); } function removeDiagnosticsOfLibraryFiles(state) { if (!state.cleanedDiagnosticsOfLibFiles) { state.cleanedDiagnosticsOfLibFiles = true; const options = state.program.getCompilerOptions(); forEach(state.program.getSourceFiles(), (f) => state.program.isSourceFileDefaultLibrary(f) && !skipTypeCheckingIgnoringNoCheck(f, options, state.program) && removeSemanticDiagnosticsOf(state, f.resolvedPath)); } } function handleDtsMayChangeOfAffectedFile(state, affectedFile, cancellationToken, host) { removeSemanticDiagnosticsOf(state, affectedFile.resolvedPath); if (state.allFilesExcludingDefaultLibraryFile === state.affectedFiles) { removeDiagnosticsOfLibraryFiles(state); BuilderState.updateShapeSignature( state, state.program, affectedFile, cancellationToken, host ); return; } if (state.compilerOptions.assumeChangesOnlyAffectDirectDependencies) return; handleDtsMayChangeOfReferencingExportOfAffectedFile( state, affectedFile, cancellationToken, host ); } function handleDtsMayChangeOf(state, path, invalidateJsFiles, cancellationToken, host) { removeSemanticDiagnosticsOf(state, path); if (!state.changedFilesSet.has(path)) { const sourceFile = state.program.getSourceFileByPath(path); if (sourceFile) { BuilderState.updateShapeSignature( state, state.program, sourceFile, cancellationToken, host, /*useFileVersionAsSignature*/ true ); if (invalidateJsFiles) { addToAffectedFilesPendingEmit( state, path, getBuilderFileEmit(state.compilerOptions) ); } else if (getEmitDeclarations(state.compilerOptions)) { addToAffectedFilesPendingEmit( state, path, state.compilerOptions.declarationMap ? 56 /* AllDts */ : 24 /* Dts */ ); } } } } function removeSemanticDiagnosticsOf(state, path) { if (!state.semanticDiagnosticsFromOldState) { return true; } state.semanticDiagnosticsFromOldState.delete(path); state.semanticDiagnosticsPerFile.delete(path); return !state.semanticDiagnosticsFromOldState.size; } function isChangedSignature(state, path) { const oldSignature = Debug.checkDefined(state.oldSignatures).get(path) || void 0; const newSignature = Debug.checkDefined(state.fileInfos.get(path)).signature; return newSignature !== oldSignature; } function handleDtsMayChangeOfGlobalScope(state, filePath, invalidateJsFiles, cancellationToken, host) { var _a; if (!((_a = state.fileInfos.get(filePath)) == null ? void 0 : _a.affectsGlobalScope)) return false; BuilderState.getAllFilesExcludingDefaultLibraryFile( state, state.program, /*firstSourceFile*/ void 0 ).forEach( (file) => handleDtsMayChangeOf( state, file.resolvedPath, invalidateJsFiles, cancellationToken, host ) ); removeDiagnosticsOfLibraryFiles(state); return true; } function handleDtsMayChangeOfReferencingExportOfAffectedFile(state, affectedFile, cancellationToken, host) { var _a, _b; if (!state.referencedMap || !state.changedFilesSet.has(affectedFile.resolvedPath)) return; if (!isChangedSignature(state, affectedFile.resolvedPath)) return; if (getIsolatedModules(state.compilerOptions)) { const seenFileNamesMap = /* @__PURE__ */ new Map(); seenFileNamesMap.set(affectedFile.resolvedPath, true); const queue = BuilderState.getReferencedByPaths(state, affectedFile.resolvedPath); while (queue.length > 0) { const currentPath = queue.pop(); if (!seenFileNamesMap.has(currentPath)) { seenFileNamesMap.set(currentPath, true); if (handleDtsMayChangeOfGlobalScope( state, currentPath, /*invalidateJsFiles*/ false, cancellationToken, host )) return; handleDtsMayChangeOf( state, currentPath, /*invalidateJsFiles*/ false, cancellationToken, host ); if (isChangedSignature(state, currentPath)) { const currentSourceFile = state.program.getSourceFileByPath(currentPath); queue.push(...BuilderState.getReferencedByPaths(state, currentSourceFile.resolvedPath)); } } } } const seenFileAndExportsOfFile = /* @__PURE__ */ new Set(); const invalidateJsFiles = !!((_a = affectedFile.symbol) == null ? void 0 : _a.exports) && !!forEachEntry( affectedFile.symbol.exports, (exported) => { if ((exported.flags & 128 /* ConstEnum */) !== 0) return true; const aliased = skipAlias(exported, state.program.getTypeChecker()); if (aliased === exported) return false; return (aliased.flags & 128 /* ConstEnum */) !== 0 && some(aliased.declarations, (d) => getSourceFileOfNode(d) === affectedFile); } ); (_b = state.referencedMap.getKeys(affectedFile.resolvedPath)) == null ? void 0 : _b.forEach((exportedFromPath) => { if (handleDtsMayChangeOfGlobalScope(state, exportedFromPath, invalidateJsFiles, cancellationToken, host)) return true; const references = state.referencedMap.getKeys(exportedFromPath); return references && forEachKey(references, (filePath) => handleDtsMayChangeOfFileAndExportsOfFile( state, filePath, invalidateJsFiles, seenFileAndExportsOfFile, cancellationToken, host )); }); } function handleDtsMayChangeOfFileAndExportsOfFile(state, filePath, invalidateJsFiles, seenFileAndExportsOfFile, cancellationToken, host) { var _a; if (!tryAddToSet(seenFileAndExportsOfFile, filePath)) return void 0; if (handleDtsMayChangeOfGlobalScope(state, filePath, invalidateJsFiles, cancellationToken, host)) return true; handleDtsMayChangeOf(state, filePath, invalidateJsFiles, cancellationToken, host); (_a = state.referencedMap.getKeys(filePath)) == null ? void 0 : _a.forEach( (referencingFilePath) => handleDtsMayChangeOfFileAndExportsOfFile( state, referencingFilePath, invalidateJsFiles, seenFileAndExportsOfFile, cancellationToken, host ) ); return void 0; } function getSemanticDiagnosticsOfFile(state, sourceFile, cancellationToken, semanticDiagnosticsPerFile) { if (state.compilerOptions.noCheck) return emptyArray; return concatenate( getBinderAndCheckerDiagnosticsOfFile(state, sourceFile, cancellationToken, semanticDiagnosticsPerFile), state.program.getProgramDiagnostics(sourceFile) ); } function getBinderAndCheckerDiagnosticsOfFile(state, sourceFile, cancellationToken, semanticDiagnosticsPerFile) { semanticDiagnosticsPerFile ?? (semanticDiagnosticsPerFile = state.semanticDiagnosticsPerFile); const path = sourceFile.resolvedPath; const cachedDiagnostics = semanticDiagnosticsPerFile.get(path); if (cachedDiagnostics) { return filterSemanticDiagnostics(cachedDiagnostics, state.compilerOptions); } const diagnostics = state.program.getBindAndCheckDiagnostics(sourceFile, cancellationToken); semanticDiagnosticsPerFile.set(path, diagnostics); state.buildInfoEmitPending = true; return filterSemanticDiagnostics(diagnostics, state.compilerOptions); } function isIncrementalBundleEmitBuildInfo(info) { var _a; return !!((_a = info.options) == null ? void 0 : _a.outFile); } function isIncrementalBuildInfo(info) { return !!info.fileNames; } function isNonIncrementalBuildInfo(info) { return !isIncrementalBuildInfo(info) && !!info.root; } function ensureHasErrorsForState(state) { if (state.hasErrors !== void 0) return; if (isIncrementalCompilation(state.compilerOptions)) { state.hasErrors = !some(state.program.getSourceFiles(), (f) => { var _a, _b; const bindAndCheckDiagnostics = state.semanticDiagnosticsPerFile.get(f.resolvedPath); return bindAndCheckDiagnostics === void 0 || // Missing semantic diagnostics in cache will be encoded in buildInfo !!bindAndCheckDiagnostics.length || // cached semantic diagnostics will be encoded in buildInfo !!((_b = (_a = state.emitDiagnosticsPerFile) == null ? void 0 : _a.get(f.resolvedPath)) == null ? void 0 : _b.length); }) && (hasSyntaxOrGlobalErrors(state) || some(state.program.getSourceFiles(), (f) => !!state.program.getProgramDiagnostics(f).length)); } else { state.hasErrors = some(state.program.getSourceFiles(), (f) => { var _a, _b; const bindAndCheckDiagnostics = state.semanticDiagnosticsPerFile.get(f.resolvedPath); return !!(bindAndCheckDiagnostics == null ? void 0 : bindAndCheckDiagnostics.length) || // If has semantic diagnostics !!((_b = (_a = state.emitDiagnosticsPerFile) == null ? void 0 : _a.get(f.resolvedPath)) == null ? void 0 : _b.length); }) || hasSyntaxOrGlobalErrors(state); } } function hasSyntaxOrGlobalErrors(state) { return !!state.program.getConfigFileParsingDiagnostics().length || !!state.program.getSyntacticDiagnostics().length || !!state.program.getOptionsDiagnostics().length || !!state.program.getGlobalDiagnostics().length; } function getBuildInfoEmitPending(state) { ensureHasErrorsForState(state); return state.buildInfoEmitPending ?? (state.buildInfoEmitPending = !!state.hasErrorsFromOldState !== !!state.hasErrors); } function getBuildInfo2(state) { var _a, _b; const currentDirectory = state.program.getCurrentDirectory(); const buildInfoDirectory = getDirectoryPath(getNormalizedAbsolutePath(getTsBuildInfoEmitOutputFilePath(state.compilerOptions), currentDirectory)); const latestChangedDtsFile = state.latestChangedDtsFile ? relativeToBuildInfoEnsuringAbsolutePath(state.latestChangedDtsFile) : void 0; const fileNames = []; const fileNameToFileId = /* @__PURE__ */ new Map(); const rootFileNames = new Set(state.program.getRootFileNames().map((f) => toPath(f, currentDirectory, state.program.getCanonicalFileName))); ensureHasErrorsForState(state); if (!isIncrementalCompilation(state.compilerOptions)) { const buildInfo2 = { root: arrayFrom(rootFileNames, (r) => relativeToBuildInfo(r)), errors: state.hasErrors ? true : void 0, checkPending: state.checkPending, version }; return buildInfo2; } const root = []; if (state.compilerOptions.outFile) { const fileInfos2 = arrayFrom(state.fileInfos.entries(), ([key, value]) => { const fileId = toFileId(key); tryAddRoot(key, fileId); return value.impliedFormat ? { version: value.version, impliedFormat: value.impliedFormat, signature: void 0, affectsGlobalScope: void 0 } : value.version; }); const buildInfo2 = { fileNames, fileInfos: fileInfos2, root, resolvedRoot: toResolvedRoot(), options: toIncrementalBuildInfoCompilerOptions(state.compilerOptions), semanticDiagnosticsPerFile: !state.changedFilesSet.size ? toIncrementalBuildInfoDiagnostics() : void 0, emitDiagnosticsPerFile: toIncrementalBuildInfoEmitDiagnostics(), changeFileSet: toChangeFileSet(), outSignature: state.outSignature, latestChangedDtsFile, pendingEmit: !state.programEmitPending ? void 0 : ( // Pending is undefined or None is encoded as undefined state.programEmitPending === getBuilderFileEmit(state.compilerOptions) ? false : ( // Pending emit is same as deteremined by compilerOptions state.programEmitPending ) ), // Actual value errors: state.hasErrors ? true : void 0, checkPending: state.checkPending, version }; return buildInfo2; } let fileIdsList; let fileNamesToFileIdListId; let emitSignatures; const fileInfos = arrayFrom(state.fileInfos.entries(), ([key, value]) => { var _a2, _b2; const fileId = toFileId(key); tryAddRoot(key, fileId); Debug.assert(fileNames[fileId - 1] === relativeToBuildInfo(key)); const oldSignature = (_a2 = state.oldSignatures) == null ? void 0 : _a2.get(key); const actualSignature = oldSignature !== void 0 ? oldSignature || void 0 : value.signature; if (state.compilerOptions.composite) { const file = state.program.getSourceFileByPath(key); if (!isJsonSourceFile(file) && sourceFileMayBeEmitted(file, state.program)) { const emitSignature = (_b2 = state.emitSignatures) == null ? void 0 : _b2.get(key); if (emitSignature !== actualSignature) { emitSignatures = append( emitSignatures, emitSignature === void 0 ? fileId : ( // There is no emit, encode as false // fileId, signature: emptyArray if signature only differs in dtsMap option than our own compilerOptions otherwise EmitSignature [fileId, !isString(emitSignature) && emitSignature[0] === actualSignature ? emptyArray : emitSignature] ) ); } } } return value.version === actualSignature ? value.affectsGlobalScope || value.impliedFormat ? ( // If file version is same as signature, dont serialize signature { version: value.version, signature: void 0, affectsGlobalScope: value.affectsGlobalScope, impliedFormat: value.impliedFormat } ) : ( // If file info only contains version and signature and both are same we can just write string value.version ) : actualSignature !== void 0 ? ( // If signature is not same as version, encode signature in the fileInfo oldSignature === void 0 ? ( // If we havent computed signature, use fileInfo as is value ) : ( // Serialize fileInfo with new updated signature { version: value.version, signature: actualSignature, affectsGlobalScope: value.affectsGlobalScope, impliedFormat: value.impliedFormat } ) ) : ( // Signature of the FileInfo is undefined, serialize it as false { version: value.version, signature: false, affectsGlobalScope: value.affectsGlobalScope, impliedFormat: value.impliedFormat } ); }); let referencedMap; if ((_a = state.referencedMap) == null ? void 0 : _a.size()) { referencedMap = arrayFrom(state.referencedMap.keys()).sort(compareStringsCaseSensitive).map((key) => [ toFileId(key), toFileIdListId(state.referencedMap.getValues(key)) ]); } const semanticDiagnosticsPerFile = toIncrementalBuildInfoDiagnostics(); let affectedFilesPendingEmit; if ((_b = state.affectedFilesPendingEmit) == null ? void 0 : _b.size) { const fullEmitForOptions = getBuilderFileEmit(state.compilerOptions); const seenFiles = /* @__PURE__ */ new Set(); for (const path of arrayFrom(state.affectedFilesPendingEmit.keys()).sort(compareStringsCaseSensitive)) { if (tryAddToSet(seenFiles, path)) { const file = state.program.getSourceFileByPath(path); if (!file || !sourceFileMayBeEmitted(file, state.program)) continue; const fileId = toFileId(path), pendingEmit = state.affectedFilesPendingEmit.get(path); affectedFilesPendingEmit = append( affectedFilesPendingEmit, pendingEmit === fullEmitForOptions ? fileId : ( // Pending full emit per options pendingEmit === 24 /* Dts */ ? [fileId] : ( // Pending on Dts only [fileId, pendingEmit] ) ) // Anything else ); } } } const buildInfo = { fileNames, fileIdsList, fileInfos, root, resolvedRoot: toResolvedRoot(), options: toIncrementalBuildInfoCompilerOptions(state.compilerOptions), referencedMap, semanticDiagnosticsPerFile, emitDiagnosticsPerFile: toIncrementalBuildInfoEmitDiagnostics(), changeFileSet: toChangeFileSet(), affectedFilesPendingEmit, emitSignatures, latestChangedDtsFile, errors: state.hasErrors ? true : void 0, checkPending: state.checkPending, version }; return buildInfo; function relativeToBuildInfoEnsuringAbsolutePath(path) { return relativeToBuildInfo(getNormalizedAbsolutePath(path, currentDirectory)); } function relativeToBuildInfo(path) { return ensurePathIsNonModuleName(getRelativePathFromDirectory(buildInfoDirectory, path, state.program.getCanonicalFileName)); } function toFileId(path) { let fileId = fileNameToFileId.get(path); if (fileId === void 0) { fileNames.push(relativeToBuildInfo(path)); fileNameToFileId.set(path, fileId = fileNames.length); } return fileId; } function toFileIdListId(set) { const fileIds = arrayFrom(set.keys(), toFileId).sort(compareValues); const key = fileIds.join(); let fileIdListId = fileNamesToFileIdListId == null ? void 0 : fileNamesToFileIdListId.get(key); if (fileIdListId === void 0) { fileIdsList = append(fileIdsList, fileIds); (fileNamesToFileIdListId ?? (fileNamesToFileIdListId = /* @__PURE__ */ new Map())).set(key, fileIdListId = fileIdsList.length); } return fileIdListId; } function tryAddRoot(path, fileId) { const file = state.program.getSourceFile(path); if (!state.program.getFileIncludeReasons().get(file.path).some((r) => r.kind === 0 /* RootFile */)) return; if (!root.length) return root.push(fileId); const last2 = root[root.length - 1]; const isLastStartEnd = isArray(last2); if (isLastStartEnd && last2[1] === fileId - 1) return last2[1] = fileId; if (isLastStartEnd || root.length === 1 || last2 !== fileId - 1) return root.push(fileId); const lastButOne = root[root.length - 2]; if (!isNumber(lastButOne) || lastButOne !== last2 - 1) return root.push(fileId); root[root.length - 2] = [lastButOne, fileId]; return root.length = root.length - 1; } function toResolvedRoot() { let result; rootFileNames.forEach((path) => { const file = state.program.getSourceFileByPath(path); if (file && path !== file.resolvedPath) { result = append(result, [toFileId(file.resolvedPath), toFileId(path)]); } }); return result; } function toIncrementalBuildInfoCompilerOptions(options) { let result; const { optionsNameMap } = getOptionsNameMap(); for (const name of getOwnKeys(options).sort(compareStringsCaseSensitive)) { const optionInfo = optionsNameMap.get(name.toLowerCase()); if (optionInfo == null ? void 0 : optionInfo.affectsBuildInfo) { (result || (result = {}))[name] = toReusableCompilerOptionValue( optionInfo, options[name] ); } } return result; } function toReusableCompilerOptionValue(option, value) { if (option) { Debug.assert(option.type !== "listOrElement"); if (option.type === "list") { const values = value; if (option.element.isFilePath && values.length) { return values.map(relativeToBuildInfoEnsuringAbsolutePath); } } else if (option.isFilePath) { return relativeToBuildInfoEnsuringAbsolutePath(value); } } return value; } function toIncrementalBuildInfoDiagnostics() { let result; state.fileInfos.forEach((_value, key) => { const value = state.semanticDiagnosticsPerFile.get(key); if (!value) { if (!state.changedFilesSet.has(key)) result = append(result, toFileId(key)); } else if (value.length) { result = append(result, [ toFileId(key), toReusableDiagnostic(value, key) ]); } }); return result; } function toIncrementalBuildInfoEmitDiagnostics() { var _a2; let result; if (!((_a2 = state.emitDiagnosticsPerFile) == null ? void 0 : _a2.size)) return result; for (const key of arrayFrom(state.emitDiagnosticsPerFile.keys()).sort(compareStringsCaseSensitive)) { const value = state.emitDiagnosticsPerFile.get(key); result = append(result, [ toFileId(key), toReusableDiagnostic(value, key) ]); } return result; } function toReusableDiagnostic(diagnostics, diagnosticFilePath) { Debug.assert(!!diagnostics.length); return diagnostics.map((diagnostic) => { const result = toReusableDiagnosticRelatedInformation(diagnostic, diagnosticFilePath); result.reportsUnnecessary = diagnostic.reportsUnnecessary; result.reportDeprecated = diagnostic.reportsDeprecated; result.source = diagnostic.source; result.skippedOn = diagnostic.skippedOn; const { relatedInformation } = diagnostic; result.relatedInformation = relatedInformation ? relatedInformation.length ? relatedInformation.map((r) => toReusableDiagnosticRelatedInformation(r, diagnosticFilePath)) : [] : void 0; return result; }); } function toReusableDiagnosticRelatedInformation(diagnostic, diagnosticFilePath) { const { file } = diagnostic; return { ...diagnostic, file: file ? file.resolvedPath === diagnosticFilePath ? void 0 : relativeToBuildInfo(file.resolvedPath) : false, messageText: isString(diagnostic.messageText) ? diagnostic.messageText : toReusableDiagnosticMessageChain(diagnostic.messageText) }; } function toReusableDiagnosticMessageChain(chain) { if (chain.repopulateInfo) { return { info: chain.repopulateInfo(), next: toReusableDiagnosticMessageChainArray(chain.next) }; } const next = toReusableDiagnosticMessageChainArray(chain.next); return next === chain.next ? chain : { ...chain, next }; } function toReusableDiagnosticMessageChainArray(array) { if (!array) return array; return forEach(array, (chain, index) => { const reusable = toReusableDiagnosticMessageChain(chain); if (chain === reusable) return void 0; const result = index > 0 ? array.slice(0, index - 1) : []; result.push(reusable); for (let i = index + 1; i < array.length; i++) { result.push(toReusableDiagnosticMessageChain(array[i])); } return result; }) || array; } function toChangeFileSet() { let changeFileSet; if (state.changedFilesSet.size) { for (const path of arrayFrom(state.changedFilesSet.keys()).sort(compareStringsCaseSensitive)) { changeFileSet = append(changeFileSet, toFileId(path)); } } return changeFileSet; } } function getBuilderCreationParameters(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics, projectReferences) { let host; let newProgram; let oldProgram; if (newProgramOrRootNames === void 0) { Debug.assert(hostOrOptions === void 0); host = oldProgramOrHost; oldProgram = configFileParsingDiagnosticsOrOldProgram; Debug.assert(!!oldProgram); newProgram = oldProgram.getProgram(); } else if (isArray(newProgramOrRootNames)) { oldProgram = configFileParsingDiagnosticsOrOldProgram; newProgram = createProgram({ rootNames: newProgramOrRootNames, options: hostOrOptions, host: oldProgramOrHost, oldProgram: oldProgram && oldProgram.getProgramOrUndefined(), configFileParsingDiagnostics, projectReferences }); host = oldProgramOrHost; } else { newProgram = newProgramOrRootNames; host = hostOrOptions; oldProgram = oldProgramOrHost; configFileParsingDiagnostics = configFileParsingDiagnosticsOrOldProgram; } return { host, newProgram, oldProgram, configFileParsingDiagnostics: configFileParsingDiagnostics || emptyArray }; } function getTextHandlingSourceMapForSignature(text, data) { return (data == null ? void 0 : data.sourceMapUrlPos) !== void 0 ? text.substring(0, data.sourceMapUrlPos) : text; } function computeSignatureWithDiagnostics(program, sourceFile, text, host, data) { var _a; text = getTextHandlingSourceMapForSignature(text, data); let sourceFileDirectory; if ((_a = data == null ? void 0 : data.diagnostics) == null ? void 0 : _a.length) { text += data.diagnostics.map((diagnostic) => `${locationInfo(diagnostic)}${DiagnosticCategory[diagnostic.category]}${diagnostic.code}: ${flattenDiagnosticMessageText2(diagnostic.messageText)}`).join("\n"); } return (host.createHash ?? generateDjb2Hash)(text); function flattenDiagnosticMessageText2(diagnostic) { return isString(diagnostic) ? diagnostic : diagnostic === void 0 ? "" : !diagnostic.next ? diagnostic.messageText : diagnostic.messageText + diagnostic.next.map(flattenDiagnosticMessageText2).join("\n"); } function locationInfo(diagnostic) { if (diagnostic.file.resolvedPath === sourceFile.resolvedPath) return `(${diagnostic.start},${diagnostic.length})`; if (sourceFileDirectory === void 0) sourceFileDirectory = getDirectoryPath(sourceFile.resolvedPath); return `${ensurePathIsNonModuleName(getRelativePathFromDirectory( sourceFileDirectory, diagnostic.file.resolvedPath, program.getCanonicalFileName ))}(${diagnostic.start},${diagnostic.length})`; } } function computeSignature(text, host, data) { return (host.createHash ?? generateDjb2Hash)(getTextHandlingSourceMapForSignature(text, data)); } function createBuilderProgram(kind, { newProgram, host, oldProgram, configFileParsingDiagnostics }) { let oldState = oldProgram && oldProgram.state; if (oldState && newProgram === oldState.program && configFileParsingDiagnostics === newProgram.getConfigFileParsingDiagnostics()) { newProgram = void 0; oldState = void 0; return oldProgram; } const state = createBuilderProgramState(newProgram, oldState); newProgram.getBuildInfo = () => getBuildInfo2(toBuilderProgramStateWithDefinedProgram(state)); newProgram = void 0; oldProgram = void 0; oldState = void 0; const builderProgram = createRedirectedBuilderProgram(state, configFileParsingDiagnostics); builderProgram.state = state; builderProgram.hasChangedEmitSignature = () => !!state.hasChangedEmitSignature; builderProgram.getAllDependencies = (sourceFile) => BuilderState.getAllDependencies( state, Debug.checkDefined(state.program), sourceFile ); builderProgram.getSemanticDiagnostics = getSemanticDiagnostics; builderProgram.getDeclarationDiagnostics = getDeclarationDiagnostics2; builderProgram.emit = emit; builderProgram.releaseProgram = () => releaseCache(state); if (kind === 0 /* SemanticDiagnosticsBuilderProgram */) { builderProgram.getSemanticDiagnosticsOfNextAffectedFile = getSemanticDiagnosticsOfNextAffectedFile; } else if (kind === 1 /* EmitAndSemanticDiagnosticsBuilderProgram */) { builderProgram.getSemanticDiagnosticsOfNextAffectedFile = getSemanticDiagnosticsOfNextAffectedFile; builderProgram.emitNextAffectedFile = emitNextAffectedFile; builderProgram.emitBuildInfo = emitBuildInfo; } else { notImplemented(); } return builderProgram; function emitBuildInfo(writeFile2, cancellationToken) { Debug.assert(isBuilderProgramStateWithDefinedProgram(state)); if (getBuildInfoEmitPending(state)) { const result = state.program.emitBuildInfo( writeFile2 || maybeBind(host, host.writeFile), cancellationToken ); state.buildInfoEmitPending = false; return result; } return emitSkippedWithNoDiagnostics; } function emitNextAffectedFileOrDtsErrors(writeFile2, cancellationToken, emitOnlyDtsFiles, customTransformers, isForDtsErrors) { var _a, _b, _c, _d; Debug.assert(isBuilderProgramStateWithDefinedProgram(state)); let affected = getNextAffectedFile(state, cancellationToken, host); const programEmitKind = getBuilderFileEmit(state.compilerOptions); let emitKind = !isForDtsErrors ? emitOnlyDtsFiles ? programEmitKind & 56 /* AllDts */ : programEmitKind : 8 /* DtsErrors */; if (!affected) { if (!state.compilerOptions.outFile) { const pendingAffectedFile = getNextAffectedFilePendingEmit( state, emitOnlyDtsFiles, isForDtsErrors ); if (pendingAffectedFile) { ({ affectedFile: affected, emitKind } = pendingAffectedFile); } else { const pendingForDiagnostics = getNextPendingEmitDiagnosticsFile( state, isForDtsErrors ); if (pendingForDiagnostics) { (state.seenEmittedFiles ?? (state.seenEmittedFiles = /* @__PURE__ */ new Map())).set( pendingForDiagnostics.affectedFile.resolvedPath, pendingForDiagnostics.seenKind | getBuilderFileEmitAllDts(isForDtsErrors) ); return { result: { emitSkipped: true, diagnostics: pendingForDiagnostics.diagnostics }, affected: pendingForDiagnostics.affectedFile }; } } } else { if (state.programEmitPending) { emitKind = getPendingEmitKindWithSeen( state.programEmitPending, state.seenProgramEmit, emitOnlyDtsFiles, isForDtsErrors ); if (emitKind) affected = state.program; } if (!affected && ((_a = state.emitDiagnosticsPerFile) == null ? void 0 : _a.size)) { const seenKind = state.seenProgramEmit || 0 /* None */; if (!(seenKind & getBuilderFileEmitAllDts(isForDtsErrors))) { state.seenProgramEmit = getBuilderFileEmitAllDts(isForDtsErrors) | seenKind; const diagnostics = []; state.emitDiagnosticsPerFile.forEach((d) => addRange(diagnostics, d)); return { result: { emitSkipped: true, diagnostics }, affected: state.program }; } } } if (!affected) { if (isForDtsErrors || !getBuildInfoEmitPending(state)) return void 0; const affected2 = state.program; const result2 = affected2.emitBuildInfo( writeFile2 || maybeBind(host, host.writeFile), cancellationToken ); state.buildInfoEmitPending = false; return { result: result2, affected: affected2 }; } } let emitOnly; if (emitKind & 7 /* AllJs */) emitOnly = 0 /* Js */; if (emitKind & 56 /* AllDts */) emitOnly = emitOnly === void 0 ? 1 /* Dts */ : void 0; const result = !isForDtsErrors ? state.program.emit( affected === state.program ? void 0 : affected, getWriteFileCallback(writeFile2, customTransformers), cancellationToken, emitOnly, customTransformers, /*forceDtsEmit*/ void 0, /*skipBuildInfo*/ true ) : { emitSkipped: true, diagnostics: state.program.getDeclarationDiagnostics( affected === state.program ? void 0 : affected, cancellationToken ) }; if (affected !== state.program) { const affectedSourceFile = affected; state.seenAffectedFiles.add(affectedSourceFile.resolvedPath); if (state.affectedFilesIndex !== void 0) state.affectedFilesIndex++; state.buildInfoEmitPending = true; const existing = ((_b = state.seenEmittedFiles) == null ? void 0 : _b.get(affectedSourceFile.resolvedPath)) || 0 /* None */; (state.seenEmittedFiles ?? (state.seenEmittedFiles = /* @__PURE__ */ new Map())).set(affectedSourceFile.resolvedPath, emitKind | existing); const existingPending = ((_c = state.affectedFilesPendingEmit) == null ? void 0 : _c.get(affectedSourceFile.resolvedPath)) || programEmitKind; const pendingKind = getPendingEmitKind(existingPending, emitKind | existing); if (pendingKind) (state.affectedFilesPendingEmit ?? (state.affectedFilesPendingEmit = /* @__PURE__ */ new Map())).set(affectedSourceFile.resolvedPath, pendingKind); else (_d = state.affectedFilesPendingEmit) == null ? void 0 : _d.delete(affectedSourceFile.resolvedPath); if (result.diagnostics.length) (state.emitDiagnosticsPerFile ?? (state.emitDiagnosticsPerFile = /* @__PURE__ */ new Map())).set(affectedSourceFile.resolvedPath, result.diagnostics); } else { state.changedFilesSet.clear(); state.programEmitPending = state.changedFilesSet.size ? getPendingEmitKind(programEmitKind, emitKind) : state.programEmitPending ? getPendingEmitKind(state.programEmitPending, emitKind) : void 0; state.seenProgramEmit = emitKind | (state.seenProgramEmit || 0 /* None */); setEmitDiagnosticsPerFile(result.diagnostics); state.buildInfoEmitPending = true; } return { result, affected }; } function setEmitDiagnosticsPerFile(diagnostics) { let emitDiagnosticsPerFile; diagnostics.forEach((d) => { if (!d.file) return; let diagnostics2 = emitDiagnosticsPerFile == null ? void 0 : emitDiagnosticsPerFile.get(d.file.resolvedPath); if (!diagnostics2) (emitDiagnosticsPerFile ?? (emitDiagnosticsPerFile = /* @__PURE__ */ new Map())).set(d.file.resolvedPath, diagnostics2 = []); diagnostics2.push(d); }); if (emitDiagnosticsPerFile) state.emitDiagnosticsPerFile = emitDiagnosticsPerFile; } function emitNextAffectedFile(writeFile2, cancellationToken, emitOnlyDtsFiles, customTransformers) { return emitNextAffectedFileOrDtsErrors( writeFile2, cancellationToken, emitOnlyDtsFiles, customTransformers, /*isForDtsErrors*/ false ); } function getWriteFileCallback(writeFile2, customTransformers) { Debug.assert(isBuilderProgramStateWithDefinedProgram(state)); if (!getEmitDeclarations(state.compilerOptions)) return writeFile2 || maybeBind(host, host.writeFile); return (fileName, text, writeByteOrderMark, onError, sourceFiles, data) => { var _a, _b, _c; if (isDeclarationFileName(fileName)) { if (!state.compilerOptions.outFile) { Debug.assert((sourceFiles == null ? void 0 : sourceFiles.length) === 1); let emitSignature; if (!customTransformers) { const file = sourceFiles[0]; const info = state.fileInfos.get(file.resolvedPath); if (info.signature === file.version) { const signature = computeSignatureWithDiagnostics( state.program, file, text, host, data ); if (!((_a = data == null ? void 0 : data.diagnostics) == null ? void 0 : _a.length)) emitSignature = signature; if (signature !== file.version) { if (host.storeSignatureInfo) (state.signatureInfo ?? (state.signatureInfo = /* @__PURE__ */ new Map())).set(file.resolvedPath, 1 /* StoredSignatureAtEmit */); if (state.affectedFiles) { const existing = (_b = state.oldSignatures) == null ? void 0 : _b.get(file.resolvedPath); if (existing === void 0) (state.oldSignatures ?? (state.oldSignatures = /* @__PURE__ */ new Map())).set(file.resolvedPath, info.signature || false); info.signature = signature; } else { info.signature = signature; } } } } if (state.compilerOptions.composite) { const filePath = sourceFiles[0].resolvedPath; emitSignature = handleNewSignature((_c = state.emitSignatures) == null ? void 0 : _c.get(filePath), emitSignature); if (!emitSignature) return data.skippedDtsWrite = true; (state.emitSignatures ?? (state.emitSignatures = /* @__PURE__ */ new Map())).set(filePath, emitSignature); } } else if (state.compilerOptions.composite) { const newSignature = handleNewSignature( state.outSignature, /*newSignature*/ void 0 ); if (!newSignature) return data.skippedDtsWrite = true; state.outSignature = newSignature; } } if (writeFile2) writeFile2(fileName, text, writeByteOrderMark, onError, sourceFiles, data); else if (host.writeFile) host.writeFile(fileName, text, writeByteOrderMark, onError, sourceFiles, data); else state.program.writeFile(fileName, text, writeByteOrderMark, onError, sourceFiles, data); function handleNewSignature(oldSignatureFormat, newSignature) { const oldSignature = !oldSignatureFormat || isString(oldSignatureFormat) ? oldSignatureFormat : oldSignatureFormat[0]; newSignature ?? (newSignature = computeSignature(text, host, data)); if (newSignature === oldSignature) { if (oldSignatureFormat === oldSignature) return void 0; else if (data) data.differsOnlyInMap = true; else data = { differsOnlyInMap: true }; } else { state.hasChangedEmitSignature = true; state.latestChangedDtsFile = fileName; } return newSignature; } }; } function emit(targetSourceFile, writeFile2, cancellationToken, emitOnlyDtsFiles, customTransformers) { Debug.assert(isBuilderProgramStateWithDefinedProgram(state)); if (kind === 1 /* EmitAndSemanticDiagnosticsBuilderProgram */) { assertSourceFileOkWithoutNextAffectedCall(state, targetSourceFile); } const result = handleNoEmitOptions(builderProgram, targetSourceFile, writeFile2, cancellationToken); if (result) return result; if (!targetSourceFile) { if (kind === 1 /* EmitAndSemanticDiagnosticsBuilderProgram */) { let sourceMaps = []; let emitSkipped = false; let diagnostics; let emittedFiles = []; let affectedEmitResult; while (affectedEmitResult = emitNextAffectedFile( writeFile2, cancellationToken, emitOnlyDtsFiles, customTransformers )) { emitSkipped = emitSkipped || affectedEmitResult.result.emitSkipped; diagnostics = addRange(diagnostics, affectedEmitResult.result.diagnostics); emittedFiles = addRange(emittedFiles, affectedEmitResult.result.emittedFiles); sourceMaps = addRange(sourceMaps, affectedEmitResult.result.sourceMaps); } return { emitSkipped, diagnostics: diagnostics || emptyArray, emittedFiles, sourceMaps }; } else { clearAffectedFilesPendingEmit( state, emitOnlyDtsFiles, /*isForDtsErrors*/ false ); } } const emitResult = state.program.emit( targetSourceFile, getWriteFileCallback(writeFile2, customTransformers), cancellationToken, emitOnlyDtsFiles, customTransformers ); handleNonEmitBuilderWithEmitOrDtsErrors( targetSourceFile, emitOnlyDtsFiles, /*isForDtsErrors*/ false, emitResult.diagnostics ); return emitResult; } function handleNonEmitBuilderWithEmitOrDtsErrors(targetSourceFile, emitOnlyDtsFiles, isForDtsErrors, diagnostics) { if (!targetSourceFile && kind !== 1 /* EmitAndSemanticDiagnosticsBuilderProgram */) { clearAffectedFilesPendingEmit(state, emitOnlyDtsFiles, isForDtsErrors); setEmitDiagnosticsPerFile(diagnostics); } } function getDeclarationDiagnostics2(sourceFile, cancellationToken) { var _a; Debug.assert(isBuilderProgramStateWithDefinedProgram(state)); if (kind === 1 /* EmitAndSemanticDiagnosticsBuilderProgram */) { assertSourceFileOkWithoutNextAffectedCall(state, sourceFile); let affectedEmitResult; let diagnostics; while (affectedEmitResult = emitNextAffectedFileOrDtsErrors( /*writeFile*/ void 0, cancellationToken, /*emitOnlyDtsFiles*/ void 0, /*customTransformers*/ void 0, /*isForDtsErrors*/ true )) { if (!sourceFile) diagnostics = addRange(diagnostics, affectedEmitResult.result.diagnostics); } return (!sourceFile ? diagnostics : (_a = state.emitDiagnosticsPerFile) == null ? void 0 : _a.get(sourceFile.resolvedPath)) || emptyArray; } else { const result = state.program.getDeclarationDiagnostics(sourceFile, cancellationToken); handleNonEmitBuilderWithEmitOrDtsErrors( sourceFile, /*emitOnlyDtsFiles*/ void 0, /*isForDtsErrors*/ true, result ); return result; } } function getSemanticDiagnosticsOfNextAffectedFile(cancellationToken, ignoreSourceFile) { Debug.assert(isBuilderProgramStateWithDefinedProgram(state)); while (true) { const affected = getNextAffectedFile(state, cancellationToken, host); let result; if (!affected) { if (state.checkPending && !state.compilerOptions.noCheck) { state.checkPending = void 0; state.buildInfoEmitPending = true; } return void 0; } else if (affected !== state.program) { const affectedSourceFile = affected; if (!ignoreSourceFile || !ignoreSourceFile(affectedSourceFile)) { result = getSemanticDiagnosticsOfFile(state, affectedSourceFile, cancellationToken); } state.seenAffectedFiles.add(affectedSourceFile.resolvedPath); state.affectedFilesIndex++; state.buildInfoEmitPending = true; if (!result) continue; } else { let diagnostics; const semanticDiagnosticsPerFile = /* @__PURE__ */ new Map(); state.program.getSourceFiles().forEach( (sourceFile) => diagnostics = addRange( diagnostics, getSemanticDiagnosticsOfFile( state, sourceFile, cancellationToken, semanticDiagnosticsPerFile ) ) ); state.semanticDiagnosticsPerFile = semanticDiagnosticsPerFile; result = diagnostics || emptyArray; state.changedFilesSet.clear(); state.programEmitPending = getBuilderFileEmit(state.compilerOptions); if (!state.compilerOptions.noCheck) state.checkPending = void 0; state.buildInfoEmitPending = true; } return { result, affected }; } } function getSemanticDiagnostics(sourceFile, cancellationToken) { Debug.assert(isBuilderProgramStateWithDefinedProgram(state)); assertSourceFileOkWithoutNextAffectedCall(state, sourceFile); if (sourceFile) { return getSemanticDiagnosticsOfFile(state, sourceFile, cancellationToken); } while (true) { const affectedResult = getSemanticDiagnosticsOfNextAffectedFile(cancellationToken); if (!affectedResult) break; if (affectedResult.affected === state.program) return affectedResult.result; } let diagnostics; for (const sourceFile2 of state.program.getSourceFiles()) { diagnostics = addRange(diagnostics, getSemanticDiagnosticsOfFile(state, sourceFile2, cancellationToken)); } if (state.checkPending && !state.compilerOptions.noCheck) { state.checkPending = void 0; state.buildInfoEmitPending = true; } return diagnostics || emptyArray; } } function addToAffectedFilesPendingEmit(state, affectedFilePendingEmit, kind) { var _a, _b; const existingKind = ((_a = state.affectedFilesPendingEmit) == null ? void 0 : _a.get(affectedFilePendingEmit)) || 0 /* None */; (state.affectedFilesPendingEmit ?? (state.affectedFilesPendingEmit = /* @__PURE__ */ new Map())).set(affectedFilePendingEmit, existingKind | kind); (_b = state.emitDiagnosticsPerFile) == null ? void 0 : _b.delete(affectedFilePendingEmit); } function toBuilderStateFileInfoForMultiEmit(fileInfo) { return isString(fileInfo) ? { version: fileInfo, signature: fileInfo, affectsGlobalScope: void 0, impliedFormat: void 0 } : isString(fileInfo.signature) ? fileInfo : { version: fileInfo.version, signature: fileInfo.signature === false ? void 0 : fileInfo.version, affectsGlobalScope: fileInfo.affectsGlobalScope, impliedFormat: fileInfo.impliedFormat }; } function toBuilderFileEmit(value, fullEmitForOptions) { return isNumber(value) ? fullEmitForOptions : value[1] || 24 /* Dts */; } function toProgramEmitPending(value, options) { return !value ? getBuilderFileEmit(options || {}) : value; } function createBuilderProgramUsingIncrementalBuildInfo(buildInfo, buildInfoPath, host) { var _a, _b, _c, _d; const buildInfoDirectory = getDirectoryPath(getNormalizedAbsolutePath(buildInfoPath, host.getCurrentDirectory())); const getCanonicalFileName = createGetCanonicalFileName(host.useCaseSensitiveFileNames()); let state; const filePaths = (_a = buildInfo.fileNames) == null ? void 0 : _a.map(toPathInBuildInfoDirectory); let filePathsSetList; const latestChangedDtsFile = buildInfo.latestChangedDtsFile ? toAbsolutePath(buildInfo.latestChangedDtsFile) : void 0; const fileInfos = /* @__PURE__ */ new Map(); const changedFilesSet = new Set(map(buildInfo.changeFileSet, toFilePath)); if (isIncrementalBundleEmitBuildInfo(buildInfo)) { buildInfo.fileInfos.forEach((fileInfo, index) => { const path = toFilePath(index + 1); fileInfos.set(path, isString(fileInfo) ? { version: fileInfo, signature: void 0, affectsGlobalScope: void 0, impliedFormat: void 0 } : fileInfo); }); state = { fileInfos, compilerOptions: buildInfo.options ? convertToOptionsWithAbsolutePaths(buildInfo.options, toAbsolutePath) : {}, semanticDiagnosticsPerFile: toPerFileSemanticDiagnostics(buildInfo.semanticDiagnosticsPerFile), emitDiagnosticsPerFile: toPerFileEmitDiagnostics(buildInfo.emitDiagnosticsPerFile), hasReusableDiagnostic: true, changedFilesSet, latestChangedDtsFile, outSignature: buildInfo.outSignature, programEmitPending: buildInfo.pendingEmit === void 0 ? void 0 : toProgramEmitPending(buildInfo.pendingEmit, buildInfo.options), hasErrors: buildInfo.errors, checkPending: buildInfo.checkPending }; } else { filePathsSetList = (_b = buildInfo.fileIdsList) == null ? void 0 : _b.map((fileIds) => new Set(fileIds.map(toFilePath))); const emitSignatures = ((_c = buildInfo.options) == null ? void 0 : _c.composite) && !buildInfo.options.outFile ? /* @__PURE__ */ new Map() : void 0; buildInfo.fileInfos.forEach((fileInfo, index) => { const path = toFilePath(index + 1); const stateFileInfo = toBuilderStateFileInfoForMultiEmit(fileInfo); fileInfos.set(path, stateFileInfo); if (emitSignatures && stateFileInfo.signature) emitSignatures.set(path, stateFileInfo.signature); }); (_d = buildInfo.emitSignatures) == null ? void 0 : _d.forEach((value) => { if (isNumber(value)) emitSignatures.delete(toFilePath(value)); else { const key = toFilePath(value[0]); emitSignatures.set( key, !isString(value[1]) && !value[1].length ? ( // File signature is emit signature but differs in map [emitSignatures.get(key)] ) : value[1] ); } }); const fullEmitForOptions = buildInfo.affectedFilesPendingEmit ? getBuilderFileEmit(buildInfo.options || {}) : void 0; state = { fileInfos, compilerOptions: buildInfo.options ? convertToOptionsWithAbsolutePaths(buildInfo.options, toAbsolutePath) : {}, referencedMap: toManyToManyPathMap(buildInfo.referencedMap, buildInfo.options ?? {}), semanticDiagnosticsPerFile: toPerFileSemanticDiagnostics(buildInfo.semanticDiagnosticsPerFile), emitDiagnosticsPerFile: toPerFileEmitDiagnostics(buildInfo.emitDiagnosticsPerFile), hasReusableDiagnostic: true, changedFilesSet, affectedFilesPendingEmit: buildInfo.affectedFilesPendingEmit && arrayToMap(buildInfo.affectedFilesPendingEmit, (value) => toFilePath(isNumber(value) ? value : value[0]), (value) => toBuilderFileEmit(value, fullEmitForOptions)), latestChangedDtsFile, emitSignatures: (emitSignatures == null ? void 0 : emitSignatures.size) ? emitSignatures : void 0, hasErrors: buildInfo.errors, checkPending: buildInfo.checkPending }; } return { state, getProgram: notImplemented, getProgramOrUndefined: returnUndefined, releaseProgram: noop, getCompilerOptions: () => state.compilerOptions, getSourceFile: notImplemented, getSourceFiles: notImplemented, getOptionsDiagnostics: notImplemented, getGlobalDiagnostics: notImplemented, getConfigFileParsingDiagnostics: notImplemented, getSyntacticDiagnostics: notImplemented, getDeclarationDiagnostics: notImplemented, getSemanticDiagnostics: notImplemented, emit: notImplemented, getAllDependencies: notImplemented, getCurrentDirectory: notImplemented, emitNextAffectedFile: notImplemented, getSemanticDiagnosticsOfNextAffectedFile: notImplemented, emitBuildInfo: notImplemented, close: noop, hasChangedEmitSignature: returnFalse }; function toPathInBuildInfoDirectory(path) { return toPath(path, buildInfoDirectory, getCanonicalFileName); } function toAbsolutePath(path) { return getNormalizedAbsolutePath(path, buildInfoDirectory); } function toFilePath(fileId) { return filePaths[fileId - 1]; } function toFilePathsSet(fileIdsListId) { return filePathsSetList[fileIdsListId - 1]; } function toManyToManyPathMap(referenceMap, options) { const map2 = BuilderState.createReferencedMap(options); if (!map2 || !referenceMap) return map2; referenceMap.forEach(([fileId, fileIdListId]) => map2.set(toFilePath(fileId), toFilePathsSet(fileIdListId))); return map2; } function toPerFileSemanticDiagnostics(diagnostics) { const semanticDiagnostics = new Map( mapDefinedIterator( fileInfos.keys(), (key) => !changedFilesSet.has(key) ? [key, emptyArray] : void 0 ) ); diagnostics == null ? void 0 : diagnostics.forEach((value) => { if (isNumber(value)) semanticDiagnostics.delete(toFilePath(value)); else semanticDiagnostics.set(toFilePath(value[0]), value[1]); }); return semanticDiagnostics; } function toPerFileEmitDiagnostics(diagnostics) { return diagnostics && arrayToMap(diagnostics, (value) => toFilePath(value[0]), (value) => value[1]); } } function getBuildInfoFileVersionMap(program, buildInfoPath, host) { const buildInfoDirectory = getDirectoryPath(getNormalizedAbsolutePath(buildInfoPath, host.getCurrentDirectory())); const getCanonicalFileName = createGetCanonicalFileName(host.useCaseSensitiveFileNames()); const fileInfos = /* @__PURE__ */ new Map(); let rootIndex = 0; const roots = /* @__PURE__ */ new Map(); const resolvedRoots = new Map(program.resolvedRoot); program.fileInfos.forEach((fileInfo, index) => { const path = toPath(program.fileNames[index], buildInfoDirectory, getCanonicalFileName); const version2 = isString(fileInfo) ? fileInfo : fileInfo.version; fileInfos.set(path, version2); if (rootIndex < program.root.length) { const current = program.root[rootIndex]; const fileId = index + 1; if (isArray(current)) { if (current[0] <= fileId && fileId <= current[1]) { addRoot(fileId, path); if (current[1] === fileId) rootIndex++; } } else if (current === fileId) { addRoot(fileId, path); rootIndex++; } } }); return { fileInfos, roots }; function addRoot(fileId, path) { const root = resolvedRoots.get(fileId); if (root) { roots.set(toPath(program.fileNames[root - 1], buildInfoDirectory, getCanonicalFileName), path); } else { roots.set(path, void 0); } } } function getNonIncrementalBuildInfoRoots(buildInfo, buildInfoPath, host) { if (!isNonIncrementalBuildInfo(buildInfo)) return void 0; const buildInfoDirectory = getDirectoryPath(getNormalizedAbsolutePath(buildInfoPath, host.getCurrentDirectory())); const getCanonicalFileName = createGetCanonicalFileName(host.useCaseSensitiveFileNames()); return buildInfo.root.map((r) => toPath(r, buildInfoDirectory, getCanonicalFileName)); } function createRedirectedBuilderProgram(state, configFileParsingDiagnostics) { return { state: void 0, getProgram, getProgramOrUndefined: () => state.program, releaseProgram: () => state.program = void 0, getCompilerOptions: () => state.compilerOptions, getSourceFile: (fileName) => getProgram().getSourceFile(fileName), getSourceFiles: () => getProgram().getSourceFiles(), getOptionsDiagnostics: (cancellationToken) => getProgram().getOptionsDiagnostics(cancellationToken), getGlobalDiagnostics: (cancellationToken) => getProgram().getGlobalDiagnostics(cancellationToken), getConfigFileParsingDiagnostics: () => configFileParsingDiagnostics, getSyntacticDiagnostics: (sourceFile, cancellationToken) => getProgram().getSyntacticDiagnostics(sourceFile, cancellationToken), getDeclarationDiagnostics: (sourceFile, cancellationToken) => getProgram().getDeclarationDiagnostics(sourceFile, cancellationToken), getSemanticDiagnostics: (sourceFile, cancellationToken) => getProgram().getSemanticDiagnostics(sourceFile, cancellationToken), emit: (sourceFile, writeFile2, cancellationToken, emitOnlyDts, customTransformers) => getProgram().emit(sourceFile, writeFile2, cancellationToken, emitOnlyDts, customTransformers), emitBuildInfo: (writeFile2, cancellationToken) => getProgram().emitBuildInfo(writeFile2, cancellationToken), getAllDependencies: notImplemented, getCurrentDirectory: () => getProgram().getCurrentDirectory(), close: noop }; function getProgram() { return Debug.checkDefined(state.program); } } // src/compiler/builderPublic.ts function createEmitAndSemanticDiagnosticsBuilderProgram(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics, projectReferences) { return createBuilderProgram( 1 /* EmitAndSemanticDiagnosticsBuilderProgram */, getBuilderCreationParameters( newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics, projectReferences ) ); } // src/compiler/resolutionCache.ts function removeIgnoredPath(path) { if (endsWith(path, "/node_modules/.staging")) { return removeSuffix(path, "/.staging"); } return some(ignoredPaths, (searchPath) => path.includes(searchPath)) ? void 0 : path; } function perceivedOsRootLengthForWatching(pathComponents2, length2) { if (length2 <= 1) return 1; let indexAfterOsRoot = 1; let isDosStyle = pathComponents2[0].search(/[a-z]:/i) === 0; if (pathComponents2[0] !== directorySeparator && !isDosStyle && // Non dos style paths pathComponents2[1].search(/[a-z]\$$/i) === 0) { if (length2 === 2) return 2; indexAfterOsRoot = 2; isDosStyle = true; } if (isDosStyle && !pathComponents2[indexAfterOsRoot].match(/^users$/i)) { return indexAfterOsRoot; } if (pathComponents2[indexAfterOsRoot].match(/^workspaces$/i)) { return indexAfterOsRoot + 1; } return indexAfterOsRoot + 2; } function canWatchDirectoryOrFile(pathComponents2, length2) { if (length2 === void 0) length2 = pathComponents2.length; if (length2 <= 2) return false; const perceivedOsRootLength = perceivedOsRootLengthForWatching(pathComponents2, length2); return length2 > perceivedOsRootLength + 1; } function canWatchDirectoryOrFilePath(path) { return canWatchDirectoryOrFile(getPathComponents(path)); } function canWatchAtTypes(atTypes) { return canWatchAffectedPackageJsonOrNodeModulesOfAtTypes(getDirectoryPath(atTypes)); } function isInDirectoryPath(dirComponents, fileOrDirComponents) { if (fileOrDirComponents.length < dirComponents.length) return false; for (let i = 0; i < dirComponents.length; i++) { if (fileOrDirComponents[i] !== dirComponents[i]) return false; } return true; } function canWatchAffectedPackageJsonOrNodeModulesOfAtTypes(fileOrDirPath) { return canWatchDirectoryOrFilePath(fileOrDirPath); } function canWatchAffectingLocation(filePath) { return canWatchAffectedPackageJsonOrNodeModulesOfAtTypes(filePath); } function getDirectoryToWatchFailedLookupLocation(failedLookupLocation, failedLookupLocationPath, rootDir, rootPath, rootPathComponents, isRootWatchable, getCurrentDirectory, preferNonRecursiveWatch) { const failedLookupPathComponents = getPathComponents(failedLookupLocationPath); failedLookupLocation = isRootedDiskPath(failedLookupLocation) ? normalizePath(failedLookupLocation) : getNormalizedAbsolutePath(failedLookupLocation, getCurrentDirectory()); const failedLookupComponents = getPathComponents(failedLookupLocation); const perceivedOsRootLength = perceivedOsRootLengthForWatching(failedLookupPathComponents, failedLookupPathComponents.length); if (failedLookupPathComponents.length <= perceivedOsRootLength + 1) return void 0; const nodeModulesIndex = failedLookupPathComponents.indexOf("node_modules"); if (nodeModulesIndex !== -1 && nodeModulesIndex + 1 <= perceivedOsRootLength + 1) return void 0; const lastNodeModulesIndex = failedLookupPathComponents.lastIndexOf("node_modules"); if (isRootWatchable && isInDirectoryPath(rootPathComponents, failedLookupPathComponents)) { if (failedLookupPathComponents.length > rootPathComponents.length + 1) { return getDirectoryOfFailedLookupWatch( failedLookupComponents, failedLookupPathComponents, Math.max(rootPathComponents.length + 1, perceivedOsRootLength + 1), lastNodeModulesIndex ); } else { return { dir: rootDir, dirPath: rootPath, nonRecursive: true }; } } return getDirectoryToWatchFromFailedLookupLocationDirectory( failedLookupComponents, failedLookupPathComponents, failedLookupPathComponents.length - 1, perceivedOsRootLength, nodeModulesIndex, rootPathComponents, lastNodeModulesIndex, preferNonRecursiveWatch ); } function getDirectoryToWatchFromFailedLookupLocationDirectory(dirComponents, dirPathComponents, dirPathComponentsLength, perceivedOsRootLength, nodeModulesIndex, rootPathComponents, lastNodeModulesIndex, preferNonRecursiveWatch) { if (nodeModulesIndex !== -1) { return getDirectoryOfFailedLookupWatch( dirComponents, dirPathComponents, nodeModulesIndex + 1, lastNodeModulesIndex ); } let nonRecursive = true; let length2 = dirPathComponentsLength; if (!preferNonRecursiveWatch) { for (let i = 0; i < dirPathComponentsLength; i++) { if (dirPathComponents[i] !== rootPathComponents[i]) { nonRecursive = false; length2 = Math.max(i + 1, perceivedOsRootLength + 1); break; } } } return getDirectoryOfFailedLookupWatch( dirComponents, dirPathComponents, length2, lastNodeModulesIndex, nonRecursive ); } function getDirectoryOfFailedLookupWatch(dirComponents, dirPathComponents, length2, lastNodeModulesIndex, nonRecursive) { let packageDirLength; if (lastNodeModulesIndex !== -1 && lastNodeModulesIndex + 1 >= length2 && lastNodeModulesIndex + 2 < dirPathComponents.length) { if (!startsWith(dirPathComponents[lastNodeModulesIndex + 1], "@")) { packageDirLength = lastNodeModulesIndex + 2; } else if (lastNodeModulesIndex + 3 < dirPathComponents.length) { packageDirLength = lastNodeModulesIndex + 3; } } return { dir: getPathFromPathComponents(dirComponents, length2), dirPath: getPathFromPathComponents(dirPathComponents, length2), nonRecursive, packageDir: packageDirLength !== void 0 ? getPathFromPathComponents(dirComponents, packageDirLength) : void 0, packageDirPath: packageDirLength !== void 0 ? getPathFromPathComponents(dirPathComponents, packageDirLength) : void 0 }; } function getDirectoryToWatchFailedLookupLocationFromTypeRoot(typeRoot, typeRootPath, rootPath, rootPathComponents, isRootWatchable, getCurrentDirectory, preferNonRecursiveWatch, filterCustomPath) { const typeRootPathComponents = getPathComponents(typeRootPath); if (isRootWatchable && isInDirectoryPath(rootPathComponents, typeRootPathComponents)) { return rootPath; } typeRoot = isRootedDiskPath(typeRoot) ? normalizePath(typeRoot) : getNormalizedAbsolutePath(typeRoot, getCurrentDirectory()); const toWatch = getDirectoryToWatchFromFailedLookupLocationDirectory( getPathComponents(typeRoot), typeRootPathComponents, typeRootPathComponents.length, perceivedOsRootLengthForWatching(typeRootPathComponents, typeRootPathComponents.length), typeRootPathComponents.indexOf("node_modules"), rootPathComponents, typeRootPathComponents.lastIndexOf("node_modules"), preferNonRecursiveWatch ); return toWatch && filterCustomPath(toWatch.dirPath) ? toWatch.dirPath : void 0; } function getRootDirectoryOfResolutionCache(rootDirForResolution, getCurrentDirectory) { const normalized = getNormalizedAbsolutePath(rootDirForResolution, getCurrentDirectory()); return !isDiskPathRoot(normalized) ? removeTrailingDirectorySeparator(normalized) : normalized; } function getModuleResolutionHost(resolutionHost) { var _a; return ((_a = resolutionHost.getCompilerHost) == null ? void 0 : _a.call(resolutionHost)) || resolutionHost; } function createModuleResolutionLoaderUsingGlobalCache(containingFile, redirectedReference, options, resolutionHost, moduleResolutionCache) { return { nameAndMode: moduleResolutionNameAndModeGetter, resolve: (moduleName, resoluionMode) => resolveModuleNameUsingGlobalCache( resolutionHost, moduleResolutionCache, moduleName, containingFile, options, redirectedReference, resoluionMode ) }; } function resolveModuleNameUsingGlobalCache(resolutionHost, moduleResolutionCache, moduleName, containingFile, compilerOptions, redirectedReference, mode) { const host = getModuleResolutionHost(resolutionHost); const primaryResult = resolveModuleName(moduleName, containingFile, compilerOptions, host, moduleResolutionCache, redirectedReference, mode); if (!resolutionHost.getGlobalTypingsCacheLocation) { return primaryResult; } const globalCache = resolutionHost.getGlobalTypingsCacheLocation(); if (globalCache !== void 0 && !isExternalModuleNameRelative(moduleName) && !(primaryResult.resolvedModule && extensionIsTS(primaryResult.resolvedModule.extension))) { const { resolvedModule, failedLookupLocations, affectingLocations, resolutionDiagnostics } = loadModuleFromGlobalCache( Debug.checkDefined(resolutionHost.globalCacheResolutionModuleName)(moduleName), resolutionHost.projectName, compilerOptions, host, globalCache, moduleResolutionCache ); if (resolvedModule) { primaryResult.resolvedModule = resolvedModule; primaryResult.failedLookupLocations = updateResolutionField(primaryResult.failedLookupLocations, failedLookupLocations); primaryResult.affectingLocations = updateResolutionField(primaryResult.affectingLocations, affectingLocations); primaryResult.resolutionDiagnostics = updateResolutionField(primaryResult.resolutionDiagnostics, resolutionDiagnostics); return primaryResult; } } return primaryResult; } function createResolutionCache(resolutionHost, rootDirForResolution, logChangesWhenResolvingModule) { let filesWithChangedSetOfUnresolvedImports; let filesWithInvalidatedResolutions; let filesWithInvalidatedNonRelativeUnresolvedImports; const nonRelativeExternalModuleResolutions = /* @__PURE__ */ new Set(); const resolutionsWithFailedLookups = /* @__PURE__ */ new Set(); const resolutionsWithOnlyAffectingLocations = /* @__PURE__ */ new Set(); const resolvedFileToResolution = /* @__PURE__ */ new Map(); const impliedFormatPackageJsons = /* @__PURE__ */ new Map(); let hasChangedAutomaticTypeDirectiveNames = false; let affectingPathChecksForFile; let affectingPathChecks; let failedLookupChecks; let startsWithPathChecks; let isInDirectoryChecks; let allModuleAndTypeResolutionsAreInvalidated = false; const getCurrentDirectory = memoize(() => resolutionHost.getCurrentDirectory()); const cachedDirectoryStructureHost = resolutionHost.getCachedDirectoryStructureHost(); const resolvedModuleNames = /* @__PURE__ */ new Map(); const moduleResolutionCache = createModuleResolutionCache( getCurrentDirectory(), resolutionHost.getCanonicalFileName, resolutionHost.getCompilationSettings() ); const resolvedTypeReferenceDirectives = /* @__PURE__ */ new Map(); const typeReferenceDirectiveResolutionCache = createTypeReferenceDirectiveResolutionCache( getCurrentDirectory(), resolutionHost.getCanonicalFileName, resolutionHost.getCompilationSettings(), moduleResolutionCache.getPackageJsonInfoCache(), moduleResolutionCache.optionsToRedirectsKey ); const resolvedLibraries = /* @__PURE__ */ new Map(); const libraryResolutionCache = createModuleResolutionCache( getCurrentDirectory(), resolutionHost.getCanonicalFileName, getOptionsForLibraryResolution(resolutionHost.getCompilationSettings()), moduleResolutionCache.getPackageJsonInfoCache() ); const directoryWatchesOfFailedLookups = /* @__PURE__ */ new Map(); const fileWatchesOfAffectingLocations = /* @__PURE__ */ new Map(); const rootDir = getRootDirectoryOfResolutionCache(rootDirForResolution, getCurrentDirectory); const rootPath = resolutionHost.toPath(rootDir); const rootPathComponents = getPathComponents(rootPath); const isRootWatchable = canWatchDirectoryOrFile(rootPathComponents); const isSymlinkCache = /* @__PURE__ */ new Map(); const packageDirWatchers = /* @__PURE__ */ new Map(); const dirPathToSymlinkPackageRefCount = /* @__PURE__ */ new Map(); const typeRootsWatches = /* @__PURE__ */ new Map(); return { rootDirForResolution, resolvedModuleNames, resolvedTypeReferenceDirectives, resolvedLibraries, resolvedFileToResolution, resolutionsWithFailedLookups, resolutionsWithOnlyAffectingLocations, directoryWatchesOfFailedLookups, fileWatchesOfAffectingLocations, packageDirWatchers, dirPathToSymlinkPackageRefCount, watchFailedLookupLocationsOfExternalModuleResolutions, getModuleResolutionCache: () => moduleResolutionCache, startRecordingFilesWithChangedResolutions, finishRecordingFilesWithChangedResolutions, // perDirectoryResolvedModuleNames and perDirectoryResolvedTypeReferenceDirectives could be non empty if there was exception during program update // (between startCachingPerDirectoryResolution and finishCachingPerDirectoryResolution) startCachingPerDirectoryResolution, finishCachingPerDirectoryResolution, resolveModuleNameLiterals, resolveTypeReferenceDirectiveReferences, resolveLibrary: resolveLibrary2, resolveSingleModuleNameWithoutWatching, removeResolutionsFromProjectReferenceRedirects, removeResolutionsOfFile, hasChangedAutomaticTypeDirectiveNames: () => hasChangedAutomaticTypeDirectiveNames, invalidateResolutionOfFile, invalidateResolutionsOfFailedLookupLocations, setFilesWithInvalidatedNonRelativeUnresolvedImports, createHasInvalidatedResolutions, isFileWithInvalidatedNonRelativeUnresolvedImports, updateTypeRootsWatch, closeTypeRootsWatch, clear: clear2, onChangesAffectModuleResolution }; function clear2() { clearMap(directoryWatchesOfFailedLookups, closeFileWatcherOf); clearMap(fileWatchesOfAffectingLocations, closeFileWatcherOf); isSymlinkCache.clear(); packageDirWatchers.clear(); dirPathToSymlinkPackageRefCount.clear(); nonRelativeExternalModuleResolutions.clear(); closeTypeRootsWatch(); resolvedModuleNames.clear(); resolvedTypeReferenceDirectives.clear(); resolvedFileToResolution.clear(); resolutionsWithFailedLookups.clear(); resolutionsWithOnlyAffectingLocations.clear(); failedLookupChecks = void 0; startsWithPathChecks = void 0; isInDirectoryChecks = void 0; affectingPathChecks = void 0; affectingPathChecksForFile = void 0; allModuleAndTypeResolutionsAreInvalidated = false; moduleResolutionCache.clear(); typeReferenceDirectiveResolutionCache.clear(); moduleResolutionCache.update(resolutionHost.getCompilationSettings()); typeReferenceDirectiveResolutionCache.update(resolutionHost.getCompilationSettings()); libraryResolutionCache.clear(); impliedFormatPackageJsons.clear(); resolvedLibraries.clear(); hasChangedAutomaticTypeDirectiveNames = false; } function onChangesAffectModuleResolution() { allModuleAndTypeResolutionsAreInvalidated = true; moduleResolutionCache.clearAllExceptPackageJsonInfoCache(); typeReferenceDirectiveResolutionCache.clearAllExceptPackageJsonInfoCache(); moduleResolutionCache.update(resolutionHost.getCompilationSettings()); typeReferenceDirectiveResolutionCache.update(resolutionHost.getCompilationSettings()); } function startRecordingFilesWithChangedResolutions() { filesWithChangedSetOfUnresolvedImports = []; } function finishRecordingFilesWithChangedResolutions() { const collected = filesWithChangedSetOfUnresolvedImports; filesWithChangedSetOfUnresolvedImports = void 0; return collected; } function isFileWithInvalidatedNonRelativeUnresolvedImports(path) { if (!filesWithInvalidatedNonRelativeUnresolvedImports) { return false; } const value = filesWithInvalidatedNonRelativeUnresolvedImports.get(path); return !!value && !!value.length; } function createHasInvalidatedResolutions(customHasInvalidatedResolutions, customHasInvalidatedLibResolutions) { invalidateResolutionsOfFailedLookupLocations(); const collected = filesWithInvalidatedResolutions; filesWithInvalidatedResolutions = void 0; return { hasInvalidatedResolutions: (path) => customHasInvalidatedResolutions(path) || allModuleAndTypeResolutionsAreInvalidated || !!(collected == null ? void 0 : collected.has(path)) || isFileWithInvalidatedNonRelativeUnresolvedImports(path), hasInvalidatedLibResolutions: (libFileName) => { var _a; return customHasInvalidatedLibResolutions(libFileName) || !!((_a = resolvedLibraries == null ? void 0 : resolvedLibraries.get(libFileName)) == null ? void 0 : _a.isInvalidated); } }; } function startCachingPerDirectoryResolution() { moduleResolutionCache.isReadonly = void 0; typeReferenceDirectiveResolutionCache.isReadonly = void 0; libraryResolutionCache.isReadonly = void 0; moduleResolutionCache.getPackageJsonInfoCache().isReadonly = void 0; moduleResolutionCache.clearAllExceptPackageJsonInfoCache(); typeReferenceDirectiveResolutionCache.clearAllExceptPackageJsonInfoCache(); libraryResolutionCache.clearAllExceptPackageJsonInfoCache(); watchFailedLookupLocationOfNonRelativeModuleResolutions(); isSymlinkCache.clear(); } function cleanupLibResolutionWatching(newProgram) { resolvedLibraries.forEach((resolution, libFileName) => { var _a; if (!((_a = newProgram == null ? void 0 : newProgram.resolvedLibReferences) == null ? void 0 : _a.has(libFileName))) { stopWatchFailedLookupLocationOfResolution( resolution, resolutionHost.toPath(getInferredLibraryNameResolveFrom(resolutionHost.getCompilationSettings(), getCurrentDirectory(), libFileName)), getResolvedModuleFromResolution ); resolvedLibraries.delete(libFileName); } }); } function finishCachingPerDirectoryResolution(newProgram, oldProgram) { filesWithInvalidatedNonRelativeUnresolvedImports = void 0; allModuleAndTypeResolutionsAreInvalidated = false; watchFailedLookupLocationOfNonRelativeModuleResolutions(); if (newProgram !== oldProgram) { cleanupLibResolutionWatching(newProgram); newProgram == null ? void 0 : newProgram.getSourceFiles().forEach((newFile) => { var _a; const expected = ((_a = newFile.packageJsonLocations) == null ? void 0 : _a.length) ?? 0; const existing = impliedFormatPackageJsons.get(newFile.resolvedPath) ?? emptyArray; for (let i = existing.length; i < expected; i++) { createFileWatcherOfAffectingLocation( newFile.packageJsonLocations[i], /*forResolution*/ false ); } if (existing.length > expected) { for (let i = expected; i < existing.length; i++) { fileWatchesOfAffectingLocations.get(existing[i]).files--; } } if (expected) impliedFormatPackageJsons.set(newFile.resolvedPath, newFile.packageJsonLocations); else impliedFormatPackageJsons.delete(newFile.resolvedPath); }); impliedFormatPackageJsons.forEach((existing, path) => { const newFile = newProgram == null ? void 0 : newProgram.getSourceFileByPath(path); if (!newFile || newFile.resolvedPath !== path) { existing.forEach((location) => fileWatchesOfAffectingLocations.get(location).files--); impliedFormatPackageJsons.delete(path); } }); } directoryWatchesOfFailedLookups.forEach(closeDirectoryWatchesOfFailedLookup); fileWatchesOfAffectingLocations.forEach(closeFileWatcherOfAffectingLocation); packageDirWatchers.forEach(closePackageDirWatcher); hasChangedAutomaticTypeDirectiveNames = false; moduleResolutionCache.isReadonly = true; typeReferenceDirectiveResolutionCache.isReadonly = true; libraryResolutionCache.isReadonly = true; moduleResolutionCache.getPackageJsonInfoCache().isReadonly = true; isSymlinkCache.clear(); } function closePackageDirWatcher(watcher, packageDirPath) { if (watcher.dirPathToWatcher.size === 0) { packageDirWatchers.delete(packageDirPath); } } function closeDirectoryWatchesOfFailedLookup(watcher, path) { if (watcher.refCount === 0) { directoryWatchesOfFailedLookups.delete(path); watcher.watcher.close(); } } function closeFileWatcherOfAffectingLocation(watcher, path) { var _a; if (watcher.files === 0 && watcher.resolutions === 0 && !((_a = watcher.symlinks) == null ? void 0 : _a.size)) { fileWatchesOfAffectingLocations.delete(path); watcher.watcher.close(); } } function resolveNamesWithLocalCache({ entries, containingFile, containingSourceFile, redirectedReference, options, perFileCache, reusedNames, loader, getResolutionWithResolvedFileName, deferWatchingNonRelativeResolution, shouldRetryResolution, logChanges }) { var _a; const path = resolutionHost.toPath(containingFile); const resolutionsInFile = perFileCache.get(path) || perFileCache.set(path, createModeAwareCache()).get(path); const resolvedModules = []; const hasInvalidatedNonRelativeUnresolvedImport = logChanges && isFileWithInvalidatedNonRelativeUnresolvedImports(path); const program = resolutionHost.getCurrentProgram(); const oldRedirect = program && ((_a = program.getRedirectFromSourceFile(containingFile)) == null ? void 0 : _a.resolvedRef); const unmatchedRedirects = oldRedirect ? !redirectedReference || redirectedReference.sourceFile.path !== oldRedirect.sourceFile.path : !!redirectedReference; const seenNamesInFile = createModeAwareCache(); for (const entry of entries) { const name = loader.nameAndMode.getName(entry); const mode = loader.nameAndMode.getMode(entry, containingSourceFile, (redirectedReference == null ? void 0 : redirectedReference.commandLine.options) || options); let resolution = resolutionsInFile.get(name, mode); if (!seenNamesInFile.has(name, mode) && (allModuleAndTypeResolutionsAreInvalidated || unmatchedRedirects || !resolution || resolution.isInvalidated || // If the name is unresolved import that was invalidated, recalculate hasInvalidatedNonRelativeUnresolvedImport && !isExternalModuleNameRelative(name) && shouldRetryResolution(resolution))) { const existingResolution = resolution; resolution = loader.resolve(name, mode); if (resolutionHost.onDiscoveredSymlink && resolutionIsSymlink(resolution)) { resolutionHost.onDiscoveredSymlink(); } resolutionsInFile.set(name, mode, resolution); if (resolution !== existingResolution) { watchFailedLookupLocationsOfExternalModuleResolutions(name, resolution, path, getResolutionWithResolvedFileName, deferWatchingNonRelativeResolution); if (existingResolution) { stopWatchFailedLookupLocationOfResolution(existingResolution, path, getResolutionWithResolvedFileName); } } if (logChanges && filesWithChangedSetOfUnresolvedImports && !resolutionIsEqualTo(existingResolution, resolution)) { filesWithChangedSetOfUnresolvedImports.push(path); logChanges = false; } } else { const host = getModuleResolutionHost(resolutionHost); if (isTraceEnabled(options, host) && !seenNamesInFile.has(name, mode)) { const resolved = getResolutionWithResolvedFileName(resolution); trace( host, perFileCache === resolvedModuleNames ? (resolved == null ? void 0 : resolved.resolvedFileName) ? resolved.packageId ? Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2_with_Package_ID_3 : Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2 : Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_not_resolved : (resolved == null ? void 0 : resolved.resolvedFileName) ? resolved.packageId ? Diagnostics.Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_successfully_resolved_to_2_with_Package_ID_3 : Diagnostics.Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_successfully_resolved_to_2 : Diagnostics.Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_not_resolved, name, containingFile, resolved == null ? void 0 : resolved.resolvedFileName, (resolved == null ? void 0 : resolved.packageId) && packageIdToString(resolved.packageId) ); } } Debug.assert(resolution !== void 0 && !resolution.isInvalidated); seenNamesInFile.set(name, mode, true); resolvedModules.push(resolution); } reusedNames == null ? void 0 : reusedNames.forEach( (entry) => seenNamesInFile.set( loader.nameAndMode.getName(entry), loader.nameAndMode.getMode(entry, containingSourceFile, (redirectedReference == null ? void 0 : redirectedReference.commandLine.options) || options), true ) ); if (resolutionsInFile.size() !== seenNamesInFile.size()) { resolutionsInFile.forEach((resolution, name, mode) => { if (!seenNamesInFile.has(name, mode)) { stopWatchFailedLookupLocationOfResolution(resolution, path, getResolutionWithResolvedFileName); resolutionsInFile.delete(name, mode); } }); } return resolvedModules; function resolutionIsEqualTo(oldResolution, newResolution) { if (oldResolution === newResolution) { return true; } if (!oldResolution || !newResolution) { return false; } const oldResult = getResolutionWithResolvedFileName(oldResolution); const newResult = getResolutionWithResolvedFileName(newResolution); if (oldResult === newResult) { return true; } if (!oldResult || !newResult) { return false; } return oldResult.resolvedFileName === newResult.resolvedFileName; } } function resolveTypeReferenceDirectiveReferences(typeDirectiveReferences, containingFile, redirectedReference, options, containingSourceFile, reusedNames) { return resolveNamesWithLocalCache({ entries: typeDirectiveReferences, containingFile, containingSourceFile, redirectedReference, options, reusedNames, perFileCache: resolvedTypeReferenceDirectives, loader: createTypeReferenceResolutionLoader( containingFile, redirectedReference, options, getModuleResolutionHost(resolutionHost), typeReferenceDirectiveResolutionCache ), getResolutionWithResolvedFileName: getResolvedTypeReferenceDirectiveFromResolution, shouldRetryResolution: (resolution) => resolution.resolvedTypeReferenceDirective === void 0, deferWatchingNonRelativeResolution: false }); } function resolveModuleNameLiterals(moduleLiterals, containingFile, redirectedReference, options, containingSourceFile, reusedNames) { return resolveNamesWithLocalCache({ entries: moduleLiterals, containingFile, containingSourceFile, redirectedReference, options, reusedNames, perFileCache: resolvedModuleNames, loader: createModuleResolutionLoaderUsingGlobalCache( containingFile, redirectedReference, options, resolutionHost, moduleResolutionCache ), getResolutionWithResolvedFileName: getResolvedModuleFromResolution, shouldRetryResolution: (resolution) => !resolution.resolvedModule || !resolutionExtensionIsTSOrJson(resolution.resolvedModule.extension), logChanges: logChangesWhenResolvingModule, deferWatchingNonRelativeResolution: true // Defer non relative resolution watch because we could be using ambient modules }); } function resolveLibrary2(libraryName, resolveFrom, options, libFileName) { const host = getModuleResolutionHost(resolutionHost); let resolution = resolvedLibraries == null ? void 0 : resolvedLibraries.get(libFileName); if (!resolution || resolution.isInvalidated) { const existingResolution = resolution; resolution = resolveLibrary(libraryName, resolveFrom, options, host, libraryResolutionCache); const path = resolutionHost.toPath(resolveFrom); watchFailedLookupLocationsOfExternalModuleResolutions( libraryName, resolution, path, getResolvedModuleFromResolution, /*deferWatchingNonRelativeResolution*/ false ); resolvedLibraries.set(libFileName, resolution); if (existingResolution) { stopWatchFailedLookupLocationOfResolution(existingResolution, path, getResolvedModuleFromResolution); } } else { if (isTraceEnabled(options, host)) { const resolved = getResolvedModuleFromResolution(resolution); trace( host, (resolved == null ? void 0 : resolved.resolvedFileName) ? resolved.packageId ? Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2_with_Package_ID_3 : Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2 : Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_not_resolved, libraryName, resolveFrom, resolved == null ? void 0 : resolved.resolvedFileName, (resolved == null ? void 0 : resolved.packageId) && packageIdToString(resolved.packageId) ); } } return resolution; } function resolveSingleModuleNameWithoutWatching(moduleName, containingFile) { var _a, _b; const path = resolutionHost.toPath(containingFile); const resolutionsInFile = resolvedModuleNames.get(path); const resolution = resolutionsInFile == null ? void 0 : resolutionsInFile.get( moduleName, /*mode*/ void 0 ); if (resolution && !resolution.isInvalidated) return resolution; const data = (_a = resolutionHost.beforeResolveSingleModuleNameWithoutWatching) == null ? void 0 : _a.call(resolutionHost, moduleResolutionCache); const host = getModuleResolutionHost(resolutionHost); const result = resolveModuleName( moduleName, containingFile, resolutionHost.getCompilationSettings(), host, moduleResolutionCache ); (_b = resolutionHost.afterResolveSingleModuleNameWithoutWatching) == null ? void 0 : _b.call(resolutionHost, moduleResolutionCache, moduleName, containingFile, result, data); return result; } function isNodeModulesAtTypesDirectory(dirPath) { return endsWith(dirPath, "/node_modules/@types"); } function watchFailedLookupLocationsOfExternalModuleResolutions(name, resolution, filePath, getResolutionWithResolvedFileName, deferWatchingNonRelativeResolution) { (resolution.files ?? (resolution.files = /* @__PURE__ */ new Set())).add(filePath); if (resolution.files.size !== 1) return; if (!deferWatchingNonRelativeResolution || isExternalModuleNameRelative(name)) { watchFailedLookupLocationOfResolution(resolution); } else { nonRelativeExternalModuleResolutions.add(resolution); } const resolved = getResolutionWithResolvedFileName(resolution); if (resolved && resolved.resolvedFileName) { const key = resolutionHost.toPath(resolved.resolvedFileName); let resolutions = resolvedFileToResolution.get(key); if (!resolutions) resolvedFileToResolution.set(key, resolutions = /* @__PURE__ */ new Set()); resolutions.add(resolution); } } function watchFailedLookupLocation(failedLookupLocation, setAtRoot) { const failedLookupLocationPath = resolutionHost.toPath(failedLookupLocation); const toWatch = getDirectoryToWatchFailedLookupLocation( failedLookupLocation, failedLookupLocationPath, rootDir, rootPath, rootPathComponents, isRootWatchable, getCurrentDirectory, resolutionHost.preferNonRecursiveWatch ); if (toWatch) { const { dir, dirPath, nonRecursive, packageDir, packageDirPath } = toWatch; if (dirPath === rootPath) { Debug.assert(nonRecursive); Debug.assert(!packageDir); setAtRoot = true; } else { setDirectoryWatcher(dir, dirPath, packageDir, packageDirPath, nonRecursive); } } return setAtRoot; } function watchFailedLookupLocationOfResolution(resolution) { var _a; Debug.assert(!!((_a = resolution.files) == null ? void 0 : _a.size)); const { failedLookupLocations, affectingLocations, alternateResult } = resolution; if (!(failedLookupLocations == null ? void 0 : failedLookupLocations.length) && !(affectingLocations == null ? void 0 : affectingLocations.length) && !alternateResult) return; if ((failedLookupLocations == null ? void 0 : failedLookupLocations.length) || alternateResult) resolutionsWithFailedLookups.add(resolution); let setAtRoot = false; if (failedLookupLocations) { for (const failedLookupLocation of failedLookupLocations) { setAtRoot = watchFailedLookupLocation(failedLookupLocation, setAtRoot); } } if (alternateResult) setAtRoot = watchFailedLookupLocation(alternateResult, setAtRoot); if (setAtRoot) { setDirectoryWatcher( rootDir, rootPath, /*packageDir*/ void 0, /*packageDirPath*/ void 0, /*nonRecursive*/ true ); } watchAffectingLocationsOfResolution(resolution, !(failedLookupLocations == null ? void 0 : failedLookupLocations.length) && !alternateResult); } function watchAffectingLocationsOfResolution(resolution, addToResolutionsWithOnlyAffectingLocations) { var _a; Debug.assert(!!((_a = resolution.files) == null ? void 0 : _a.size)); const { affectingLocations } = resolution; if (!(affectingLocations == null ? void 0 : affectingLocations.length)) return; if (addToResolutionsWithOnlyAffectingLocations) resolutionsWithOnlyAffectingLocations.add(resolution); for (const affectingLocation of affectingLocations) { createFileWatcherOfAffectingLocation( affectingLocation, /*forResolution*/ true ); } } function createFileWatcherOfAffectingLocation(affectingLocation, forResolution) { const fileWatcher = fileWatchesOfAffectingLocations.get(affectingLocation); if (fileWatcher) { if (forResolution) fileWatcher.resolutions++; else fileWatcher.files++; return; } let locationToWatch = affectingLocation; let isSymlink = false; let symlinkWatcher; if (resolutionHost.realpath) { locationToWatch = resolutionHost.realpath(affectingLocation); if (affectingLocation !== locationToWatch) { isSymlink = true; symlinkWatcher = fileWatchesOfAffectingLocations.get(locationToWatch); } } const resolutions = forResolution ? 1 : 0; const files = forResolution ? 0 : 1; if (!isSymlink || !symlinkWatcher) { const watcher = { watcher: canWatchAffectingLocation(resolutionHost.toPath(locationToWatch)) ? resolutionHost.watchAffectingFileLocation(locationToWatch, (fileName, eventKind) => { cachedDirectoryStructureHost == null ? void 0 : cachedDirectoryStructureHost.addOrDeleteFile(fileName, resolutionHost.toPath(locationToWatch), eventKind); invalidateAffectingFileWatcher(locationToWatch, moduleResolutionCache.getPackageJsonInfoCache().getInternalMap()); resolutionHost.scheduleInvalidateResolutionsOfFailedLookupLocations(); }) : noopFileWatcher, resolutions: isSymlink ? 0 : resolutions, files: isSymlink ? 0 : files, symlinks: void 0 }; fileWatchesOfAffectingLocations.set(locationToWatch, watcher); if (isSymlink) symlinkWatcher = watcher; } if (isSymlink) { Debug.assert(!!symlinkWatcher); const watcher = { watcher: { close: () => { var _a; const symlinkWatcher2 = fileWatchesOfAffectingLocations.get(locationToWatch); if (((_a = symlinkWatcher2 == null ? void 0 : symlinkWatcher2.symlinks) == null ? void 0 : _a.delete(affectingLocation)) && !symlinkWatcher2.symlinks.size && !symlinkWatcher2.resolutions && !symlinkWatcher2.files) { fileWatchesOfAffectingLocations.delete(locationToWatch); symlinkWatcher2.watcher.close(); } } }, resolutions, files, symlinks: void 0 }; fileWatchesOfAffectingLocations.set(affectingLocation, watcher); (symlinkWatcher.symlinks ?? (symlinkWatcher.symlinks = /* @__PURE__ */ new Set())).add(affectingLocation); } } function invalidateAffectingFileWatcher(path, packageJsonMap) { var _a; const watcher = fileWatchesOfAffectingLocations.get(path); if (watcher == null ? void 0 : watcher.resolutions) (affectingPathChecks ?? (affectingPathChecks = /* @__PURE__ */ new Set())).add(path); if (watcher == null ? void 0 : watcher.files) (affectingPathChecksForFile ?? (affectingPathChecksForFile = /* @__PURE__ */ new Set())).add(path); (_a = watcher == null ? void 0 : watcher.symlinks) == null ? void 0 : _a.forEach((path2) => invalidateAffectingFileWatcher(path2, packageJsonMap)); packageJsonMap == null ? void 0 : packageJsonMap.delete(resolutionHost.toPath(path)); } function watchFailedLookupLocationOfNonRelativeModuleResolutions() { nonRelativeExternalModuleResolutions.forEach(watchFailedLookupLocationOfResolution); nonRelativeExternalModuleResolutions.clear(); } function createDirectoryWatcherForPackageDir(dir, dirPath, packageDir, packageDirPath, nonRecursive) { Debug.assert(!nonRecursive); let isSymlink = isSymlinkCache.get(packageDirPath); let packageDirWatcher = packageDirWatchers.get(packageDirPath); if (isSymlink === void 0) { const realPath2 = resolutionHost.realpath(packageDir); isSymlink = realPath2 !== packageDir && resolutionHost.toPath(realPath2) !== packageDirPath; isSymlinkCache.set(packageDirPath, isSymlink); if (!packageDirWatcher) { packageDirWatchers.set( packageDirPath, packageDirWatcher = { dirPathToWatcher: /* @__PURE__ */ new Map(), isSymlink } ); } else if (packageDirWatcher.isSymlink !== isSymlink) { packageDirWatcher.dirPathToWatcher.forEach((watcher) => { removeDirectoryWatcher(packageDirWatcher.isSymlink ? packageDirPath : dirPath); watcher.watcher = createDirPathToWatcher(); }); packageDirWatcher.isSymlink = isSymlink; } } else { Debug.assertIsDefined(packageDirWatcher); Debug.assert(isSymlink === packageDirWatcher.isSymlink); } const forDirPath = packageDirWatcher.dirPathToWatcher.get(dirPath); if (forDirPath) { forDirPath.refCount++; } else { packageDirWatcher.dirPathToWatcher.set(dirPath, { watcher: createDirPathToWatcher(), refCount: 1 }); if (isSymlink) dirPathToSymlinkPackageRefCount.set(dirPath, (dirPathToSymlinkPackageRefCount.get(dirPath) ?? 0) + 1); } function createDirPathToWatcher() { return isSymlink ? createOrAddRefToDirectoryWatchOfFailedLookups(packageDir, packageDirPath, nonRecursive) : createOrAddRefToDirectoryWatchOfFailedLookups(dir, dirPath, nonRecursive); } } function setDirectoryWatcher(dir, dirPath, packageDir, packageDirPath, nonRecursive) { if (!packageDirPath || !resolutionHost.realpath) { createOrAddRefToDirectoryWatchOfFailedLookups(dir, dirPath, nonRecursive); } else { createDirectoryWatcherForPackageDir(dir, dirPath, packageDir, packageDirPath, nonRecursive); } } function createOrAddRefToDirectoryWatchOfFailedLookups(dir, dirPath, nonRecursive) { let dirWatcher = directoryWatchesOfFailedLookups.get(dirPath); if (dirWatcher) { Debug.assert(!!nonRecursive === !!dirWatcher.nonRecursive); dirWatcher.refCount++; } else { directoryWatchesOfFailedLookups.set(dirPath, dirWatcher = { watcher: createDirectoryWatcher(dir, dirPath, nonRecursive), refCount: 1, nonRecursive }); } return dirWatcher; } function stopWatchFailedLookupLocation(failedLookupLocation, removeAtRoot) { const failedLookupLocationPath = resolutionHost.toPath(failedLookupLocation); const toWatch = getDirectoryToWatchFailedLookupLocation( failedLookupLocation, failedLookupLocationPath, rootDir, rootPath, rootPathComponents, isRootWatchable, getCurrentDirectory, resolutionHost.preferNonRecursiveWatch ); if (toWatch) { const { dirPath, packageDirPath } = toWatch; if (dirPath === rootPath) { removeAtRoot = true; } else if (packageDirPath && resolutionHost.realpath) { const packageDirWatcher = packageDirWatchers.get(packageDirPath); const forDirPath = packageDirWatcher.dirPathToWatcher.get(dirPath); forDirPath.refCount--; if (forDirPath.refCount === 0) { removeDirectoryWatcher(packageDirWatcher.isSymlink ? packageDirPath : dirPath); packageDirWatcher.dirPathToWatcher.delete(dirPath); if (packageDirWatcher.isSymlink) { const refCount = dirPathToSymlinkPackageRefCount.get(dirPath) - 1; if (refCount === 0) { dirPathToSymlinkPackageRefCount.delete(dirPath); } else { dirPathToSymlinkPackageRefCount.set(dirPath, refCount); } } } } else { removeDirectoryWatcher(dirPath); } } return removeAtRoot; } function stopWatchFailedLookupLocationOfResolution(resolution, filePath, getResolutionWithResolvedFileName) { Debug.checkDefined(resolution.files).delete(filePath); if (resolution.files.size) return; resolution.files = void 0; const resolved = getResolutionWithResolvedFileName(resolution); if (resolved && resolved.resolvedFileName) { const key = resolutionHost.toPath(resolved.resolvedFileName); const resolutions = resolvedFileToResolution.get(key); if ((resolutions == null ? void 0 : resolutions.delete(resolution)) && !resolutions.size) resolvedFileToResolution.delete(key); } const { failedLookupLocations, affectingLocations, alternateResult } = resolution; if (resolutionsWithFailedLookups.delete(resolution)) { let removeAtRoot = false; if (failedLookupLocations) { for (const failedLookupLocation of failedLookupLocations) { removeAtRoot = stopWatchFailedLookupLocation(failedLookupLocation, removeAtRoot); } } if (alternateResult) removeAtRoot = stopWatchFailedLookupLocation(alternateResult, removeAtRoot); if (removeAtRoot) removeDirectoryWatcher(rootPath); } else if (affectingLocations == null ? void 0 : affectingLocations.length) { resolutionsWithOnlyAffectingLocations.delete(resolution); } if (affectingLocations) { for (const affectingLocation of affectingLocations) { const watcher = fileWatchesOfAffectingLocations.get(affectingLocation); watcher.resolutions--; } } } function removeDirectoryWatcher(dirPath) { const dirWatcher = directoryWatchesOfFailedLookups.get(dirPath); dirWatcher.refCount--; } function createDirectoryWatcher(directory, dirPath, nonRecursive) { return resolutionHost.watchDirectoryOfFailedLookupLocation(directory, (fileOrDirectory) => { const fileOrDirectoryPath = resolutionHost.toPath(fileOrDirectory); if (cachedDirectoryStructureHost) { cachedDirectoryStructureHost.addOrDeleteFileOrDirectory(fileOrDirectory, fileOrDirectoryPath); } scheduleInvalidateResolutionOfFailedLookupLocation(fileOrDirectoryPath, dirPath === fileOrDirectoryPath); }, nonRecursive ? 0 /* None */ : 1 /* Recursive */); } function removeResolutionsOfFileFromCache(cache, filePath, getResolutionWithResolvedFileName) { const resolutions = cache.get(filePath); if (resolutions) { resolutions.forEach( (resolution) => stopWatchFailedLookupLocationOfResolution( resolution, filePath, getResolutionWithResolvedFileName ) ); cache.delete(filePath); } } function removeResolutionsFromProjectReferenceRedirects(filePath) { if (!fileExtensionIs(filePath, ".json" /* Json */)) return; const program = resolutionHost.getCurrentProgram(); if (!program) return; const resolvedProjectReference = program.getResolvedProjectReferenceByPath(filePath); if (!resolvedProjectReference) return; resolvedProjectReference.commandLine.fileNames.forEach((f) => removeResolutionsOfFile(resolutionHost.toPath(f))); } function removeResolutionsOfFile(filePath) { removeResolutionsOfFileFromCache(resolvedModuleNames, filePath, getResolvedModuleFromResolution); removeResolutionsOfFileFromCache(resolvedTypeReferenceDirectives, filePath, getResolvedTypeReferenceDirectiveFromResolution); } function invalidateResolutions(resolutions, canInvalidate) { if (!resolutions) return false; let invalidated = false; resolutions.forEach((resolution) => { if (resolution.isInvalidated || !canInvalidate(resolution)) return; resolution.isInvalidated = invalidated = true; for (const containingFilePath of Debug.checkDefined(resolution.files)) { (filesWithInvalidatedResolutions ?? (filesWithInvalidatedResolutions = /* @__PURE__ */ new Set())).add(containingFilePath); hasChangedAutomaticTypeDirectiveNames = hasChangedAutomaticTypeDirectiveNames || endsWith(containingFilePath, inferredTypesContainingFile); } }); return invalidated; } function invalidateResolutionOfFile(filePath) { removeResolutionsOfFile(filePath); const prevHasChangedAutomaticTypeDirectiveNames = hasChangedAutomaticTypeDirectiveNames; if (invalidateResolutions(resolvedFileToResolution.get(filePath), returnTrue) && hasChangedAutomaticTypeDirectiveNames && !prevHasChangedAutomaticTypeDirectiveNames) { resolutionHost.onChangedAutomaticTypeDirectiveNames(); } } function setFilesWithInvalidatedNonRelativeUnresolvedImports(filesMap) { Debug.assert(filesWithInvalidatedNonRelativeUnresolvedImports === filesMap || filesWithInvalidatedNonRelativeUnresolvedImports === void 0); filesWithInvalidatedNonRelativeUnresolvedImports = filesMap; } function scheduleInvalidateResolutionOfFailedLookupLocation(fileOrDirectoryPath, isCreatingWatchedDirectory) { if (isCreatingWatchedDirectory) { (isInDirectoryChecks || (isInDirectoryChecks = /* @__PURE__ */ new Set())).add(fileOrDirectoryPath); } else { const updatedPath = removeIgnoredPath(fileOrDirectoryPath); if (!updatedPath) return false; fileOrDirectoryPath = updatedPath; if (resolutionHost.fileIsOpen(fileOrDirectoryPath)) { return false; } const dirOfFileOrDirectory = getDirectoryPath(fileOrDirectoryPath); if (isNodeModulesAtTypesDirectory(fileOrDirectoryPath) || isNodeModulesDirectory(fileOrDirectoryPath) || isNodeModulesAtTypesDirectory(dirOfFileOrDirectory) || isNodeModulesDirectory(dirOfFileOrDirectory)) { (failedLookupChecks || (failedLookupChecks = /* @__PURE__ */ new Set())).add(fileOrDirectoryPath); (startsWithPathChecks || (startsWithPathChecks = /* @__PURE__ */ new Set())).add(fileOrDirectoryPath); } else { if (isEmittedFileOfProgram(resolutionHost.getCurrentProgram(), fileOrDirectoryPath)) { return false; } if (fileExtensionIs(fileOrDirectoryPath, ".map")) { return false; } (failedLookupChecks || (failedLookupChecks = /* @__PURE__ */ new Set())).add(fileOrDirectoryPath); (startsWithPathChecks || (startsWithPathChecks = /* @__PURE__ */ new Set())).add(fileOrDirectoryPath); const packagePath = parseNodeModuleFromPath( fileOrDirectoryPath, /*isFolder*/ true ); if (packagePath) (startsWithPathChecks || (startsWithPathChecks = /* @__PURE__ */ new Set())).add(packagePath); } } resolutionHost.scheduleInvalidateResolutionsOfFailedLookupLocations(); } function invalidatePackageJsonMap() { const packageJsonMap = moduleResolutionCache.getPackageJsonInfoCache().getInternalMap(); if (packageJsonMap && (failedLookupChecks || startsWithPathChecks || isInDirectoryChecks)) { packageJsonMap.forEach((_value, path) => isInvalidatedFailedLookup(path) ? packageJsonMap.delete(path) : void 0); } } function invalidateResolutionsOfFailedLookupLocations() { var _a; if (allModuleAndTypeResolutionsAreInvalidated) { affectingPathChecksForFile = void 0; invalidatePackageJsonMap(); if (failedLookupChecks || startsWithPathChecks || isInDirectoryChecks || affectingPathChecks) { invalidateResolutions(resolvedLibraries, canInvalidateFailedLookupResolution); } failedLookupChecks = void 0; startsWithPathChecks = void 0; isInDirectoryChecks = void 0; affectingPathChecks = void 0; return true; } let invalidated = false; if (affectingPathChecksForFile) { (_a = resolutionHost.getCurrentProgram()) == null ? void 0 : _a.getSourceFiles().forEach((f) => { if (some(f.packageJsonLocations, (location) => affectingPathChecksForFile.has(location))) { (filesWithInvalidatedResolutions ?? (filesWithInvalidatedResolutions = /* @__PURE__ */ new Set())).add(f.path); invalidated = true; } }); affectingPathChecksForFile = void 0; } if (!failedLookupChecks && !startsWithPathChecks && !isInDirectoryChecks && !affectingPathChecks) { return invalidated; } invalidated = invalidateResolutions(resolutionsWithFailedLookups, canInvalidateFailedLookupResolution) || invalidated; invalidatePackageJsonMap(); failedLookupChecks = void 0; startsWithPathChecks = void 0; isInDirectoryChecks = void 0; invalidated = invalidateResolutions(resolutionsWithOnlyAffectingLocations, canInvalidatedFailedLookupResolutionWithAffectingLocation) || invalidated; affectingPathChecks = void 0; return invalidated; } function canInvalidateFailedLookupResolution(resolution) { var _a; if (canInvalidatedFailedLookupResolutionWithAffectingLocation(resolution)) return true; if (!failedLookupChecks && !startsWithPathChecks && !isInDirectoryChecks) return false; return ((_a = resolution.failedLookupLocations) == null ? void 0 : _a.some((location) => isInvalidatedFailedLookup(resolutionHost.toPath(location)))) || !!resolution.alternateResult && isInvalidatedFailedLookup(resolutionHost.toPath(resolution.alternateResult)); } function isInvalidatedFailedLookup(locationPath) { return (failedLookupChecks == null ? void 0 : failedLookupChecks.has(locationPath)) || firstDefinedIterator((startsWithPathChecks == null ? void 0 : startsWithPathChecks.keys()) || [], (fileOrDirectoryPath) => startsWith(locationPath, fileOrDirectoryPath) ? true : void 0) || firstDefinedIterator((isInDirectoryChecks == null ? void 0 : isInDirectoryChecks.keys()) || [], (dirPath) => locationPath.length > dirPath.length && startsWith(locationPath, dirPath) && (isDiskPathRoot(dirPath) || locationPath[dirPath.length] === directorySeparator) ? true : void 0); } function canInvalidatedFailedLookupResolutionWithAffectingLocation(resolution) { var _a; return !!affectingPathChecks && ((_a = resolution.affectingLocations) == null ? void 0 : _a.some((location) => affectingPathChecks.has(location))); } function closeTypeRootsWatch() { clearMap(typeRootsWatches, closeFileWatcher); } function createTypeRootsWatch(typeRoot) { return canWatchTypeRootPath(typeRoot) ? resolutionHost.watchTypeRootsDirectory(typeRoot, (fileOrDirectory) => { const fileOrDirectoryPath = resolutionHost.toPath(fileOrDirectory); if (cachedDirectoryStructureHost) { cachedDirectoryStructureHost.addOrDeleteFileOrDirectory(fileOrDirectory, fileOrDirectoryPath); } hasChangedAutomaticTypeDirectiveNames = true; resolutionHost.onChangedAutomaticTypeDirectiveNames(); const dirPath = getDirectoryToWatchFailedLookupLocationFromTypeRoot( typeRoot, resolutionHost.toPath(typeRoot), rootPath, rootPathComponents, isRootWatchable, getCurrentDirectory, resolutionHost.preferNonRecursiveWatch, (dirPath2) => directoryWatchesOfFailedLookups.has(dirPath2) || dirPathToSymlinkPackageRefCount.has(dirPath2) ); if (dirPath) { scheduleInvalidateResolutionOfFailedLookupLocation(fileOrDirectoryPath, dirPath === fileOrDirectoryPath); } }, 1 /* Recursive */) : noopFileWatcher; } function updateTypeRootsWatch() { const options = resolutionHost.getCompilationSettings(); if (options.types) { closeTypeRootsWatch(); return; } const typeRoots = getEffectiveTypeRoots(options, { getCurrentDirectory }); if (typeRoots) { mutateMap( typeRootsWatches, new Set(typeRoots), { createNewValue: createTypeRootsWatch, onDeleteValue: closeFileWatcher } ); } else { closeTypeRootsWatch(); } } function canWatchTypeRootPath(typeRoot) { if (resolutionHost.getCompilationSettings().typeRoots) return true; return canWatchAtTypes(resolutionHost.toPath(typeRoot)); } } function resolutionIsSymlink(resolution) { var _a, _b; return !!(((_a = resolution.resolvedModule) == null ? void 0 : _a.originalPath) || ((_b = resolution.resolvedTypeReferenceDirective) == null ? void 0 : _b.originalPath)); } // src/compiler/watch.ts var sysFormatDiagnosticsHost = sys ? { getCurrentDirectory: () => sys.getCurrentDirectory(), getNewLine: () => sys.newLine, getCanonicalFileName: createGetCanonicalFileName(sys.useCaseSensitiveFileNames) } : void 0; function createDiagnosticReporter(system, pretty) { const host = system === sys && sysFormatDiagnosticsHost ? sysFormatDiagnosticsHost : { getCurrentDirectory: () => system.getCurrentDirectory(), getNewLine: () => system.newLine, getCanonicalFileName: createGetCanonicalFileName(system.useCaseSensitiveFileNames) }; if (!pretty) { return (diagnostic) => system.write(formatDiagnostic(diagnostic, host)); } const diagnostics = new Array(1); return (diagnostic) => { diagnostics[0] = diagnostic; system.write(formatDiagnosticsWithColorAndContext(diagnostics, host) + host.getNewLine()); diagnostics[0] = void 0; }; } function clearScreenIfNotWatchingForFileChanges(system, diagnostic, options) { if (system.clearScreen && !options.preserveWatchOutput && !options.extendedDiagnostics && !options.diagnostics && contains(screenStartingMessageCodes, diagnostic.code)) { system.clearScreen(); return true; } return false; } var screenStartingMessageCodes = [ Diagnostics.Starting_compilation_in_watch_mode.code, Diagnostics.File_change_detected_Starting_incremental_compilation.code ]; function getPlainDiagnosticFollowingNewLines(diagnostic, newLine) { return contains(screenStartingMessageCodes, diagnostic.code) ? newLine + newLine : newLine; } function getLocaleTimeString(system) { return !system.now ? (/* @__PURE__ */ new Date()).toLocaleTimeString() : ( // On some systems / builds of Node, there's a non-breaking space between the time and AM/PM. // This branch is solely for testing, so just switch it to a normal space for baseline stability. // See: // - https://github.com/nodejs/node/issues/45171 // - https://github.com/nodejs/node/issues/45753 system.now().toLocaleTimeString("en-US", { timeZone: "UTC" }).replace("\u202F", " ") ); } function createWatchStatusReporter(system, pretty) { return pretty ? (diagnostic, newLine, options) => { clearScreenIfNotWatchingForFileChanges(system, diagnostic, options); let output = `[${formatColorAndReset(getLocaleTimeString(system), "\x1B[90m" /* Grey */)}] `; output += `${flattenDiagnosticMessageText(diagnostic.messageText, system.newLine)}${newLine + newLine}`; system.write(output); } : (diagnostic, newLine, options) => { let output = ""; if (!clearScreenIfNotWatchingForFileChanges(system, diagnostic, options)) { output += newLine; } output += `${getLocaleTimeString(system)} - `; output += `${flattenDiagnosticMessageText(diagnostic.messageText, system.newLine)}${getPlainDiagnosticFollowingNewLines(diagnostic, newLine)}`; system.write(output); }; } function parseConfigFileWithSystem(configFileName, optionsToExtend, extendedConfigCache, watchOptionsToExtend, system, reportDiagnostic) { const host = system; host.onUnRecoverableConfigFileDiagnostic = (diagnostic) => reportUnrecoverableDiagnostic(system, reportDiagnostic, diagnostic); const result = getParsedCommandLineOfConfigFile(configFileName, optionsToExtend, host, extendedConfigCache, watchOptionsToExtend); host.onUnRecoverableConfigFileDiagnostic = void 0; return result; } function getErrorCountForSummary(diagnostics) { return countWhere(diagnostics, (diagnostic) => diagnostic.category === 1 /* Error */); } function getFilesInErrorForSummary(diagnostics) { const filesInError = filter(diagnostics, (diagnostic) => diagnostic.category === 1 /* Error */).map( (errorDiagnostic) => { if (errorDiagnostic.file === void 0) return; return `${errorDiagnostic.file.fileName}`; } ); return filesInError.map((fileName) => { if (fileName === void 0) { return void 0; } const diagnosticForFileName = find(diagnostics, (diagnostic) => diagnostic.file !== void 0 && diagnostic.file.fileName === fileName); if (diagnosticForFileName !== void 0) { const { line } = getLineAndCharacterOfPosition(diagnosticForFileName.file, diagnosticForFileName.start); return { fileName, line: line + 1 }; } }); } function getWatchErrorSummaryDiagnosticMessage(errorCount) { return errorCount === 1 ? Diagnostics.Found_1_error_Watching_for_file_changes : Diagnostics.Found_0_errors_Watching_for_file_changes; } function prettyPathForFileError(error, cwd) { const line = formatColorAndReset(":" + error.line, "\x1B[90m" /* Grey */); if (pathIsAbsolute(error.fileName) && pathIsAbsolute(cwd)) { return getRelativePathFromDirectory( cwd, error.fileName, /*ignoreCase*/ false ) + line; } return error.fileName + line; } function getErrorSummaryText(errorCount, filesInError, newLine, host) { if (errorCount === 0) return ""; const nonNilFiles = filesInError.filter((fileInError) => fileInError !== void 0); const distinctFileNamesWithLines = nonNilFiles.map((fileInError) => `${fileInError.fileName}:${fileInError.line}`).filter((value, index, self) => self.indexOf(value) === index); const firstFileReference = nonNilFiles[0] && prettyPathForFileError(nonNilFiles[0], host.getCurrentDirectory()); let messageAndArgs; if (errorCount === 1) { messageAndArgs = filesInError[0] !== void 0 ? [Diagnostics.Found_1_error_in_0, firstFileReference] : [Diagnostics.Found_1_error]; } else { messageAndArgs = distinctFileNamesWithLines.length === 0 ? [Diagnostics.Found_0_errors, errorCount] : distinctFileNamesWithLines.length === 1 ? [Diagnostics.Found_0_errors_in_the_same_file_starting_at_Colon_1, errorCount, firstFileReference] : [Diagnostics.Found_0_errors_in_1_files, errorCount, distinctFileNamesWithLines.length]; } const d = createCompilerDiagnostic(...messageAndArgs); const suffix = distinctFileNamesWithLines.length > 1 ? createTabularErrorsDisplay(nonNilFiles, host) : ""; return `${newLine}${flattenDiagnosticMessageText(d.messageText, newLine)}${newLine}${newLine}${suffix}`; } function createTabularErrorsDisplay(filesInError, host) { const distinctFiles = filesInError.filter((value, index, self) => index === self.findIndex((file) => (file == null ? void 0 : file.fileName) === (value == null ? void 0 : value.fileName))); if (distinctFiles.length === 0) return ""; const numberLength = (num) => Math.log(num) * Math.LOG10E + 1; const fileToErrorCount = distinctFiles.map((file) => [file, countWhere(filesInError, (fileInError) => fileInError.fileName === file.fileName)]); const maxErrors = maxBy(fileToErrorCount, 0, (value) => value[1]); const headerRow = Diagnostics.Errors_Files.message; const leftColumnHeadingLength = headerRow.split(" ")[0].length; const leftPaddingGoal = Math.max(leftColumnHeadingLength, numberLength(maxErrors)); const headerPadding = Math.max(numberLength(maxErrors) - leftColumnHeadingLength, 0); let tabularData = ""; tabularData += " ".repeat(headerPadding) + headerRow + "\n"; fileToErrorCount.forEach((row) => { const [file, errorCount] = row; const errorCountDigitsLength = Math.log(errorCount) * Math.LOG10E + 1 | 0; const leftPadding = errorCountDigitsLength < leftPaddingGoal ? " ".repeat(leftPaddingGoal - errorCountDigitsLength) : ""; const fileRef = prettyPathForFileError(file, host.getCurrentDirectory()); tabularData += `${leftPadding}${errorCount} ${fileRef} `; }); return tabularData; } function isBuilderProgram(program) { return !!program.state; } function listFiles(program, write) { const options = program.getCompilerOptions(); if (options.explainFiles) { explainFiles(isBuilderProgram(program) ? program.getProgram() : program, write); } else if (options.listFiles || options.listFilesOnly) { forEach(program.getSourceFiles(), (file) => { write(file.fileName); }); } } function explainFiles(program, write) { var _a, _b; const reasons = program.getFileIncludeReasons(); const relativeFileName = (fileName) => convertToRelativePath(fileName, program.getCurrentDirectory(), program.getCanonicalFileName); for (const file of program.getSourceFiles()) { write(`${toFileName(file, relativeFileName)}`); (_a = reasons.get(file.path)) == null ? void 0 : _a.forEach((reason) => write(` ${fileIncludeReasonToDiagnostics(program, reason, relativeFileName).messageText}`)); (_b = explainIfFileIsRedirectAndImpliedFormat(file, program.getCompilerOptionsForFile(file), relativeFileName)) == null ? void 0 : _b.forEach((d) => write(` ${d.messageText}`)); } } function explainIfFileIsRedirectAndImpliedFormat(file, options, fileNameConvertor) { var _a; let result; if (file.path !== file.resolvedPath) { (result ?? (result = [])).push(chainDiagnosticMessages( /*details*/ void 0, Diagnostics.File_is_output_of_project_reference_source_0, toFileName(file.originalFileName, fileNameConvertor) )); } if (file.redirectInfo) { (result ?? (result = [])).push(chainDiagnosticMessages( /*details*/ void 0, Diagnostics.File_redirects_to_file_0, toFileName(file.redirectInfo.redirectTarget, fileNameConvertor) )); } if (isExternalOrCommonJsModule(file)) { switch (getImpliedNodeFormatForEmitWorker(file, options)) { case 99 /* ESNext */: if (file.packageJsonScope) { (result ?? (result = [])).push(chainDiagnosticMessages( /*details*/ void 0, Diagnostics.File_is_ECMAScript_module_because_0_has_field_type_with_value_module, toFileName(last(file.packageJsonLocations), fileNameConvertor) )); } break; case 1 /* CommonJS */: if (file.packageJsonScope) { (result ?? (result = [])).push(chainDiagnosticMessages( /*details*/ void 0, file.packageJsonScope.contents.packageJsonContent.type ? Diagnostics.File_is_CommonJS_module_because_0_has_field_type_whose_value_is_not_module : Diagnostics.File_is_CommonJS_module_because_0_does_not_have_field_type, toFileName(last(file.packageJsonLocations), fileNameConvertor) )); } else if ((_a = file.packageJsonLocations) == null ? void 0 : _a.length) { (result ?? (result = [])).push(chainDiagnosticMessages( /*details*/ void 0, Diagnostics.File_is_CommonJS_module_because_package_json_was_not_found )); } break; } } return result; } function getMatchedFileSpec(program, fileName) { var _a; const configFile = program.getCompilerOptions().configFile; if (!((_a = configFile == null ? void 0 : configFile.configFileSpecs) == null ? void 0 : _a.validatedFilesSpec)) return void 0; const filePath = program.getCanonicalFileName(fileName); const basePath = getDirectoryPath(getNormalizedAbsolutePath(configFile.fileName, program.getCurrentDirectory())); const index = findIndex(configFile.configFileSpecs.validatedFilesSpec, (fileSpec) => program.getCanonicalFileName(getNormalizedAbsolutePath(fileSpec, basePath)) === filePath); return index !== -1 ? configFile.configFileSpecs.validatedFilesSpecBeforeSubstitution[index] : void 0; } function getMatchedIncludeSpec(program, fileName) { var _a, _b; const configFile = program.getCompilerOptions().configFile; if (!((_a = configFile == null ? void 0 : configFile.configFileSpecs) == null ? void 0 : _a.validatedIncludeSpecs)) return void 0; if (configFile.configFileSpecs.isDefaultIncludeSpec) return true; const isJsonFile = fileExtensionIs(fileName, ".json" /* Json */); const basePath = getDirectoryPath(getNormalizedAbsolutePath(configFile.fileName, program.getCurrentDirectory())); const useCaseSensitiveFileNames2 = program.useCaseSensitiveFileNames(); const index = findIndex((_b = configFile == null ? void 0 : configFile.configFileSpecs) == null ? void 0 : _b.validatedIncludeSpecs, (includeSpec) => { if (isJsonFile && !endsWith(includeSpec, ".json" /* Json */)) return false; const pattern = getPatternFromSpec(includeSpec, basePath, "files"); return !!pattern && getRegexFromPattern(`(?:${pattern})$`, useCaseSensitiveFileNames2).test(fileName); }); return index !== -1 ? configFile.configFileSpecs.validatedIncludeSpecsBeforeSubstitution[index] : void 0; } function fileIncludeReasonToDiagnostics(program, reason, fileNameConvertor) { var _a, _b; const options = program.getCompilerOptions(); if (isReferencedFile(reason)) { const referenceLocation = getReferencedFileLocation(program, reason); const referenceText = isReferenceFileLocation(referenceLocation) ? referenceLocation.file.text.substring(referenceLocation.pos, referenceLocation.end) : `"${referenceLocation.text}"`; let message; Debug.assert(isReferenceFileLocation(referenceLocation) || reason.kind === 3 /* Import */, "Only synthetic references are imports"); switch (reason.kind) { case 3 /* Import */: if (isReferenceFileLocation(referenceLocation)) { message = referenceLocation.packageId ? Diagnostics.Imported_via_0_from_file_1_with_packageId_2 : Diagnostics.Imported_via_0_from_file_1; } else if (referenceLocation.text === externalHelpersModuleNameText) { message = referenceLocation.packageId ? Diagnostics.Imported_via_0_from_file_1_with_packageId_2_to_import_importHelpers_as_specified_in_compilerOptions : Diagnostics.Imported_via_0_from_file_1_to_import_importHelpers_as_specified_in_compilerOptions; } else { message = referenceLocation.packageId ? Diagnostics.Imported_via_0_from_file_1_with_packageId_2_to_import_jsx_and_jsxs_factory_functions : Diagnostics.Imported_via_0_from_file_1_to_import_jsx_and_jsxs_factory_functions; } break; case 4 /* ReferenceFile */: Debug.assert(!referenceLocation.packageId); message = Diagnostics.Referenced_via_0_from_file_1; break; case 5 /* TypeReferenceDirective */: message = referenceLocation.packageId ? Diagnostics.Type_library_referenced_via_0_from_file_1_with_packageId_2 : Diagnostics.Type_library_referenced_via_0_from_file_1; break; case 7 /* LibReferenceDirective */: Debug.assert(!referenceLocation.packageId); message = Diagnostics.Library_referenced_via_0_from_file_1; break; default: Debug.assertNever(reason); } return chainDiagnosticMessages( /*details*/ void 0, message, referenceText, toFileName(referenceLocation.file, fileNameConvertor), referenceLocation.packageId && packageIdToString(referenceLocation.packageId) ); } switch (reason.kind) { case 0 /* RootFile */: if (!((_a = options.configFile) == null ? void 0 : _a.configFileSpecs)) return chainDiagnosticMessages( /*details*/ void 0, Diagnostics.Root_file_specified_for_compilation ); const fileName = getNormalizedAbsolutePath(program.getRootFileNames()[reason.index], program.getCurrentDirectory()); const matchedByFiles = getMatchedFileSpec(program, fileName); if (matchedByFiles) return chainDiagnosticMessages( /*details*/ void 0, Diagnostics.Part_of_files_list_in_tsconfig_json ); const matchedByInclude = getMatchedIncludeSpec(program, fileName); return isString(matchedByInclude) ? chainDiagnosticMessages( /*details*/ void 0, Diagnostics.Matched_by_include_pattern_0_in_1, matchedByInclude, toFileName(options.configFile, fileNameConvertor) ) : ( // Could be additional files specified as roots or matched by default include chainDiagnosticMessages( /*details*/ void 0, matchedByInclude ? Diagnostics.Matched_by_default_include_pattern_Asterisk_Asterisk_Slash_Asterisk : Diagnostics.Root_file_specified_for_compilation ) ); case 1 /* SourceFromProjectReference */: case 2 /* OutputFromProjectReference */: const isOutput = reason.kind === 2 /* OutputFromProjectReference */; const referencedResolvedRef = Debug.checkDefined((_b = program.getResolvedProjectReferences()) == null ? void 0 : _b[reason.index]); return chainDiagnosticMessages( /*details*/ void 0, options.outFile ? isOutput ? Diagnostics.Output_from_referenced_project_0_included_because_1_specified : Diagnostics.Source_from_referenced_project_0_included_because_1_specified : isOutput ? Diagnostics.Output_from_referenced_project_0_included_because_module_is_specified_as_none : Diagnostics.Source_from_referenced_project_0_included_because_module_is_specified_as_none, toFileName(referencedResolvedRef.sourceFile.fileName, fileNameConvertor), options.outFile ? "--outFile" : "--out" ); case 8 /* AutomaticTypeDirectiveFile */: { const messageAndArgs = options.types ? reason.packageId ? [Diagnostics.Entry_point_of_type_library_0_specified_in_compilerOptions_with_packageId_1, reason.typeReference, packageIdToString(reason.packageId)] : [Diagnostics.Entry_point_of_type_library_0_specified_in_compilerOptions, reason.typeReference] : reason.packageId ? [Diagnostics.Entry_point_for_implicit_type_library_0_with_packageId_1, reason.typeReference, packageIdToString(reason.packageId)] : [Diagnostics.Entry_point_for_implicit_type_library_0, reason.typeReference]; return chainDiagnosticMessages( /*details*/ void 0, ...messageAndArgs ); } case 6 /* LibFile */: { if (reason.index !== void 0) return chainDiagnosticMessages( /*details*/ void 0, Diagnostics.Library_0_specified_in_compilerOptions, options.lib[reason.index] ); const target = getNameOfScriptTarget(getEmitScriptTarget(options)); const messageAndArgs = target ? [Diagnostics.Default_library_for_target_0, target] : [Diagnostics.Default_library]; return chainDiagnosticMessages( /*details*/ void 0, ...messageAndArgs ); } default: Debug.assertNever(reason); } } function toFileName(file, fileNameConvertor) { const fileName = isString(file) ? file : file.fileName; return fileNameConvertor ? fileNameConvertor(fileName) : fileName; } function emitFilesAndReportErrors(program, reportDiagnostic, write, reportSummary, writeFile2, cancellationToken, emitOnlyDtsFiles, customTransformers) { const options = program.getCompilerOptions(); const allDiagnostics = program.getConfigFileParsingDiagnostics().slice(); const configFileParsingDiagnosticsLength = allDiagnostics.length; addRange(allDiagnostics, program.getSyntacticDiagnostics( /*sourceFile*/ void 0, cancellationToken )); if (allDiagnostics.length === configFileParsingDiagnosticsLength) { addRange(allDiagnostics, program.getOptionsDiagnostics(cancellationToken)); if (!options.listFilesOnly) { addRange(allDiagnostics, program.getGlobalDiagnostics(cancellationToken)); if (allDiagnostics.length === configFileParsingDiagnosticsLength) { addRange(allDiagnostics, program.getSemanticDiagnostics( /*sourceFile*/ void 0, cancellationToken )); } if (options.noEmit && getEmitDeclarations(options) && allDiagnostics.length === configFileParsingDiagnosticsLength) { addRange(allDiagnostics, program.getDeclarationDiagnostics( /*sourceFile*/ void 0, cancellationToken )); } } } const emitResult = options.listFilesOnly ? { emitSkipped: true, diagnostics: emptyArray } : program.emit( /*targetSourceFile*/ void 0, writeFile2, cancellationToken, emitOnlyDtsFiles, customTransformers ); addRange(allDiagnostics, emitResult.diagnostics); const diagnostics = sortAndDeduplicateDiagnostics(allDiagnostics); diagnostics.forEach(reportDiagnostic); if (write) { const currentDir = program.getCurrentDirectory(); forEach(emitResult.emittedFiles, (file) => { const filepath = getNormalizedAbsolutePath(file, currentDir); write(`TSFILE: ${filepath}`); }); listFiles(program, write); } if (reportSummary) { reportSummary(getErrorCountForSummary(diagnostics), getFilesInErrorForSummary(diagnostics)); } return { emitResult, diagnostics }; } function emitFilesAndReportErrorsAndGetExitStatus(program, reportDiagnostic, write, reportSummary, writeFile2, cancellationToken, emitOnlyDtsFiles, customTransformers) { const { emitResult, diagnostics } = emitFilesAndReportErrors( program, reportDiagnostic, write, reportSummary, writeFile2, cancellationToken, emitOnlyDtsFiles, customTransformers ); if (emitResult.emitSkipped && diagnostics.length > 0) { return 1 /* DiagnosticsPresent_OutputsSkipped */; } else if (diagnostics.length > 0) { return 2 /* DiagnosticsPresent_OutputsGenerated */; } return 0 /* Success */; } var noopFileWatcher = { close: noop }; var returnNoopFileWatcher = () => noopFileWatcher; function createWatchHost(system = sys, reportWatchStatus2) { const onWatchStatusChange = reportWatchStatus2 || createWatchStatusReporter(system); return { onWatchStatusChange, watchFile: maybeBind(system, system.watchFile) || returnNoopFileWatcher, watchDirectory: maybeBind(system, system.watchDirectory) || returnNoopFileWatcher, setTimeout: maybeBind(system, system.setTimeout) || noop, clearTimeout: maybeBind(system, system.clearTimeout) || noop, preferNonRecursiveWatch: system.preferNonRecursiveWatch }; } var WatchType = { ConfigFile: "Config file", ExtendedConfigFile: "Extended config file", SourceFile: "Source file", MissingFile: "Missing file", WildcardDirectory: "Wild card directory", FailedLookupLocations: "Failed Lookup Locations", AffectingFileLocation: "File location affecting resolution", TypeRoots: "Type roots", ConfigFileOfReferencedProject: "Config file of referened project", ExtendedConfigOfReferencedProject: "Extended config file of referenced project", WildcardDirectoryOfReferencedProject: "Wild card directory of referenced project", PackageJson: "package.json file", ClosedScriptInfo: "Closed Script info", ConfigFileForInferredRoot: "Config file for the inferred project root", NodeModules: "node_modules for closed script infos and package.jsons affecting module specifier cache", MissingSourceMapFile: "Missing source map file", NoopConfigFileForInferredRoot: "Noop Config file for the inferred project root", MissingGeneratedFile: "Missing generated file", NodeModulesForModuleSpecifierCache: "node_modules for module specifier cache invalidation", TypingInstallerLocationFile: "File location for typing installer", TypingInstallerLocationDirectory: "Directory location for typing installer" }; function createWatchFactory(host, options) { const watchLogLevel = host.trace ? options.extendedDiagnostics ? 2 /* Verbose */ : options.diagnostics ? 1 /* TriggerOnly */ : 0 /* None */ : 0 /* None */; const writeLog = watchLogLevel !== 0 /* None */ ? (s) => host.trace(s) : noop; const result = getWatchFactory(host, watchLogLevel, writeLog); result.writeLog = writeLog; return result; } function createCompilerHostFromProgramHost(host, getCompilerOptions, directoryStructureHost = host) { const useCaseSensitiveFileNames2 = host.useCaseSensitiveFileNames(); const compilerHost = { getSourceFile: createGetSourceFile( (fileName, encoding) => !encoding ? compilerHost.readFile(fileName) : host.readFile(fileName, encoding), /*setParentNodes*/ void 0 ), getDefaultLibLocation: maybeBind(host, host.getDefaultLibLocation), getDefaultLibFileName: (options) => host.getDefaultLibFileName(options), writeFile: createWriteFileMeasuringIO( (path, data, writeByteOrderMark) => host.writeFile(path, data, writeByteOrderMark), (path) => host.createDirectory(path), (path) => host.directoryExists(path) ), getCurrentDirectory: memoize(() => host.getCurrentDirectory()), useCaseSensitiveFileNames: () => useCaseSensitiveFileNames2, getCanonicalFileName: createGetCanonicalFileName(useCaseSensitiveFileNames2), getNewLine: () => getNewLineCharacter(getCompilerOptions()), fileExists: (f) => host.fileExists(f), readFile: (f) => host.readFile(f), trace: maybeBind(host, host.trace), directoryExists: maybeBind(directoryStructureHost, directoryStructureHost.directoryExists), getDirectories: maybeBind(directoryStructureHost, directoryStructureHost.getDirectories), realpath: maybeBind(host, host.realpath), getEnvironmentVariable: maybeBind(host, host.getEnvironmentVariable) || (() => ""), createHash: maybeBind(host, host.createHash), readDirectory: maybeBind(host, host.readDirectory), storeSignatureInfo: host.storeSignatureInfo, jsDocParsingMode: host.jsDocParsingMode }; return compilerHost; } function getSourceFileVersionAsHashFromText(host, text) { if (text.match(sourceMapCommentRegExpDontCareLineStart)) { let lineEnd = text.length; let lineStart = lineEnd; for (let pos = lineEnd - 1; pos >= 0; pos--) { const ch = text.charCodeAt(pos); switch (ch) { case 10 /* lineFeed */: if (pos && text.charCodeAt(pos - 1) === 13 /* carriageReturn */) { pos--; } // falls through case 13 /* carriageReturn */: break; default: if (ch < 127 /* maxAsciiCharacter */ || !isLineBreak(ch)) { lineStart = pos; continue; } break; } const line = text.substring(lineStart, lineEnd); if (line.match(sourceMapCommentRegExp)) { text = text.substring(0, lineStart); break; } else if (!line.match(whitespaceOrMapCommentRegExp)) { break; } lineEnd = lineStart; } } return (host.createHash || generateDjb2Hash)(text); } function setGetSourceFileAsHashVersioned(compilerHost) { const originalGetSourceFile = compilerHost.getSourceFile; compilerHost.getSourceFile = (...args) => { const result = originalGetSourceFile.call(compilerHost, ...args); if (result) { result.version = getSourceFileVersionAsHashFromText(compilerHost, result.text); } return result; }; } function createProgramHost(system, createProgram2) { const getDefaultLibLocation = memoize(() => getDirectoryPath(normalizePath(system.getExecutingFilePath()))); return { useCaseSensitiveFileNames: () => system.useCaseSensitiveFileNames, getNewLine: () => system.newLine, getCurrentDirectory: memoize(() => system.getCurrentDirectory()), getDefaultLibLocation, getDefaultLibFileName: (options) => combinePaths(getDefaultLibLocation(), getDefaultLibFileName(options)), fileExists: (path) => system.fileExists(path), readFile: (path, encoding) => system.readFile(path, encoding), directoryExists: (path) => system.directoryExists(path), getDirectories: (path) => system.getDirectories(path), readDirectory: (path, extensions, exclude, include, depth) => system.readDirectory(path, extensions, exclude, include, depth), realpath: maybeBind(system, system.realpath), getEnvironmentVariable: maybeBind(system, system.getEnvironmentVariable), trace: (s) => system.write(s + system.newLine), createDirectory: (path) => system.createDirectory(path), writeFile: (path, data, writeByteOrderMark) => system.writeFile(path, data, writeByteOrderMark), createHash: maybeBind(system, system.createHash), createProgram: createProgram2 || createEmitAndSemanticDiagnosticsBuilderProgram, storeSignatureInfo: system.storeSignatureInfo, now: maybeBind(system, system.now) }; } function createWatchCompilerHost(system = sys, createProgram2, reportDiagnostic, reportWatchStatus2) { const write = (s) => system.write(s + system.newLine); const result = createProgramHost(system, createProgram2); copyProperties(result, createWatchHost(system, reportWatchStatus2)); result.afterProgramCreate = (builderProgram) => { const compilerOptions = builderProgram.getCompilerOptions(); const newLine = getNewLineCharacter(compilerOptions); emitFilesAndReportErrors( builderProgram, reportDiagnostic, write, (errorCount) => result.onWatchStatusChange( createCompilerDiagnostic(getWatchErrorSummaryDiagnosticMessage(errorCount), errorCount), newLine, compilerOptions, errorCount ) ); }; return result; } function reportUnrecoverableDiagnostic(system, reportDiagnostic, diagnostic) { reportDiagnostic(diagnostic); system.exit(1 /* DiagnosticsPresent_OutputsSkipped */); } function createWatchCompilerHostOfConfigFile({ configFileName, optionsToExtend, watchOptionsToExtend, extraFileExtensions, system, createProgram: createProgram2, reportDiagnostic, reportWatchStatus: reportWatchStatus2 }) { const diagnosticReporter = reportDiagnostic || createDiagnosticReporter(system); const host = createWatchCompilerHost(system, createProgram2, diagnosticReporter, reportWatchStatus2); host.onUnRecoverableConfigFileDiagnostic = (diagnostic) => reportUnrecoverableDiagnostic(system, diagnosticReporter, diagnostic); host.configFileName = configFileName; host.optionsToExtend = optionsToExtend; host.watchOptionsToExtend = watchOptionsToExtend; host.extraFileExtensions = extraFileExtensions; return host; } function createWatchCompilerHostOfFilesAndCompilerOptions({ rootFiles, options, watchOptions, projectReferences, system, createProgram: createProgram2, reportDiagnostic, reportWatchStatus: reportWatchStatus2 }) { const host = createWatchCompilerHost(system, createProgram2, reportDiagnostic || createDiagnosticReporter(system), reportWatchStatus2); host.rootFiles = rootFiles; host.options = options; host.watchOptions = watchOptions; host.projectReferences = projectReferences; return host; } function performIncrementalCompilation(input) { const system = input.system || sys; const host = input.host || (input.host = createIncrementalCompilerHost(input.options, system)); const builderProgram = createIncrementalProgram(input); const exitStatus = emitFilesAndReportErrorsAndGetExitStatus( builderProgram, input.reportDiagnostic || createDiagnosticReporter(system), (s) => host.trace && host.trace(s), input.reportErrorSummary || input.options.pretty ? (errorCount, filesInError) => system.write(getErrorSummaryText(errorCount, filesInError, system.newLine, host)) : void 0 ); if (input.afterProgramEmitAndDiagnostics) input.afterProgramEmitAndDiagnostics(builderProgram); return exitStatus; } // src/compiler/watchPublic.ts function readBuilderProgram(compilerOptions, host) { const buildInfoPath = getTsBuildInfoEmitOutputFilePath(compilerOptions); if (!buildInfoPath) return void 0; let buildInfo; if (host.getBuildInfo) { buildInfo = host.getBuildInfo(buildInfoPath, compilerOptions.configFilePath); } else { const content = host.readFile(buildInfoPath); if (!content) return void 0; buildInfo = getBuildInfo(buildInfoPath, content); } if (!buildInfo || buildInfo.version !== version || !isIncrementalBuildInfo(buildInfo)) return void 0; return createBuilderProgramUsingIncrementalBuildInfo(buildInfo, buildInfoPath, host); } function createIncrementalCompilerHost(options, system = sys) { const host = createCompilerHostWorker( options, /*setParentNodes*/ void 0, system ); host.createHash = maybeBind(system, system.createHash); host.storeSignatureInfo = system.storeSignatureInfo; setGetSourceFileAsHashVersioned(host); changeCompilerHostLikeToUseCache(host, (fileName) => toPath(fileName, host.getCurrentDirectory(), host.getCanonicalFileName)); return host; } function createIncrementalProgram({ rootNames, options, configFileParsingDiagnostics, projectReferences, host, createProgram: createProgram2 }) { host = host || createIncrementalCompilerHost(options); createProgram2 = createProgram2 || createEmitAndSemanticDiagnosticsBuilderProgram; const oldProgram = readBuilderProgram(options, host); return createProgram2(rootNames, options, host, oldProgram, configFileParsingDiagnostics, projectReferences); } function createWatchProgram(host) { let builderProgram; let updateLevel; let missingFilesMap; let watchedWildcardDirectories; let staleWatches = /* @__PURE__ */ new Map([[void 0, void 0]]); let timerToUpdateProgram; let timerToInvalidateFailedLookupResolutions; let parsedConfigs; let sharedExtendedConfigFileWatchers; let extendedConfigCache = host.extendedConfigCache; let reportFileChangeDetectedOnCreateProgram = false; const sourceFilesCache = /* @__PURE__ */ new Map(); let missingFilePathsRequestedForRelease; let hasChangedCompilerOptions = false; const useCaseSensitiveFileNames2 = host.useCaseSensitiveFileNames(); const currentDirectory = host.getCurrentDirectory(); const { configFileName, optionsToExtend: optionsToExtendForConfigFile = {}, watchOptionsToExtend, extraFileExtensions, createProgram: createProgram2 } = host; let { rootFiles: rootFileNames, options: compilerOptions, watchOptions, projectReferences } = host; let wildcardDirectories; let configFileParsingDiagnostics; let canConfigFileJsonReportNoInputFiles = false; let hasChangedConfigFileParsingErrors = false; const cachedDirectoryStructureHost = configFileName === void 0 ? void 0 : createCachedDirectoryStructureHost(host, currentDirectory, useCaseSensitiveFileNames2); const directoryStructureHost = cachedDirectoryStructureHost || host; const parseConfigFileHost = parseConfigHostFromCompilerHostLike(host, directoryStructureHost); let newLine = updateNewLine(); if (configFileName && host.configFileParsingResult) { setConfigFileParsingResult(host.configFileParsingResult); newLine = updateNewLine(); } reportWatchDiagnostic(Diagnostics.Starting_compilation_in_watch_mode); if (configFileName && !host.configFileParsingResult) { newLine = getNewLineCharacter(optionsToExtendForConfigFile); Debug.assert(!rootFileNames); parseConfigFile2(); newLine = updateNewLine(); } Debug.assert(compilerOptions); Debug.assert(rootFileNames); const { watchFile: watchFile2, watchDirectory, writeLog } = createWatchFactory(host, compilerOptions); const getCanonicalFileName = createGetCanonicalFileName(useCaseSensitiveFileNames2); writeLog(`Current directory: ${currentDirectory} CaseSensitiveFileNames: ${useCaseSensitiveFileNames2}`); let configFileWatcher; if (configFileName) { configFileWatcher = watchFile2(configFileName, scheduleProgramReload, 2e3 /* High */, watchOptions, WatchType.ConfigFile); } const compilerHost = createCompilerHostFromProgramHost(host, () => compilerOptions, directoryStructureHost); setGetSourceFileAsHashVersioned(compilerHost); const getNewSourceFile = compilerHost.getSourceFile; compilerHost.getSourceFile = (fileName, ...args) => getVersionedSourceFileByPath(fileName, toPath3(fileName), ...args); compilerHost.getSourceFileByPath = getVersionedSourceFileByPath; compilerHost.getNewLine = () => newLine; compilerHost.fileExists = fileExists; compilerHost.onReleaseOldSourceFile = onReleaseOldSourceFile; compilerHost.onReleaseParsedCommandLine = onReleaseParsedCommandLine; compilerHost.toPath = toPath3; compilerHost.getCompilationSettings = () => compilerOptions; compilerHost.useSourceOfProjectReferenceRedirect = maybeBind(host, host.useSourceOfProjectReferenceRedirect); compilerHost.preferNonRecursiveWatch = host.preferNonRecursiveWatch; compilerHost.watchDirectoryOfFailedLookupLocation = (dir, cb, flags) => watchDirectory(dir, cb, flags, watchOptions, WatchType.FailedLookupLocations); compilerHost.watchAffectingFileLocation = (file, cb) => watchFile2(file, cb, 2e3 /* High */, watchOptions, WatchType.AffectingFileLocation); compilerHost.watchTypeRootsDirectory = (dir, cb, flags) => watchDirectory(dir, cb, flags, watchOptions, WatchType.TypeRoots); compilerHost.getCachedDirectoryStructureHost = () => cachedDirectoryStructureHost; compilerHost.scheduleInvalidateResolutionsOfFailedLookupLocations = scheduleInvalidateResolutionsOfFailedLookupLocations; compilerHost.onInvalidatedResolution = scheduleProgramUpdate; compilerHost.onChangedAutomaticTypeDirectiveNames = scheduleProgramUpdate; compilerHost.fileIsOpen = returnFalse; compilerHost.getCurrentProgram = getCurrentProgram; compilerHost.writeLog = writeLog; compilerHost.getParsedCommandLine = getParsedCommandLine; const resolutionCache = createResolutionCache( compilerHost, configFileName ? getDirectoryPath(getNormalizedAbsolutePath(configFileName, currentDirectory)) : currentDirectory, /*logChangesWhenResolvingModule*/ false ); compilerHost.resolveModuleNameLiterals = maybeBind(host, host.resolveModuleNameLiterals); compilerHost.resolveModuleNames = maybeBind(host, host.resolveModuleNames); if (!compilerHost.resolveModuleNameLiterals && !compilerHost.resolveModuleNames) { compilerHost.resolveModuleNameLiterals = resolutionCache.resolveModuleNameLiterals.bind(resolutionCache); } compilerHost.resolveTypeReferenceDirectiveReferences = maybeBind(host, host.resolveTypeReferenceDirectiveReferences); compilerHost.resolveTypeReferenceDirectives = maybeBind(host, host.resolveTypeReferenceDirectives); if (!compilerHost.resolveTypeReferenceDirectiveReferences && !compilerHost.resolveTypeReferenceDirectives) { compilerHost.resolveTypeReferenceDirectiveReferences = resolutionCache.resolveTypeReferenceDirectiveReferences.bind(resolutionCache); } compilerHost.resolveLibrary = !host.resolveLibrary ? resolutionCache.resolveLibrary.bind(resolutionCache) : host.resolveLibrary.bind(host); compilerHost.getModuleResolutionCache = host.resolveModuleNameLiterals || host.resolveModuleNames ? maybeBind(host, host.getModuleResolutionCache) : () => resolutionCache.getModuleResolutionCache(); const userProvidedResolution = !!host.resolveModuleNameLiterals || !!host.resolveTypeReferenceDirectiveReferences || !!host.resolveModuleNames || !!host.resolveTypeReferenceDirectives; const customHasInvalidatedResolutions = userProvidedResolution ? maybeBind(host, host.hasInvalidatedResolutions) || returnTrue : returnFalse; const customHasInvalidLibResolutions = host.resolveLibrary ? maybeBind(host, host.hasInvalidatedLibResolutions) || returnTrue : returnFalse; builderProgram = readBuilderProgram(compilerOptions, compilerHost); synchronizeProgram(); return configFileName ? { getCurrentProgram: getCurrentBuilderProgram, getProgram: updateProgram, close, getResolutionCache } : { getCurrentProgram: getCurrentBuilderProgram, getProgram: updateProgram, updateRootFileNames, close, getResolutionCache }; function close() { clearInvalidateResolutionsOfFailedLookupLocations(); resolutionCache.clear(); clearMap(sourceFilesCache, (value) => { if (value && value.fileWatcher) { value.fileWatcher.close(); value.fileWatcher = void 0; } }); if (configFileWatcher) { configFileWatcher.close(); configFileWatcher = void 0; } extendedConfigCache == null ? void 0 : extendedConfigCache.clear(); extendedConfigCache = void 0; if (sharedExtendedConfigFileWatchers) { clearMap(sharedExtendedConfigFileWatchers, closeFileWatcherOf); sharedExtendedConfigFileWatchers = void 0; } if (watchedWildcardDirectories) { clearMap(watchedWildcardDirectories, closeFileWatcherOf); watchedWildcardDirectories = void 0; } if (missingFilesMap) { clearMap(missingFilesMap, closeFileWatcher); missingFilesMap = void 0; } if (parsedConfigs) { clearMap(parsedConfigs, (config) => { var _a; (_a = config.watcher) == null ? void 0 : _a.close(); config.watcher = void 0; if (config.watchedDirectories) clearMap(config.watchedDirectories, closeFileWatcherOf); config.watchedDirectories = void 0; }); parsedConfigs = void 0; } builderProgram = void 0; } function getResolutionCache() { return resolutionCache; } function getCurrentBuilderProgram() { return builderProgram; } function getCurrentProgram() { return builderProgram && builderProgram.getProgramOrUndefined(); } function synchronizeProgram() { writeLog(`Synchronizing program`); Debug.assert(compilerOptions); Debug.assert(rootFileNames); clearInvalidateResolutionsOfFailedLookupLocations(); const program = getCurrentBuilderProgram(); if (hasChangedCompilerOptions) { newLine = updateNewLine(); if (program && changesAffectModuleResolution(program.getCompilerOptions(), compilerOptions)) { resolutionCache.onChangesAffectModuleResolution(); } } const { hasInvalidatedResolutions, hasInvalidatedLibResolutions } = resolutionCache.createHasInvalidatedResolutions(customHasInvalidatedResolutions, customHasInvalidLibResolutions); const { originalReadFile, originalFileExists, originalDirectoryExists, originalCreateDirectory, originalWriteFile, readFileWithCache } = changeCompilerHostLikeToUseCache(compilerHost, toPath3); if (isProgramUptoDate(getCurrentProgram(), rootFileNames, compilerOptions, (path) => getSourceVersion(path, readFileWithCache), (fileName) => compilerHost.fileExists(fileName), hasInvalidatedResolutions, hasInvalidatedLibResolutions, hasChangedAutomaticTypeDirectiveNames, getParsedCommandLine, projectReferences)) { if (hasChangedConfigFileParsingErrors) { if (reportFileChangeDetectedOnCreateProgram) { reportWatchDiagnostic(Diagnostics.File_change_detected_Starting_incremental_compilation); } builderProgram = createProgram2( /*rootNames*/ void 0, /*options*/ void 0, compilerHost, builderProgram, configFileParsingDiagnostics, projectReferences ); hasChangedConfigFileParsingErrors = false; } } else { if (reportFileChangeDetectedOnCreateProgram) { reportWatchDiagnostic(Diagnostics.File_change_detected_Starting_incremental_compilation); } createNewProgram(hasInvalidatedResolutions, hasInvalidatedLibResolutions); } reportFileChangeDetectedOnCreateProgram = false; if (host.afterProgramCreate && program !== builderProgram) { host.afterProgramCreate(builderProgram); } compilerHost.readFile = originalReadFile; compilerHost.fileExists = originalFileExists; compilerHost.directoryExists = originalDirectoryExists; compilerHost.createDirectory = originalCreateDirectory; compilerHost.writeFile = originalWriteFile; staleWatches == null ? void 0 : staleWatches.forEach((configFile, configPath) => { if (!configPath) { watchConfigFileWildCardDirectories(); if (configFileName) updateExtendedConfigFilesWatches(toPath3(configFileName), compilerOptions, watchOptions, WatchType.ExtendedConfigFile); } else { const config = parsedConfigs == null ? void 0 : parsedConfigs.get(configPath); if (config) watchReferencedProject(configFile, configPath, config); } }); staleWatches = void 0; return builderProgram; } function createNewProgram(hasInvalidatedResolutions, hasInvalidatedLibResolutions) { writeLog("CreatingProgramWith::"); writeLog(` roots: ${JSON.stringify(rootFileNames)}`); writeLog(` options: ${JSON.stringify(compilerOptions)}`); if (projectReferences) writeLog(` projectReferences: ${JSON.stringify(projectReferences)}`); const needsUpdateInTypeRootWatch = hasChangedCompilerOptions || !getCurrentProgram(); hasChangedCompilerOptions = false; hasChangedConfigFileParsingErrors = false; resolutionCache.startCachingPerDirectoryResolution(); compilerHost.hasInvalidatedResolutions = hasInvalidatedResolutions; compilerHost.hasInvalidatedLibResolutions = hasInvalidatedLibResolutions; compilerHost.hasChangedAutomaticTypeDirectiveNames = hasChangedAutomaticTypeDirectiveNames; const oldProgram = getCurrentProgram(); builderProgram = createProgram2(rootFileNames, compilerOptions, compilerHost, builderProgram, configFileParsingDiagnostics, projectReferences); resolutionCache.finishCachingPerDirectoryResolution(builderProgram.getProgram(), oldProgram); updateMissingFilePathsWatch( builderProgram.getProgram(), missingFilesMap || (missingFilesMap = /* @__PURE__ */ new Map()), watchMissingFilePath ); if (needsUpdateInTypeRootWatch) { resolutionCache.updateTypeRootsWatch(); } if (missingFilePathsRequestedForRelease) { for (const missingFilePath of missingFilePathsRequestedForRelease) { if (!missingFilesMap.has(missingFilePath)) { sourceFilesCache.delete(missingFilePath); } } missingFilePathsRequestedForRelease = void 0; } } function updateRootFileNames(files) { Debug.assert(!configFileName, "Cannot update root file names with config file watch mode"); rootFileNames = files; scheduleProgramUpdate(); } function updateNewLine() { return getNewLineCharacter(compilerOptions || optionsToExtendForConfigFile); } function toPath3(fileName) { return toPath(fileName, currentDirectory, getCanonicalFileName); } function isFileMissingOnHost(hostSourceFile) { return typeof hostSourceFile === "boolean"; } function isFilePresenceUnknownOnHost(hostSourceFile) { return typeof hostSourceFile.version === "boolean"; } function fileExists(fileName) { const path = toPath3(fileName); if (isFileMissingOnHost(sourceFilesCache.get(path))) { return false; } return directoryStructureHost.fileExists(fileName); } function getVersionedSourceFileByPath(fileName, path, languageVersionOrOptions, onError, shouldCreateNewSourceFile) { const hostSourceFile = sourceFilesCache.get(path); if (isFileMissingOnHost(hostSourceFile)) { return void 0; } const impliedNodeFormat = typeof languageVersionOrOptions === "object" ? languageVersionOrOptions.impliedNodeFormat : void 0; if (hostSourceFile === void 0 || shouldCreateNewSourceFile || isFilePresenceUnknownOnHost(hostSourceFile) || hostSourceFile.sourceFile.impliedNodeFormat !== impliedNodeFormat) { const sourceFile = getNewSourceFile(fileName, languageVersionOrOptions, onError); if (hostSourceFile) { if (sourceFile) { hostSourceFile.sourceFile = sourceFile; hostSourceFile.version = sourceFile.version; if (!hostSourceFile.fileWatcher) { hostSourceFile.fileWatcher = watchFilePath(path, fileName, onSourceFileChange, 250 /* Low */, watchOptions, WatchType.SourceFile); } } else { if (hostSourceFile.fileWatcher) { hostSourceFile.fileWatcher.close(); } sourceFilesCache.set(path, false); } } else { if (sourceFile) { const fileWatcher = watchFilePath(path, fileName, onSourceFileChange, 250 /* Low */, watchOptions, WatchType.SourceFile); sourceFilesCache.set(path, { sourceFile, version: sourceFile.version, fileWatcher }); } else { sourceFilesCache.set(path, false); } } return sourceFile; } return hostSourceFile.sourceFile; } function nextSourceFileVersion(path) { const hostSourceFile = sourceFilesCache.get(path); if (hostSourceFile !== void 0) { if (isFileMissingOnHost(hostSourceFile)) { sourceFilesCache.set(path, { version: false }); } else { hostSourceFile.version = false; } } } function getSourceVersion(path, readFileWithCache) { const hostSourceFile = sourceFilesCache.get(path); if (!hostSourceFile) return void 0; if (hostSourceFile.version) return hostSourceFile.version; const text = readFileWithCache(path); return text !== void 0 ? getSourceFileVersionAsHashFromText(compilerHost, text) : void 0; } function onReleaseOldSourceFile(oldSourceFile, _oldOptions, hasSourceFileByPath) { const hostSourceFileInfo = sourceFilesCache.get(oldSourceFile.resolvedPath); if (hostSourceFileInfo !== void 0) { if (isFileMissingOnHost(hostSourceFileInfo)) { (missingFilePathsRequestedForRelease || (missingFilePathsRequestedForRelease = [])).push(oldSourceFile.path); } else if (hostSourceFileInfo.sourceFile === oldSourceFile) { if (hostSourceFileInfo.fileWatcher) { hostSourceFileInfo.fileWatcher.close(); } sourceFilesCache.delete(oldSourceFile.resolvedPath); if (!hasSourceFileByPath) { resolutionCache.removeResolutionsOfFile(oldSourceFile.path); } } } } function reportWatchDiagnostic(message) { if (host.onWatchStatusChange) { host.onWatchStatusChange(createCompilerDiagnostic(message), newLine, compilerOptions || optionsToExtendForConfigFile); } } function hasChangedAutomaticTypeDirectiveNames() { return resolutionCache.hasChangedAutomaticTypeDirectiveNames(); } function clearInvalidateResolutionsOfFailedLookupLocations() { if (!timerToInvalidateFailedLookupResolutions) return false; host.clearTimeout(timerToInvalidateFailedLookupResolutions); timerToInvalidateFailedLookupResolutions = void 0; return true; } function scheduleInvalidateResolutionsOfFailedLookupLocations() { if (!host.setTimeout || !host.clearTimeout) { return resolutionCache.invalidateResolutionsOfFailedLookupLocations(); } const pending = clearInvalidateResolutionsOfFailedLookupLocations(); writeLog(`Scheduling invalidateFailedLookup${pending ? ", Cancelled earlier one" : ""}`); timerToInvalidateFailedLookupResolutions = host.setTimeout(invalidateResolutionsOfFailedLookup, 250, "timerToInvalidateFailedLookupResolutions"); } function invalidateResolutionsOfFailedLookup() { timerToInvalidateFailedLookupResolutions = void 0; if (resolutionCache.invalidateResolutionsOfFailedLookupLocations()) { scheduleProgramUpdate(); } } function scheduleProgramUpdate() { if (!host.setTimeout || !host.clearTimeout) { return; } if (timerToUpdateProgram) { host.clearTimeout(timerToUpdateProgram); } writeLog("Scheduling update"); timerToUpdateProgram = host.setTimeout(updateProgramWithWatchStatus, 250, "timerToUpdateProgram"); } function scheduleProgramReload() { Debug.assert(!!configFileName); updateLevel = 2 /* Full */; scheduleProgramUpdate(); } function updateProgramWithWatchStatus() { timerToUpdateProgram = void 0; reportFileChangeDetectedOnCreateProgram = true; updateProgram(); } function updateProgram() { switch (updateLevel) { case 1 /* RootNamesAndUpdate */: reloadFileNamesFromConfigFile(); break; case 2 /* Full */: reloadConfigFile(); break; default: synchronizeProgram(); break; } return getCurrentBuilderProgram(); } function reloadFileNamesFromConfigFile() { writeLog("Reloading new file names and options"); Debug.assert(compilerOptions); Debug.assert(configFileName); updateLevel = 0 /* Update */; rootFileNames = getFileNamesFromConfigSpecs(compilerOptions.configFile.configFileSpecs, getNormalizedAbsolutePath(getDirectoryPath(configFileName), currentDirectory), compilerOptions, parseConfigFileHost, extraFileExtensions); if (updateErrorForNoInputFiles( rootFileNames, getNormalizedAbsolutePath(configFileName, currentDirectory), compilerOptions.configFile.configFileSpecs, configFileParsingDiagnostics, canConfigFileJsonReportNoInputFiles )) { hasChangedConfigFileParsingErrors = true; } synchronizeProgram(); } function reloadConfigFile() { Debug.assert(configFileName); writeLog(`Reloading config file: ${configFileName}`); updateLevel = 0 /* Update */; if (cachedDirectoryStructureHost) { cachedDirectoryStructureHost.clearCache(); } parseConfigFile2(); hasChangedCompilerOptions = true; (staleWatches ?? (staleWatches = /* @__PURE__ */ new Map())).set(void 0, void 0); synchronizeProgram(); } function parseConfigFile2() { Debug.assert(configFileName); setConfigFileParsingResult( getParsedCommandLineOfConfigFile( configFileName, optionsToExtendForConfigFile, parseConfigFileHost, extendedConfigCache || (extendedConfigCache = /* @__PURE__ */ new Map()), watchOptionsToExtend, extraFileExtensions ) ); } function setConfigFileParsingResult(configFileParseResult) { rootFileNames = configFileParseResult.fileNames; compilerOptions = configFileParseResult.options; watchOptions = configFileParseResult.watchOptions; projectReferences = configFileParseResult.projectReferences; wildcardDirectories = configFileParseResult.wildcardDirectories; configFileParsingDiagnostics = getConfigFileParsingDiagnostics(configFileParseResult).slice(); canConfigFileJsonReportNoInputFiles = canJsonReportNoInputFiles(configFileParseResult.raw); hasChangedConfigFileParsingErrors = true; } function getParsedCommandLine(configFileName2) { const configPath = toPath3(configFileName2); let config = parsedConfigs == null ? void 0 : parsedConfigs.get(configPath); if (config) { if (!config.updateLevel) return config.parsedCommandLine; if (config.parsedCommandLine && config.updateLevel === 1 /* RootNamesAndUpdate */ && !host.getParsedCommandLine) { writeLog("Reloading new file names and options"); Debug.assert(compilerOptions); const fileNames = getFileNamesFromConfigSpecs( config.parsedCommandLine.options.configFile.configFileSpecs, getNormalizedAbsolutePath(getDirectoryPath(configFileName2), currentDirectory), compilerOptions, parseConfigFileHost ); config.parsedCommandLine = { ...config.parsedCommandLine, fileNames }; config.updateLevel = void 0; return config.parsedCommandLine; } } writeLog(`Loading config file: ${configFileName2}`); const parsedCommandLine = host.getParsedCommandLine ? host.getParsedCommandLine(configFileName2) : getParsedCommandLineFromConfigFileHost(configFileName2); if (config) { config.parsedCommandLine = parsedCommandLine; config.updateLevel = void 0; } else { (parsedConfigs || (parsedConfigs = /* @__PURE__ */ new Map())).set(configPath, config = { parsedCommandLine }); } (staleWatches ?? (staleWatches = /* @__PURE__ */ new Map())).set(configPath, configFileName2); return parsedCommandLine; } function getParsedCommandLineFromConfigFileHost(configFileName2) { const onUnRecoverableConfigFileDiagnostic = parseConfigFileHost.onUnRecoverableConfigFileDiagnostic; parseConfigFileHost.onUnRecoverableConfigFileDiagnostic = noop; const parsedCommandLine = getParsedCommandLineOfConfigFile( configFileName2, /*optionsToExtend*/ void 0, parseConfigFileHost, extendedConfigCache || (extendedConfigCache = /* @__PURE__ */ new Map()), watchOptionsToExtend ); parseConfigFileHost.onUnRecoverableConfigFileDiagnostic = onUnRecoverableConfigFileDiagnostic; return parsedCommandLine; } function onReleaseParsedCommandLine(fileName) { var _a; const path = toPath3(fileName); const config = parsedConfigs == null ? void 0 : parsedConfigs.get(path); if (!config) return; parsedConfigs.delete(path); if (config.watchedDirectories) clearMap(config.watchedDirectories, closeFileWatcherOf); (_a = config.watcher) == null ? void 0 : _a.close(); clearSharedExtendedConfigFileWatcher(path, sharedExtendedConfigFileWatchers); } function watchFilePath(path, file, callback, pollingInterval, options, watchType) { return watchFile2(file, (fileName, eventKind) => callback(fileName, eventKind, path), pollingInterval, options, watchType); } function onSourceFileChange(fileName, eventKind, path) { updateCachedSystemWithFile(fileName, path, eventKind); if (eventKind === 2 /* Deleted */ && sourceFilesCache.has(path)) { resolutionCache.invalidateResolutionOfFile(path); } nextSourceFileVersion(path); scheduleProgramUpdate(); } function updateCachedSystemWithFile(fileName, path, eventKind) { if (cachedDirectoryStructureHost) { cachedDirectoryStructureHost.addOrDeleteFile(fileName, path, eventKind); } } function watchMissingFilePath(missingFilePath, missingFileName) { return (parsedConfigs == null ? void 0 : parsedConfigs.has(missingFilePath)) ? noopFileWatcher : watchFilePath( missingFilePath, missingFileName, onMissingFileChange, 500 /* Medium */, watchOptions, WatchType.MissingFile ); } function onMissingFileChange(fileName, eventKind, missingFilePath) { updateCachedSystemWithFile(fileName, missingFilePath, eventKind); if (eventKind === 0 /* Created */ && missingFilesMap.has(missingFilePath)) { missingFilesMap.get(missingFilePath).close(); missingFilesMap.delete(missingFilePath); nextSourceFileVersion(missingFilePath); scheduleProgramUpdate(); } } function watchConfigFileWildCardDirectories() { updateWatchingWildcardDirectories( watchedWildcardDirectories || (watchedWildcardDirectories = /* @__PURE__ */ new Map()), wildcardDirectories, watchWildcardDirectory ); } function watchWildcardDirectory(directory, flags) { return watchDirectory( directory, (fileOrDirectory) => { Debug.assert(configFileName); Debug.assert(compilerOptions); const fileOrDirectoryPath = toPath3(fileOrDirectory); if (cachedDirectoryStructureHost) { cachedDirectoryStructureHost.addOrDeleteFileOrDirectory(fileOrDirectory, fileOrDirectoryPath); } nextSourceFileVersion(fileOrDirectoryPath); if (isIgnoredFileFromWildCardWatching({ watchedDirPath: toPath3(directory), fileOrDirectory, fileOrDirectoryPath, configFileName, extraFileExtensions, options: compilerOptions, program: getCurrentBuilderProgram() || rootFileNames, currentDirectory, useCaseSensitiveFileNames: useCaseSensitiveFileNames2, writeLog, toPath: toPath3 })) return; if (updateLevel !== 2 /* Full */) { updateLevel = 1 /* RootNamesAndUpdate */; scheduleProgramUpdate(); } }, flags, watchOptions, WatchType.WildcardDirectory ); } function updateExtendedConfigFilesWatches(forProjectPath, options, watchOptions2, watchType) { updateSharedExtendedConfigFileWatcher( forProjectPath, options, sharedExtendedConfigFileWatchers || (sharedExtendedConfigFileWatchers = /* @__PURE__ */ new Map()), (extendedConfigFileName, extendedConfigFilePath) => watchFile2( extendedConfigFileName, (_fileName, eventKind) => { var _a; updateCachedSystemWithFile(extendedConfigFileName, extendedConfigFilePath, eventKind); if (extendedConfigCache) cleanExtendedConfigCache(extendedConfigCache, extendedConfigFilePath, toPath3); const projects = (_a = sharedExtendedConfigFileWatchers.get(extendedConfigFilePath)) == null ? void 0 : _a.projects; if (!(projects == null ? void 0 : projects.size)) return; projects.forEach((projectPath) => { if (configFileName && toPath3(configFileName) === projectPath) { updateLevel = 2 /* Full */; } else { const config = parsedConfigs == null ? void 0 : parsedConfigs.get(projectPath); if (config) config.updateLevel = 2 /* Full */; resolutionCache.removeResolutionsFromProjectReferenceRedirects(projectPath); } scheduleProgramUpdate(); }); }, 2e3 /* High */, watchOptions2, watchType ), toPath3 ); } function watchReferencedProject(configFileName2, configPath, commandLine) { var _a, _b, _c, _d; commandLine.watcher || (commandLine.watcher = watchFile2( configFileName2, (_fileName, eventKind) => { updateCachedSystemWithFile(configFileName2, configPath, eventKind); const config = parsedConfigs == null ? void 0 : parsedConfigs.get(configPath); if (config) config.updateLevel = 2 /* Full */; resolutionCache.removeResolutionsFromProjectReferenceRedirects(configPath); scheduleProgramUpdate(); }, 2e3 /* High */, ((_a = commandLine.parsedCommandLine) == null ? void 0 : _a.watchOptions) || watchOptions, WatchType.ConfigFileOfReferencedProject )); updateWatchingWildcardDirectories( commandLine.watchedDirectories || (commandLine.watchedDirectories = /* @__PURE__ */ new Map()), (_b = commandLine.parsedCommandLine) == null ? void 0 : _b.wildcardDirectories, (directory, flags) => { var _a2; return watchDirectory( directory, (fileOrDirectory) => { const fileOrDirectoryPath = toPath3(fileOrDirectory); if (cachedDirectoryStructureHost) { cachedDirectoryStructureHost.addOrDeleteFileOrDirectory(fileOrDirectory, fileOrDirectoryPath); } nextSourceFileVersion(fileOrDirectoryPath); const config = parsedConfigs == null ? void 0 : parsedConfigs.get(configPath); if (!(config == null ? void 0 : config.parsedCommandLine)) return; if (isIgnoredFileFromWildCardWatching({ watchedDirPath: toPath3(directory), fileOrDirectory, fileOrDirectoryPath, configFileName: configFileName2, options: config.parsedCommandLine.options, program: config.parsedCommandLine.fileNames, currentDirectory, useCaseSensitiveFileNames: useCaseSensitiveFileNames2, writeLog, toPath: toPath3 })) return; if (config.updateLevel !== 2 /* Full */) { config.updateLevel = 1 /* RootNamesAndUpdate */; scheduleProgramUpdate(); } }, flags, ((_a2 = commandLine.parsedCommandLine) == null ? void 0 : _a2.watchOptions) || watchOptions, WatchType.WildcardDirectoryOfReferencedProject ); } ); updateExtendedConfigFilesWatches( configPath, (_c = commandLine.parsedCommandLine) == null ? void 0 : _c.options, ((_d = commandLine.parsedCommandLine) == null ? void 0 : _d.watchOptions) || watchOptions, WatchType.ExtendedConfigOfReferencedProject ); } } // src/compiler/tsbuild.ts function resolveConfigFileProjectName(project) { if (fileExtensionIs(project, ".json" /* Json */)) { return project; } return combinePaths(project, "tsconfig.json"); } // src/compiler/tsbuildPublic.ts var minimumDate = /* @__PURE__ */ new Date(-864e13); function getOrCreateValueFromConfigFileMap(configFileMap, resolved, createT) { const existingValue = configFileMap.get(resolved); let newValue; if (!existingValue) { newValue = createT(); configFileMap.set(resolved, newValue); } return existingValue || newValue; } function getOrCreateValueMapFromConfigFileMap(configFileMap, resolved) { return getOrCreateValueFromConfigFileMap(configFileMap, resolved, () => /* @__PURE__ */ new Map()); } function getCurrentTime(host) { return host.now ? host.now() : /* @__PURE__ */ new Date(); } function isCircularBuildOrder(buildOrder) { return !!buildOrder && !!buildOrder.buildOrder; } function getBuildOrderFromAnyBuildOrder(anyBuildOrder) { return isCircularBuildOrder(anyBuildOrder) ? anyBuildOrder.buildOrder : anyBuildOrder; } function createBuilderStatusReporter(system, pretty) { return (diagnostic) => { let output = pretty ? `[${formatColorAndReset(getLocaleTimeString(system), "\x1B[90m" /* Grey */)}] ` : `${getLocaleTimeString(system)} - `; output += `${flattenDiagnosticMessageText(diagnostic.messageText, system.newLine)}${system.newLine + system.newLine}`; system.write(output); }; } function createSolutionBuilderHostBase(system, createProgram2, reportDiagnostic, reportSolutionBuilderStatus) { const host = createProgramHost(system, createProgram2); host.getModifiedTime = system.getModifiedTime ? (path) => system.getModifiedTime(path) : returnUndefined; host.setModifiedTime = system.setModifiedTime ? (path, date) => system.setModifiedTime(path, date) : noop; host.deleteFile = system.deleteFile ? (path) => system.deleteFile(path) : noop; host.reportDiagnostic = reportDiagnostic || createDiagnosticReporter(system); host.reportSolutionBuilderStatus = reportSolutionBuilderStatus || createBuilderStatusReporter(system); host.now = maybeBind(system, system.now); return host; } function createSolutionBuilderHost(system = sys, createProgram2, reportDiagnostic, reportSolutionBuilderStatus, reportErrorSummary2) { const host = createSolutionBuilderHostBase(system, createProgram2, reportDiagnostic, reportSolutionBuilderStatus); host.reportErrorSummary = reportErrorSummary2; return host; } function createSolutionBuilderWithWatchHost(system = sys, createProgram2, reportDiagnostic, reportSolutionBuilderStatus, reportWatchStatus2) { const host = createSolutionBuilderHostBase(system, createProgram2, reportDiagnostic, reportSolutionBuilderStatus); const watchHost = createWatchHost(system, reportWatchStatus2); copyProperties(host, watchHost); return host; } function getCompilerOptionsOfBuildOptions(buildOptions) { const result = {}; commonOptionsWithBuild.forEach((option) => { if (hasProperty(buildOptions, option.name)) result[option.name] = buildOptions[option.name]; }); result.tscBuild = true; return result; } function createSolutionBuilder(host, rootNames, defaultOptions) { return createSolutionBuilderWorker( /*watch*/ false, host, rootNames, defaultOptions ); } function createSolutionBuilderWithWatch(host, rootNames, defaultOptions, baseWatchOptions) { return createSolutionBuilderWorker( /*watch*/ true, host, rootNames, defaultOptions, baseWatchOptions ); } function createSolutionBuilderState(watch, hostOrHostWithWatch, rootNames, options, baseWatchOptions) { const host = hostOrHostWithWatch; const hostWithWatch = hostOrHostWithWatch; const baseCompilerOptions = getCompilerOptionsOfBuildOptions(options); const compilerHost = createCompilerHostFromProgramHost(host, () => state.projectCompilerOptions); setGetSourceFileAsHashVersioned(compilerHost); compilerHost.getParsedCommandLine = (fileName) => parseConfigFile(state, fileName, toResolvedConfigFilePath(state, fileName)); compilerHost.resolveModuleNameLiterals = maybeBind(host, host.resolveModuleNameLiterals); compilerHost.resolveTypeReferenceDirectiveReferences = maybeBind(host, host.resolveTypeReferenceDirectiveReferences); compilerHost.resolveLibrary = maybeBind(host, host.resolveLibrary); compilerHost.resolveModuleNames = maybeBind(host, host.resolveModuleNames); compilerHost.resolveTypeReferenceDirectives = maybeBind(host, host.resolveTypeReferenceDirectives); compilerHost.getModuleResolutionCache = maybeBind(host, host.getModuleResolutionCache); let moduleResolutionCache, typeReferenceDirectiveResolutionCache; if (!compilerHost.resolveModuleNameLiterals && !compilerHost.resolveModuleNames) { moduleResolutionCache = createModuleResolutionCache(compilerHost.getCurrentDirectory(), compilerHost.getCanonicalFileName); compilerHost.resolveModuleNameLiterals = (moduleNames, containingFile, redirectedReference, options2, containingSourceFile) => loadWithModeAwareCache( moduleNames, containingFile, redirectedReference, options2, containingSourceFile, host, moduleResolutionCache, createModuleResolutionLoader ); compilerHost.getModuleResolutionCache = () => moduleResolutionCache; } if (!compilerHost.resolveTypeReferenceDirectiveReferences && !compilerHost.resolveTypeReferenceDirectives) { typeReferenceDirectiveResolutionCache = createTypeReferenceDirectiveResolutionCache( compilerHost.getCurrentDirectory(), compilerHost.getCanonicalFileName, /*options*/ void 0, moduleResolutionCache == null ? void 0 : moduleResolutionCache.getPackageJsonInfoCache(), moduleResolutionCache == null ? void 0 : moduleResolutionCache.optionsToRedirectsKey ); compilerHost.resolveTypeReferenceDirectiveReferences = (typeDirectiveNames, containingFile, redirectedReference, options2, containingSourceFile) => loadWithModeAwareCache( typeDirectiveNames, containingFile, redirectedReference, options2, containingSourceFile, host, typeReferenceDirectiveResolutionCache, createTypeReferenceResolutionLoader ); } let libraryResolutionCache; if (!compilerHost.resolveLibrary) { libraryResolutionCache = createModuleResolutionCache( compilerHost.getCurrentDirectory(), compilerHost.getCanonicalFileName, /*options*/ void 0, moduleResolutionCache == null ? void 0 : moduleResolutionCache.getPackageJsonInfoCache() ); compilerHost.resolveLibrary = (libraryName, resolveFrom, options2) => resolveLibrary( libraryName, resolveFrom, options2, host, libraryResolutionCache ); } compilerHost.getBuildInfo = (fileName, configFilePath) => getBuildInfo3( state, fileName, toResolvedConfigFilePath(state, configFilePath), /*modifiedTime*/ void 0 ); const { watchFile: watchFile2, watchDirectory, writeLog } = createWatchFactory(hostWithWatch, options); const state = { host, hostWithWatch, parseConfigFileHost: parseConfigHostFromCompilerHostLike(host), write: maybeBind(host, host.trace), // State of solution options, baseCompilerOptions, rootNames, baseWatchOptions, resolvedConfigFilePaths: /* @__PURE__ */ new Map(), configFileCache: /* @__PURE__ */ new Map(), projectStatus: /* @__PURE__ */ new Map(), extendedConfigCache: /* @__PURE__ */ new Map(), buildInfoCache: /* @__PURE__ */ new Map(), outputTimeStamps: /* @__PURE__ */ new Map(), builderPrograms: /* @__PURE__ */ new Map(), diagnostics: /* @__PURE__ */ new Map(), projectPendingBuild: /* @__PURE__ */ new Map(), projectErrorsReported: /* @__PURE__ */ new Map(), compilerHost, moduleResolutionCache, typeReferenceDirectiveResolutionCache, libraryResolutionCache, // Mutable state buildOrder: void 0, readFileWithCache: (f) => host.readFile(f), projectCompilerOptions: baseCompilerOptions, cache: void 0, allProjectBuildPending: true, needsSummary: true, watchAllProjectsPending: watch, // Watch state watch, allWatchedWildcardDirectories: /* @__PURE__ */ new Map(), allWatchedInputFiles: /* @__PURE__ */ new Map(), allWatchedConfigFiles: /* @__PURE__ */ new Map(), allWatchedExtendedConfigFiles: /* @__PURE__ */ new Map(), allWatchedPackageJsonFiles: /* @__PURE__ */ new Map(), filesWatched: /* @__PURE__ */ new Map(), lastCachedPackageJsonLookups: /* @__PURE__ */ new Map(), timerToBuildInvalidatedProject: void 0, reportFileChangeDetected: false, watchFile: watchFile2, watchDirectory, writeLog }; return state; } function toPath2(state, fileName) { return toPath(fileName, state.compilerHost.getCurrentDirectory(), state.compilerHost.getCanonicalFileName); } function toResolvedConfigFilePath(state, fileName) { const { resolvedConfigFilePaths } = state; const path = resolvedConfigFilePaths.get(fileName); if (path !== void 0) return path; const resolvedPath = toPath2(state, fileName); resolvedConfigFilePaths.set(fileName, resolvedPath); return resolvedPath; } function isParsedCommandLine(entry) { return !!entry.options; } function getCachedParsedConfigFile(state, configFilePath) { const value = state.configFileCache.get(configFilePath); return value && isParsedCommandLine(value) ? value : void 0; } function parseConfigFile(state, configFileName, configFilePath) { const { configFileCache } = state; const value = configFileCache.get(configFilePath); if (value) { return isParsedCommandLine(value) ? value : void 0; } mark("SolutionBuilder::beforeConfigFileParsing"); let diagnostic; const { parseConfigFileHost, baseCompilerOptions, baseWatchOptions, extendedConfigCache, host } = state; let parsed; if (host.getParsedCommandLine) { parsed = host.getParsedCommandLine(configFileName); if (!parsed) diagnostic = createCompilerDiagnostic(Diagnostics.File_0_not_found, configFileName); } else { parseConfigFileHost.onUnRecoverableConfigFileDiagnostic = (d) => diagnostic = d; parsed = getParsedCommandLineOfConfigFile(configFileName, baseCompilerOptions, parseConfigFileHost, extendedConfigCache, baseWatchOptions); parseConfigFileHost.onUnRecoverableConfigFileDiagnostic = noop; } configFileCache.set(configFilePath, parsed || diagnostic); mark("SolutionBuilder::afterConfigFileParsing"); measure("SolutionBuilder::Config file parsing", "SolutionBuilder::beforeConfigFileParsing", "SolutionBuilder::afterConfigFileParsing"); return parsed; } function resolveProjectName(state, name) { return resolveConfigFileProjectName(resolvePath(state.compilerHost.getCurrentDirectory(), name)); } function createBuildOrder(state, roots) { const temporaryMarks = /* @__PURE__ */ new Map(); const permanentMarks = /* @__PURE__ */ new Map(); const circularityReportStack = []; let buildOrder; let circularDiagnostics; for (const root of roots) { visit(root); } return circularDiagnostics ? { buildOrder: buildOrder || emptyArray, circularDiagnostics } : buildOrder || emptyArray; function visit(configFileName, inCircularContext) { const projPath = toResolvedConfigFilePath(state, configFileName); if (permanentMarks.has(projPath)) return; if (temporaryMarks.has(projPath)) { if (!inCircularContext) { (circularDiagnostics || (circularDiagnostics = [])).push( createCompilerDiagnostic( Diagnostics.Project_references_may_not_form_a_circular_graph_Cycle_detected_Colon_0, circularityReportStack.join("\r\n") ) ); } return; } temporaryMarks.set(projPath, true); circularityReportStack.push(configFileName); const parsed = parseConfigFile(state, configFileName, projPath); if (parsed && parsed.projectReferences) { for (const ref of parsed.projectReferences) { const resolvedRefPath = resolveProjectName(state, ref.path); visit(resolvedRefPath, inCircularContext || ref.circular); } } circularityReportStack.pop(); permanentMarks.set(projPath, true); (buildOrder || (buildOrder = [])).push(configFileName); } } function getBuildOrder(state) { return state.buildOrder || createStateBuildOrder(state); } function createStateBuildOrder(state) { const buildOrder = createBuildOrder(state, state.rootNames.map((f) => resolveProjectName(state, f))); state.resolvedConfigFilePaths.clear(); const currentProjects = new Set( getBuildOrderFromAnyBuildOrder(buildOrder).map( (resolved) => toResolvedConfigFilePath(state, resolved) ) ); const noopOnDelete = { onDeleteValue: noop }; mutateMapSkippingNewValues(state.configFileCache, currentProjects, noopOnDelete); mutateMapSkippingNewValues(state.projectStatus, currentProjects, noopOnDelete); mutateMapSkippingNewValues(state.builderPrograms, currentProjects, noopOnDelete); mutateMapSkippingNewValues(state.diagnostics, currentProjects, noopOnDelete); mutateMapSkippingNewValues(state.projectPendingBuild, currentProjects, noopOnDelete); mutateMapSkippingNewValues(state.projectErrorsReported, currentProjects, noopOnDelete); mutateMapSkippingNewValues(state.buildInfoCache, currentProjects, noopOnDelete); mutateMapSkippingNewValues(state.outputTimeStamps, currentProjects, noopOnDelete); mutateMapSkippingNewValues(state.lastCachedPackageJsonLookups, currentProjects, noopOnDelete); if (state.watch) { mutateMapSkippingNewValues( state.allWatchedConfigFiles, currentProjects, { onDeleteValue: closeFileWatcher } ); state.allWatchedExtendedConfigFiles.forEach((watcher) => { watcher.projects.forEach((project) => { if (!currentProjects.has(project)) { watcher.projects.delete(project); } }); watcher.close(); }); mutateMapSkippingNewValues( state.allWatchedWildcardDirectories, currentProjects, { onDeleteValue: (existingMap) => existingMap.forEach(closeFileWatcherOf) } ); mutateMapSkippingNewValues( state.allWatchedInputFiles, currentProjects, { onDeleteValue: (existingMap) => existingMap.forEach(closeFileWatcher) } ); mutateMapSkippingNewValues( state.allWatchedPackageJsonFiles, currentProjects, { onDeleteValue: (existingMap) => existingMap.forEach(closeFileWatcher) } ); } return state.buildOrder = buildOrder; } function getBuildOrderFor(state, project, onlyReferences) { const resolvedProject = project && resolveProjectName(state, project); const buildOrderFromState = getBuildOrder(state); if (isCircularBuildOrder(buildOrderFromState)) return buildOrderFromState; if (resolvedProject) { const projectPath = toResolvedConfigFilePath(state, resolvedProject); const projectIndex = findIndex( buildOrderFromState, (configFileName) => toResolvedConfigFilePath(state, configFileName) === projectPath ); if (projectIndex === -1) return void 0; } const buildOrder = resolvedProject ? createBuildOrder(state, [resolvedProject]) : buildOrderFromState; Debug.assert(!isCircularBuildOrder(buildOrder)); Debug.assert(!onlyReferences || resolvedProject !== void 0); Debug.assert(!onlyReferences || buildOrder[buildOrder.length - 1] === resolvedProject); return onlyReferences ? buildOrder.slice(0, buildOrder.length - 1) : buildOrder; } function enableCache(state) { if (state.cache) { disableCache(state); } const { compilerHost, host } = state; const originalReadFileWithCache = state.readFileWithCache; const originalGetSourceFile = compilerHost.getSourceFile; const { originalReadFile, originalFileExists, originalDirectoryExists, originalCreateDirectory, originalWriteFile, getSourceFileWithCache, readFileWithCache } = changeCompilerHostLikeToUseCache( host, (fileName) => toPath2(state, fileName), (...args) => originalGetSourceFile.call(compilerHost, ...args) ); state.readFileWithCache = readFileWithCache; compilerHost.getSourceFile = getSourceFileWithCache; state.cache = { originalReadFile, originalFileExists, originalDirectoryExists, originalCreateDirectory, originalWriteFile, originalReadFileWithCache, originalGetSourceFile }; } function disableCache(state) { if (!state.cache) return; const { cache, host, compilerHost, extendedConfigCache, moduleResolutionCache, typeReferenceDirectiveResolutionCache, libraryResolutionCache } = state; host.readFile = cache.originalReadFile; host.fileExists = cache.originalFileExists; host.directoryExists = cache.originalDirectoryExists; host.createDirectory = cache.originalCreateDirectory; host.writeFile = cache.originalWriteFile; compilerHost.getSourceFile = cache.originalGetSourceFile; state.readFileWithCache = cache.originalReadFileWithCache; extendedConfigCache.clear(); moduleResolutionCache == null ? void 0 : moduleResolutionCache.clear(); typeReferenceDirectiveResolutionCache == null ? void 0 : typeReferenceDirectiveResolutionCache.clear(); libraryResolutionCache == null ? void 0 : libraryResolutionCache.clear(); state.cache = void 0; } function clearProjectStatus(state, resolved) { state.projectStatus.delete(resolved); state.diagnostics.delete(resolved); } function addProjToQueue({ projectPendingBuild }, proj, updateLevel) { const value = projectPendingBuild.get(proj); if (value === void 0) { projectPendingBuild.set(proj, updateLevel); } else if (value < updateLevel) { projectPendingBuild.set(proj, updateLevel); } } function setupInitialBuild(state, cancellationToken) { if (!state.allProjectBuildPending) return; state.allProjectBuildPending = false; if (state.options.watch) reportWatchStatus(state, Diagnostics.Starting_compilation_in_watch_mode); enableCache(state); const buildOrder = getBuildOrderFromAnyBuildOrder(getBuildOrder(state)); buildOrder.forEach( (configFileName) => state.projectPendingBuild.set( toResolvedConfigFilePath(state, configFileName), 0 /* Update */ ) ); if (cancellationToken) { cancellationToken.throwIfCancellationRequested(); } } function doneInvalidatedProject(state, projectPath) { state.projectPendingBuild.delete(projectPath); return state.diagnostics.has(projectPath) ? 1 /* DiagnosticsPresent_OutputsSkipped */ : 0 /* Success */; } function createUpdateOutputFileStampsProject(state, project, projectPath, config, buildOrder) { let updateOutputFileStampsPending = true; return { kind: 1 /* UpdateOutputFileStamps */, project, projectPath, buildOrder, getCompilerOptions: () => config.options, getCurrentDirectory: () => state.compilerHost.getCurrentDirectory(), updateOutputFileStatmps: () => { updateOutputTimestamps(state, config, projectPath); updateOutputFileStampsPending = false; }, done: () => { if (updateOutputFileStampsPending) { updateOutputTimestamps(state, config, projectPath); } mark("SolutionBuilder::Timestamps only updates"); return doneInvalidatedProject(state, projectPath); } }; } function createBuildOrUpdateInvalidedProject(state, project, projectPath, projectIndex, config, status, buildOrder) { let step = 0 /* CreateProgram */; let program; let buildResult; return { kind: 0 /* Build */, project, projectPath, buildOrder, getCompilerOptions: () => config.options, getCurrentDirectory: () => state.compilerHost.getCurrentDirectory(), getBuilderProgram: () => withProgramOrUndefined(identity), getProgram: () => withProgramOrUndefined( (program2) => program2.getProgramOrUndefined() ), getSourceFile: (fileName) => withProgramOrUndefined( (program2) => program2.getSourceFile(fileName) ), getSourceFiles: () => withProgramOrEmptyArray( (program2) => program2.getSourceFiles() ), getOptionsDiagnostics: (cancellationToken) => withProgramOrEmptyArray( (program2) => program2.getOptionsDiagnostics(cancellationToken) ), getGlobalDiagnostics: (cancellationToken) => withProgramOrEmptyArray( (program2) => program2.getGlobalDiagnostics(cancellationToken) ), getConfigFileParsingDiagnostics: () => withProgramOrEmptyArray( (program2) => program2.getConfigFileParsingDiagnostics() ), getSyntacticDiagnostics: (sourceFile, cancellationToken) => withProgramOrEmptyArray( (program2) => program2.getSyntacticDiagnostics(sourceFile, cancellationToken) ), getAllDependencies: (sourceFile) => withProgramOrEmptyArray( (program2) => program2.getAllDependencies(sourceFile) ), getSemanticDiagnostics: (sourceFile, cancellationToken) => withProgramOrEmptyArray( (program2) => program2.getSemanticDiagnostics(sourceFile, cancellationToken) ), getSemanticDiagnosticsOfNextAffectedFile: (cancellationToken, ignoreSourceFile) => withProgramOrUndefined( (program2) => program2.getSemanticDiagnosticsOfNextAffectedFile && program2.getSemanticDiagnosticsOfNextAffectedFile(cancellationToken, ignoreSourceFile) ), emit: (targetSourceFile, writeFile2, cancellationToken, emitOnlyDtsFiles, customTransformers) => { if (targetSourceFile || emitOnlyDtsFiles) { return withProgramOrUndefined( (program2) => { var _a, _b; return program2.emit(targetSourceFile, writeFile2, cancellationToken, emitOnlyDtsFiles, customTransformers || ((_b = (_a = state.host).getCustomTransformers) == null ? void 0 : _b.call(_a, project))); } ); } executeSteps(0 /* CreateProgram */, cancellationToken); return emit(writeFile2, cancellationToken, customTransformers); }, done }; function done(cancellationToken, writeFile2, customTransformers) { executeSteps(3 /* Done */, cancellationToken, writeFile2, customTransformers); mark("SolutionBuilder::Projects built"); return doneInvalidatedProject(state, projectPath); } function withProgramOrUndefined(action) { executeSteps(0 /* CreateProgram */); return program && action(program); } function withProgramOrEmptyArray(action) { return withProgramOrUndefined(action) || emptyArray; } function createProgram2() { var _a, _b, _c; Debug.assert(program === void 0); if (state.options.dry) { reportStatus(state, Diagnostics.A_non_dry_build_would_build_project_0, project); buildResult = 1 /* Success */; step = 2 /* QueueReferencingProjects */; return; } if (state.options.verbose) reportStatus(state, Diagnostics.Building_project_0, project); if (config.fileNames.length === 0) { reportAndStoreErrors(state, projectPath, getConfigFileParsingDiagnostics(config)); buildResult = 0 /* None */; step = 2 /* QueueReferencingProjects */; return; } const { host, compilerHost } = state; state.projectCompilerOptions = config.options; (_a = state.moduleResolutionCache) == null ? void 0 : _a.update(config.options); (_b = state.typeReferenceDirectiveResolutionCache) == null ? void 0 : _b.update(config.options); program = host.createProgram( config.fileNames, config.options, compilerHost, getOldProgram(state, projectPath, config), getConfigFileParsingDiagnostics(config), config.projectReferences ); if (state.watch) { const internalMap = (_c = state.moduleResolutionCache) == null ? void 0 : _c.getPackageJsonInfoCache().getInternalMap(); state.lastCachedPackageJsonLookups.set( projectPath, internalMap && new Set(arrayFrom( internalMap.values(), (data) => state.host.realpath && (isPackageJsonInfo(data) || data.directoryExists) ? state.host.realpath(combinePaths(data.packageDirectory, "package.json")) : combinePaths(data.packageDirectory, "package.json") )) ); state.builderPrograms.set(projectPath, program); } step++; } function emit(writeFileCallback, cancellationToken, customTransformers) { var _a, _b, _c; Debug.assertIsDefined(program); Debug.assert(step === 1 /* Emit */); const { host, compilerHost } = state; const emittedOutputs = /* @__PURE__ */ new Map(); const options = program.getCompilerOptions(); const isIncremental = isIncrementalCompilation(options); let outputTimeStampMap; let now; const { emitResult, diagnostics } = emitFilesAndReportErrors( program, (d) => host.reportDiagnostic(d), state.write, /*reportSummary*/ void 0, (name, text, writeByteOrderMark, onError, sourceFiles, data) => { var _a2; const path = toPath2(state, name); emittedOutputs.set(toPath2(state, name), name); if (data == null ? void 0 : data.buildInfo) { now || (now = getCurrentTime(state.host)); const isChangedSignature2 = (_a2 = program.hasChangedEmitSignature) == null ? void 0 : _a2.call(program); const existing = getBuildInfoCacheEntry(state, name, projectPath); if (existing) { existing.buildInfo = data.buildInfo; existing.modifiedTime = now; if (isChangedSignature2) existing.latestChangedDtsTime = now; } else { state.buildInfoCache.set(projectPath, { path: toPath2(state, name), buildInfo: data.buildInfo, modifiedTime: now, latestChangedDtsTime: isChangedSignature2 ? now : void 0 }); } } const modifiedTime = (data == null ? void 0 : data.differsOnlyInMap) ? getModifiedTime(state.host, name) : void 0; (writeFileCallback || compilerHost.writeFile)( name, text, writeByteOrderMark, onError, sourceFiles, data ); if (data == null ? void 0 : data.differsOnlyInMap) state.host.setModifiedTime(name, modifiedTime); else if (!isIncremental && state.watch) { (outputTimeStampMap || (outputTimeStampMap = getOutputTimeStampMap(state, projectPath))).set(path, now || (now = getCurrentTime(state.host))); } }, cancellationToken, /*emitOnlyDtsFiles*/ void 0, customTransformers || ((_b = (_a = state.host).getCustomTransformers) == null ? void 0 : _b.call(_a, project)) ); if ((!options.noEmitOnError || !diagnostics.length) && (emittedOutputs.size || status.type !== 8 /* OutOfDateBuildInfoWithErrors */)) { updateOutputTimestampsWorker(state, config, projectPath, Diagnostics.Updating_unchanged_output_timestamps_of_project_0, emittedOutputs); } state.projectErrorsReported.set(projectPath, true); buildResult = ((_c = program.hasChangedEmitSignature) == null ? void 0 : _c.call(program)) ? 0 /* None */ : 2 /* DeclarationOutputUnchanged */; if (!diagnostics.length) { state.diagnostics.delete(projectPath); state.projectStatus.set(projectPath, { type: 1 /* UpToDate */, oldestOutputFileName: firstOrUndefinedIterator(emittedOutputs.values()) ?? getFirstProjectOutput(config, !host.useCaseSensitiveFileNames()) }); } else { state.diagnostics.set(projectPath, diagnostics); state.projectStatus.set(projectPath, { type: 0 /* Unbuildable */, reason: `it had errors` }); buildResult |= 4 /* AnyErrors */; } afterProgramDone(state, program); step = 2 /* QueueReferencingProjects */; return emitResult; } function executeSteps(till, cancellationToken, writeFile2, customTransformers) { while (step <= till && step < 3 /* Done */) { const currentStep = step; switch (step) { case 0 /* CreateProgram */: createProgram2(); break; case 1 /* Emit */: emit(writeFile2, cancellationToken, customTransformers); break; case 2 /* QueueReferencingProjects */: queueReferencingProjects(state, project, projectPath, projectIndex, config, buildOrder, Debug.checkDefined(buildResult)); step++; break; // Should never be done case 3 /* Done */: default: assertType(step); } Debug.assert(step > currentStep); } } } function getNextInvalidatedProjectCreateInfo(state, buildOrder, reportQueue) { if (!state.projectPendingBuild.size) return void 0; if (isCircularBuildOrder(buildOrder)) return void 0; const { options, projectPendingBuild } = state; for (let projectIndex = 0; projectIndex < buildOrder.length; projectIndex++) { const project = buildOrder[projectIndex]; const projectPath = toResolvedConfigFilePath(state, project); const updateLevel = state.projectPendingBuild.get(projectPath); if (updateLevel === void 0) continue; if (reportQueue) { reportQueue = false; reportBuildQueue(state, buildOrder); } const config = parseConfigFile(state, project, projectPath); if (!config) { reportParseConfigFileDiagnostic(state, projectPath); projectPendingBuild.delete(projectPath); continue; } if (updateLevel === 2 /* Full */) { watchConfigFile(state, project, projectPath, config); watchExtendedConfigFiles(state, projectPath, config); watchWildCardDirectories(state, project, projectPath, config); watchInputFiles(state, project, projectPath, config); watchPackageJsonFiles(state, project, projectPath, config); } else if (updateLevel === 1 /* RootNamesAndUpdate */) { config.fileNames = getFileNamesFromConfigSpecs(config.options.configFile.configFileSpecs, getDirectoryPath(project), config.options, state.parseConfigFileHost); updateErrorForNoInputFiles( config.fileNames, project, config.options.configFile.configFileSpecs, config.errors, canJsonReportNoInputFiles(config.raw) ); watchInputFiles(state, project, projectPath, config); watchPackageJsonFiles(state, project, projectPath, config); } const status = getUpToDateStatus(state, config, projectPath); if (!options.force) { if (status.type === 1 /* UpToDate */) { verboseReportProjectStatus(state, project, status); reportAndStoreErrors(state, projectPath, getConfigFileParsingDiagnostics(config)); projectPendingBuild.delete(projectPath); if (options.dry) { reportStatus(state, Diagnostics.Project_0_is_up_to_date, project); } continue; } if (status.type === 2 /* UpToDateWithUpstreamTypes */ || status.type === 15 /* UpToDateWithInputFileText */) { reportAndStoreErrors(state, projectPath, getConfigFileParsingDiagnostics(config)); return { kind: 1 /* UpdateOutputFileStamps */, status, project, projectPath, projectIndex, config }; } } if (status.type === 12 /* UpstreamBlocked */) { verboseReportProjectStatus(state, project, status); reportAndStoreErrors(state, projectPath, getConfigFileParsingDiagnostics(config)); projectPendingBuild.delete(projectPath); if (options.verbose) { reportStatus( state, status.upstreamProjectBlocked ? Diagnostics.Skipping_build_of_project_0_because_its_dependency_1_was_not_built : Diagnostics.Skipping_build_of_project_0_because_its_dependency_1_has_errors, project, status.upstreamProjectName ); } continue; } if (status.type === 16 /* ContainerOnly */) { verboseReportProjectStatus(state, project, status); reportAndStoreErrors(state, projectPath, getConfigFileParsingDiagnostics(config)); projectPendingBuild.delete(projectPath); continue; } return { kind: 0 /* Build */, status, project, projectPath, projectIndex, config }; } return void 0; } function createInvalidatedProjectWithInfo(state, info, buildOrder) { verboseReportProjectStatus(state, info.project, info.status); return info.kind !== 1 /* UpdateOutputFileStamps */ ? createBuildOrUpdateInvalidedProject( state, info.project, info.projectPath, info.projectIndex, info.config, info.status, buildOrder ) : createUpdateOutputFileStampsProject( state, info.project, info.projectPath, info.config, buildOrder ); } function getNextInvalidatedProject(state, buildOrder, reportQueue) { const info = getNextInvalidatedProjectCreateInfo(state, buildOrder, reportQueue); if (!info) return info; return createInvalidatedProjectWithInfo(state, info, buildOrder); } function getOldProgram({ options, builderPrograms, compilerHost }, proj, parsed) { if (options.force) return void 0; const value = builderPrograms.get(proj); if (value) return value; return readBuilderProgram(parsed.options, compilerHost); } function afterProgramDone(state, program) { if (program) { if (state.host.afterProgramEmitAndDiagnostics) { state.host.afterProgramEmitAndDiagnostics(program); } program.releaseProgram(); } state.projectCompilerOptions = state.baseCompilerOptions; } function isFileWatcherWithModifiedTime(value) { return !!value.watcher; } function getModifiedTime2(state, fileName) { const path = toPath2(state, fileName); const existing = state.filesWatched.get(path); if (state.watch && !!existing) { if (!isFileWatcherWithModifiedTime(existing)) return existing; if (existing.modifiedTime) return existing.modifiedTime; } const result = getModifiedTime(state.host, fileName); if (state.watch) { if (existing) existing.modifiedTime = result; else state.filesWatched.set(path, result); } return result; } function watchFile(state, file, callback, pollingInterval, options, watchType, project) { const path = toPath2(state, file); const existing = state.filesWatched.get(path); if (existing && isFileWatcherWithModifiedTime(existing)) { existing.callbacks.push(callback); } else { const watcher = state.watchFile( file, (fileName, eventKind, modifiedTime) => { const existing2 = Debug.checkDefined(state.filesWatched.get(path)); Debug.assert(isFileWatcherWithModifiedTime(existing2)); existing2.modifiedTime = modifiedTime; existing2.callbacks.forEach((cb) => cb(fileName, eventKind, modifiedTime)); }, pollingInterval, options, watchType, project ); state.filesWatched.set(path, { callbacks: [callback], watcher, modifiedTime: existing }); } return { close: () => { const existing2 = Debug.checkDefined(state.filesWatched.get(path)); Debug.assert(isFileWatcherWithModifiedTime(existing2)); if (existing2.callbacks.length === 1) { state.filesWatched.delete(path); closeFileWatcherOf(existing2); } else { unorderedRemoveItem(existing2.callbacks, callback); } } }; } function getOutputTimeStampMap(state, resolvedConfigFilePath) { if (!state.watch) return void 0; let result = state.outputTimeStamps.get(resolvedConfigFilePath); if (!result) state.outputTimeStamps.set(resolvedConfigFilePath, result = /* @__PURE__ */ new Map()); return result; } function getBuildInfoCacheEntry(state, buildInfoPath, resolvedConfigPath) { const path = toPath2(state, buildInfoPath); const existing = state.buildInfoCache.get(resolvedConfigPath); return (existing == null ? void 0 : existing.path) === path ? existing : void 0; } function getBuildInfo3(state, buildInfoPath, resolvedConfigPath, modifiedTime) { const path = toPath2(state, buildInfoPath); const existing = state.buildInfoCache.get(resolvedConfigPath); if (existing !== void 0 && existing.path === path) { return existing.buildInfo || void 0; } const value = state.readFileWithCache(buildInfoPath); const buildInfo = value ? getBuildInfo(buildInfoPath, value) : void 0; state.buildInfoCache.set(resolvedConfigPath, { path, buildInfo: buildInfo || false, modifiedTime: modifiedTime || missingFileModifiedTime }); return buildInfo; } function checkConfigFileUpToDateStatus(state, configFile, oldestOutputFileTime, oldestOutputFileName) { const tsconfigTime = getModifiedTime2(state, configFile); if (oldestOutputFileTime < tsconfigTime) { return { type: 5 /* OutOfDateWithSelf */, outOfDateOutputFileName: oldestOutputFileName, newerInputFileName: configFile }; } } function getUpToDateStatusWorker(state, project, resolvedPath) { var _a, _b, _c, _d, _e; if (isSolutionConfig(project)) return { type: 16 /* ContainerOnly */ }; let referenceStatuses; const force = !!state.options.force; if (project.projectReferences) { state.projectStatus.set(resolvedPath, { type: 13 /* ComputingUpstream */ }); for (const ref of project.projectReferences) { const resolvedRef = resolveProjectReferencePath(ref); const resolvedRefPath = toResolvedConfigFilePath(state, resolvedRef); const resolvedConfig = parseConfigFile(state, resolvedRef, resolvedRefPath); const refStatus = getUpToDateStatus(state, resolvedConfig, resolvedRefPath); if (refStatus.type === 13 /* ComputingUpstream */ || refStatus.type === 16 /* ContainerOnly */) { continue; } if (state.options.stopBuildOnErrors && (refStatus.type === 0 /* Unbuildable */ || refStatus.type === 12 /* UpstreamBlocked */)) { return { type: 12 /* UpstreamBlocked */, upstreamProjectName: ref.path, upstreamProjectBlocked: refStatus.type === 12 /* UpstreamBlocked */ }; } if (!force) (referenceStatuses || (referenceStatuses = [])).push({ ref, refStatus, resolvedRefPath, resolvedConfig }); } } if (force) return { type: 17 /* ForceBuild */ }; const { host } = state; const buildInfoPath = getTsBuildInfoEmitOutputFilePath(project.options); const isIncremental = isIncrementalCompilation(project.options); let buildInfoCacheEntry = getBuildInfoCacheEntry(state, buildInfoPath, resolvedPath); const buildInfoTime = (buildInfoCacheEntry == null ? void 0 : buildInfoCacheEntry.modifiedTime) || getModifiedTime(host, buildInfoPath); if (buildInfoTime === missingFileModifiedTime) { if (!buildInfoCacheEntry) { state.buildInfoCache.set(resolvedPath, { path: toPath2(state, buildInfoPath), buildInfo: false, modifiedTime: buildInfoTime }); } return { type: 3 /* OutputMissing */, missingOutputFileName: buildInfoPath }; } const buildInfo = getBuildInfo3(state, buildInfoPath, resolvedPath, buildInfoTime); if (!buildInfo) { return { type: 4 /* ErrorReadingFile */, fileName: buildInfoPath }; } const incrementalBuildInfo = isIncremental && isIncrementalBuildInfo(buildInfo) ? buildInfo : void 0; if ((incrementalBuildInfo || !isIncremental) && buildInfo.version !== version) { return { type: 14 /* TsVersionOutputOfDate */, version: buildInfo.version }; } if (!project.options.noCheck && (buildInfo.errors || // TODO: syntax errors???? buildInfo.checkPending)) { return { type: 8 /* OutOfDateBuildInfoWithErrors */, buildInfoFile: buildInfoPath }; } if (incrementalBuildInfo) { if (!project.options.noCheck && (((_a = incrementalBuildInfo.changeFileSet) == null ? void 0 : _a.length) || ((_b = incrementalBuildInfo.semanticDiagnosticsPerFile) == null ? void 0 : _b.length) || getEmitDeclarations(project.options) && ((_c = incrementalBuildInfo.emitDiagnosticsPerFile) == null ? void 0 : _c.length))) { return { type: 8 /* OutOfDateBuildInfoWithErrors */, buildInfoFile: buildInfoPath }; } if (!project.options.noEmit && (((_d = incrementalBuildInfo.changeFileSet) == null ? void 0 : _d.length) || ((_e = incrementalBuildInfo.affectedFilesPendingEmit) == null ? void 0 : _e.length) || incrementalBuildInfo.pendingEmit !== void 0)) { return { type: 7 /* OutOfDateBuildInfoWithPendingEmit */, buildInfoFile: buildInfoPath }; } if ((!project.options.noEmit || project.options.noEmit && getEmitDeclarations(project.options)) && getPendingEmitKindWithSeen( project.options, incrementalBuildInfo.options || {}, /*emitOnlyDtsFiles*/ void 0, !!project.options.noEmit )) { return { type: 9 /* OutOfDateOptions */, buildInfoFile: buildInfoPath }; } } let oldestOutputFileTime = buildInfoTime; let oldestOutputFileName = buildInfoPath; let newestInputFileName = void 0; let newestInputFileTime = minimumDate; let pseudoInputUpToDate = false; const seenRoots = /* @__PURE__ */ new Set(); let buildInfoVersionMap; for (const inputFile of project.fileNames) { const inputTime = getModifiedTime2(state, inputFile); if (inputTime === missingFileModifiedTime) { return { type: 0 /* Unbuildable */, reason: `${inputFile} does not exist` }; } const inputPath = toPath2(state, inputFile); if (buildInfoTime < inputTime) { let version2; let currentVersion; if (incrementalBuildInfo) { if (!buildInfoVersionMap) buildInfoVersionMap = getBuildInfoFileVersionMap(incrementalBuildInfo, buildInfoPath, host); const resolvedInputPath = buildInfoVersionMap.roots.get(inputPath); version2 = buildInfoVersionMap.fileInfos.get(resolvedInputPath ?? inputPath); const text = version2 ? state.readFileWithCache(resolvedInputPath ?? inputFile) : void 0; currentVersion = text !== void 0 ? getSourceFileVersionAsHashFromText(host, text) : void 0; if (version2 && version2 === currentVersion) pseudoInputUpToDate = true; } if (!version2 || version2 !== currentVersion) { return { type: 5 /* OutOfDateWithSelf */, outOfDateOutputFileName: buildInfoPath, newerInputFileName: inputFile }; } } if (inputTime > newestInputFileTime) { newestInputFileName = inputFile; newestInputFileTime = inputTime; } seenRoots.add(inputPath); } let existingRoot; if (incrementalBuildInfo) { if (!buildInfoVersionMap) buildInfoVersionMap = getBuildInfoFileVersionMap(incrementalBuildInfo, buildInfoPath, host); existingRoot = forEachEntry( buildInfoVersionMap.roots, // File was root file when project was built but its not any more (_resolved, existingRoot2) => !seenRoots.has(existingRoot2) ? existingRoot2 : void 0 ); } else { existingRoot = forEach( getNonIncrementalBuildInfoRoots(buildInfo, buildInfoPath, host), (root) => !seenRoots.has(root) ? root : void 0 ); } if (existingRoot) { return { type: 10 /* OutOfDateRoots */, buildInfoFile: buildInfoPath, inputFile: existingRoot }; } if (!isIncremental) { const outputs = getAllProjectOutputs(project, !host.useCaseSensitiveFileNames()); const outputTimeStampMap = getOutputTimeStampMap(state, resolvedPath); for (const output of outputs) { if (output === buildInfoPath) continue; const path = toPath2(state, output); let outputTime = outputTimeStampMap == null ? void 0 : outputTimeStampMap.get(path); if (!outputTime) { outputTime = getModifiedTime(state.host, output); outputTimeStampMap == null ? void 0 : outputTimeStampMap.set(path, outputTime); } if (outputTime === missingFileModifiedTime) { return { type: 3 /* OutputMissing */, missingOutputFileName: output }; } if (outputTime < newestInputFileTime) { return { type: 5 /* OutOfDateWithSelf */, outOfDateOutputFileName: output, newerInputFileName: newestInputFileName }; } if (outputTime < oldestOutputFileTime) { oldestOutputFileTime = outputTime; oldestOutputFileName = output; } } } let pseudoUpToDate = false; if (referenceStatuses) { for (const { ref, refStatus, resolvedConfig, resolvedRefPath } of referenceStatuses) { if (refStatus.newestInputFileTime && refStatus.newestInputFileTime <= oldestOutputFileTime) { continue; } if (hasSameBuildInfo(state, buildInfoCacheEntry ?? (buildInfoCacheEntry = state.buildInfoCache.get(resolvedPath)), resolvedRefPath)) { return { type: 6 /* OutOfDateWithUpstream */, outOfDateOutputFileName: buildInfoPath, newerProjectName: ref.path }; } const newestDeclarationFileContentChangedTime = getLatestChangedDtsTime(state, resolvedConfig.options, resolvedRefPath); if (newestDeclarationFileContentChangedTime && newestDeclarationFileContentChangedTime <= oldestOutputFileTime) { pseudoUpToDate = true; continue; } Debug.assert(oldestOutputFileName !== void 0, "Should have an oldest output filename here"); return { type: 6 /* OutOfDateWithUpstream */, outOfDateOutputFileName: oldestOutputFileName, newerProjectName: ref.path }; } } const configStatus = checkConfigFileUpToDateStatus(state, project.options.configFilePath, oldestOutputFileTime, oldestOutputFileName); if (configStatus) return configStatus; const extendedConfigStatus = forEach(project.options.configFile.extendedSourceFiles || emptyArray, (configFile) => checkConfigFileUpToDateStatus(state, configFile, oldestOutputFileTime, oldestOutputFileName)); if (extendedConfigStatus) return extendedConfigStatus; const packageJsonLookups = state.lastCachedPackageJsonLookups.get(resolvedPath); const dependentPackageFileStatus = packageJsonLookups && forEachKey( packageJsonLookups, (path) => checkConfigFileUpToDateStatus(state, path, oldestOutputFileTime, oldestOutputFileName) ); if (dependentPackageFileStatus) return dependentPackageFileStatus; return { type: pseudoUpToDate ? 2 /* UpToDateWithUpstreamTypes */ : pseudoInputUpToDate ? 15 /* UpToDateWithInputFileText */ : 1 /* UpToDate */, newestInputFileTime, newestInputFileName, oldestOutputFileName }; } function hasSameBuildInfo(state, buildInfoCacheEntry, resolvedRefPath) { const refBuildInfo = state.buildInfoCache.get(resolvedRefPath); return refBuildInfo.path === buildInfoCacheEntry.path; } function getUpToDateStatus(state, project, resolvedPath) { if (project === void 0) { return { type: 0 /* Unbuildable */, reason: "config file deleted mid-build" }; } const prior = state.projectStatus.get(resolvedPath); if (prior !== void 0) { return prior; } mark("SolutionBuilder::beforeUpToDateCheck"); const actual = getUpToDateStatusWorker(state, project, resolvedPath); mark("SolutionBuilder::afterUpToDateCheck"); measure("SolutionBuilder::Up-to-date check", "SolutionBuilder::beforeUpToDateCheck", "SolutionBuilder::afterUpToDateCheck"); state.projectStatus.set(resolvedPath, actual); return actual; } function updateOutputTimestampsWorker(state, proj, projectPath, verboseMessage, skipOutputs) { if (proj.options.noEmit) return; let now; const buildInfoPath = getTsBuildInfoEmitOutputFilePath(proj.options); const isIncremental = isIncrementalCompilation(proj.options); if (buildInfoPath && isIncremental) { if (!(skipOutputs == null ? void 0 : skipOutputs.has(toPath2(state, buildInfoPath)))) { if (!!state.options.verbose) reportStatus(state, verboseMessage, proj.options.configFilePath); state.host.setModifiedTime(buildInfoPath, now = getCurrentTime(state.host)); getBuildInfoCacheEntry(state, buildInfoPath, projectPath).modifiedTime = now; } state.outputTimeStamps.delete(projectPath); return; } const { host } = state; const outputs = getAllProjectOutputs(proj, !host.useCaseSensitiveFileNames()); const outputTimeStampMap = getOutputTimeStampMap(state, projectPath); const modifiedOutputs = outputTimeStampMap ? /* @__PURE__ */ new Set() : void 0; if (!skipOutputs || outputs.length !== skipOutputs.size) { let reportVerbose = !!state.options.verbose; for (const file of outputs) { const path = toPath2(state, file); if (skipOutputs == null ? void 0 : skipOutputs.has(path)) continue; if (reportVerbose) { reportVerbose = false; reportStatus(state, verboseMessage, proj.options.configFilePath); } host.setModifiedTime(file, now || (now = getCurrentTime(state.host))); if (file === buildInfoPath) getBuildInfoCacheEntry(state, buildInfoPath, projectPath).modifiedTime = now; else if (outputTimeStampMap) { outputTimeStampMap.set(path, now); modifiedOutputs.add(path); } } } outputTimeStampMap == null ? void 0 : outputTimeStampMap.forEach((_value, key) => { if (!(skipOutputs == null ? void 0 : skipOutputs.has(key)) && !modifiedOutputs.has(key)) outputTimeStampMap.delete(key); }); } function getLatestChangedDtsTime(state, options, resolvedConfigPath) { if (!options.composite) return void 0; const entry = Debug.checkDefined(state.buildInfoCache.get(resolvedConfigPath)); if (entry.latestChangedDtsTime !== void 0) return entry.latestChangedDtsTime || void 0; const latestChangedDtsTime = entry.buildInfo && isIncrementalBuildInfo(entry.buildInfo) && entry.buildInfo.latestChangedDtsFile ? state.host.getModifiedTime(getNormalizedAbsolutePath(entry.buildInfo.latestChangedDtsFile, getDirectoryPath(entry.path))) : void 0; entry.latestChangedDtsTime = latestChangedDtsTime || false; return latestChangedDtsTime; } function updateOutputTimestamps(state, proj, resolvedPath) { if (state.options.dry) { return reportStatus(state, Diagnostics.A_non_dry_build_would_update_timestamps_for_output_of_project_0, proj.options.configFilePath); } updateOutputTimestampsWorker(state, proj, resolvedPath, Diagnostics.Updating_output_timestamps_of_project_0); state.projectStatus.set(resolvedPath, { type: 1 /* UpToDate */, oldestOutputFileName: getFirstProjectOutput(proj, !state.host.useCaseSensitiveFileNames()) }); } function queueReferencingProjects(state, project, projectPath, projectIndex, config, buildOrder, buildResult) { if (state.options.stopBuildOnErrors && buildResult & 4 /* AnyErrors */) return; if (!config.options.composite) return; for (let index = projectIndex + 1; index < buildOrder.length; index++) { const nextProject = buildOrder[index]; const nextProjectPath = toResolvedConfigFilePath(state, nextProject); if (state.projectPendingBuild.has(nextProjectPath)) continue; const nextProjectConfig = parseConfigFile(state, nextProject, nextProjectPath); if (!nextProjectConfig || !nextProjectConfig.projectReferences) continue; for (const ref of nextProjectConfig.projectReferences) { const resolvedRefPath = resolveProjectName(state, ref.path); if (toResolvedConfigFilePath(state, resolvedRefPath) !== projectPath) continue; const status = state.projectStatus.get(nextProjectPath); if (status) { switch (status.type) { case 1 /* UpToDate */: if (buildResult & 2 /* DeclarationOutputUnchanged */) { status.type = 2 /* UpToDateWithUpstreamTypes */; break; } // falls through case 15 /* UpToDateWithInputFileText */: case 2 /* UpToDateWithUpstreamTypes */: if (!(buildResult & 2 /* DeclarationOutputUnchanged */)) { state.projectStatus.set(nextProjectPath, { type: 6 /* OutOfDateWithUpstream */, outOfDateOutputFileName: status.oldestOutputFileName, newerProjectName: project }); } break; case 12 /* UpstreamBlocked */: if (toResolvedConfigFilePath(state, resolveProjectName(state, status.upstreamProjectName)) === projectPath) { clearProjectStatus(state, nextProjectPath); } break; } } addProjToQueue(state, nextProjectPath, 0 /* Update */); break; } } } function build(state, project, cancellationToken, writeFile2, getCustomTransformers, onlyReferences) { mark("SolutionBuilder::beforeBuild"); const result = buildWorker(state, project, cancellationToken, writeFile2, getCustomTransformers, onlyReferences); mark("SolutionBuilder::afterBuild"); measure("SolutionBuilder::Build", "SolutionBuilder::beforeBuild", "SolutionBuilder::afterBuild"); return result; } function buildWorker(state, project, cancellationToken, writeFile2, getCustomTransformers, onlyReferences) { const buildOrder = getBuildOrderFor(state, project, onlyReferences); if (!buildOrder) return 3 /* InvalidProject_OutputsSkipped */; setupInitialBuild(state, cancellationToken); let reportQueue = true; let successfulProjects = 0; while (true) { const invalidatedProject = getNextInvalidatedProject(state, buildOrder, reportQueue); if (!invalidatedProject) break; reportQueue = false; invalidatedProject.done(cancellationToken, writeFile2, getCustomTransformers == null ? void 0 : getCustomTransformers(invalidatedProject.project)); if (!state.diagnostics.has(invalidatedProject.projectPath)) successfulProjects++; } disableCache(state); reportErrorSummary(state, buildOrder); startWatching(state, buildOrder); return isCircularBuildOrder(buildOrder) ? 4 /* ProjectReferenceCycle_OutputsSkipped */ : !buildOrder.some((p) => state.diagnostics.has(toResolvedConfigFilePath(state, p))) ? 0 /* Success */ : successfulProjects ? 2 /* DiagnosticsPresent_OutputsGenerated */ : 1 /* DiagnosticsPresent_OutputsSkipped */; } function clean(state, project, onlyReferences) { mark("SolutionBuilder::beforeClean"); const result = cleanWorker(state, project, onlyReferences); mark("SolutionBuilder::afterClean"); measure("SolutionBuilder::Clean", "SolutionBuilder::beforeClean", "SolutionBuilder::afterClean"); return result; } function cleanWorker(state, project, onlyReferences) { const buildOrder = getBuildOrderFor(state, project, onlyReferences); if (!buildOrder) return 3 /* InvalidProject_OutputsSkipped */; if (isCircularBuildOrder(buildOrder)) { reportErrors(state, buildOrder.circularDiagnostics); return 4 /* ProjectReferenceCycle_OutputsSkipped */; } const { options, host } = state; const filesToDelete = options.dry ? [] : void 0; for (const proj of buildOrder) { const resolvedPath = toResolvedConfigFilePath(state, proj); const parsed = parseConfigFile(state, proj, resolvedPath); if (parsed === void 0) { reportParseConfigFileDiagnostic(state, resolvedPath); continue; } const outputs = getAllProjectOutputs(parsed, !host.useCaseSensitiveFileNames()); if (!outputs.length) continue; const inputFileNames = new Set(parsed.fileNames.map((f) => toPath2(state, f))); for (const output of outputs) { if (inputFileNames.has(toPath2(state, output))) continue; if (host.fileExists(output)) { if (filesToDelete) { filesToDelete.push(output); } else { host.deleteFile(output); invalidateProject(state, resolvedPath, 0 /* Update */); } } } } if (filesToDelete) { reportStatus(state, Diagnostics.A_non_dry_build_would_delete_the_following_files_Colon_0, filesToDelete.map((f) => `\r * ${f}`).join("")); } return 0 /* Success */; } function invalidateProject(state, resolved, updateLevel) { if (state.host.getParsedCommandLine && updateLevel === 1 /* RootNamesAndUpdate */) { updateLevel = 2 /* Full */; } if (updateLevel === 2 /* Full */) { state.configFileCache.delete(resolved); state.buildOrder = void 0; } state.needsSummary = true; clearProjectStatus(state, resolved); addProjToQueue(state, resolved, updateLevel); enableCache(state); } function invalidateProjectAndScheduleBuilds(state, resolvedPath, updateLevel) { state.reportFileChangeDetected = true; invalidateProject(state, resolvedPath, updateLevel); scheduleBuildInvalidatedProject( state, 250, /*changeDetected*/ true ); } function scheduleBuildInvalidatedProject(state, time, changeDetected) { const { hostWithWatch } = state; if (!hostWithWatch.setTimeout || !hostWithWatch.clearTimeout) { return; } if (state.timerToBuildInvalidatedProject) { hostWithWatch.clearTimeout(state.timerToBuildInvalidatedProject); } state.timerToBuildInvalidatedProject = hostWithWatch.setTimeout(buildNextInvalidatedProject, time, "timerToBuildInvalidatedProject", state, changeDetected); } function buildNextInvalidatedProject(_timeoutType, state, changeDetected) { mark("SolutionBuilder::beforeBuild"); const buildOrder = buildNextInvalidatedProjectWorker(state, changeDetected); mark("SolutionBuilder::afterBuild"); measure("SolutionBuilder::Build", "SolutionBuilder::beforeBuild", "SolutionBuilder::afterBuild"); if (buildOrder) reportErrorSummary(state, buildOrder); } function buildNextInvalidatedProjectWorker(state, changeDetected) { state.timerToBuildInvalidatedProject = void 0; if (state.reportFileChangeDetected) { state.reportFileChangeDetected = false; state.projectErrorsReported.clear(); reportWatchStatus(state, Diagnostics.File_change_detected_Starting_incremental_compilation); } let projectsBuilt = 0; const buildOrder = getBuildOrder(state); const invalidatedProject = getNextInvalidatedProject( state, buildOrder, /*reportQueue*/ false ); if (invalidatedProject) { invalidatedProject.done(); projectsBuilt++; while (state.projectPendingBuild.size) { if (state.timerToBuildInvalidatedProject) return; const info = getNextInvalidatedProjectCreateInfo( state, buildOrder, /*reportQueue*/ false ); if (!info) break; if (info.kind !== 1 /* UpdateOutputFileStamps */ && (changeDetected || projectsBuilt === 5)) { scheduleBuildInvalidatedProject( state, 100, /*changeDetected*/ false ); return; } const project = createInvalidatedProjectWithInfo(state, info, buildOrder); project.done(); if (info.kind !== 1 /* UpdateOutputFileStamps */) projectsBuilt++; } } disableCache(state); return buildOrder; } function watchConfigFile(state, resolved, resolvedPath, parsed) { if (!state.watch || state.allWatchedConfigFiles.has(resolvedPath)) return; state.allWatchedConfigFiles.set( resolvedPath, watchFile( state, resolved, () => invalidateProjectAndScheduleBuilds(state, resolvedPath, 2 /* Full */), 2e3 /* High */, parsed == null ? void 0 : parsed.watchOptions, WatchType.ConfigFile, resolved ) ); } function watchExtendedConfigFiles(state, resolvedPath, parsed) { updateSharedExtendedConfigFileWatcher( resolvedPath, parsed == null ? void 0 : parsed.options, state.allWatchedExtendedConfigFiles, (extendedConfigFileName, extendedConfigFilePath) => watchFile( state, extendedConfigFileName, () => { var _a; return (_a = state.allWatchedExtendedConfigFiles.get(extendedConfigFilePath)) == null ? void 0 : _a.projects.forEach((projectConfigFilePath) => invalidateProjectAndScheduleBuilds(state, projectConfigFilePath, 2 /* Full */)); }, 2e3 /* High */, parsed == null ? void 0 : parsed.watchOptions, WatchType.ExtendedConfigFile ), (fileName) => toPath2(state, fileName) ); } function watchWildCardDirectories(state, resolved, resolvedPath, parsed) { if (!state.watch) return; updateWatchingWildcardDirectories( getOrCreateValueMapFromConfigFileMap(state.allWatchedWildcardDirectories, resolvedPath), parsed.wildcardDirectories, (dir, flags) => state.watchDirectory( dir, (fileOrDirectory) => { var _a; if (isIgnoredFileFromWildCardWatching({ watchedDirPath: toPath2(state, dir), fileOrDirectory, fileOrDirectoryPath: toPath2(state, fileOrDirectory), configFileName: resolved, currentDirectory: state.compilerHost.getCurrentDirectory(), options: parsed.options, program: state.builderPrograms.get(resolvedPath) || ((_a = getCachedParsedConfigFile(state, resolvedPath)) == null ? void 0 : _a.fileNames), useCaseSensitiveFileNames: state.parseConfigFileHost.useCaseSensitiveFileNames, writeLog: (s) => state.writeLog(s), toPath: (fileName) => toPath2(state, fileName) })) return; invalidateProjectAndScheduleBuilds(state, resolvedPath, 1 /* RootNamesAndUpdate */); }, flags, parsed == null ? void 0 : parsed.watchOptions, WatchType.WildcardDirectory, resolved ) ); } function watchInputFiles(state, resolved, resolvedPath, parsed) { if (!state.watch) return; mutateMap( getOrCreateValueMapFromConfigFileMap(state.allWatchedInputFiles, resolvedPath), new Set(parsed.fileNames), { createNewValue: (input) => watchFile( state, input, () => invalidateProjectAndScheduleBuilds(state, resolvedPath, 0 /* Update */), 250 /* Low */, parsed == null ? void 0 : parsed.watchOptions, WatchType.SourceFile, resolved ), onDeleteValue: closeFileWatcher } ); } function watchPackageJsonFiles(state, resolved, resolvedPath, parsed) { if (!state.watch || !state.lastCachedPackageJsonLookups) return; mutateMap( getOrCreateValueMapFromConfigFileMap(state.allWatchedPackageJsonFiles, resolvedPath), state.lastCachedPackageJsonLookups.get(resolvedPath), { createNewValue: (input) => watchFile( state, input, () => invalidateProjectAndScheduleBuilds(state, resolvedPath, 0 /* Update */), 2e3 /* High */, parsed == null ? void 0 : parsed.watchOptions, WatchType.PackageJson, resolved ), onDeleteValue: closeFileWatcher } ); } function startWatching(state, buildOrder) { if (!state.watchAllProjectsPending) return; mark("SolutionBuilder::beforeWatcherCreation"); state.watchAllProjectsPending = false; for (const resolved of getBuildOrderFromAnyBuildOrder(buildOrder)) { const resolvedPath = toResolvedConfigFilePath(state, resolved); const cfg = parseConfigFile(state, resolved, resolvedPath); watchConfigFile(state, resolved, resolvedPath, cfg); watchExtendedConfigFiles(state, resolvedPath, cfg); if (cfg) { watchWildCardDirectories(state, resolved, resolvedPath, cfg); watchInputFiles(state, resolved, resolvedPath, cfg); watchPackageJsonFiles(state, resolved, resolvedPath, cfg); } } mark("SolutionBuilder::afterWatcherCreation"); measure("SolutionBuilder::Watcher creation", "SolutionBuilder::beforeWatcherCreation", "SolutionBuilder::afterWatcherCreation"); } function stopWatching(state) { clearMap(state.allWatchedConfigFiles, closeFileWatcher); clearMap(state.allWatchedExtendedConfigFiles, closeFileWatcherOf); clearMap(state.allWatchedWildcardDirectories, (watchedWildcardDirectories) => clearMap(watchedWildcardDirectories, closeFileWatcherOf)); clearMap(state.allWatchedInputFiles, (watchedWildcardDirectories) => clearMap(watchedWildcardDirectories, closeFileWatcher)); clearMap(state.allWatchedPackageJsonFiles, (watchedPacageJsonFiles) => clearMap(watchedPacageJsonFiles, closeFileWatcher)); } function createSolutionBuilderWorker(watch, hostOrHostWithWatch, rootNames, options, baseWatchOptions) { const state = createSolutionBuilderState(watch, hostOrHostWithWatch, rootNames, options, baseWatchOptions); return { build: (project, cancellationToken, writeFile2, getCustomTransformers) => build(state, project, cancellationToken, writeFile2, getCustomTransformers), clean: (project) => clean(state, project), buildReferences: (project, cancellationToken, writeFile2, getCustomTransformers) => build( state, project, cancellationToken, writeFile2, getCustomTransformers, /*onlyReferences*/ true ), cleanReferences: (project) => clean( state, project, /*onlyReferences*/ true ), getNextInvalidatedProject: (cancellationToken) => { setupInitialBuild(state, cancellationToken); return getNextInvalidatedProject( state, getBuildOrder(state), /*reportQueue*/ false ); }, getBuildOrder: () => getBuildOrder(state), getUpToDateStatusOfProject: (project) => { const configFileName = resolveProjectName(state, project); const configFilePath = toResolvedConfigFilePath(state, configFileName); return getUpToDateStatus(state, parseConfigFile(state, configFileName, configFilePath), configFilePath); }, invalidateProject: (configFilePath, updateLevel) => invalidateProject(state, configFilePath, updateLevel || 0 /* Update */), close: () => stopWatching(state) }; } function relName(state, path) { return convertToRelativePath(path, state.compilerHost.getCurrentDirectory(), state.compilerHost.getCanonicalFileName); } function reportStatus(state, message, ...args) { state.host.reportSolutionBuilderStatus(createCompilerDiagnostic(message, ...args)); } function reportWatchStatus(state, message, ...args) { var _a, _b; (_b = (_a = state.hostWithWatch).onWatchStatusChange) == null ? void 0 : _b.call(_a, createCompilerDiagnostic(message, ...args), state.host.getNewLine(), state.baseCompilerOptions); } function reportErrors({ host }, errors) { errors.forEach((err) => host.reportDiagnostic(err)); } function reportAndStoreErrors(state, proj, errors) { reportErrors(state, errors); state.projectErrorsReported.set(proj, true); if (errors.length) { state.diagnostics.set(proj, errors); } } function reportParseConfigFileDiagnostic(state, proj) { reportAndStoreErrors(state, proj, [state.configFileCache.get(proj)]); } function reportErrorSummary(state, buildOrder) { if (!state.needsSummary) return; state.needsSummary = false; const canReportSummary = state.watch || !!state.host.reportErrorSummary; const { diagnostics } = state; let totalErrors = 0; let filesInError = []; if (isCircularBuildOrder(buildOrder)) { reportBuildQueue(state, buildOrder.buildOrder); reportErrors(state, buildOrder.circularDiagnostics); if (canReportSummary) totalErrors += getErrorCountForSummary(buildOrder.circularDiagnostics); if (canReportSummary) filesInError = [...filesInError, ...getFilesInErrorForSummary(buildOrder.circularDiagnostics)]; } else { buildOrder.forEach((project) => { const projectPath = toResolvedConfigFilePath(state, project); if (!state.projectErrorsReported.has(projectPath)) { reportErrors(state, diagnostics.get(projectPath) || emptyArray); } }); if (canReportSummary) diagnostics.forEach((singleProjectErrors) => totalErrors += getErrorCountForSummary(singleProjectErrors)); if (canReportSummary) diagnostics.forEach((singleProjectErrors) => [...filesInError, ...getFilesInErrorForSummary(singleProjectErrors)]); } if (state.watch) { reportWatchStatus(state, getWatchErrorSummaryDiagnosticMessage(totalErrors), totalErrors); } else if (state.host.reportErrorSummary) { state.host.reportErrorSummary(totalErrors, filesInError); } } function reportBuildQueue(state, buildQueue) { if (state.options.verbose) { reportStatus(state, Diagnostics.Projects_in_this_build_Colon_0, buildQueue.map((s) => "\r\n * " + relName(state, s)).join("")); } } function reportUpToDateStatus(state, configFileName, status) { switch (status.type) { case 5 /* OutOfDateWithSelf */: return reportStatus( state, Diagnostics.Project_0_is_out_of_date_because_output_1_is_older_than_input_2, relName(state, configFileName), relName(state, status.outOfDateOutputFileName), relName(state, status.newerInputFileName) ); case 6 /* OutOfDateWithUpstream */: return reportStatus( state, Diagnostics.Project_0_is_out_of_date_because_output_1_is_older_than_input_2, relName(state, configFileName), relName(state, status.outOfDateOutputFileName), relName(state, status.newerProjectName) ); case 3 /* OutputMissing */: return reportStatus( state, Diagnostics.Project_0_is_out_of_date_because_output_file_1_does_not_exist, relName(state, configFileName), relName(state, status.missingOutputFileName) ); case 4 /* ErrorReadingFile */: return reportStatus( state, Diagnostics.Project_0_is_out_of_date_because_there_was_error_reading_file_1, relName(state, configFileName), relName(state, status.fileName) ); case 7 /* OutOfDateBuildInfoWithPendingEmit */: return reportStatus( state, Diagnostics.Project_0_is_out_of_date_because_buildinfo_file_1_indicates_that_some_of_the_changes_were_not_emitted, relName(state, configFileName), relName(state, status.buildInfoFile) ); case 8 /* OutOfDateBuildInfoWithErrors */: return reportStatus( state, Diagnostics.Project_0_is_out_of_date_because_buildinfo_file_1_indicates_that_program_needs_to_report_errors, relName(state, configFileName), relName(state, status.buildInfoFile) ); case 9 /* OutOfDateOptions */: return reportStatus( state, Diagnostics.Project_0_is_out_of_date_because_buildinfo_file_1_indicates_there_is_change_in_compilerOptions, relName(state, configFileName), relName(state, status.buildInfoFile) ); case 10 /* OutOfDateRoots */: return reportStatus( state, Diagnostics.Project_0_is_out_of_date_because_buildinfo_file_1_indicates_that_file_2_was_root_file_of_compilation_but_not_any_more, relName(state, configFileName), relName(state, status.buildInfoFile), relName(state, status.inputFile) ); case 1 /* UpToDate */: if (status.newestInputFileTime !== void 0) { return reportStatus( state, Diagnostics.Project_0_is_up_to_date_because_newest_input_1_is_older_than_output_2, relName(state, configFileName), relName(state, status.newestInputFileName || ""), relName(state, status.oldestOutputFileName || "") ); } break; case 2 /* UpToDateWithUpstreamTypes */: return reportStatus( state, Diagnostics.Project_0_is_up_to_date_with_d_ts_files_from_its_dependencies, relName(state, configFileName) ); case 15 /* UpToDateWithInputFileText */: return reportStatus( state, Diagnostics.Project_0_is_up_to_date_but_needs_to_update_timestamps_of_output_files_that_are_older_than_input_files, relName(state, configFileName) ); case 11 /* UpstreamOutOfDate */: return reportStatus( state, Diagnostics.Project_0_is_out_of_date_because_its_dependency_1_is_out_of_date, relName(state, configFileName), relName(state, status.upstreamProjectName) ); case 12 /* UpstreamBlocked */: return reportStatus( state, status.upstreamProjectBlocked ? Diagnostics.Project_0_can_t_be_built_because_its_dependency_1_was_not_built : Diagnostics.Project_0_can_t_be_built_because_its_dependency_1_has_errors, relName(state, configFileName), relName(state, status.upstreamProjectName) ); case 0 /* Unbuildable */: return reportStatus( state, Diagnostics.Project_0_is_out_of_date_because_1, relName(state, configFileName), status.reason ); case 14 /* TsVersionOutputOfDate */: return reportStatus( state, Diagnostics.Project_0_is_out_of_date_because_output_for_it_was_generated_with_version_1_that_differs_with_current_version_2, relName(state, configFileName), status.version, version ); case 17 /* ForceBuild */: return reportStatus( state, Diagnostics.Project_0_is_being_forcibly_rebuilt, relName(state, configFileName) ); case 16 /* ContainerOnly */: // Don't report status on "solution" projects // falls through case 13 /* ComputingUpstream */: break; default: assertType(status); } } function verboseReportProjectStatus(state, configFileName, status) { if (state.options.verbose) { reportUpToDateStatus(state, configFileName, status); } } // src/compiler/executeCommandLine.ts function countLines(program) { const counts2 = getCountsMap(); forEach(program.getSourceFiles(), (file) => { const key = getCountKey(program, file); const lineCount = getLineStarts(file).length; counts2.set(key, counts2.get(key) + lineCount); }); return counts2; } function getCountsMap() { const counts2 = /* @__PURE__ */ new Map(); counts2.set("Library", 0); counts2.set("Definitions", 0); counts2.set("TypeScript", 0); counts2.set("JavaScript", 0); counts2.set("JSON", 0); counts2.set("Other", 0); return counts2; } function getCountKey(program, file) { if (program.isSourceFileDefaultLibrary(file)) { return "Library"; } else if (file.isDeclarationFile) { return "Definitions"; } const path = file.path; if (fileExtensionIsOneOf(path, supportedTSExtensionsFlat)) { return "TypeScript"; } else if (fileExtensionIsOneOf(path, supportedJSExtensionsFlat)) { return "JavaScript"; } else if (fileExtensionIs(path, ".json" /* Json */)) { return "JSON"; } else { return "Other"; } } function updateReportDiagnostic(sys2, existing, options) { return shouldBePretty(sys2, options) ? createDiagnosticReporter( sys2, /*pretty*/ true ) : existing; } function defaultIsPretty(sys2) { return !!sys2.writeOutputIsTTY && sys2.writeOutputIsTTY() && !sys2.getEnvironmentVariable("NO_COLOR"); } function shouldBePretty(sys2, options) { if (!options || typeof options.pretty === "undefined") { return defaultIsPretty(sys2); } return options.pretty; } function getOptionsForHelp(commandLine) { return !!commandLine.options.all ? toSorted(optionDeclarations.concat(tscBuildOption), (a, b) => compareStringsCaseInsensitive(a.name, b.name)) : filter(optionDeclarations.concat(tscBuildOption), (v) => !!v.showInSimplifiedHelpView); } function printVersion(sys2) { sys2.write(getDiagnosticText(Diagnostics.Version_0, version) + sys2.newLine); } function createColors(sys2) { const showColors = defaultIsPretty(sys2); if (!showColors) { return { bold: (str) => str, blue: (str) => str, blueBackground: (str) => str, brightWhite: (str) => str }; } function bold(str) { return `\x1B[1m${str}\x1B[22m`; } const isWindows = sys2.getEnvironmentVariable("OS") && sys2.getEnvironmentVariable("OS").toLowerCase().includes("windows"); const isWindowsTerminal = sys2.getEnvironmentVariable("WT_SESSION"); const isVSCode = sys2.getEnvironmentVariable("TERM_PROGRAM") && sys2.getEnvironmentVariable("TERM_PROGRAM") === "vscode"; function blue(str) { if (isWindows && !isWindowsTerminal && !isVSCode) { return brightWhite(str); } return `\x1B[94m${str}\x1B[39m`; } const supportsRicherColors = sys2.getEnvironmentVariable("COLORTERM") === "truecolor" || sys2.getEnvironmentVariable("TERM") === "xterm-256color"; function blueBackground(str) { if (supportsRicherColors) { return `\x1B[48;5;68m${str}\x1B[39;49m`; } else { return `\x1B[44m${str}\x1B[39;49m`; } } function brightWhite(str) { return `\x1B[97m${str}\x1B[39m`; } return { bold, blue, brightWhite, blueBackground }; } function getDisplayNameTextOfOption(option) { return `--${option.name}${option.shortName ? `, -${option.shortName}` : ""}`; } function generateOptionOutput(sys2, option, rightAlignOfLeft, leftAlignOfRight) { var _a; const text = []; const colors = createColors(sys2); const name = getDisplayNameTextOfOption(option); const valueCandidates = getValueCandidate(option); const defaultValueDescription = typeof option.defaultValueDescription === "object" ? getDiagnosticText(option.defaultValueDescription) : formatDefaultValue( option.defaultValueDescription, option.type === "list" || option.type === "listOrElement" ? option.element.type : option.type ); const terminalWidth = ((_a = sys2.getWidthOfTerminal) == null ? void 0 : _a.call(sys2)) ?? 0; if (terminalWidth >= 80) { let description = ""; if (option.description) { description = getDiagnosticText(option.description); } text.push(...getPrettyOutput( name, description, rightAlignOfLeft, leftAlignOfRight, terminalWidth, /*colorLeft*/ true ), sys2.newLine); if (showAdditionalInfoOutput(valueCandidates, option)) { if (valueCandidates) { text.push(...getPrettyOutput( valueCandidates.valueType, valueCandidates.possibleValues, rightAlignOfLeft, leftAlignOfRight, terminalWidth, /*colorLeft*/ false ), sys2.newLine); } if (defaultValueDescription) { text.push(...getPrettyOutput( getDiagnosticText(Diagnostics.default_Colon), defaultValueDescription, rightAlignOfLeft, leftAlignOfRight, terminalWidth, /*colorLeft*/ false ), sys2.newLine); } } text.push(sys2.newLine); } else { text.push(colors.blue(name), sys2.newLine); if (option.description) { const description = getDiagnosticText(option.description); text.push(description); } text.push(sys2.newLine); if (showAdditionalInfoOutput(valueCandidates, option)) { if (valueCandidates) { text.push(`${valueCandidates.valueType} ${valueCandidates.possibleValues}`); } if (defaultValueDescription) { if (valueCandidates) text.push(sys2.newLine); const diagType = getDiagnosticText(Diagnostics.default_Colon); text.push(`${diagType} ${defaultValueDescription}`); } text.push(sys2.newLine); } text.push(sys2.newLine); } return text; function formatDefaultValue(defaultValue, type) { return defaultValue !== void 0 && typeof type === "object" ? arrayFrom(type.entries()).filter(([, value]) => value === defaultValue).map(([name2]) => name2).join("/") : String(defaultValue); } function showAdditionalInfoOutput(valueCandidates2, option2) { const ignoreValues = ["string"]; const ignoredDescriptions = [void 0, "false", "n/a"]; const defaultValueDescription2 = option2.defaultValueDescription; if (option2.category === Diagnostics.Command_line_Options) return false; if (contains(ignoreValues, valueCandidates2 == null ? void 0 : valueCandidates2.possibleValues) && contains(ignoredDescriptions, defaultValueDescription2)) { return false; } return true; } function getPrettyOutput(left, right, rightAlignOfLeft2, leftAlignOfRight2, terminalWidth2, colorLeft) { const res = []; let isFirstLine = true; let remainRight = right; const rightCharacterNumber = terminalWidth2 - leftAlignOfRight2; while (remainRight.length > 0) { let curLeft = ""; if (isFirstLine) { curLeft = left.padStart(rightAlignOfLeft2); curLeft = curLeft.padEnd(leftAlignOfRight2); curLeft = colorLeft ? colors.blue(curLeft) : curLeft; } else { curLeft = "".padStart(leftAlignOfRight2); } const curRight = remainRight.substr(0, rightCharacterNumber); remainRight = remainRight.slice(rightCharacterNumber); res.push(`${curLeft}${curRight}`); isFirstLine = false; } return res; } function getValueCandidate(option2) { if (option2.type === "object") { return void 0; } return { valueType: getValueType(option2), possibleValues: getPossibleValues(option2) }; function getValueType(option3) { Debug.assert(option3.type !== "listOrElement"); switch (option3.type) { case "string": case "number": case "boolean": return getDiagnosticText(Diagnostics.type_Colon); case "list": return getDiagnosticText(Diagnostics.one_or_more_Colon); default: return getDiagnosticText(Diagnostics.one_of_Colon); } } function getPossibleValues(option3) { let possibleValues; switch (option3.type) { case "string": case "number": case "boolean": possibleValues = option3.type; break; case "list": case "listOrElement": possibleValues = getPossibleValues(option3.element); break; case "object": possibleValues = ""; break; default: const inverted = {}; option3.type.forEach((value, name2) => { var _a2; if (!((_a2 = option3.deprecatedKeys) == null ? void 0 : _a2.has(name2))) { (inverted[value] || (inverted[value] = [])).push(name2); } }); return Object.entries(inverted).map(([, synonyms]) => synonyms.join("/")).join(", "); } return possibleValues; } } } function generateGroupOptionOutput(sys2, optionsList) { let maxLength = 0; for (const option of optionsList) { const curLength = getDisplayNameTextOfOption(option).length; maxLength = maxLength > curLength ? maxLength : curLength; } const rightAlignOfLeftPart = maxLength + 2; const leftAlignOfRightPart = rightAlignOfLeftPart + 2; let lines = []; for (const option of optionsList) { const tmp = generateOptionOutput(sys2, option, rightAlignOfLeftPart, leftAlignOfRightPart); lines = [...lines, ...tmp]; } if (lines[lines.length - 2] !== sys2.newLine) { lines.push(sys2.newLine); } return lines; } function generateSectionOptionsOutput(sys2, sectionName, options, subCategory, beforeOptionsDescription, afterOptionsDescription) { let res = []; res.push(createColors(sys2).bold(sectionName) + sys2.newLine + sys2.newLine); if (beforeOptionsDescription) { res.push(beforeOptionsDescription + sys2.newLine + sys2.newLine); } if (!subCategory) { res = [...res, ...generateGroupOptionOutput(sys2, options)]; if (afterOptionsDescription) { res.push(afterOptionsDescription + sys2.newLine + sys2.newLine); } return res; } const categoryMap = /* @__PURE__ */ new Map(); for (const option of options) { if (!option.category) { continue; } const curCategory = getDiagnosticText(option.category); const optionsOfCurCategory = categoryMap.get(curCategory) ?? []; optionsOfCurCategory.push(option); categoryMap.set(curCategory, optionsOfCurCategory); } categoryMap.forEach((value, key) => { res.push(`### ${key}${sys2.newLine}${sys2.newLine}`); res = [...res, ...generateGroupOptionOutput(sys2, value)]; }); if (afterOptionsDescription) { res.push(afterOptionsDescription + sys2.newLine + sys2.newLine); } return res; } function printEasyHelp(sys2, simpleOptions) { const colors = createColors(sys2); let output = [...getHeader(sys2, `${getDiagnosticText(Diagnostics.tsc_Colon_The_TypeScript_Compiler)} - ${getDiagnosticText(Diagnostics.Version_0, version)}`)]; output.push(colors.bold(getDiagnosticText(Diagnostics.COMMON_COMMANDS)) + sys2.newLine + sys2.newLine); example("tsc", Diagnostics.Compiles_the_current_project_tsconfig_json_in_the_working_directory); example("tsc app.ts util.ts", Diagnostics.Ignoring_tsconfig_json_compiles_the_specified_files_with_default_compiler_options); example("tsc -b", Diagnostics.Build_a_composite_project_in_the_working_directory); example("tsc --init", Diagnostics.Creates_a_tsconfig_json_with_the_recommended_settings_in_the_working_directory); example("tsc -p ./path/to/tsconfig.json", Diagnostics.Compiles_the_TypeScript_project_located_at_the_specified_path); example("tsc --help --all", Diagnostics.An_expanded_version_of_this_information_showing_all_possible_compiler_options); example(["tsc --noEmit", "tsc --target esnext"], Diagnostics.Compiles_the_current_project_with_additional_settings); const cliCommands = simpleOptions.filter((opt) => opt.isCommandLineOnly || opt.category === Diagnostics.Command_line_Options); const configOpts = simpleOptions.filter((opt) => !contains(cliCommands, opt)); output = [ ...output, ...generateSectionOptionsOutput( sys2, getDiagnosticText(Diagnostics.COMMAND_LINE_FLAGS), cliCommands, /*subCategory*/ false, /*beforeOptionsDescription*/ void 0, /*afterOptionsDescription*/ void 0 ), ...generateSectionOptionsOutput( sys2, getDiagnosticText(Diagnostics.COMMON_COMPILER_OPTIONS), configOpts, /*subCategory*/ false, /*beforeOptionsDescription*/ void 0, formatMessage(Diagnostics.You_can_learn_about_all_of_the_compiler_options_at_0, "https://aka.ms/tsc") ) ]; for (const line of output) { sys2.write(line); } function example(ex, desc) { const examples = typeof ex === "string" ? [ex] : ex; for (const example2 of examples) { output.push(" " + colors.blue(example2) + sys2.newLine); } output.push(" " + getDiagnosticText(desc) + sys2.newLine + sys2.newLine); } } function printAllHelp(sys2, compilerOptions, buildOptions, watchOptions) { let output = [...getHeader(sys2, `${getDiagnosticText(Diagnostics.tsc_Colon_The_TypeScript_Compiler)} - ${getDiagnosticText(Diagnostics.Version_0, version)}`)]; output = [...output, ...generateSectionOptionsOutput( sys2, getDiagnosticText(Diagnostics.ALL_COMPILER_OPTIONS), compilerOptions, /*subCategory*/ true, /*beforeOptionsDescription*/ void 0, formatMessage(Diagnostics.You_can_learn_about_all_of_the_compiler_options_at_0, "https://aka.ms/tsc") )]; output = [...output, ...generateSectionOptionsOutput( sys2, getDiagnosticText(Diagnostics.WATCH_OPTIONS), watchOptions, /*subCategory*/ false, getDiagnosticText(Diagnostics.Including_watch_w_will_start_watching_the_current_project_for_the_file_changes_Once_set_you_can_config_watch_mode_with_Colon) )]; output = [...output, ...generateSectionOptionsOutput( sys2, getDiagnosticText(Diagnostics.BUILD_OPTIONS), filter(buildOptions, (option) => option !== tscBuildOption), /*subCategory*/ false, formatMessage(Diagnostics.Using_build_b_will_make_tsc_behave_more_like_a_build_orchestrator_than_a_compiler_This_is_used_to_trigger_building_composite_projects_which_you_can_learn_more_about_at_0, "https://aka.ms/tsc-composite-builds") )]; for (const line of output) { sys2.write(line); } } function printBuildHelp(sys2, buildOptions) { let output = [...getHeader(sys2, `${getDiagnosticText(Diagnostics.tsc_Colon_The_TypeScript_Compiler)} - ${getDiagnosticText(Diagnostics.Version_0, version)}`)]; output = [...output, ...generateSectionOptionsOutput( sys2, getDiagnosticText(Diagnostics.BUILD_OPTIONS), filter(buildOptions, (option) => option !== tscBuildOption), /*subCategory*/ false, formatMessage(Diagnostics.Using_build_b_will_make_tsc_behave_more_like_a_build_orchestrator_than_a_compiler_This_is_used_to_trigger_building_composite_projects_which_you_can_learn_more_about_at_0, "https://aka.ms/tsc-composite-builds") )]; for (const line of output) { sys2.write(line); } } function getHeader(sys2, message) { var _a; const colors = createColors(sys2); const header = []; const terminalWidth = ((_a = sys2.getWidthOfTerminal) == null ? void 0 : _a.call(sys2)) ?? 0; const tsIconLength = 5; const tsIconFirstLine = colors.blueBackground("".padStart(tsIconLength)); const tsIconSecondLine = colors.blueBackground(colors.brightWhite("TS ".padStart(tsIconLength))); if (terminalWidth >= message.length + tsIconLength) { const rightAlign = terminalWidth > 120 ? 120 : terminalWidth; const leftAlign = rightAlign - tsIconLength; header.push(message.padEnd(leftAlign) + tsIconFirstLine + sys2.newLine); header.push("".padStart(leftAlign) + tsIconSecondLine + sys2.newLine); } else { header.push(message + sys2.newLine); header.push(sys2.newLine); } return header; } function printHelp(sys2, commandLine) { if (!commandLine.options.all) { printEasyHelp(sys2, getOptionsForHelp(commandLine)); } else { printAllHelp(sys2, getOptionsForHelp(commandLine), optionsForBuild, optionsForWatch); } } function executeCommandLineWorker(sys2, cb, commandLine) { let reportDiagnostic = createDiagnosticReporter(sys2); let configFileName; if (commandLine.options.locale) { validateLocaleAndSetLanguage(commandLine.options.locale, sys2, commandLine.errors); } if (commandLine.errors.length > 0) { commandLine.errors.forEach(reportDiagnostic); return sys2.exit(1 /* DiagnosticsPresent_OutputsSkipped */); } if (commandLine.options.init) { writeConfigFile(sys2, reportDiagnostic, commandLine.options); return sys2.exit(0 /* Success */); } if (commandLine.options.version) { printVersion(sys2); return sys2.exit(0 /* Success */); } if (commandLine.options.help || commandLine.options.all) { printHelp(sys2, commandLine); return sys2.exit(0 /* Success */); } if (commandLine.options.watch && commandLine.options.listFilesOnly) { reportDiagnostic(createCompilerDiagnostic(Diagnostics.Options_0_and_1_cannot_be_combined, "watch", "listFilesOnly")); return sys2.exit(1 /* DiagnosticsPresent_OutputsSkipped */); } if (commandLine.options.project) { if (commandLine.fileNames.length !== 0) { reportDiagnostic(createCompilerDiagnostic(Diagnostics.Option_project_cannot_be_mixed_with_source_files_on_a_command_line)); return sys2.exit(1 /* DiagnosticsPresent_OutputsSkipped */); } const fileOrDirectory = normalizePath(commandLine.options.project); if (!fileOrDirectory || sys2.directoryExists(fileOrDirectory)) { configFileName = combinePaths(fileOrDirectory, "tsconfig.json"); if (!sys2.fileExists(configFileName)) { reportDiagnostic(createCompilerDiagnostic(Diagnostics.Cannot_find_a_tsconfig_json_file_at_the_specified_directory_Colon_0, commandLine.options.project)); return sys2.exit(1 /* DiagnosticsPresent_OutputsSkipped */); } } else { configFileName = fileOrDirectory; if (!sys2.fileExists(configFileName)) { reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_specified_path_does_not_exist_Colon_0, commandLine.options.project)); return sys2.exit(1 /* DiagnosticsPresent_OutputsSkipped */); } } } else if (commandLine.fileNames.length === 0) { const searchPath = normalizePath(sys2.getCurrentDirectory()); configFileName = findConfigFile(searchPath, (fileName) => sys2.fileExists(fileName)); } if (commandLine.fileNames.length === 0 && !configFileName) { if (commandLine.options.showConfig) { reportDiagnostic(createCompilerDiagnostic(Diagnostics.Cannot_find_a_tsconfig_json_file_at_the_current_directory_Colon_0, normalizePath(sys2.getCurrentDirectory()))); } else { printVersion(sys2); printHelp(sys2, commandLine); } return sys2.exit(1 /* DiagnosticsPresent_OutputsSkipped */); } const currentDirectory = sys2.getCurrentDirectory(); const commandLineOptions = convertToOptionsWithAbsolutePaths( commandLine.options, (fileName) => getNormalizedAbsolutePath(fileName, currentDirectory) ); if (configFileName) { const extendedConfigCache = /* @__PURE__ */ new Map(); const configParseResult = parseConfigFileWithSystem(configFileName, commandLineOptions, extendedConfigCache, commandLine.watchOptions, sys2, reportDiagnostic); if (commandLineOptions.showConfig) { if (configParseResult.errors.length !== 0) { reportDiagnostic = updateReportDiagnostic( sys2, reportDiagnostic, configParseResult.options ); configParseResult.errors.forEach(reportDiagnostic); return sys2.exit(1 /* DiagnosticsPresent_OutputsSkipped */); } sys2.write(JSON.stringify(convertToTSConfig(configParseResult, configFileName, sys2), null, 4) + sys2.newLine); return sys2.exit(0 /* Success */); } reportDiagnostic = updateReportDiagnostic( sys2, reportDiagnostic, configParseResult.options ); if (isWatchSet(configParseResult.options)) { if (reportWatchModeWithoutSysSupport(sys2, reportDiagnostic)) return; return createWatchOfConfigFile( sys2, cb, reportDiagnostic, configParseResult, commandLineOptions, commandLine.watchOptions, extendedConfigCache ); } else if (isIncrementalCompilation(configParseResult.options)) { performIncrementalCompilation2( sys2, cb, reportDiagnostic, configParseResult ); } else { performCompilation( sys2, cb, reportDiagnostic, configParseResult ); } } else { if (commandLineOptions.showConfig) { sys2.write(JSON.stringify(convertToTSConfig(commandLine, combinePaths(currentDirectory, "tsconfig.json"), sys2), null, 4) + sys2.newLine); return sys2.exit(0 /* Success */); } reportDiagnostic = updateReportDiagnostic( sys2, reportDiagnostic, commandLineOptions ); if (isWatchSet(commandLineOptions)) { if (reportWatchModeWithoutSysSupport(sys2, reportDiagnostic)) return; return createWatchOfFilesAndCompilerOptions( sys2, cb, reportDiagnostic, commandLine.fileNames, commandLineOptions, commandLine.watchOptions ); } else if (isIncrementalCompilation(commandLineOptions)) { performIncrementalCompilation2( sys2, cb, reportDiagnostic, { ...commandLine, options: commandLineOptions } ); } else { performCompilation( sys2, cb, reportDiagnostic, { ...commandLine, options: commandLineOptions } ); } } } function isBuildCommand(commandLineArgs) { if (commandLineArgs.length > 0 && commandLineArgs[0].charCodeAt(0) === 45 /* minus */) { const firstOption = commandLineArgs[0].slice(commandLineArgs[0].charCodeAt(1) === 45 /* minus */ ? 2 : 1).toLowerCase(); return firstOption === tscBuildOption.name || firstOption === tscBuildOption.shortName; } return false; } function executeCommandLine(system, cb, commandLineArgs) { if (isBuildCommand(commandLineArgs)) { const { buildOptions, watchOptions, projects, errors } = parseBuildCommand(commandLineArgs); if (buildOptions.generateCpuProfile && system.enableCPUProfiler) { system.enableCPUProfiler(buildOptions.generateCpuProfile, () => performBuild( system, cb, buildOptions, watchOptions, projects, errors )); } else { return performBuild( system, cb, buildOptions, watchOptions, projects, errors ); } } const commandLine = parseCommandLine(commandLineArgs, (path) => system.readFile(path)); if (commandLine.options.generateCpuProfile && system.enableCPUProfiler) { system.enableCPUProfiler(commandLine.options.generateCpuProfile, () => executeCommandLineWorker( system, cb, commandLine )); } else { return executeCommandLineWorker(system, cb, commandLine); } } function reportWatchModeWithoutSysSupport(sys2, reportDiagnostic) { if (!sys2.watchFile || !sys2.watchDirectory) { reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_current_host_does_not_support_the_0_option, "--watch")); sys2.exit(1 /* DiagnosticsPresent_OutputsSkipped */); return true; } return false; } var defaultJSDocParsingMode = 2 /* ParseForTypeErrors */; function performBuild(sys2, cb, buildOptions, watchOptions, projects, errors) { const reportDiagnostic = updateReportDiagnostic( sys2, createDiagnosticReporter(sys2), buildOptions ); if (buildOptions.locale) { validateLocaleAndSetLanguage(buildOptions.locale, sys2, errors); } if (errors.length > 0) { errors.forEach(reportDiagnostic); return sys2.exit(1 /* DiagnosticsPresent_OutputsSkipped */); } if (buildOptions.help) { printVersion(sys2); printBuildHelp(sys2, buildOpts); return sys2.exit(0 /* Success */); } if (projects.length === 0) { printVersion(sys2); printBuildHelp(sys2, buildOpts); return sys2.exit(0 /* Success */); } if (!sys2.getModifiedTime || !sys2.setModifiedTime || buildOptions.clean && !sys2.deleteFile) { reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_current_host_does_not_support_the_0_option, "--build")); return sys2.exit(1 /* DiagnosticsPresent_OutputsSkipped */); } if (buildOptions.watch) { if (reportWatchModeWithoutSysSupport(sys2, reportDiagnostic)) return; const buildHost2 = createSolutionBuilderWithWatchHost( sys2, /*createProgram*/ void 0, reportDiagnostic, createBuilderStatusReporter(sys2, shouldBePretty(sys2, buildOptions)), createWatchStatusReporter2(sys2, buildOptions) ); buildHost2.jsDocParsingMode = defaultJSDocParsingMode; const solutionPerformance2 = enableSolutionPerformance(sys2, buildOptions); updateSolutionBuilderHost(sys2, cb, buildHost2, solutionPerformance2); const onWatchStatusChange = buildHost2.onWatchStatusChange; let reportBuildStatistics = false; buildHost2.onWatchStatusChange = (d, newLine, options, errorCount) => { onWatchStatusChange == null ? void 0 : onWatchStatusChange(d, newLine, options, errorCount); if (reportBuildStatistics && (d.code === Diagnostics.Found_0_errors_Watching_for_file_changes.code || d.code === Diagnostics.Found_1_error_Watching_for_file_changes.code)) { reportSolutionBuilderTimes(builder2, solutionPerformance2); } }; const builder2 = createSolutionBuilderWithWatch(buildHost2, projects, buildOptions, watchOptions); builder2.build(); reportSolutionBuilderTimes(builder2, solutionPerformance2); reportBuildStatistics = true; return builder2; } const buildHost = createSolutionBuilderHost( sys2, /*createProgram*/ void 0, reportDiagnostic, createBuilderStatusReporter(sys2, shouldBePretty(sys2, buildOptions)), createReportErrorSummary(sys2, buildOptions) ); buildHost.jsDocParsingMode = defaultJSDocParsingMode; const solutionPerformance = enableSolutionPerformance(sys2, buildOptions); updateSolutionBuilderHost(sys2, cb, buildHost, solutionPerformance); const builder = createSolutionBuilder(buildHost, projects, buildOptions); const exitStatus = buildOptions.clean ? builder.clean() : builder.build(); reportSolutionBuilderTimes(builder, solutionPerformance); dumpTracingLegend(); return sys2.exit(exitStatus); } function createReportErrorSummary(sys2, options) { return shouldBePretty(sys2, options) ? (errorCount, filesInError) => sys2.write(getErrorSummaryText(errorCount, filesInError, sys2.newLine, sys2)) : void 0; } function performCompilation(sys2, cb, reportDiagnostic, config) { const { fileNames, options, projectReferences } = config; const host = createCompilerHostWorker( options, /*setParentNodes*/ void 0, sys2 ); host.jsDocParsingMode = defaultJSDocParsingMode; const currentDirectory = host.getCurrentDirectory(); const getCanonicalFileName = createGetCanonicalFileName(host.useCaseSensitiveFileNames()); changeCompilerHostLikeToUseCache(host, (fileName) => toPath(fileName, currentDirectory, getCanonicalFileName)); enableStatisticsAndTracing( sys2, options, /*isBuildMode*/ false ); const programOptions = { rootNames: fileNames, options, projectReferences, host, configFileParsingDiagnostics: getConfigFileParsingDiagnostics(config) }; const program = createProgram(programOptions); const exitStatus = emitFilesAndReportErrorsAndGetExitStatus( program, reportDiagnostic, (s) => sys2.write(s + sys2.newLine), createReportErrorSummary(sys2, options) ); reportStatistics( sys2, program, /*solutionPerformance*/ void 0 ); cb(program); return sys2.exit(exitStatus); } function performIncrementalCompilation2(sys2, cb, reportDiagnostic, config) { const { options, fileNames, projectReferences } = config; enableStatisticsAndTracing( sys2, options, /*isBuildMode*/ false ); const host = createIncrementalCompilerHost(options, sys2); host.jsDocParsingMode = defaultJSDocParsingMode; const exitStatus = performIncrementalCompilation({ host, system: sys2, rootNames: fileNames, options, configFileParsingDiagnostics: getConfigFileParsingDiagnostics(config), projectReferences, reportDiagnostic, reportErrorSummary: createReportErrorSummary(sys2, options), afterProgramEmitAndDiagnostics: (builderProgram) => { reportStatistics( sys2, builderProgram.getProgram(), /*solutionPerformance*/ void 0 ); cb(builderProgram); } }); return sys2.exit(exitStatus); } function updateSolutionBuilderHost(sys2, cb, buildHost, solutionPerformance) { updateCreateProgram( sys2, buildHost, /*isBuildMode*/ true ); buildHost.afterProgramEmitAndDiagnostics = (program) => { reportStatistics(sys2, program.getProgram(), solutionPerformance); cb(program); }; } function updateCreateProgram(sys2, host, isBuildMode) { const compileUsingBuilder = host.createProgram; host.createProgram = (rootNames, options, host2, oldProgram, configFileParsingDiagnostics, projectReferences) => { Debug.assert(rootNames !== void 0 || options === void 0 && !!oldProgram); if (options !== void 0) { enableStatisticsAndTracing(sys2, options, isBuildMode); } return compileUsingBuilder(rootNames, options, host2, oldProgram, configFileParsingDiagnostics, projectReferences); }; } function updateWatchCompilationHost(sys2, cb, watchCompilerHost) { watchCompilerHost.jsDocParsingMode = defaultJSDocParsingMode; updateCreateProgram( sys2, watchCompilerHost, /*isBuildMode*/ false ); const emitFilesUsingBuilder = watchCompilerHost.afterProgramCreate; watchCompilerHost.afterProgramCreate = (builderProgram) => { emitFilesUsingBuilder(builderProgram); reportStatistics( sys2, builderProgram.getProgram(), /*solutionPerformance*/ void 0 ); cb(builderProgram); }; } function createWatchStatusReporter2(sys2, options) { return createWatchStatusReporter(sys2, shouldBePretty(sys2, options)); } function createWatchOfConfigFile(system, cb, reportDiagnostic, configParseResult, optionsToExtend, watchOptionsToExtend, extendedConfigCache) { const watchCompilerHost = createWatchCompilerHostOfConfigFile({ configFileName: configParseResult.options.configFilePath, optionsToExtend, watchOptionsToExtend, system, reportDiagnostic, reportWatchStatus: createWatchStatusReporter2(system, configParseResult.options) }); updateWatchCompilationHost(system, cb, watchCompilerHost); watchCompilerHost.configFileParsingResult = configParseResult; watchCompilerHost.extendedConfigCache = extendedConfigCache; return createWatchProgram(watchCompilerHost); } function createWatchOfFilesAndCompilerOptions(system, cb, reportDiagnostic, rootFiles, options, watchOptions) { const watchCompilerHost = createWatchCompilerHostOfFilesAndCompilerOptions({ rootFiles, options, watchOptions, system, reportDiagnostic, reportWatchStatus: createWatchStatusReporter2(system, options) }); updateWatchCompilationHost(system, cb, watchCompilerHost); return createWatchProgram(watchCompilerHost); } function enableSolutionPerformance(system, options) { if (system === sys && options.extendedDiagnostics) { enable(); return createSolutionPerfomrance(); } } function createSolutionPerfomrance() { let statistics; return { addAggregateStatistic, forEachAggregateStatistics: forEachAggreateStatistics, clear: clear2 }; function addAggregateStatistic(s) { const existing = statistics == null ? void 0 : statistics.get(s.name); if (existing) { if (existing.type === 2 /* memory */) existing.value = Math.max(existing.value, s.value); else existing.value += s.value; } else { (statistics ?? (statistics = /* @__PURE__ */ new Map())).set(s.name, s); } } function forEachAggreateStatistics(cb) { statistics == null ? void 0 : statistics.forEach(cb); } function clear2() { statistics = void 0; } } function reportSolutionBuilderTimes(builder, solutionPerformance) { if (!solutionPerformance) return; if (!isEnabled()) { sys.write(Diagnostics.Performance_timings_for_diagnostics_or_extendedDiagnostics_are_not_available_in_this_session_A_native_implementation_of_the_Web_Performance_API_could_not_be_found.message + "\n"); return; } const statistics = []; statistics.push( { name: "Projects in scope", value: getBuildOrderFromAnyBuildOrder(builder.getBuildOrder()).length, type: 1 /* count */ } ); reportSolutionBuilderCountStatistic("SolutionBuilder::Projects built"); reportSolutionBuilderCountStatistic("SolutionBuilder::Timestamps only updates"); reportSolutionBuilderCountStatistic("SolutionBuilder::Bundles updated"); solutionPerformance.forEachAggregateStatistics((s) => { s.name = `Aggregate ${s.name}`; statistics.push(s); }); forEachMeasure((name, duration) => { if (isSolutionMarkOrMeasure(name)) statistics.push({ name: `${getNameFromSolutionBuilderMarkOrMeasure(name)} time`, value: duration, type: 0 /* time */ }); }); disable(); enable(); solutionPerformance.clear(); reportAllStatistics(sys, statistics); function reportSolutionBuilderCountStatistic(name) { const value = getCount(name); if (value) { statistics.push({ name: getNameFromSolutionBuilderMarkOrMeasure(name), value, type: 1 /* count */ }); } } function getNameFromSolutionBuilderMarkOrMeasure(name) { return name.replace("SolutionBuilder::", ""); } } function canReportDiagnostics(system, compilerOptions) { return system === sys && (compilerOptions.diagnostics || compilerOptions.extendedDiagnostics); } function canTrace(system, compilerOptions) { return system === sys && compilerOptions.generateTrace; } function enableStatisticsAndTracing(system, compilerOptions, isBuildMode) { if (canReportDiagnostics(system, compilerOptions)) { enable(system); } if (canTrace(system, compilerOptions)) { startTracing(isBuildMode ? "build" : "project", compilerOptions.generateTrace, compilerOptions.configFilePath); } } function isSolutionMarkOrMeasure(name) { return startsWith(name, "SolutionBuilder::"); } function reportStatistics(sys2, program, solutionPerformance) { var _a; const compilerOptions = program.getCompilerOptions(); if (canTrace(sys2, compilerOptions)) { (_a = tracing) == null ? void 0 : _a.stopTracing(); } let statistics; if (canReportDiagnostics(sys2, compilerOptions)) { statistics = []; const memoryUsed = sys2.getMemoryUsage ? sys2.getMemoryUsage() : -1; reportCountStatistic("Files", program.getSourceFiles().length); const lineCounts = countLines(program); if (compilerOptions.extendedDiagnostics) { for (const [key, value] of lineCounts.entries()) { reportCountStatistic("Lines of " + key, value); } } else { reportCountStatistic("Lines", reduceLeftIterator(lineCounts.values(), (sum, count) => sum + count, 0)); } reportCountStatistic("Identifiers", program.getIdentifierCount()); reportCountStatistic("Symbols", program.getSymbolCount()); reportCountStatistic("Types", program.getTypeCount()); reportCountStatistic("Instantiations", program.getInstantiationCount()); if (memoryUsed >= 0) { reportStatisticalValue( { name: "Memory used", value: memoryUsed, type: 2 /* memory */ }, /*aggregate*/ true ); } const isPerformanceEnabled = isEnabled(); const programTime = isPerformanceEnabled ? getDuration("Program") : 0; const bindTime = isPerformanceEnabled ? getDuration("Bind") : 0; const checkTime = isPerformanceEnabled ? getDuration("Check") : 0; const emitTime = isPerformanceEnabled ? getDuration("Emit") : 0; if (compilerOptions.extendedDiagnostics) { const caches = program.getRelationCacheSizes(); reportCountStatistic("Assignability cache size", caches.assignable); reportCountStatistic("Identity cache size", caches.identity); reportCountStatistic("Subtype cache size", caches.subtype); reportCountStatistic("Strict subtype cache size", caches.strictSubtype); if (isPerformanceEnabled) { forEachMeasure((name, duration) => { if (!isSolutionMarkOrMeasure(name)) reportTimeStatistic( `${name} time`, duration, /*aggregate*/ true ); }); } } else if (isPerformanceEnabled) { reportTimeStatistic( "I/O read", getDuration("I/O Read"), /*aggregate*/ true ); reportTimeStatistic( "I/O write", getDuration("I/O Write"), /*aggregate*/ true ); reportTimeStatistic( "Parse time", programTime, /*aggregate*/ true ); reportTimeStatistic( "Bind time", bindTime, /*aggregate*/ true ); reportTimeStatistic( "Check time", checkTime, /*aggregate*/ true ); reportTimeStatistic( "Emit time", emitTime, /*aggregate*/ true ); } if (isPerformanceEnabled) { reportTimeStatistic( "Total time", programTime + bindTime + checkTime + emitTime, /*aggregate*/ false ); } reportAllStatistics(sys2, statistics); if (!isPerformanceEnabled) { sys2.write(Diagnostics.Performance_timings_for_diagnostics_or_extendedDiagnostics_are_not_available_in_this_session_A_native_implementation_of_the_Web_Performance_API_could_not_be_found.message + "\n"); } else { if (solutionPerformance) { forEachMeasure((name) => { if (!isSolutionMarkOrMeasure(name)) clearMeasures(name); }); forEachMark((name) => { if (!isSolutionMarkOrMeasure(name)) clearMarks(name); }); } else { disable(); } } } function reportStatisticalValue(s, aggregate) { statistics.push(s); if (aggregate) solutionPerformance == null ? void 0 : solutionPerformance.addAggregateStatistic(s); } function reportCountStatistic(name, count) { reportStatisticalValue( { name, value: count, type: 1 /* count */ }, /*aggregate*/ true ); } function reportTimeStatistic(name, time, aggregate) { reportStatisticalValue({ name, value: time, type: 0 /* time */ }, aggregate); } } function reportAllStatistics(sys2, statistics) { let nameSize = 0; let valueSize = 0; for (const s of statistics) { if (s.name.length > nameSize) { nameSize = s.name.length; } const value = statisticValue(s); if (value.length > valueSize) { valueSize = value.length; } } for (const s of statistics) { sys2.write(`${s.name}:`.padEnd(nameSize + 2) + statisticValue(s).toString().padStart(valueSize) + sys2.newLine); } } function statisticValue(s) { switch (s.type) { case 1 /* count */: return "" + s.value; case 0 /* time */: return (s.value / 1e3).toFixed(2) + "s"; case 2 /* memory */: return Math.round(s.value / 1e3) + "K"; default: Debug.assertNever(s.type); } } function writeConfigFile(sys2, reportDiagnostic, options) { const currentDirectory = sys2.getCurrentDirectory(); const file = normalizePath(combinePaths(currentDirectory, "tsconfig.json")); if (sys2.fileExists(file)) { reportDiagnostic(createCompilerDiagnostic(Diagnostics.A_tsconfig_json_file_is_already_defined_at_Colon_0, file)); } else { sys2.writeFile(file, generateTSConfig(options, sys2.newLine)); const output = [sys2.newLine, ...getHeader(sys2, "Created a new tsconfig.json")]; output.push(`You can learn more at https://aka.ms/tsconfig` + sys2.newLine); for (const line of output) { sys2.write(line); } } return; } // src/compiler/expressionToTypeNode.ts function syntacticResult(type, reportFallback = true) { return { type, reportFallback }; } var notImplemented2 = syntacticResult( /*type*/ void 0, /*reportFallback*/ false ); var alreadyReported = syntacticResult( /*type*/ void 0, /*reportFallback*/ false ); var failed = syntacticResult( /*type*/ void 0, /*reportFallback*/ true ); function createSyntacticTypeNodeBuilder(options, resolver) { const strictNullChecks = getStrictOptionValue(options, "strictNullChecks"); return { serializeTypeOfDeclaration, serializeReturnTypeForSignature, serializeTypeOfExpression, serializeTypeOfAccessor, tryReuseExistingTypeNode(context, existing) { if (!resolver.canReuseTypeNode(context, existing)) { return void 0; } return tryReuseExistingTypeNode(context, existing); } }; function reuseNode(context, node, range = node) { return node === void 0 ? void 0 : resolver.markNodeReuse(context, node.flags & 16 /* Synthesized */ ? node : factory.cloneNode(node), range ?? node); } function tryReuseExistingTypeNode(context, existing) { const { finalizeBoundary, startRecoveryScope, hadError, markError } = resolver.createRecoveryBoundary(context); const transformed = visitNode(existing, visitExistingNodeTreeSymbols, isTypeNode); if (!finalizeBoundary()) { return void 0; } context.approximateLength += existing.end - existing.pos; return transformed; function visitExistingNodeTreeSymbols(node) { if (hadError()) return node; const recover = startRecoveryScope(); const onExitNewScope = isNewScopeNode(node) ? resolver.enterNewScope(context, node) : void 0; const result = visitExistingNodeTreeSymbolsWorker(node); onExitNewScope == null ? void 0 : onExitNewScope(); if (hadError()) { if (isTypeNode(node) && !isTypePredicateNode(node)) { recover(); return resolver.serializeExistingTypeNode(context, node); } return node; } return result ? resolver.markNodeReuse(context, result, node) : void 0; } function tryVisitSimpleTypeNode(node) { const innerNode = skipTypeParentheses(node); switch (innerNode.kind) { case 184 /* TypeReference */: return tryVisitTypeReference(innerNode); case 187 /* TypeQuery */: return tryVisitTypeQuery(innerNode); case 200 /* IndexedAccessType */: return tryVisitIndexedAccess(innerNode); case 199 /* TypeOperator */: const typeOperatorNode = innerNode; if (typeOperatorNode.operator === 143 /* KeyOfKeyword */) { return tryVisitKeyOf(typeOperatorNode); } } return visitNode(node, visitExistingNodeTreeSymbols, isTypeNode); } function tryVisitIndexedAccess(node) { const resultObjectType = tryVisitSimpleTypeNode(node.objectType); if (resultObjectType === void 0) { return void 0; } return factory.updateIndexedAccessTypeNode(node, resultObjectType, visitNode(node.indexType, visitExistingNodeTreeSymbols, isTypeNode)); } function tryVisitKeyOf(node) { Debug.assertEqual(node.operator, 143 /* KeyOfKeyword */); const type = tryVisitSimpleTypeNode(node.type); if (type === void 0) { return void 0; } return factory.updateTypeOperatorNode(node, type); } function tryVisitTypeQuery(node) { const { introducesError, node: exprName } = resolver.trackExistingEntityName(context, node.exprName); if (!introducesError) { return factory.updateTypeQueryNode( node, exprName, visitNodes2(node.typeArguments, visitExistingNodeTreeSymbols, isTypeNode) ); } const serializedName = resolver.serializeTypeName( context, node.exprName, /*isTypeOf*/ true ); if (serializedName) { return resolver.markNodeReuse(context, serializedName, node.exprName); } } function tryVisitTypeReference(node) { if (resolver.canReuseTypeNode(context, node)) { const { introducesError, node: newName } = resolver.trackExistingEntityName(context, node.typeName); const typeArguments = visitNodes2(node.typeArguments, visitExistingNodeTreeSymbols, isTypeNode); if (!introducesError) { const updated = factory.updateTypeReferenceNode( node, newName, typeArguments ); return resolver.markNodeReuse(context, updated, node); } else { const serializedName = resolver.serializeTypeName( context, node.typeName, /*isTypeOf*/ false, typeArguments ); if (serializedName) { return resolver.markNodeReuse(context, serializedName, node.typeName); } } } } function visitExistingNodeTreeSymbolsWorker(node) { var _a; if (isJSDocTypeExpression(node)) { return visitNode(node.type, visitExistingNodeTreeSymbols, isTypeNode); } if (isJSDocAllType(node) || node.kind === 320 /* JSDocNamepathType */) { return factory.createKeywordTypeNode(133 /* AnyKeyword */); } if (isJSDocUnknownType(node)) { return factory.createKeywordTypeNode(159 /* UnknownKeyword */); } if (isJSDocNullableType(node)) { return factory.createUnionTypeNode([visitNode(node.type, visitExistingNodeTreeSymbols, isTypeNode), factory.createLiteralTypeNode(factory.createNull())]); } if (isJSDocOptionalType(node)) { return factory.createUnionTypeNode([visitNode(node.type, visitExistingNodeTreeSymbols, isTypeNode), factory.createKeywordTypeNode(157 /* UndefinedKeyword */)]); } if (isJSDocNonNullableType(node)) { return visitNode(node.type, visitExistingNodeTreeSymbols); } if (isJSDocVariadicType(node)) { return factory.createArrayTypeNode(visitNode(node.type, visitExistingNodeTreeSymbols, isTypeNode)); } if (isJSDocTypeLiteral(node)) { return factory.createTypeLiteralNode(map(node.jsDocPropertyTags, (t) => { const name = visitNode(isIdentifier(t.name) ? t.name : t.name.right, visitExistingNodeTreeSymbols, isIdentifier); const overrideTypeNode = resolver.getJsDocPropertyOverride(context, node, t); return factory.createPropertySignature( /*modifiers*/ void 0, name, t.isBracketed || t.typeExpression && isJSDocOptionalType(t.typeExpression.type) ? factory.createToken(58 /* QuestionToken */) : void 0, overrideTypeNode || t.typeExpression && visitNode(t.typeExpression.type, visitExistingNodeTreeSymbols, isTypeNode) || factory.createKeywordTypeNode(133 /* AnyKeyword */) ); })); } if (isTypeReferenceNode(node) && isIdentifier(node.typeName) && node.typeName.escapedText === "") { return setOriginalNode(factory.createKeywordTypeNode(133 /* AnyKeyword */), node); } if ((isExpressionWithTypeArguments(node) || isTypeReferenceNode(node)) && isJSDocIndexSignature(node)) { return factory.createTypeLiteralNode([factory.createIndexSignature( /*modifiers*/ void 0, [factory.createParameterDeclaration( /*modifiers*/ void 0, /*dotDotDotToken*/ void 0, "x", /*questionToken*/ void 0, visitNode(node.typeArguments[0], visitExistingNodeTreeSymbols, isTypeNode) )], visitNode(node.typeArguments[1], visitExistingNodeTreeSymbols, isTypeNode) )]); } if (isJSDocFunctionType(node)) { if (isJSDocConstructSignature(node)) { let newTypeNode; return factory.createConstructorTypeNode( /*modifiers*/ void 0, visitNodes2(node.typeParameters, visitExistingNodeTreeSymbols, isTypeParameterDeclaration), mapDefined(node.parameters, (p, i) => p.name && isIdentifier(p.name) && p.name.escapedText === "new" ? (newTypeNode = p.type, void 0) : factory.createParameterDeclaration( /*modifiers*/ void 0, getEffectiveDotDotDotForParameter(p), resolver.markNodeReuse(context, factory.createIdentifier(getNameForJSDocFunctionParameter(p, i)), p), factory.cloneNode(p.questionToken), visitNode(p.type, visitExistingNodeTreeSymbols, isTypeNode), /*initializer*/ void 0 )), visitNode(newTypeNode || node.type, visitExistingNodeTreeSymbols, isTypeNode) || factory.createKeywordTypeNode(133 /* AnyKeyword */) ); } else { return factory.createFunctionTypeNode( visitNodes2(node.typeParameters, visitExistingNodeTreeSymbols, isTypeParameterDeclaration), map(node.parameters, (p, i) => factory.createParameterDeclaration( /*modifiers*/ void 0, getEffectiveDotDotDotForParameter(p), resolver.markNodeReuse(context, factory.createIdentifier(getNameForJSDocFunctionParameter(p, i)), p), factory.cloneNode(p.questionToken), visitNode(p.type, visitExistingNodeTreeSymbols, isTypeNode), /*initializer*/ void 0 )), visitNode(node.type, visitExistingNodeTreeSymbols, isTypeNode) || factory.createKeywordTypeNode(133 /* AnyKeyword */) ); } } if (isThisTypeNode(node)) { if (resolver.canReuseTypeNode(context, node)) { return node; } markError(); return node; } if (isTypeParameterDeclaration(node)) { const { node: newName } = resolver.trackExistingEntityName(context, node.name); return factory.updateTypeParameterDeclaration( node, visitNodes2(node.modifiers, visitExistingNodeTreeSymbols, isModifier), // resolver.markNodeReuse(context, typeParameterToName(getDeclaredTypeOfSymbol(getSymbolOfDeclaration(node)), context), node), newName, visitNode(node.constraint, visitExistingNodeTreeSymbols, isTypeNode), visitNode(node.default, visitExistingNodeTreeSymbols, isTypeNode) ); } if (isIndexedAccessTypeNode(node)) { const result = tryVisitIndexedAccess(node); if (!result) { markError(); return node; } return result; } if (isTypeReferenceNode(node)) { const result = tryVisitTypeReference(node); if (result) { return result; } markError(); return node; } if (isLiteralImportTypeNode(node)) { if (((_a = node.attributes) == null ? void 0 : _a.token) === 132 /* AssertKeyword */) { markError(); return node; } if (!resolver.canReuseTypeNode(context, node)) { return resolver.serializeExistingTypeNode(context, node); } const specifier = rewriteModuleSpecifier2(node, node.argument.literal); const literal = specifier === node.argument.literal ? reuseNode(context, node.argument.literal) : specifier; return factory.updateImportTypeNode( node, literal === node.argument.literal ? reuseNode(context, node.argument) : factory.createLiteralTypeNode(literal), visitNode(node.attributes, visitExistingNodeTreeSymbols, isImportAttributes), visitNode(node.qualifier, visitExistingNodeTreeSymbols, isEntityName), visitNodes2(node.typeArguments, visitExistingNodeTreeSymbols, isTypeNode), node.isTypeOf ); } if (isNamedDeclaration(node) && node.name.kind === 168 /* ComputedPropertyName */ && !resolver.hasLateBindableName(node)) { if (!hasDynamicName(node)) { return visitEachChild2(node, visitExistingNodeTreeSymbols); } if (resolver.shouldRemoveDeclaration(context, node)) { return void 0; } } if (isFunctionLike(node) && !node.type || isPropertyDeclaration(node) && !node.type && !node.initializer || isPropertySignature(node) && !node.type && !node.initializer || isParameter(node) && !node.type && !node.initializer) { let visited = visitEachChild2(node, visitExistingNodeTreeSymbols); if (visited === node) { visited = resolver.markNodeReuse(context, factory.cloneNode(node), node); } visited.type = factory.createKeywordTypeNode(133 /* AnyKeyword */); if (isParameter(node)) { visited.modifiers = void 0; } return visited; } if (isTypeQueryNode(node)) { const result = tryVisitTypeQuery(node); if (!result) { markError(); return node; } return result; } if (isComputedPropertyName(node) && isEntityNameExpression(node.expression)) { const { node: result, introducesError } = resolver.trackExistingEntityName(context, node.expression); if (!introducesError) { return factory.updateComputedPropertyName(node, result); } else { const computedPropertyNameType = resolver.serializeTypeOfExpression(context, node.expression); let literal; if (isLiteralTypeNode(computedPropertyNameType)) { literal = computedPropertyNameType.literal; } else { const evaluated = resolver.evaluateEntityNameExpression(node.expression); const literalNode = typeof evaluated.value === "string" ? factory.createStringLiteral( evaluated.value, /*isSingleQuote*/ void 0 ) : typeof evaluated.value === "number" ? factory.createNumericLiteral( evaluated.value, /*numericLiteralFlags*/ 0 ) : void 0; if (!literalNode) { if (isImportTypeNode(computedPropertyNameType)) { resolver.trackComputedName(context, node.expression); } return node; } literal = literalNode; } if (literal.kind === 11 /* StringLiteral */ && isIdentifierText(literal.text, getEmitScriptTarget(options))) { return factory.createIdentifier(literal.text); } if (literal.kind === 9 /* NumericLiteral */ && !literal.text.startsWith("-")) { return literal; } return factory.updateComputedPropertyName(node, literal); } } if (isTypePredicateNode(node)) { let parameterName; if (isIdentifier(node.parameterName)) { const { node: result, introducesError } = resolver.trackExistingEntityName(context, node.parameterName); if (introducesError) markError(); parameterName = result; } else { parameterName = factory.cloneNode(node.parameterName); } return factory.updateTypePredicateNode(node, factory.cloneNode(node.assertsModifier), parameterName, visitNode(node.type, visitExistingNodeTreeSymbols, isTypeNode)); } if (isTupleTypeNode(node) || isTypeLiteralNode(node) || isMappedTypeNode(node)) { const visited = visitEachChild2(node, visitExistingNodeTreeSymbols); const clone = resolver.markNodeReuse(context, visited === node ? factory.cloneNode(node) : visited, node); const flags = getEmitFlags(clone); setEmitFlags(clone, flags | (context.flags & 1024 /* MultilineObjectLiterals */ && isTypeLiteralNode(node) ? 0 : 1 /* SingleLine */)); return clone; } if (isStringLiteral(node) && !!(context.flags & 268435456 /* UseSingleQuotesForStringLiteralType */) && !node.singleQuote) { const clone = factory.cloneNode(node); clone.singleQuote = true; return clone; } if (isConditionalTypeNode(node)) { const checkType = visitNode(node.checkType, visitExistingNodeTreeSymbols, isTypeNode); const disposeScope = resolver.enterNewScope(context, node); const extendType = visitNode(node.extendsType, visitExistingNodeTreeSymbols, isTypeNode); const trueType = visitNode(node.trueType, visitExistingNodeTreeSymbols, isTypeNode); disposeScope(); const falseType = visitNode(node.falseType, visitExistingNodeTreeSymbols, isTypeNode); return factory.updateConditionalTypeNode( node, checkType, extendType, trueType, falseType ); } if (isTypeOperatorNode(node)) { if (node.operator === 158 /* UniqueKeyword */ && node.type.kind === 155 /* SymbolKeyword */) { if (!resolver.canReuseTypeNode(context, node)) { markError(); return node; } } else if (node.operator === 143 /* KeyOfKeyword */) { const result = tryVisitKeyOf(node); if (!result) { markError(); return node; } return result; } } return visitEachChild2(node, visitExistingNodeTreeSymbols); function visitEachChild2(node2, visitor) { const nonlocalNode = !context.enclosingFile || context.enclosingFile !== getSourceFileOfNode(node2); return visitEachChild( node2, visitor, /*context*/ void 0, nonlocalNode ? visitNodesWithoutCopyingPositions : void 0 ); } function visitNodesWithoutCopyingPositions(nodes, visitor, test, start, count) { let result = visitNodes2(nodes, visitor, test, start, count); if (result) { if (result.pos !== -1 || result.end !== -1) { if (result === nodes) { result = factory.createNodeArray(nodes.slice(), nodes.hasTrailingComma); } setTextRangePosEnd(result, -1, -1); } } return result; } function getEffectiveDotDotDotForParameter(p) { return p.dotDotDotToken || (p.type && isJSDocVariadicType(p.type) ? factory.createToken(26 /* DotDotDotToken */) : void 0); } function getNameForJSDocFunctionParameter(p, index) { return p.name && isIdentifier(p.name) && p.name.escapedText === "this" ? "this" : getEffectiveDotDotDotForParameter(p) ? `args` : `arg${index}`; } function rewriteModuleSpecifier2(parent, lit) { const newName = resolver.getModuleSpecifierOverride(context, parent, lit); return newName ? setOriginalNode(factory.createStringLiteral(newName), lit) : lit; } } } function serializeExistingTypeNode(typeNode, context, addUndefined) { if (!typeNode) return void 0; let result; if ((!addUndefined || canAddUndefined(typeNode)) && resolver.canReuseTypeNode(context, typeNode)) { result = tryReuseExistingTypeNode(context, typeNode); if (result !== void 0) { result = addUndefinedIfNeeded( result, addUndefined, /*owner*/ void 0, context ); } } return result; } function serializeTypeAnnotationOfDeclaration(declaredType, context, node, symbol, requiresAddingUndefined, useFallback = requiresAddingUndefined !== void 0) { if (!declaredType) return void 0; if (!resolver.canReuseTypeNodeAnnotation(context, node, declaredType, symbol, requiresAddingUndefined)) { if (!requiresAddingUndefined || !resolver.canReuseTypeNodeAnnotation( context, node, declaredType, symbol, /*requiresAddingUndefined*/ false )) { return void 0; } } let result; if (!requiresAddingUndefined || canAddUndefined(declaredType)) { result = serializeExistingTypeNode(declaredType, context, requiresAddingUndefined); } if (result !== void 0 || !useFallback) { return result; } context.tracker.reportInferenceFallback(node); return resolver.serializeExistingTypeNode(context, declaredType, requiresAddingUndefined) ?? factory.createKeywordTypeNode(133 /* AnyKeyword */); } function serializeExistingTypeNodeWithFallback(typeNode, context, addUndefined, targetNode) { if (!typeNode) return void 0; const result = serializeExistingTypeNode(typeNode, context, addUndefined); if (result !== void 0) { return result; } context.tracker.reportInferenceFallback(targetNode ?? typeNode); return resolver.serializeExistingTypeNode(context, typeNode, addUndefined) ?? factory.createKeywordTypeNode(133 /* AnyKeyword */); } function serializeTypeOfAccessor(accessor, symbol, context) { return typeFromAccessor(accessor, symbol, context) ?? inferAccessorType(accessor, resolver.getAllAccessorDeclarations(accessor), context, symbol); } function serializeTypeOfExpression(expr, context, addUndefined, preserveLiterals) { const result = typeFromExpression( expr, context, /*isConstContext*/ false, addUndefined, preserveLiterals ); return result.type !== void 0 ? result.type : inferExpressionType(expr, context, result.reportFallback); } function serializeTypeOfDeclaration(node, symbol, context) { switch (node.kind) { case 170 /* Parameter */: case 342 /* JSDocParameterTag */: return typeFromParameter(node, symbol, context); case 261 /* VariableDeclaration */: return typeFromVariable(node, symbol, context); case 172 /* PropertySignature */: case 349 /* JSDocPropertyTag */: case 173 /* PropertyDeclaration */: return typeFromProperty(node, symbol, context); case 209 /* BindingElement */: return inferTypeOfDeclaration(node, symbol, context); case 278 /* ExportAssignment */: return serializeTypeOfExpression( node.expression, context, /*addUndefined*/ void 0, /*preserveLiterals*/ true ); case 212 /* PropertyAccessExpression */: case 213 /* ElementAccessExpression */: case 227 /* BinaryExpression */: return typeFromExpandoProperty(node, symbol, context); case 304 /* PropertyAssignment */: case 305 /* ShorthandPropertyAssignment */: return typeFromPropertyAssignment(node, symbol, context); default: Debug.assertNever(node, `Node needs to be an inferrable node, found ${Debug.formatSyntaxKind(node.kind)}`); } } function typeFromPropertyAssignment(node, symbol, context) { const typeAnnotation = getEffectiveTypeAnnotationNode(node); let result; if (typeAnnotation && resolver.canReuseTypeNodeAnnotation(context, node, typeAnnotation, symbol)) { result = serializeExistingTypeNode(typeAnnotation, context); } if (!result && node.kind === 304 /* PropertyAssignment */) { const initializer = node.initializer; const assertionNode = isJSDocTypeAssertion(initializer) ? getJSDocTypeAssertionType(initializer) : initializer.kind === 235 /* AsExpression */ || initializer.kind === 217 /* TypeAssertionExpression */ ? initializer.type : void 0; if (assertionNode && !isConstTypeReference(assertionNode) && resolver.canReuseTypeNodeAnnotation(context, node, assertionNode, symbol)) { result = serializeExistingTypeNode(assertionNode, context); } } return result ?? inferTypeOfDeclaration( node, symbol, context, /*reportFallback*/ false ); } function serializeReturnTypeForSignature(node, symbol, context) { switch (node.kind) { case 178 /* GetAccessor */: return serializeTypeOfAccessor(node, symbol, context); case 175 /* MethodDeclaration */: case 263 /* FunctionDeclaration */: case 181 /* ConstructSignature */: case 174 /* MethodSignature */: case 180 /* CallSignature */: case 177 /* Constructor */: case 179 /* SetAccessor */: case 182 /* IndexSignature */: case 185 /* FunctionType */: case 186 /* ConstructorType */: case 219 /* FunctionExpression */: case 220 /* ArrowFunction */: case 318 /* JSDocFunctionType */: case 324 /* JSDocSignature */: return createReturnFromSignature(node, symbol, context); default: Debug.assertNever(node, `Node needs to be an inferrable node, found ${Debug.formatSyntaxKind(node.kind)}`); } } function getTypeAnnotationFromAccessor(accessor) { if (accessor) { return accessor.kind === 178 /* GetAccessor */ ? isInJSFile(accessor) && getJSDocType(accessor) || getEffectiveReturnTypeNode(accessor) : getEffectiveSetAccessorTypeAnnotationNode(accessor); } } function getTypeAnnotationFromAllAccessorDeclarations(node, accessors) { let accessorType = getTypeAnnotationFromAccessor(node); if (!accessorType && node !== accessors.firstAccessor) { accessorType = getTypeAnnotationFromAccessor(accessors.firstAccessor); } if (!accessorType && accessors.secondAccessor && node !== accessors.secondAccessor) { accessorType = getTypeAnnotationFromAccessor(accessors.secondAccessor); } return accessorType; } function typeFromAccessor(node, symbol, context) { const accessorDeclarations = resolver.getAllAccessorDeclarations(node); const accessorType = getTypeAnnotationFromAllAccessorDeclarations(node, accessorDeclarations); if (accessorType && !isTypePredicateNode(accessorType)) { return withNewScope(context, node, () => serializeTypeAnnotationOfDeclaration(accessorType, context, node, symbol) ?? inferTypeOfDeclaration(node, symbol, context)); } if (accessorDeclarations.getAccessor) { return withNewScope(context, accessorDeclarations.getAccessor, () => createReturnFromSignature(accessorDeclarations.getAccessor, symbol, context)); } return void 0; } function typeFromVariable(node, symbol, context) { var _a; const declaredType = getEffectiveTypeAnnotationNode(node); let resultType = failed; if (declaredType) { resultType = syntacticResult(serializeTypeAnnotationOfDeclaration(declaredType, context, node, symbol)); } else if (node.initializer && (((_a = symbol.declarations) == null ? void 0 : _a.length) === 1 || countWhere(symbol.declarations, isVariableDeclaration) === 1)) { if (!resolver.isExpandoFunctionDeclaration(node) && !isContextuallyTyped(node)) { resultType = typeFromExpression( node.initializer, context, /*isConstContext*/ void 0, /*requiresAddingUndefined*/ void 0, isVarConstLike(node) ); } } return resultType.type !== void 0 ? resultType.type : inferTypeOfDeclaration(node, symbol, context, resultType.reportFallback); } function typeFromParameter(node, symbol, context) { const parent = node.parent; if (parent.kind === 179 /* SetAccessor */) { return serializeTypeOfAccessor( parent, /*symbol*/ void 0, context ); } const declaredType = getEffectiveTypeAnnotationNode(node); const addUndefined = resolver.requiresAddingImplicitUndefined(node, symbol, context.enclosingDeclaration); let resultType = failed; if (declaredType) { resultType = syntacticResult(serializeTypeAnnotationOfDeclaration(declaredType, context, node, symbol, addUndefined)); } else if (isParameter(node) && node.initializer && isIdentifier(node.name) && !isContextuallyTyped(node)) { resultType = typeFromExpression( node.initializer, context, /*isConstContext*/ void 0, addUndefined ); } return resultType.type !== void 0 ? resultType.type : inferTypeOfDeclaration(node, symbol, context, resultType.reportFallback); } function typeFromExpandoProperty(node, symbol, context) { const declaredType = getEffectiveTypeAnnotationNode(node); let result; if (declaredType) { result = serializeTypeAnnotationOfDeclaration(declaredType, context, node, symbol); } const oldSuppressReportInferenceFallback = context.suppressReportInferenceFallback; context.suppressReportInferenceFallback = true; const resultType = result ?? inferTypeOfDeclaration( node, symbol, context, /*reportFallback*/ false ); context.suppressReportInferenceFallback = oldSuppressReportInferenceFallback; return resultType; } function typeFromProperty(node, symbol, context) { const declaredType = getEffectiveTypeAnnotationNode(node); const requiresAddingUndefined = resolver.requiresAddingImplicitUndefined(node, symbol, context.enclosingDeclaration); let resultType = failed; if (declaredType) { resultType = syntacticResult(serializeTypeAnnotationOfDeclaration(declaredType, context, node, symbol, requiresAddingUndefined)); } else { const initializer = isPropertyDeclaration(node) ? node.initializer : void 0; if (initializer && !isContextuallyTyped(node)) { const isReadonly = isDeclarationReadonly(node); resultType = typeFromExpression( initializer, context, /*isConstContext*/ void 0, requiresAddingUndefined, isReadonly ); } } return resultType.type !== void 0 ? resultType.type : inferTypeOfDeclaration(node, symbol, context, resultType.reportFallback); } function inferTypeOfDeclaration(node, symbol, context, reportFallback = true) { if (reportFallback) { context.tracker.reportInferenceFallback(node); } if (context.noInferenceFallback === true) { return factory.createKeywordTypeNode(133 /* AnyKeyword */); } return resolver.serializeTypeOfDeclaration(context, node, symbol); } function inferExpressionType(node, context, reportFallback = true, requiresAddingUndefined) { Debug.assert(!requiresAddingUndefined); if (reportFallback) { context.tracker.reportInferenceFallback(node); } if (context.noInferenceFallback === true) { return factory.createKeywordTypeNode(133 /* AnyKeyword */); } return resolver.serializeTypeOfExpression(context, node) ?? factory.createKeywordTypeNode(133 /* AnyKeyword */); } function inferReturnTypeOfSignatureSignature(node, context, symbol, reportFallback) { if (reportFallback) { context.tracker.reportInferenceFallback(node); } if (context.noInferenceFallback === true) { return factory.createKeywordTypeNode(133 /* AnyKeyword */); } return resolver.serializeReturnTypeForSignature(context, node, symbol) ?? factory.createKeywordTypeNode(133 /* AnyKeyword */); } function inferAccessorType(node, allAccessors, context, symbol, reportFallback = true) { if (node.kind === 178 /* GetAccessor */) { return createReturnFromSignature(node, symbol, context, reportFallback); } else { if (reportFallback) { context.tracker.reportInferenceFallback(node); } const result = allAccessors.getAccessor && createReturnFromSignature(allAccessors.getAccessor, symbol, context, reportFallback); return result ?? resolver.serializeTypeOfDeclaration(context, node, symbol) ?? factory.createKeywordTypeNode(133 /* AnyKeyword */); } } function withNewScope(context, node, fn) { const cleanup = resolver.enterNewScope(context, node); const result = fn(); cleanup(); return result; } function typeFromTypeAssertion(expression, type, context, requiresAddingUndefined) { if (isConstTypeReference(type)) { return typeFromExpression( expression, context, /*isConstContext*/ true, requiresAddingUndefined ); } return syntacticResult(serializeExistingTypeNodeWithFallback(type, context, requiresAddingUndefined)); } function typeFromExpression(node, context, isConstContext = false, requiresAddingUndefined = false, preserveLiterals = false) { switch (node.kind) { case 218 /* ParenthesizedExpression */: if (isJSDocTypeAssertion(node)) { return typeFromTypeAssertion(node.expression, getJSDocTypeAssertionType(node), context, requiresAddingUndefined); } return typeFromExpression(node.expression, context, isConstContext, requiresAddingUndefined); case 80 /* Identifier */: if (resolver.isUndefinedIdentifierExpression(node)) { return syntacticResult(createUndefinedTypeNode()); } break; case 106 /* NullKeyword */: if (strictNullChecks) { return syntacticResult(addUndefinedIfNeeded(factory.createLiteralTypeNode(factory.createNull()), requiresAddingUndefined, node, context)); } else { return syntacticResult(factory.createKeywordTypeNode(133 /* AnyKeyword */)); } case 220 /* ArrowFunction */: case 219 /* FunctionExpression */: Debug.type(node); return withNewScope(context, node, () => typeFromFunctionLikeExpression(node, context)); case 217 /* TypeAssertionExpression */: case 235 /* AsExpression */: const asExpression = node; return typeFromTypeAssertion(asExpression.expression, asExpression.type, context, requiresAddingUndefined); case 225 /* PrefixUnaryExpression */: const unaryExpression = node; if (isPrimitiveLiteralValue(unaryExpression)) { return typeFromPrimitiveLiteral( unaryExpression.operator === 40 /* PlusToken */ ? unaryExpression.operand : unaryExpression, unaryExpression.operand.kind === 10 /* BigIntLiteral */ ? 163 /* BigIntKeyword */ : 150 /* NumberKeyword */, context, isConstContext || preserveLiterals, requiresAddingUndefined ); } break; case 210 /* ArrayLiteralExpression */: return typeFromArrayLiteral(node, context, isConstContext, requiresAddingUndefined); case 211 /* ObjectLiteralExpression */: return typeFromObjectLiteral(node, context, isConstContext, requiresAddingUndefined); case 232 /* ClassExpression */: return syntacticResult(inferExpressionType( node, context, /*reportFallback*/ true, requiresAddingUndefined )); case 229 /* TemplateExpression */: if (!isConstContext && !preserveLiterals) { return syntacticResult(factory.createKeywordTypeNode(154 /* StringKeyword */)); } break; default: let typeKind; let primitiveNode = node; switch (node.kind) { case 9 /* NumericLiteral */: typeKind = 150 /* NumberKeyword */; break; case 15 /* NoSubstitutionTemplateLiteral */: primitiveNode = factory.createStringLiteral(node.text); typeKind = 154 /* StringKeyword */; break; case 11 /* StringLiteral */: typeKind = 154 /* StringKeyword */; break; case 10 /* BigIntLiteral */: typeKind = 163 /* BigIntKeyword */; break; case 112 /* TrueKeyword */: case 97 /* FalseKeyword */: typeKind = 136 /* BooleanKeyword */; break; } if (typeKind) { return typeFromPrimitiveLiteral(primitiveNode, typeKind, context, isConstContext || preserveLiterals, requiresAddingUndefined); } } return failed; } function typeFromFunctionLikeExpression(fnNode, context) { const returnType = createReturnFromSignature( fnNode, /*symbol*/ void 0, context ); const typeParameters = reuseTypeParameters(fnNode.typeParameters, context); const parameters = fnNode.parameters.map((p) => ensureParameter(p, context)); return syntacticResult( factory.createFunctionTypeNode( typeParameters, parameters, returnType ) ); } function canGetTypeFromArrayLiteral(arrayLiteral, context, isConstContext) { if (!isConstContext) { context.tracker.reportInferenceFallback(arrayLiteral); return false; } for (const element of arrayLiteral.elements) { if (element.kind === 231 /* SpreadElement */) { context.tracker.reportInferenceFallback(element); return false; } } return true; } function typeFromArrayLiteral(arrayLiteral, context, isConstContext, requiresAddingUndefined) { if (!canGetTypeFromArrayLiteral(arrayLiteral, context, isConstContext)) { if (requiresAddingUndefined || isDeclaration(walkUpParenthesizedExpressions(arrayLiteral).parent)) { return alreadyReported; } return syntacticResult(inferExpressionType( arrayLiteral, context, /*reportFallback*/ false, requiresAddingUndefined )); } const oldNoInferenceFallback = context.noInferenceFallback; context.noInferenceFallback = true; const elementTypesInfo = []; for (const element of arrayLiteral.elements) { Debug.assert(element.kind !== 231 /* SpreadElement */); if (element.kind === 233 /* OmittedExpression */) { elementTypesInfo.push( createUndefinedTypeNode() ); } else { const expressionType = typeFromExpression(element, context, isConstContext); const elementType = expressionType.type !== void 0 ? expressionType.type : inferExpressionType(element, context, expressionType.reportFallback); elementTypesInfo.push(elementType); } } const tupleType = factory.createTupleTypeNode(elementTypesInfo); tupleType.emitNode = { flags: 1, autoGenerate: void 0, internalFlags: 0 }; context.noInferenceFallback = oldNoInferenceFallback; return notImplemented2; } function canGetTypeFromObjectLiteral(objectLiteral, context) { let result = true; for (const prop of objectLiteral.properties) { if (prop.flags & 262144 /* ThisNodeHasError */) { result = false; break; } if (prop.kind === 305 /* ShorthandPropertyAssignment */ || prop.kind === 306 /* SpreadAssignment */) { context.tracker.reportInferenceFallback(prop); result = false; } else if (prop.name.flags & 262144 /* ThisNodeHasError */) { result = false; break; } else if (prop.name.kind === 81 /* PrivateIdentifier */) { result = false; } else if (prop.name.kind === 168 /* ComputedPropertyName */) { const expression = prop.name.expression; if (!isPrimitiveLiteralValue( expression, /*includeBigInt*/ false ) && !resolver.isDefinitelyReferenceToGlobalSymbolObject(expression)) { context.tracker.reportInferenceFallback(prop.name); result = false; } } } return result; } function typeFromObjectLiteral(objectLiteral, context, isConstContext, requiresAddingUndefined) { if (!canGetTypeFromObjectLiteral(objectLiteral, context)) { if (requiresAddingUndefined || isDeclaration(walkUpParenthesizedExpressions(objectLiteral).parent)) { return alreadyReported; } return syntacticResult(inferExpressionType( objectLiteral, context, /*reportFallback*/ false, requiresAddingUndefined )); } const oldNoInferenceFallback = context.noInferenceFallback; context.noInferenceFallback = true; const properties = []; const oldFlags = context.flags; context.flags |= 4194304 /* InObjectTypeLiteral */; for (const prop of objectLiteral.properties) { Debug.assert(!isShorthandPropertyAssignment(prop) && !isSpreadAssignment(prop)); const name = prop.name; let newProp; switch (prop.kind) { case 175 /* MethodDeclaration */: newProp = withNewScope(context, prop, () => typeFromObjectLiteralMethod(prop, name, context, isConstContext)); break; case 304 /* PropertyAssignment */: newProp = typeFromObjectLiteralPropertyAssignment(prop, name, context, isConstContext); break; case 179 /* SetAccessor */: case 178 /* GetAccessor */: newProp = typeFromObjectLiteralAccessor(prop, name, context); break; } if (newProp) { setCommentRange(newProp, prop); properties.push(newProp); } } context.flags = oldFlags; const typeNode = factory.createTypeLiteralNode(properties); if (!(context.flags & 1024 /* MultilineObjectLiterals */)) { setEmitFlags(typeNode, 1 /* SingleLine */); } context.noInferenceFallback = oldNoInferenceFallback; return notImplemented2; } function typeFromObjectLiteralPropertyAssignment(prop, name, context, isConstContext) { const modifiers = isConstContext ? [factory.createModifier(148 /* ReadonlyKeyword */)] : []; const expressionResult = typeFromExpression(prop.initializer, context, isConstContext); const typeNode = expressionResult.type !== void 0 ? expressionResult.type : inferTypeOfDeclaration( prop, /*symbol*/ void 0, context, expressionResult.reportFallback ); return factory.createPropertySignature( modifiers, reuseNode(context, name), /*questionToken*/ void 0, typeNode ); } function ensureParameter(p, context) { return factory.updateParameterDeclaration( p, /*modifiers*/ void 0, reuseNode(context, p.dotDotDotToken), resolver.serializeNameOfParameter(context, p), resolver.isOptionalParameter(p) ? factory.createToken(58 /* QuestionToken */) : void 0, typeFromParameter( p, /*symbol*/ void 0, context ), // Ignore private param props, since this type is going straight back into a param /*initializer*/ void 0 ); } function reuseTypeParameters(typeParameters, context) { return typeParameters == null ? void 0 : typeParameters.map((tp) => { var _a; const { node: tpName } = resolver.trackExistingEntityName(context, tp.name); return factory.updateTypeParameterDeclaration( tp, (_a = tp.modifiers) == null ? void 0 : _a.map((m) => reuseNode(context, m)), tpName, serializeExistingTypeNodeWithFallback(tp.constraint, context), serializeExistingTypeNodeWithFallback(tp.default, context) ); }); } function typeFromObjectLiteralMethod(method, name, context, isConstContext) { const returnType = createReturnFromSignature( method, /*symbol*/ void 0, context ); const typeParameters = reuseTypeParameters(method.typeParameters, context); const parameters = method.parameters.map((p) => ensureParameter(p, context)); if (isConstContext) { return factory.createPropertySignature( [factory.createModifier(148 /* ReadonlyKeyword */)], reuseNode(context, name), reuseNode(context, method.questionToken), factory.createFunctionTypeNode( typeParameters, parameters, returnType ) ); } else { if (isIdentifier(name) && name.escapedText === "new") { name = factory.createStringLiteral("new"); } return factory.createMethodSignature( [], reuseNode(context, name), reuseNode(context, method.questionToken), typeParameters, parameters, returnType ); } } function typeFromObjectLiteralAccessor(accessor, name, context) { const allAccessors = resolver.getAllAccessorDeclarations(accessor); const getAccessorType = allAccessors.getAccessor && getTypeAnnotationFromAccessor(allAccessors.getAccessor); const setAccessorType = allAccessors.setAccessor && getTypeAnnotationFromAccessor(allAccessors.setAccessor); if (getAccessorType !== void 0 && setAccessorType !== void 0) { return withNewScope(context, accessor, () => { const parameters = accessor.parameters.map((p) => ensureParameter(p, context)); if (isGetAccessor(accessor)) { return factory.updateGetAccessorDeclaration( accessor, [], reuseNode(context, name), parameters, serializeExistingTypeNodeWithFallback(getAccessorType, context), /*body*/ void 0 ); } else { return factory.updateSetAccessorDeclaration( accessor, [], reuseNode(context, name), parameters, /*body*/ void 0 ); } }); } else if (allAccessors.firstAccessor === accessor) { const foundType = getAccessorType ? withNewScope(context, allAccessors.getAccessor, () => serializeExistingTypeNodeWithFallback(getAccessorType, context)) : setAccessorType ? withNewScope(context, allAccessors.setAccessor, () => serializeExistingTypeNodeWithFallback(setAccessorType, context)) : void 0; const propertyType = foundType ?? inferAccessorType( accessor, allAccessors, context, /*symbol*/ void 0 ); const propertySignature = factory.createPropertySignature( allAccessors.setAccessor === void 0 ? [factory.createModifier(148 /* ReadonlyKeyword */)] : [], reuseNode(context, name), /*questionToken*/ void 0, propertyType ); return propertySignature; } } function createUndefinedTypeNode() { if (strictNullChecks) { return factory.createKeywordTypeNode(157 /* UndefinedKeyword */); } else { return factory.createKeywordTypeNode(133 /* AnyKeyword */); } } function typeFromPrimitiveLiteral(node, baseType, context, preserveLiterals, requiresAddingUndefined) { let result; if (preserveLiterals) { if (node.kind === 225 /* PrefixUnaryExpression */ && node.operator === 40 /* PlusToken */) { result = factory.createLiteralTypeNode(reuseNode(context, node.operand)); } result = factory.createLiteralTypeNode(reuseNode(context, node)); } else { result = factory.createKeywordTypeNode(baseType); } return syntacticResult(addUndefinedIfNeeded(result, requiresAddingUndefined, node, context)); } function addUndefinedIfNeeded(node, addUndefined, owner, context) { const parentDeclaration = owner && walkUpParenthesizedExpressions(owner).parent; const optionalDeclaration = parentDeclaration && isDeclaration(parentDeclaration) && isOptionalDeclaration(parentDeclaration); if (!strictNullChecks || !(addUndefined || optionalDeclaration)) return node; if (!canAddUndefined(node)) { context.tracker.reportInferenceFallback(node); } if (isUnionTypeNode(node)) { return factory.createUnionTypeNode([...node.types, factory.createKeywordTypeNode(157 /* UndefinedKeyword */)]); } return factory.createUnionTypeNode([node, factory.createKeywordTypeNode(157 /* UndefinedKeyword */)]); } function canAddUndefined(node) { if (!strictNullChecks) return true; if (isKeyword(node.kind) || node.kind === 202 /* LiteralType */ || node.kind === 185 /* FunctionType */ || node.kind === 186 /* ConstructorType */ || node.kind === 189 /* ArrayType */ || node.kind === 190 /* TupleType */ || node.kind === 188 /* TypeLiteral */ || node.kind === 204 /* TemplateLiteralType */ || node.kind === 198 /* ThisType */) { return true; } if (node.kind === 197 /* ParenthesizedType */) { return canAddUndefined(node.type); } if (node.kind === 193 /* UnionType */ || node.kind === 194 /* IntersectionType */) { return node.types.every(canAddUndefined); } return false; } function createReturnFromSignature(fn, symbol, context, reportFallback = true) { let returnType = failed; const returnTypeNode = isJSDocConstructSignature(fn) ? getEffectiveTypeAnnotationNode(fn.parameters[0]) : getEffectiveReturnTypeNode(fn); if (returnTypeNode) { returnType = syntacticResult(serializeTypeAnnotationOfDeclaration(returnTypeNode, context, fn, symbol)); } else if (isValueSignatureDeclaration(fn)) { returnType = typeFromSingleReturnExpression(fn, context); } return returnType.type !== void 0 ? returnType.type : inferReturnTypeOfSignatureSignature(fn, context, symbol, reportFallback && returnType.reportFallback && !returnTypeNode); } function typeFromSingleReturnExpression(declaration, context) { let candidateExpr; if (declaration && !nodeIsMissing(declaration.body)) { const flags = getFunctionFlags(declaration); if (flags & 3 /* AsyncGenerator */) return failed; const body = declaration.body; if (body && isBlock(body)) { forEachReturnStatement(body, (s) => { if (s.parent !== body) { candidateExpr = void 0; return true; } if (!candidateExpr) { candidateExpr = s.expression; } else { candidateExpr = void 0; return true; } }); } else { candidateExpr = body; } } if (candidateExpr) { if (isContextuallyTyped(candidateExpr)) { const type = isJSDocTypeAssertion(candidateExpr) ? getJSDocTypeAssertionType(candidateExpr) : isAsExpression(candidateExpr) || isTypeAssertionExpression(candidateExpr) ? candidateExpr.type : void 0; if (type && !isConstTypeReference(type)) { return syntacticResult(serializeExistingTypeNode(type, context)); } } else { return typeFromExpression(candidateExpr, context); } } return failed; } function isContextuallyTyped(node) { return findAncestor(node.parent, (n) => { return isCallExpression(n) || !isFunctionLikeDeclaration(n) && !!getEffectiveTypeAnnotationNode(n) || isJsxElement(n) || isJsxExpression(n); }); } } // src/tsc/tsc.ts Debug.loggingHost = { log(_level, s) { sys.write(`${s || ""}${sys.newLine}`); } }; if (Debug.isDebugging) { Debug.enableDebugInfo(); } if (sys.tryEnableSourceMapsForHost && /^development$/i.test(sys.getEnvironmentVariable("NODE_ENV"))) { sys.tryEnableSourceMapsForHost(); } if (sys.setBlocking) { sys.setBlocking(); } executeCommandLine(sys, noop, sys.args); //# sourceMappingURL=_tsc.js.map