etAllAccessorDeclarations(node.parent.members, 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 & ~(1025 /* ExportDefault */ | 131072 /* Decorator */)) {
return grammarErrorOnNode(modifier, Diagnostics.Decorators_are_not_valid_here);
}
if (hasLeadingDecorators && flags & 126975 /* 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 |= 131072 /* Decorator */;
if (!(flags & 126975 /* Modifier */)) {
hasLeadingDecorators = true;
} else if (flags & 1 /* Export */) {
sawExportBeforeDecorators = true;
}
firstDecorator ?? (firstDecorator = modifier);
} else {
if (modifier.kind !== 148 /* ReadonlyKeyword */) {
if (node.kind === 170 /* PropertySignature */ || node.kind === 172 /* MethodSignature */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_type_member, tokenToString(modifier.kind));
}
if (node.kind === 180 /* 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 === 167 /* 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 !== 265 /* EnumDeclaration */ && node.kind !== 167 /* TypeParameter */) {
return grammarErrorOnNode(node, Diagnostics.A_class_member_cannot_have_the_0_keyword, tokenToString(87 /* ConstKeyword */));
}
const parent2 = node.parent;
if (node.kind === 167 /* TypeParameter */ && !(isFunctionLikeDeclaration(parent2) || isClassLike(parent2) || isFunctionTypeNode(parent2) || isConstructorTypeNode(parent2) || isCallSignatureDeclaration(parent2) || isConstructSignatureDeclaration(parent2) || isMethodSignature(parent2))) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_can_only_appear_on_a_type_parameter_of_a_function_method_or_class, tokenToString(modifier.kind));
}
break;
case 163 /* OverrideKeyword */:
if (flags & 16384 /* Override */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "override");
} else if (flags & 2 /* Ambient */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "override", "declare");
} else if (flags & 64 /* Readonly */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "override", "readonly");
} else if (flags & 128 /* Accessor */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "override", "accessor");
} else if (flags & 512 /* Async */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "override", "async");
}
flags |= 16384 /* Override */;
lastOverride = modifier;
break;
case 125 /* PublicKeyword */:
case 124 /* ProtectedKeyword */:
case 123 /* PrivateKeyword */:
const text = visibilityToString(modifierToFlag(modifier.kind));
if (flags & 28 /* AccessibilityModifier */) {
return grammarErrorOnNode(modifier, Diagnostics.Accessibility_modifier_already_seen);
} else if (flags & 16384 /* Override */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "override");
} else if (flags & 32 /* Static */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "static");
} else if (flags & 128 /* Accessor */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "accessor");
} else if (flags & 64 /* Readonly */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "readonly");
} else if (flags & 512 /* Async */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "async");
} else if (node.parent.kind === 267 /* ModuleBlock */ || node.parent.kind === 311 /* SourceFile */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_module_or_namespace_element, text);
} else if (flags & 256 /* 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 & 32 /* Static */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "static");
} else if (flags & 64 /* Readonly */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "static", "readonly");
} else if (flags & 512 /* Async */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "static", "async");
} else if (flags & 128 /* Accessor */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "static", "accessor");
} else if (node.parent.kind === 267 /* ModuleBlock */ || node.parent.kind === 311 /* SourceFile */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_module_or_namespace_element, "static");
} else if (node.kind === 168 /* Parameter */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_parameter, "static");
} else if (flags & 256 /* Abstract */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "static", "abstract");
} else if (flags & 16384 /* Override */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "static", "override");
}
flags |= 32 /* Static */;
lastStatic = modifier;
break;
case 129 /* AccessorKeyword */:
if (flags & 128 /* Accessor */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "accessor");
} else if (flags & 64 /* Readonly */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "accessor", "readonly");
} else if (flags & 2 /* Ambient */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "accessor", "declare");
} else if (node.kind !== 171 /* PropertyDeclaration */) {
return grammarErrorOnNode(modifier, Diagnostics.accessor_modifier_can_only_appear_on_a_property_declaration);
}
flags |= 128 /* Accessor */;
break;
case 148 /* ReadonlyKeyword */:
if (flags & 64 /* Readonly */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "readonly");
} else if (node.kind !== 171 /* PropertyDeclaration */ && node.kind !== 170 /* PropertySignature */ && node.kind !== 180 /* IndexSignature */ && node.kind !== 168 /* Parameter */) {
return grammarErrorOnNode(modifier, Diagnostics.readonly_modifier_can_only_appear_on_a_property_declaration_or_index_signature);
} else if (flags & 128 /* Accessor */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "readonly", "accessor");
}
flags |= 64 /* Readonly */;
break;
case 95 /* ExportKeyword */:
if (compilerOptions.verbatimModuleSyntax && !(node.flags & 16777216 /* Ambient */) && node.kind !== 264 /* TypeAliasDeclaration */ && node.kind !== 263 /* InterfaceDeclaration */ && // ModuleDeclaration needs to be checked that it is uninstantiated later
node.kind !== 266 /* ModuleDeclaration */ && node.parent.kind === 311 /* SourceFile */ && (moduleKind === 1 /* CommonJS */ || getSourceFileOfNode(node).impliedNodeFormat === 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 & 1 /* Export */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "export");
} else if (flags & 2 /* Ambient */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "export", "declare");
} else if (flags & 256 /* Abstract */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "export", "abstract");
} else if (flags & 512 /* 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 === 168 /* Parameter */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_parameter, "export");
}
flags |= 1 /* Export */;
break;
case 90 /* DefaultKeyword */:
const container = node.parent.kind === 311 /* SourceFile */ ? node.parent : node.parent.parent;
if (container.kind === 266 /* ModuleDeclaration */ && !isAmbientModule(container)) {
return grammarErrorOnNode(modifier, Diagnostics.A_default_export_can_only_be_used_in_an_ECMAScript_style_module);
} else if (!(flags & 1 /* 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 |= 1024 /* Default */;
break;
case 138 /* DeclareKeyword */:
if (flags & 2 /* Ambient */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "declare");
} else if (flags & 512 /* Async */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_in_an_ambient_context, "async");
} else if (flags & 16384 /* 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 === 168 /* Parameter */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_parameter, "declare");
} else if (node.parent.flags & 16777216 /* Ambient */ && node.parent.kind === 267 /* 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 & 128 /* Accessor */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "declare", "accessor");
}
flags |= 2 /* Ambient */;
lastDeclare = modifier;
break;
case 128 /* AbstractKeyword */:
if (flags & 256 /* Abstract */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "abstract");
}
if (node.kind !== 262 /* ClassDeclaration */ && node.kind !== 184 /* ConstructorType */) {
if (node.kind !== 173 /* MethodDeclaration */ && node.kind !== 171 /* PropertyDeclaration */ && node.kind !== 176 /* GetAccessor */ && node.kind !== 177 /* SetAccessor */) {
return grammarErrorOnNode(modifier, Diagnostics.abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration);
}
if (!(node.parent.kind === 262 /* ClassDeclaration */ && hasSyntacticModifier(node.parent, 256 /* Abstract */))) {
const message = node.kind === 171 /* 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 & 32 /* Static */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "static", "abstract");
}
if (flags & 8 /* Private */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "private", "abstract");
}
if (flags & 512 /* Async */ && lastAsync) {
return grammarErrorOnNode(lastAsync, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "async", "abstract");
}
if (flags & 16384 /* Override */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "abstract", "override");
}
if (flags & 128 /* 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 |= 256 /* Abstract */;
break;
case 134 /* AsyncKeyword */:
if (flags & 512 /* Async */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "async");
} else if (flags & 2 /* Ambient */ || node.parent.flags & 16777216 /* Ambient */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_in_an_ambient_context, "async");
} else if (node.kind === 168 /* Parameter */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_parameter, "async");
}
if (flags & 256 /* Abstract */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "async", "abstract");
}
flags |= 512 /* Async */;
lastAsync = modifier;
break;
case 103 /* InKeyword */:
case 147 /* OutKeyword */:
const inOutFlag = modifier.kind === 103 /* InKeyword */ ? 32768 /* In */ : 65536 /* Out */;
const inOutText = modifier.kind === 103 /* InKeyword */ ? "in" : "out";
if (node.kind !== 167 /* TypeParameter */ || !(isInterfaceDeclaration(node.parent) || isClassLike(node.parent) || isTypeAliasDeclaration(node.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 & 32768 /* In */ && flags & 65536 /* Out */) {
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "in", "out");
}
flags |= inOutFlag;
break;
}
}
}
if (node.kind === 175 /* Constructor */) {
if (flags & 32 /* Static */) {
return grammarErrorOnNode(lastStatic, Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "static");
}
if (flags & 16384 /* Override */) {
return grammarErrorOnNode(lastOverride, Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "override");
}
if (flags & 512 /* Async */) {
return grammarErrorOnNode(lastAsync, Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "async");
}
return false;
} else if ((node.kind === 271 /* ImportDeclaration */ || node.kind === 270 /* ImportEqualsDeclaration */) && flags & 2 /* Ambient */) {
return grammarErrorOnNode(lastDeclare, Diagnostics.A_0_modifier_cannot_be_used_with_an_import_declaration, "declare");
} else if (node.kind === 168 /* Parameter */ && flags & 16476 /* ParameterPropertyModifier */ && isBindingPattern(node.name)) {
return grammarErrorOnNode(node, Diagnostics.A_parameter_property_may_not_be_declared_using_a_binding_pattern);
} else if (node.kind === 168 /* Parameter */ && flags & 16476 /* ParameterPropertyModifier */ && node.dotDotDotToken) {
return grammarErrorOnNode(node, Diagnostics.A_parameter_property_cannot_be_declared_using_a_rest_parameter);
}
if (flags & 512 /* 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 176 /* GetAccessor */:
case 177 /* SetAccessor */:
case 175 /* Constructor */:
case 171 /* PropertyDeclaration */:
case 170 /* PropertySignature */:
case 173 /* MethodDeclaration */:
case 172 /* MethodSignature */:
case 180 /* IndexSignature */:
case 266 /* ModuleDeclaration */:
case 271 /* ImportDeclaration */:
case 270 /* ImportEqualsDeclaration */:
case 277 /* ExportDeclaration */:
case 276 /* ExportAssignment */:
case 217 /* FunctionExpression */:
case 218 /* ArrowFunction */:
case 168 /* Parameter */:
case 167 /* TypeParameter */:
return void 0;
case 174 /* ClassStaticBlockDeclaration */:
case 302 /* PropertyAssignment */:
case 303 /* ShorthandPropertyAssignment */:
case 269 /* NamespaceExportDeclaration */:
case 281 /* MissingDeclaration */:
return find(node.modifiers, isModifier);
default:
if (node.parent.kind === 267 /* ModuleBlock */ || node.parent.kind === 311 /* SourceFile */) {
return void 0;
}
switch (node.kind) {
case 261 /* FunctionDeclaration */:
return findFirstModifierExcept(node, 134 /* AsyncKeyword */);
case 262 /* ClassDeclaration */:
case 184 /* ConstructorType */:
return findFirstModifierExcept(node, 128 /* AbstractKeyword */);
case 230 /* ClassExpression */:
case 263 /* InterfaceDeclaration */:
case 242 /* VariableStatement */:
case 264 /* TypeAliasDeclaration */:
return find(node.modifiers, isModifier);
case 265 /* 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 173 /* MethodDeclaration */:
case 261 /* FunctionDeclaration */:
case 217 /* FunctionExpression */:
case 218 /* 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 start2 = typeParameters.pos - "<".length;
const end = skipTrivia(file.text, typeParameters.end) + ">".length;
return grammarErrorAtPos(file, start2, end - start2, 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 & 16777216 /* 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 (isOptionalParameter(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 start2 = typeArguments.pos - "<".length;
const end = skipTrivia(sourceFile.text, typeArguments.end) + ">".length;
return grammarErrorAtPos(sourceFile, start2, end - start2, 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 & 32 /* 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 !== 166 /* ComputedPropertyName */) {
return false;
}
const computedPropertyName = node;
if (computedPropertyName.expression.kind === 225 /* 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 === 261 /* FunctionDeclaration */ || node.kind === 217 /* FunctionExpression */ || node.kind === 173 /* MethodDeclaration */
);
if (node.flags & 16777216 /* 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 === 304 /* 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 === 166 /* ComputedPropertyName */) {
checkGrammarComputedPropertyName(name);
}
if (prop.kind === 303 /* 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 !== 173 /* 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 303 /* ShorthandPropertyAssignment */:
case 302 /* 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);
}
currentKind = 4 /* PropertyAssignment */;
break;
case 173 /* MethodDeclaration */:
currentKind = 8 /* Method */;
break;
case 176 /* GetAccessor */:
currentKind = 1 /* GetAccessor */;
break;
case 177 /* 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 === 292 /* 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 === 293 /* 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 === 249 /* ForOfStatement */ && forInOrOfStatement.awaitModifier) {
if (!(forInOrOfStatement.flags & 32768 /* 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 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;
}
case 7 /* ES2022 */:
case 99 /* ESNext */:
case 4 /* System */:
if (languageVersion >= 4 /* ES2017 */) {
break;
}
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_or_nodenext_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 !== 175 /* 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;
}
}
return false;
}
}
if (isForOfStatement(forInOrOfStatement) && !(forInOrOfStatement.flags & 32768 /* 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 === 260 /* 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 === 248 /* 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 === 248 /* 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 === 248 /* 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 & 16777216 /* Ambient */) && accessor.parent.kind !== 186 /* TypeLiteral */ && accessor.parent.kind !== 263 /* InterfaceDeclaration */) {
if (languageVersion < 1 /* ES5 */) {
return grammarErrorOnNode(accessor.name, Diagnostics.Accessors_are_only_available_when_targeting_ECMAScript_5_and_higher);
}
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, 256 /* Abstract */)) {
return grammarErrorAtPos(accessor, accessor.end - 1, ";".length, Diagnostics._0_expected, "{");
}
}
if (accessor.body) {
if (hasSyntacticModifier(accessor, 256 /* Abstract */)) {
return grammarErrorOnNode(accessor, Diagnostics.An_abstract_accessor_cannot_have_an_implementation);
}
if (accessor.parent.kind === 186 /* TypeLiteral */ || accessor.parent.kind === 263 /* 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 === 176 /* GetAccessor */ ? Diagnostics.A_get_accessor_cannot_have_parameters : Diagnostics.A_set_accessor_must_have_exactly_one_parameter
);
}
if (accessor.kind === 177 /* 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 === 176 /* GetAccessor */ ? 0 : 1);
}
function getAccessorThisParameter(accessor) {
if (accessor.parameters.length === (accessor.kind === 176 /* 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 parent2 = walkUpParenthesizedTypes(node.parent);
if (isInJSFile(parent2) && isJSDocTypeExpression(parent2)) {
const host2 = getJSDocHost(parent2);
if (host2) {
parent2 = getSingleVariableOfVariableStatement(host2) || host2;
}
}
switch (parent2.kind) {
case 259 /* VariableDeclaration */:
const decl = parent2;
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(parent2.name, Diagnostics.A_variable_whose_type_is_a_unique_symbol_type_must_be_const);
}
break;
case 171 /* PropertyDeclaration */:
if (!isStatic(parent2) || !hasEffectiveReadonlyModifier(parent2)) {
return grammarErrorOnNode(parent2.name, Diagnostics.A_property_of_a_class_whose_type_is_a_unique_symbol_type_must_be_both_static_and_readonly);
}
break;
case 170 /* PropertySignature */:
if (!hasSyntacticModifier(parent2, 64 /* Readonly */)) {
return grammarErrorOnNode(parent2.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 !== 187 /* ArrayType */ && node.type.kind !== 188 /* 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)) {
return grammarErrorOnNode(node, message);
}
}
function checkGrammarMethod(node) {
if (checkGrammarFunctionLikeDeclaration(node)) {
return true;
}
if (node.kind === 173 /* MethodDeclaration */) {
if (node.parent.kind === 209 /* 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 & 16777216 /* 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 === 173 /* 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 === 263 /* 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 === 186 /* 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 255 /* LabeledStatement */:
if (node.label && current.label.escapedText === node.label.escapedText) {
const isMisplacedContinueLabel = node.kind === 250 /* 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 254 /* SwitchStatement */:
if (node.kind === 251 /* 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 === 251 /* 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 === 251 /* 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 === 223 /* PrefixUnaryExpression */ && expr.operator === 41 /* MinusToken */ && expr.operand.kind === 9 /* NumericLiteral */;
}
function isBigIntLiteralExpression(expr) {
return expr.kind === 10 /* BigIntLiteral */ || expr.kind === 223 /* 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) && isVarConst(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) {
if (node.parent.parent.kind !== 248 /* ForInStatement */ && node.parent.parent.kind !== 249 /* ForOfStatement */) {
if (node.flags & 16777216 /* 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);
}
if (isVarConst(node)) {
return grammarErrorOnNode(node, Diagnostics.const_declarations_must_be_initialized);
}
}
}
if (node.exclamationToken && (node.parent.parent.kind !== 242 /* VariableStatement */ || !node.type || node.initializer || node.flags & 16777216 /* 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 ((moduleKind < 5 /* ES2015 */ || getSourceFileOfNode(node).impliedNodeFormat === 1 /* CommonJS */) && moduleKind !== 4 /* System */ && !(node.parent.parent.flags & 16777216 /* Ambient */) && hasSyntacticModifier(node.parent.parent, 1 /* Export */)) {
checkESModuleMarker(node.name);
}
const checkLetConstNames = isLet(node) || isVarConst(node);
return checkLetConstNames && 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);
}
return false;
}
function allowLetAndConstDeclarations(parent2) {
switch (parent2.kind) {
case 244 /* IfStatement */:
case 245 /* DoStatement */:
case 246 /* WhileStatement */:
case 253 /* WithStatement */:
case 247 /* ForStatement */:
case 248 /* ForInStatement */:
case 249 /* ForOfStatement */:
return false;
case 255 /* LabeledStatement */:
return allowLetAndConstDeclarations(parent2.parent);
}
return true;
}
function checkGrammarForDisallowedLetOrConstStatement(node) {
if (!allowLetAndConstDeclarations(node.parent)) {
if (isLet(node.declarationList)) {
return grammarErrorOnNode(node, Diagnostics.let_declarations_can_only_be_declared_inside_a_block);
} else if (isVarConst(node.declarationList)) {
return grammarErrorOnNode(node, Diagnostics.const_declarations_can_only_be_declared_inside_a_block);
}
}
}
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") {
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, start2, length2, message, ...args) {
const sourceFile = getSourceFileOfNode(nodeForSourceFile);
if (!hasParseDiagnostics(sourceFile)) {
diagnostics.add(createFileDiagnostic(sourceFile, start2, 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)) {
diagnostics.add(createDiagnosticForNode(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)) {
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 === 263 /* 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 & 16777216 /* Ambient */) {
checkAmbientInitializer(node);
}
if (isPropertyDeclaration(node) && node.exclamationToken && (!isClassLike(node.parent) || !node.type || node.initializer || node.flags & 16777216 /* 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 === 263 /* InterfaceDeclaration */ || node.kind === 264 /* TypeAliasDeclaration */ || node.kind === 271 /* ImportDeclaration */ || node.kind === 270 /* ImportEqualsDeclaration */ || node.kind === 277 /* ExportDeclaration */ || node.kind === 276 /* ExportAssignment */ || node.kind === 269 /* NamespaceExportDeclaration */ || hasSyntacticModifier(node, 2 /* Ambient */ | 1 /* Export */ | 1024 /* 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 === 242 /* VariableStatement */) {
if (checkGrammarTopLevelElementForRequiredDeclareModifier(decl)) {
return true;
}
}
}
return false;
}
function checkGrammarSourceFile(node) {
return !!(node.flags & 16777216 /* Ambient */) && checkGrammarTopLevelElementsForRequiredDeclareModifier(node);
}
function checkGrammarStatementInAmbientContext(node) {
if (node.flags & 16777216 /* 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 === 240 /* Block */ || node.parent.kind === 267 /* ModuleBlock */ || node.parent.kind === 311 /* 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).indexOf(".") !== -1;
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 (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;
if (node.isTypeOnly && node.name && node.namedBindings) {
return grammarErrorOnNode(node, Diagnostics.A_type_only_import_can_specify_a_default_import_or_named_bindings_but_not_both);
}
if (node.isTypeOnly && ((_a = node.namedBindings) == null ? void 0 : _a.kind) === 274 /* NamedImports */) {
return checkGrammarNamedImportsOrExports(node.namedBindings);
}
return false;
}
function checkGrammarNamedImportsOrExports(namedBindings) {
return !!forEach(namedBindings.elements, (specifier) => {
if (specifier.isTypeOnly) {
return grammarErrorOnFirstToken(
specifier,
specifier.kind === 275 /* 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, Diagnostics.ESM_syntax_is_not_allowed_in_a_CommonJS_module_when_verbatimModuleSyntax_is_enabled);
}
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_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 (moduleKind !== 99 /* ESNext */ && moduleKind !== 199 /* NodeNext */ && moduleKind !== 100 /* Node16 */) {
checkGrammarForDisallowedTrailingComma(nodeArguments);
if (nodeArguments.length > 1) {
const assertionArgument = nodeArguments[1];
return grammarErrorOnNode(assertionArgument, Diagnostics.Dynamic_imports_only_support_a_second_argument_when_the_module_option_is_set_to_esnext_node16_or_nodenext);
}
}
if (nodeArguments.length === 0 || nodeArguments.length > 2) {
return grammarErrorOnNode(node, Diagnostics.Dynamic_imports_can_only_accept_a_module_specifier_and_an_optional_assertion_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 hasSignatures = getSignaturesOfType(source, signatureKind).length > 0 || (signatureKind = 1 /* Construct */, getSignaturesOfType(source, signatureKind).length > 0);
if (hasSignatures) {
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) && isEntityNameExpression(node.expression) ? tryGetNameFromEntityNameExpression(node.expression) : void 0;
}
}
function isNotAccessor(declaration) {
return !isAccessor(declaration);
}
function isNotOverload(declaration) {
return declaration.kind !== 261 /* FunctionDeclaration */ && declaration.kind !== 173 /* MethodDeclaration */ || !!declaration.body;
}
function isDeclarationNameOrImportPropertyName(name) {
switch (name.parent.kind) {
case 275 /* ImportSpecifier */:
case 280 /* ExportSpecifier */:
return isIdentifier(name);
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 = {}));
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: maybeBind(host, host.useCaseSensitiveFileNames),
redirectTargetsMap: host.redirectTargetsMap,
getProjectReferenceRedirect: (fileName) => host.getProjectReferenceRedirect(fileName),
isSourceOfProjectReferenceRedirect: (fileName) => host.isSourceOfProjectReferenceRedirect(fileName),
fileExists: (fileName) => host.fileExists(fileName),
getFileIncludeReasons: () => host.getFileIncludeReasons(),
readFile: host.readFile ? (fileName) => host.readFile(fileName) : void 0
};
}
var SymbolTrackerImpl = class {
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;
if (((_a = this.inner) == null ? void 0 : _a.trackSymbol) && !this.disableTrackSymbol) {
if (this.inner.trackSymbol(symbol, enclosingDeclaration, meaning)) {
this.onDiagnosticReported();
return true;
}
}
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();
}
}
trackReferencedAmbientModule(decl, symbol) {
var _a;
if ((_a = this.inner) == null ? void 0 : _a.trackReferencedAmbientModule) {
this.onDiagnosticReported();
this.inner.trackReferencedAmbientModule(decl, symbol);
}
}
trackExternalModuleSymbolOfImportTypeNode(symbol) {
var _a;
if ((_a = this.inner) == null ? void 0 : _a.trackExternalModuleSymbolOfImportTypeNode) {
this.onDiagnosticReported();
this.inner.trackExternalModuleSymbolOfImportTypeNode(symbol);
}
}
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);
}
}
reportImportTypeNodeResolutionModeOverride() {
var _a;
if ((_a = this.inner) == null ? void 0 : _a.reportImportTypeNodeResolutionModeOverride) {
this.onDiagnosticReported();
this.inner.reportImportTypeNodeResolutionModeOverride();
}
}
onDiagnosticReported() {
this.context.reportedDiagnostic = true;
}
};
// 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, start2, count) {
if (nodes === void 0) {
return nodes;
}
const length2 = nodes.length;
if (start2 === void 0 || start2 < 0) {
start2 = 0;
}
if (count === void 0 || count > length2 - start2) {
count = length2 - start2;
}
let hasTrailingComma;
let pos = -1;
let end = -1;
if (start2 > 0 || count < length2) {
hasTrailingComma = nodes.hasTrailingComma && start2 + count === length2;
} else {
pos = nodes.pos;
end = nodes.end;
hasTrailingComma = nodes.hasTrailingComma;
}
const updated = visitArrayWorker(nodes, visitor, test, start2, count);
if (updated !== nodes) {
const updatedArray = factory.createNodeArray(updated, hasTrailingComma);
setTextRangePosEnd(updatedArray, pos, end);
return updatedArray;
}
return nodes;
}
function visitArray(nodes, visitor, test, start2, count) {
if (nodes === void 0) {
return nodes;
}
const length2 = nodes.length;
if (start2 === void 0 || start2 < 0) {
start2 = 0;
}
if (count === void 0 || count > length2 - start2) {
count = length2 - start2;
}
return visitArrayWorker(nodes, visitor, test, start2, count);
}
function visitArrayWorker(nodes, visitor, test, start2, count) {
let updated;
const length2 = nodes.length;
if (start2 > 0 || count < length2) {
updated = [];
}
for (let i = 0; i < count; i++) {
const node = nodes[i + start2];
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, start2, ensureUseStrict, nodesVisitor = visitNodes2) {
context.startLexicalEnvironment();
statements = nodesVisitor(statements, visitor, isStatement, start2);
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, 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 = {
[165 /* 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))
);
},
[166 /* ComputedPropertyName */]: function visitEachChildOfComputedPropertyName(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateComputedPropertyName(
node,
Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression))
);
},
// Signature elements
[167 /* 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)
);
},
[168 /* 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)
);
},
[169 /* Decorator */]: function visitEachChildOfDecorator(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateDecorator(
node,
Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression))
);
},
// Type elements
[170 /* 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)
);
},
[171 /* 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)
);
},
[172 /* 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)
);
},
[173 /* 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)
);
},
[175 /* 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)
);
},
[176 /* 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)
);
},
[177 /* 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)
);
},
[174 /* ClassStaticBlockDeclaration */]: function visitEachChildOfClassStaticBlockDeclaration(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
context.startLexicalEnvironment();
context.suspendLexicalEnvironment();
return context.factory.updateClassStaticBlockDeclaration(
node,
visitFunctionBody(node.body, visitor, context, nodeVisitor)
);
},
[178 /* 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)
);
},
[179 /* 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)
);
},
[180 /* 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
[181 /* 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)
);
},
[182 /* 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)
);
},
[183 /* 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))
);
},
[184 /* 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))
);
},
[185 /* 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)
);
},
[186 /* TypeLiteral */]: function visitEachChildOfTypeLiteralNode(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) {
return context.factory.updateTypeLiteralNode(
node,
nodesVisitor(node.members, visitor, isTypeElement)
);
},
[187 /* ArrayType */]: function visitEachChildOfArrayTypeNode(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateArrayTypeNode(
node,
Debug.checkDefined(nodeVisitor(node.elementType, visitor, isTypeNode))
);
},
[188 /* TupleType */]: function visitEachChildOfTupleTypeNode(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) {
return context.factory.updateTupleTypeNode(
node,
nodesVisitor(node.elements, visitor, isTypeNode)
);
},
[189 /* OptionalType */]: function visitEachChildOfOptionalTypeNode(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateOptionalTypeNode(
node,
Debug.checkDefined(nodeVisitor(node.type, visitor, isTypeNode))
);
},
[190 /* RestType */]: function visitEachChildOfRestTypeNode(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateRestTypeNode(
node,
Debug.checkDefined(nodeVisitor(node.type, visitor, isTypeNode))
);
},
[191 /* UnionType */]: function visitEachChildOfUnionTypeNode(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) {
return context.factory.updateUnionTypeNode(
node,
nodesVisitor(node.types, visitor, isTypeNode)
);
},
[192 /* IntersectionType */]: function visitEachChildOfIntersectionTypeNode(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) {
return context.factory.updateIntersectionTypeNode(
node,
nodesVisitor(node.types, visitor, isTypeNode)
);
},
[193 /* 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))
);
},
[194 /* InferType */]: function visitEachChildOfInferTypeNode(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateInferTypeNode(
node,
Debug.checkDefined(nodeVisitor(node.typeParameter, visitor, isTypeParameterDeclaration))
);
},
[204 /* ImportType */]: function visitEachChildOfImportTypeNode(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateImportTypeNode(
node,
Debug.checkDefined(nodeVisitor(node.argument, visitor, isTypeNode)),
nodeVisitor(node.assertions, visitor, isImportTypeAssertionContainer),
nodeVisitor(node.qualifier, visitor, isEntityName),
nodesVisitor(node.typeArguments, visitor, isTypeNode),
node.isTypeOf
);
},
[301 /* ImportTypeAssertionContainer */]: function visitEachChildOfImportTypeAssertionContainer(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateImportTypeAssertionContainer(
node,
Debug.checkDefined(nodeVisitor(node.assertClause, visitor, isAssertClause)),
node.multiLine
);
},
[201 /* 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))
);
},
[195 /* ParenthesizedType */]: function visitEachChildOfParenthesizedType(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateParenthesizedType(
node,
Debug.checkDefined(nodeVisitor(node.type, visitor, isTypeNode))
);
},
[197 /* TypeOperator */]: function visitEachChildOfTypeOperatorNode(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateTypeOperatorNode(
node,
Debug.checkDefined(nodeVisitor(node.type, visitor, isTypeNode))
);
},
[198 /* 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))
);
},
[199 /* 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)
);
},
[200 /* LiteralType */]: function visitEachChildOfLiteralTypeNode(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateLiteralTypeNode(
node,
Debug.checkDefined(nodeVisitor(node.literal, visitor, isLiteralTypeLiteral))
);
},
[202 /* 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)
);
},
[203 /* 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
[205 /* ObjectBindingPattern */]: function visitEachChildOfObjectBindingPattern(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) {
return context.factory.updateObjectBindingPattern(
node,
nodesVisitor(node.elements, visitor, isBindingElement)
);
},
[206 /* ArrayBindingPattern */]: function visitEachChildOfArrayBindingPattern(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) {
return context.factory.updateArrayBindingPattern(
node,
nodesVisitor(node.elements, visitor, isArrayBindingElement)
);
},
[207 /* 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
[208 /* ArrayLiteralExpression */]: function visitEachChildOfArrayLiteralExpression(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) {
return context.factory.updateArrayLiteralExpression(
node,
nodesVisitor(node.elements, visitor, isExpression)
);
},
[209 /* ObjectLiteralExpression */]: function visitEachChildOfObjectLiteralExpression(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) {
return context.factory.updateObjectLiteralExpression(
node,
nodesVisitor(node.properties, visitor, isObjectLiteralElementLike)
);
},
[210 /* 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))
);
},
[211 /* 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))
);
},
[212 /* 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)
);
},
[213 /* 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)
);
},
[214 /* 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))
);
},
[215 /* 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))
);
},
[216 /* ParenthesizedExpression */]: function visitEachChildOfParenthesizedExpression(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateParenthesizedExpression(
node,
Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression))
);
},
[217 /* 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)
);
},
[218 /* 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)
);
},
[219 /* DeleteExpression */]: function visitEachChildOfDeleteExpression(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateDeleteExpression(
node,
Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression))
);
},
[220 /* TypeOfExpression */]: function visitEachChildOfTypeOfExpression(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateTypeOfExpression(
node,
Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression))
);
},
[221 /* VoidExpression */]: function visitEachChildOfVoidExpression(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateVoidExpression(
node,
Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression))
);
},
[222 /* AwaitExpression */]: function visitEachChildOfAwaitExpression(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateAwaitExpression(
node,
Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression))
);
},
[223 /* PrefixUnaryExpression */]: function visitEachChildOfPrefixUnaryExpression(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updatePrefixUnaryExpression(
node,
Debug.checkDefined(nodeVisitor(node.operand, visitor, isExpression))
);
},
[224 /* PostfixUnaryExpression */]: function visitEachChildOfPostfixUnaryExpression(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updatePostfixUnaryExpression(
node,
Debug.checkDefined(nodeVisitor(node.operand, visitor, isExpression))
);
},
[225 /* 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))
);
},
[226 /* 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))
);
},
[227 /* 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)
);
},
[228 /* 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)
);
},
[229 /* SpreadElement */]: function visitEachChildOfSpreadElement(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateSpreadElement(
node,
Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression))
);
},
[230 /* 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)
);
},
[232 /* 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)
);
},
[233 /* 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))
);
},
[237 /* 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))
);
},
[234 /* 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))
);
},
[235 /* MetaProperty */]: function visitEachChildOfMetaProperty(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateMetaProperty(
node,
Debug.checkDefined(nodeVisitor(node.name, visitor, isIdentifier))
);
},
// Misc
[238 /* 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
[240 /* Block */]: function visitEachChildOfBlock(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) {
return context.factory.updateBlock(
node,
nodesVisitor(node.statements, visitor, isStatement)
);
},
[242 /* 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))
);
},
[243 /* ExpressionStatement */]: function visitEachChildOfExpressionStatement(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateExpressionStatement(
node,
Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression))
);
},
[244 /* 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)
);
},
[245 /* 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))
);
},
[246 /* 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)
);
},
[247 /* 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)
);
},
[248 /* 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)
);
},
[249 /* 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)
);
},
[250 /* ContinueStatement */]: function visitEachChildOfContinueStatement(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateContinueStatement(
node,
nodeVisitor(node.label, visitor, isIdentifier)
);
},
[251 /* BreakStatement */]: function visitEachChildOfBreakStatement(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateBreakStatement(
node,
nodeVisitor(node.label, visitor, isIdentifier)
);
},
[252 /* ReturnStatement */]: function visitEachChildOfReturnStatement(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateReturnStatement(
node,
nodeVisitor(node.expression, visitor, isExpression)
);
},
[253 /* 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))
);
},
[254 /* 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))
);
},
[255 /* 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))
);
},
[256 /* ThrowStatement */]: function visitEachChildOfThrowStatement(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateThrowStatement(
node,
Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression))
);
},
[257 /* 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)
);
},
[259 /* 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)
);
},
[260 /* VariableDeclarationList */]: function visitEachChildOfVariableDeclarationList(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) {
return context.factory.updateVariableDeclarationList(
node,
nodesVisitor(node.declarations, visitor, isVariableDeclaration)
);
},
[261 /* 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)
);
},
[262 /* 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)
);
},
[263 /* 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)
);
},
[264 /* 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))
);
},
[265 /* 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)
);
},
[266 /* 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)
);
},
[267 /* ModuleBlock */]: function visitEachChildOfModuleBlock(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) {
return context.factory.updateModuleBlock(
node,
nodesVisitor(node.statements, visitor, isStatement)
);
},
[268 /* CaseBlock */]: function visitEachChildOfCaseBlock(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) {
return context.factory.updateCaseBlock(
node,
nodesVisitor(node.clauses, visitor, isCaseOrDefaultClause)
);
},
[269 /* NamespaceExportDeclaration */]: function visitEachChildOfNamespaceExportDeclaration(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateNamespaceExportDeclaration(
node,
Debug.checkDefined(nodeVisitor(node.name, visitor, isIdentifier))
);
},
[270 /* 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))
);
},
[271 /* 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.assertClause, visitor, isAssertClause)
);
},
[299 /* AssertClause */]: function visitEachChildOfAssertClause(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) {
return context.factory.updateAssertClause(
node,
nodesVisitor(node.elements, visitor, isAssertEntry),
node.multiLine
);
},
[300 /* AssertEntry */]: function visitEachChildOfAssertEntry(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateAssertEntry(
node,
Debug.checkDefined(nodeVisitor(node.name, visitor, isAssertionKey)),
Debug.checkDefined(nodeVisitor(node.value, visitor, isExpression))
);
},
[272 /* ImportClause */]: function visitEachChildOfImportClause(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateImportClause(
node,
node.isTypeOnly,
nodeVisitor(node.name, visitor, isIdentifier),
nodeVisitor(node.namedBindings, visitor, isNamedImportBindings)
);
},
[273 /* NamespaceImport */]: function visitEachChildOfNamespaceImport(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateNamespaceImport(
node,
Debug.checkDefined(nodeVisitor(node.name, visitor, isIdentifier))
);
},
[279 /* NamespaceExport */]: function visitEachChildOfNamespaceExport(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateNamespaceExport(
node,
Debug.checkDefined(nodeVisitor(node.name, visitor, isIdentifier))
);
},
[274 /* NamedImports */]: function visitEachChildOfNamedImports(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) {
return context.factory.updateNamedImports(
node,
nodesVisitor(node.elements, visitor, isImportSpecifier)
);
},
[275 /* ImportSpecifier */]: function visitEachChildOfImportSpecifier(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateImportSpecifier(
node,
node.isTypeOnly,
nodeVisitor(node.propertyName, visitor, isIdentifier),
Debug.checkDefined(nodeVisitor(node.name, visitor, isIdentifier))
);
},
[276 /* 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))
);
},
[277 /* 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.assertClause, visitor, isAssertClause)
);
},
[278 /* NamedExports */]: function visitEachChildOfNamedExports(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) {
return context.factory.updateNamedExports(
node,
nodesVisitor(node.elements, visitor, isExportSpecifier)
);
},
[280 /* ExportSpecifier */]: function visitEachChildOfExportSpecifier(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateExportSpecifier(
node,
node.isTypeOnly,
nodeVisitor(node.propertyName, visitor, isIdentifier),
Debug.checkDefined(nodeVisitor(node.name, visitor, isIdentifier))
);
},
// Module references
[282 /* ExternalModuleReference */]: function visitEachChildOfExternalModuleReference(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateExternalModuleReference(
node,
Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression))
);
},
// JSX
[283 /* 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))
);
},
[284 /* 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))
);
},
[285 /* 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))
);
},
[286 /* JsxClosingElement */]: function visitEachChildOfJsxClosingElement(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateJsxClosingElement(
node,
Debug.checkDefined(nodeVisitor(node.tagName, visitor, isJsxTagNameExpression))
);
},
[294 /* 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))
);
},
[287 /* 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))
);
},
[290 /* 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)
);
},
[291 /* JsxAttributes */]: function visitEachChildOfJsxAttributes(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) {
return context.factory.updateJsxAttributes(
node,
nodesVisitor(node.properties, visitor, isJsxAttributeLike)
);
},
[292 /* JsxSpreadAttribute */]: function visitEachChildOfJsxSpreadAttribute(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateJsxSpreadAttribute(
node,
Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression))
);
},
[293 /* JsxExpression */]: function visitEachChildOfJsxExpression(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateJsxExpression(
node,
nodeVisitor(node.expression, visitor, isExpression)
);
},
// Clauses
[295 /* 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)
);
},
[296 /* DefaultClause */]: function visitEachChildOfDefaultClause(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) {
return context.factory.updateDefaultClause(
node,
nodesVisitor(node.statements, visitor, isStatement)
);
},
[297 /* HeritageClause */]: function visitEachChildOfHeritageClause(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) {
return context.factory.updateHeritageClause(
node,
nodesVisitor(node.types, visitor, isExpressionWithTypeArguments)
);
},
[298 /* 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
[302 /* 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))
);
},
[303 /* 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)
);
},
[304 /* SpreadAssignment */]: function visitEachChildOfSpreadAssignment(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateSpreadAssignment(
node,
Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression))
);
},
// Enum
[305 /* 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
[311 /* SourceFile */]: function visitEachChildOfSourceFile(node, visitor, context, _nodesVisitor, _nodeVisitor, _tokenVisitor) {
return context.factory.updateSourceFile(
node,
visitLexicalEnvironment(node.statements, visitor, context)
);
},
// Transformation nodes
[359 /* PartiallyEmittedExpression */]: function visitEachChildOfPartiallyEmittedExpression(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updatePartiallyEmittedExpression(
node,
Debug.checkDefined(nodeVisitor(node.expression, visitor, isExpression))
);
},
[360 /* 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, start2, 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 (start2 && (raw.generatedLine < start2.line || start2.line === raw.generatedLine && raw.generatedCharacter < start2.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 - (start2 ? start2.line : 0);
const newGeneratedLine = rawGeneratedLine + generatedLine;
const rawGeneratedCharacter = start2 && start2.line === raw.generatedLine ? raw.generatedCharacter - start2.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 getLineInfo(text, lineStarts) {
return {
getLineCount: () => lineStarts.length,
getLineText: (line) => text.substring(lineStarts[line], lineStarts[line + 1])
};
}
function tryGetSourceMappingURL(lineInfo) {
for (let index = lineInfo.getLineCount() - 1; index >= 0; index--) {
const line = lineInfo.getLineText(index);
const comment = sourceMapCommentRegExp.exec(line);
if (comment) {
return trimStringEnd(comment[1]);
} else if (!line.match(whitespaceOrMapCommentRegExp)) {
break;
}
}
}
function isStringOrNull(x) {
return typeof x === "string" || x === null;
}
function isRawSourceMap(x) {
return x !== null && typeof x === "object" && x.version === 3 && typeof x.file === "string" && typeof x.mappings === "string" && isArray(x.sources) && every(x.sources, isString) && (x.sourceRoot === void 0 || x.sourceRoot === null || typeof x.sourceRoot === "string") && (x.sourcesContent === void 0 || x.sourcesContent === null || isArray(x.sourcesContent) && every(x.sourcesContent, isStringOrNull)) && (x.names === void 0 || x.names === null || isArray(x.names) && every(x.names, isString));
}
function tryParseRawSourceMap(text) {
try {
const parsed = JSON.parse(text);
if (isRawSourceMap(parsed)) {
return parsed;
}
} catch {
}
return void 0;
}
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 sameMapping(left, right) {
return left === right || left.generatedLine === right.generatedLine && left.generatedCharacter === right.generatedCharacter && left.sourceIndex === right.sourceIndex && left.sourceLine === right.sourceLine && left.sourceCharacter === right.sourceCharacter && left.nameIndex === right.nameIndex;
}
function isSourceMapping(mapping) {
return mapping.sourceIndex !== void 0 && mapping.sourceLine !== void 0 && mapping.sourceCharacter !== void 0;
}
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;
}
function isSourceMappedPosition(value) {
return value.sourceIndex !== void 0 && value.sourcePosition !== void 0;
}
function sameMappedPosition(left, right) {
return left.generatedPosition === right.generatedPosition && left.sourceIndex === right.sourceIndex && left.sourcePosition === right.sourcePosition;
}
function compareSourcePositions(left, right) {
Debug.assert(left.sourceIndex === right.sourceIndex);
return compareValues(left.sourcePosition, right.sourcePosition);
}
function compareGeneratedPositions(left, right) {
return compareValues(left.generatedPosition, right.generatedPosition);
}
function getSourcePositionOfMapping(value) {
return value.sourcePosition;
}
function getGeneratedPositionOfMapping(value) {
return value.generatedPosition;
}
function createDocumentPositionMapper(host, map2, mapPath) {
const mapDirectory = getDirectoryPath(mapPath);
const sourceRoot = map2.sourceRoot ? getNormalizedAbsolutePath(map2.sourceRoot, mapDirectory) : mapDirectory;
const generatedAbsoluteFilePath = getNormalizedAbsolutePath(map2.file, mapDirectory);
const generatedFile = host.getSourceFileLike(generatedAbsoluteFilePath);
const sourceFileAbsolutePaths = map2.sources.map((source) => getNormalizedAbsolutePath(source, sourceRoot));
const sourceToSourceIndexMap = new Map(sourceFileAbsolutePaths.map((source, i) => [host.getCanonicalFileName(source), i]));
let decodedMappings;
let generatedMappings;
let sourceMappings;
return {
getSourcePosition,
getGeneratedPosition
};
function processMapping(mapping) {
const generatedPosition = generatedFile !== void 0 ? getPositionOfLineAndCharacter(
generatedFile,
mapping.generatedLine,
mapping.generatedCharacter,
/*allowEdits*/
true
) : -1;
let source;
let sourcePosition;
if (isSourceMapping(mapping)) {
const sourceFile = host.getSourceFileLike(sourceFileAbsolutePaths[mapping.sourceIndex]);
source = map2.sources[mapping.sourceIndex];
sourcePosition = sourceFile !== void 0 ? getPositionOfLineAndCharacter(
sourceFile,
mapping.sourceLine,
mapping.sourceCharacter,
/*allowEdits*/
true
) : -1;
}
return {
generatedPosition,
source,
sourceIndex: mapping.sourceIndex,
sourcePosition,
nameIndex: mapping.nameIndex
};
}
function getDecodedMappings() {
if (decodedMappings === void 0) {
const decoder = decodeMappings(map2.mappings);
const mappings = arrayFrom(decoder, processMapping);
if (decoder.error !== void 0) {
if (host.log) {
host.log(`Encountered error while decoding sourcemap: ${decoder.error}`);
}
decodedMappings = emptyArray;
} else {
decodedMappings = mappings;
}
}
return decodedMappings;
}
function getSourceMappings(sourceIndex) {
if (sourceMappings === void 0) {
const lists = [];
for (const mapping of getDecodedMappings()) {
if (!isSourceMappedPosition(mapping))
continue;
let list = lists[mapping.sourceIndex];
if (!list)
lists[mapping.sourceIndex] = list = [];
list.push(mapping);
}
sourceMappings = lists.map((list) => sortAndDeduplicate(list, compareSourcePositions, sameMappedPosition));
}
return sourceMappings[sourceIndex];
}
function getGeneratedMappings() {
if (generatedMappings === void 0) {
const list = [];
for (const mapping of getDecodedMappings()) {
list.push(mapping);
}
generatedMappings = sortAndDeduplicate(list, compareGeneratedPositions, sameMappedPosition);
}
return generatedMappings;
}
function getGeneratedPosition(loc) {
const sourceIndex = sourceToSourceIndexMap.get(host.getCanonicalFileName(loc.fileName));
if (sourceIndex === void 0)
return loc;
const sourceMappings2 = getSourceMappings(sourceIndex);
if (!some(sourceMappings2))
return loc;
let targetIndex = binarySearchKey(sourceMappings2, loc.pos, getSourcePositionOfMapping, compareValues);
if (targetIndex < 0) {
targetIndex = ~targetIndex;
}
const mapping = sourceMappings2[targetIndex];
if (mapping === void 0 || mapping.sourceIndex !== sourceIndex) {
return loc;
}
return { fileName: generatedAbsoluteFilePath, pos: mapping.generatedPosition };
}
function getSourcePosition(loc) {
const generatedMappings2 = getGeneratedMappings();
if (!some(generatedMappings2))
return loc;
let targetIndex = binarySearchKey(generatedMappings2, loc.pos, getGeneratedPositionOfMapping, compareValues);
if (targetIndex < 0) {
targetIndex = ~targetIndex;
}
const mapping = generatedMappings2[targetIndex];
if (mapping === void 0 || !isSourceMappedPosition(mapping)) {
return loc;
}
return { fileName: sourceFileAbsolutePaths[mapping.sourceIndex], pos: mapping.sourcePosition };
}
}
var identitySourceMapConsumer = {
getSourcePosition: identity,
getGeneratedPosition: identity
};
// 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))
return false;
return some(node.elements, isNamedDefaultReference);
}
function isNamedDefaultReference(e) {
return e.propertyName !== void 0 && e.propertyName.escapedText === "default" /* Default */;
}
function chainBundle(context, transformSourceFile) {
return transformSourceFileOrBundle;
function transformSourceFileOrBundle(node) {
return node.kind === 311 /* SourceFile */ ? transformSourceFile(node) : transformBundle(node);
}
function transformBundle(node) {
return context.factory.createBundle(map(node.sourceFiles, transformSourceFile), node.prepends);
}
}
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, resolver, compilerOptions) {
const externalImports = [];
const exportSpecifiers = createMultiMap();
const exportedBindings = [];
const uniqueExports = /* @__PURE__ */ new Map();
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 271 /* ImportDeclaration */:
externalImports.push(node);
if (!hasImportStar && getImportNeedsImportStarHelper(node)) {
hasImportStar = true;
}
if (!hasImportDefault && getImportNeedsImportDefaultHelper(node)) {
hasImportDefault = true;
}
break;
case 270 /* ImportEqualsDeclaration */:
if (node.moduleReference.kind === 282 /* ExternalModuleReference */) {
externalImports.push(node);
}
break;
case 277 /* ExportDeclaration */:
if (node.moduleSpecifier) {
if (!node.exportClause) {
externalImports.push(node);
hasExportStarsToExportValues = true;
} else {
externalImports.push(node);
if (isNamedExports(node.exportClause)) {
addExportedNamesForExportDeclaration(node);
} else {
const name = node.exportClause.name;
if (!uniqueExports.get(idText(name))) {
multiMapSparseArrayAdd(exportedBindings, getOriginalNodeId(node), name);
uniqueExports.set(idText(name), true);
exportedNames = append(exportedNames, name);
}
hasImportStar = true;
}
}
} else {
addExportedNamesForExportDeclaration(node);
}
break;
case 276 /* ExportAssignment */:
if (node.isExportEquals && !exportEquals) {
exportEquals = node;
}
break;
case 242 /* VariableStatement */:
if (hasSyntacticModifier(node, 1 /* Export */)) {
for (const decl of node.declarationList.declarations) {
exportedNames = collectExportedVariableInfo(decl, uniqueExports, exportedNames, exportedBindings);
}
}
break;
case 261 /* FunctionDeclaration */:
if (hasSyntacticModifier(node, 1 /* Export */)) {
if (hasSyntacticModifier(node, 1024 /* Default */)) {
if (!hasExportDefault) {
multiMapSparseArrayAdd(exportedBindings, getOriginalNodeId(node), context.factory.getDeclarationName(node));
hasExportDefault = true;
}
} else {
const name = node.name;
if (!uniqueExports.get(idText(name))) {
multiMapSparseArrayAdd(exportedBindings, getOriginalNodeId(node), name);
uniqueExports.set(idText(name), true);
exportedNames = append(exportedNames, name);
}
}
}
break;
case 262 /* ClassDeclaration */:
if (hasSyntacticModifier(node, 1 /* Export */)) {
if (hasSyntacticModifier(node, 1024 /* 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, externalHelpersImportDeclaration };
function addExportedNamesForExportDeclaration(node) {
for (const specifier of cast(node.exportClause, isNamedExports).elements) {
if (!uniqueExports.get(idText(specifier.name))) {
const name = specifier.propertyName || specifier.name;
if (!node.moduleSpecifier) {
exportSpecifiers.add(idText(name), specifier);
}
const decl = resolver.getReferencedImportDeclaration(name) || resolver.getReferencedValueDeclaration(name);
if (decl) {
multiMapSparseArrayAdd(exportedBindings, getOriginalNodeId(decl), specifier.name);
}
uniqueExports.set(idText(specifier.name), true);
exportedNames = append(exportedNames, specifier.name);
}
}
}
}
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;
}
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 findSuperStatementIndex(statements, indexAfterLastPrologueStatement) {
for (let i = indexAfterLastPrologueStatement; i < statements.length; i += 1) {
const statement = statements[i];
if (getSuperCallFromStatement(statement)) {
return i;
}
}
return -1;
}
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 === 171 /* 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) {
const decorators = getDecorators(node);
const parameters = getDecoratorsOfParameters(getFirstConstructorWithBody(node));
if (!some(decorators) && !some(parameters)) {
return void 0;
}
return {
decorators,
parameters
};
}
function getAllDecoratorsOfClassElement(member, parent2, useLegacyDecorators) {
switch (member.kind) {
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
if (!useLegacyDecorators) {
return getAllDecoratorsOfMethod(member);
}
return getAllDecoratorsOfAccessors(member, parent2);
case 173 /* MethodDeclaration */:
return getAllDecoratorsOfMethod(member);
case 171 /* PropertyDeclaration */:
return getAllDecoratorsOfProperty(member);
default:
return void 0;
}
}
function getAllDecoratorsOfAccessors(accessor, parent2) {
if (!accessor.body) {
return void 0;
}
const { firstAccessor, secondAccessor, getAccessor, setAccessor } = getAllAccessorDeclarations(parent2.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 = getDecoratorsOfParameters(setAccessor);
if (!some(decorators) && !some(parameters)) {
return void 0;
}
return {
decorators,
parameters,
getDecorators: getAccessor && getDecorators(getAccessor),
setDecorators: setAccessor && getDecorators(setAccessor)
};
}
function getAllDecoratorsOfMethod(method) {
if (!method.body) {
return void 0;
}
const decorators = getDecorators(method);
const parameters = getDecoratorsOfParameters(method);
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));
}
// src/compiler/transformers/destructuring.ts
var FlattenLevel = /* @__PURE__ */ ((FlattenLevel2) => {
FlattenLevel2[FlattenLevel2["All"] = 0] = "All";
FlattenLevel2[FlattenLevel2["ObjectRest"] = 1] = "ObjectRest";
return FlattenLevel2;
})(FlattenLevel || {});
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, parent2, pattern, value, location) {
const elements = getElementsOfBindingOrAssignmentPattern(pattern);
const numElements = elements.length;
if (numElements !== 1) {
const reuseIdentifierExpressions = !isDeclarationBindingElement(parent2) || 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, parent2, 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(parent2) || 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)) {
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/taggedTemplate.ts
var ProcessLevel = /* @__PURE__ */ ((ProcessLevel2) => {
ProcessLevel2[ProcessLevel2["LiftRestriction"] = 0] = "LiftRestriction";
ProcessLevel2[ProcessLevel2["All"] = 1] = "All";
return ProcessLevel2;
})(ProcessLevel || {});
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(210 /* PropertyAccessExpression */);
context.enableSubstitution(211 /* ElementAccessExpression */);
let currentSourceFile;
let currentNamespace;
let currentNamespaceContainerName;
let currentLexicalScope;
let currentScopeFirstDeclarationsOfName;
let currentClassHasParameterProperties;
let enabledSubstitutions;
let applicableSubstitutions;
return transformSourceFileOrBundle;
function transformSourceFileOrBundle(node) {
if (node.kind === 312 /* Bundle */) {
return transformBundle(node);
}
return transformSourceFile(node);
}
function transformBundle(node) {
return factory2.createBundle(node.sourceFiles.map(transformSourceFile), mapDefined(node.prepends, (prepend) => {
if (prepend.kind === 314 /* InputFiles */) {
return createUnparsedSourceFile(prepend, "js");
}
return prepend;
}));
}
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;
const savedCurrentClassHasParameterProperties = currentClassHasParameterProperties;
onBeforeVisitNode(node);
const visited = f(node);
if (currentLexicalScope !== savedCurrentScope) {
currentScopeFirstDeclarationsOfName = savedCurrentScopeFirstDeclarationsOfName;
}
currentLexicalScope = savedCurrentScope;
currentClassHasParameterProperties = savedCurrentClassHasParameterProperties;
return visited;
}
function onBeforeVisitNode(node) {
switch (node.kind) {
case 311 /* SourceFile */:
case 268 /* CaseBlock */:
case 267 /* ModuleBlock */:
case 240 /* Block */:
currentLexicalScope = node;
currentScopeFirstDeclarationsOfName = void 0;
break;
case 262 /* ClassDeclaration */:
case 261 /* FunctionDeclaration */:
if (hasSyntacticModifier(node, 2 /* Ambient */)) {
break;
}
if (node.name) {
recordEmittedDeclarationInScope(node);
} else {
Debug.assert(node.kind === 262 /* ClassDeclaration */ || hasSyntacticModifier(node, 1024 /* 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 271 /* ImportDeclaration */:
case 270 /* ImportEqualsDeclaration */:
case 276 /* ExportAssignment */:
case 277 /* ExportDeclaration */:
return visitElidableStatement(node);
default:
return visitorWorker(node);
}
}
function visitElidableStatement(node) {
const parsed = getParseTreeNode(node);
if (parsed !== node) {
if (node.transformFlags & 1 /* ContainsTypeScript */) {
return visitEachChild(node, visitor, context);
}
return node;
}
switch (node.kind) {
case 271 /* ImportDeclaration */:
return visitImportDeclaration(node);
case 270 /* ImportEqualsDeclaration */:
return visitImportEqualsDeclaration(node);
case 276 /* ExportAssignment */:
return visitExportAssignment(node);
case 277 /* ExportDeclaration */:
return visitExportDeclaration(node);
default:
Debug.fail("Unhandled ellided statement");
}
}
function namespaceElementVisitor(node) {
return saveStateAndInvoke(node, namespaceElementVisitorWorker);
}
function namespaceElementVisitorWorker(node) {
if (node.kind === 277 /* ExportDeclaration */ || node.kind === 271 /* ImportDeclaration */ || node.kind === 272 /* ImportClause */ || node.kind === 270 /* ImportEqualsDeclaration */ && node.moduleReference.kind === 282 /* ExternalModuleReference */) {
return void 0;
} else if (node.transformFlags & 1 /* ContainsTypeScript */ || hasSyntacticModifier(node, 1 /* Export */)) {
return visitTypeScript(node);
}
return node;
}
function getClassElementVisitor(parent2) {
return (node) => saveStateAndInvoke(node, (n) => classElementVisitorWorker(n, parent2));
}
function classElementVisitorWorker(node, parent2) {
switch (node.kind) {
case 175 /* Constructor */:
return visitConstructor(node);
case 171 /* PropertyDeclaration */:
return visitPropertyDeclaration(node, parent2);
case 176 /* GetAccessor */:
return visitGetAccessor(node, parent2);
case 177 /* SetAccessor */:
return visitSetAccessor(node, parent2);
case 173 /* MethodDeclaration */:
return visitMethodDeclaration(node, parent2);
case 174 /* ClassStaticBlockDeclaration */:
return visitEachChild(node, visitor, context);
case 239 /* SemicolonClassElement */:
return node;
case 180 /* IndexSignature */:
return;
default:
return Debug.failBadSyntaxKind(node);
}
}
function getObjectLiteralElementVisitor(parent2) {
return (node) => saveStateAndInvoke(node, (n) => objectLiteralElementVisitorWorker(n, parent2));
}
function objectLiteralElementVisitorWorker(node, parent2) {
switch (node.kind) {
case 302 /* PropertyAssignment */:
case 303 /* ShorthandPropertyAssignment */:
case 304 /* SpreadAssignment */:
return visitor(node);
case 176 /* GetAccessor */:
return visitGetAccessor(node, parent2);
case 177 /* SetAccessor */:
return visitSetAccessor(node, parent2);
case 173 /* MethodDeclaration */:
return visitMethodDeclaration(node, parent2);
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) & 117086 /* TypeScriptModifier */) {
return void 0;
} else if (currentNamespace && node.kind === 95 /* ExportKeyword */) {
return void 0;
}
return node;
}
function visitTypeScript(node) {
if (isStatement(node) && hasSyntacticModifier(node, 2 /* 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 163 /* OverrideKeyword */:
case 87 /* ConstKeyword */:
case 138 /* DeclareKeyword */:
case 148 /* ReadonlyKeyword */:
case 103 /* InKeyword */:
case 147 /* OutKeyword */:
case 187 /* ArrayType */:
case 188 /* TupleType */:
case 189 /* OptionalType */:
case 190 /* RestType */:
case 186 /* TypeLiteral */:
case 181 /* TypePredicate */:
case 167 /* 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 184 /* ConstructorType */:
case 183 /* FunctionType */:
case 185 /* TypeQuery */:
case 182 /* TypeReference */:
case 191 /* UnionType */:
case 192 /* IntersectionType */:
case 193 /* ConditionalType */:
case 195 /* ParenthesizedType */:
case 196 /* ThisType */:
case 197 /* TypeOperator */:
case 198 /* IndexedAccessType */:
case 199 /* MappedType */:
case 200 /* LiteralType */:
case 180 /* IndexSignature */:
return void 0;
case 264 /* TypeAliasDeclaration */:
return factory2.createNotEmittedStatement(node);
case 269 /* NamespaceExportDeclaration */:
return void 0;
case 263 /* InterfaceDeclaration */:
return factory2.createNotEmittedStatement(node);
case 262 /* ClassDeclaration */:
return visitClassDeclaration(node);
case 230 /* ClassExpression */:
return visitClassExpression(node);
case 297 /* HeritageClause */:
return visitHeritageClause(node);
case 232 /* ExpressionWithTypeArguments */:
return visitExpressionWithTypeArguments(node);
case 209 /* ObjectLiteralExpression */:
return visitObjectLiteralExpression(node);
case 175 /* Constructor */:
case 171 /* PropertyDeclaration */:
case 173 /* MethodDeclaration */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
case 174 /* ClassStaticBlockDeclaration */:
return Debug.fail("Class and object literal elements must be visited with their respective visitors");
case 261 /* FunctionDeclaration */:
return visitFunctionDeclaration(node);
case 217 /* FunctionExpression */:
return visitFunctionExpression(node);
case 218 /* ArrowFunction */:
return visitArrowFunction(node);
case 168 /* Parameter */:
return visitParameter(node);
case 216 /* ParenthesizedExpression */:
return visitParenthesizedExpression(node);
case 215 /* TypeAssertionExpression */:
case 233 /* AsExpression */:
return visitAssertionExpression(node);
case 237 /* SatisfiesExpression */:
return visitSatisfiesExpression(node);
case 212 /* CallExpression */:
return visitCallExpression(node);
case 213 /* NewExpression */:
return visitNewExpression(node);
case 214 /* TaggedTemplateExpression */:
return visitTaggedTemplateExpression(node);
case 234 /* NonNullExpression */:
return visitNonNullExpression(node);
case 265 /* EnumDeclaration */:
return visitEnumDeclaration(node);
case 242 /* VariableStatement */:
return visitVariableStatement(node);
case 259 /* VariableDeclaration */:
return visitVariableDeclaration(node);
case 266 /* ModuleDeclaration */:
return visitModuleDeclaration(node);
case 270 /* ImportEqualsDeclaration */:
return visitImportEqualsDeclaration(node);
case 284 /* JsxSelfClosingElement */:
return visitJsxSelfClosingElement(node);
case 285 /* 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 modifiers2 = facts & 16 /* IsNamedExternalExport */ ? factory2.createModifiersFromModifierFlags(1 /* Export */) : void 0;
const varStatement = factory2.createVariableStatement(
modifiers2,
factory2.createVariableDeclarationList([
factory2.createVariableDeclaration(
factory2.getLocalName(
node,
/*allowComments*/
false,
/*allowSourceMaps*/
false
),
/*exclamationToken*/
void 0,
/*type*/
void 0,
iife
)
], 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 */ && !promoteToIIFE) {
return [
statement,
factory2.createExternalModuleExport(factory2.getLocalName(
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));
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)
));
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 === 173 /* MethodDeclaration */ || kind === 176 /* GetAccessor */ || kind === 177 /* SetAccessor */ || kind === 171 /* PropertyDeclaration */;
}
function shouldAddReturnTypeMetadata(node) {
return node.kind === 173 /* MethodDeclaration */;
}
function shouldAddParamTypesMetadata(node) {
switch (node.kind) {
case 262 /* ClassDeclaration */:
case 230 /* ClassExpression */:
return getFirstConstructorWithBody(node) !== void 0;
case 173 /* MethodDeclaration */:
case 176 /* GetAccessor */:
case 177 /* 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 (isComputedPropertyName(name) && (!hasStaticModifier(member) && currentClassHasParameterProperties || hasDecorators(member) && legacyDecorators)) {
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, parent2) {
const isAmbient = node.flags & 16777216 /* Ambient */ || hasSyntacticModifier(node, 256 /* Abstract */);
if (isAmbient && !(legacyDecorators && hasDecorators(node))) {
return void 0;
}
let modifiers = isClassLike(parent2) ? !isAmbient ? visitNodes2(node.modifiers, visitor, isModifierLike) : visitNodes2(node.modifiers, modifierElidingVisitor, isModifierLike) : visitNodes2(node.modifiers, decoratorElidingVisitor, isModifierLike);
modifiers = injectClassElementTypeMetadata(modifiers, node, parent2);
if (isAmbient) {
return factory2.updatePropertyDeclaration(
node,
concatenate(modifiers, factory2.createModifiersFromModifierFlags(2 /* 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 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 superStatementIndex = findSuperStatementIndex(body.statements, prologueStatementCount);
if (superStatementIndex >= 0) {
addRange(
statements,
visitNodes2(body.statements, visitor, isStatement, prologueStatementCount, superStatementIndex + 1 - prologueStatementCount)
);
}
const parameterPropertyAssignments = mapDefined(parametersWithPropertyAssignments, transformParameterWithPropertyAssignment);
if (superStatementIndex >= 0) {
addRange(statements, parameterPropertyAssignments);
} else {
statements = [
...statements.slice(0, prologueStatementCount),
...parameterPropertyAssignments,
...statements.slice(prologueStatementCount)
];
}
const start2 = superStatementIndex >= 0 ? superStatementIndex + 1 : prologueStatementCount;
addRange(statements, visitNodes2(body.statements, visitor, isStatement, start2));
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, parent2) {
if (!(node.transformFlags & 1 /* ContainsTypeScript */)) {
return node;
}
if (!shouldEmitFunctionLikeDeclaration(node)) {
return void 0;
}
let modifiers = isClassLike(parent2) ? visitNodes2(node.modifiers, visitor, isModifierLike) : visitNodes2(node.modifiers, decoratorElidingVisitor, isModifierLike);
modifiers = injectClassElementTypeMetadata(modifiers, node, parent2);
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, 256 /* Abstract */));
}
function visitGetAccessor(node, parent2) {
if (!(node.transformFlags & 1 /* ContainsTypeScript */)) {
return node;
}
if (!shouldEmitAccessorDeclaration(node)) {
return void 0;
}
let modifiers = isClassLike(parent2) ? visitNodes2(node.modifiers, visitor, isModifierLike) : visitNodes2(node.modifiers, decoratorElidingVisitor, isModifierLike);
modifiers = injectClassElementTypeMetadata(modifiers, node, parent2);
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, parent2) {
if (!(node.transformFlags & 1 /* ContainsTypeScript */)) {
return node;
}
if (!shouldEmitAccessorDeclaration(node)) {
return void 0;
}
let modifiers = isClassLike(parent2) ? visitNodes2(node.modifiers, visitor, isModifierLike) : visitNodes2(node.modifiers, decoratorElidingVisitor, isModifierLike);
modifiers = injectClassElementTypeMetadata(modifiers, node, parent2);
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, ~6 /* Assertions */);
if (isAssertionExpression(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 valueExpression = transformEnumMemberDeclarationValue(member);
const innerAssignment = factory2.createAssignment(
factory2.createElementAccessExpression(
currentNamespaceContainerName,
name
),
valueExpression
);
const outerAssignment = valueExpression.kind === 11 /* StringLiteral */ ? innerAssignment : factory2.createAssignment(
factory2.createElementAccessExpression(
currentNamespaceContainerName,
innerAssignment
),
name
);
return setTextRange(
factory2.createExpressionStatement(
setTextRange(
outerAssignment,
member
)
),
member
);
}
function transformEnumMemberDeclarationValue(member) {
const value = resolver.getConstantValue(member);
if (value !== void 0) {
return typeof value === "string" ? factory2.createStringLiteral(value) : factory2.createNumericLiteral(value);
} 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 === 311 /* 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 === 265 /* 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 === 267 /* 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 !== 267 /* ModuleBlock */) {
setEmitFlags(block, getEmitFlags(block) | 3072 /* NoComments */);
}
return block;
}
function getInnerMostModuleDeclarationFromDottedModule(moduleDeclaration) {
if (moduleDeclaration.body.kind === 266 /* 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 || compilerOptions.importsNotUsedAsValues === 1 /* Preserve */ || compilerOptions.importsNotUsedAsValues === 2 /* Error */ ? factory2.updateImportDeclaration(
node,
/*modifiers*/
void 0,
importClause,
node.moduleSpecifier,
node.assertClause
) : void 0;
}
function visitImportClause(node) {
Debug.assert(!node.isTypeOnly);
const name = shouldEmitAliasDeclaration(node) ? node.name : void 0;
const namedBindings = visitNode(node.namedBindings, visitNamedImportBindings, isNamedImportBindings);
return name || namedBindings ? factory2.updateImportClause(
node,
/*isTypeOnly*/
false,
name,
namedBindings
) : void 0;
}
function visitNamedImportBindings(node) {
if (node.kind === 273 /* NamespaceImport */) {
return shouldEmitAliasDeclaration(node) ? node : void 0;
} else {
const allowEmpty = compilerOptions.verbatimModuleSyntax || compilerOptions.preserveValueImports && (compilerOptions.importsNotUsedAsValues === 1 /* Preserve */ || compilerOptions.importsNotUsedAsValues === 2 /* Error */);
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 node;
}
const allowEmpty = compilerOptions.verbatimModuleSyntax || !!node.moduleSpecifier && (compilerOptions.importsNotUsedAsValues === 1 /* Preserve */ || compilerOptions.importsNotUsedAsValues === 2 /* Error */);
const exportClause = visitNode(
node.exportClause,
(bindings) => visitNamedExportBindings(bindings, allowEmpty),
isNamedExportBindings
);
return exportClause ? factory2.updateExportDeclaration(
node,
/*modifiers*/
void 0,
node.isTypeOnly,
exportClause,
node.moduleSpecifier,
node.assertClause
) : 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)) {
const isReferenced = shouldEmitAliasDeclaration(node);
if (!isReferenced && compilerOptions.importsNotUsedAsValues === 1 /* Preserve */) {
return setOriginalNode(
setTextRange(
factory2.createImportDeclaration(
/*modifiers*/
void 0,
/*importClause*/
void 0,
node.moduleReference.expression,
/*assertClause*/
void 0
),
node
),
node
);
}
return isReferenced ? visitEachChild(node, visitor, context) : void 0;
}
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, 1 /* Export */);
}
function isExternalModuleExport(node) {
return currentNamespace === void 0 && hasSyntacticModifier(node, 1 /* Export */);
}
function isNamedExternalModuleExport(node) {
return isExternalModuleExport(node) && !hasSyntacticModifier(node, 1024 /* Default */);
}
function isDefaultExternalModuleExport(node) {
return isExternalModuleExport(node) && hasSyntacticModifier(node, 1024 /* 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(303 /* ShorthandPropertyAssignment */);
context.enableEmitNotification(266 /* ModuleDeclaration */);
}
}
function isTransformedModuleDeclaration(node) {
return getOriginalNode(node).kind === 266 /* ModuleDeclaration */;
}
function isTransformedEnumDeclaration(node) {
return getOriginalNode(node).kind === 265 /* 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 210 /* PropertyAccessExpression */:
return substitutePropertyAccessExpression(node);
case 211 /* 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 !== 311 /* SourceFile */) {
const substitute = applicableSubstitutions & 2 /* NamespaceExports */ && container.kind === 266 /* ModuleDeclaration */ || applicableSubstitutions & 8 /* NonQualifiedEnumMembers */ && container.kind === 265 /* 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) : 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) || (compilerOptions.preserveValueImports ? resolver.isValueAliasDeclaration(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;
let classAliases;
let pendingExpressions;
let pendingStatements;
let lexicalEnvironment;
const lexicalEnvironmentMap = /* @__PURE__ */ new Map();
let currentClassContainer;
let currentStaticPropertyDeclarationOrStaticBlock;
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 129 /* AccessorKeyword */:
return Debug.fail("Use `modifierVisitor` instead.");
case 262 /* ClassDeclaration */:
return visitClassDeclaration(node);
case 230 /* ClassExpression */:
return visitClassExpression(
node,
/*referencedName*/
void 0
);
case 174 /* ClassStaticBlockDeclaration */:
case 171 /* PropertyDeclaration */:
return Debug.fail("Use `classElementVisitor` instead.");
case 302 /* PropertyAssignment */:
return visitPropertyAssignment(node);
case 242 /* VariableStatement */:
return visitVariableStatement(node);
case 259 /* VariableDeclaration */:
return visitVariableDeclaration(node);
case 168 /* Parameter */:
return visitParameterDeclaration(node);
case 207 /* BindingElement */:
return visitBindingElement(node);
case 276 /* ExportAssignment */:
return visitExportAssignment(node);
case 81 /* PrivateIdentifier */:
return visitPrivateIdentifier(node);
case 210 /* PropertyAccessExpression */:
return visitPropertyAccessExpression(node);
case 211 /* ElementAccessExpression */:
return visitElementAccessExpression(node);
case 223 /* PrefixUnaryExpression */:
case 224 /* PostfixUnaryExpression */:
return visitPreOrPostfixUnaryExpression(
node,
/*discarded*/
false
);
case 225 /* BinaryExpression */:
return visitBinaryExpression(
node,
/*discarded*/
false
);
case 216 /* ParenthesizedExpression */:
return visitParenthesizedExpression(
node,
/*discarded*/
false,
/*referencedName*/
void 0
);
case 212 /* CallExpression */:
return visitCallExpression(node);
case 243 /* ExpressionStatement */:
return visitExpressionStatement(node);
case 214 /* TaggedTemplateExpression */:
return visitTaggedTemplateExpression(node);
case 247 /* ForStatement */:
return visitForStatement(node);
case 261 /* FunctionDeclaration */:
case 217 /* FunctionExpression */:
case 175 /* Constructor */:
case 173 /* MethodDeclaration */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */: {
return setCurrentStaticPropertyDeclarationOrStaticBlockAnd(
/*current*/
void 0,
fallbackVisitor,
node
);
}
default:
return fallbackVisitor(node);
}
}
function fallbackVisitor(node) {
return visitEachChild(node, visitor, context);
}
function namedEvaluationVisitor(node, referencedName) {
switch (node.kind) {
case 359 /* PartiallyEmittedExpression */:
return visitPartiallyEmittedExpression(
node,
/*discarded*/
false,
referencedName
);
case 216 /* ParenthesizedExpression */:
return visitParenthesizedExpression(
node,
/*discarded*/
false,
referencedName
);
case 230 /* ClassExpression */:
return visitClassExpression(node, referencedName);
default:
return visitor(node);
}
}
function discardedValueVisitor(node) {
switch (node.kind) {
case 223 /* PrefixUnaryExpression */:
case 224 /* PostfixUnaryExpression */:
return visitPreOrPostfixUnaryExpression(
node,
/*discarded*/
true
);
case 225 /* BinaryExpression */:
return visitBinaryExpression(
node,
/*discarded*/
true
);
case 360 /* CommaListExpression */:
return visitCommaListExpression(
node,
/*discarded*/
true
);
case 216 /* ParenthesizedExpression */:
return visitParenthesizedExpression(
node,
/*discarded*/
true,
/*referencedName*/
void 0
);
default:
return visitor(node);
}
}
function heritageClauseVisitor(node) {
switch (node.kind) {
case 297 /* HeritageClause */:
return visitEachChild(node, heritageClauseVisitor, context);
case 232 /* ExpressionWithTypeArguments */:
return visitExpressionWithTypeArgumentsInHeritageClause(node);
default:
return visitor(node);
}
}
function assignmentTargetVisitor(node) {
switch (node.kind) {
case 209 /* ObjectLiteralExpression */:
case 208 /* ArrayLiteralExpression */:
return visitAssignmentPattern(node);
default:
return visitor(node);
}
}
function classElementVisitor(node) {
switch (node.kind) {
case 175 /* Constructor */:
return visitConstructorDeclaration(node);
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
case 173 /* MethodDeclaration */:
return setCurrentStaticPropertyDeclarationOrStaticBlockAnd(
/*current*/
void 0,
visitMethodOrAccessorDeclaration,
node
);
case 171 /* PropertyDeclaration */:
return setCurrentStaticPropertyDeclarationOrStaticBlockAnd(
/*current*/
void 0,
visitPropertyDeclaration,
node
);
case 174 /* ClassStaticBlockDeclaration */:
return visitClassStaticBlockDeclaration(node);
case 166 /* ComputedPropertyName */:
return visitComputedPropertyName(node);
case 239 /* SemicolonClassElement */:
return node;
default:
return isModifierLike(node) ? modifierVisitor(node) : visitor(node);
}
}
function propertyNameVisitor(node) {
switch (node.kind) {
case 166 /* ComputedPropertyName */:
return visitComputedPropertyName(node);
default:
return visitor(node);
}
}
function accessorFieldResultVisitor(node) {
switch (node.kind) {
case 171 /* PropertyDeclaration */:
return transformFieldInitializer(node);
case 176 /* GetAccessor */:
case 177 /* 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)) {
const { referencedName, name } = visitReferencedPropertyName(node.name);
const initializer = visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, referencedName), isExpression);
return factory2.updatePropertyAssignment(node, name, initializer);
}
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 getAssignedNameOfIdentifier(name, initializer) {
const originalClass = getOriginalNode(initializer, isClassLike);
return originalClass && !originalClass.name && hasSyntacticModifier(originalClass, 1024 /* Default */) ? factory2.createStringLiteral("default") : factory2.createStringLiteralFromNode(name);
}
function visitVariableDeclaration(node) {
if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
const assignedName = getAssignedNameOfIdentifier(node.name, node.initializer);
const name = visitNode(node.name, visitor, isBindingName);
const initializer = visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
return factory2.updateVariableDeclaration(
node,
name,
/*exclamationToken*/
void 0,
/*type*/
void 0,
initializer
);
}
return visitEachChild(node, visitor, context);
}
function visitParameterDeclaration(node) {
if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
const assignedName = getAssignedNameOfIdentifier(node.name, node.initializer);
const name = visitNode(node.name, visitor, isBindingName);
const initializer = visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
return factory2.updateParameterDeclaration(
node,
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
name,
/*questionToken*/
void 0,
/*type*/
void 0,
initializer
);
}
return visitEachChild(node, visitor, context);
}
function visitBindingElement(node) {
if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
const assignedName = getAssignedNameOfIdentifier(node.name, node.initializer);
const propertyName = visitNode(node.propertyName, visitor, isPropertyName);
const name = visitNode(node.name, visitor, isBindingName);
const initializer = visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
return factory2.updateBindingElement(
node,
/*dotDotDotToken*/
void 0,
propertyName,
name,
initializer
);
}
return visitEachChild(node, visitor, context);
}
function visitExportAssignment(node) {
if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
const assignedName = factory2.createStringLiteral(node.isExportEquals ? "" : "default");
const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier);
const expression = visitNode(node.expression, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
return factory2.updateExportAssignment(node, modifiers, expression);
}
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 setCurrentStaticPropertyDeclarationOrStaticBlockAnd(current, visitor2, arg) {
const savedCurrentStaticPropertyDeclarationOrStaticBlock = currentStaticPropertyDeclarationOrStaticBlock;
currentStaticPropertyDeclarationOrStaticBlock = current;
const result = visitor2(arg);
currentStaticPropertyDeclarationOrStaticBlock = savedCurrentStaticPropertyDeclarationOrStaticBlock;
return result;
}
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 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 getter = createAccessorPropertyGetRedirector(factory2, node, modifiers, getterName);
setOriginalNode(getter, node);
setCommentRange(getter, commentRange);
setSourceMapRange(getter, sourceMapRange);
const setter = createAccessorPropertySetRedirector(factory2, node, modifiers, setterName);
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)) {
const { referencedName, name } = visitReferencedPropertyName(node.name);
return factory2.updatePropertyDeclaration(
node,
visitNodes2(node.modifiers, modifierVisitor, isModifier),
name,
/*questionOrExclamationToken*/
void 0,
/*type*/
void 0,
visitNode(node.initializer, (child) => namedEvaluationVisitor(child, referencedName), isExpression)
);
}
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,
/*captureReferencedName*/
isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)
);
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 createPrivateIdentifierAccess(info, receiver) {
return createPrivateIdentifierAccessHelper(info, visitNode(receiver, visitor, isExpression));
}
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 && isSuperProperty(node) && isIdentifier(node.name) && currentStaticPropertyDeclarationOrStaticBlock && (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 && isSuperProperty(node) && currentStaticPropertyDeclarationOrStaticBlock && (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);
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 && isSuperProperty(operand) && currentStaticPropertyDeclarationOrStaticBlock && (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 clone2 = nodeIsSynthesized(receiver) ? receiver : factory2.cloneNode(receiver);
if (isSimpleInlineableExpression(receiver)) {
return { readExpression: clone2, initializeExpression: void 0 };
}
const readExpression = factory2.createTempVariable(hoistVariableDeclaration);
const initializeExpression = factory2.createAssignment(readExpression, clone2);
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 && isSuperProperty(node.expression) && currentStaticPropertyDeclarationOrStaticBlock && ((_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 && isSuperProperty(node.tag) && currentStaticPropertyDeclarationOrStaticBlock && ((_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) {
startLexicalEnvironment();
let statements = setCurrentStaticPropertyDeclarationOrStaticBlockAnd(
node,
(statements2) => visitNodes2(statements2, visitor, isStatement),
node.body.statements
);
statements = factory2.mergeLexicalEnvironment(statements, endLexicalEnvironment());
const iife = factory2.createImmediatelyInvokedArrowFunction(statements);
setOriginalNode(iife, node);
setTextRange(iife, node);
addEmitFlags(iife, 4 /* AdviseOnEmitNode */);
return iife;
}
}
function isAnonymousClassNeedingAssignedName(node) {
if (isClassExpression(node) && !node.name) {
const staticPropertiesOrClassStaticBlocks = getStaticPropertiesAndClassStaticBlock(node);
const classStaticBlock = find(staticPropertiesOrClassStaticBlocks, isClassStaticBlockDeclaration);
if (classStaticBlock) {
for (const statement of classStaticBlock.body.statements) {
if (isExpressionStatement(statement) && isCallToHelper(statement.expression, "___setFunctionName")) {
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)) {
const assignedName = getAssignedNameOfIdentifier(node.left, node.right);
const left2 = visitNode(node.left, visitor, isExpression);
const right = visitNode(node.right, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
return factory2.updateBinaryExpression(node, left2, node.operatorToken, right);
}
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 && isSuperProperty(node.left) && currentStaticPropertyDeclarationOrStaticBlock && (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, referencedName) {
const visitorFunc = discarded ? discardedValueVisitor : referencedName ? (node2) => namedEvaluationVisitor(node2, referencedName) : visitor;
const expression = visitNode(node.expression, visitorFunc, isExpression);
return factory2.updateParenthesizedExpression(node, expression);
}
function visitPartiallyEmittedExpression(node, discarded, referencedName) {
const visitorFunc = discarded ? discardedValueVisitor : referencedName ? (node2) => namedEvaluationVisitor(node2, referencedName) : visitor;
const expression = visitNode(node.expression, visitorFunc, isExpression);
return factory2.updatePartiallyEmittedExpression(node, expression);
}
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.createTempVariable(hoistVariableDeclaration);
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 createPrivateIdentifierAssignment(info, receiver, right, operator) {
receiver = visitNode(receiver, visitor, isExpression);
right = visitNode(right, visitor, isExpression);
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) {
let facts = 0 /* None */;
const original = getOriginalNode(node);
if (isClassDeclaration(original) && classOrConstructorParameterIsDecorated(legacyDecorators, original)) {
facts |= 1 /* ClassWasDecorated */;
}
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 */;
}
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;
} 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, referencedName, visitor2) {
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;
}
}
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, referencedName);
endClassLexicalEnvironment();
Debug.assert(lexicalEnvironment === savedLexicalEnvironment);
currentClassContainer = savedCurrentClassContainer;
pendingExpressions = savedPendingExpressions;
return result;
}
function visitClassDeclaration(node) {
return visitInNewClassLexicalEnvironment(
node,
/*referencedName*/
void 0,
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 isExport = hasSyntacticModifier(node, 1 /* Export */);
const isDefault = hasSyntacticModifier(node, 1024 /* 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 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, referencedName) {
return visitInNewClassLexicalEnvironment(node, referencedName, visitClassExpressionInNewClassLexicalEnvironment);
}
function visitClassExpressionInNewClassLexicalEnvironment(node, facts, referencedName) {
var _a, _b, _c, _d;
const isDecoratedClassDeclaration = !!(facts & 1 /* ClassWasDecorated */);
const staticPropertiesOrClassStaticBlocks = getStaticPropertiesAndClassStaticBlock(node);
const isClassWithConstructorReference = resolver.getNodeCheckFlags(node) & 1048576 /* ClassWithConstructorReference */;
let temp;
function createClassTempVar() {
var _a2;
if (shouldTransformPrivateElementsOrClassStaticBlocks && ((_a2 = node.emitNode) == null ? void 0 : _a2.classThis)) {
return getClassLexicalEnvironment().classConstructor = node.emitNode.classThis;
}
const classCheckFlags = resolver.getNodeCheckFlags(node);
const isClassWithConstructorReference2 = classCheckFlags & 1048576 /* ClassWithConstructorReference */;
const requiresBlockScopedVar = classCheckFlags & 32768 /* BlockScopedBindingInLoop */;
const temp2 = factory2.createTempVariable(requiresBlockScopedVar ? addBlockScopedVariable : hoistVariableDeclaration, !!isClassWithConstructorReference2);
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);
let 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) || referencedName) {
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 (referencedName) {
if (shouldTransformPrivateElementsOrClassStaticBlocks) {
const setNameExpression = emitHelpers().createSetFunctionNameHelper(temp ?? ((_b = node.emitNode) == null ? void 0 : _b.classThis) ?? factory2.getInternalName(node), referencedName);
pendingStatements.push(factory2.createExpressionStatement(setNameExpression));
} else {
const setNameExpression = emitHelpers().createSetFunctionNameHelper(factory2.createThis(), referencedName);
classExpression = factory2.updateClassExpression(
classExpression,
classExpression.modifiers,
classExpression.name,
classExpression.typeParameters,
classExpression.heritageClauses,
[
factory2.createClassStaticBlockDeclaration(
factory2.createBlock([
factory2.createExpressionStatement(setNameExpression)
])
),
...classExpression.members
]
);
}
}
if (some(staticPropertiesOrClassStaticBlocks)) {
addPropertyOrClassStaticBlockStatements(pendingStatements, staticPropertiesOrClassStaticBlocks, ((_c = node.emitNode) == null ? void 0 : _c.classThis) ?? factory2.getInternalName(node));
}
if (temp) {
expressions.push(factory2.createAssignment(temp, classExpression));
} else if (shouldTransformPrivateElementsOrClassStaticBlocks && ((_d = node.emitNode) == null ? void 0 : _d.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);
if (referencedName) {
expressions.push(emitHelpers().createSetFunctionNameHelper(temp, referencedName));
}
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 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;
membersArray = append(membersArray, syntheticConstructor);
membersArray = append(membersArray, syntheticStaticBlock);
membersArray = addRange(membersArray, members);
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 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 indexOfFirstStatementAfterSuperAndPrologue = 0;
let prologueStatementCount = 0;
let superStatementIndex = -1;
let statements = [];
if ((_a = constructor == null ? void 0 : constructor.body) == null ? void 0 : _a.statements) {
prologueStatementCount = factory2.copyPrologue(
constructor.body.statements,
statements,
/*ensureUseStrict*/
false,
visitor
);
superStatementIndex = findSuperStatementIndex(constructor.body.statements, prologueStatementCount);
if (superStatementIndex >= 0) {
indexOfFirstStatementAfterSuperAndPrologue = superStatementIndex + 1;
statements = [
...statements.slice(0, prologueStatementCount),
...visitNodes2(constructor.body.statements, visitor, isStatement, prologueStatementCount, indexOfFirstStatementAfterSuperAndPrologue - prologueStatementCount),
...statements.slice(prologueStatementCount)
];
} else if (prologueStatementCount >= 0) {
indexOfFirstStatementAfterSuperAndPrologue = prologueStatementCount;
}
}
if (needsSyntheticConstructor) {
statements.push(
factory2.createExpressionStatement(
factory2.createCallExpression(
factory2.createSuper(),
/*typeArguments*/
void 0,
[factory2.createSpreadElement(factory2.createIdentifier("arguments"))]
)
)
);
}
let parameterPropertyDeclarationCount = 0;
if (constructor == null ? void 0 : constructor.body) {
for (let i = indexOfFirstStatementAfterSuperAndPrologue; i < constructor.body.statements.length; i++) {
const statement = constructor.body.statements[i];
if (isParameterPropertyDeclaration(getOriginalNode(statement), constructor)) {
parameterPropertyDeclarationCount++;
} else {
break;
}
}
if (parameterPropertyDeclarationCount > 0) {
indexOfFirstStatementAfterSuperAndPrologue += parameterPropertyDeclarationCount;
}
}
const receiver = factory2.createThis();
addInstanceMethodStatements(statements, privateMethodsAndAccessors, receiver);
if (constructor) {
const parameterProperties = filter(instanceProperties, (prop) => isParameterPropertyDeclaration(getOriginalNode(prop), constructor));
const nonParameterProperties = filter(properties, (prop) => !isParameterPropertyDeclaration(getOriginalNode(prop), constructor));
addPropertyOrClassStaticBlockStatements(statements, parameterProperties, receiver);
addPropertyOrClassStaticBlockStatements(statements, nonParameterProperties, receiver);
} else {
addPropertyOrClassStaticBlockStatements(statements, properties, receiver);
}
if (constructor) {
addRange(statements, visitNodes2(constructor.body.statements, visitor, isStatement, indexOfFirstStatementAfterSuperAndPrologue));
}
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*/
constructor ? constructor.body.statements : node.members
),
multiLine
),
/*location*/
constructor ? constructor.body : void 0
);
}
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) ? 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) ? transformClassStaticBlockDeclaration(property) : transformProperty(property, receiver);
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 savedCurrentStaticPropertyDeclarationOrStaticBlock = currentStaticPropertyDeclarationOrStaticBlock;
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);
}
currentStaticPropertyDeclarationOrStaticBlock = savedCurrentStaticPropertyDeclarationOrStaticBlock;
return transformed;
}
function transformPropertyWorker(property, receiver) {
const emitAssignment = !useDefineForClassFields;
let referencedName;
if (isNamedEvaluation(property, isAnonymousClassNeedingAssignedName)) {
if (isPropertyNameLiteral(property.name) || isPrivateIdentifier(property.name)) {
referencedName = factory2.createStringLiteralFromNode(property.name);
} else if (isPropertyNameLiteral(property.name.expression) && !isIdentifier(property.name.expression)) {
referencedName = factory2.createStringLiteralFromNode(property.name.expression);
} else {
referencedName = factory2.getGeneratedNameForNode(property.name);
}
}
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)) {
currentStaticPropertyDeclarationOrStaticBlock = property;
}
const initializerVisitor = referencedName ? (child) => namedEvaluationVisitor(child, referencedName) : visitor;
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, initializerVisitor, isExpression),
privateIdentifierInfo.brandCheckIdentifier
);
} else {
return createPrivateStaticFieldInitializer(
factory2,
privateIdentifierInfo.variableName,
visitNode(property.initializer, initializerVisitor, 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, 256 /* Abstract */)) {
return void 0;
}
let initializer = visitNode(property.initializer, initializerVisitor, 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(261 /* FunctionDeclaration */);
context.enableEmitNotification(217 /* FunctionExpression */);
context.enableEmitNotification(175 /* Constructor */);
context.enableEmitNotification(176 /* GetAccessor */);
context.enableEmitNotification(177 /* SetAccessor */);
context.enableEmitNotification(173 /* MethodDeclaration */);
context.enableEmitNotification(171 /* PropertyDeclaration */);
context.enableEmitNotification(166 /* 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, captureReferencedName) {
if (isComputedPropertyName(name)) {
const cacheAssignment = findComputedPropertyNameCacheAssignment(name);
let 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.getNodeCheckFlags(name) & 32768 /* BlockScopedBindingInLoop */) {
addBlockScopedVariable(generatedName);
} else {
hoistVariableDeclaration(generatedName);
}
if (captureReferencedName) {
expression = emitHelpers().createPropKeyHelper(expression);
}
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.getNodeCheckFlags(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 && isSuperProperty(node) && currentStaticPropertyDeclarationOrStaticBlock && (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)) {
const left = visitDestructuringAssignmentTarget(node.left);
const assignedName = getAssignedNameOfIdentifier(node.left, node.right);
const right = visitNode(node.right, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
return factory2.updateBinaryExpression(node, left, node.operatorToken, right);
}
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)) {
const assignedName = getAssignedNameOfIdentifier(node.name, node.objectAssignmentInitializer);
const objectAssignmentInitializer = visitNode(node.objectAssignmentInitializer, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
return factory2.updateShorthandPropertyAssignment(node, node.name, 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)) {
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 217 /* FunctionExpression */:
if (isArrowFunction(original) || getEmitFlags(node) & 524288 /* AsyncFunctionBody */) {
break;
}
case 261 /* FunctionDeclaration */:
case 175 /* Constructor */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
case 173 /* MethodDeclaration */:
case 171 /* 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 166 /* 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)) {
const { facts, classConstructor, classThis } = lexicalEnvironment.data;
if (facts & 1 /* ClassWasDecorated */ && legacyDecorators) {
return factory2.createParenthesizedExpression(factory2.createVoidZero());
}
const substituteThis = shouldSubstituteThisWithClassThis ? classThis ?? classConstructor : classConstructor;
if (substituteThis) {
return setTextRange(
setOriginalNode(
factory2.cloneNode(substituteThis),
node
),
node
);
}
}
return node;
}
function substituteExpressionIdentifier(node) {
return trySubstituteClassAlias(node) || node;
}
function trySubstituteClassAlias(node) {
if (enabledSubstitutions & 1 /* ClassAliases */) {
if (resolver.getNodeCheckFlags(node) & 2097152 /* ConstructorReferenceInClass */) {
const declaration = resolver.getReferencedValueDeclaration(node);
if (declaration) {
const classAlias = classAliases[declaration.id];
if (classAlias) {
const clone2 = factory2.cloneNode(classAlias);
setSourceMapRange(clone2, node);
setCommentRange(clone2, node);
return clone2;
}
}
}
}
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 */;
}
// 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) => setSerializerContextAnd(serializerContext, serializeTypeOfNode, node),
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) {
const accessors = resolver.getAllAccessorDeclarations(node);
return accessors.setAccessor && getSetAccessorTypeAnnotationNode(accessors.setAccessor) || accessors.getAccessor && getEffectiveReturnTypeNode(accessors.getAccessor);
}
function serializeTypeOfNode(node) {
switch (node.kind) {
case 171 /* PropertyDeclaration */:
case 168 /* Parameter */:
return serializeTypeNode(node.type);
case 177 /* SetAccessor */:
case 176 /* GetAccessor */:
return serializeTypeNode(getAccessorTypeNode(node));
case 262 /* ClassDeclaration */:
case 230 /* ClassExpression */:
case 173 /* 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));
}
}
}
return factory2.createArrayLiteralExpression(expressions);
}
function getParametersOfDecoratedDeclaration(node, container) {
if (container && node.kind === 176 /* 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 183 /* FunctionType */:
case 184 /* ConstructorType */:
return factory2.createIdentifier("Function");
case 187 /* ArrayType */:
case 188 /* TupleType */:
return factory2.createIdentifier("Array");
case 181 /* TypePredicate */:
return node.assertsModifier ? factory2.createVoidZero() : factory2.createIdentifier("Boolean");
case 136 /* BooleanKeyword */:
return factory2.createIdentifier("Boolean");
case 202 /* TemplateLiteralType */:
case 154 /* StringKeyword */:
return factory2.createIdentifier("String");
case 151 /* ObjectKeyword */:
return factory2.createIdentifier("Object");
case 200 /* LiteralType */:
return serializeLiteralOfLiteralTypeNode(node.literal);
case 150 /* NumberKeyword */:
return factory2.createIdentifier("Number");
case 162 /* BigIntKeyword */:
return getGlobalConstructor("BigInt", 7 /* ES2020 */);
case 155 /* SymbolKeyword */:
return getGlobalConstructor("Symbol", 2 /* ES2015 */);
case 182 /* TypeReference */:
return serializeTypeReferenceNode(node);
case 192 /* IntersectionType */:
return serializeUnionOrIntersectionConstituents(
node.types,
/*isIntersection*/
true
);
case 191 /* UnionType */:
return serializeUnionOrIntersectionConstituents(
node.types,
/*isIntersection*/
false
);
case 193 /* ConditionalType */:
return serializeUnionOrIntersectionConstituents(
[node.trueType, node.falseType],
/*isIntersection*/
false
);
case 197 /* TypeOperator */:
if (node.operator === 148 /* ReadonlyKeyword */) {
return serializeTypeNode(node.type);
}
break;
case 185 /* TypeQuery */:
case 198 /* IndexedAccessType */:
case 199 /* MappedType */:
case 186 /* TypeLiteral */:
case 133 /* AnyKeyword */:
case 159 /* UnknownKeyword */:
case 196 /* ThisType */:
case 204 /* ImportType */:
break;
case 318 /* JSDocAllType */:
case 319 /* JSDocUnknownType */:
case 323 /* JSDocFunctionType */:
case 324 /* JSDocVariadicType */:
case 325 /* JSDocNamepathType */:
break;
case 320 /* JSDocNullableType */:
case 321 /* JSDocNonNullableType */:
case 322 /* 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 223 /* 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 165 /* 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 169 /* Decorator */:
return void 0;
case 262 /* ClassDeclaration */:
return visitClassDeclaration(node);
case 230 /* ClassExpression */:
return visitClassExpression(node);
case 175 /* Constructor */:
return visitConstructorDeclaration(node);
case 173 /* MethodDeclaration */:
return visitMethodDeclaration(node);
case 177 /* SetAccessor */:
return visitSetAccessorDeclaration(node);
case 176 /* GetAccessor */:
return visitGetAccessorDeclaration(node);
case 171 /* PropertyDeclaration */:
return visitPropertyDeclaration(node);
case 168 /* 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, 1 /* Export */);
const isDefault = hasSyntacticModifier(node, 1024 /* 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, 32 /* 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 varDecl = factory2.createVariableDeclaration(
declName,
/*exclamationToken*/
void 0,
/*type*/
void 0,
classAlias && !assignClassAliasInStaticBlock ? factory2.createAssignment(classAlias, classExpression) : classExpression
);
setOriginalNode(varDecl, node);
let varModifiers;
if (isExport && !isDefault) {
varModifiers = factory2.createModifiersFromModifierFlags(1 /* Export */);
}
const statement = factory2.createVariableStatement(
varModifiers,
factory2.createVariableDeclarationList([
varDecl
], 1 /* Let */)
);
setOriginalNode(statement, node);
setTextRange(statement, location);
setCommentRange(statement, node);
const statements = [statement];
addRange(statements, decorationStatements);
addConstructorDecorationStatement(statements, node);
if (isExport && isDefault) {
statements.push(factory2.createExportAssignment(
/*modifiers*/
void 0,
/*isExportEquals*/
false,
declName
));
}
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 & 16777216 /* Ambient */ || hasSyntacticModifier(node, 2 /* 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, parent2) {
return nodeOrChildIsDecorated(
/*useLegacyDecorators*/
true,
member,
parent2
) && 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, 2 /* Ambient */)
);
const descriptor = languageVersion > 0 /* ES3 */ ? isPropertyDeclaration(member) && !hasAccessorModifier(member) ? factory2.createVoidZero() : factory2.createNull() : void 0;
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);
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.getNodeCheckFlags(node) & 1048576 /* ClassWithConstructorReference */) {
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.getNodeCheckFlags(node) & 2097152 /* ConstructorReferenceInClass */) {
const declaration = resolver.getReferencedValueDeclaration(node);
if (declaration) {
const classAlias = classAliases[declaration.id];
if (classAlias) {
const clone2 = factory2.cloneNode(classAlias);
setSourceMapRange(clone2, node);
setCommentRange(clone2, node);
return clone2;
}
}
}
}
return void 0;
}
}
// src/compiler/transformers/esDecorators.ts
function transformESDecorators(context) {
const {
factory: factory2,
getEmitHelperFactory: emitHelpers,
startLexicalEnvironment,
endLexicalEnvironment,
hoistVariableDeclaration
} = context;
const compilerOptions = context.getCompilerOptions();
const languageVersion = getEmitScriptTarget(compilerOptions);
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 169 /* Decorator */:
return Debug.fail("Use `modifierVisitor` instead.");
case 262 /* ClassDeclaration */:
return visitClassDeclaration(node);
case 230 /* ClassExpression */:
return visitClassExpression(
node,
/*referencedName*/
void 0
);
case 175 /* Constructor */:
case 171 /* PropertyDeclaration */:
case 174 /* ClassStaticBlockDeclaration */:
return Debug.fail("Not supported outside of a class. Use 'classElementVisitor' instead.");
case 168 /* Parameter */:
return visitParameterDeclaration(node);
case 225 /* BinaryExpression */:
return visitBinaryExpression(
node,
/*discarded*/
false
);
case 302 /* PropertyAssignment */:
return visitPropertyAssignment(node);
case 259 /* VariableDeclaration */:
return visitVariableDeclaration(node);
case 207 /* BindingElement */:
return visitBindingElement(node);
case 276 /* ExportAssignment */:
return visitExportAssignment(node);
case 110 /* ThisKeyword */:
return visitThisExpression(node);
case 247 /* ForStatement */:
return visitForStatement(node);
case 243 /* ExpressionStatement */:
return visitExpressionStatement(node);
case 360 /* CommaListExpression */:
return visitCommaListExpression(
node,
/*discarded*/
false
);
case 216 /* ParenthesizedExpression */:
return visitParenthesizedExpression(
node,
/*discarded*/
false,
/*referencedName*/
void 0
);
case 359 /* PartiallyEmittedExpression */:
return visitPartiallyEmittedExpression(
node,
/*discarded*/
false,
/*referencedName*/
void 0
);
case 212 /* CallExpression */:
return visitCallExpression(node);
case 214 /* TaggedTemplateExpression */:
return visitTaggedTemplateExpression(node);
case 223 /* PrefixUnaryExpression */:
case 224 /* PostfixUnaryExpression */:
return visitPreOrPostfixUnaryExpression(
node,
/*discarded*/
false
);
case 210 /* PropertyAccessExpression */:
return visitPropertyAccessExpression(node);
case 211 /* ElementAccessExpression */:
return visitElementAccessExpression(node);
case 166 /* ComputedPropertyName */:
return visitComputedPropertyName(node);
case 173 /* MethodDeclaration */:
case 177 /* SetAccessor */:
case 176 /* GetAccessor */:
case 217 /* FunctionExpression */:
case 261 /* FunctionDeclaration */: {
enterOther();
const result = visitEachChild(node, fallbackVisitor, context);
exitOther();
return result;
}
default:
return visitEachChild(node, fallbackVisitor, context);
}
}
function fallbackVisitor(node) {
switch (node.kind) {
case 169 /* Decorator */:
return void 0;
default:
return visitor(node);
}
}
function modifierVisitor(node) {
switch (node.kind) {
case 169 /* Decorator */:
return void 0;
default:
return node;
}
}
function classElementVisitor(node) {
switch (node.kind) {
case 175 /* Constructor */:
return visitConstructorDeclaration(node);
case 173 /* MethodDeclaration */:
return visitMethodDeclaration(node);
case 176 /* GetAccessor */:
return visitGetAccessorDeclaration(node);
case 177 /* SetAccessor */:
return visitSetAccessorDeclaration(node);
case 171 /* PropertyDeclaration */:
return visitPropertyDeclaration(node);
case 174 /* ClassStaticBlockDeclaration */:
return visitClassStaticBlockDeclaration(node);
default:
return visitor(node);
}
}
function namedEvaluationVisitor(node, referencedName) {
switch (node.kind) {
case 359 /* PartiallyEmittedExpression */:
return visitPartiallyEmittedExpression(
node,
/*discarded*/
false,
referencedName
);
case 216 /* ParenthesizedExpression */:
return visitParenthesizedExpression(
node,
/*discarded*/
false,
referencedName
);
case 230 /* ClassExpression */:
return visitClassExpression(node, referencedName);
default:
return visitor(node);
}
}
function discardedValueVisitor(node) {
switch (node.kind) {
case 223 /* PrefixUnaryExpression */:
case 224 /* PostfixUnaryExpression */:
return visitPreOrPostfixUnaryExpression(
node,
/*discarded*/
true
);
case 225 /* BinaryExpression */:
return visitBinaryExpression(
node,
/*discarded*/
true
);
case 360 /* CommaListExpression */:
return visitCommaListExpression(
node,
/*discarded*/
true
);
case 216 /* ParenthesizedExpression */:
return visitParenthesizedExpression(
node,
/*discarded*/
true,
/*referencedName*/
void 0
);
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) {
let instanceExtraInitializersName;
let staticExtraInitializersName;
let hasStaticInitializers = false;
let hasNonAmbientInstanceFields = false;
let hasStaticPrivateClassElements = false;
for (const member of node.members) {
if (isNamedClassElement(member) && nodeOrChildIsDecorated(
/*useLegacyDecorators*/
false,
member,
node
)) {
if (hasStaticModifier(member)) {
staticExtraInitializersName ?? (staticExtraInitializersName = factory2.createUniqueName("_staticExtraInitializers", 16 /* Optimistic */));
} else {
instanceExtraInitializersName ?? (instanceExtraInitializersName = factory2.createUniqueName("_instanceExtraInitializers", 16 /* Optimistic */));
}
}
if (isClassStaticBlockDeclaration(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 (staticExtraInitializersName && instanceExtraInitializersName && hasStaticInitializers && hasNonAmbientInstanceFields && hasStaticPrivateClassElements) {
break;
}
}
return {
class: node,
instanceExtraInitializersName,
staticExtraInitializersName,
hasStaticInitializers,
hasNonAmbientInstanceFields,
hasStaticPrivateClassElements
};
}
function containsLexicalSuperInStaticInitializer(node) {
for (const member of node.members) {
if (isClassStaticBlockDeclaration(member) || isPropertyDeclaration(member) && hasStaticModifier(member)) {
if (member.transformFlags & 134217728 /* ContainsLexicalSuper */) {
return true;
}
}
}
return false;
}
function transformClassLike(node, className) {
var _a;
startLexicalEnvironment();
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));
if (classDecorators) {
classInfo2.classDecoratorsName = factory2.createUniqueName("_classDecorators", 16 /* Optimistic */);
classInfo2.classDescriptorName = factory2.createUniqueName("_classDescriptor", 16 /* Optimistic */);
classInfo2.classExtraInitializersName = factory2.createUniqueName("_classExtraInitializers", 16 /* Optimistic */);
classInfo2.classThis = factory2.createUniqueName("_classThis", 16 /* Optimistic */);
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;
}
}
if (classDecorators && containsLexicalSuperInStaticInitializer(node)) {
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 */);
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]);
}
} else {
heritageClauses = visitNodes2(node.heritageClauses, visitor, isHeritageClause);
}
const renamedClassThis = classInfo2.classThis ?? factory2.createThis();
const needsSetNameHelper = !((_a = getOriginalNode(node, isClassLike)) == null ? void 0 : _a.name) && (classDecorators || !isStringLiteral(className) || !isEmptyStringLiteral(className));
if (needsSetNameHelper) {
const setNameExpr = emitHelpers().createSetFunctionNameHelper(factory2.createThis(), className);
leadingBlockStatements = append(leadingBlockStatements, factory2.createExpressionStatement(setNameExpr));
}
enterClass(classInfo2);
let members = visitNodes2(node.members, classElementVisitor, 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 (classInfo2.instanceExtraInitializersName && !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.staticExtraInitializersName) {
classDefinitionStatements.push(
createLet(classInfo2.staticExtraInitializersName, factory2.createArrayLiteralExpression())
);
}
if (classInfo2.instanceExtraInitializersName) {
classDefinitionStatements.push(
createLet(classInfo2.instanceExtraInitializersName, 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.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.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", factory2.createThis());
const classDescriptor = factory2.createObjectLiteralExpression([valueProperty]);
const classDescriptorAssignment = factory2.createAssignment(classInfo2.classDescriptorName, classDescriptor);
const classNameReference = factory2.createPropertyAccessExpression(factory2.createThis(), "name");
const esDecorateHelper2 = emitHelpers().createESDecorateHelper(
factory2.createNull(),
classDescriptorAssignment,
classInfo2.classDecoratorsName,
{ kind: "class", name: classNameReference },
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));
}
if (classInfo2.staticExtraInitializersName) {
const runStaticInitializersHelper = emitHelpers().createRunInitializersHelper(renamedClassThis, classInfo2.staticExtraInitializersName);
const runStaticInitializersStatement = factory2.createExpressionStatement(runStaticInitializersHelper);
setSourceMapRange(runStaticInitializersStatement, node.name ?? moveRangePastDecorators(node));
leadingBlockStatements = append(leadingBlockStatements, runStaticInitializersStatement);
}
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;
}
let newMembers = members;
if (leadingBlockStatements) {
const leadingStaticBlockBody = factory2.createBlock(
leadingBlockStatements,
/*multiLine*/
true
);
const leadingStaticBlock = factory2.createClassStaticBlockDeclaration(leadingStaticBlockBody);
if (shouldTransformPrivateStaticElementsInClass) {
setInternalEmitFlags(leadingStaticBlock, 32 /* TransformPrivateStaticElements */);
}
newMembers = [leadingStaticBlock, ...newMembers];
}
if (syntheticConstructor) {
newMembers = [...newMembers, syntheticConstructor];
}
if (trailingBlockStatements) {
const trailingStaticBlockBody = factory2.createBlock(
trailingBlockStatements,
/*multiLine*/
true
);
const trailingStaticBlock = factory2.createClassStaticBlockDeclaration(trailingStaticBlockBody);
newMembers = [...newMembers, trailingStaticBlock];
}
if (newMembers !== members) {
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
);
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);
getOrCreateEmitNode(classExpression).classThis = classInfo2.classThis;
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)) {
if (hasSyntacticModifier(node, 1 /* Export */) && hasSyntacticModifier(node, 1024 /* Default */)) {
const originalClass = getOriginalNode(node, isClassLike) ?? node;
const className = originalClass.name ? factory2.createStringLiteralFromNode(originalClass.name) : factory2.createStringLiteral("default");
const iife = transformClassLike(node, className);
const statement = factory2.createExportDefault(iife);
setOriginalNode(statement, node);
setCommentRange(statement, getCommentRange(node));
setSourceMapRange(statement, moveRangePastDecorators(node));
return statement;
} else {
Debug.assertIsDefined(node.name, "A class declaration that is not a default export must have a name.");
const iife = transformClassLike(node, factory2.createStringLiteralFromNode(node.name));
const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier);
const declName = languageVersion <= 2 /* ES2015 */ ? factory2.getInternalName(
node,
/*allowComments*/
false,
/*allowSourceMaps*/
true
) : 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 statement = factory2.createVariableStatement(modifiers, varDecls);
setOriginalNode(statement, node);
setCommentRange(statement, getCommentRange(node));
return statement;
}
} 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, referencedName) {
if (isDecoratedClassLike(node)) {
const className = node.name ? factory2.createStringLiteralFromNode(node.name) : referencedName ?? factory2.createStringLiteral("");
const iife = transformClassLike(node, className);
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 (classInfo2.instanceExtraInitializersName && !classInfo2.hasNonAmbientInstanceFields) {
const statements = [];
statements.push(
factory2.createExpressionStatement(
emitHelpers().createRunInitializersHelper(
factory2.createThis(),
classInfo2.instanceExtraInitializersName
)
)
);
return statements;
}
}
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 superStatementIndex = findSuperStatementIndex(node.body.statements, nonPrologueStart);
if (superStatementIndex >= 0) {
addRange(statements, visitNodes2(node.body.statements, visitor, isStatement, nonPrologueStart, superStatementIndex + 1 - nonPrologueStart));
addRange(statements, initializerStatements);
addRange(statements, visitNodes2(node.body.statements, visitor, isStatement, superStatementIndex + 1));
} 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, useNamedEvaluation, classInfo2, createDescriptor) {
let referencedName;
let name;
let initializersName;
let thisArg;
let descriptorName;
if (!classInfo2) {
const modifiers2 = visitNodes2(member.modifiers, modifierVisitor, isModifier);
enterName();
if (useNamedEvaluation) {
({ referencedName, name } = visitReferencedPropertyName(member.name));
} else {
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)
}
};
const extraInitializers = isStatic(member) ? classInfo2.staticExtraInitializersName ?? (classInfo2.staticExtraInitializersName = factory2.createUniqueName("_staticExtraInitializers", 16 /* Optimistic */)) : classInfo2.instanceExtraInitializersName ?? (classInfo2.instanceExtraInitializersName = factory2.createUniqueName("_instanceExtraInitializers", 16 /* Optimistic */));
if (isMethodOrAccessor(member)) {
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(), extraInitializers);
const esDecorateStatement = factory2.createExpressionStatement(esDecorateExpression);
setSourceMapRange(esDecorateStatement, moveRangePastDecorators(member));
statements.push(esDecorateStatement);
} else if (isPropertyDeclaration(member)) {
initializersName = memberInfo.memberInitializersName ?? (memberInfo.memberInitializersName = createHelperVariable(member, "initializers"));
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,
extraInitializers
);
const esDecorateStatement = factory2.createExpressionStatement(esDecorateExpression);
setSourceMapRange(esDecorateStatement, moveRangePastDecorators(member));
statements.push(esDecorateStatement);
}
}
if (name === void 0) {
enterName();
if (useNamedEvaluation) {
({ referencedName, name } = visitReferencedPropertyName(member.name));
} else {
name = visitPropertyName(member.name);
}
exitName();
}
if (!some(modifiers) && (isMethodDeclaration(member) || isPropertyDeclaration(member))) {
setEmitFlags(name, 1024 /* NoLeadingComments */);
}
return { modifiers, referencedName, name, initializersName, descriptorName, thisArg };
}
function visitMethodDeclaration(node) {
enterClassElement(node);
const { modifiers, name, descriptorName } = partialTransformClassElement(
node,
/*useNamedEvaluation*/
false,
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,
/*useNamedEvaluation*/
false,
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,
/*useNamedEvaluation*/
false,
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);
if (classInfo)
classInfo.hasStaticInitializers = true;
const result = visitEachChild(node, visitor, context);
exitClassElement();
return result;
}
function visitPropertyDeclaration(node) {
enterClassElement(node);
Debug.assert(!isAmbientPropertyDeclaration(node), "Not yet implemented.");
const useNamedEvaluation = isNamedEvaluation(node, isAnonymousClassNeedingAssignedName);
const { modifiers, name, referencedName, initializersName, descriptorName, thisArg } = partialTransformClassElement(node, useNamedEvaluation, classInfo, hasAccessorModifier(node) ? createAccessorPropertyDescriptorObject : void 0);
startLexicalEnvironment();
let initializer = referencedName ? visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, referencedName), isExpression) : visitNode(node.initializer, visitor, isExpression);
if (initializersName) {
initializer = emitHelpers().createRunInitializersHelper(
thisArg ?? factory2.createThis(),
initializersName,
initializer ?? factory2.createVoidZero()
);
}
if (!isStatic(node) && (classInfo == null ? void 0 : classInfo.instanceExtraInitializersName) && !(classInfo == null ? void 0 : classInfo.hasInjectedInstanceInitializers)) {
classInfo.hasInjectedInstanceInitializers = true;
initializer ?? (initializer = factory2.createVoidZero());
initializer = factory2.createParenthesizedExpression(factory2.createComma(
emitHelpers().createRunInitializersHelper(
factory2.createThis(),
classInfo.instanceExtraInitializersName
),
initializer
));
}
if (isStatic(node) && classInfo && initializer) {
classInfo.hasStaticInitializers = true;
}
const declarations = endLexicalEnvironment();
if (some(declarations)) {
initializer = factory2.createImmediatelyInvokedArrowFunction([
...declarations,
factory2.createReturnStatement(initializer)
]);
}
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) {
let updated;
if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
const assignedName = getAssignedNameOfIdentifier(node.name, node.initializer);
const name = visitNode(node.name, visitor, isBindingName);
const initializer = visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
updated = factory2.updateParameterDeclaration(
node,
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
name,
/*questionToken*/
void 0,
/*type*/
void 0,
initializer
);
} else {
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 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)) {
const assignedName = getAssignedNameOfIdentifier(node.left, node.right);
const left = visitNode(node.left, visitor, isExpression);
const right = visitNode(node.right, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
return factory2.updateBinaryExpression(node, left, node.operatorToken, right);
}
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)) {
const { referencedName, name } = visitReferencedPropertyName(node.name);
const initializer = visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, referencedName), isExpression);
return factory2.updatePropertyAssignment(node, name, initializer);
}
return visitEachChild(node, visitor, context);
}
function visitVariableDeclaration(node) {
if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
const assignedName = getAssignedNameOfIdentifier(node.name, node.initializer);
const name = visitNode(node.name, visitor, isBindingName);
const initializer = visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
return factory2.updateVariableDeclaration(
node,
name,
/*exclamationToken*/
void 0,
/*type*/
void 0,
initializer
);
}
return visitEachChild(node, visitor, context);
}
function visitBindingElement(node) {
if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
const assignedName = getAssignedNameOfIdentifier(node.name, node.initializer);
const propertyName = visitNode(node.propertyName, visitor, isPropertyName);
const name = visitNode(node.name, visitor, isBindingName);
const initializer = visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
return factory2.updateBindingElement(
node,
/*dotDotDotToken*/
void 0,
propertyName,
name,
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
)) {
const assignmentTarget = visitDestructuringAssignmentTarget(node.left);
let initializer;
if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
const assignedName = getAssignedNameOfIdentifier(node.left, node.right);
initializer = visitNode(node.right, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
} else {
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)) {
const assignedName = getAssignedNameOfIdentifier(node.name, node.objectAssignmentInitializer);
const name = visitNode(node.name, visitor, isIdentifier);
const objectAssignmentInitializer = visitNode(node.objectAssignmentInitializer, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
return factory2.updateShorthandPropertyAssignment(node, name, 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)) {
const referencedName = factory2.createStringLiteral(node.isExportEquals ? "" : "default");
const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier);
const expression = visitNode(node.expression, (node2) => namedEvaluationVisitor(node2, referencedName), isExpression);
return factory2.updateExportAssignment(node, modifiers, expression);
}
return visitEachChild(node, visitor, context);
}
function visitParenthesizedExpression(node, discarded, referencedName) {
const visitorFunc = discarded ? discardedValueVisitor : referencedName ? (node2) => namedEvaluationVisitor(node2, referencedName) : visitor;
const expression = visitNode(node.expression, visitorFunc, isExpression);
return factory2.updateParenthesizedExpression(node, expression);
}
function visitPartiallyEmittedExpression(node, discarded, referencedName) {
const visitorFunc = discarded ? discardedValueVisitor : referencedName ? (node2) => namedEvaluationVisitor(node2, referencedName) : visitor;
const expression = visitNode(node.expression, visitorFunc, isExpression);
return factory2.updatePartiallyEmittedExpression(node, expression);
}
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 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 */);
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 getAssignedNameOfIdentifier(name, initializer) {
const originalClass = getOriginalNode(initializer, isClassLike);
return originalClass && !originalClass.name && hasSyntacticModifier(originalClass, 1024 /* Default */) ? factory2.createStringLiteral("default") : factory2.createStringLiteralFromNode(name);
}
}
// 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;
let enclosingSuperContainerFlags = 0;
let enclosingFunctionParameterNames;
let capturedSuperProperties;
let hasSuperElementAccess;
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 visitor(node) {
if ((node.transformFlags & 256 /* ContainsES2017 */) === 0) {
return node;
}
switch (node.kind) {
case 134 /* AsyncKeyword */:
return void 0;
case 222 /* AwaitExpression */:
return visitAwaitExpression(node);
case 173 /* MethodDeclaration */:
return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitMethodDeclaration, node);
case 261 /* FunctionDeclaration */:
return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitFunctionDeclaration, node);
case 217 /* FunctionExpression */:
return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitFunctionExpression, node);
case 218 /* ArrowFunction */:
return doWithContext(1 /* NonTopLevel */, visitArrowFunction, node);
case 210 /* PropertyAccessExpression */:
if (capturedSuperProperties && isPropertyAccessExpression(node) && node.expression.kind === 108 /* SuperKeyword */) {
capturedSuperProperties.add(node.name.escapedText);
}
return visitEachChild(node, visitor, context);
case 211 /* ElementAccessExpression */:
if (capturedSuperProperties && node.expression.kind === 108 /* SuperKeyword */) {
hasSuperElementAccess = true;
}
return visitEachChild(node, visitor, context);
case 176 /* GetAccessor */:
return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitGetAccessorDeclaration, node);
case 177 /* SetAccessor */:
return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitSetAccessorDeclaration, node);
case 175 /* Constructor */:
return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitConstructorDeclaration, node);
case 262 /* ClassDeclaration */:
case 230 /* 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 242 /* VariableStatement */:
return visitVariableStatementInAsyncBody(node);
case 247 /* ForStatement */:
return visitForStatementInAsyncBody(node);
case 248 /* ForInStatement */:
return visitForInStatementInAsyncBody(node);
case 249 /* ForOfStatement */:
return visitForOfStatementInAsyncBody(node);
case 298 /* CatchClause */:
return visitCatchClauseInAsyncBody(node);
case 240 /* Block */:
case 254 /* SwitchStatement */:
case 268 /* CaseBlock */:
case 295 /* CaseClause */:
case 296 /* DefaultClause */:
case 257 /* TryStatement */:
case 245 /* DoStatement */:
case 246 /* WhileStatement */:
case 244 /* IfStatement */:
case 253 /* WithStatement */:
case 255 /* 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) {
return factory2.updateConstructorDeclaration(
node,
visitNodes2(node.modifiers, visitor, isModifier),
visitParameterList(node.parameters, visitor, context),
transformMethodBody(node)
);
}
function visitMethodDeclaration(node) {
return factory2.updateMethodDeclaration(
node,
visitNodes2(node.modifiers, visitor, isModifierLike),
node.asteriskToken,
node.name,
/*questionToken*/
void 0,
/*typeParameters*/
void 0,
visitParameterList(node.parameters, visitor, context),
/*type*/
void 0,
getFunctionFlags(node) & 2 /* Async */ ? transformAsyncFunctionBody(node) : transformMethodBody(node)
);
}
function visitGetAccessorDeclaration(node) {
return factory2.updateGetAccessorDeclaration(
node,
visitNodes2(node.modifiers, visitor, isModifierLike),
node.name,
visitParameterList(node.parameters, visitor, context),
/*type*/
void 0,
transformMethodBody(node)
);
}
function visitSetAccessorDeclaration(node) {
return factory2.updateSetAccessorDeclaration(
node,
visitNodes2(node.modifiers, visitor, isModifierLike),
node.name,
visitParameterList(node.parameters, visitor, context),
transformMethodBody(node)
);
}
function visitFunctionDeclaration(node) {
return factory2.updateFunctionDeclaration(
node,
visitNodes2(node.modifiers, visitor, isModifierLike),
node.asteriskToken,
node.name,
/*typeParameters*/
void 0,
visitParameterList(node.parameters, visitor, context),
/*type*/
void 0,
getFunctionFlags(node) & 2 /* Async */ ? transformAsyncFunctionBody(node) : visitFunctionBody(node.body, visitor, context)
);
}
function visitFunctionExpression(node) {
return factory2.updateFunctionExpression(
node,
visitNodes2(node.modifiers, visitor, isModifier),
node.asteriskToken,
node.name,
/*typeParameters*/
void 0,
visitParameterList(node.parameters, visitor, context),
/*type*/
void 0,
getFunctionFlags(node) & 2 /* Async */ ? transformAsyncFunctionBody(node) : visitFunctionBody(node.body, visitor, context)
);
}
function visitArrowFunction(node) {
return factory2.updateArrowFunction(
node,
visitNodes2(node.modifiers, visitor, isModifier),
/*typeParameters*/
void 0,
visitParameterList(node.parameters, visitor, context),
/*type*/
void 0,
node.equalsGreaterThanToken,
getFunctionFlags(node) & 2 /* Async */ ? transformAsyncFunctionBody(node) : 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 & 3 /* 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.getNodeCheckFlags(node) & (256 /* MethodWithSuperPropertyAssignmentInAsync */ | 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.getNodeCheckFlags(node) & 256 /* MethodWithSuperPropertyAssignmentInAsync */) {
addEmitHelper(updated, advancedAsyncSuperHelper);
} else if (resolver.getNodeCheckFlags(node) & 128 /* MethodWithSuperPropertyAccessInAsync */) {
addEmitHelper(updated, asyncSuperHelper);
}
}
}
capturedSuperProperties = savedCapturedSuperProperties;
hasSuperElementAccess = savedHasSuperElementAccess;
return updated;
}
function transformAsyncFunctionBody(node) {
resumeLexicalEnvironment();
const original = getOriginalNode(node, isFunctionLike);
const nodeType = original.type;
const promiseConstructor = languageVersion < 2 /* ES2015 */ ? getPromiseConstructor(nodeType) : void 0;
const isArrowFunction2 = node.kind === 218 /* ArrowFunction */;
const hasLexicalArguments = (resolver.getNodeCheckFlags(node) & 512 /* CaptureArguments */) !== 0;
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;
}
let result;
if (!isArrowFunction2) {
const statements = [];
const statementOffset = factory2.copyPrologue(
node.body.statements,
statements,
/*ensureUseStrict*/
false,
visitor
);
statements.push(
factory2.createReturnStatement(
emitHelpers().createAwaiterHelper(
inHasLexicalThisContext(),
hasLexicalArguments,
promiseConstructor,
transformAsyncFunctionBodyWorker(node.body, statementOffset)
)
)
);
insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
const emitSuperHelpers = languageVersion >= 2 /* ES2015 */ && resolver.getNodeCheckFlags(node) & (256 /* MethodWithSuperPropertyAssignmentInAsync */ | 128 /* MethodWithSuperPropertyAccessInAsync */);
if (emitSuperHelpers) {
enableSubstitutionForAsyncMethodsWithSuper();
if (capturedSuperProperties.size) {
const variableStatement = createSuperAccessVariableStatement(factory2, resolver, node, capturedSuperProperties);
substitutedSuperAccessors[getNodeId(variableStatement)] = true;
insertStatementsAfterStandardPrologue(statements, [variableStatement]);
}
}
const block = factory2.createBlock(
statements,
/*multiLine*/
true
);
setTextRange(block, node.body);
if (emitSuperHelpers && hasSuperElementAccess) {
if (resolver.getNodeCheckFlags(node) & 256 /* MethodWithSuperPropertyAssignmentInAsync */) {
addEmitHelper(block, advancedAsyncSuperHelper);
} else if (resolver.getNodeCheckFlags(node) & 128 /* MethodWithSuperPropertyAccessInAsync */) {
addEmitHelper(block, asyncSuperHelper);
}
}
result = block;
} else {
const expression = emitHelpers().createAwaiterHelper(
inHasLexicalThisContext(),
hasLexicalArguments,
promiseConstructor,
transformAsyncFunctionBodyWorker(node.body)
);
const declarations = endLexicalEnvironment();
if (some(declarations)) {
const block = factory2.converters.convertToFunctionBlock(expression);
result = factory2.updateBlock(block, setTextRange(factory2.createNodeArray(concatenate(declarations, block.statements)), block.statements));
} else {
result = expression;
}
}
enclosingFunctionParameterNames = savedEnclosingFunctionParameterNames;
if (!isArrowFunction2) {
capturedSuperProperties = savedCapturedSuperProperties;
hasSuperElementAccess = savedHasSuperElementAccess;
}
return result;
}
function transformAsyncFunctionBodyWorker(body, start2) {
if (isBlock(body)) {
return factory2.updateBlock(body, visitNodes2(body.statements, asyncBodyVisitor, isStatement, start2));
} 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(212 /* CallExpression */);
context.enableSubstitution(210 /* PropertyAccessExpression */);
context.enableSubstitution(211 /* ElementAccessExpression */);
context.enableEmitNotification(262 /* ClassDeclaration */);
context.enableEmitNotification(173 /* MethodDeclaration */);
context.enableEmitNotification(176 /* GetAccessor */);
context.enableEmitNotification(177 /* SetAccessor */);
context.enableEmitNotification(175 /* Constructor */);
context.enableEmitNotification(242 /* VariableStatement */);
}
}
function onEmitNode(hint, node, emitCallback) {
if (enabledSubstitutions & 1 /* AsyncMethodsWithSuper */ && isSuperContainer(node)) {
const superContainerFlags = resolver.getNodeCheckFlags(node) & (128 /* MethodWithSuperPropertyAccessInAsync */ | 256 /* MethodWithSuperPropertyAssignmentInAsync */);
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 210 /* PropertyAccessExpression */:
return substitutePropertyAccessExpression(node);
case 211 /* ElementAccessExpression */:
return substituteElementAccessExpression(node);
case 212 /* 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 === 262 /* ClassDeclaration */ || kind === 175 /* Constructor */ || kind === 173 /* MethodDeclaration */ || kind === 176 /* GetAccessor */ || kind === 177 /* 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.getNodeCheckFlags(node) & 256 /* MethodWithSuperPropertyAssignmentInAsync */) !== 0;
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;
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 222 /* AwaitExpression */:
return visitAwaitExpression(node);
case 228 /* YieldExpression */:
return visitYieldExpression(node);
case 252 /* ReturnStatement */:
return visitReturnStatement(node);
case 255 /* LabeledStatement */:
return visitLabeledStatement(node);
case 209 /* ObjectLiteralExpression */:
return visitObjectLiteralExpression(node);
case 225 /* BinaryExpression */:
return visitBinaryExpression(node, expressionResultIsUnused2);
case 360 /* CommaListExpression */:
return visitCommaListExpression(node, expressionResultIsUnused2);
case 298 /* CatchClause */:
return visitCatchClause(node);
case 242 /* VariableStatement */:
return visitVariableStatement(node);
case 259 /* VariableDeclaration */:
return visitVariableDeclaration(node);
case 245 /* DoStatement */:
case 246 /* WhileStatement */:
case 248 /* ForInStatement */:
return doWithHierarchyFacts(
visitDefault,
node,
0 /* IterationStatementExcludes */,
2 /* IterationStatementIncludes */
);
case 249 /* ForOfStatement */:
return visitForOfStatement(
node,
/*outermostLabeledStatement*/
void 0
);
case 247 /* ForStatement */:
return doWithHierarchyFacts(
visitForStatement,
node,
0 /* IterationStatementExcludes */,
2 /* IterationStatementIncludes */
);
case 221 /* VoidExpression */:
return visitVoidExpression(node);
case 175 /* Constructor */:
return doWithHierarchyFacts(
visitConstructorDeclaration,
node,
2 /* ClassOrFunctionExcludes */,
1 /* ClassOrFunctionIncludes */
);
case 173 /* MethodDeclaration */:
return doWithHierarchyFacts(
visitMethodDeclaration,
node,
2 /* ClassOrFunctionExcludes */,
1 /* ClassOrFunctionIncludes */
);
case 176 /* GetAccessor */:
return doWithHierarchyFacts(
visitGetAccessorDeclaration,
node,
2 /* ClassOrFunctionExcludes */,
1 /* ClassOrFunctionIncludes */
);
case 177 /* SetAccessor */:
return doWithHierarchyFacts(
visitSetAccessorDeclaration,
node,
2 /* ClassOrFunctionExcludes */,
1 /* ClassOrFunctionIncludes */
);
case 261 /* FunctionDeclaration */:
return doWithHierarchyFacts(
visitFunctionDeclaration,
node,
2 /* ClassOrFunctionExcludes */,
1 /* ClassOrFunctionIncludes */
);
case 217 /* FunctionExpression */:
return doWithHierarchyFacts(
visitFunctionExpression,
node,
2 /* ClassOrFunctionExcludes */,
1 /* ClassOrFunctionIncludes */
);
case 218 /* ArrowFunction */:
return doWithHierarchyFacts(
visitArrowFunction,
node,
2 /* ArrowFunctionExcludes */,
0 /* ArrowFunctionIncludes */
);
case 168 /* Parameter */:
return visitParameter(node);
case 243 /* ExpressionStatement */:
return visitExpressionStatement(node);
case 216 /* ParenthesizedExpression */:
return visitParenthesizedExpression(node, expressionResultIsUnused2);
case 214 /* TaggedTemplateExpression */:
return visitTaggedTemplateExpression(node);
case 210 /* PropertyAccessExpression */:
if (capturedSuperProperties && isPropertyAccessExpression(node) && node.expression.kind === 108 /* SuperKeyword */) {
capturedSuperProperties.add(node.name.escapedText);
}
return visitEachChild(node, visitor, context);
case 211 /* ElementAccessExpression */:
if (capturedSuperProperties && node.expression.kind === 108 /* SuperKeyword */) {
hasSuperElementAccess = true;
}
return visitEachChild(node, visitor, context);
case 262 /* ClassDeclaration */:
case 230 /* 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 === 249 /* 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 === 304 /* 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 === 302 /* 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 !== 209 /* 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, 1 /* 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),
transformFunctionBody2(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,
transformFunctionBody2(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),
transformFunctionBody2(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,
visitParameterList(node.parameters, parameterVisitor, context),
/*type*/
void 0,
enclosingFunctionFlags & 2 /* Async */ && enclosingFunctionFlags & 1 /* Generator */ ? transformAsyncGeneratorFunctionBody(node) : transformFunctionBody2(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,
visitParameterList(node.parameters, parameterVisitor, context),
/*type*/
void 0,
enclosingFunctionFlags & 2 /* Async */ && enclosingFunctionFlags & 1 /* Generator */ ? transformAsyncGeneratorFunctionBody(node) : transformFunctionBody2(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,
transformFunctionBody2(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,
visitParameterList(node.parameters, parameterVisitor, context),
/*type*/
void 0,
enclosingFunctionFlags & 2 /* Async */ && enclosingFunctionFlags & 1 /* Generator */ ? transformAsyncGeneratorFunctionBody(node) : transformFunctionBody2(node)
);
enclosingFunctionFlags = savedEnclosingFunctionFlags;
parametersWithPrecedingObjectRestOrSpread = savedParametersWithPrecedingObjectRestOrSpread;
return updated;
}
function transformAsyncGeneratorFunctionBody(node) {
resumeLexicalEnvironment();
const statements = [];
const statementOffset = factory2.copyPrologue(
node.body.statements,
statements,
/*ensureUseStrict*/
false,
visitor
);
appendObjectRestAssignmentsIfNeeded(statements, node);
const savedCapturedSuperProperties = capturedSuperProperties;
const savedHasSuperElementAccess = hasSuperElementAccess;
capturedSuperProperties = /* @__PURE__ */ new Set();
hasSuperElementAccess = false;
const returnStatement = factory2.createReturnStatement(
emitHelpers().createAsyncGeneratorHelper(
factory2.createFunctionExpression(
/*modifiers*/
void 0,
factory2.createToken(42 /* AsteriskToken */),
node.name && factory2.getGeneratedNameForNode(node.name),
/*typeParameters*/
void 0,
/*parameters*/
[],
/*type*/
void 0,
factory2.updateBlock(
node.body,
visitLexicalEnvironment(node.body.statements, visitor, context, statementOffset)
)
),
!!(hierarchyFacts & 1 /* HasLexicalThis */)
)
);
const emitSuperHelpers = languageVersion >= 2 /* ES2015 */ && resolver.getNodeCheckFlags(node) & (256 /* MethodWithSuperPropertyAssignmentInAsync */ | 128 /* MethodWithSuperPropertyAccessInAsync */);
if (emitSuperHelpers) {
enableSubstitutionForAsyncMethodsWithSuper();
const variableStatement = createSuperAccessVariableStatement(factory2, resolver, node, capturedSuperProperties);
substitutedSuperAccessors[getNodeId(variableStatement)] = true;
insertStatementsAfterStandardPrologue(statements, [variableStatement]);
}
statements.push(returnStatement);
insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
const block = factory2.updateBlock(node.body, statements);
if (emitSuperHelpers && hasSuperElementAccess) {
if (resolver.getNodeCheckFlags(node) & 256 /* MethodWithSuperPropertyAssignmentInAsync */) {
addEmitHelper(block, advancedAsyncSuperHelper);
} else if (resolver.getNodeCheckFlags(node) & 128 /* MethodWithSuperPropertyAccessInAsync */) {
addEmitHelper(block, asyncSuperHelper);
}
}
capturedSuperProperties = savedCapturedSuperProperties;
hasSuperElementAccess = savedHasSuperElementAccess;
return block;
}
function transformFunctionBody2(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(212 /* CallExpression */);
context.enableSubstitution(210 /* PropertyAccessExpression */);
context.enableSubstitution(211 /* ElementAccessExpression */);
context.enableEmitNotification(262 /* ClassDeclaration */);
context.enableEmitNotification(173 /* MethodDeclaration */);
context.enableEmitNotification(176 /* GetAccessor */);
context.enableEmitNotification(177 /* SetAccessor */);
context.enableEmitNotification(175 /* Constructor */);
context.enableEmitNotification(242 /* VariableStatement */);
}
}
function onEmitNode(hint, node, emitCallback) {
if (enabledSubstitutions & 1 /* AsyncMethodsWithSuper */ && isSuperContainer(node)) {
const superContainerFlags = resolver.getNodeCheckFlags(node) & (128 /* MethodWithSuperPropertyAccessInAsync */ | 256 /* MethodWithSuperPropertyAssignmentInAsync */);
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 210 /* PropertyAccessExpression */:
return substitutePropertyAccessExpression(node);
case 211 /* ElementAccessExpression */:
return substituteElementAccessExpression(node);
case 212 /* 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 === 262 /* ClassDeclaration */ || kind === 175 /* Constructor */ || kind === 173 /* MethodDeclaration */ || kind === 176 /* GetAccessor */ || kind === 177 /* 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 298 /* 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 212 /* CallExpression */: {
const updated = visitNonOptionalCallExpression(
node,
/*captureThisArg*/
false
);
Debug.assertNotNode(updated, isSyntheticReference);
return updated;
}
case 210 /* PropertyAccessExpression */:
case 211 /* ElementAccessExpression */:
if (isOptionalChain(node)) {
const updated = visitOptionalExpression(
node,
/*captureThisArg*/
false,
/*isDelete*/
false
);
Debug.assertNotNode(updated, isSyntheticReference);
return updated;
}
return visitEachChild(node, visitor, context);
case 225 /* BinaryExpression */:
if (node.operatorToken.kind === 61 /* QuestionQuestionToken */) {
return transformNullishCoalescingExpression(node);
}
return visitEachChild(node, visitor, context);
case 219 /* 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 === 210 /* 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 216 /* ParenthesizedExpression */:
return visitNonOptionalParenthesizedExpression(node, captureThisArg, isDelete);
case 210 /* PropertyAccessExpression */:
case 211 /* ElementAccessExpression */:
return visitNonOptionalPropertyOrElementAccessExpression(node, captureThisArg, isDelete);
case 212 /* 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 210 /* PropertyAccessExpression */:
case 211 /* 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 === 210 /* PropertyAccessExpression */ ? factory2.createPropertyAccessExpression(rightExpression, visitNode(segment.name, visitor, isIdentifier)) : factory2.createElementAccessExpression(rightExpression, visitNode(segment.argumentExpression, visitor, isExpression));
break;
case 212 /* 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) {
return chainBundle(context, transformSourceFile);
function transformSourceFile(node) {
if (node.isDeclarationFile) {
return node;
}
return visitEachChild(node, visitor, context);
}
function visitor(node) {
if ((node.transformFlags & 4 /* ContainsESNext */) === 0) {
return node;
}
switch (node.kind) {
default:
return visitEachChild(node, visitor, context);
}
}
}
// 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(
/*isTypeOnly*/
false,
/*name*/
void 0,
factory2.createNamedImports(arrayFrom(importSpecifiersMap.values()))
),
factory2.createStringLiteral(importSource),
/*assertClause*/
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 283 /* JsxElement */:
return visitJsxElement(
node,
/*isChild*/
false
);
case 284 /* JsxSelfClosingElement */:
return visitJsxSelfClosingElement(
node,
/*isChild*/
false
);
case 287 /* JsxFragment */:
return visitJsxFragment(
node,
/*isChild*/
false
);
case 293 /* JsxExpression */:
return visitJsxExpression(node);
default:
return visitEachChild(node, visitor, context);
}
}
function transformJsxChildToExpression(node) {
switch (node.kind) {
case 12 /* JsxText */:
return visitJsxText(node);
case 293 /* JsxExpression */:
return visitJsxExpression(node);
case 283 /* JsxElement */:
return visitJsxElement(
node,
/*isChild*/
true
);
case 284 /* JsxSelfClosingElement */:
return visitJsxSelfClosingElement(
node,
/*isChild*/
true
);
case 287 /* 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 node.expression.properties;
}
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(prop.expression);
continue;
}
properties.push(prop);
}
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 === 293 /* 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 === 283 /* 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-Za-z_]\w*$/.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 225 /* 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;
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 /* ConstructorWithCapturedSuper */) !== 0 && node.kind === 252 /* 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 /* ConstructorWithCapturedSuper */ && 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, 98304 /* FunctionSubtreeExcludes */, 0 /* None */);
return result;
}
return visitorWorker(
node,
/*expressionResultIsUnused*/
false
);
}
return node;
}
function callExpressionVisitor(node) {
if (node.kind === 108 /* SuperKeyword */) {
return visitSuperKeyword(
/*isExpressionOfCall*/
true
);
}
return visitor(node);
}
function visitorWorker(node, expressionResultIsUnused2) {
switch (node.kind) {
case 126 /* StaticKeyword */:
return void 0;
case 262 /* ClassDeclaration */:
return visitClassDeclaration(node);
case 230 /* ClassExpression */:
return visitClassExpression(node);
case 168 /* Parameter */:
return visitParameter(node);
case 261 /* FunctionDeclaration */:
return visitFunctionDeclaration(node);
case 218 /* ArrowFunction */:
return visitArrowFunction(node);
case 217 /* FunctionExpression */:
return visitFunctionExpression(node);
case 259 /* VariableDeclaration */:
return visitVariableDeclaration(node);
case 80 /* Identifier */:
return visitIdentifier(node);
case 260 /* VariableDeclarationList */:
return visitVariableDeclarationList(node);
case 254 /* SwitchStatement */:
return visitSwitchStatement(node);
case 268 /* CaseBlock */:
return visitCaseBlock(node);
case 240 /* Block */:
return visitBlock(
node,
/*isFunctionBody*/
false
);
case 251 /* BreakStatement */:
case 250 /* ContinueStatement */:
return visitBreakOrContinueStatement(node);
case 255 /* LabeledStatement */:
return visitLabeledStatement(node);
case 245 /* DoStatement */:
case 246 /* WhileStatement */:
return visitDoOrWhileStatement(
node,
/*outermostLabeledStatement*/
void 0
);
case 247 /* ForStatement */:
return visitForStatement(
node,
/*outermostLabeledStatement*/
void 0
);
case 248 /* ForInStatement */:
return visitForInStatement(
node,
/*outermostLabeledStatement*/
void 0
);
case 249 /* ForOfStatement */:
return visitForOfStatement(
node,
/*outermostLabeledStatement*/
void 0
);
case 243 /* ExpressionStatement */:
return visitExpressionStatement(node);
case 209 /* ObjectLiteralExpression */:
return visitObjectLiteralExpression(node);
case 298 /* CatchClause */:
return visitCatchClause(node);
case 303 /* ShorthandPropertyAssignment */:
return visitShorthandPropertyAssignment(node);
case 166 /* ComputedPropertyName */:
return visitComputedPropertyName(node);
case 208 /* ArrayLiteralExpression */:
return visitArrayLiteralExpression(node);
case 212 /* CallExpression */:
return visitCallExpression(node);
case 213 /* NewExpression */:
return visitNewExpression(node);
case 216 /* ParenthesizedExpression */:
return visitParenthesizedExpression(node, expressionResultIsUnused2);
case 225 /* BinaryExpression */:
return visitBinaryExpression(node, expressionResultIsUnused2);
case 360 /* 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 214 /* TaggedTemplateExpression */:
return visitTaggedTemplateExpression(node);
case 227 /* TemplateExpression */:
return visitTemplateExpression(node);
case 228 /* YieldExpression */:
return visitYieldExpression(node);
case 229 /* SpreadElement */:
return visitSpreadElement(node);
case 108 /* SuperKeyword */:
return visitSuperKeyword(
/*isExpressionOfCall*/
false
);
case 110 /* ThisKeyword */:
return visitThisKeyword(node);
case 235 /* MetaProperty */:
return visitMetaProperty(node);
case 173 /* MethodDeclaration */:
return visitMethodDeclaration(node);
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
return visitAccessorDeclaration(node);
case 242 /* VariableStatement */:
return visitVariableStatement(node);
case 252 /* ReturnStatement */:
return visitReturnStatement(node);
case 221 /* 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(factory2.createUniqueName("_this", 16 /* Optimistic */ | 32 /* FileLevel */)), node);
}
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) {
if (hierarchyFacts & 2 /* ArrowFunction */ && !(hierarchyFacts & 16384 /* StaticInitializer */)) {
hierarchyFacts |= 65536 /* 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 & 128 /* IdentifierHasExtendedUnicodeEscape */) {
return setOriginalNode(setTextRange(
factory2.createIdentifier(unescapeLeadingUnderscores(node.escapedText)),
node
), node);
}
return node;
}
function visitBreakOrContinueStatement(node) {
if (convertedLoopState) {
const jump = node.kind === 251 /* 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 === 251 /* BreakStatement */) {
convertedLoopState.nonLocalJumps |= 2 /* Break */;
labelMarker = "break";
} else {
convertedLoopState.nonLocalJumps |= 4 /* Continue */;
labelMarker = "continue";
}
} else {
if (node.kind === 251 /* 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, 1 /* Export */)) {
const exportStatement = hasSyntacticModifier(node, 1024 /* 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,
factory2.createUniqueName("_super", 16 /* Optimistic */ | 32 /* FileLevel */)
)] : [],
/*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, 98304 /* 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 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 existingPrologue = takeWhile(constructor.body.statements, isPrologueDirective);
const { superCall, superStatementIndex } = findSuperCallAndStatementIndex(constructor.body.statements, existingPrologue);
const postSuperStatementsStart = superStatementIndex === -1 ? existingPrologue.length : superStatementIndex + 1;
let statementOffset = postSuperStatementsStart;
if (!hasSynthesizedSuper)
statementOffset = factory2.copyStandardPrologue(
constructor.body.statements,
prologue,
statementOffset,
/*ensureUseStrict*/
false
);
if (!hasSynthesizedSuper)
statementOffset = factory2.copyCustomPrologue(
constructor.body.statements,
statements,
statementOffset,
visitor,
/*filter*/
void 0
);
let superCallExpression;
if (hasSynthesizedSuper) {
superCallExpression = createDefaultSuperCallOrThis();
} else if (superCall) {
superCallExpression = visitSuperCallInBody(superCall);
}
if (superCallExpression) {
hierarchyFacts |= 8192 /* ConstructorWithCapturedSuper */;
}
addDefaultValueAssignmentsIfNeeded2(prologue, constructor);
addRestParameterIfNeeded(prologue, constructor, hasSynthesizedSuper);
addRange(statements, visitNodes2(
constructor.body.statements,
visitor,
isStatement,
/*start*/
statementOffset
));
factory2.mergeLexicalEnvironment(prologue, endLexicalEnvironment());
insertCaptureNewTargetIfNeeded(
prologue,
constructor,
/*copyOnWrite*/
false
);
if (isDerivedClass || superCallExpression) {
if (superCallExpression && postSuperStatementsStart === constructor.body.statements.length && !(constructor.body.transformFlags & 16384 /* ContainsLexicalThis */)) {
const superCall2 = cast(cast(superCallExpression, isBinaryExpression).left, isCallExpression);
const returnStatement = factory2.createReturnStatement(superCallExpression);
setCommentRange(returnStatement, getCommentRange(superCall2));
setEmitFlags(superCall2, 3072 /* NoComments */);
statements.push(returnStatement);
} else {
if (superStatementIndex <= existingPrologue.length) {
insertCaptureThisForNode(statements, constructor, superCallExpression || createActualThis());
} else {
insertCaptureThisForNode(prologue, constructor, createActualThis());
if (superCallExpression) {
insertSuperThisCaptureThisForNode(statements, superCallExpression);
}
}
if (!isSufficientlyCoveredByReturnStatements(constructor.body)) {
statements.push(factory2.createReturnStatement(factory2.createUniqueName("_this", 16 /* Optimistic */ | 32 /* FileLevel */)));
}
}
} else {
insertCaptureThisForNodeIfNeeded(prologue, constructor);
}
const body = factory2.createBlock(
setTextRange(
factory2.createNodeArray(
[
...existingPrologue,
...prologue,
...superStatementIndex <= existingPrologue.length ? emptyArray : visitNodes2(constructor.body.statements, visitor, isStatement, existingPrologue.length, superStatementIndex - existingPrologue.length),
...statements
]
),
/*location*/
constructor.body.statements
),
/*multiLine*/
true
);
setTextRange(body, constructor.body);
return body;
}
function findSuperCallAndStatementIndex(originalBodyStatements, existingPrologue) {
for (let i = existingPrologue.length; i < originalBodyStatements.length; i += 1) {
const superCall = getSuperCallFromStatement(originalBodyStatements[i]);
if (superCall) {
return {
superCall,
superStatementIndex: i
};
}
}
return {
superStatementIndex: -1
};
}
function isSufficientlyCoveredByReturnStatements(statement) {
if (statement.kind === 252 /* ReturnStatement */) {
return true;
} else if (statement.kind === 244 /* IfStatement */) {
const ifStatement = statement;
if (ifStatement.elseStatement) {
return isSufficientlyCoveredByReturnStatements(ifStatement.thenStatement) && isSufficientlyCoveredByReturnStatements(ifStatement.elseStatement);
}
} else if (statement.kind === 240 /* 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(
factory2.createUniqueName("_super", 16 /* Optimistic */ | 32 /* FileLevel */),
factory2.createNull()
),
factory2.createFunctionApplyCall(
factory2.createUniqueName("_super", 16 /* Optimistic */ | 32 /* FileLevel */),
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 & 65536 /* CapturedLexicalThis */ && node.kind !== 218 /* ArrowFunction */) {
insertCaptureThisForNode(statements, node, factory2.createThis());
return true;
}
return false;
}
function insertSuperThisCaptureThisForNode(statements, superExpression) {
enableSubstitutionsForCapturedThis();
const assignSuperExpression = factory2.createExpressionStatement(
factory2.createBinaryExpression(
factory2.createThis(),
64 /* EqualsToken */,
superExpression
)
);
insertStatementAfterCustomPrologue(statements, assignSuperExpression);
setCommentRange(assignSuperExpression, getOriginalNode(superExpression).parent);
}
function insertCaptureThisForNode(statements, node, initializer) {
enableSubstitutionsForCapturedThis();
const captureThisStatement = factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList([
factory2.createVariableDeclaration(
factory2.createUniqueName("_this", 16 /* Optimistic */ | 32 /* FileLevel */),
/*exclamationToken*/
void 0,
/*type*/
void 0,
initializer
)
])
);
setEmitFlags(captureThisStatement, 3072 /* NoComments */ | 2097152 /* CustomPrologue */);
setSourceMapRange(captureThisStatement, node);
insertStatementAfterCustomPrologue(statements, captureThisStatement);
}
function insertCaptureNewTargetIfNeeded(statements, node, copyOnWrite) {
if (hierarchyFacts & 32768 /* NewTarget */) {
let newTarget;
switch (node.kind) {
case 218 /* ArrowFunction */:
return statements;
case 173 /* MethodDeclaration */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
newTarget = factory2.createVoidZero();
break;
case 175 /* Constructor */:
newTarget = factory2.createPropertyAccessExpression(
setEmitFlags(factory2.createThis(), 8 /* NoSubstitution */),
"constructor"
);
break;
case 261 /* FunctionDeclaration */:
case 217 /* 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 */);
if (copyOnWrite) {
statements = statements.slice();
}
insertStatementAfterCustomPrologue(statements, captureNewTargetStatement);
}
return statements;
}
function addClassMembers(statements, node) {
for (const member of node.members) {
switch (member.kind) {
case 239 /* SemicolonClassElement */:
statements.push(transformSemicolonClassElementToStatement(member));
break;
case 173 /* MethodDeclaration */:
statements.push(transformClassMethodDeclarationToStatement(getClassMemberPrefix(node, member), member, node));
break;
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
const accessors = getAllAccessorDeclarations(node.members, member);
if (member === accessors.firstAccessor) {
statements.push(transformAccessorsToStatement(getClassMemberPrefix(node, member), accessors, node));
}
break;
case 175 /* Constructor */:
case 174 /* 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 |= 65536 /* 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,
transformFunctionBody2(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 = transformFunctionBody2(node);
const name = hierarchyFacts & 32768 /* NewTarget */ ? factory2.getLocalName(node) : node.name;
exitSubtree(ancestorFacts, 98304 /* 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 = transformFunctionBody2(node);
const name = hierarchyFacts & 32768 /* NewTarget */ ? factory2.getLocalName(node) : node.name;
exitSubtree(ancestorFacts, 98304 /* 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 = transformFunctionBody2(node);
if (hierarchyFacts & 32768 /* NewTarget */ && !name && (node.kind === 261 /* FunctionDeclaration */ || node.kind === 217 /* FunctionExpression */)) {
name = factory2.getGeneratedNameForNode(node);
}
exitSubtree(ancestorFacts, 98304 /* 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 transformFunctionBody2(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 === 218 /* 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,
/*copyOnWrite*/
false
);
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, isFunctionBody2) {
if (isFunctionBody2) {
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, 1 /* Export */) ? 32 /* ExportedVariableStatement */ : 0 /* None */);
let updated;
if (convertedLoopState && (node.declarationList.flags & 3 /* 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 & 3 /* BlockScoped */ || node.transformFlags & 524288 /* ContainsBindingPattern */) {
if (node.flags & 3 /* 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 flags = resolver.getNodeCheckFlags(node);
const isCapturedInFunction = flags & 16384 /* CapturedBlockScopedBinding */;
const isDeclaredInLoop = flags & 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(Debug.checkDefined(visitNode(statement, visitor, isStatement, factory2.liftToBlock)), node, convertedLoopState && resetLabel);
}
function visitIterationStatement(node, outermostLabeledStatement) {
switch (node.kind) {
case 245 /* DoStatement */:
case 246 /* WhileStatement */:
return visitDoOrWhileStatement(node, outermostLabeledStatement);
case 247 /* ForStatement */:
return visitForStatement(node, outermostLabeledStatement);
case 248 /* ForInStatement */:
return visitForInStatement(node, outermostLabeledStatement);
case 249 /* 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 & 3 /* 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 === 166 /* 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.getNodeCheckFlags(node) & 8192 /* ContainsCapturedBlockScopeBinding */) !== 0;
}
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.getNodeCheckFlags(node) & 4096 /* LoopWithCapturedBlockScopedBinding */) !== 0;
}
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 clone2 = convertIterationStatementCore(node, initializerFunction, factory2.createBlock(
bodyFunction.part,
/*multiLine*/
true
));
loop = factory2.restoreEnclosingLabel(clone2, outermostLabeledStatement, convertedLoopState && resetLabel);
}
} else {
const clone2 = convertIterationStatementCore(node, initializerFunction, Debug.checkDefined(visitNode(node.statement, visitor, isStatement, factory2.liftToBlock)));
loop = factory2.restoreEnclosingLabel(clone2, outermostLabeledStatement, convertedLoopState && resetLabel);
}
statements.push(loop);
return statements;
}
function convertIterationStatementCore(node, initializerFunction, convertedLoopBody) {
switch (node.kind) {
case 247 /* ForStatement */:
return convertForStatement(node, initializerFunction, convertedLoopBody);
case 248 /* ForInStatement */:
return convertForInStatement(node, convertedLoopBody);
case 249 /* ForOfStatement */:
return convertForOfStatement(node, convertedLoopBody);
case 245 /* DoStatement */:
return convertDoStatement(node, convertedLoopBody);
case 246 /* 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 247 /* ForStatement */:
case 248 /* ForInStatement */:
case 249 /* ForOfStatement */:
const initializer = node.initializer;
if (initializer && initializer.kind === 260 /* VariableDeclarationList */) {
loopInitializer = initializer;
}
break;
}
const loopParameters = [];
const loopOutParameters = [];
if (loopInitializer && getCombinedNodeFlags(loopInitializer) & 3 /* 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 checkFlags = resolver.getNodeCheckFlags(decl);
if (checkFlags & 262144 /* NeedsLoopOutParameter */ || hasCapturedBindingsInForHead) {
const outParamName = factory2.createUniqueName("out_" + idText(name));
let flags = 0 /* None */;
if (checkFlags & 262144 /* NeedsLoopOutParameter */) {
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, start2) {
const properties = node.properties;
const numProperties = properties.length;
for (let i = start2; i < numProperties; i++) {
const property = properties[i];
switch (property.kind) {
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
const accessors = getAllAccessorDeclarations(node.properties, property);
if (property === accessors.firstAccessor) {
expressions.push(transformAccessorsToExpression(receiver, accessors, node, !!node.multiLine));
}
break;
case 173 /* MethodDeclaration */:
expressions.push(transformObjectLiteralMethodDeclarationToExpression(property, receiver, node, node.multiLine));
break;
case 302 /* PropertyAssignment */:
expressions.push(transformPropertyAssignmentToExpression(property, receiver, node.multiLine));
break;
case 303 /* 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 = transformFunctionBody2(node);
if (node.kind === 176 /* 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, 98304 /* 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 visitSuperCallInBody(node) {
return visitCallExpressionWithPotentialCapturedThisAssignment(
node,
/*assignToCapturedThis*/
false
);
}
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(factory2.createUniqueName("_this", 16 /* Optimistic */ | 32 /* FileLevel */), initializer) : initializer;
}
return setOriginalNode(resultingCall, node);
}
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 visitSuperKeyword(isExpressionOfCall) {
return hierarchyFacts & 8 /* NonStaticClassElement */ && !isExpressionOfCall ? factory2.createPropertyAccessExpression(factory2.createUniqueName("_super", 16 /* Optimistic */ | 32 /* FileLevel */), "prototype") : factory2.createUniqueName("_super", 16 /* Optimistic */ | 32 /* FileLevel */);
}
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(175 /* Constructor */);
context.enableEmitNotification(173 /* MethodDeclaration */);
context.enableEmitNotification(176 /* GetAccessor */);
context.enableEmitNotification(177 /* SetAccessor */);
context.enableEmitNotification(218 /* ArrowFunction */);
context.enableEmitNotification(217 /* FunctionExpression */);
context.enableEmitNotification(261 /* 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 207 /* BindingElement */:
case 262 /* ClassDeclaration */:
case 265 /* EnumDeclaration */:
case 259 /* 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(factory2.createUniqueName("_this", 16 /* Optimistic */ | 32 /* FileLevel */), 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 !== 243 /* ExpressionStatement */) {
return false;
}
const statementExpression = statement.expression;
if (!nodeIsSynthesized(statementExpression) || statementExpression.kind !== 212 /* 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 !== 229 /* SpreadElement */) {
return false;
}
const expression = callArgument.expression;
return isIdentifier(expression) && expression.escapedText === "arguments";
}
}
// src/compiler/transformers/es5.ts
function transformES5(context) {
const { factory: factory2 } = context;
const compilerOptions = context.getCompilerOptions();
let previousOnEmitNode;
let noSubstitution;
if (compilerOptions.jsx === 1 /* Preserve */ || compilerOptions.jsx === 3 /* ReactNative */) {
previousOnEmitNode = context.onEmitNode;
context.onEmitNode = onEmitNode;
context.enableEmitNotification(285 /* JsxOpeningElement */);
context.enableEmitNotification(286 /* JsxClosingElement */);
context.enableEmitNotification(284 /* JsxSelfClosingElement */);
noSubstitution = [];
}
const previousOnSubstituteNode = context.onSubstituteNode;
context.onSubstituteNode = onSubstituteNode;
context.enableSubstitution(210 /* PropertyAccessExpression */);
context.enableSubstitution(302 /* PropertyAssignment */);
return chainBundle(context, transformSourceFile);
function transformSourceFile(node) {
return node;
}
function onEmitNode(hint, node, emitCallback) {
switch (node.kind) {
case 285 /* JsxOpeningElement */:
case 286 /* JsxClosingElement */:
case 284 /* JsxSelfClosingElement */:
const tagName = node.tagName;
noSubstitution[getOriginalNodeId(tagName)] = true;
break;
}
previousOnEmitNode(hint, node, emitCallback);
}
function onSubstituteNode(hint, node) {
if (node.id && noSubstitution && noSubstitution[node.id]) {
return previousOnSubstituteNode(hint, node);
}
node = previousOnSubstituteNode(hint, node);
if (isPropertyAccessExpression(node)) {
return substitutePropertyAccessExpression(node);
} else if (isPropertyAssignment(node)) {
return substitutePropertyAssignment(node);
}
return node;
}
function substitutePropertyAccessExpression(node) {
if (isPrivateIdentifier(node.name)) {
return node;
}
const literalName = trySubstituteReservedName(node.name);
if (literalName) {
return setTextRange(factory2.createElementAccessExpression(node.expression, literalName), node);
}
return node;
}
function substitutePropertyAssignment(node) {
const literalName = isIdentifier(node.name) && trySubstituteReservedName(node.name);
if (literalName) {
return factory2.updatePropertyAssignment(node, literalName, node.initializer);
}
return node;
}
function trySubstituteReservedName(name) {
const token = identifierToKeywordKind(name);
if (token !== void 0 && token >= 83 /* FirstReservedWord */ && token <= 118 /* LastReservedWord */) {
return setTextRange(factory2.createStringLiteralFromNode(name), name);
}
return void 0;
}
}
// 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 245 /* DoStatement */:
return visitDoStatement(node);
case 246 /* WhileStatement */:
return visitWhileStatement(node);
case 254 /* SwitchStatement */:
return visitSwitchStatement(node);
case 255 /* LabeledStatement */:
return visitLabeledStatement(node);
default:
return visitJavaScriptInGeneratorFunctionBody(node);
}
}
function visitJavaScriptInGeneratorFunctionBody(node) {
switch (node.kind) {
case 261 /* FunctionDeclaration */:
return visitFunctionDeclaration(node);
case 217 /* FunctionExpression */:
return visitFunctionExpression(node);
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
return visitAccessorDeclaration(node);
case 242 /* VariableStatement */:
return visitVariableStatement(node);
case 247 /* ForStatement */:
return visitForStatement(node);
case 248 /* ForInStatement */:
return visitForInStatement(node);
case 251 /* BreakStatement */:
return visitBreakStatement(node);
case 250 /* ContinueStatement */:
return visitContinueStatement(node);
case 252 /* 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 225 /* BinaryExpression */:
return visitBinaryExpression(node);
case 360 /* CommaListExpression */:
return visitCommaListExpression(node);
case 226 /* ConditionalExpression */:
return visitConditionalExpression(node);
case 228 /* YieldExpression */:
return visitYieldExpression(node);
case 208 /* ArrayLiteralExpression */:
return visitArrayLiteralExpression(node);
case 209 /* ObjectLiteralExpression */:
return visitObjectLiteralExpression(node);
case 211 /* ElementAccessExpression */:
return visitElementAccessExpression(node);
case 212 /* CallExpression */:
return visitCallExpression(node);
case 213 /* NewExpression */:
return visitNewExpression(node);
default:
return visitEachChild(node, visitor, context);
}
}
function visitGenerator(node) {
switch (node.kind) {
case 261 /* FunctionDeclaration */:
return visitFunctionDeclaration(node);
case 217 /* 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 210 /* PropertyAccessExpression */:
target = factory2.updatePropertyAccessExpression(
left,
cacheExpression(Debug.checkDefined(visitNode(left.expression, visitor, isLeftHandSideExpression))),
left.name
);
break;
case 211 /* 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, start2 = 0) {
const numStatements = statements2.length;
for (let i = start2; 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 240 /* Block */:
return transformAndEmitBlock(node);
case 243 /* ExpressionStatement */:
return transformAndEmitExpressionStatement(node);
case 244 /* IfStatement */:
return transformAndEmitIfStatement(node);
case 245 /* DoStatement */:
return transformAndEmitDoStatement(node);
case 246 /* WhileStatement */:
return transformAndEmitWhileStatement(node);
case 247 /* ForStatement */:
return transformAndEmitForStatement(node);
case 248 /* ForInStatement */:
return transformAndEmitForInStatement(node);
case 250 /* ContinueStatement */:
return transformAndEmitContinueStatement(node);
case 251 /* BreakStatement */:
return transformAndEmitBreakStatement(node);
case 252 /* ReturnStatement */:
return transformAndEmitReturnStatement(node);
case 253 /* WithStatement */:
return transformAndEmitWithStatement(node);
case 254 /* SwitchStatement */:
return transformAndEmitSwitchStatement(node);
case 255 /* LabeledStatement */:
return transformAndEmitLabeledStatement(node);
case 256 /* ThrowStatement */:
return transformAndEmitThrowStatement(node);
case 257 /* 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 === 296 /* 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 === 295 /* 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 clone2 = setParent(setTextRange(factory2.cloneNode(name), name), name.parent);
setSourceMapRange(clone2, node);
setCommentRange(clone2, node);
return clone2;
}
}
}
}
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, start2) {
for (let j = start2; 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(-1);
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(212 /* CallExpression */);
context.enableSubstitution(214 /* TaggedTemplateExpression */);
context.enableSubstitution(80 /* Identifier */);
context.enableSubstitution(225 /* BinaryExpression */);
context.enableSubstitution(303 /* ShorthandPropertyAssignment */);
context.enableEmitNotification(311 /* SourceFile */);
const moduleInfoMap = [];
let currentSourceFile;
let currentModuleInfo;
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) && outFile(compilerOptions))) {
return node;
}
currentSourceFile = node;
currentModuleInfo = collectExternalModuleInfo(context, node, resolver, compilerOptions);
moduleInfoMap[getOriginalNodeId(node)] = currentModuleInfo;
const transformModule2 = getTransformModuleDelegate(moduleKind);
const updated = transformModule2(node);
currentSourceFile = void 0;
currentModuleInfo = void 0;
needUMDDynamicImportHelper = false;
return updated;
}
function shouldEmitUnderscoreUnderscoreESModule() {
if (!currentModuleInfo.exportEquals && isExternalModule(currentSourceFile)) {
return true;
}
return false;
}
function transformCommonJSModule(node) {
startLexicalEnvironment();
const statements = [];
const ensureUseStrict = getStrictOptionValue(compilerOptions, "alwaysStrict") || !compilerOptions.noImplicitUseStrict && isExternalModule(currentSourceFile);
const statementOffset = factory2.copyPrologue(node.statements, statements, ensureUseStrict && !isJsonSourceFile(node), topLevelVisitor);
if (shouldEmitUnderscoreUnderscoreESModule()) {
append(statements, createUnderscoreUnderscoreESModule());
}
if (length(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) => factory2.createAssignment(factory2.createPropertyAccessExpression(factory2.createIdentifier("exports"), factory2.createIdentifier(idText(nextId))), prev),
factory2.createVoidZero()
)
)
);
}
}
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*/
!compilerOptions.noImplicitUseStrict,
topLevelVisitor
);
if (shouldEmitUnderscoreUnderscoreESModule()) {
append(statements, createUnderscoreUnderscoreESModule());
}
if (length(currentModuleInfo.exportedNames)) {
append(statements, factory2.createExpressionStatement(reduceLeft(currentModuleInfo.exportedNames, (prev, nextId) => factory2.createAssignment(factory2.createPropertyAccessExpression(factory2.createIdentifier("exports"), factory2.createIdentifier(idText(nextId))), prev), factory2.createVoidZero())));
}
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 271 /* ImportDeclaration */:
return visitImportDeclaration(node);
case 270 /* ImportEqualsDeclaration */:
return visitImportEqualsDeclaration(node);
case 277 /* ExportDeclaration */:
return visitExportDeclaration(node);
case 276 /* ExportAssignment */:
return visitExportAssignment(node);
case 261 /* FunctionDeclaration */:
return visitFunctionDeclaration(node);
case 262 /* ClassDeclaration */:
return visitClassDeclaration(node);
default:
return topLevelNestedVisitor(node);
}
}
function topLevelNestedVisitor(node) {
switch (node.kind) {
case 242 /* VariableStatement */:
return visitVariableStatement(node);
case 261 /* FunctionDeclaration */:
return visitFunctionDeclaration(node);
case 262 /* ClassDeclaration */:
return visitClassDeclaration(node);
case 247 /* ForStatement */:
return visitForStatement(
node,
/*isTopLevel*/
true
);
case 248 /* ForInStatement */:
return visitForInStatement(node);
case 249 /* ForOfStatement */:
return visitForOfStatement(node);
case 245 /* DoStatement */:
return visitDoStatement(node);
case 246 /* WhileStatement */:
return visitWhileStatement(node);
case 255 /* LabeledStatement */:
return visitLabeledStatement(node);
case 253 /* WithStatement */:
return visitWithStatement(node);
case 244 /* IfStatement */:
return visitIfStatement(node);
case 254 /* SwitchStatement */:
return visitSwitchStatement(node);
case 268 /* CaseBlock */:
return visitCaseBlock(node);
case 295 /* CaseClause */:
return visitCaseClause(node);
case 296 /* DefaultClause */:
return visitDefaultClause(node);
case 257 /* TryStatement */:
return visitTryStatement(node);
case 298 /* CatchClause */:
return visitCatchClause(node);
case 240 /* Block */:
return visitBlock(node);
default:
return visitor(node);
}
}
function visitorWorker(node, valueIsDiscarded) {
if (!(node.transformFlags & (8388608 /* ContainsDynamicImport */ | 4096 /* ContainsDestructuringAssignment */ | 268435456 /* ContainsUpdateExpressionForIdentifier */))) {
return node;
}
switch (node.kind) {
case 247 /* ForStatement */:
return visitForStatement(
node,
/*isTopLevel*/
false
);
case 243 /* ExpressionStatement */:
return visitExpressionStatement(node);
case 216 /* ParenthesizedExpression */:
return visitParenthesizedExpression(node, valueIsDiscarded);
case 359 /* PartiallyEmittedExpression */:
return visitPartiallyEmittedExpression(node, valueIsDiscarded);
case 212 /* CallExpression */:
if (isImportCall(node) && currentSourceFile.impliedNodeFormat === void 0) {
return visitImportCallExpression(node);
}
break;
case 225 /* BinaryExpression */:
if (isDestructuringAssignment(node)) {
return visitDestructuringAssignment(node, valueIsDiscarded);
}
break;
case 223 /* PrefixUnaryExpression */:
case 224 /* 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 302 /* PropertyAssignment */:
if (destructuringNeedsFlattening(elem.initializer)) {
return true;
}
break;
case 303 /* ShorthandPropertyAssignment */:
if (destructuringNeedsFlattening(elem.name)) {
return true;
}
break;
case 304 /* SpreadAssignment */:
if (destructuringNeedsFlattening(elem.expression)) {
return true;
}
break;
case 173 /* MethodDeclaration */:
case 176 /* GetAccessor */:
case 177 /* 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 & 3 /* 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 & 3 /* 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 & 3 /* 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,
Debug.checkDefined(visitNode(node.statement, topLevelNestedVisitor, isStatement, factory2.liftToBlock))
);
}
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),
Debug.checkDefined(visitNode(node.thenStatement, topLevelNestedVisitor, isStatement, factory2.liftToBlock)),
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 visitImportCallExpression(node) {
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;
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 visitImportDeclaration(node) {
let statements;
const namespaceDeclaration = getNamespaceDeclarationNode(node);
if (moduleKind !== 2 /* AMD */) {
if (!node.importClause) {
return setOriginalNode(setTextRange(factory2.createExpressionStatement(createRequireCall2(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, createRequireCall2(node))
)
);
} else {
variables.push(
factory2.createVariableDeclaration(
factory2.getGeneratedNameForNode(node),
/*exclamationToken*/
void 0,
/*type*/
void 0,
getHelperExpressionForImport(node, createRequireCall2(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 createRequireCall2(importNode) {
const moduleName = getExternalModuleNameLiteral(factory2, importNode, currentSourceFile, host, resolver, compilerOptions);
const args = [];
if (moduleName) {
args.push(moduleName);
}
return factory2.createCallExpression(
factory2.createIdentifier("require"),
/*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;
if (moduleKind !== 2 /* AMD */) {
if (hasSyntacticModifier(node, 1 /* Export */)) {
statements = append(
statements,
setOriginalNode(
setTextRange(
factory2.createExpressionStatement(
createExportExpression(
node.name,
createRequireCall2(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,
createRequireCall2(node)
)
],
/*flags*/
languageVersion >= 2 /* ES2015 */ ? 2 /* Const */ : 0 /* None */
)
),
node
),
node
)
);
}
} else {
if (hasSyntacticModifier(node, 1 /* 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 visitExportDeclaration(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,
createRequireCall2(node)
)
])
),
/*location*/
node
),
/* original */
node
)
);
}
for (const specifier of node.exportClause.elements) {
if (languageVersion === 0 /* ES3 */) {
statements.push(
setOriginalNode(
setTextRange(
factory2.createExpressionStatement(
emitHelpers().createCreateBindingHelper(generatedName, factory2.createStringLiteralFromNode(specifier.propertyName || specifier.name), specifier.propertyName ? factory2.createStringLiteralFromNode(specifier.name) : void 0)
),
specifier
),
specifier
)
);
} else {
const exportNeedsImportDefault = !!getESModuleInterop(compilerOptions) && !(getInternalEmitFlags(node) & 2 /* NeverApplyImportHelper */) && idText(specifier.propertyName || specifier.name) === "default";
const exportedValue = factory2.createPropertyAccessExpression(
exportNeedsImportDefault ? emitHelpers().createImportDefaultHelper(generatedName) : generatedName,
specifier.propertyName || specifier.name
);
statements.push(
setOriginalNode(
setTextRange(
factory2.createExpressionStatement(
createExportExpression(
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 */ ? createRequireCall2(node) : isExportNamespaceAsDefaultDeclaration(node) ? generatedName : factory2.createIdentifier(idText(node.exportClause.name)))
)
),
node
),
node
)
);
return singleOrMany(statements);
} else {
return setOriginalNode(
setTextRange(
factory2.createExpressionStatement(
emitHelpers().createExportStarHelper(moduleKind !== 2 /* AMD */ ? createRequireCall2(node) : generatedName)
),
node
),
node
);
}
}
function visitExportAssignment(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, 1 /* 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));
}
statements = appendExportsOfHoistedDeclaration(statements, node);
return singleOrMany(statements);
}
function visitClassDeclaration(node) {
let statements;
if (hasSyntacticModifier(node, 1 /* 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, 1 /* 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;
}
if (importClause.name) {
statements = appendExportsOfDeclaration(statements, importClause);
}
const namedBindings = importClause.namedBindings;
if (namedBindings) {
switch (namedBindings.kind) {
case 273 /* NamespaceImport */:
statements = appendExportsOfDeclaration(statements, namedBindings);
break;
case 274 /* NamedImports */:
for (const importBinding of namedBindings.elements) {
statements = appendExportsOfDeclaration(
statements,
importBinding,
/*liveBinding*/
true
);
}
break;
}
}
return statements;
}
function appendExportsOfImportEqualsDeclaration(statements, decl) {
if (currentModuleInfo.exportEquals) {
return statements;
}
return appendExportsOfDeclaration(statements, 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, decl);
}
return statements;
}
function appendExportsOfHoistedDeclaration(statements, decl) {
if (currentModuleInfo.exportEquals) {
return statements;
}
if (hasSyntacticModifier(decl, 1 /* Export */)) {
const exportName = hasSyntacticModifier(decl, 1024 /* Default */) ? factory2.createIdentifier("default") : factory2.getDeclarationName(decl);
statements = appendExportStatement(
statements,
exportName,
factory2.getLocalName(decl),
/*location*/
decl
);
}
if (decl.name) {
statements = appendExportsOfDeclaration(statements, decl);
}
return statements;
}
function appendExportsOfDeclaration(statements, decl, liveBinding) {
const name = factory2.getDeclarationName(decl);
const exportSpecifiers = currentModuleInfo.exportSpecifiers.get(idText(name));
if (exportSpecifiers) {
for (const exportSpecifier of exportSpecifiers) {
statements = appendExportStatement(
statements,
exportSpecifier.name,
name,
/*location*/
exportSpecifier.name,
/*allowComments*/
void 0,
liveBinding
);
}
}
return statements;
}
function appendExportStatement(statements, exportName, expression, location, allowComments, liveBinding) {
statements = append(statements, createExportStatement(exportName, expression, location, allowComments, liveBinding));
return statements;
}
function createUnderscoreUnderscoreESModule() {
let statement;
if (languageVersion === 0 /* ES3 */) {
statement = factory2.createExpressionStatement(
createExportExpression(
factory2.createIdentifier("__esModule"),
factory2.createTrue()
)
);
} else {
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 && languageVersion !== 0 /* ES3 */ ? 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(
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 === 311 /* 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 212 /* CallExpression */:
return substituteCallExpression(node);
case 214 /* TaggedTemplateExpression */:
return substituteTaggedTemplateExpression(node);
case 225 /* 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 === 311 /* 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;
return setTextRange(
factory2.createPropertyAccessExpression(
factory2.getGeneratedNameForNode(((_b = (_a = importDeclaration.parent) == null ? void 0 : _a.parent) == null ? void 0 : _b.parent) || importDeclaration),
factory2.cloneNode(name)
),
/*location*/
node
);
}
}
}
return node;
}
function substituteBinaryExpression(node) {
if (isAssignmentOperator(node.operatorToken.kind) && isIdentifier(node.left) && !isGeneratedIdentifier(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);
}
}
}
}
}
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(303 /* ShorthandPropertyAssignment */);
context.enableSubstitution(225 /* BinaryExpression */);
context.enableSubstitution(235 /* MetaProperty */);
context.enableEmitNotification(311 /* 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, resolver, compilerOptions);
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 (!outFile(compilerOptions)) {
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") || !compilerOptions.noImplicitUseStrict && 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(512 /* 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 (!moduleInfo.exportedNames && moduleInfo.exportSpecifiers.size === 0) {
let hasExportDeclarationWithExportClause = false;
for (const externalImport of moduleInfo.externalImports) {
if (externalImport.kind === 277 /* 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 (exportedLocalName.escapedText === "default") {
continue;
}
exportedNames.push(
factory2.createPropertyAssignment(
factory2.createStringLiteralFromNode(exportedLocalName),
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 exports = 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(
exports,
/*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(exports, n),
factory2.createElementAccessExpression(m, n)
)
)
),
1 /* SingleLine */
)
])
),
factory2.createExpressionStatement(
factory2.createCallExpression(
exportFunction,
/*typeArguments*/
void 0,
[exports]
)
)
],
/*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 271 /* ImportDeclaration */:
if (!entry.importClause) {
break;
}
case 270 /* ImportEqualsDeclaration */:
Debug.assert(importVariableName !== void 0);
statements.push(
factory2.createExpressionStatement(
factory2.createAssignment(importVariableName, parameterName)
)
);
if (hasSyntacticModifier(entry, 1 /* Export */)) {
statements.push(
factory2.createExpressionStatement(
factory2.createCallExpression(
exportFunction,
/*typeArguments*/
void 0,
[
factory2.createStringLiteral(idText(importVariableName)),
parameterName
]
)
)
);
}
break;
case 277 /* 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(idText(e.name)),
factory2.createElementAccessExpression(
parameterName,
factory2.createStringLiteral(idText(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(idText(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 271 /* ImportDeclaration */:
return visitImportDeclaration(node);
case 270 /* ImportEqualsDeclaration */:
return visitImportEqualsDeclaration(node);
case 277 /* ExportDeclaration */:
return visitExportDeclaration(node);
case 276 /* 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, 1 /* 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 expressions;
const isExportedDeclaration = hasSyntacticModifier(node, 1 /* Export */);
for (const variable of node.declarationList.declarations) {
if (variable.initializer) {
expressions = append(expressions, transformInitializedVariable(variable, isExportedDeclaration));
} else {
hoistBindingElement(variable);
}
}
let statements;
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 === 311 /* SourceFile */ || (getOriginalNode(node).flags & 3 /* 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 273 /* NamespaceImport */:
statements = appendExportsOfDeclaration(statements, namedBindings);
break;
case 274 /* 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, 1 /* Export */)) {
const exportName = hasSyntacticModifier(decl, 1024 /* 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(idText(name));
if (exportSpecifiers) {
for (const exportSpecifier of exportSpecifiers) {
if (exportSpecifier.name.escapedText !== 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 242 /* VariableStatement */:
return visitVariableStatement(node);
case 261 /* FunctionDeclaration */:
return visitFunctionDeclaration(node);
case 262 /* ClassDeclaration */:
return visitClassDeclaration(node);
case 247 /* ForStatement */:
return visitForStatement(
node,
/*isTopLevel*/
true
);
case 248 /* ForInStatement */:
return visitForInStatement(node);
case 249 /* ForOfStatement */:
return visitForOfStatement(node);
case 245 /* DoStatement */:
return visitDoStatement(node);
case 246 /* WhileStatement */:
return visitWhileStatement(node);
case 255 /* LabeledStatement */:
return visitLabeledStatement(node);
case 253 /* WithStatement */:
return visitWithStatement(node);
case 244 /* IfStatement */:
return visitIfStatement(node);
case 254 /* SwitchStatement */:
return visitSwitchStatement(node);
case 268 /* CaseBlock */:
return visitCaseBlock(node);
case 295 /* CaseClause */:
return visitCaseClause(node);
case 296 /* DefaultClause */:
return visitDefaultClause(node);
case 257 /* TryStatement */:
return visitTryStatement(node);
case 298 /* CatchClause */:
return visitCatchClause(node);
case 240 /* 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,
Debug.checkDefined(visitNode(node.statement, topLevelNestedVisitor, isStatement, factory2.liftToBlock))
);
}
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),
Debug.checkDefined(visitNode(node.thenStatement, topLevelNestedVisitor, isStatement, factory2.liftToBlock)),
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 247 /* ForStatement */:
return visitForStatement(
node,
/*isTopLevel*/
false
);
case 243 /* ExpressionStatement */:
return visitExpressionStatement(node);
case 216 /* ParenthesizedExpression */:
return visitParenthesizedExpression(node, valueIsDiscarded);
case 359 /* PartiallyEmittedExpression */:
return visitPartiallyEmittedExpression(node, valueIsDiscarded);
case 225 /* BinaryExpression */:
if (isDestructuringAssignment(node)) {
return visitDestructuringAssignment(node, valueIsDiscarded);
}
break;
case 212 /* CallExpression */:
if (isImportCall(node)) {
return visitImportCallExpression(node);
}
break;
case 223 /* PrefixUnaryExpression */:
case 224 /* 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 === 311 /* 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 === 311 /* 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 303 /* 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)) {
return setTextRange(
factory2.createPropertyAssignment(
factory2.cloneNode(name),
factory2.createPropertyAccessExpression(
factory2.getGeneratedNameForNode(((_b = (_a = importDeclaration.parent) == null ? void 0 : _a.parent) == null ? void 0 : _b.parent) || importDeclaration),
factory2.cloneNode(importDeclaration.propertyName || importDeclaration.name)
)
),
/*location*/
node
);
}
}
}
return node;
}
function substituteExpression(node) {
switch (node.kind) {
case 80 /* Identifier */:
return substituteExpressionIdentifier(node);
case 225 /* BinaryExpression */:
return substituteBinaryExpression(node);
case 235 /* 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)) {
return setTextRange(
factory2.createPropertyAccessExpression(
factory2.getGeneratedNameForNode(((_b = (_a = importDeclaration.parent) == null ? void 0 : _a.parent) == null ? void 0 : _b.parent) || importDeclaration),
factory2.cloneNode(importDeclaration.propertyName || importDeclaration.name)
),
/*location*/
node
);
}
}
}
return node;
}
function substituteBinaryExpression(node) {
if (isAssignmentOperator(node.operatorToken.kind) && isIdentifier(node.left) && !isGeneratedIdentifier(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 === 311 /* SourceFile */) {
exportedNames = append(exportedNames, factory2.getDeclarationName(valueDeclaration));
}
exportedNames = addRange(exportedNames, moduleInfo == null ? void 0 : moduleInfo.exportedBindings[getOriginalNodeId(valueDeclaration)]);
}
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(311 /* SourceFile */);
context.enableSubstitution(80 /* Identifier */);
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;
let result = updateExternalModule(node);
currentSourceFile = void 0;
if (importRequireStatements) {
result = factory2.updateSourceFile(
result,
setTextRange(factory2.createNodeArray(insertStatementsAfterCustomPrologue(result.statements.slice(), importRequireStatements)), result.statements)
);
}
if (!isExternalModule(node) || 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);
append(statements, externalHelpersImportDeclaration);
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 270 /* ImportEqualsDeclaration */:
return getEmitModuleKind(compilerOptions) >= 100 /* Node16 */ ? visitImportEqualsDeclaration(node) : void 0;
case 276 /* ExportAssignment */:
return visitExportAssignment(node);
case 277 /* ExportDeclaration */:
const exportDecl = node;
return visitExportDeclaration(exportDecl);
}
return node;
}
function createRequireCall2(importNode) {
const moduleName = getExternalModuleNameLiteral(factory2, importNode, Debug.checkDefined(currentSourceFile), host, resolver, compilerOptions);
const args = [];
if (moduleName) {
args.push(moduleName);
}
if (!importRequireStatements) {
const createRequireName = factory2.createUniqueName("_createRequire", 16 /* Optimistic */ | 32 /* FileLevel */);
const importStatement = factory2.createImportDeclaration(
/*modifiers*/
void 0,
factory2.createImportClause(
/*isTypeOnly*/
false,
/*name*/
void 0,
factory2.createNamedImports([
factory2.createImportSpecifier(
/*isTypeOnly*/
false,
factory2.createIdentifier("createRequire"),
createRequireName
)
])
),
factory2.createStringLiteral("module")
);
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,
createRequireCall2(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, 1 /* 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) {
return node.isExportEquals ? void 0 : node;
}
function visitExportDeclaration(node) {
if (compilerOptions.module !== void 0 && compilerOptions.module > 5 /* ES2015 */) {
return node;
}
if (!node.exportClause || !isNamespaceExport(node.exportClause) || !node.moduleSpecifier) {
return node;
}
const oldIdentifier = node.exportClause.name;
const synthName = factory2.getGeneratedNameForNode(oldIdentifier);
const importDecl = factory2.createImportDeclaration(
/*modifiers*/
void 0,
factory2.createImportClause(
/*isTypeOnly*/
false,
/*name*/
void 0,
factory2.createNamespaceImport(
synthName
)
),
node.moduleSpecifier,
node.assertClause
);
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();
}
previousOnEmitNode(hint, node, emitCallback);
helperNameSubstitutions = void 0;
} else {
previousOnEmitNode(hint, node, emitCallback);
}
}
function onSubstituteNode(hint, node) {
node = previousOnSubstituteNode(hint, node);
if (helperNameSubstitutions && isIdentifier(node) && getEmitFlags(node) & 8192 /* HelperName */) {
return substituteHelperName(node);
}
return node;
}
function substituteHelperName(node) {
const name = idText(node);
let substitution = helperNameSubstitutions.get(name);
if (!substitution) {
helperNameSubstitutions.set(name, substitution = factory2.createUniqueName(name, 16 /* Optimistic */ | 32 /* FileLevel */));
}
return substitution;
}
}
// src/compiler/transformers/module/node.ts
function transformNodeModule(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;
context.onSubstituteNode = onSubstituteNode;
context.onEmitNode = onEmitNode;
context.enableSubstitution(311 /* SourceFile */);
context.enableEmitNotification(311 /* 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 (currentSourceFile.impliedNodeFormat === 99 /* ESNext */) {
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 (currentSourceFile.impliedNodeFormat === 99 /* ESNext */) {
return esmOnEmitNode(hint, node, emitCallback);
}
return cjsOnEmitNode(hint, node, emitCallback);
}
function getModuleTransformForFile(file) {
return file.impliedNodeFormat === 99 /* ESNext */ ? 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 === 311 /* SourceFile */ ? transformSourceFile(node) : transformBundle(node);
}
function transformBundle(node) {
return context.factory.createBundle(map(node.sourceFiles, transformSourceFile), node.prepends);
}
}
// 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 === 262 /* 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 === 262 /* 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, 8 /* 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 === 259 /* VariableDeclaration */ || node.kind === 207 /* 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 === 171 /* PropertyDeclaration */ || node.kind === 210 /* PropertyAccessExpression */ || node.kind === 211 /* ElementAccessExpression */ || node.kind === 225 /* BinaryExpression */ || node.kind === 170 /* PropertySignature */ || node.kind === 168 /* Parameter */ && hasSyntacticModifier(node.parent, 8 /* 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 === 262 /* ClassDeclaration */ || node.kind === 168 /* 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 === 177 /* 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 179 /* 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 178 /* 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 180 /* 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 173 /* MethodDeclaration */:
case 172 /* 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 === 262 /* 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 261 /* 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 175 /* 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 179 /* ConstructSignature */:
case 184 /* 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 178 /* 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 180 /* 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 173 /* MethodDeclaration */:
case 172 /* 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 === 262 /* 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 261 /* FunctionDeclaration */:
case 183 /* 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 177 /* SetAccessor */:
case 176 /* 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 262 /* ClassDeclaration */:
diagnosticMessage = Diagnostics.Type_parameter_0_of_exported_class_has_or_is_using_private_name_1;
break;
case 263 /* InterfaceDeclaration */:
diagnosticMessage = Diagnostics.Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1;
break;
case 199 /* MappedType */:
diagnosticMessage = Diagnostics.Type_parameter_0_of_exported_mapped_object_type_is_using_private_name_1;
break;
case 184 /* ConstructorType */:
case 179 /* ConstructSignature */:
diagnosticMessage = Diagnostics.Type_parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1;
break;
case 178 /* CallSignature */:
diagnosticMessage = Diagnostics.Type_parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1;
break;
case 173 /* MethodDeclaration */:
case 172 /* 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 === 262 /* 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 183 /* FunctionType */:
case 261 /* FunctionDeclaration */:
diagnosticMessage = Diagnostics.Type_parameter_0_of_exported_function_has_or_is_using_private_name_1;
break;
case 194 /* InferType */:
diagnosticMessage = Diagnostics.Extends_clause_for_inferred_type_0_has_or_is_using_private_name_1;
break;
case 264 /* 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
};
}
}
// src/compiler/transformers/declarations.ts
function getDeclarationDiagnostics(host, resolver, file) {
const compilerOptions = host.getCompilerOptions();
const result = transformNodes(
resolver,
host,
factory,
compilerOptions,
file ? [file] : filter(host.getSourceFiles(), isSourceFileNotJson),
[transformDeclarations],
/*allowDtsFiles*/
false
);
return result.diagnostics;
}
function hasInternalAnnotation(range, currentSourceFile) {
const comment = currentSourceFile.text.substring(range.pos, range.end);
return stringContains(comment, "@internal");
}
function isInternalDeclaration(node, currentSourceFile) {
const parseTreeNode = getParseTreeNode(node);
if (parseTreeNode && parseTreeNode.kind === 168 /* Parameter */) {
const paramIdx = parseTreeNode.parent.parameters.indexOf(parseTreeNode);
const previousSibling = paramIdx > 0 ? parseTreeNode.parent.parameters[paramIdx - 1] : void 0;
const text = currentSourceFile.text;
const commentRanges = previousSibling ? concatenate(
// to handle
// ... parameters, /** @internal */
// public param: string
getTrailingCommentRanges(text, skipTrivia(
text,
previousSibling.end + 1,
/*stopAfterLineBreak*/
false,
/*stopAtComments*/
true
)),
getLeadingCommentRanges(text, node.pos)
) : getTrailingCommentRanges(text, skipTrivia(
text,
node.pos,
/*stopAfterLineBreak*/
false,
/*stopAtComments*/
true
));
return commentRanges && commentRanges.length && hasInternalAnnotation(last(commentRanges), currentSourceFile);
}
const leadingCommentRanges = parseTreeNode && getLeadingCommentRangesOfNode(parseTreeNode, currentSourceFile);
return !!forEach(leadingCommentRanges, (range) => {
return hasInternalAnnotation(range, currentSourceFile);
});
}
var declarationEmitNodeBuilderFlags = 1024 /* MultilineObjectLiterals */ | 2048 /* WriteClassExpressionAsTypeLiteral */ | 4096 /* UseTypeOfFunction */ | 8 /* UseStructuralFallback */ | 524288 /* AllowEmptyTuple */ | 4 /* GenerateNamesForShadowedTypeParams */ | 1 /* NoTruncation */;
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 necessaryTypeReferences;
let lateMarkedStatements;
let lateStatementReplacementMap;
let suppressNewDiagnosticContexts;
let exportedModulesFromDeclarationEmit;
const { factory: factory2 } = context;
const host = context.getEmitHost();
const symbolTracker = {
trackSymbol,
reportInaccessibleThisError,
reportInaccessibleUniqueSymbolError,
reportCyclicStructureError,
reportPrivateInBaseOfClassExpression,
reportLikelyUnsafeImportRequiredError,
reportTruncationError,
moduleResolverHost: host,
trackReferencedAmbientModule,
trackExternalModuleSymbolOfImportTypeNode,
reportNonlocalAugmentation,
reportNonSerializableProperty,
reportImportTypeNodeResolutionModeOverride
};
let errorNameNode;
let errorFallbackNode;
let currentSourceFile;
let refs;
let libs2;
let emittedImports;
const resolver = context.getEmitResolver();
const options = context.getCompilerOptions();
const { noResolve, stripInternal } = options;
return transformRoot;
function recordTypeReferenceDirectivesIfNecessary(typeReferenceDirectives) {
if (!typeReferenceDirectives) {
return;
}
necessaryTypeReferences = necessaryTypeReferences || /* @__PURE__ */ new Set();
for (const ref of typeReferenceDirectives) {
necessaryTypeReferences.add(ref);
}
}
function trackReferencedAmbientModule(node, symbol) {
const directives = resolver.getTypeReferenceDirectivesForSymbol(symbol, 67108863 /* All */);
if (length(directives)) {
return recordTypeReferenceDirectivesIfNecessary(directives);
}
const container = getSourceFileOfNode(node);
refs.set(getOriginalNodeId(container), container);
}
function handleSymbolAccessibilityError(symbolAccessibilityResult) {
if (symbolAccessibilityResult.accessibility === 0 /* Accessible */) {
if (symbolAccessibilityResult && symbolAccessibilityResult.aliasesToMakeVisible) {
if (!lateMarkedStatements) {
lateMarkedStatements = symbolAccessibilityResult.aliasesToMakeVisible;
} else {
for (const ref of symbolAccessibilityResult.aliasesToMakeVisible) {
pushIfUnique(lateMarkedStatements, ref);
}
}
}
} else {
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 trackExternalModuleSymbolOfImportTypeNode(symbol) {
if (!isBundledEmit) {
(exportedModulesFromDeclarationEmit || (exportedModulesFromDeclarationEmit = [])).push(symbol);
}
}
function trackSymbol(symbol, enclosingDeclaration2, meaning) {
if (symbol.flags & 262144 /* TypeParameter */)
return false;
const issuedDiagnostic = handleSymbolAccessibilityError(resolver.isSymbolAccessible(
symbol,
enclosingDeclaration2,
meaning,
/*shouldComputeAliasToMarkVisible*/
true
));
recordTypeReferenceDirectivesIfNecessary(resolver.getTypeReferenceDirectivesForSymbol(symbol, meaning));
return issuedDiagnostic;
}
function reportPrivateInBaseOfClassExpression(propertyName) {
if (errorNameNode || errorFallbackNode) {
context.addDiagnostic(
createDiagnosticForNode(errorNameNode || errorFallbackNode, Diagnostics.Property_0_of_exported_class_expression_may_not_be_private_or_protected, propertyName)
);
}
}
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 reportImportTypeNodeResolutionModeOverride() {
if (!isNightly() && (errorNameNode || errorFallbackNode)) {
context.addDiagnostic(createDiagnosticForNode(errorNameNode || errorFallbackNode, Diagnostics.The_type_of_this_expression_cannot_be_named_without_a_resolution_mode_assertion_which_is_an_unstable_feature_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next));
}
}
function transformDeclarationsForJS(sourceFile, bundled) {
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, symbolTracker, bundled);
getSymbolAccessibilityDiagnostic = oldDiag;
return result;
}
function transformRoot(node) {
if (node.kind === 311 /* SourceFile */ && node.isDeclarationFile) {
return node;
}
if (node.kind === 312 /* Bundle */) {
isBundledEmit = true;
refs = /* @__PURE__ */ new Map();
libs2 = /* @__PURE__ */ new Map();
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;
collectReferences(sourceFile, refs);
collectLibs(sourceFile, libs2);
if (isExternalOrCommonJsModule(sourceFile) || isJsonSourceFile(sourceFile)) {
resultHasExternalModuleIndicator = false;
needsDeclare = false;
const statements = isSourceFileJS(sourceFile) ? factory2.createNodeArray(transformDeclarationsForJS(
sourceFile,
/*bundled*/
true
)) : 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 updated2 = isSourceFileJS(sourceFile) ? factory2.createNodeArray(transformDeclarationsForJS(sourceFile)) : visitNodes2(sourceFile.statements, visitDeclarationStatements, isStatement);
return factory2.updateSourceFile(
sourceFile,
transformAndReplaceLatePaintedStatements(updated2),
/*isDeclarationFile*/
true,
/*referencedFiles*/
[],
/*typeReferences*/
[],
/*hasNoDefaultLib*/
false,
/*libReferences*/
[]
);
}
), mapDefined(node.prepends, (prepend) => {
if (prepend.kind === 314 /* InputFiles */) {
const sourceFile = createUnparsedSourceFile(prepend, "dts", stripInternal);
hasNoDefaultLib = hasNoDefaultLib || !!sourceFile.hasNoDefaultLib;
collectReferences(sourceFile, refs);
recordTypeReferenceDirectivesIfNecessary(map(sourceFile.typeReferenceDirectives, (ref) => [ref.fileName, ref.resolutionMode]));
collectLibs(sourceFile, libs2);
return sourceFile;
}
return prepend;
}));
bundle.syntheticFileReferences = [];
bundle.syntheticTypeReferences = getFileReferencesForUsedTypeReferences();
bundle.syntheticLibReferences = getLibReferences();
bundle.hasNoDefaultLib = hasNoDefaultLib;
const outputFilePath2 = getDirectoryPath(normalizeSlashes(getOutputPathsFor(
node,
host,
/*forceDtsPaths*/
true
).declarationFilePath));
const referenceVisitor2 = mapReferencesIntoArray(bundle.syntheticFileReferences, outputFilePath2);
refs.forEach(referenceVisitor2);
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();
necessaryTypeReferences = void 0;
refs = collectReferences(currentSourceFile, /* @__PURE__ */ new Map());
libs2 = collectLibs(currentSourceFile, /* @__PURE__ */ new Map());
const references = [];
const outputFilePath = getDirectoryPath(normalizeSlashes(getOutputPathsFor(
node,
host,
/*forceDtsPaths*/
true
).declarationFilePath));
const referenceVisitor = mapReferencesIntoArray(references, outputFilePath);
let combinedStatements;
if (isSourceFileJS(currentSourceFile)) {
combinedStatements = factory2.createNodeArray(transformDeclarationsForJS(node));
refs.forEach(referenceVisitor);
emittedImports = filter(combinedStatements, isAnyImportSyntax);
} else {
const statements = visitNodes2(node.statements, visitDeclarationStatements, isStatement);
combinedStatements = setTextRange(factory2.createNodeArray(transformAndReplaceLatePaintedStatements(statements)), node.statements);
refs.forEach(referenceVisitor);
emittedImports = filter(combinedStatements, isAnyImportSyntax);
if (isExternalModule(node) && (!resultHasExternalModuleIndicator || needsScopeFixMarker && !resultHasScopeMarker)) {
combinedStatements = setTextRange(factory2.createNodeArray([...combinedStatements, createEmptyExports(factory2)]), combinedStatements);
}
}
const updated = factory2.updateSourceFile(
node,
combinedStatements,
/*isDeclarationFile*/
true,
references,
getFileReferencesForUsedTypeReferences(),
node.hasNoDefaultLib,
getLibReferences()
);
updated.exportedModulesFromDeclarationEmit = exportedModulesFromDeclarationEmit;
return updated;
function getLibReferences() {
return arrayFrom(libs2.keys(), (lib) => ({ fileName: lib, pos: -1, end: -1 }));
}
function getFileReferencesForUsedTypeReferences() {
return necessaryTypeReferences ? mapDefined(arrayFrom(necessaryTypeReferences.keys()), getFileReferenceForSpecifierModeTuple) : [];
}
function getFileReferenceForSpecifierModeTuple([typeName, mode]) {
if (emittedImports) {
for (const importStatement of emittedImports) {
if (isImportEqualsDeclaration(importStatement) && isExternalModuleReference(importStatement.moduleReference)) {
const expr = importStatement.moduleReference.expression;
if (isStringLiteralLike(expr) && expr.text === typeName) {
return void 0;
}
} else if (isImportDeclaration(importStatement) && isStringLiteral(importStatement.moduleSpecifier) && importStatement.moduleSpecifier.text === typeName) {
return void 0;
}
}
}
return { fileName: typeName, pos: -1, end: -1, ...mode ? { resolutionMode: mode } : void 0 };
}
function mapReferencesIntoArray(references2, outputFilePath2) {
return (file) => {
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) {
const specifier = getModuleSpecifier(
options,
currentSourceFile,
toPath(outputFilePath2, host.getCurrentDirectory(), host.getCanonicalFileName),
toPath(declFileName, host.getCurrentDirectory(), host.getCanonicalFileName),
host
);
if (!pathIsRelative(specifier)) {
recordTypeReferenceDirectivesIfNecessary([[
specifier,
/*mode*/
void 0
]]);
return;
}
let fileName = getRelativePathToDirectoryOrUrl(
outputFilePath2,
declFileName,
host.getCurrentDirectory(),
host.getCanonicalFileName,
/*isAbsolutePathAnUrl*/
false
);
if (startsWith(fileName, "./") && hasExtension(fileName)) {
fileName = fileName.substring(2);
}
if (startsWith(fileName, "node_modules/") || pathContainsNodeModules(fileName)) {
return;
}
references2.push({ pos: -1, end: -1, fileName });
}
};
}
}
function collectReferences(sourceFile, ret) {
if (noResolve || !isUnparsedSource(sourceFile) && isSourceFileJS(sourceFile))
return ret;
forEach(sourceFile.referencedFiles, (f) => {
const elem = host.getSourceFileFromReference(sourceFile, f);
if (elem) {
ret.set(getOriginalNodeId(elem), elem);
}
});
return ret;
}
function collectLibs(sourceFile, ret) {
forEach(sourceFile.libReferenceDirectives, (ref) => {
const lib = host.getLibFileFromReference(ref);
if (lib) {
ret.set(toFileNameLowerCase(ref.fileName), true);
}
});
return ret;
}
function filterBindingPatternInitializersAndRenamings(name) {
if (name.kind === 80 /* Identifier */) {
return name;
} else {
if (name.kind === 206 /* 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 === 231 /* OmittedExpression */) {
return elem;
}
if (elem.propertyName && isIdentifier(elem.propertyName) && isIdentifier(elem.name) && !elem.symbol.isReferenced && !isIdentifierANonContextualKeyword(elem.propertyName)) {
return factory2.updateBindingElement(
elem,
elem.dotDotDotToken,
/*propertyName*/
void 0,
elem.propertyName,
shouldPrintWithInitializer(elem) ? elem.initializer : void 0
);
}
return factory2.updateBindingElement(
elem,
elem.dotDotDotToken,
elem.propertyName,
filterBindingPatternInitializersAndRenamings(elem.name),
shouldPrintWithInitializer(elem) ? elem.initializer : void 0
);
}
}
function ensureParameter(p, modifierMask, type) {
let oldDiag;
if (!suppressNewDiagnosticContexts) {
oldDiag = getSymbolAccessibilityDiagnostic;
getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(p);
}
const newParam = factory2.updateParameterDeclaration(
p,
maskModifiers(factory2, p, modifierMask),
p.dotDotDotToken,
filterBindingPatternInitializersAndRenamings(p.name),
resolver.isOptionalParameter(p) ? p.questionToken || factory2.createToken(58 /* QuestionToken */) : void 0,
ensureType(
p,
type || p.type,
/*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) && resolver.isLiteralConstDeclaration(getParseTreeNode(node));
}
function ensureNoInitializer(node) {
if (shouldPrintWithInitializer(node)) {
return resolver.createLiteralConstValue(getParseTreeNode(node), symbolTracker);
}
return void 0;
}
function ensureType(node, type, ignorePrivate) {
if (!ignorePrivate && hasEffectiveModifier(node, 8 /* Private */)) {
return;
}
if (shouldPrintWithInitializer(node)) {
return;
}
const shouldUseResolverType = node.kind === 168 /* Parameter */ && (resolver.isRequiredInitializedParameter(node) || resolver.isOptionalUninitializedParameterProperty(node));
if (type && !shouldUseResolverType) {
return visitNode(type, visitDeclarationSubtree, isTypeNode);
}
if (!getParseTreeNode(node)) {
return type ? visitNode(type, visitDeclarationSubtree, isTypeNode) : factory2.createKeywordTypeNode(133 /* AnyKeyword */);
}
if (node.kind === 177 /* SetAccessor */) {
return factory2.createKeywordTypeNode(133 /* AnyKeyword */);
}
errorNameNode = node.name;
let oldDiag;
if (!suppressNewDiagnosticContexts) {
oldDiag = getSymbolAccessibilityDiagnostic;
getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(node);
}
if (node.kind === 259 /* VariableDeclaration */ || node.kind === 207 /* BindingElement */) {
return cleanup(resolver.createTypeOfDeclaration(node, enclosingDeclaration, declarationEmitNodeBuilderFlags, symbolTracker));
}
if (node.kind === 168 /* Parameter */ || node.kind === 171 /* PropertyDeclaration */ || node.kind === 170 /* PropertySignature */) {
if (isPropertySignature(node) || !node.initializer)
return cleanup(resolver.createTypeOfDeclaration(node, enclosingDeclaration, declarationEmitNodeBuilderFlags, symbolTracker, shouldUseResolverType));
return cleanup(resolver.createTypeOfDeclaration(node, enclosingDeclaration, declarationEmitNodeBuilderFlags, symbolTracker, shouldUseResolverType) || resolver.createTypeOfExpression(node.initializer, enclosingDeclaration, declarationEmitNodeBuilderFlags, symbolTracker));
}
return cleanup(resolver.createReturnTypeOfSignatureDeclaration(node, enclosingDeclaration, declarationEmitNodeBuilderFlags, symbolTracker));
function cleanup(returnValue) {
errorNameNode = void 0;
if (!suppressNewDiagnosticContexts) {
getSymbolAccessibilityDiagnostic = oldDiag;
}
return returnValue || factory2.createKeywordTypeNode(133 /* AnyKeyword */);
}
}
function isDeclarationAndNotVisible(node) {
node = getParseTreeNode(node);
switch (node.kind) {
case 261 /* FunctionDeclaration */:
case 266 /* ModuleDeclaration */:
case 263 /* InterfaceDeclaration */:
case 262 /* ClassDeclaration */:
case 264 /* TypeAliasDeclaration */:
case 265 /* EnumDeclaration */:
return !resolver.isDeclarationVisible(node);
case 259 /* VariableDeclaration */:
return !getBindingNameVisible(node);
case 270 /* ImportEqualsDeclaration */:
case 271 /* ImportDeclaration */:
case 277 /* ExportDeclaration */:
case 276 /* ExportAssignment */:
return false;
case 174 /* 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, 8 /* 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) {
const accessorType = getTypeAnnotationFromAllAccessorDeclarations(input, resolver.getAllAccessorDeclarations(input));
newValueParameter = ensureParameter(
valueParameter,
/*modifierMask*/
void 0,
accessorType
);
}
}
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, 8 /* 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);
recordTypeReferenceDirectivesIfNecessary(resolver.getTypeReferenceDirectivesForEntityName(entityName));
}
function preserveJsDoc(updated, original) {
if (hasJSDocNodes(updated) && hasJSDocNodes(original)) {
updated.jsDoc = original.jsDoc;
}
return setCommentRange(updated, getCommentRange(original));
}
function rewriteModuleSpecifier(parent2, input) {
if (!input)
return void 0;
resultHasExternalModuleIndicator = resultHasExternalModuleIndicator || parent2.kind !== 266 /* ModuleDeclaration */ && parent2.kind !== 204 /* ImportType */;
if (isStringLiteralLike(input)) {
if (isBundledEmit) {
const newName = getExternalModuleNameFromDeclaration(context.getEmitHost(), resolver, parent2);
if (newName) {
return factory2.createStringLiteral(newName);
}
} else {
const symbol = resolver.getSymbolOfExternalModuleSpecifier(input);
if (symbol) {
(exportedModulesFromDeclarationEmit || (exportedModulesFromDeclarationEmit = [])).push(symbol);
}
}
}
return input;
}
function transformImportEqualsDeclaration(decl) {
if (!resolver.isDeclarationVisible(decl))
return;
if (decl.moduleReference.kind === 282 /* ExternalModuleReference */) {
const specifier = getExternalModuleImportEqualsDeclarationExpression(decl);
return factory2.updateImportEqualsDeclaration(
decl,
decl.modifiers,
decl.isTypeOnly,
decl.name,
factory2.updateExternalModuleReference(decl.moduleReference, rewriteModuleSpecifier(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,
rewriteModuleSpecifier(decl, decl.moduleSpecifier),
getResolutionModeOverrideForClauseInNightly(decl.assertClause)
);
}
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,
decl.importClause.isTypeOnly,
visibleDefaultBinding,
/*namedBindings*/
void 0
), rewriteModuleSpecifier(decl, decl.moduleSpecifier), getResolutionModeOverrideForClauseInNightly(decl.assertClause));
}
if (decl.importClause.namedBindings.kind === 273 /* 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,
decl.importClause.isTypeOnly,
visibleDefaultBinding,
namedBindings
), rewriteModuleSpecifier(decl, decl.moduleSpecifier), getResolutionModeOverrideForClauseInNightly(decl.assertClause)) : 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,
decl.importClause.isTypeOnly,
visibleDefaultBinding,
bindingList && bindingList.length ? factory2.updateNamedImports(decl.importClause.namedBindings, bindingList) : void 0
),
rewriteModuleSpecifier(decl, decl.moduleSpecifier),
getResolutionModeOverrideForClauseInNightly(decl.assertClause)
);
}
if (resolver.isImportRequiredByAugmentation(decl)) {
return factory2.updateImportDeclaration(
decl,
decl.modifiers,
/*importClause*/
void 0,
rewriteModuleSpecifier(decl, decl.moduleSpecifier),
getResolutionModeOverrideForClauseInNightly(decl.assertClause)
);
}
}
function getResolutionModeOverrideForClauseInNightly(assertClause) {
const mode = getResolutionModeOverrideForClause(assertClause);
if (mode !== void 0) {
if (!isNightly()) {
context.addDiagnostic(createDiagnosticForNode(assertClause, Diagnostics.resolution_mode_assertions_are_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next));
}
return assertClause;
}
return 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) && !resolver.isLateBound(getParseTreeNode(input))) {
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 === 186 /* TypeLiteral */ || input.kind === 199 /* MappedType */) && input.parent.kind !== 264 /* TypeAliasDeclaration */;
if (isMethodDeclaration(input) || isMethodSignature(input)) {
if (hasEffectiveModifier(input, 8 /* 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 232 /* 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 182 /* TypeReference */: {
checkEntityNameVisibility(input.typeName, enclosingDeclaration);
const node = visitEachChild(input, visitDeclarationSubtree, context);
return cleanup(factory2.updateTypeReferenceNode(node, node.typeName, node.typeArguments));
}
case 179 /* ConstructSignature */:
return cleanup(factory2.updateConstructSignature(
input,
ensureTypeParams(input, input.typeParameters),
updateParamsList(input, input.parameters),
ensureType(input, input.type)
));
case 175 /* Constructor */: {
const ctor = factory2.createConstructorDeclaration(
/*modifiers*/
ensureModifiers(input),
updateParamsList(input, input.parameters, 0 /* None */),
/*body*/
void 0
);
return cleanup(ctor);
}
case 173 /* 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, input.type),
/*body*/
void 0
);
return cleanup(sig);
}
case 176 /* GetAccessor */: {
if (isPrivateIdentifier(input.name)) {
return cleanup(
/*returnValue*/
void 0
);
}
const accessorType = getTypeAnnotationFromAllAccessorDeclarations(input, resolver.getAllAccessorDeclarations(input));
return cleanup(factory2.updateGetAccessorDeclaration(
input,
ensureModifiers(input),
input.name,
updateAccessorParamsList(input, hasEffectiveModifier(input, 8 /* Private */)),
ensureType(input, accessorType),
/*body*/
void 0
));
}
case 177 /* SetAccessor */: {
if (isPrivateIdentifier(input.name)) {
return cleanup(
/*returnValue*/
void 0
);
}
return cleanup(factory2.updateSetAccessorDeclaration(
input,
ensureModifiers(input),
input.name,
updateAccessorParamsList(input, hasEffectiveModifier(input, 8 /* Private */)),
/*body*/
void 0
));
}
case 171 /* PropertyDeclaration */:
if (isPrivateIdentifier(input.name)) {
return cleanup(
/*returnValue*/
void 0
);
}
return cleanup(factory2.updatePropertyDeclaration(
input,
ensureModifiers(input),
input.name,
input.questionToken,
ensureType(input, input.type),
ensureNoInitializer(input)
));
case 170 /* PropertySignature */:
if (isPrivateIdentifier(input.name)) {
return cleanup(
/*returnValue*/
void 0
);
}
return cleanup(factory2.updatePropertySignature(
input,
ensureModifiers(input),
input.name,
input.questionToken,
ensureType(input, input.type)
));
case 172 /* 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, input.type)
));
}
case 178 /* CallSignature */: {
return cleanup(factory2.updateCallSignature(
input,
ensureTypeParams(input, input.typeParameters),
updateParamsList(input, input.parameters),
ensureType(input, input.type)
));
}
case 180 /* IndexSignature */: {
return cleanup(factory2.updateIndexSignature(
input,
ensureModifiers(input),
updateParamsList(input, input.parameters),
visitNode(input.type, visitDeclarationSubtree, isTypeNode) || factory2.createKeywordTypeNode(133 /* AnyKeyword */)
));
}
case 259 /* 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, input.type),
ensureNoInitializer(input)
));
}
case 167 /* 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 193 /* 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 183 /* FunctionType */: {
return cleanup(factory2.updateFunctionTypeNode(input, visitNodes2(input.typeParameters, visitDeclarationSubtree, isTypeParameterDeclaration), updateParamsList(input, input.parameters), Debug.checkDefined(visitNode(input.type, visitDeclarationSubtree, isTypeNode))));
}
case 184 /* 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 204 /* ImportType */: {
if (!isLiteralImportTypeNode(input))
return cleanup(input);
return cleanup(factory2.updateImportTypeNode(
input,
factory2.updateLiteralTypeNode(input.argument, rewriteModuleSpecifier(input, input.argument.literal)),
input.assertions,
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 === 173 /* MethodDeclaration */ && hasEffectiveModifier(node.parent, 8 /* Private */);
}
function visitDeclarationStatements(input) {
if (!isPreservedDeclarationStatement(input)) {
return;
}
if (shouldStripInternal(input))
return;
switch (input.kind) {
case 277 /* ExportDeclaration */: {
if (isSourceFile(input.parent)) {
resultHasExternalModuleIndicator = true;
}
resultHasScopeMarker = true;
return factory2.updateExportDeclaration(
input,
input.modifiers,
input.isTypeOnly,
input.exportClause,
rewriteModuleSpecifier(input, input.moduleSpecifier),
getResolutionModeOverrideForClause(input.assertClause) ? input.assertClause : void 0
);
}
case 276 /* 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 varDecl = factory2.createVariableDeclaration(
newId,
/*exclamationToken*/
void 0,
resolver.createTypeOfExpression(input.expression, input, declarationEmitNodeBuilderFlags, symbolTracker),
/*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, 1024 /* Default */) || !canHaveModifiers(statement)) {
return statement;
}
const modifiers = factory2.createModifiersFromModifierFlags(getEffectiveModifierFlags(statement) & (258047 /* All */ ^ 1 /* Export */));
return factory2.updateModifiers(statement, modifiers);
}
function transformTopLevelDeclaration(input) {
if (lateMarkedStatements) {
while (orderedRemoveItem(lateMarkedStatements, input))
;
}
if (shouldStripInternal(input))
return;
switch (input.kind) {
case 270 /* ImportEqualsDeclaration */: {
return transformImportEqualsDeclaration(input);
}
case 271 /* ImportDeclaration */: {
return transformImportDeclaration(input);
}
}
if (isDeclaration(input) && isDeclarationAndNotVisible(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 264 /* 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 263 /* InterfaceDeclaration */: {
return cleanup(factory2.updateInterfaceDeclaration(
input,
ensureModifiers(input),
input.name,
ensureTypeParams(input, input.typeParameters),
transformHeritageClauses(input.heritageClauses),
visitNodes2(input.members, visitDeclarationSubtree, isTypeElement)
));
}
case 261 /* FunctionDeclaration */: {
const clean2 = cleanup(factory2.updateFunctionDeclaration(
input,
ensureModifiers(input),
/*asteriskToken*/
void 0,
input.name,
ensureTypeParams(input, input.typeParameters),
updateParamsList(input, input.parameters),
ensureType(input, input.type),
/*body*/
void 0
));
if (clean2 && resolver.isExpandoFunctionDeclaration(input) && shouldEmitFunctionProperties(input)) {
const props = resolver.getPropertiesOfContainerFunction(input);
const fakespace = parseNodeFactory.createModuleDeclaration(
/*modifiers*/
void 0,
clean2.name || factory2.createIdentifier("_default"),
factory2.createModuleBlock([]),
16 /* Namespace */
);
setParent(fakespace, enclosingDeclaration);
fakespace.locals = createSymbolTable(props);
fakespace.symbol = props[0].parent;
const exportMappings = [];
let declarations = mapDefined(props, (p) => {
if (!p.valueDeclaration || !(isPropertyAccessExpression(p.valueDeclaration) || isElementAccessExpression(p.valueDeclaration) || isBinaryExpression(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, 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.updateModifiers(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), 16 /* Namespace */);
if (!hasEffectiveModifier(clean2, 1024 /* Default */)) {
return [clean2, namespaceDecl];
}
const modifiers = factory2.createModifiersFromModifierFlags(getEffectiveModifierFlags(clean2) & ~1025 /* ExportDefault */ | 2 /* 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 266 /* ModuleDeclaration */: {
needsDeclare = false;
const inner = input.body;
if (inner && inner.kind === 267 /* 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 & 16777216 /* 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(factory2.updateModuleDeclaration(
input,
mods,
isExternalModuleAugmentation(input) ? rewriteModuleSpecifier(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(factory2.updateModuleDeclaration(
input,
mods,
input.name,
body
));
}
}
case 262 /* 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, 16476 /* 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, param.type),
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,
/*type*/
void 0
),
/*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 memberNodes = concatenate(concatenate(privateIdentifier, 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, 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 242 /* VariableStatement */: {
return cleanup(transformVariableStatement(input));
}
case 265 /* EnumDeclaration */: {
return cleanup(factory2.updateEnumDeclaration(input, factory2.createNodeArray(ensureModifiers(input)), input.name, factory2.createNodeArray(mapDefined(input.members, (m) => {
if (shouldStripInternal(m))
return;
const constValue = resolver.getConstantValue(m);
return preserveJsDoc(factory2.updateEnumMember(m, m.name, constValue !== void 0 ? typeof constValue === "string" ? factory2.createStringLiteral(constValue) : factory2.createNumericLiteral(constValue) : void 0), 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 === 266 /* 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;
return factory2.updateVariableStatement(input, factory2.createNodeArray(ensureModifiers(input)), factory2.updateVariableDeclarationList(input.declarationList, nodes));
}
function recreateBindingPattern(d) {
return flatten(mapDefined(d.elements, (e) => recreateBindingElement(e)));
}
function recreateBindingElement(e) {
if (e.kind === 231 /* 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,
/*type*/
void 0
),
/*initializer*/
void 0
);
}
}
}
function checkName(node) {
let oldDiag;
if (!suppressNewDiagnosticContexts) {
oldDiag = getSymbolAccessibilityDiagnostic;
getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNodeName(node);
}
errorNameNode = node.name;
Debug.assert(resolver.isLateBound(getParseTreeNode(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 mask2 = 258047 /* All */ ^ (4 /* Public */ | 512 /* Async */ | 16384 /* Override */);
let additions = needsDeclare && !isAlwaysType(node) ? 2 /* Ambient */ : 0 /* None */;
const parentIsFile = node.parent.kind === 311 /* SourceFile */;
if (!parentIsFile || isBundledEmit && parentIsFile && isExternalModule(node.parent)) {
mask2 ^= 2 /* Ambient */;
additions = 0 /* None */;
}
return maskModifierFlags(node, mask2, additions);
}
function getTypeAnnotationFromAllAccessorDeclarations(node, accessors) {
let accessorType = getTypeAnnotationFromAccessor(node);
if (!accessorType && node !== accessors.firstAccessor) {
accessorType = getTypeAnnotationFromAccessor(accessors.firstAccessor);
getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(accessors.firstAccessor);
}
if (!accessorType && accessors.secondAccessor && node !== accessors.secondAccessor) {
accessorType = getTypeAnnotationFromAccessor(accessors.secondAccessor);
getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(accessors.secondAccessor);
}
return accessorType;
}
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 === 263 /* InterfaceDeclaration */) {
return true;
}
return false;
}
function maskModifiers(factory2, node, modifierMask, modifierAdditions) {
return factory2.createModifiersFromModifierFlags(maskModifierFlags(node, modifierMask, modifierAdditions));
}
function maskModifierFlags(node, modifierMask = 258047 /* All */ ^ 4 /* Public */, modifierAdditions = 0 /* None */) {
let flags = getEffectiveModifierFlags(node) & modifierMask | modifierAdditions;
if (flags & 1024 /* Default */ && !(flags & 1 /* Export */)) {
flags ^= 1 /* Export */;
}
if (flags & 1024 /* Default */ && flags & 2 /* Ambient */) {
flags ^= 2 /* Ambient */;
}
return flags;
}
function getTypeAnnotationFromAccessor(accessor) {
if (accessor) {
return accessor.kind === 176 /* GetAccessor */ ? accessor.type : accessor.parameters.length > 0 ? accessor.parameters[0].type : void 0;
}
}
function canHaveLiteralInitializer(node) {
switch (node.kind) {
case 171 /* PropertyDeclaration */:
case 170 /* PropertySignature */:
return !hasEffectiveModifier(node, 8 /* Private */);
case 168 /* Parameter */:
case 259 /* VariableDeclaration */:
return true;
}
return false;
}
function isPreservedDeclarationStatement(node) {
switch (node.kind) {
case 261 /* FunctionDeclaration */:
case 266 /* ModuleDeclaration */:
case 270 /* ImportEqualsDeclaration */:
case 263 /* InterfaceDeclaration */:
case 262 /* ClassDeclaration */:
case 264 /* TypeAliasDeclaration */:
case 265 /* EnumDeclaration */:
case 242 /* VariableStatement */:
case 271 /* ImportDeclaration */:
case 277 /* ExportDeclaration */:
case 276 /* ExportAssignment */:
return true;
}
return false;
}
function isProcessedComponent(node) {
switch (node.kind) {
case 179 /* ConstructSignature */:
case 175 /* Constructor */:
case 173 /* MethodDeclaration */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
case 171 /* PropertyDeclaration */:
case 170 /* PropertySignature */:
case 172 /* MethodSignature */:
case 178 /* CallSignature */:
case 180 /* IndexSignature */:
case 259 /* VariableDeclaration */:
case 167 /* TypeParameter */:
case 232 /* ExpressionWithTypeArguments */:
case 182 /* TypeReference */:
case 193 /* ConditionalType */:
case 183 /* FunctionType */:
case 184 /* ConstructorType */:
case 204 /* ImportType */:
return true;
}
return false;
}
// src/compiler/transformer.ts
function getModuleTransformer(moduleKind) {
switch (moduleKind) {
case 99 /* ESNext */:
case 7 /* ES2022 */:
case 6 /* ES2020 */:
case 5 /* ES2015 */:
return transformECMAScriptModule;
case 4 /* System */:
return transformSystemModule;
case 100 /* Node16 */:
case 199 /* NodeNext */:
return transformNodeModule;
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);
} else if (languageVersion < 99 /* ESNext */ || !useDefineForClassFields) {
transformers.push(transformESDecorators);
}
transformers.push(transformClassFields);
if (getJSXTransformEnabled(compilerOptions)) {
transformers.push(transformJsx);
}
if (languageVersion < 99 /* ESNext */) {
transformers.push(transformESNext);
}
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));
if (languageVersion < 1 /* ES5 */) {
transformers.push(transformES5);
}
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(362 /* 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 transform2 of transformersWithContext) {
node = transform2(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 === 311 /* 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 (outFile(options)) {
const prepends = host.getPrependNodes();
if (sourceFiles.length || prepends.length) {
const bundle = factory.createBundle(sourceFiles, prepends);
const result = action(getOutputPathsFor(bundle, host, forceDtsEmit), bundle);
if (result) {
return result;
}
}
} else {
if (!onlyBuildInfo) {
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 (!isIncrementalCompilation(options))
return void 0;
if (options.tsBuildInfoFile)
return options.tsBuildInfoFile;
const outPath = outFile(options);
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 getOutputPathsForBundle(options, forceDtsPaths) {
const outPath = outFile(options);
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;
const buildInfoPath = getTsBuildInfoEmitOutputFilePath(options);
return { jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath, buildInfoPath };
}
function getOutputPathsFor(sourceFile, host, forceDtsPaths) {
const options = host.getCompilerOptions();
if (sourceFile.kind === 312 /* 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, buildInfoPath: void 0 };
}
}
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, configFile, ignoreCase, outputDir, getCommonSourceDirectory2) {
return outputDir ? resolvePath(
outputDir,
getRelativePathFromDirectory(getCommonSourceDirectory2 ? getCommonSourceDirectory2() : getCommonSourceDirectoryOfConfig(configFile, ignoreCase), inputFileName, ignoreCase)
) : inputFileName;
}
function getOutputDeclarationFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2) {
return changeExtension(
getOutputPathWithoutChangingExt(inputFileName, configFile, ignoreCase, configFile.options.declarationDir || configFile.options.outDir, getCommonSourceDirectory2),
getDeclarationEmitExtensionForPath(inputFileName)
);
}
function getOutputJSFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2) {
if (configFile.options.emitDeclarationOnly)
return void 0;
const isJsonFile = fileExtensionIs(inputFileName, ".json" /* Json */);
const outputFileName = changeExtension(
getOutputPathWithoutChangingExt(inputFileName, configFile, ignoreCase, configFile.options.outDir, getCommonSourceDirectory2),
getOutputExtension(inputFileName, configFile.options)
);
return !isJsonFile || comparePaths(inputFileName, outputFileName, Debug.checkDefined(configFile.options.configFilePath), ignoreCase) !== 0 /* EqualTo */ ? outputFileName : void 0;
}
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, buildInfoPath } = getOutputPathsForBundle(
configFile.options,
/*forceDtsPaths*/
false
);
addOutput(jsFilePath);
addOutput(sourceMapFilePath);
addOutput(declarationFilePath);
addOutput(declarationMapPath);
addOutput(buildInfoPath);
}
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 (outFile(configFile.options)) {
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 getOutputFileNames(commandLine, inputFileName, ignoreCase) {
inputFileName = normalizePath(inputFileName);
Debug.assert(contains(commandLine.fileNames, inputFileName), `Expected fileName to be present in command line`);
const { addOutput, getOutputs } = createAddOutput();
if (outFile(commandLine.options)) {
getSingleOutputFileNames(commandLine, addOutput);
} else {
getOwnOutputFileNames(commandLine, inputFileName, ignoreCase, addOutput);
}
return getOutputs();
}
function getFirstProjectOutput(configFile, ignoreCase) {
if (outFile(configFile.options)) {
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 emitFiles(resolver, host, targetSourceFile, { scriptTransformers, declarationTransformers }, emitOnly, onlyBuildInfo, forceDtsEmit) {
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 bundleBuildInfo;
var emitSkipped = false;
enter();
forEachEmittedFile(
host,
emitSourceFileOrBundle,
getSourceFilesToEmit(host, targetSourceFile, forceDtsEmit),
forceDtsEmit,
onlyBuildInfo,
!targetSourceFile
);
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;
let buildInfoDirectory;
if (buildInfoPath && sourceFileOrBundle && isBundle(sourceFileOrBundle)) {
buildInfoDirectory = getDirectoryPath(getNormalizedAbsolutePath(buildInfoPath, host.getCurrentDirectory()));
bundleBuildInfo = {
commonSourceDirectory: relativeToBuildInfo(host.getCommonSourceDirectory()),
sourceFiles: sourceFileOrBundle.sourceFiles.map((file) => relativeToBuildInfo(getNormalizedAbsolutePath(file.fileName, host.getCurrentDirectory())))
};
}
(_a = tracing) == null ? void 0 : _a.push(tracing.Phase.Emit, "emitJsFileOrBundle", { jsFilePath });
emitJsFileOrBundle(sourceFileOrBundle, jsFilePath, sourceMapFilePath, relativeToBuildInfo);
(_b = tracing) == null ? void 0 : _b.pop();
(_c = tracing) == null ? void 0 : _c.push(tracing.Phase.Emit, "emitDeclarationFileOrBundle", { declarationFilePath });
emitDeclarationFileOrBundle(sourceFileOrBundle, declarationFilePath, declarationMapPath, relativeToBuildInfo);
(_d = tracing) == null ? void 0 : _d.pop();
(_e = tracing) == null ? void 0 : _e.push(tracing.Phase.Emit, "emitBuildInfo", { buildInfoPath });
emitBuildInfo(bundleBuildInfo, buildInfoPath);
(_f = tracing) == null ? void 0 : _f.pop();
if (!emitSkipped && emittedFilesList) {
if (!emitOnly) {
if (jsFilePath) {
emittedFilesList.push(jsFilePath);
}
if (sourceMapFilePath) {
emittedFilesList.push(sourceMapFilePath);
}
if (buildInfoPath) {
emittedFilesList.push(buildInfoPath);
}
}
if (emitOnly !== 0 /* Js */) {
if (declarationFilePath) {
emittedFilesList.push(declarationFilePath);
}
if (declarationMapPath) {
emittedFilesList.push(declarationMapPath);
}
}
}
function relativeToBuildInfo(path) {
return ensurePathIsNonModuleName(getRelativePathFromDirectory(buildInfoDirectory, path, host.getCanonicalFileName));
}
}
function emitBuildInfo(bundle, buildInfoPath) {
if (!buildInfoPath || targetSourceFile || emitSkipped)
return;
if (host.isEmitBlocked(buildInfoPath)) {
emitSkipped = true;
return;
}
const buildInfo = host.getBuildInfo(bundle) || createBuildInfo(
/*program*/
void 0,
bundle
);
writeFile(
host,
emitterDiagnostics,
buildInfoPath,
getBuildInfoText(buildInfo),
/*writeByteOrderMark*/
false,
/*sourceFiles*/
void 0,
{ buildInfo }
);
}
function emitJsFileOrBundle(sourceFileOrBundle, jsFilePath, sourceMapFilePath, relativeToBuildInfo) {
if (!sourceFileOrBundle || emitOnly || !jsFilePath) {
return;
}
if (host.isEmitBlocked(jsFilePath) || compilerOptions.noEmit) {
emitSkipped = true;
return;
}
const transform2 = transformNodes(
resolver,
host,
factory,
compilerOptions,
[sourceFileOrBundle],
scriptTransformers,
/*allowDtsFiles*/
false
);
const printerOptions = {
removeComments: compilerOptions.removeComments,
newLine: compilerOptions.newLine,
noEmitHelpers: compilerOptions.noEmitHelpers,
module: compilerOptions.module,
target: compilerOptions.target,
sourceMap: compilerOptions.sourceMap,
inlineSourceMap: compilerOptions.inlineSourceMap,
inlineSources: compilerOptions.inlineSources,
extendedDiagnostics: compilerOptions.extendedDiagnostics,
writeBundleFileInfo: !!bundleBuildInfo,
relativeToBuildInfo
};
const printer = createPrinter(printerOptions, {
// resolver hooks
hasGlobalName: resolver.hasGlobalName,
// transform hooks
onEmitNode: transform2.emitNodeWithNotification,
isEmitNotificationEnabled: transform2.isEmitNotificationEnabled,
substituteNode: transform2.substituteNode
});
Debug.assert(transform2.transformed.length === 1, "Should only see one output from the transform");
printSourceFileOrBundle(jsFilePath, sourceMapFilePath, transform2, printer, compilerOptions);
transform2.dispose();
if (bundleBuildInfo)
bundleBuildInfo.js = printer.bundleFileInfo;
}
function emitDeclarationFileOrBundle(sourceFileOrBundle, declarationFilePath, declarationMapPath, relativeToBuildInfo) {
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 = outFile(compilerOptions) ? [factory.createBundle(filesForEmit, !isSourceFile(sourceFileOrBundle) ? sourceFileOrBundle.prepends : void 0)] : filesForEmit;
if (emitOnly && !getEmitDeclarations(compilerOptions)) {
filesForEmit.forEach(collectLinkedAliases);
}
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 printerOptions = {
removeComments: compilerOptions.removeComments,
newLine: compilerOptions.newLine,
noEmitHelpers: true,
module: compilerOptions.module,
target: compilerOptions.target,
sourceMap: !forceDtsEmit && compilerOptions.declarationMap,
inlineSourceMap: compilerOptions.inlineSourceMap,
extendedDiagnostics: compilerOptions.extendedDiagnostics,
onlyPrintJsDocStyle: true,
writeBundleFileInfo: !!bundleBuildInfo,
recordInternalSection: !!bundleBuildInfo,
relativeToBuildInfo
};
const declarationPrinter = createPrinter(printerOptions, {
// resolver hooks
hasGlobalName: resolver.hasGlobalName,
// transform hooks
onEmitNode: declarationTransform.emitNodeWithNotification,
isEmitNotificationEnabled: declarationTransform.isEmitNotificationEnabled,
substituteNode: declarationTransform.substituteNode
});
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");
printSourceFileOrBundle(
declarationFilePath,
declarationMapPath,
declarationTransform,
declarationPrinter,
{
sourceMap: printerOptions.sourceMap,
sourceRoot: compilerOptions.sourceRoot,
mapRoot: compilerOptions.mapRoot,
extendedDiagnostics: compilerOptions.extendedDiagnostics
// Explicitly do not passthru either `inline` option
}
);
}
declarationTransform.dispose();
if (bundleBuildInfo)
bundleBuildInfo.dts = declarationPrinter.bundleFileInfo;
}
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 printSourceFileOrBundle(jsFilePath, sourceMapFilePath, transform2, printer, mapOptions) {
const sourceFileOrBundle = transform2.transformed[0];
const bundle = sourceFileOrBundle.kind === 312 /* Bundle */ ? sourceFileOrBundle : void 0;
const sourceFile = sourceFileOrBundle.kind === 311 /* 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
);
if (printer.bundleFileInfo)
printer.bundleFileInfo.mapHash = computeSignature(sourceMap, host);
}
} else {
writer.writeLine();
}
const text = writer.getText();
writeFile(host, emitterDiagnostics, jsFilePath, text, !!compilerOptions.emitBOM, sourceFiles, { sourceMapUrlPos, diagnostics: transform2.diagnostics });
if (printer.bundleFileInfo)
printer.bundleFileInfo.hash = computeSignature(text, host);
writer.clear();
}
function shouldEmitSourceMaps(mapOptions, sourceFileOrBundle) {
return (mapOptions.sourceMap || mapOptions.inlineSourceMap) && (sourceFileOrBundle.kind !== 311 /* 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 createBuildInfo(program, bundle) {
return { bundle, program, version };
}
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,
getNodeCheckFlags: notImplemented,
isDeclarationVisible: notImplemented,
isLateBound: (_node) => false,
collectLinkedAliases: notImplemented,
isImplementationOfOverload: notImplemented,
isRequiredInitializedParameter: notImplemented,
isOptionalUninitializedParameterProperty: 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,
getReferencedValueDeclaration: notImplemented,
getReferencedValueDeclarations: notImplemented,
getTypeReferenceSerializationKind: notImplemented,
isOptionalParameter: notImplemented,
moduleExportsSomeValue: notImplemented,
isArgumentsLocalBinding: notImplemented,
getExternalModuleFileFromDeclaration: notImplemented,
getTypeReferenceDirectivesForEntityName: notImplemented,
getTypeReferenceDirectivesForSymbol: notImplemented,
isLiteralConstDeclaration: notImplemented,
getJsxFactoryEntity: notImplemented,
getJsxFragmentFactoryEntity: notImplemented,
getAllAccessorDeclarations: notImplemented,
getSymbolOfExternalModuleSpecifier: notImplemented,
isBindingCapturedByNode: notImplemented,
getDeclarationStatementsForSourceFile: notImplemented,
isImportRequiredByAugmentation: notImplemented
};
function createSourceFilesFromBundleBuildInfo(bundle, buildInfoDirectory, host) {
var _a;
const jsBundle = Debug.checkDefined(bundle.js);
const prologueMap = ((_a = jsBundle.sources) == null ? void 0 : _a.prologues) && arrayToMap(jsBundle.sources.prologues, (prologueInfo) => prologueInfo.file);
return bundle.sourceFiles.map((fileName, index) => {
const prologueInfo = prologueMap == null ? void 0 : prologueMap.get(index);
const statements = prologueInfo == null ? void 0 : prologueInfo.directives.map((directive) => {
const literal = setTextRange(factory.createStringLiteral(directive.expression.text), directive.expression);
const statement = setTextRange(factory.createExpressionStatement(literal), directive);
setParent(literal, statement);
return statement;
});
const eofToken = factory.createToken(1 /* EndOfFileToken */);
const sourceFile = factory.createSourceFile(statements ?? [], eofToken, 0 /* None */);
sourceFile.fileName = getRelativePathFromDirectory(
host.getCurrentDirectory(),
getNormalizedAbsolutePath(fileName, buildInfoDirectory),
!host.useCaseSensitiveFileNames()
);
sourceFile.text = (prologueInfo == null ? void 0 : prologueInfo.text) ?? "";
setTextRangePosWidth(sourceFile, 0, (prologueInfo == null ? void 0 : prologueInfo.text.length) ?? 0);
setEachParent(sourceFile.statements, sourceFile);
setTextRangePosWidth(eofToken, sourceFile.end, 0);
setParent(eofToken, sourceFile);
return sourceFile;
});
}
function emitUsingBuildInfo(config, host, getCommandLine, customTransformers) {
var _a, _b;
(_a = tracing) == null ? void 0 : _a.push(
tracing.Phase.Emit,
"emitUsingBuildInfo",
{},
/*separateBeginAndEnd*/
true
);
mark("beforeEmit");
const result = emitUsingBuildInfoWorker(config, host, getCommandLine, customTransformers);
mark("afterEmit");
measure("Emit", "beforeEmit", "afterEmit");
(_b = tracing) == null ? void 0 : _b.pop();
return result;
}
function emitUsingBuildInfoWorker(config, host, getCommandLine, customTransformers) {
const { buildInfoPath, jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath } = getOutputPathsForBundle(
config.options,
/*forceDtsPaths*/
false
);
const buildInfo = host.getBuildInfo(buildInfoPath, config.options.configFilePath);
if (!buildInfo)
return buildInfoPath;
if (!buildInfo.bundle || !buildInfo.bundle.js || declarationFilePath && !buildInfo.bundle.dts)
return buildInfoPath;
const jsFileText = host.readFile(Debug.checkDefined(jsFilePath));
if (!jsFileText)
return jsFilePath;
if (computeSignature(jsFileText, host) !== buildInfo.bundle.js.hash)
return jsFilePath;
const sourceMapText = sourceMapFilePath && host.readFile(sourceMapFilePath);
if (sourceMapFilePath && !sourceMapText || config.options.inlineSourceMap)
return sourceMapFilePath || "inline sourcemap decoding";
if (sourceMapFilePath && computeSignature(sourceMapText, host) !== buildInfo.bundle.js.mapHash)
return sourceMapFilePath;
const declarationText = declarationFilePath && host.readFile(declarationFilePath);
if (declarationFilePath && !declarationText)
return declarationFilePath;
if (declarationFilePath && computeSignature(declarationText, host) !== buildInfo.bundle.dts.hash)
return declarationFilePath;
const declarationMapText = declarationMapPath && host.readFile(declarationMapPath);
if (declarationMapPath && !declarationMapText || config.options.inlineSourceMap)
return declarationMapPath || "inline sourcemap decoding";
if (declarationMapPath && computeSignature(declarationMapText, host) !== buildInfo.bundle.dts.mapHash)
return declarationMapPath;
const buildInfoDirectory = getDirectoryPath(getNormalizedAbsolutePath(buildInfoPath, host.getCurrentDirectory()));
const ownPrependInput = createInputFilesWithFileTexts(
jsFilePath,
jsFileText,
sourceMapFilePath,
sourceMapText,
declarationFilePath,
declarationText,
declarationMapPath,
declarationMapText,
buildInfoPath,
buildInfo,
/*oldFileOfCurrentEmit*/
true
);
const outputFiles = [];
const prependNodes = createPrependNodes(config.projectReferences, getCommandLine, (f) => host.readFile(f), host);
const sourceFilesForJsEmit = createSourceFilesFromBundleBuildInfo(buildInfo.bundle, buildInfoDirectory, host);
let changedDtsText;
let changedDtsData;
const emitHost = {
getPrependNodes: memoize(() => [...prependNodes, ownPrependInput]),
getCanonicalFileName: host.getCanonicalFileName,
getCommonSourceDirectory: () => getNormalizedAbsolutePath(buildInfo.bundle.commonSourceDirectory, buildInfoDirectory),
getCompilerOptions: () => config.options,
getCurrentDirectory: () => host.getCurrentDirectory(),
getSourceFile: returnUndefined,
getSourceFileByPath: returnUndefined,
getSourceFiles: () => sourceFilesForJsEmit,
getLibFileFromReference: notImplemented,
isSourceFileFromExternalLibrary: returnFalse,
getResolvedProjectReferenceToRedirect: returnUndefined,
getProjectReferenceRedirect: returnUndefined,
isSourceOfProjectReferenceRedirect: returnFalse,
writeFile: (name, text, writeByteOrderMark, _onError, _sourceFiles, data) => {
switch (name) {
case jsFilePath:
if (jsFileText === text)
return;
break;
case sourceMapFilePath:
if (sourceMapText === text)
return;
break;
case buildInfoPath:
break;
case declarationFilePath:
if (declarationText === text)
return;
changedDtsText = text;
changedDtsData = data;
break;
case declarationMapPath:
if (declarationMapText === text)
return;
break;
default:
Debug.fail(`Unexpected path: ${name}`);
}
outputFiles.push({ name, text, writeByteOrderMark, data });
},
isEmitBlocked: returnFalse,
readFile: (f) => host.readFile(f),
fileExists: (f) => host.fileExists(f),
useCaseSensitiveFileNames: () => host.useCaseSensitiveFileNames(),
getBuildInfo: (bundle) => {
const program = buildInfo.program;
if (program && changedDtsText !== void 0 && config.options.composite) {
program.outSignature = computeSignature(changedDtsText, host, changedDtsData);
}
const { js, dts, sourceFiles } = buildInfo.bundle;
bundle.js.sources = js.sources;
if (dts) {
bundle.dts.sources = dts.sources;
}
bundle.sourceFiles = sourceFiles;
return createBuildInfo(program, bundle);
},
getSourceFileFromReference: returnUndefined,
redirectTargetsMap: createMultiMap(),
getFileIncludeReasons: notImplemented,
createHash: maybeBind(host, host.createHash)
};
emitFiles(
notImplementedResolver,
emitHost,
/*targetSourceFile*/
void 0,
getTransformers(config.options, customTransformers)
);
return outputFiles;
}
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 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 bundleFileInfo = printerOptions.writeBundleFileInfo ? { sections: [] } : void 0;
var relativeToBuildInfo = bundleFileInfo ? Debug.checkDefined(printerOptions.relativeToBuildInfo) : void 0;
var recordInternalSection = printerOptions.recordInternalSection;
var sourceFileTextPos = 0;
var sourceFileTextKind = "text" /* Text */;
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();
reset2();
return {
// public API
printNode,
printList,
printFile,
printBundle,
// internal API
writeNode,
writeList,
writeFile: writeFile2,
writeBundle,
bundleFileInfo
};
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 311 /* SourceFile */:
return printFile(node);
case 312 /* Bundle */:
return printBundle(node);
case 313 /* UnparsedSource */:
return printUnparsedSource(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 printUnparsedSource(unparsed) {
writeUnparsedSource(unparsed, beginPrint());
return endPrint();
}
function writeNode(hint, node, sourceFile, output) {
const previousWriter = writer;
setWriter(
output,
/*_sourceMapGenerator*/
void 0
);
print(hint, node, sourceFile);
reset2();
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
);
reset2();
writer = previousWriter;
}
function getTextPosWithWriteLine() {
return writer.getTextPosWithWriteLine ? writer.getTextPosWithWriteLine() : writer.getTextPos();
}
function updateOrPushBundleFileTextLike(pos, end, kind) {
const last2 = lastOrUndefined(bundleFileInfo.sections);
if (last2 && last2.kind === kind) {
last2.end = end;
} else {
bundleFileInfo.sections.push({ pos, end, kind });
}
}
function recordBundleFileInternalSectionStart(node) {
if (recordInternalSection && bundleFileInfo && currentSourceFile && (isDeclaration(node) || isVariableStatement(node)) && isInternalDeclaration(node, currentSourceFile) && sourceFileTextKind !== "internal" /* Internal */) {
const prevSourceFileTextKind = sourceFileTextKind;
recordBundleFileTextLikeSection(writer.getTextPos());
sourceFileTextPos = getTextPosWithWriteLine();
sourceFileTextKind = "internal" /* Internal */;
return prevSourceFileTextKind;
}
return void 0;
}
function recordBundleFileInternalSectionEnd(prevSourceFileTextKind) {
if (prevSourceFileTextKind) {
recordBundleFileTextLikeSection(writer.getTextPos());
sourceFileTextPos = getTextPosWithWriteLine();
sourceFileTextKind = prevSourceFileTextKind;
}
}
function recordBundleFileTextLikeSection(end) {
if (sourceFileTextPos < end) {
updateOrPushBundleFileTextLike(sourceFileTextPos, end, sourceFileTextKind);
return true;
}
return false;
}
function writeBundle(bundle, output, sourceMapGenerator2) {
isOwnFileEmit = false;
const previousWriter = writer;
setWriter(output, sourceMapGenerator2);
emitShebangIfNeeded(bundle);
emitPrologueDirectivesIfNeeded(bundle);
emitHelpers(bundle);
emitSyntheticTripleSlashReferencesIfNeeded(bundle);
for (const prepend of bundle.prepends) {
writeLine();
const pos = writer.getTextPos();
const savedSections = bundleFileInfo && bundleFileInfo.sections;
if (savedSections)
bundleFileInfo.sections = [];
print(
4 /* Unspecified */,
prepend,
/*sourceFile*/
void 0
);
if (bundleFileInfo) {
const newSections = bundleFileInfo.sections;
bundleFileInfo.sections = savedSections;
if (prepend.oldFileOfCurrentEmit)
bundleFileInfo.sections.push(...newSections);
else {
newSections.forEach((section) => Debug.assert(isBundleFileTextLike(section)));
bundleFileInfo.sections.push({
pos,
end: writer.getTextPos(),
kind: "prepend" /* Prepend */,
data: relativeToBuildInfo(prepend.fileName),
texts: newSections
});
}
}
}
sourceFileTextPos = getTextPosWithWriteLine();
for (const sourceFile of bundle.sourceFiles) {
print(0 /* SourceFile */, sourceFile, sourceFile);
}
if (bundleFileInfo && bundle.sourceFiles.length) {
const end = writer.getTextPos();
if (recordBundleFileTextLikeSection(end)) {
const prologues = getPrologueDirectivesFromBundledSourceFiles(bundle);
if (prologues) {
if (!bundleFileInfo.sources)
bundleFileInfo.sources = {};
bundleFileInfo.sources.prologues = prologues;
}
const helpers = getHelpersFromBundledSourceFiles(bundle);
if (helpers) {
if (!bundleFileInfo.sources)
bundleFileInfo.sources = {};
bundleFileInfo.sources.helpers = helpers;
}
}
}
reset2();
writer = previousWriter;
}
function writeUnparsedSource(unparsed, output) {
const previousWriter = writer;
setWriter(
output,
/*_sourceMapGenerator*/
void 0
);
print(
4 /* Unspecified */,
unparsed,
/*sourceFile*/
void 0
);
reset2();
writer = previousWriter;
}
function writeFile2(sourceFile, output, sourceMapGenerator2) {
isOwnFileEmit = true;
const previousWriter = writer;
setWriter(output, sourceMapGenerator2);
emitShebangIfNeeded(sourceFile);
emitPrologueDirectivesIfNeeded(sourceFile);
print(0 /* SourceFile */, sourceFile, sourceFile);
reset2();
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 reset2() {
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;
const prevSourceFileTextKind = recordBundleFileInternalSectionStart(node);
pipelineEmit(4 /* Unspecified */, node, parenthesizerRule);
recordBundleFileInternalSectionEnd(prevSourceFileTextKind);
}
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) && !isUnparsedSource(node) && !isUnparsedPrepend(node);
}
function getPipelinePhase(phase, emitHint, node) {
switch (phase) {
case 0 /* Notification */:
if (onEmitNode !== noEmitNotification && (!isEmitNotificationEnabled || isEmitNotificationEnabled(node))) {
return pipelineEmitWithNotification;
}
case 1 /* Substitution */:
if (substituteNode !== noEmitSubstitution && (lastSubstitution = substituteNode(emitHint, node) || node) !== node) {
if (currentParenthesizerRule) {
lastSubstitution = currentParenthesizerRule(lastSubstitution);
}
return pipelineEmitWithSubstitution;
}
case 2 /* Comments */:
if (shouldEmitComments(node)) {
return pipelineEmitWithComments;
}
case 3 /* SourceMaps */:
if (shouldEmitSourceMaps(node)) {
return pipelineEmitWithSourceMaps;
}
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 === 5 /* EmbeddedStatement */) {
Debug.assertNode(node, isEmptyStatement);
return emitEmptyStatement(
/*isEmbeddedStatement*/
true
);
}
if (hint === 4 /* Unspecified */) {
switch (node.kind) {
case 16 /* TemplateHead */:
case 17 /* TemplateMiddle */:
case 18 /* TemplateTail */:
return emitLiteral(
node,
/*jsxAttributeEscape*/
false
);
case 80 /* Identifier */:
return emitIdentifier(node);
case 81 /* PrivateIdentifier */:
return emitPrivateIdentifier(node);
case 165 /* QualifiedName */:
return emitQualifiedName(node);
case 166 /* ComputedPropertyName */:
return emitComputedPropertyName(node);
case 167 /* TypeParameter */:
return emitTypeParameter(node);
case 168 /* Parameter */:
return emitParameter(node);
case 169 /* Decorator */:
return emitDecorator(node);
case 170 /* PropertySignature */:
return emitPropertySignature(node);
case 171 /* PropertyDeclaration */:
return emitPropertyDeclaration(node);
case 172 /* MethodSignature */:
return emitMethodSignature(node);
case 173 /* MethodDeclaration */:
return emitMethodDeclaration(node);
case 174 /* ClassStaticBlockDeclaration */:
return emitClassStaticBlockDeclaration(node);
case 175 /* Constructor */:
return emitConstructor(node);
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
return emitAccessorDeclaration(node);
case 178 /* CallSignature */:
return emitCallSignature(node);
case 179 /* ConstructSignature */:
return emitConstructSignature(node);
case 180 /* IndexSignature */:
return emitIndexSignature(node);
case 181 /* TypePredicate */:
return emitTypePredicate(node);
case 182 /* TypeReference */:
return emitTypeReference(node);
case 183 /* FunctionType */:
return emitFunctionType(node);
case 184 /* ConstructorType */:
return emitConstructorType(node);
case 185 /* TypeQuery */:
return emitTypeQuery(node);
case 186 /* TypeLiteral */:
return emitTypeLiteral(node);
case 187 /* ArrayType */:
return emitArrayType(node);
case 188 /* TupleType */:
return emitTupleType(node);
case 189 /* OptionalType */:
return emitOptionalType(node);
case 191 /* UnionType */:
return emitUnionType(node);
case 192 /* IntersectionType */:
return emitIntersectionType(node);
case 193 /* ConditionalType */:
return emitConditionalType(node);
case 194 /* InferType */:
return emitInferType(node);
case 195 /* ParenthesizedType */:
return emitParenthesizedType(node);
case 232 /* ExpressionWithTypeArguments */:
return emitExpressionWithTypeArguments(node);
case 196 /* ThisType */:
return emitThisType();
case 197 /* TypeOperator */:
return emitTypeOperator(node);
case 198 /* IndexedAccessType */:
return emitIndexedAccessType(node);
case 199 /* MappedType */:
return emitMappedType(node);
case 200 /* LiteralType */:
return emitLiteralType(node);
case 201 /* NamedTupleMember */:
return emitNamedTupleMember(node);
case 202 /* TemplateLiteralType */:
return emitTemplateType(node);
case 203 /* TemplateLiteralTypeSpan */:
return emitTemplateTypeSpan(node);
case 204 /* ImportType */:
return emitImportTypeNode(node);
case 205 /* ObjectBindingPattern */:
return emitObjectBindingPattern(node);
case 206 /* ArrayBindingPattern */:
return emitArrayBindingPattern(node);
case 207 /* BindingElement */:
return emitBindingElement(node);
case 238 /* TemplateSpan */:
return emitTemplateSpan(node);
case 239 /* SemicolonClassElement */:
return emitSemicolonClassElement();
case 240 /* Block */:
return emitBlock(node);
case 242 /* VariableStatement */:
return emitVariableStatement(node);
case 241 /* EmptyStatement */:
return emitEmptyStatement(
/*isEmbeddedStatement*/
false
);
case 243 /* ExpressionStatement */:
return emitExpressionStatement(node);
case 244 /* IfStatement */:
return emitIfStatement(node);
case 245 /* DoStatement */:
return emitDoStatement(node);
case 246 /* WhileStatement */:
return emitWhileStatement(node);
case 247 /* ForStatement */:
return emitForStatement(node);
case 248 /* ForInStatement */:
return emitForInStatement(node);
case 249 /* ForOfStatement */:
return emitForOfStatement(node);
case 250 /* ContinueStatement */:
return emitContinueStatement(node);
case 251 /* BreakStatement */:
return emitBreakStatement(node);
case 252 /* ReturnStatement */:
return emitReturnStatement(node);
case 253 /* WithStatement */:
return emitWithStatement(node);
case 254 /* SwitchStatement */:
return emitSwitchStatement(node);
case 255 /* LabeledStatement */:
return emitLabeledStatement(node);
case 256 /* ThrowStatement */:
return emitThrowStatement(node);
case 257 /* TryStatement */:
return emitTryStatement(node);
case 258 /* DebuggerStatement */:
return emitDebuggerStatement(node);
case 259 /* VariableDeclaration */:
return emitVariableDeclaration(node);
case 260 /* VariableDeclarationList */:
return emitVariableDeclarationList(node);
case 261 /* FunctionDeclaration */:
return emitFunctionDeclaration(node);
case 262 /* ClassDeclaration */:
return emitClassDeclaration(node);
case 263 /* InterfaceDeclaration */:
return emitInterfaceDeclaration(node);
case 264 /* TypeAliasDeclaration */:
return emitTypeAliasDeclaration(node);
case 265 /* EnumDeclaration */:
return emitEnumDeclaration(node);
case 266 /* ModuleDeclaration */:
return emitModuleDeclaration(node);
case 267 /* ModuleBlock */:
return emitModuleBlock(node);
case 268 /* CaseBlock */:
return emitCaseBlock(node);
case 269 /* NamespaceExportDeclaration */:
return emitNamespaceExportDeclaration(node);
case 270 /* ImportEqualsDeclaration */:
return emitImportEqualsDeclaration(node);
case 271 /* ImportDeclaration */:
return emitImportDeclaration(node);
case 272 /* ImportClause */:
return emitImportClause(node);
case 273 /* NamespaceImport */:
return emitNamespaceImport(node);
case 279 /* NamespaceExport */:
return emitNamespaceExport(node);
case 274 /* NamedImports */:
return emitNamedImports(node);
case 275 /* ImportSpecifier */:
return emitImportSpecifier(node);
case 276 /* ExportAssignment */:
return emitExportAssignment(node);
case 277 /* ExportDeclaration */:
return emitExportDeclaration(node);
case 278 /* NamedExports */:
return emitNamedExports(node);
case 280 /* ExportSpecifier */:
return emitExportSpecifier(node);
case 299 /* AssertClause */:
return emitAssertClause(node);
case 300 /* AssertEntry */:
return emitAssertEntry(node);
case 281 /* MissingDeclaration */:
return;
case 282 /* ExternalModuleReference */:
return emitExternalModuleReference(node);
case 12 /* JsxText */:
return emitJsxText(node);
case 285 /* JsxOpeningElement */:
case 288 /* JsxOpeningFragment */:
return emitJsxOpeningElementOrFragment(node);
case 286 /* JsxClosingElement */:
case 289 /* JsxClosingFragment */:
return emitJsxClosingElementOrFragment(node);
case 290 /* JsxAttribute */:
return emitJsxAttribute(node);
case 291 /* JsxAttributes */:
return emitJsxAttributes(node);
case 292 /* JsxSpreadAttribute */:
return emitJsxSpreadAttribute(node);
case 293 /* JsxExpression */:
return emitJsxExpression(node);
case 294 /* JsxNamespacedName */:
return emitJsxNamespacedName(node);
case 295 /* CaseClause */:
return emitCaseClause(node);
case 296 /* DefaultClause */:
return emitDefaultClause(node);
case 297 /* HeritageClause */:
return emitHeritageClause(node);
case 298 /* CatchClause */:
return emitCatchClause(node);
case 302 /* PropertyAssignment */:
return emitPropertyAssignment(node);
case 303 /* ShorthandPropertyAssignment */:
return emitShorthandPropertyAssignment(node);
case 304 /* SpreadAssignment */:
return emitSpreadAssignment(node);
case 305 /* EnumMember */:
return emitEnumMember(node);
case 306 /* UnparsedPrologue */:
return writeUnparsedNode(node);
case 313 /* UnparsedSource */:
case 307 /* UnparsedPrepend */:
return emitUnparsedSourceOrPrepend(node);
case 308 /* UnparsedText */:
case 309 /* UnparsedInternalText */:
return emitUnparsedTextLike(node);
case 310 /* UnparsedSyntheticReference */:
return emitUnparsedSyntheticReference(node);
case 311 /* SourceFile */:
return emitSourceFile(node);
case 312 /* Bundle */:
return Debug.fail("Bundles should be printed using printBundle");
case 314 /* InputFiles */:
return Debug.fail("InputFiles should not be printed");
case 315 /* JSDocTypeExpression */:
return emitJSDocTypeExpression(node);
case 316 /* JSDocNameReference */:
return emitJSDocNameReference(node);
case 318 /* JSDocAllType */:
return writePunctuation("*");
case 319 /* JSDocUnknownType */:
return writePunctuation("?");
case 320 /* JSDocNullableType */:
return emitJSDocNullableType(node);
case 321 /* JSDocNonNullableType */:
return emitJSDocNonNullableType(node);
case 322 /* JSDocOptionalType */:
return emitJSDocOptionalType(node);
case 323 /* JSDocFunctionType */:
return emitJSDocFunctionType(node);
case 190 /* RestType */:
case 324 /* JSDocVariadicType */:
return emitRestOrJSDocVariadicType(node);
case 325 /* JSDocNamepathType */:
return;
case 326 /* JSDoc */:
return emitJSDoc(node);
case 328 /* JSDocTypeLiteral */:
return emitJSDocTypeLiteral(node);
case 329 /* JSDocSignature */:
return emitJSDocSignature(node);
case 333 /* JSDocTag */:
case 338 /* JSDocClassTag */:
case 343 /* JSDocOverrideTag */:
return emitJSDocSimpleTag(node);
case 334 /* JSDocAugmentsTag */:
case 335 /* JSDocImplementsTag */:
return emitJSDocHeritageTag(node);
case 336 /* JSDocAuthorTag */:
case 337 /* JSDocDeprecatedTag */:
return;
case 339 /* JSDocPublicTag */:
case 340 /* JSDocPrivateTag */:
case 341 /* JSDocProtectedTag */:
case 342 /* JSDocReadonlyTag */:
return;
case 344 /* JSDocCallbackTag */:
return emitJSDocCallbackTag(node);
case 345 /* JSDocOverloadTag */:
return emitJSDocOverloadTag(node);
case 347 /* JSDocParameterTag */:
case 354 /* JSDocPropertyTag */:
return emitJSDocPropertyLikeTag(node);
case 346 /* JSDocEnumTag */:
case 348 /* JSDocReturnTag */:
case 349 /* JSDocThisTag */:
case 350 /* JSDocTypeTag */:
case 355 /* JSDocThrowsTag */:
case 356 /* JSDocSatisfiesTag */:
return emitJSDocSimpleTypedTag(node);
case 351 /* JSDocTemplateTag */:
return emitJSDocTemplateTag(node);
case 352 /* JSDocTypedefTag */:
return emitJSDocTypedefTag(node);
case 353 /* JSDocSeeTag */:
return emitJSDocSeeTag(node);
case 358 /* NotEmittedStatement */:
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) {
case 9 /* NumericLiteral */:
case 10 /* BigIntLiteral */:
return emitNumericOrBigIntLiteral(node);
case 11 /* StringLiteral */:
case 14 /* RegularExpressionLiteral */:
case 15 /* NoSubstitutionTemplateLiteral */:
return emitLiteral(
node,
/*jsxAttributeEscape*/
false
);
case 80 /* Identifier */:
return emitIdentifier(node);
case 81 /* PrivateIdentifier */:
return emitPrivateIdentifier(node);
case 208 /* ArrayLiteralExpression */:
return emitArrayLiteralExpression(node);
case 209 /* ObjectLiteralExpression */:
return emitObjectLiteralExpression(node);
case 210 /* PropertyAccessExpression */:
return emitPropertyAccessExpression(node);
case 211 /* ElementAccessExpression */:
return emitElementAccessExpression(node);
case 212 /* CallExpression */:
return emitCallExpression(node);
case 213 /* NewExpression */:
return emitNewExpression(node);
case 214 /* TaggedTemplateExpression */:
return emitTaggedTemplateExpression(node);
case 215 /* TypeAssertionExpression */:
return emitTypeAssertionExpression(node);
case 216 /* ParenthesizedExpression */:
return emitParenthesizedExpression(node);
case 217 /* FunctionExpression */:
return emitFunctionExpression(node);
case 218 /* ArrowFunction */:
return emitArrowFunction(node);
case 219 /* DeleteExpression */:
return emitDeleteExpression(node);
case 220 /* TypeOfExpression */:
return emitTypeOfExpression(node);
case 221 /* VoidExpression */:
return emitVoidExpression(node);
case 222 /* AwaitExpression */:
return emitAwaitExpression(node);
case 223 /* PrefixUnaryExpression */:
return emitPrefixUnaryExpression(node);
case 224 /* PostfixUnaryExpression */:
return emitPostfixUnaryExpression(node);
case 225 /* BinaryExpression */:
return emitBinaryExpression(node);
case 226 /* ConditionalExpression */:
return emitConditionalExpression(node);
case 227 /* TemplateExpression */:
return emitTemplateExpression(node);
case 228 /* YieldExpression */:
return emitYieldExpression(node);
case 229 /* SpreadElement */:
return emitSpreadElement(node);
case 230 /* ClassExpression */:
return emitClassExpression(node);
case 231 /* OmittedExpression */:
return;
case 233 /* AsExpression */:
return emitAsExpression(node);
case 234 /* NonNullExpression */:
return emitNonNullExpression(node);
case 232 /* ExpressionWithTypeArguments */:
return emitExpressionWithTypeArguments(node);
case 237 /* SatisfiesExpression */:
return emitSatisfiesExpression(node);
case 235 /* MetaProperty */:
return emitMetaProperty(node);
case 236 /* SyntheticExpression */:
return Debug.fail("SyntheticExpression should never be printed.");
case 281 /* MissingDeclaration */:
return;
case 283 /* JsxElement */:
return emitJsxElement(node);
case 284 /* JsxSelfClosingElement */:
return emitJsxSelfClosingElement(node);
case 287 /* JsxFragment */:
return emitJsxFragment(node);
case 357 /* SyntaxList */:
return Debug.fail("SyntaxList should not be printed");
case 358 /* NotEmittedStatement */:
return;
case 359 /* PartiallyEmittedExpression */:
return emitPartiallyEmittedExpression(node);
case 360 /* CommaListExpression */:
return emitCommaList(node);
case 361 /* 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 getHelpersFromBundledSourceFiles(bundle) {
let result;
if (moduleKind === 0 /* None */ || printerOptions.noEmitHelpers) {
return void 0;
}
const bundledHelpers2 = /* @__PURE__ */ new Map();
for (const sourceFile of bundle.sourceFiles) {
const shouldSkip = getExternalHelpersModuleName(sourceFile) !== void 0;
const helpers = getSortedEmitHelpers(sourceFile);
if (!helpers)
continue;
for (const helper of helpers) {
if (!helper.scoped && !shouldSkip && !bundledHelpers2.get(helper.name)) {
bundledHelpers2.set(helper.name, true);
(result || (result = [])).push(helper.name);
}
}
}
return result;
}
function emitHelpers(node) {
let helpersEmitted = false;
const bundle = node.kind === 312 /* Bundle */ ? node : void 0;
if (bundle && moduleKind === 0 /* None */) {
return;
}
const numPrepends = bundle ? bundle.prepends.length : 0;
const numNodes = bundle ? bundle.sourceFiles.length + numPrepends : 1;
for (let i = 0; i < numNodes; i++) {
const currentNode = bundle ? i < numPrepends ? bundle.prepends[i] : bundle.sourceFiles[i - numPrepends] : node;
const sourceFile = isSourceFile(currentNode) ? currentNode : isUnparsedSource(currentNode) ? void 0 : currentSourceFile;
const shouldSkip = printerOptions.noEmitHelpers || !!sourceFile && hasRecordedExternalHelpers(sourceFile);
const shouldBundle = (isSourceFile(currentNode) || isUnparsedSource(currentNode)) && !isOwnFileEmit;
const helpers = isUnparsedSource(currentNode) ? currentNode.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;
}
const pos = getTextPosWithWriteLine();
if (typeof helper.text === "string") {
writeLines(helper.text);
} else {
writeLines(helper.text(makeFileLevelOptimisticUniqueName));
}
if (bundleFileInfo)
bundleFileInfo.sections.push({ pos, end: writer.getTextPos(), kind: "emitHelpers" /* EmitHelpers */, data: helper.name });
helpersEmitted = true;
}
}
}
return helpersEmitted;
}
function getSortedEmitHelpers(node) {
const helpers = getEmitHelpers(node);
return helpers && stableSort(helpers, compareEmitHelpers);
}
function emitNumericOrBigIntLiteral(node) {
emitLiteral(
node,
/*jsxAttributeEscape*/
false
);
}
function emitLiteral(node, jsxAttributeEscape) {
const text = getLiteralTextOfNode(node, printerOptions.neverAsciiEscape, jsxAttributeEscape);
if ((printerOptions.sourceMap || printerOptions.inlineSourceMap) && (node.kind === 11 /* StringLiteral */ || isTemplateLiteralKind(node.kind))) {
writeLiteral(text);
} else {
writeStringLiteral(text);
}
}
function emitUnparsedSourceOrPrepend(unparsed) {
for (const text of unparsed.texts) {
writeLine();
emit(text);
}
}
function writeUnparsedNode(unparsed) {
writer.rawWrite(unparsed.parent.text.substring(unparsed.pos, unparsed.end));
}
function emitUnparsedTextLike(unparsed) {
const pos = getTextPosWithWriteLine();
writeUnparsedNode(unparsed);
if (bundleFileInfo) {
updateOrPushBundleFileTextLike(
pos,
writer.getTextPos(),
unparsed.kind === 308 /* UnparsedText */ ? "text" /* Text */ : "internal" /* Internal */
);
}
}
function emitUnparsedSyntheticReference(unparsed) {
const pos = getTextPosWithWriteLine();
writeUnparsedNode(unparsed);
if (bundleFileInfo) {
const section = clone(unparsed.section);
section.pos = pos;
section.end = writer.getTextPos();
bundleFileInfo.sections.push(section);
}
}
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 === 241 /* 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) {
const savedPrivateNameTempFlags = privateNameTempFlags;
const savedReservedMemberNames = reservedPrivateNames;
popPrivateNameGenerationScope();
writePunctuation("[");
emitExpression(node.expression, parenthesizer.parenthesizeExpressionOfComputedPropertyName);
writePunctuation("]");
pushPrivateNameGenerationScope(savedPrivateNameTempFlags, savedReservedMemberNames);
}
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 === 323 /* 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) {
pushNameGenerationScope(node);
emitModifierList(node, node.modifiers);
emit(node.name);
emit(node.questionToken);
emitTypeParameters(node, node.typeParameters);
emitParameters(node, node.parameters);
emitTypeAnnotation(node.type);
writeTrailingSemicolon();
popNameGenerationScope(node);
}
function emitMethodDeclaration(node) {
emitDecoratorsAndModifiers(
node,
node.modifiers,
/*allowDecorators*/
true
);
emit(node.asteriskToken);
emit(node.name);
emit(node.questionToken);
emitSignatureAndBody(node, emitSignatureHead);
}
function emitClassStaticBlockDeclaration(node) {
writeKeyword("static");
emitBlockFunctionBody(node.body);
}
function emitConstructor(node) {
emitDecoratorsAndModifiers(
node,
node.modifiers,
/*allowDecorators*/
false
);
writeKeyword("constructor");
emitSignatureAndBody(node, emitSignatureHead);
}
function emitAccessorDeclaration(node) {
const pos = emitDecoratorsAndModifiers(
node,
node.modifiers,
/*allowDecorators*/
true
);
const token = node.kind === 176 /* GetAccessor */ ? 139 /* GetKeyword */ : 153 /* SetKeyword */;
emitTokenWithComment(token, pos, writeKeyword, node);
writeSpace();
emit(node.name);
emitSignatureAndBody(node, emitSignatureHead);
}
function emitCallSignature(node) {
pushNameGenerationScope(node);
emitTypeParameters(node, node.typeParameters);
emitParameters(node, node.parameters);
emitTypeAnnotation(node.type);
writeTrailingSemicolon();
popNameGenerationScope(node);
}
function emitConstructSignature(node) {
pushNameGenerationScope(node);
writeKeyword("new");
writeSpace();
emitTypeParameters(node, node.typeParameters);
emitParameters(node, node.parameters);
emitTypeAnnotation(node.type);
writeTrailingSemicolon();
popNameGenerationScope(node);
}
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) {
pushNameGenerationScope(node);
emitTypeParameters(node, node.typeParameters);
emitParametersForArrow(node, node.parameters);
writeSpace();
writePunctuation("=>");
writeSpace();
emit(node.type);
popNameGenerationScope(node);
}
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) {
pushNameGenerationScope(node);
emitModifierList(node, node.modifiers);
writeKeyword("new");
writeSpace();
emitTypeParameters(node, node.typeParameters);
emitParameters(node, node.parameters);
writeSpace();
writePunctuation("=>");
writeSpace();
emit(node.type);
popNameGenerationScope(node);
}
function emitTypeQuery(node) {
writeKeyword("typeof");
writeSpace();
emit(node.exprName);
emitTypeArguments(node, node.typeArguments);
}
function emitTypeLiteral(node) {
pushPrivateNameGenerationScope(
0 /* Auto */,
/*newReservedMemberNames*/
void 0
);
writePunctuation("{");
const flags = getEmitFlags(node) & 1 /* SingleLine */ ? 768 /* SingleLineTypeLiteralMembers */ : 32897 /* MultiLineTypeLiteralMembers */;
emitList(node, node.members, flags | 524288 /* NoSpaceIfEmpty */);
writePunctuation("}");
popPrivateNameGenerationScope();
}
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.assertions) {
writePunctuation(",");
writeSpace();
writePunctuation("{");
writeSpace();
writeKeyword("assert");
writePunctuation(":");
writeSpace();
const elements = node.assertions.assertClause.elements;
emitList(node.assertions.assertClause, elements, 526226 /* ImportClauseEntries */);
writeSpace();
writePunctuation("}");
}
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) {
pushPrivateNameGenerationScope(
0 /* Auto */,
/*newReservedMemberNames*/
void 0
);
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();
}
popPrivateNameGenerationScope();
}
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,
/*neverAsciiEscape*/
true,
/*jsxAttributeEscape*/
false
);
return !(expression.numericLiteralFlags & 448 /* WithSpecifier */) && !stringContains(text, tokenToString(25 /* DotToken */)) && !stringContains(text, String.fromCharCode(69 /* E */)) && !stringContains(text, String.fromCharCode(101 /* e */));
} else if (isAccessExpression(expression)) {
const constantValue = getConstantValue(expression);
return typeof constantValue === "number" && isFinite(constantValue) && 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);
}
function emitArrowFunctionHead(node) {
emitTypeParameters(node, node.typeParameters);
emitParametersForArrow(node, node.parameters);
emitTypeAnnotation(node.type);
writeSpace();
emit(node.equalsGreaterThanToken);
}
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 === 223 /* 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, parent2) {
return maybeEmitExpression(next, parent2, "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, parent2) {
return maybeEmitExpression(next, parent2, "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, parent2, side) {
const parenthesizerRule = side === "left" ? parenthesizer.getParenthesizeLeftSideOfBinaryForOperator(parent2.operatorToken.kind) : parenthesizer.getParenthesizeRightSideOfBinaryForOperator(parent2.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 === 244 /* 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(164 /* 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 === 260 /* 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();
}
}
pos = writeTokenText(token, writer2, pos);
if (isSimilarNode && contextNode.end !== pos) {
const isJsxExprContext = contextNode.kind === 293 /* 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;
if (some(getLeadingCommentRanges(currentSourceFile.text, node.pos), 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 && isPartiallyEmittedExpression(node) && 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 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) {
writeKeyword(isLet(node) ? "let" : isVarConst(node) ? "const" : "var");
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);
}
function emitSignatureAndBody(node, emitSignatureHead2) {
const body = node.body;
if (body) {
if (isBlock(body)) {
const indentedFlag = getEmitFlags(node) & 131072 /* Indented */;
if (indentedFlag) {
increaseIndent();
}
pushNameGenerationScope(node);
forEach(node.parameters, generateNames);
generateNames(node.body);
emitSignatureHead2(node);
emitBlockFunctionBody(body);
popNameGenerationScope(node);
if (indentedFlag) {
decreaseIndent();
}
} else {
emitSignatureHead2(node);
writeSpace();
emitExpression(body, parenthesizer.parenthesizeConciseBodyOfArrowFunction);
}
} else {
emitSignatureHead2(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) {
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) {
pushPrivateNameGenerationScope(
0 /* Auto */,
/*newReservedMemberNames*/
void 0
);
forEach(node.members, generateMemberNames);
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("{");
emitList(node, node.members, 129 /* ClassMembers */);
writePunctuation("}");
if (indentedFlag) {
decreaseIndent();
}
popPrivateNameGenerationScope();
}
function emitInterfaceDeclaration(node) {
pushPrivateNameGenerationScope(
0 /* Auto */,
/*newReservedMemberNames*/
void 0
);
emitDecoratorsAndModifiers(
node,
node.modifiers,
/*allowDecorators*/
false
);
writeKeyword("interface");
writeSpace();
emit(node.name);
emitTypeParameters(node, node.typeParameters);
emitList(node, node.heritageClauses, 512 /* HeritageClauses */);
writeSpace();
writePunctuation("{");
emitList(node, node.members, 129 /* InterfaceMembers */);
writePunctuation("}");
popPrivateNameGenerationScope();
}
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 & 1024 /* GlobalAugmentation */) {
writeKeyword(node.flags & 16 /* 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(160 /* FromKeyword */, node.importClause.end, writeKeyword, node);
writeSpace();
}
emitExpression(node.moduleSpecifier);
if (node.assertClause) {
emitWithLeadingSpace(node.assertClause);
}
writeTrailingSemicolon();
}
function emitImportClause(node) {
if (node.isTypeOnly) {
emitTokenWithComment(156 /* TypeKeyword */, 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(160 /* FromKeyword */, fromPos, writeKeyword, node);
writeSpace();
emitExpression(node.moduleSpecifier);
}
if (node.assertClause) {
emitWithLeadingSpace(node.assertClause);
}
writeTrailingSemicolon();
}
function emitAssertClause(node) {
emitTokenWithComment(132 /* AssertKeyword */, node.pos, writeKeyword, node);
writeSpace();
const elements = node.elements;
emitList(node, elements, 526226 /* ImportClauseEntries */);
}
function emitAssertEntry(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("");
if (isJsxClosingElement(node)) {
emitJsxTagName(node.tagName);
}
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/g);
for (const line of lines) {
writeLine();
writeSpace();
writePunctuation("*");
writeSpace();
write(line);
}
}
}
if (node.tags) {
if (node.tags.length === 1 && node.tags[0].kind === 350 /* 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 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 === 315 /* 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 === 328 /* 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 || []);
for (const prepend of node.prepends) {
if (isUnparsedSource(prepend) && prepend.syntheticReferences) {
for (const ref of prepend.syntheticReferences) {
emit(ref);
writeLine();
}
}
}
}
function emitTripleSlashDirectivesIfNeeded(node) {
if (node.isDeclarationFile)
emitTripleSlashDirectives(node.hasNoDefaultLib, node.referencedFiles, node.typeReferenceDirectives, node.libReferenceDirectives);
}
function emitTripleSlashDirectives(hasNoDefaultLib, files, types, libs2) {
if (hasNoDefaultLib) {
const pos = writer.getTextPos();
writeComment(`/// `);
if (bundleFileInfo)
bundleFileInfo.sections.push({ pos, end: writer.getTextPos(), kind: "no-default-lib" /* NoDefaultLib */ });
writeLine();
}
if (currentSourceFile && currentSourceFile.moduleName) {
writeComment(`/// `);
writeLine();
}
if (currentSourceFile && currentSourceFile.amdDependencies) {
for (const dep of currentSourceFile.amdDependencies) {
if (dep.name) {
writeComment(`/// `);
} else {
writeComment(`/// `);
}
writeLine();
}
}
for (const directive of files) {
const pos = writer.getTextPos();
writeComment(`/// `);
if (bundleFileInfo)
bundleFileInfo.sections.push({ pos, end: writer.getTextPos(), kind: "reference" /* Reference */, data: directive.fileName });
writeLine();
}
for (const directive of types) {
const pos = writer.getTextPos();
const resolutionMode = directive.resolutionMode && directive.resolutionMode !== (currentSourceFile == null ? void 0 : currentSourceFile.impliedNodeFormat) ? `resolution-mode="${directive.resolutionMode === 99 /* ESNext */ ? "import" : "require"}"` : "";
writeComment(`/// `);
if (bundleFileInfo)
bundleFileInfo.sections.push({ pos, end: writer.getTextPos(), kind: !directive.resolutionMode ? "type" /* Type */ : directive.resolutionMode === 99 /* ESNext */ ? "type-import" /* TypeResolutionModeImport */ : "type-require" /* TypeResolutionModeRequire */, data: directive.fileName });
writeLine();
}
for (const directive of libs2) {
const pos = writer.getTextPos();
writeComment(`/// `);
if (bundleFileInfo)
bundleFileInfo.sections.push({ pos, end: writer.getTextPos(), kind: "lib" /* Lib */, data: directive.fileName });
writeLine();
}
}
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, recordBundleFileSection) {
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();
const pos = writer.getTextPos();
emit(statement);
if (recordBundleFileSection && bundleFileInfo)
bundleFileInfo.sections.push({ pos, end: writer.getTextPos(), kind: "prologue" /* Prologue */, data: statement.expression.text });
if (seenPrologueDirectives) {
seenPrologueDirectives.add(statement.expression.text);
}
}
} else {
return i;
}
}
return statements.length;
}
function emitUnparsedPrologues(prologues, seenPrologueDirectives) {
for (const prologue of prologues) {
if (!seenPrologueDirectives.has(prologue.data)) {
writeLine();
const pos = writer.getTextPos();
emit(prologue);
if (bundleFileInfo)
bundleFileInfo.sections.push({ pos, end: writer.getTextPos(), kind: "prologue" /* Prologue */, data: prologue.data });
if (seenPrologueDirectives) {
seenPrologueDirectives.add(prologue.data);
}
}
}
}
function emitPrologueDirectivesIfNeeded(sourceFileOrBundle) {
if (isSourceFile(sourceFileOrBundle)) {
emitPrologueDirectives(sourceFileOrBundle.statements, sourceFileOrBundle);
} else {
const seenPrologueDirectives = /* @__PURE__ */ new Set();
for (const prepend of sourceFileOrBundle.prepends) {
emitUnparsedPrologues(prepend.prologues, seenPrologueDirectives);
}
for (const sourceFile of sourceFileOrBundle.sourceFiles) {
emitPrologueDirectives(
sourceFile.statements,
sourceFile,
seenPrologueDirectives,
/*recordBundleFileSection*/
true
);
}
setSourceFile(void 0);
}
}
function getPrologueDirectivesFromBundledSourceFiles(bundle) {
const seenPrologueDirectives = /* @__PURE__ */ new Set();
let prologues;
for (let index = 0; index < bundle.sourceFiles.length; index++) {
const sourceFile = bundle.sourceFiles[index];
let directives;
let end = 0;
for (const statement of sourceFile.statements) {
if (!isPrologueDirective(statement))
break;
if (seenPrologueDirectives.has(statement.expression.text))
continue;
seenPrologueDirectives.add(statement.expression.text);
(directives || (directives = [])).push({
pos: statement.pos,
end: statement.end,
expression: {
pos: statement.expression.pos,
end: statement.expression.end,
text: statement.expression.text
}
});
end = end < statement.end ? statement.end : end;
}
if (directives)
(prologues || (prologues = [])).push({ file: index, text: sourceFile.text.substring(0, end), directives });
}
return prologues;
}
function emitShebangIfNeeded(sourceFileOrBundle) {
if (isSourceFile(sourceFileOrBundle) || isUnparsedSource(sourceFileOrBundle)) {
const shebang = getShebang(sourceFileOrBundle.text);
if (shebang) {
writeComment(shebang);
writeLine();
return true;
}
} else {
for (const prepend of sourceFileOrBundle.prepends) {
Debug.assertNode(prepend, isUnparsedSource);
if (emitShebangIfNeeded(prepend)) {
return true;
}
}
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 start2 = 0;
let pos = 0;
let lastModifier;
while (start2 < 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 (start2 === 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,
start2,
pos - start2,
/*hasTrailingComma*/
false,
textRange
);
}
start2 = 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(parent2, node) {
if (isBlock(node) || getEmitFlags(parent2) & 1 /* SingleLine */ || preserveSourceNewlines && !getLeadingLineTerminatorCount(parent2, 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 */);
}
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, start2, count) {
emitNodeList(
emit,
parentNode,
children,
format | (parentNode && getEmitFlags(parentNode) & 2 /* MultiLine */ ? 65536 /* PreferNewLine */ : 0),
parenthesizerRule,
start2,
count
);
}
function emitExpressionList(parentNode, children, format, parenthesizerRule, start2, count) {
emitNodeList(emitExpression, parentNode, children, format, parenthesizerRule, start2, count);
}
function emitNodeList(emit2, parentNode, children, format, parenthesizerRule, start2 = 0, count = children ? children.length - start2 : 0) {
const isUndefined = children === void 0;
if (isUndefined && format & 16384 /* OptionalIfUndefined */) {
return;
}
const isEmpty = children === void 0 || start2 >= 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, start2, 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, start2, count, hasTrailingComma, childrenTextRange) {
const mayEmitInterveningComments = (format & 262144 /* NoInterveningComments */) === 0;
let shouldEmitInterveningComments = mayEmitInterveningComments;
const leadingLineTerminatorCount = getLeadingLineTerminatorCount(parentNode, children[start2], 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 previousSourceFileTextKind;
let shouldDecreaseIndentAfterEmit = false;
for (let i = 0; i < count; i++) {
const child = children[start2 + 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);
recordBundleFileInternalSectionEnd(previousSourceFileTextKind);
const separatingLineTerminatorCount = getSeparatingLineTerminatorCount(previousSibling, child, format);
if (separatingLineTerminatorCount > 0) {
if ((format & (3 /* LinesMask */ | 128 /* Indented */)) === 0 /* SingleLine */) {
increaseIndent();
shouldDecreaseIndentAfterEmit = true;
}
writeLine(separatingLineTerminatorCount);
shouldEmitInterveningComments = false;
} else if (previousSibling && format & 512 /* SpaceBetweenSiblings */) {
writeSpace();
}
}
previousSourceFileTextKind = recordBundleFileInternalSectionStart(child);
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();
}
recordBundleFileInternalSectionEnd(previousSourceFileTextKind);
const closingLineTerminatorCount = getClosingLineTerminatorCount(parentNode, children[start2 + 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/g);
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, parent2) {
const leadingNewlines = preserveSourceNewlines && getLeadingLineTerminatorCount(parent2, node, 0 /* None */);
if (leadingNewlines) {
writeLinesAndIndent(
leadingNewlines,
/*writeSpaceIfNotIndenting*/
false
);
}
return !!leadingNewlines;
}
function writeLineSeparatorsAfter(node, parent2) {
const trailingNewlines = preserveSourceNewlines && getClosingLineTerminatorCount(
parent2,
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(parent2, node1, node2) {
if (getEmitFlags(parent2) & 262144 /* NoIndentation */) {
return 0;
}
parent2 = skipSynthesizedParentheses(parent2);
node1 = skipSynthesizedParentheses(node1);
node2 = skipSynthesizedParentheses(node2);
if (getStartsOnNewLine(node2)) {
return 1;
}
if (currentSourceFile && !nodeIsSynthesized(parent2) && !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 === 216 /* 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, 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, neverAsciiEscape, jsxAttributeEscape);
}
}
const flags = (neverAsciiEscape ? 1 /* NeverAsciiEscape */ : 0) | (jsxAttributeEscape ? 2 /* JsxAttributeEscape */ : 0) | (printerOptions.terminateUnterminatedLiterals ? 4 /* TerminateUnterminatedLiterals */ : 0) | (printerOptions.target && printerOptions.target === 99 /* ESNext */ ? 8 /* AllowNumericSeparator */ : 0);
return getLiteralText(node, currentSourceFile, flags);
}
function pushNameGenerationScope(node) {
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) {
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 pushPrivateNameGenerationScope(newPrivateNameTempFlags, newReservedMemberNames) {
privateNameTempFlagsStack.push(privateNameTempFlags);
privateNameTempFlags = newPrivateNameTempFlags;
reservedPrivateNamesStack.push(reservedNames);
reservedPrivateNames = newReservedMemberNames;
}
function popPrivateNameGenerationScope() {
privateNameTempFlags = privateNameTempFlagsStack.pop();
reservedPrivateNames = reservedPrivateNamesStack.pop();
}
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 240 /* Block */:
forEach(node.statements, generateNames);
break;
case 255 /* LabeledStatement */:
case 253 /* WithStatement */:
case 245 /* DoStatement */:
case 246 /* WhileStatement */:
generateNames(node.statement);
break;
case 244 /* IfStatement */:
generateNames(node.thenStatement);
generateNames(node.elseStatement);
break;
case 247 /* ForStatement */:
case 249 /* ForOfStatement */:
case 248 /* ForInStatement */:
generateNames(node.initializer);
generateNames(node.statement);
break;
case 254 /* SwitchStatement */:
generateNames(node.caseBlock);
break;
case 268 /* CaseBlock */:
forEach(node.clauses, generateNames);
break;
case 295 /* CaseClause */:
case 296 /* DefaultClause */:
forEach(node.statements, generateNames);
break;
case 257 /* TryStatement */:
generateNames(node.tryBlock);
generateNames(node.catchClause);
generateNames(node.finallyBlock);
break;
case 298 /* CatchClause */:
generateNames(node.variableDeclaration);
generateNames(node.block);
break;
case 242 /* VariableStatement */:
generateNames(node.declarationList);
break;
case 260 /* VariableDeclarationList */:
forEach(node.declarations, generateNames);
break;
case 259 /* VariableDeclaration */:
case 168 /* Parameter */:
case 207 /* BindingElement */:
case 262 /* ClassDeclaration */:
generateNameIfNeeded(node.name);
break;
case 261 /* FunctionDeclaration */:
generateNameIfNeeded(node.name);
if (getEmitFlags(node) & 1048576 /* ReuseTempVariableScope */) {
forEach(node.parameters, generateNames);
generateNames(node.body);
}
break;
case 205 /* ObjectBindingPattern */:
case 206 /* ArrayBindingPattern */:
forEach(node.elements, generateNames);
break;
case 271 /* ImportDeclaration */:
generateNames(node.importClause);
break;
case 272 /* ImportClause */:
generateNameIfNeeded(node.name);
generateNames(node.namedBindings);
break;
case 273 /* NamespaceImport */:
generateNameIfNeeded(node.name);
break;
case 279 /* NamespaceExport */:
generateNameIfNeeded(node.name);
break;
case 274 /* NamedImports */:
forEach(node.elements, generateNames);
break;
case 275 /* ImportSpecifier */:
generateNameIfNeeded(node.propertyName || node.name);
break;
}
}
function generateMemberNames(node) {
if (!node)
return;
switch (node.kind) {
case 302 /* PropertyAssignment */:
case 303 /* ShorthandPropertyAssignment */:
case 171 /* PropertyDeclaration */:
case 173 /* MethodDeclaration */:
case 176 /* GetAccessor */:
case 177 /* 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) {
return privateName ? !!(reservedPrivateNames == null ? void 0 : reservedPrivateNames.has(name)) : !!(reservedNames == null ? void 0 : reservedNames.has(name));
}
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 makeUniqueName2(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 makeUniqueName2(
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 : makeUniqueName2(
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 makeUniqueName2(
baseName,
isUniqueName,
/*optimistic*/
false,
/*scoped*/
false,
/*privateName*/
false,
/*prefix*/
"",
/*suffix*/
""
);
}
function generateNameForExportDefault() {
return makeUniqueName2(
"default",
isUniqueName,
/*optimistic*/
false,
/*scoped*/
false,
/*privateName*/
false,
/*prefix*/
"",
/*suffix*/
""
);
}
function generateNameForClassExpression() {
return makeUniqueName2(
"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 makeUniqueName2(
getTextOfNode2(node),
isUniqueName,
!!(flags & 16 /* Optimistic */),
!!(flags & 8 /* ReservedInNestedScopes */),
privateName,
prefix,
suffix
);
case 266 /* ModuleDeclaration */:
case 265 /* EnumDeclaration */:
Debug.assert(!prefix && !suffix && !privateName);
return generateNameForModuleOrEnum(node);
case 271 /* ImportDeclaration */:
case 277 /* ExportDeclaration */:
Debug.assert(!prefix && !suffix && !privateName);
return generateNameForImportOrExportDeclaration(node);
case 261 /* FunctionDeclaration */:
case 262 /* 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 276 /* ExportAssignment */:
Debug.assert(!prefix && !suffix && !privateName);
return generateNameForExportDefault();
case 230 /* ClassExpression */:
Debug.assert(!prefix && !suffix && !privateName);
return generateNameForClassExpression();
case 173 /* MethodDeclaration */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
return generateNameForMethodOrAccessor(node, privateName, prefix, suffix);
case 166 /* 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 makeUniqueName2(
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 !== 358 /* NotEmittedStatement */
);
}
if (!skipLeadingComments || pos >= 0 && (emitFlags & 1024 /* NoLeadingComments */) !== 0) {
containerPos = pos;
}
if (!skipTrailingComments || end >= 0 && (emitFlags & 2048 /* NoTrailingComments */) !== 0) {
containerEnd = end;
if (node.kind === 260 /* 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 !== 358 /* 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 parent2 = previousNode.parent;
if (!parent2 || parent2 !== 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 getParsedSourceMap(node) {
if (node.parsedSourceMap === void 0 && node.sourceMapText !== void 0) {
node.parsedSourceMap = tryParseRawSourceMap(node.sourceMapText) || false;
}
return node.parsedSourceMap || void 0;
}
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);
if (isUnparsedNode(node)) {
Debug.assertIsDefined(node.parent, "UnparsedNodes must have parent pointers");
const parsed = getParsedSourceMap(node.parent);
if (parsed && sourceMapGenerator) {
sourceMapGenerator.appendSourceMap(
writer.getLine(),
writer.getColumn(),
parsed,
node.parent.sourceMapPath,
node.parent.getLineAndCharacterOfPosition(node.pos),
node.parent.getLineAndCharacterOfPosition(node.end)
);
}
} else {
const source = sourceMapRange.source || sourceMapSource;
if (node.kind !== 358 /* 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 (!isUnparsedNode(node)) {
if (emitFlags & 128 /* NoNestedSourceMaps */) {
sourceMapsDisabled = false;
}
if (node.kind !== 358 /* 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, useCaseSensitiveFileNames) {
if (!host.getDirectories || !host.readDirectory) {
return void 0;
}
const cachedReadDirectoryResult = /* @__PURE__ */ new Map();
const getCanonicalFileName = createGetCanonicalFileName(useCaseSensitiveFileNames);
return {
useCaseSensitiveFileNames,
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 tryReadDirectory2(rootDir, rootDirPath) {
rootDirPath = ensureTrailingDirectorySeparator(rootDirPath);
const cachedResult = getCachedFileSystemEntries(rootDirPath);
if (cachedResult) {
return cachedResult;
}
try {
return createCachedFileSystemEntries(rootDir, rootDirPath);
} catch (_e) {
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 = tryReadDirectory2(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 = tryReadDirectory2(rootDir, rootDirPath);
let rootSymLinkResult;
if (rootResult !== void 0) {
return matchFiles(rootDir, extensions, excludes, includes, useCaseSensitiveFileNames, 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 = tryReadDirectory2(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 addOrDeleteFileOrDirectory(fileOrDirectory, fileOrDirectoryPath) {
const existingResult = getCachedFileSystemEntries(fileOrDirectoryPath);
if (existingResult !== void 0) {
clearCache();
return void 0;
}
const parentResult = getCachedFileSystemEntriesForBaseDir(fileOrDirectoryPath);
if (!parentResult) {
return void 0;
}
if (!host.directoryExists) {
clearCache();
return void 0;
}
const baseName = getBaseNameOfFileName(fileOrDirectory);
const fsQueryResult = {
fileExists: host.fileExists(fileOrDirectoryPath),
directoryExists: host.directoryExists(fileOrDirectoryPath)
};
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 */);
}
}
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();
}
}
var ConfigFileProgramReloadLevel = /* @__PURE__ */ ((ConfigFileProgramReloadLevel2) => {
ConfigFileProgramReloadLevel2[ConfigFileProgramReloadLevel2["None"] = 0] = "None";
ConfigFileProgramReloadLevel2[ConfigFileProgramReloadLevel2["Partial"] = 1] = "Partial";
ConfigFileProgramReloadLevel2[ConfigFileProgramReloadLevel2["Full"] = 2] = "Full";
return ConfigFileProgramReloadLevel2;
})(ConfigFileProgramReloadLevel || {});
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 updatePackageJsonWatch(lookups, packageJsonWatches, createPackageJsonWatch) {
const newMap = new Map(lookups);
mutateMap(
packageJsonWatches,
newMap,
{
createNewValue: createPackageJsonWatch,
onDeleteValue: closeFileWatcher
}
);
}
function updateMissingFilePathsWatch(program, missingFileWatches, createMissingFileWatch) {
const missingFilePaths = program.getMissingFilePaths();
const newMissingFilePathMap = arrayToMap(missingFilePaths, identity, returnTrue);
mutateMap(
missingFileWatches,
newMissingFilePathMap,
{
// 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) {
mutateMap(
existingWatchedForWildcards,
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
}
);
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,
writeLog,
toPath: toPath3
}) {
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)) {
writeLog(`Project: ${configFileName} Detected file add/remove of non supported extension: ${fileOrDirectory}`);
return true;
}
if (isExcludedFile(fileOrDirectory, options.configFile.configFileSpecs, getNormalizedAbsolutePath(getDirectoryPath(configFileName), currentDirectory), useCaseSensitiveFileNames, currentDirectory)) {
writeLog(`Project: ${configFileName} Detected excluded file: ${fileOrDirectory}`);
return true;
}
if (!program)
return false;
if (outFile(options) || 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.getState().fileInfos.has(file) : !!find(program, (rootFile) => toPath3(rootFile) === file);
}
}
function isBuilderProgram(program) {
return !!program.getState;
}
function isEmittedFileOfProgram(program, file) {
if (!program) {
return false;
}
return program.isEmittedFile(file);
}
var WatchLogLevel = /* @__PURE__ */ ((WatchLogLevel2) => {
WatchLogLevel2[WatchLogLevel2["None"] = 0] = "None";
WatchLogLevel2[WatchLogLevel2["TriggerOnly"] = 1] = "TriggerOnly";
WatchLogLevel2[WatchLogLevel2["Verbose"] = 2] = "Verbose";
return WatchLogLevel2;
})(WatchLogLevel || {});
function getWatchFactory(host, watchLogLevel, log, getDetailWatchInfo2) {
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, useCaseSensitiveFileNames(), ((_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 useCaseSensitiveFileNames() {
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, getDetailWatchInfo2)}`);
return {
close: () => log(`ExcludeWatcher:: Close:: ${getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo2)}`)
};
}
function createFileWatcherWithLogging(file, cb, flags, options, detailInfo1, detailInfo2) {
log(`FileWatcher:: Added:: ${getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo2)}`);
const watcher = triggerInvokingFactory.watchFile(file, cb, flags, options, detailInfo1, detailInfo2);
return {
close: () => {
log(`FileWatcher:: Close:: ${getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo2)}`);
watcher.close();
}
};
}
function createDirectoryWatcherWithLogging(file, cb, flags, options, detailInfo1, detailInfo2) {
const watchInfo = `DirectoryWatcher:: Added:: ${getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo2)}`;
log(watchInfo);
const start2 = timestamp();
const watcher = triggerInvokingFactory.watchDirectory(file, cb, flags, options, detailInfo1, detailInfo2);
const elapsed = timestamp() - start2;
log(`Elapsed:: ${elapsed}ms ${watchInfo}`);
return {
close: () => {
const watchInfo2 = `DirectoryWatcher:: Close:: ${getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo2)}`;
log(watchInfo2);
const start3 = timestamp();
watcher.close();
const elapsed2 = timestamp() - start3;
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, getDetailWatchInfo2)}`;
log(triggerredInfo);
const start2 = timestamp();
cb.call(
/*thisArg*/
void 0,
...args
);
const elapsed = timestamp() - start2;
log(`Elapsed:: ${elapsed}ms ${triggerredInfo}`);
},
flags,
options,
detailInfo1,
detailInfo2
);
}
function getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo3) {
return `WatchInfo: ${file} ${flags} ${JSON.stringify(options)} ${getDetailWatchInfo3 ? getDetailWatchInfo3(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 failed = 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 (failed) {
return "";
}
if (!commonPathComponents) {
return currentDirectory;
}
return getPathFromPathComponents(commonPathComponents);
}
function createCompilerHost(options, setParentNodes) {
return createCompilerHostWorker(options, setParentNodes);
}
function createGetSourceFile(readFile, getCompilerOptions, setParentNodes) {
return (fileName, languageVersionOrOptions, onError) => {
let text;
try {
mark("beforeIORead");
text = readFile(fileName, getCompilerOptions().charset);
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), () => options, 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 getPreEmitDiagnostics(program, sourceFile, cancellationToken) {
let diagnostics;
diagnostics = addRange(diagnostics, program.getConfigFileParsingDiagnostics());
diagnostics = addRange(diagnostics, program.getOptionsDiagnostics(cancellationToken));
diagnostics = addRange(diagnostics, program.getSyntacticDiagnostics(sourceFile, cancellationToken));
diagnostics = addRange(diagnostics, program.getGlobalDiagnostics(cancellationToken));
diagnostics = addRange(diagnostics, program.getSemanticDiagnostics(sourceFile, cancellationToken));
if (getEmitDeclarations(program.getCompilerOptions())) {
diagnostics = addRange(diagnostics, program.getDeclarationDiagnostics(sourceFile, cancellationToken));
}
return sortAndDeduplicateDiagnostics(diagnostics || emptyArray);
}
function formatDiagnostics(diagnostics, host) {
let output = "";
for (const diagnostic of diagnostics) {
output += formatDiagnostic(diagnostic, host);
}
return output;
}
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 ForegroundColorEscapeSequences = /* @__PURE__ */ ((ForegroundColorEscapeSequences2) => {
ForegroundColorEscapeSequences2["Grey"] = "\x1B[90m";
ForegroundColorEscapeSequences2["Red"] = "\x1B[91m";
ForegroundColorEscapeSequences2["Yellow"] = "\x1B[93m";
ForegroundColorEscapeSequences2["Blue"] = "\x1B[94m";
ForegroundColorEscapeSequences2["Cyan"] = "\x1B[96m";
return ForegroundColorEscapeSequences2;
})(ForegroundColorEscapeSequences || {});
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, start2, length2, indent3, squiggleColor, host) {
const { line: firstLine, character: firstLineChar } = getLineAndCharacterOfPosition(file, start2);
const { line: lastLine, character: lastLineChar } = getLineAndCharacterOfPosition(file, start2 + 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 += indent3 + formatColorAndReset(padLeft(ellipsis, 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 = trimStringEnd(lineContent);
lineContent = lineContent.replace(/\t/g, " ");
context += indent3 + formatColorAndReset(padLeft(i + 1 + "", gutterWidth), gutterStyleSequence) + gutterSeparator;
context += lineContent + host.getNewLine();
context += indent3 + formatColorAndReset(padLeft("", 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, start2, host, color = formatColorAndReset) {
const { line: firstLine, character: firstLineChar } = getLineAndCharacterOfPosition(file, start2);
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: start2 } = diagnostic;
output += formatLocation(file, start2, 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: start2, length: length2, messageText } of diagnostic.relatedInformation) {
if (file) {
output += host.getNewLine();
output += halfIndent + formatLocation(file, start2, host);
output += formatCodeSpan(file, start2, length2, indent, "\x1B[96m" /* Cyan */, host);
}
output += host.getNewLine();
output += indent + flattenDiagnosticMessageText(messageText, host.getNewLine());
}
}
output += host.getNewLine();
}
return output;
}
function flattenDiagnosticMessageText(diag2, newLine, indent3 = 0) {
if (isString(diag2)) {
return diag2;
} else if (diag2 === void 0) {
return "";
}
let result = "";
if (indent3) {
result += newLine;
for (let i = 0; i < indent3; i++) {
result += " ";
}
}
result += diag2.messageText;
indent3++;
if (diag2.next) {
for (const kid of diag2.next) {
result += flattenDiagnosticMessageText(kid, newLine, indent3);
}
}
return result;
}
function getModeForFileReference(ref, containingFileMode) {
return (isString(ref) ? containingFileMode : ref.resolutionMode) || containingFileMode;
}
function getModeForResolutionAtIndex(file, index) {
if (file.impliedNodeFormat === void 0)
return void 0;
return getModeForUsageLocation(file, getModuleNameStringLiteralAt(file, index));
}
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) {
var _a, _b;
if (file.impliedNodeFormat === void 0)
return void 0;
if (isImportDeclaration(usage.parent) || isExportDeclaration(usage.parent)) {
const isTypeOnly = isExclusivelyTypeOnlyImportOrExport(usage.parent);
if (isTypeOnly) {
const override = getResolutionModeOverrideForClause(usage.parent.assertClause);
if (override) {
return override;
}
}
}
if (usage.parent.parent && isImportTypeNode(usage.parent.parent)) {
const override = getResolutionModeOverrideForClause((_a = usage.parent.parent.assertions) == null ? void 0 : _a.assertClause);
if (override) {
return override;
}
}
if (file.impliedNodeFormat !== 99 /* ESNext */) {
return isImportCall(walkUpParenthesizedExpressions(usage.parent)) ? 99 /* ESNext */ : 1 /* CommonJS */;
}
const exprParentParent = (_b = walkUpParenthesizedExpressions(usage.parent)) == null ? void 0 : _b.parent;
return exprParentParent && isImportEqualsDeclaration(exprParentParent) ? 1 /* CommonJS */ : 99 /* ESNext */;
}
function getResolutionModeOverrideForClause(clause, grammarErrorOnNode) {
if (!clause)
return void 0;
if (length(clause.elements) !== 1) {
grammarErrorOnNode == null ? void 0 : grammarErrorOnNode(clause, Diagnostics.Type_import_assertions_should_have_exactly_one_key_resolution_mode_with_value_import_or_require);
return void 0;
}
const elem = clause.elements[0];
if (!isStringLiteralLike(elem.name))
return void 0;
if (elem.name.text !== "resolution-mode") {
grammarErrorOnNode == null ? void 0 : grammarErrorOnNode(elem.name, 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) => getModeForUsageLocation(file, entry)
};
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) ? toFileNameLowerCase(entry.fileName) : entry;
}
var typeReferenceResolutionNameAndModeGetter = {
getName: getTypeReferenceResolutionName,
getMode: (entry, file) => getModeForFileReference(entry, file == null ? void 0 : file.impliedNodeFormat)
};
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);
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;
}
function forEachResolvedProjectReference(resolvedProjectReferences, cb) {
return forEachProjectReference(
/*projectReferences*/
void 0,
resolvedProjectReferences,
(resolvedRef, parent2) => resolvedRef && cb(resolvedRef, parent2)
);
}
function forEachProjectReference(projectReferences, resolvedProjectReferences, cbResolvedRef, cbRef) {
let seenResolvedRefs;
return worker(
projectReferences,
resolvedProjectReferences,
/*parent*/
void 0
);
function worker(projectReferences2, resolvedProjectReferences2, parent2) {
if (cbRef) {
const result = cbRef(projectReferences2, parent2);
if (result)
return result;
}
return forEach(resolvedProjectReferences2, (resolvedRef, index) => {
if (resolvedRef && (seenResolvedRefs == null ? void 0 : seenResolvedRefs.has(resolvedRef.sourceFile.path))) {
return void 0;
}
const result = cbResolvedRef(resolvedRef, parent2, index);
if (result || !resolvedRef)
return result;
(seenResolvedRefs || (seenResolvedRefs = /* @__PURE__ */ new Set())).add(resolvedRef.sourceFile.path);
return worker(resolvedRef.commandLine.projectReferences, resolvedRef.references, resolvedRef);
});
}
}
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 getLibFileNameFromLibReference(libReference) {
const libName = toFileNameLowerCase(libReference.fileName);
const libFileName = libMap.get(libName);
return { libName, libFileName };
}
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(getSourceFileByPath, ref) {
var _a, _b, _c, _d, _e, _f;
const file = Debug.checkDefined(getSourceFileByPath(ref.file));
const { kind, index } = ref;
let pos, end, packageId, resolutionMode;
switch (kind) {
case 3 /* Import */:
const importLiteral = getModuleNameStringLiteralAt(file, index);
packageId = (_c = (_b = (_a = file.resolvedModules) == null ? void 0 : _a.get(importLiteral.text, getModeForResolutionAtIndex(file, index))) == null ? void 0 : _b.resolvedModule) == null ? void 0 : _c.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, resolutionMode } = file.typeReferenceDirectives[index]);
packageId = (_f = (_e = (_d = file.resolvedTypeReferenceDirectiveNames) == null ? void 0 : _d.get(toFileNameLowerCase(file.typeReferenceDirectives[index].fileName), resolutionMode || file.impliedNodeFormat)) == null ? void 0 : _e.resolvedTypeReferenceDirective) == null ? void 0 : _f.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;
if (program.getMissingFilePaths().some(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 getImpliedNodeFormatForFile(fileName, packageJsonInfoCache, host, options) {
const result = getImpliedNodeFormatForFileWorker(fileName, packageJsonInfoCache, host, options);
return typeof result === "object" ? result.impliedNodeFormat : result;
}
function getImpliedNodeFormatForFileWorker(fileName, packageJsonInfoCache, host, options) {
switch (getEmitModuleResolutionKind(options)) {
case 3 /* Node16 */:
case 99 /* NodeNext */:
return fileExtensionIsOneOf(fileName, [".d.mts" /* Dmts */, ".mts" /* Mts */, ".mjs" /* Mjs */]) ? 99 /* ESNext */ : fileExtensionIsOneOf(fileName, [".d.cts" /* Dcts */, ".cts" /* Cts */, ".cjs" /* Cjs */]) ? 1 /* CommonJS */ : fileExtensionIsOneOf(fileName, [".d.ts" /* Dts */, ".ts" /* Ts */, ".tsx" /* Tsx */, ".js" /* Js */, ".jsx" /* Jsx */]) ? lookupFromPackageJson() : void 0;
default:
return void 0;
}
function lookupFromPackageJson() {
const state = getTemporaryModuleResolutionState(packageJsonInfoCache, host, options);
const packageJsonLocations = [];
state.failedLookupLocations = packageJsonLocations;
state.affectingLocations = packageJsonLocations;
const packageJsonScope = getPackageScopeForPath(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_assertion_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.const_declarations_can_only_be_declared_inside_a_block.code,
Diagnostics.const_declarations_must_be_initialized.code,
Diagnostics.extends_clause_already_seen.code,
Diagnostics.let_declarations_can_only_be_declared_inside_a_block.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
]);
function shouldProgramCreateNewSourceFiles(program, newOptions) {
if (!program)
return false;
return optionsHaveChanges(program.getCompilerOptions(), newOptions, sourceFileAffectingCompilerOptions);
}
function createCreateProgramOptions(rootNames, options, host, oldProgram, configFileParsingDiagnostics, typeScriptVersion3) {
return {
rootNames,
options,
host,
oldProgram,
configFileParsingDiagnostics,
typeScriptVersion: typeScriptVersion3
};
}
function createProgram(rootNamesOrOptions, _options, _host, _oldProgram, _configFileParsingDiagnostics) {
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
const createProgramOptions = isArray(rootNamesOrOptions) ? createCreateProgramOptions(rootNamesOrOptions, _options, _host, _oldProgram, _configFileParsingDiagnostics) : rootNamesOrOptions;
const { rootNames, options, configFileParsingDiagnostics, projectReferences, typeScriptVersion: typeScriptVersion3 } = createProgramOptions;
let { oldProgram } = createProgramOptions;
const reportInvalidIgnoreDeprecations = memoize(() => createOptionValueDiagnostic("ignoreDeprecations", Diagnostics.Invalid_value_for_ignoreDeprecations));
let processingDefaultLibFiles;
let processingOtherFiles;
let files;
let symlinks;
let commonSourceDirectory;
let typeChecker;
let classifiableNames;
const ambientModuleNameToUnmodifiedFileName = /* @__PURE__ */ new Map();
let fileReasons = createMultiMap();
const cachedBindAndCheckDiagnosticsForFile = {};
const cachedDeclarationDiagnosticsForFile = {};
let resolvedTypeReferenceDirectives = createModeAwareCache();
let fileProcessingDiagnostics;
let automaticTypeDirectiveNames;
let automaticTypeDirectiveResolutions;
let resolvedLibReferences;
let resolvedLibProcessing;
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 = createProgramOptions.host || createCompilerHost(options);
const configParsingHost = parseConfigHostFromCompilerHostLike(host);
let skipDefaultLib = options.noLib;
const getDefaultLibraryFileName = memoize(() => host.getDefaultLibFileName(options));
const defaultLibraryPath = host.getDefaultLibLocation ? host.getDefaultLibLocation() : getDirectoryPath(getDefaultLibraryFileName());
const programDiagnostics = createDiagnosticCollection();
const currentDirectory = host.getCurrentDirectory();
const supportedExtensions = getSupportedExtensions(options);
const supportedExtensionsWithJsonIfResolveJsonModule = getSupportedExtensionsWithJsonIfResolveJsonModule(options, supportedExtensions);
const hasEmitBlockingDiagnostics = /* @__PURE__ */ new Map();
let _compilerOptionsObjectLiteralSyntax;
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()
);
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 = false;
const filesByName = /* @__PURE__ */ new Map();
let missingFilePaths;
const filesByNameIgnoreCase = host.useCaseSensitiveFileNames() ? /* @__PURE__ */ new Map() : void 0;
let resolvedProjectReferences;
let projectReferenceRedirects;
let mapFromFileToProjectReferenceRedirects;
let mapFromToProjectReferenceRedirectSource;
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,
getSourceOfProjectReferenceRedirect,
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 = outFile(parsedRef.commandLine.options);
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 }
);
});
}
}
missingFilePaths = arrayFrom(mapDefinedIterator(filesByName.entries(), ([path, file]) => file === void 0 ? path : void 0));
files = stableSort(processingDefaultLibFiles, compareDefaultLibFiles).concat(processingOtherFiles);
processingDefaultLibFiles = void 0;
processingOtherFiles = void 0;
}
Debug.assert(!!missingFilePaths);
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));
}
}
if (!host.getParsedCommandLine) {
oldProgram.forEachResolvedProjectReference((resolvedProjectReference) => {
if (!getResolvedProjectReferenceByPath(resolvedProjectReference.sourceFile.path)) {
host.onReleaseOldSourceFile(
resolvedProjectReference.sourceFile,
oldProgram.getCompilerOptions(),
/*hasSourceFileByPath*/
false
);
}
});
}
}
if (oldProgram && host.onReleaseParsedCommandLine) {
forEachProjectReference(
oldProgram.getProjectReferences(),
oldProgram.getResolvedProjectReferences(),
(oldResolvedRef, parent2, index) => {
const oldReference = (parent2 == null ? void 0 : parent2.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;
const program = {
getRootFileNames: () => rootNames,
getSourceFile,
getSourceFileByPath,
getSourceFiles: () => files,
getMissingFilePaths: () => missingFilePaths,
// TODO: GH#18217
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: () => fileProcessingDiagnostics,
getResolvedTypeReferenceDirectives: () => resolvedTypeReferenceDirectives,
getAutomaticTypeDirectiveNames: () => automaticTypeDirectiveNames,
getAutomaticTypeDirectiveResolutions: () => automaticTypeDirectiveResolutions,
isSourceFileFromExternalLibrary,
isSourceFileDefaultLibrary,
getSourceFileFromReference,
getLibFileFromReference,
sourceFileToPackageName,
redirectTargetsMap,
usesUriStyleNodeCoreModules,
resolvedLibReferences,
getCurrentPackagesMap: () => packageMap,
typesPackageExists,
packageBundlesTypes,
isEmittedFile,
getConfigFileParsingDiagnostics: getConfigFileParsingDiagnostics2,
getProjectReferences,
getResolvedProjectReferences,
getProjectReferenceRedirect,
getResolvedProjectReferenceToRedirect,
getResolvedProjectReferenceByPath,
forEachResolvedProjectReference: forEachResolvedProjectReference2,
isSourceOfProjectReferenceRedirect,
emitBuildInfo,
fileExists,
readFile,
directoryExists,
getSymlinkCache,
realpath: (_o = host.realpath) == null ? void 0 : _o.bind(host),
useCaseSensitiveFileNames: () => host.useCaseSensitiveFileNames(),
getCanonicalFileName,
getFileIncludeReasons: () => fileReasons,
structureIsReused,
writeFile: writeFile2
};
onProgramCreateComplete();
fileProcessingDiagnostics == null ? void 0 : fileProcessingDiagnostics.forEach((diagnostic) => {
switch (diagnostic.kind) {
case 1 /* FilePreprocessingFileExplainingDiagnostic */:
return programDiagnostics.add(createDiagnosticExplainingFile(diagnostic.file && getSourceFileByPath(diagnostic.file), diagnostic.fileProcessingReason, diagnostic.diagnostic, diagnostic.args || emptyArray));
case 0 /* FilePreprocessingReferencedDiagnostic */:
const { file, pos, end } = getReferencedFileLocation(getSourceFileByPath, diagnostic.reason);
return programDiagnostics.add(createFileDiagnostic(file, Debug.checkDefined(pos), Debug.checkDefined(end) - pos, diagnostic.diagnostic, ...diagnostic.args || emptyArray));
case 2 /* ResolutionDiagnostics */:
return diagnostic.diagnostics.forEach((d) => programDiagnostics.add(d));
default:
Debug.assertNever(diagnostic);
}
});
verifyCompilerOptions();
mark("afterProgram");
measure("Program", "beforeProgram", "afterProgram");
(_p = tracing) == null ? void 0 : _p.pop();
return program;
function getPackagesMap() {
if (packageMap)
return packageMap;
packageMap = /* @__PURE__ */ new Map();
files.forEach((sf) => {
if (!sf.resolvedModules)
return;
sf.resolvedModules.forEach(({ 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;
(fileProcessingDiagnostics ?? (fileProcessingDiagnostics = [])).push({
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;
if (!moduleNames.length)
return emptyArray;
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;
if (!typeDirectiveNames.length)
return [];
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) {
const redirect = getResolvedProjectReferenceToRedirect(file.originalFileName);
if (redirect || !isDeclarationFileName(file.originalFileName))
return redirect;
const resultFromDts = getRedirectReferenceForResolutionFromSourceOfProject(file.path);
if (resultFromDts)
return resultFromDts;
if (!host.realpath || !options.preserveSymlinks || !stringContains(file.originalFileName, nodeModulesPathPart))
return void 0;
const realDeclarationPath = toPath3(host.realpath(file.originalFileName));
return realDeclarationPath === file.path ? void 0 : getRedirectReferenceForResolutionFromSourceOfProject(realDeclarationPath);
}
function getRedirectReferenceForResolutionFromSourceOfProject(filePath) {
const source = getSourceOfProjectReferenceRedirect(filePath);
if (isString(source))
return getResolvedProjectReferenceToRedirect(source);
if (!source)
return void 0;
return forEachResolvedProjectReference2((resolvedRef) => {
const out = outFile(resolvedRef.commandLine.options);
if (!out)
return void 0;
return toPath3(out) === filePath ? resolvedRef : void 0;
});
}
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() {
if (commonSourceDirectory === void 0) {
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)
);
}
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, file) {
var _a2;
if (structureIsReused === 0 /* Not */ && !file.ambientModuleNames.length) {
return resolveModuleNamesWorker(
moduleNames,
file,
/*reusedNames*/
void 0
);
}
const oldSourceFile = oldProgram && oldProgram.getSourceFile(file.fileName);
if (oldSourceFile !== file && file.resolvedModules) {
const result2 = [];
for (const moduleName of moduleNames) {
const resolvedModule = file.resolvedModules.get(moduleName.text, getModeForUsageLocation(file, moduleName));
result2.push(resolvedModule);
}
return result2;
}
let unknownModuleNames;
let result;
let reusedNames;
const predictedToResolveToAmbientModuleMarker = emptyResolution;
for (let i = 0; i < moduleNames.length; i++) {
const moduleName = moduleNames[i];
if (file === oldSourceFile && !hasInvalidatedResolutions(oldSourceFile.path)) {
const mode = getModeForUsageLocation(file, moduleName);
const oldResolution = (_a2 = oldSourceFile.resolvedModules) == null ? void 0 : _a2.get(moduleName.text, mode);
if (oldResolution == null ? void 0 : oldResolution.resolvedModule) {
if (isTraceEnabled(options, host)) {
trace(
host,
oldResolution.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,
moduleName.text,
getNormalizedAbsolutePath(file.originalFileName, currentDirectory),
oldResolution.resolvedModule.resolvedFileName,
oldResolution.resolvedModule.packageId && packageIdToString(oldResolution.resolvedModule.packageId)
);
}
(result ?? (result = new Array(moduleNames.length)))[i] = oldResolution;
(reusedNames ?? (reusedNames = [])).push(moduleName);
continue;
}
}
let resolvesToAmbientModuleInNonModifiedFile = false;
if (contains(file.ambientModuleNames, moduleName.text)) {
resolvesToAmbientModuleInNonModifiedFile = true;
if (isTraceEnabled(options, host)) {
trace(host, Diagnostics.Module_0_was_resolved_as_locally_declared_ambient_module_in_file_1, moduleName.text, getNormalizedAbsolutePath(file.originalFileName, currentDirectory));
}
} else {
resolvesToAmbientModuleInNonModifiedFile = moduleNameResolvesToAmbientModuleInNonModifiedFile(moduleName);
}
if (resolvesToAmbientModuleInNonModifiedFile) {
(result || (result = new Array(moduleNames.length)))[i] = predictedToResolveToAmbientModuleMarker;
} else {
(unknownModuleNames ?? (unknownModuleNames = [])).push(moduleName);
}
}
const resolutions = unknownModuleNames && unknownModuleNames.length ? resolveModuleNamesWorker(unknownModuleNames, file, reusedNames) : emptyArray;
if (!result) {
Debug.assert(resolutions.length === moduleNames.length);
return resolutions;
}
let j = 0;
for (let i = 0; i < result.length; i++) {
if (!result[i]) {
result[i] = resolutions[j];
j++;
}
}
Debug.assert(j === resolutions.length);
return result;
function moduleNameResolvesToAmbientModuleInNonModifiedFile(moduleName) {
const resolutionToFile = getResolvedModule(oldSourceFile, moduleName.text, getModeForUsageLocation(file, moduleName));
const resolvedFile = resolutionToFile && oldProgram.getSourceFile(resolutionToFile.resolvedFileName);
if (resolutionToFile && resolvedFile) {
return false;
}
const unmodifiedFile = ambientModuleNameToUnmodifiedFileName.get(moduleName.text);
if (!unmodifiedFile) {
return false;
}
if (isTraceEnabled(options, host)) {
trace(host, Diagnostics.Module_0_was_resolved_as_ambient_module_declared_in_1_since_this_file_was_not_modified, moduleName.text, unmodifiedFile);
}
return true;
}
}
function resolveTypeReferenceDirectiveNamesReusingOldState(typeDirectiveNames, containingFile) {
var _a2;
if (structureIsReused === 0 /* Not */) {
return resolveTypeReferenceDirectiveNamesWorker(
typeDirectiveNames,
containingFile,
/*reusedNames*/
void 0
);
}
const oldSourceFile = !isString(containingFile) ? oldProgram && oldProgram.getSourceFile(containingFile.fileName) : void 0;
if (!isString(containingFile)) {
if (oldSourceFile !== containingFile && containingFile.resolvedTypeReferenceDirectiveNames) {
const result2 = [];
for (const typeDirectiveName of typeDirectiveNames) {
const resolvedTypeReferenceDirective = containingFile.resolvedTypeReferenceDirectiveNames.get(getTypeReferenceResolutionName(typeDirectiveName), getModeForFileReference(typeDirectiveName, containingFile.impliedNodeFormat));
result2.push(resolvedTypeReferenceDirective);
}
return result2;
}
}
let unknownTypeReferenceDirectiveNames;
let result;
let reusedNames;
const containingSourceFile = !isString(containingFile) ? containingFile : void 0;
const canReuseResolutions = !isString(containingFile) ? containingFile === oldSourceFile && !hasInvalidatedResolutions(oldSourceFile.path) : !hasInvalidatedResolutions(toPath3(containingFile));
for (let i = 0; i < typeDirectiveNames.length; i++) {
const entry = typeDirectiveNames[i];
if (canReuseResolutions) {
const typeDirectiveName = getTypeReferenceResolutionName(entry);
const mode = getModeForFileReference(entry, containingSourceFile == null ? void 0 : containingSourceFile.impliedNodeFormat);
const oldResolution = (_a2 = !isString(containingFile) ? oldSourceFile == null ? void 0 : oldSourceFile.resolvedTypeReferenceDirectiveNames : oldProgram == null ? void 0 : oldProgram.getAutomaticTypeDirectiveResolutions()) == null ? void 0 : _a2.get(typeDirectiveName, mode);
if (oldResolution == null ? void 0 : oldResolution.resolvedTypeReferenceDirective) {
if (isTraceEnabled(options, host)) {
trace(
host,
oldResolution.resolvedTypeReferenceDirective.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,
typeDirectiveName,
!isString(containingFile) ? getNormalizedAbsolutePath(containingFile.originalFileName, currentDirectory) : containingFile,
oldResolution.resolvedTypeReferenceDirective.resolvedFileName,
oldResolution.resolvedTypeReferenceDirective.packageId && packageIdToString(oldResolution.resolvedTypeReferenceDirective.packageId)
);
}
(result ?? (result = new Array(typeDirectiveNames.length)))[i] = oldResolution;
(reusedNames ?? (reusedNames = [])).push(entry);
continue;
}
}
(unknownTypeReferenceDirectiveNames ?? (unknownTypeReferenceDirectiveNames = [])).push(entry);
}
if (!unknownTypeReferenceDirectiveNames)
return result || emptyArray;
const resolutions = resolveTypeReferenceDirectiveNamesWorker(
unknownTypeReferenceDirectiveNames,
containingFile,
reusedNames
);
if (!result) {
Debug.assert(resolutions.length === typeDirectiveNames.length);
return resolutions;
}
let j = 0;
for (let i = 0; i < result.length; i++) {
if (!result[i]) {
result[i] = resolutions[j];
j++;
}
}
Debug.assert(j === resolutions.length);
return result;
}
function canReuseProjectReferences() {
return !forEachProjectReference(
oldProgram.getProjectReferences(),
oldProgram.getResolvedProjectReferences(),
(oldResolvedRef, parent2, index) => {
const newRef = (parent2 ? parent2.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, parent2) => {
const newReferences = parent2 ? getResolvedProjectReferenceByPath(parent2.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 (oldProgram.getMissingFilePaths().some((missingFilePath) => host.fileExists(missingFilePath))) {
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 || sourceFileOptions.impliedNodeFormat !== oldSourceFile.impliedNodeFormat
) : host.getSourceFile(
oldSourceFile.fileName,
sourceFileOptions,
/*onError*/
void 0,
shouldCreateNewSourceFile || sourceFileOptions.impliedNodeFormat !== oldSourceFile.impliedNodeFormat
);
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 & 6291456 /* PermanentlySetIncrementalFlags */) !== (newSourceFile.flags & 6291456 /* PermanentlySetIncrementalFlags */)) {
structureIsReused = 1 /* SafeModules */;
} else if (!arrayIsEqualTo(oldSourceFile.typeReferenceDirectives, newSourceFile.typeReferenceDirectives, fileReferenceIsEqualTo)) {
structureIsReused = 1 /* SafeModules */;
}
}
modifiedSourceFiles.push({ oldFile: oldSourceFile, newFile: newSourceFile });
} else if (hasInvalidatedResolutions(oldSourceFile.path)) {
structureIsReused = 1 /* SafeModules */;
modifiedSourceFiles.push({ oldFile: oldSourceFile, newFile: newSourceFile });
}
newSourceFiles.push(newSourceFile);
}
if (structureIsReused !== 2 /* Completely */) {
return structureIsReused;
}
const modifiedFiles = modifiedSourceFiles.map((f) => f.oldFile);
for (const oldFile of oldSourceFiles) {
if (!contains(modifiedFiles, oldFile)) {
for (const moduleName of oldFile.ambientModuleNames) {
ambientModuleNameToUnmodifiedFileName.set(moduleName, oldFile.fileName);
}
}
}
for (const { oldFile: oldSourceFile, newFile: newSourceFile } of modifiedSourceFiles) {
const moduleNames = getModuleNames(newSourceFile);
const resolutions = resolveModuleNamesReusingOldState(moduleNames, newSourceFile);
const resolutionsChanged = hasChangesInResolutions(moduleNames, newSourceFile, resolutions, oldSourceFile.resolvedModules, moduleResolutionIsEqualTo, moduleResolutionNameAndModeGetter);
if (resolutionsChanged) {
structureIsReused = 1 /* SafeModules */;
newSourceFile.resolvedModules = zipToModeAwareCache(newSourceFile, moduleNames, resolutions, moduleResolutionNameAndModeGetter);
} else {
newSourceFile.resolvedModules = oldSourceFile.resolvedModules;
}
const typesReferenceDirectives = newSourceFile.typeReferenceDirectives;
const typeReferenceResolutions = resolveTypeReferenceDirectiveNamesReusingOldState(typesReferenceDirectives, newSourceFile);
const typeReferenceResolutionsChanged = hasChangesInResolutions(typesReferenceDirectives, newSourceFile, typeReferenceResolutions, oldSourceFile.resolvedTypeReferenceDirectiveNames, typeDirectiveIsEqualTo, typeReferenceResolutionNameAndModeGetter);
if (typeReferenceResolutionsChanged) {
structureIsReused = 1 /* SafeModules */;
newSourceFile.resolvedTypeReferenceDirectiveNames = zipToModeAwareCache(newSourceFile, typesReferenceDirectives, typeReferenceResolutions, typeReferenceResolutionNameAndModeGetter);
} else {
newSourceFile.resolvedTypeReferenceDirectiveNames = oldSourceFile.resolvedTypeReferenceDirectiveNames;
}
}
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 */;
}
missingFilePaths = 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));
});
files = newSourceFiles;
fileReasons = oldProgram.getFileIncludeReasons();
fileProcessingDiagnostics = oldProgram.getFileProcessingDiagnostics();
resolvedTypeReferenceDirectives = oldProgram.getResolvedTypeReferenceDirectives();
automaticTypeDirectiveNames = oldProgram.getAutomaticTypeDirectiveNames();
automaticTypeDirectiveResolutions = oldProgram.getAutomaticTypeDirectiveResolutions();
sourceFileToPackageName = oldProgram.sourceFileToPackageName;
redirectTargetsMap = oldProgram.redirectTargetsMap;
usesUriStyleNodeCoreModules = oldProgram.usesUriStyleNodeCoreModules;
resolvedLibReferences = oldProgram.resolvedLibReferences;
packageMap = oldProgram.getCurrentPackagesMap();
return 2 /* Completely */;
}
function getEmitHost(writeFileCallback) {
return {
getPrependNodes,
getCanonicalFileName,
getCommonSourceDirectory: program.getCommonSourceDirectory,
getCompilerOptions: program.getCompilerOptions,
getCurrentDirectory: () => currentDirectory,
getSourceFile: program.getSourceFile,
getSourceFileByPath: program.getSourceFileByPath,
getSourceFiles: program.getSourceFiles,
getLibFileFromReference: program.getLibFileFromReference,
isSourceFileFromExternalLibrary,
getResolvedProjectReferenceToRedirect,
getProjectReferenceRedirect,
isSourceOfProjectReferenceRedirect,
getSymlinkCache,
writeFile: writeFileCallback || writeFile2,
isEmitBlocked,
readFile: (f) => host.readFile(f),
fileExists: (f) => {
const path = toPath3(f);
if (getSourceFileByPath(path))
return true;
if (contains(missingFilePaths, path))
return false;
return host.fileExists(f);
},
useCaseSensitiveFileNames: () => host.useCaseSensitiveFileNames(),
getBuildInfo: (bundle) => {
var _a2;
return (_a2 = program.getBuildInfo) == null ? void 0 : _a2.call(program, bundle);
},
getSourceFileFromReference: (file, ref) => program.getSourceFileFromReference(file, ref),
redirectTargetsMap,
getFileIncludeReasons: program.getFileIncludeReasons,
createHash: maybeBind(host, host.createHash)
};
}
function writeFile2(fileName, text, writeByteOrderMark, onError, sourceFiles, data) {
host.writeFile(fileName, text, writeByteOrderMark, onError, sourceFiles, data);
}
function emitBuildInfo(writeFileCallback) {
var _a2, _b2;
Debug.assert(!outFile(options));
(_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 getPrependNodes() {
return createPrependNodes(
projectReferences,
(_ref, index) => {
var _a2;
return (_a2 = resolvedProjectReferences[index]) == null ? void 0 : _a2.commandLine;
},
(fileName) => {
const path = toPath3(fileName);
const sourceFile = getSourceFileByPath(path);
return sourceFile ? sourceFile.text : filesByName.has(path) ? void 0 : host.readFile(path);
},
host
);
}
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) => equalityComparer(file.fileName, resolvedLibReferences.get(libFileName).actual));
}
}
function getTypeChecker() {
return typeChecker || (typeChecker = createTypeChecker(program));
}
function emit(sourceFile, writeFileCallback, cancellationToken, emitOnly, transformers, forceDtsEmit) {
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));
(_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) {
if (!forceDtsEmit) {
const result = handleNoEmitOptions(program2, sourceFile, writeFileCallback, cancellationToken);
if (result)
return result;
}
const emitResolver = getTypeChecker().getEmitResolver(outFile(options) ? void 0 : sourceFile, cancellationToken);
mark("beforeEmit");
const emitResult = emitFiles(
emitResolver,
getEmitHost(writeFileCallback),
sourceFile,
getTransformers(options, customTransformers, emitOnly),
emitOnly,
/*onlyBuildInfo*/
false,
forceDtsEmit
);
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, getDiagnostics2, cancellationToken) {
if (sourceFile) {
return sortAndDeduplicateDiagnostics(getDiagnostics2(sourceFile, cancellationToken));
}
return sortAndDeduplicateDiagnostics(flatMap(program.getSourceFiles(), (sourceFile2) => {
if (cancellationToken) {
cancellationToken.throwIfCancellationRequested();
}
return getDiagnostics2(sourceFile2, cancellationToken);
}));
}
function getSyntacticDiagnostics(sourceFile, cancellationToken) {
return getDiagnosticsHelper(sourceFile, getSyntacticDiagnosticsForFile, cancellationToken);
}
function getSemanticDiagnostics(sourceFile, cancellationToken) {
return getDiagnosticsHelper(sourceFile, getSemanticDiagnosticsForFile, cancellationToken);
}
function getCachedSemanticDiagnostics(sourceFile) {
var _a2;
return sourceFile ? (_a2 = cachedBindAndCheckDiagnosticsForFile.perFile) == null ? void 0 : _a2.get(sourceFile.path) : cachedBindAndCheckDiagnosticsForFile.allDiagnostics;
}
function getBindAndCheckDiagnostics(sourceFile, cancellationToken) {
return getBindAndCheckDiagnosticsForFile(sourceFile, cancellationToken);
}
function getProgramDiagnostics(sourceFile) {
var _a2;
if (skipTypeChecking(sourceFile, options, program)) {
return emptyArray;
}
const programDiagnosticsInFile = programDiagnostics.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) {
const options2 = program.getCompilerOptions();
if (!sourceFile || outFile(options2)) {
return getDeclarationDiagnosticsWorker(sourceFile, cancellationToken);
} else {
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) {
return concatenate(
filterSemanticDiagnostics(getBindAndCheckDiagnosticsForFile(sourceFile, cancellationToken), options),
getProgramDiagnostics(sourceFile)
);
}
function getBindAndCheckDiagnosticsForFile(sourceFile, cancellationToken) {
return getAndCacheDiagnostics(sourceFile, cancellationToken, cachedBindAndCheckDiagnosticsForFile, getBindAndCheckDiagnosticsForFileNoCache);
}
function getBindAndCheckDiagnosticsForFileNoCache(sourceFile, cancellationToken) {
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 isCheckJs = isJs && isCheckJsEnabledForFile(sourceFile, options);
const isPlainJs = isPlainJsFile(sourceFile, options.checkJs);
const isTsNoCheck = !!sourceFile.checkJsDirective && sourceFile.checkJsDirective.enabled === false;
const includeBindAndCheckDiagnostics = !isTsNoCheck && (sourceFile.scriptKind === 3 /* TS */ || sourceFile.scriptKind === 4 /* TSX */ || sourceFile.scriptKind === 5 /* External */ || isPlainJs || isCheckJs || sourceFile.scriptKind === 7 /* Deferred */);
let bindDiagnostics = includeBindAndCheckDiagnostics ? sourceFile.bindDiagnostics : emptyArray;
let checkDiagnostics = includeBindAndCheckDiagnostics ? typeChecker2.getDiagnostics(sourceFile, cancellationToken) : emptyArray;
if (isPlainJs) {
bindDiagnostics = filter(bindDiagnostics, (d) => plainJSErrors.has(d.code));
checkDiagnostics = filter(checkDiagnostics, (d) => plainJSErrors.has(d.code));
}
return getMergedBindAndCheckDiagnostics(sourceFile, includeBindAndCheckDiagnostics && !isPlainJs, bindDiagnostics, checkDiagnostics, isCheckJs ? sourceFile.jsDocDiagnostics : void 0);
});
}
function getMergedBindAndCheckDiagnostics(sourceFile, includeBindAndCheckDiagnostics, ...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);
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: start2 } = diagnostic;
if (!file) {
return -1;
}
const lineStarts = getLineStarts(file);
let line = computeLineAndCharacterOfPosition(lineStarts, start2).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, parent2) {
switch (parent2.kind) {
case 168 /* Parameter */:
case 171 /* PropertyDeclaration */:
case 173 /* MethodDeclaration */:
if (parent2.questionToken === node) {
diagnostics.push(createDiagnosticForNode2(node, Diagnostics.The_0_modifier_can_only_be_used_in_TypeScript_files, "?"));
return "skip";
}
case 172 /* MethodSignature */:
case 175 /* Constructor */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
case 217 /* FunctionExpression */:
case 261 /* FunctionDeclaration */:
case 218 /* ArrowFunction */:
case 259 /* VariableDeclaration */:
if (parent2.type === node) {
diagnostics.push(createDiagnosticForNode2(node, Diagnostics.Type_annotations_can_only_be_used_in_TypeScript_files));
return "skip";
}
}
switch (node.kind) {
case 272 /* ImportClause */:
if (node.isTypeOnly) {
diagnostics.push(createDiagnosticForNode2(parent2, Diagnostics._0_declarations_can_only_be_used_in_TypeScript_files, "import type"));
return "skip";
}
break;
case 277 /* ExportDeclaration */:
if (node.isTypeOnly) {
diagnostics.push(createDiagnosticForNode2(node, Diagnostics._0_declarations_can_only_be_used_in_TypeScript_files, "export type"));
return "skip";
}
break;
case 275 /* ImportSpecifier */:
case 280 /* 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 270 /* ImportEqualsDeclaration */:
diagnostics.push(createDiagnosticForNode2(node, Diagnostics.import_can_only_be_used_in_TypeScript_files));
return "skip";
case 276 /* ExportAssignment */:
if (node.isExportEquals) {
diagnostics.push(createDiagnosticForNode2(node, Diagnostics.export_can_only_be_used_in_TypeScript_files));
return "skip";
}
break;
case 297 /* 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 263 /* 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 266 /* ModuleDeclaration */:
const moduleKeyword = node.flags & 16 /* 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 264 /* TypeAliasDeclaration */:
diagnostics.push(createDiagnosticForNode2(node, Diagnostics.Type_aliases_can_only_be_used_in_TypeScript_files));
return "skip";
case 265 /* 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 234 /* NonNullExpression */:
diagnostics.push(createDiagnosticForNode2(node, Diagnostics.Non_null_assertions_can_only_be_used_in_TypeScript_files));
return "skip";
case 233 /* AsExpression */:
diagnostics.push(createDiagnosticForNode2(node.type, Diagnostics.Type_assertion_expressions_can_only_be_used_in_TypeScript_files));
return "skip";
case 237 /* SatisfiesExpression */:
diagnostics.push(createDiagnosticForNode2(node.type, Diagnostics.Type_satisfaction_expressions_can_only_be_used_in_TypeScript_files));
return "skip";
case 215 /* TypeAssertionExpression */:
Debug.fail();
}
}
function walkArray(nodes, parent2) {
if (canHaveIllegalDecorators(parent2)) {
const decorator = find(parent2.modifiers, isDecorator);
if (decorator) {
diagnostics.push(createDiagnosticForNode2(decorator, Diagnostics.Decorators_are_not_valid_here));
}
} else if (canHaveDecorators(parent2) && parent2.modifiers) {
const decoratorIndex = findIndex(parent2.modifiers, isDecorator);
if (decoratorIndex >= 0) {
if (isParameter(parent2) && !options.experimentalDecorators) {
diagnostics.push(createDiagnosticForNode2(parent2.modifiers[decoratorIndex], Diagnostics.Decorators_are_not_valid_here));
} else if (isClassDeclaration(parent2)) {
const exportIndex = findIndex(parent2.modifiers, isExportModifier);
if (exportIndex >= 0) {
const defaultIndex = findIndex(parent2.modifiers, isDefaultModifier);
if (decoratorIndex > exportIndex && defaultIndex >= 0 && decoratorIndex < defaultIndex) {
diagnostics.push(createDiagnosticForNode2(parent2.modifiers[decoratorIndex], Diagnostics.Decorators_are_not_valid_here));
} else if (exportIndex >= 0 && decoratorIndex < exportIndex) {
const trailingDecoratorIndex = findIndex(parent2.modifiers, isDecorator, exportIndex);
if (trailingDecoratorIndex >= 0) {
diagnostics.push(addRelatedInfo(
createDiagnosticForNode2(parent2.modifiers[trailingDecoratorIndex], Diagnostics.Decorators_may_not_appear_after_export_or_export_default_if_they_also_appear_before_export),
createDiagnosticForNode2(parent2.modifiers[decoratorIndex], Diagnostics.Decorator_used_before_export_here)
));
}
}
}
}
}
}
switch (parent2.kind) {
case 262 /* ClassDeclaration */:
case 230 /* ClassExpression */:
case 173 /* MethodDeclaration */:
case 175 /* Constructor */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
case 217 /* FunctionExpression */:
case 261 /* FunctionDeclaration */:
case 218 /* ArrowFunction */:
if (nodes === parent2.typeParameters) {
diagnostics.push(createDiagnosticForNodeArray2(nodes, Diagnostics.Type_parameter_declarations_can_only_be_used_in_TypeScript_files));
return "skip";
}
case 242 /* VariableStatement */:
if (nodes === parent2.modifiers) {
checkModifiers(parent2.modifiers, parent2.kind === 242 /* VariableStatement */);
return "skip";
}
break;
case 171 /* PropertyDeclaration */:
if (nodes === parent2.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 168 /* Parameter */:
if (nodes === parent2.modifiers && some(nodes, isModifier)) {
diagnostics.push(createDiagnosticForNodeArray2(nodes, Diagnostics.Parameter_modifiers_can_only_be_used_in_TypeScript_files));
return "skip";
}
break;
case 212 /* CallExpression */:
case 213 /* NewExpression */:
case 232 /* ExpressionWithTypeArguments */:
case 284 /* JsxSelfClosingElement */:
case 285 /* JsxOpeningElement */:
case 214 /* TaggedTemplateExpression */:
if (nodes === parent2.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;
}
case 125 /* PublicKeyword */:
case 123 /* PrivateKeyword */:
case 124 /* ProtectedKeyword */:
case 148 /* ReadonlyKeyword */:
case 138 /* DeclareKeyword */:
case 128 /* AbstractKeyword */:
case 163 /* 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;
case 126 /* StaticKeyword */:
case 95 /* ExportKeyword */:
case 90 /* DefaultKeyword */:
case 129 /* AccessorKeyword */:
}
}
}
function createDiagnosticForNodeArray2(nodes, message, ...args) {
const start2 = nodes.pos;
return createFileDiagnostic(sourceFile, start2, nodes.end - start2, message, ...args);
}
function createDiagnosticForNode2(node, message, ...args) {
return createDiagnosticForNodeInSourceFile(sourceFile, node, message, ...args);
}
});
}
function getDeclarationDiagnosticsWorker(sourceFile, cancellationToken) {
return getAndCacheDiagnostics(sourceFile, cancellationToken, cachedDeclarationDiagnosticsForFile, getDeclarationDiagnosticsForFileNoCache);
}
function getDeclarationDiagnosticsForFileNoCache(sourceFile, cancellationToken) {
return runWithCancellationToken(() => {
const resolver = getTypeChecker().getEmitResolver(sourceFile, cancellationToken);
return getDeclarationDiagnostics(getEmitHost(noop), resolver, sourceFile) || emptyArray;
});
}
function getAndCacheDiagnostics(sourceFile, cancellationToken, cache, getDiagnostics2) {
var _a2;
const cachedResult = sourceFile ? (_a2 = cache.perFile) == null ? void 0 : _a2.get(sourceFile.path) : cache.allDiagnostics;
if (cachedResult) {
return cachedResult;
}
const result = getDiagnostics2(sourceFile, cancellationToken);
if (sourceFile) {
(cache.perFile || (cache.perFile = /* @__PURE__ */ new Map())).set(sourceFile.path, result);
} else {
cache.allDiagnostics = result;
}
return result;
}
function getDeclarationDiagnosticsForFile(sourceFile, cancellationToken) {
return sourceFile.isDeclarationFile ? [] : getDeclarationDiagnosticsWorker(sourceFile, cancellationToken);
}
function getOptionsDiagnostics() {
return sortAndDeduplicateDiagnostics(concatenate(
programDiagnostics.getGlobalDiagnostics(),
getOptionsDiagnosticsOfConfigFile()
));
}
function getOptionsDiagnosticsOfConfigFile() {
if (!options.configFile)
return emptyArray;
let diagnostics = programDiagnostics.getDiagnostics(options.configFile.fileName);
forEachResolvedProjectReference2((resolvedRef) => {
diagnostics = concatenate(diagnostics, programDiagnostics.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,
/*assertClause*/
void 0
);
addInternalEmitFlags(importDecl, 2 /* NeverApplyImportHelper */);
setParent(externalHelpersModuleReference, importDecl);
setParent(importDecl, file);
externalHelpersModuleReference.flags &= ~8 /* Synthesized */;
importDecl.flags &= ~8 /* 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 ((getIsolatedModules(options) || isExternalModuleFile) && !file.isDeclarationFile) {
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
);
}
const shouldProcessRequires = isJavaScriptFile && shouldResolveJsRequire(options);
if (file.flags & 2097152 /* PossiblyContainsDynamicImport */ || shouldProcessRequires) {
collectDynamicImportOrRequireCalls(file);
}
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) {
usesUriStyleNodeCoreModules = startsWith(moduleNameExpr.text, "node:");
}
}
} else if (isModuleDeclaration(node)) {
if (isAmbientModule(node) && (inAmbientModule || hasSyntacticModifier(node, 2 /* 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 collectDynamicImportOrRequireCalls(file2) {
const r = /import|require/g;
while (r.exec(file2.text) !== null) {
const node = getNodeAtPosition(file2, r.lastIndex);
if (shouldProcessRequires && isRequireCall(
node,
/*requireStringLiteralLikeArgument*/
true
)) {
setParentRecursive(
node,
/*incremental*/
false
);
imports = append(imports, node.arguments[0]);
} else if (isImportCall(node) && node.arguments.length >= 1 && isStringLiteralLike(node.arguments[0])) {
setParentRecursive(
node,
/*incremental*/
false
);
imports = append(imports, node.arguments[0]);
} else if (isLiteralImportTypeNode(node)) {
setParentRecursive(
node,
/*incremental*/
false
);
imports = append(imports, node.argument.literal);
}
}
}
function getNodeAtPosition(sourceFile, position) {
let current = sourceFile;
const getContainingChild = (child) => {
if (child.pos <= position && (position < child.end || position === child.end && child.kind === 1 /* EndOfFileToken */)) {
return child;
}
};
while (true) {
const child = isJavaScriptFile && hasJSDocNodes(current) && forEach(current.jsDoc, getContainingChild) || forEachChild(current, getContainingChild);
if (!child) {
return current;
}
current = child;
}
}
}
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 = getProjectReferenceRedirect(fileName);
if (redirect) {
fail(Diagnostics.Output_file_0_has_not_been_built_from_source_file_1, redirect, 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(fileReasons.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 } : { languageVersion, impliedNodeFormat: result, setExternalModuleIndicator: setExternalModuleIndicator2 };
}
function findSourceFileWorker(fileName, isDefaultLib, ignoreNoDefaultLib, reason, packageId) {
var _a2, _b2;
const path = toPath3(fileName);
if (useSourceOfProjectReferenceRedirect) {
let source = getSourceOfProjectReferenceRedirect(path);
if (!source && host.realpath && options.preserveSymlinks && isDeclarationFileName(fileName) && stringContains(fileName, nodeModulesPathPart)) {
const realPath2 = toPath3(host.realpath(fileName));
if (realPath2 !== path)
source = getSourceOfProjectReferenceRedirect(realPath2);
}
if (source) {
const file2 = isString(source) ? findSourceFile(source, isDefaultLib, ignoreNoDefaultLib, reason, packageId) : void 0;
if (file2)
addFileToFilesByName(
file2,
path,
/*redirectedPath*/
void 0
);
return file2;
}
}
const originalFileName = fileName;
if (filesByName.has(path)) {
const file2 = filesByName.get(path);
addFileIncludeReason(file2 || void 0, reason);
if (file2 && !(options.forceConsistentCasingInFileNames === false)) {
const checkedName = file2.fileName;
const isRedirect = toPath3(checkedName) !== toPath3(fileName);
if (isRedirect) {
fileName = getProjectReferenceRedirect(fileName) || 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 (isReferencedFile(reason) && !useSourceOfProjectReferenceRedirect) {
const redirectProject = getProjectReferenceRedirectProject(fileName);
if (redirectProject) {
if (outFile(redirectProject.commandLine.options)) {
return void 0;
}
const redirect = getProjectReferenceOutputName(redirectProject, fileName);
fileName = redirect;
redirectedPath = toPath3(redirect);
}
}
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 || ((_a2 = oldProgram == null ? void 0 : oldProgram.getSourceFileByPath(toPath3(fileName))) == null ? void 0 : _a2.impliedNodeFormat) !== sourceFileOptions.impliedNodeFormat
);
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, redirectedPath);
addFileIncludeReason(dupFile, reason);
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, 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);
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);
}
}
return file;
}
function addFileIncludeReason(file, reason) {
if (file)
fileReasons.add(file.path, reason);
}
function addFileToFilesByName(file, path, redirectedPath) {
if (redirectedPath) {
filesByName.set(redirectedPath, file);
filesByName.set(path, file || false);
} else {
filesByName.set(path, file);
}
}
function getProjectReferenceRedirect(fileName) {
const referencedProject = getProjectReferenceRedirectProject(fileName);
return referencedProject && getProjectReferenceOutputName(referencedProject, fileName);
}
function getProjectReferenceRedirectProject(fileName) {
if (!resolvedProjectReferences || !resolvedProjectReferences.length || isDeclarationFileName(fileName) || fileExtensionIs(fileName, ".json" /* Json */)) {
return void 0;
}
return getResolvedProjectReferenceToRedirect(fileName);
}
function getProjectReferenceOutputName(referencedProject, fileName) {
const out = outFile(referencedProject.commandLine.options);
return out ? changeExtension(out, ".d.ts" /* Dts */) : getOutputDeclarationFileName(fileName, referencedProject.commandLine, !host.useCaseSensitiveFileNames());
}
function getResolvedProjectReferenceToRedirect(fileName) {
if (mapFromFileToProjectReferenceRedirects === void 0) {
mapFromFileToProjectReferenceRedirects = /* @__PURE__ */ new Map();
forEachResolvedProjectReference2((referencedProject) => {
if (toPath3(options.configFilePath) !== referencedProject.sourceFile.path) {
referencedProject.commandLine.fileNames.forEach((f) => mapFromFileToProjectReferenceRedirects.set(toPath3(f), referencedProject.sourceFile.path));
}
});
}
const referencedProjectPath = mapFromFileToProjectReferenceRedirects.get(toPath3(fileName));
return referencedProjectPath && getResolvedProjectReferenceByPath(referencedProjectPath);
}
function forEachResolvedProjectReference2(cb) {
return forEachResolvedProjectReference(resolvedProjectReferences, cb);
}
function getSourceOfProjectReferenceRedirect(path) {
if (!isDeclarationFileName(path))
return void 0;
if (mapFromToProjectReferenceRedirectSource === void 0) {
mapFromToProjectReferenceRedirectSource = /* @__PURE__ */ new Map();
forEachResolvedProjectReference2((resolvedRef) => {
const out = outFile(resolvedRef.commandLine.options);
if (out) {
const outputDts = changeExtension(out, ".d.ts" /* Dts */);
mapFromToProjectReferenceRedirectSource.set(toPath3(outputDts), true);
} else {
const getCommonSourceDirectory3 = memoize(() => getCommonSourceDirectoryOfConfig(resolvedRef.commandLine, !host.useCaseSensitiveFileNames()));
forEach(resolvedRef.commandLine.fileNames, (fileName) => {
if (!isDeclarationFileName(fileName) && !fileExtensionIs(fileName, ".json" /* Json */)) {
const outputDts = getOutputDeclarationFileName(fileName, resolvedRef.commandLine, !host.useCaseSensitiveFileNames(), getCommonSourceDirectory3);
mapFromToProjectReferenceRedirectSource.set(toPath3(outputDts), fileName);
}
});
}
});
}
return mapFromToProjectReferenceRedirectSource.get(path);
}
function isSourceOfProjectReferenceRedirect(fileName) {
return useSourceOfProjectReferenceRedirect && !!getResolvedProjectReferenceToRedirect(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) {
file.resolvedTypeReferenceDirectiveNames = void 0;
return;
}
const resolutions = resolveTypeReferenceDirectiveNamesReusingOldState(typeDirectives, file);
for (let index = 0; index < typeDirectives.length; index++) {
const ref = file.typeReferenceDirectives[index];
const resolvedTypeReferenceDirective = resolutions[index];
const fileName = toFileNameLowerCase(ref.fileName);
setResolvedTypeReferenceDirective(file, fileName, resolvedTypeReferenceDirective, getModeForFileReference(ref, file.impliedNodeFormat));
const mode = ref.resolutionMode || file.impliedNodeFormat;
if (mode && getEmitModuleResolutionKind(options) !== 3 /* Node16 */ && getEmitModuleResolutionKind(options) !== 99 /* NodeNext */) {
(fileProcessingDiagnostics ?? (fileProcessingDiagnostics = [])).push({
kind: 2 /* ResolutionDiagnostics */,
diagnostics: [
createDiagnosticForRange(file, ref, Diagnostics.resolution_mode_assertions_are_only_supported_when_moduleResolution_is_node16_or_nodenext)
]
});
}
processTypeReferenceDirective(fileName, mode, resolvedTypeReferenceDirective, { kind: 5 /* TypeReferenceDirective */, file: file.path, index });
}
}
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) {
var _a2;
addResolutionDiagnostics(resolution);
const previousResolution = (_a2 = resolvedTypeReferenceDirectives.get(typeReferenceDirective, mode)) == null ? void 0 : _a2.resolvedTypeReferenceDirective;
if (previousResolution && previousResolution.primary) {
return;
}
let saveResolution = true;
const { resolvedTypeReferenceDirective } = resolution;
if (resolvedTypeReferenceDirective) {
if (resolvedTypeReferenceDirective.isExternalLibraryImport)
currentNodeModulesDepth++;
if (resolvedTypeReferenceDirective.primary) {
processSourceFile(
resolvedTypeReferenceDirective.resolvedFileName,
/*isDefaultLib*/
false,
/*ignoreNoDefaultLib*/
false,
resolvedTypeReferenceDirective.packageId,
reason
);
} else {
if (previousResolution) {
if (resolvedTypeReferenceDirective.resolvedFileName !== previousResolution.resolvedFileName) {
const otherFileText = host.readFile(resolvedTypeReferenceDirective.resolvedFileName);
const existingFile = getSourceFile(previousResolution.resolvedFileName);
if (otherFileText !== existingFile.text) {
addFilePreprocessingFileExplainingDiagnostic(
existingFile,
reason,
Diagnostics.Conflicting_definitions_for_0_found_at_1_and_2_Consider_installing_a_specific_version_of_this_library_to_resolve_the_conflict,
[typeReferenceDirective, resolvedTypeReferenceDirective.resolvedFileName, previousResolution.resolvedFileName]
);
}
}
saveResolution = false;
} else {
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]
);
}
if (saveResolution) {
resolvedTypeReferenceDirectives.set(typeReferenceDirective, mode, resolution);
}
}
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 (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 { libName, libFileName } = getLibFileNameFromLibReference(libReference);
if (libFileName) {
processRootFile(
pathForLibFile(libFileName),
/*isDefaultLib*/
true,
/*ignoreNoDefaultLib*/
true,
{ kind: 7 /* LibReferenceDirective */, file: file.path, index }
);
} else {
const unqualifiedLibName = removeSuffix(removePrefix(libName, "lib."), ".d.ts");
const suggestion = getSpellingSuggestion(unqualifiedLibName, libs, identity);
const diagnostic = suggestion ? Diagnostics.Cannot_find_lib_definition_for_0_Did_you_mean_1 : Diagnostics.Cannot_find_lib_definition_for_0;
const args = suggestion ? [libName, suggestion] : [libName];
(fileProcessingDiagnostics || (fileProcessingDiagnostics = [])).push({
kind: 0 /* FilePreprocessingReferencedDiagnostic */,
reason: { kind: 7 /* LibReferenceDirective */, file: file.path, index },
diagnostic,
args
});
}
});
}
function getCanonicalFileName(fileName) {
return host.getCanonicalFileName(fileName);
}
function processImportedModules(file) {
var _a2;
collectExternalModuleReferences(file);
if (file.imports.length || file.moduleAugmentations.length) {
const moduleNames = getModuleNames(file);
const resolutions = resolveModuleNamesReusingOldState(moduleNames, file);
Debug.assert(resolutions.length === moduleNames.length);
const optionsForFile = (useSourceOfProjectReferenceRedirect ? (_a2 = getRedirectReferenceForResolution(file)) == null ? void 0 : _a2.commandLine.options : void 0) || options;
for (let index = 0; index < moduleNames.length; index++) {
const resolution = resolutions[index].resolvedModule;
const moduleName = moduleNames[index].text;
const mode = getModeForUsageLocation(file, moduleNames[index]);
setResolvedModule(file, moduleName, resolutions[index], mode);
addResolutionDiagnosticsFromResolutionOrCache(file, moduleName, resolutions[index], mode);
if (!resolution) {
continue;
}
const isFromNodeModulesSearch = resolution.isExternalLibraryImport;
const isJsFile = !resolutionExtensionIsTSOrJson(resolution.extension);
const isJsFileFromNodeModules = isFromNodeModulesSearch && isJsFile;
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 & 8388608 /* 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--;
}
}
} else {
file.resolvedModules = void 0;
}
}
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) {
addProgramDiagnosticExplainingFile(
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,
/*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,
/*redirectedPath*/
void 0
);
} else {
const basePath = getNormalizedAbsolutePath(getDirectoryPath(refPath), currentDirectory);
sourceFile = host.getSourceFile(refPath, 100 /* JSON */);
addFileToFilesByName(
sourceFile,
sourceFilePath,
/*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 (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.out) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_with_option_1, "out", options.verbatimModuleSyntax ? "verbatimModuleSyntax" : "isolatedModules");
}
if (options.outFile) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_with_option_1, "outFile", options.verbatimModuleSyntax ? "verbatimModuleSyntax" : "isolatedModules");
}
}
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 = outFile(options);
if (options.tsBuildInfoFile) {
if (!isIncrementalCompilation(options)) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1_or_option_2, "tsBuildInfoFile", "incremental", "composite");
}
} else if (options.incremental && !outputFile && !options.configFilePath) {
programDiagnostics.add(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)) {
addProgramDiagnosticExplainingFile(
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.out && options.outFile) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_with_option_1, "out", "outFile");
}
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", options.out ? "out" : "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");
}
if (options.noImplicitUseStrict && getStrictOptionValue(options, "alwaysStrict")) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_with_option_1, "noImplicitUseStrict", "alwaysStrict");
}
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.add(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, options.out ? "out" : "outFile", "module");
} else if (options.module === void 0 && firstNonAmbientExternalModuleSourceFile) {
const span = getErrorSpanForNode(firstNonAmbientExternalModuleSourceFile, typeof firstNonAmbientExternalModuleSourceFile.externalModuleIndicator === "boolean" ? firstNonAmbientExternalModuleSourceFile : firstNonAmbientExternalModuleSourceFile.externalModuleIndicator);
programDiagnostics.add(createFileDiagnostic(firstNonAmbientExternalModuleSourceFile, span.start, span.length, Diagnostics.Cannot_compile_modules_using_option_0_unless_the_module_flag_is_amd_or_system, options.out ? "out" : "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_can_only_be_specified_when_module_code_generation_is_commonjs_amd_es2015_or_esNext, "resolveJsonModule", "module");
}
}
if (options.outDir || // there is --outDir specified
options.rootDir || // there is --rootDir specified
options.sourceRoot || // there is --sourceRoot specified
options.mapRoot) {
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.useDefineForClassFields && languageVersion === 0 /* ES3 */) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_when_option_target_is_ES3, "useDefineForClassFields");
}
if (options.checkJs && !getAllowJSCompilerOption(options)) {
programDiagnostics.add(createCompilerDiagnostic(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.noEmit) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_with_option_1, "emitDeclarationOnly", "noEmit");
}
}
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));
}
}
if (options.preserveValueImports && getEmitModuleKind(options) < 5 /* ES2015 */) {
createDiagnosticForOptionName(Diagnostics.Option_0_can_only_be_used_when_module_is_set_to_es2015_or_later, "preserveValueImports");
}
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.preserveValueImports) {
createRedundantOptionDiagnostic("preserveValueImports", "verbatimModuleSyntax");
}
if (options.importsNotUsedAsValues) {
createRedundantOptionDiagnostic("importsNotUsedAsValues", "verbatimModuleSyntax");
}
}
if (options.allowImportingTsExtensions && !(options.noEmit || options.emitDeclarationOnly)) {
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)) {
createOptionValueDiagnostic("moduleResolution", Diagnostics.Option_0_can_only_be_used_when_module_is_set_to_es2015_or_later, "bundler");
}
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(typeScriptVersion3 || 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 createDiagnosticExplainingFile(file, fileProcessingReason, diagnostic, args) {
var _a2;
let fileIncludeReasons;
let relatedInfo;
let locationReason = isReferencedFile(fileProcessingReason) ? fileProcessingReason : void 0;
if (file)
(_a2 = fileReasons.get(file.path)) == null ? void 0 : _a2.forEach(processReason);
if (fileProcessingReason)
processReason(fileProcessingReason);
if (locationReason && (fileIncludeReasons == null ? void 0 : fileIncludeReasons.length) === 1)
fileIncludeReasons = void 0;
const location = locationReason && getReferencedFileLocation(getSourceFileByPath, locationReason);
const fileIncludeReasonDetails = fileIncludeReasons && chainDiagnosticMessages(fileIncludeReasons, Diagnostics.The_file_is_in_the_program_because_Colon);
const redirectInfo = file && explainIfFileIsRedirectAndImpliedFormat(file);
const chain = chainDiagnosticMessages(redirectInfo ? fileIncludeReasonDetails ? [fileIncludeReasonDetails, ...redirectInfo] : redirectInfo : fileIncludeReasonDetails, diagnostic, ...args || emptyArray);
return location && isReferenceFileLocation(location) ? createFileDiagnosticFromMessageChain(location.file, location.pos, location.end - location.pos, chain, relatedInfo) : createCompilerDiagnosticFromMessageChain(chain, relatedInfo);
function processReason(reason) {
(fileIncludeReasons || (fileIncludeReasons = [])).push(fileIncludeReasonToDiagnostics(program, reason));
if (!locationReason && isReferencedFile(reason)) {
locationReason = reason;
} else if (locationReason !== reason) {
relatedInfo = append(relatedInfo, fileIncludeReasonToRelatedInformation(reason));
}
if (reason === fileProcessingReason)
fileProcessingReason = void 0;
}
}
function addFilePreprocessingFileExplainingDiagnostic(file, fileProcessingReason, diagnostic, args) {
(fileProcessingDiagnostics || (fileProcessingDiagnostics = [])).push({
kind: 1 /* FilePreprocessingFileExplainingDiagnostic */,
file: file && file.path,
fileProcessingReason,
diagnostic,
args
});
}
function addProgramDiagnosticExplainingFile(file, diagnostic, args) {
programDiagnostics.add(createDiagnosticExplainingFile(
file,
/*fileProcessingReason*/
void 0,
diagnostic,
args
));
}
function fileIncludeReasonToRelatedInformation(reason) {
if (isReferencedFile(reason)) {
const referenceLocation = getReferencedFileLocation(getSourceFileByPath, 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;
}
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 referencedResolvedRef = Debug.checkDefined(resolvedProjectReferences == null ? void 0 : resolvedProjectReferences[reason.index]);
const referenceInfo = forEachProjectReference(
projectReferences,
resolvedProjectReferences,
(resolvedRef, parent2, index2) => resolvedRef === referencedResolvedRef ? { sourceFile: (parent2 == null ? void 0 : parent2.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("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("lib", options.lib[reason.index]);
message = Diagnostics.File_is_library_specified_here;
break;
}
const target = forEachEntry(targetOptionDeclaration.type, (value, key) => value === getEmitScriptTarget(options) ? key : void 0);
configFileNode = target ? getOptionsSyntaxByValue("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
);
}
function verifyProjectReferences() {
const buildInfoPath = !options.suppressOutputPathCheck ? getTsBuildInfoEmitOutputFilePath(options) : void 0;
forEachProjectReference(projectReferences, resolvedProjectReferences, (resolvedRef, parent2, index) => {
const ref = (parent2 ? parent2.commandLine.projectReferences : projectReferences)[index];
const parentFile = parent2 && parent2.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 = parent2 ? parent2.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 (ref.prepend) {
const out = outFile(options2);
if (out) {
if (!host.fileExists(out)) {
createDiagnosticForReference(parentFile, index, Diagnostics.Output_file_0_from_project_1_does_not_exist, out, ref.path);
}
} else {
createDiagnosticForReference(parentFile, index, Diagnostics.Cannot_prepend_project_0_because_it_does_not_have_outFile_set, ref.path);
}
}
if (!parent2 && 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.add(createDiagnosticForNodeInSourceFile(options.configFile, initializer.elements[valueIndex], message, ...args));
needCompilerDiagnostic = false;
}
});
}
});
if (needCompilerDiagnostic) {
programDiagnostics.add(createCompilerDiagnostic(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) {
programDiagnostics.add(createCompilerDiagnostic(message, ...args));
}
}
function forEachOptionsSyntaxByName(name, callback) {
return forEachPropertyAssignment(getCompilerOptionsObjectLiteralSyntax(), name, callback);
}
function forEachOptionPathsSyntax(callback) {
return forEachOptionsSyntaxByName("paths", callback);
}
function getOptionsSyntaxByValue(name, value) {
return forEachOptionsSyntaxByName(name, (property) => isStringLiteral(property.initializer) && property.initializer.text === value ? property.initializer : void 0);
}
function getOptionsSyntaxByArrayElementValue(name, value) {
const compilerOptionsObjectLiteralSyntax = getCompilerOptionsObjectLiteralSyntax();
return compilerOptionsObjectLiteralSyntax && getPropertyArrayElementValue(compilerOptionsObjectLiteralSyntax, name, value);
}
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.add(createDiagnosticForNodeInSourceFile(sourceFile || options.configFile, referencesSyntax.elements[index], message, ...args));
} else {
programDiagnostics.add(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) {
if ("messageText" in message) {
programDiagnostics.add(createCompilerDiagnosticFromMessageChain(message));
} else {
programDiagnostics.add(createCompilerDiagnostic(message, ...args));
}
}
}
function getCompilerOptionsObjectLiteralSyntax() {
if (_compilerOptionsObjectLiteralSyntax === void 0) {
_compilerOptionsObjectLiteralSyntax = forEachPropertyAssignment(
getTsConfigObjectLiteralExpression(options.configFile),
"compilerOptions",
(prop) => isObjectLiteralExpression(prop.initializer) ? prop.initializer : void 0
) || false;
}
return _compilerOptionsObjectLiteralSyntax || void 0;
}
function createOptionDiagnosticInObjectLiteralSyntax(objectLiteral, onKey, key1, key2, message, ...args) {
let needsCompilerDiagnostic = false;
forEachPropertyAssignment(objectLiteral, key1, (prop) => {
if ("messageText" in message) {
programDiagnostics.add(createDiagnosticForNodeFromMessageChain(options.configFile, onKey ? prop.name : prop.initializer, message));
} else {
programDiagnostics.add(createDiagnosticForNodeInSourceFile(options.configFile, onKey ? prop.name : prop.initializer, message, ...args));
}
needsCompilerDiagnostic = true;
}, key2);
return needsCompilerDiagnostic;
}
function createRedundantOptionDiagnostic(errorOnOption, redundantWithOption) {
const compilerOptionsObjectLiteralSyntax = getCompilerOptionsObjectLiteralSyntax();
if (compilerOptionsObjectLiteralSyntax) {
createOptionDiagnosticInObjectLiteralSyntax(
compilerOptionsObjectLiteralSyntax,
/*onKey*/
true,
errorOnOption,
/*key2*/
void 0,
Diagnostics.Option_0_is_redundant_and_cannot_be_specified_with_option_1,
errorOnOption,
redundantWithOption
);
} else {
createDiagnosticForOptionName(Diagnostics.Option_0_is_redundant_and_cannot_be_specified_with_option_1, errorOnOption, redundantWithOption);
}
}
function blockEmittingOfFile(emitFileName, diag2) {
hasEmitBlockingDiagnostics.set(toPath3(emitFileName), true);
programDiagnostics.add(diag2);
}
function isEmittedFile(file) {
if (options.noEmit) {
return false;
}
const filePath = toPath3(file);
if (getSourceFileByPath(filePath)) {
return false;
}
const out = outFile(options);
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 && automaticTypeDirectiveResolutions && !symlinks.hasProcessedResolutions()) {
symlinks.setSymlinksFromResolutions(files, automaticTypeDirectiveResolutions);
}
return symlinks;
}
}
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 = outFile(ref.commandLine.options);
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.getSourceOfProjectReferenceRedirect(host.toPath(file));
return source !== void 0 ? isString(source) ? originalFileExists.call(host.compilerHost, 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 || !stringContains(directory, 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 ? (file) => fileExistsIfProjectReferenceDts(file) : (dir) => directoryExistsIfProjectReferenceDeclDir(dir);
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 (!stringContains(fileOrDirectoryPath, 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) {
program.getSemanticDiagnostics(sourceFile, cancellationToken);
return sourceFile || outFile(options) ? 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 && !outFile(options)) {
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),
useCaseSensitiveFileNames: host.useCaseSensitiveFileNames(),
getCurrentDirectory: () => host.getCurrentDirectory(),
onUnRecoverableConfigFileDiagnostic: host.onUnRecoverableConfigFileDiagnostic || returnUndefined,
trace: host.trace ? (s) => host.trace(s) : void 0
};
}
function createPrependNodes(projectReferences, getCommandLine, readFile, host) {
if (!projectReferences)
return emptyArray;
let nodes;
for (let i = 0; i < projectReferences.length; i++) {
const ref = projectReferences[i];
const resolvedRefOpts = getCommandLine(ref, i);
if (ref.prepend && resolvedRefOpts && resolvedRefOpts.options) {
const out = outFile(resolvedRefOpts.options);
if (!out)
continue;
const { jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath, buildInfoPath } = getOutputPathsForBundle(
resolvedRefOpts.options,
/*forceDtsPaths*/
true
);
const node = createInputFilesWithFilePaths(readFile, jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath, buildInfoPath, host, resolvedRefOpts.options);
(nodes || (nodes = [])).push(node);
}
}
return nodes || emptyArray;
}
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/builderState.ts
function getFileEmitOutput(program, sourceFile, emitOnlyDtsFiles, cancellationToken, customTransformers, forceDtsEmit) {
const outputFiles = [];
const { emitSkipped, diagnostics } = program.emit(sourceFile, writeFile2, cancellationToken, emitOnlyDtsFiles, customTransformers, forceDtsEmit);
return { outputFiles, emitSkipped, diagnostics };
function writeFile2(fileName, text, writeByteOrderMark) {
outputFiles.push({ name: fileName, writeByteOrderMark, text });
}
}
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(),
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) {
return toPath(program.getProjectReferenceRedirect(fileName) || 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);
}
}
if (sourceFile.resolvedTypeReferenceDirectiveNames) {
sourceFile.resolvedTypeReferenceDirectiveNames.forEach(({ resolvedTypeReferenceDirective }) => {
if (!resolvedTypeReferenceDirective) {
return;
}
const fileName = resolvedTypeReferenceDirective.resolvedFileName;
const typeFilePath = getReferencedFileFromFileName(program, fileName, sourceFileDirectory, getCanonicalFileName);
addReferencedFile(typeFilePath);
});
}
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 create(newProgram, oldState, disableUseFileVersionAsSignature) {
var _a, _b, _c;
const fileInfos = /* @__PURE__ */ new Map();
const options = newProgram.getCompilerOptions();
const isOutFile = outFile(options);
const referencedMap = options.module !== 0 /* None */ && !isOutFile ? createManyToManyPathMap() : void 0;
const exportedModulesMap = referencedMap ? createManyToManyPathMap() : void 0;
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);
}
if (useOldState) {
const oldUncommittedExportedModules = (_c = oldState.oldExportedModulesMap) == null ? void 0 : _c.get(sourceFile.resolvedPath);
const exportedModules = oldUncommittedExportedModules === void 0 ? oldState.exportedModulesMap.getValues(sourceFile.resolvedPath) : oldUncommittedExportedModules || void 0;
if (exportedModules) {
exportedModulesMap.set(sourceFile.resolvedPath, exportedModules);
}
}
}
fileInfos.set(sourceFile.resolvedPath, {
version: version2,
signature,
// No need to calculate affectsGlobalScope with --out since its not used at all
affectsGlobalScope: !isOutFile ? isFileAffectingGlobalScope(sourceFile) || void 0 : void 0,
impliedFormat: sourceFile.impliedNodeFormat
});
}
return {
fileInfos,
referencedMap,
exportedModulesMap,
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, _b;
const result = getFilesAffectedByWithOldState(
state,
programOfThisState,
path,
cancellationToken,
host
);
(_a = state.oldSignatures) == null ? void 0 : _a.clear();
(_b = state.oldExportedModulesMap) == null ? void 0 : _b.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,
/*emitOnly*/
true,
/*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, sourceFiles) => {
latestSignature = signature;
if (latestSignature !== prevSignature) {
updateExportedModules(state, sourceFile, sourceFiles[0].exportedModulesFromDeclarationEmit);
}
});
}
if (latestSignature === void 0) {
latestSignature = sourceFile.version;
if (state.exportedModulesMap && latestSignature !== prevSignature) {
(state.oldExportedModulesMap || (state.oldExportedModulesMap = /* @__PURE__ */ new Map())).set(sourceFile.resolvedPath, state.exportedModulesMap.getValues(sourceFile.resolvedPath) || false);
const references = state.referencedMap ? state.referencedMap.getValues(sourceFile.resolvedPath) : void 0;
if (references) {
state.exportedModulesMap.set(sourceFile.resolvedPath, references);
} else {
state.exportedModulesMap.deleteKey(sourceFile.resolvedPath);
}
}
}
(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 updateExportedModules(state, sourceFile, exportedModulesFromDeclarationEmit) {
if (!state.exportedModulesMap)
return;
(state.oldExportedModulesMap || (state.oldExportedModulesMap = /* @__PURE__ */ new Map())).set(sourceFile.resolvedPath, state.exportedModulesMap.getValues(sourceFile.resolvedPath) || false);
const exportedModules = getExportedModules(exportedModulesFromDeclarationEmit);
if (exportedModules) {
state.exportedModulesMap.set(sourceFile.resolvedPath, exportedModules);
} else {
state.exportedModulesMap.deleteKey(sourceFile.resolvedPath);
}
}
BuilderState2.updateExportedModules = updateExportedModules;
function getExportedModules(exportedModulesFromDeclarationEmit) {
let exportedModules;
exportedModulesFromDeclarationEmit == null ? void 0 : exportedModulesFromDeclarationEmit.forEach(
(symbol) => getReferencedFilesFromImportedModuleSymbol(symbol).forEach(
(path) => (exportedModules ?? (exportedModules = /* @__PURE__ */ new Set())).add(path)
)
);
return exportedModules;
}
BuilderState2.getExportedModules = getExportedModules;
function getAllDependencies(state, programOfThisState, sourceFile) {
const compilerOptions = programOfThisState.getCompilerOptions();
if (outFile(compilerOptions)) {
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 && outFile(compilerOptions)) {
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) || outFile(compilerOptions))) {
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
var BuilderFileEmit = /* @__PURE__ */ ((BuilderFileEmit2) => {
BuilderFileEmit2[BuilderFileEmit2["None"] = 0] = "None";
BuilderFileEmit2[BuilderFileEmit2["Js"] = 1] = "Js";
BuilderFileEmit2[BuilderFileEmit2["JsMap"] = 2] = "JsMap";
BuilderFileEmit2[BuilderFileEmit2["JsInlineMap"] = 4] = "JsInlineMap";
BuilderFileEmit2[BuilderFileEmit2["Dts"] = 8] = "Dts";
BuilderFileEmit2[BuilderFileEmit2["DtsMap"] = 16] = "DtsMap";
BuilderFileEmit2[BuilderFileEmit2["AllJs"] = 7] = "AllJs";
BuilderFileEmit2[BuilderFileEmit2["AllDts"] = 24] = "AllDts";
BuilderFileEmit2[BuilderFileEmit2["All"] = 31] = "All";
return BuilderFileEmit2;
})(BuilderFileEmit || {});
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 | 8 /* Dts */;
if (options.declarationMap)
result = result | 16 /* DtsMap */;
if (options.emitDeclarationOnly)
result = result & 24 /* 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 & 24 /* AllDts */)
result = result | emitKind & 24 /* AllDts */;
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 = outFile(compilerOptions);
if (!outFilePath) {
state.semanticDiagnosticsPerFile = /* @__PURE__ */ new Map();
} else if (compilerOptions.composite && (oldState == null ? void 0 : oldState.outSignature) && outFilePath === outFile(oldState == null ? void 0 : oldState.compilerOptions)) {
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;
const useOldState = BuilderState.canReuseOldState(state.referencedMap, oldState);
const oldCompilerOptions = useOldState ? oldState.compilerOptions : void 0;
const canCopySemanticDiagnostics = useOldState && oldState.semanticDiagnosticsPerFile && !!state.semanticDiagnosticsPerFile && !compilerOptionsAffectSemanticDiagnostics(compilerOptions, oldCompilerOptions);
const canCopyEmitSignatures = compilerOptions.composite && (oldState == null ? void 0 : oldState.emitSignatures) && !outFilePath && !compilerOptionsAffectDeclarationPath(compilerOptions, oldState.compilerOptions);
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;
} else {
state.buildInfoEmitPending = true;
}
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) => {
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(state, sourceFilePath);
} else if (canCopySemanticDiagnostics) {
const sourceFile = newProgram.getSourceFileByPath(sourceFilePath);
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, newProgram) : repopulateDiagnostics(diagnostics, newProgram)
);
if (!state.semanticDiagnosticsFromOldState) {
state.semanticDiagnosticsFromOldState = /* @__PURE__ */ new Set();
}
state.semanticDiagnosticsFromOldState.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 (outFilePath || info.affectsGlobalScope)
return true;
state.buildInfoEmitPending = true;
return false;
})) {
BuilderState.getAllFilesExcludingDefaultLibraryFile(
state,
newProgram,
/*firstSourceFile*/
void 0
).forEach((file) => addFileToChangeSet(state, 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();
state.buildInfoEmitPending = true;
} else {
state.programEmitPending = state.programEmitPending ? state.programEmitPending | pendingEmitKind : pendingEmitKind;
}
}
}
if (outFilePath && !state.changedFilesSet.size) {
if (useOldState)
state.bundle = oldState.bundle;
if (some(newProgram.getProjectReferences(), (ref) => !!ref.prepend))
state.programEmitPending = getBuilderFileEmit(compilerOptions);
}
return state;
}
function addFileToChangeSet(state, path) {
state.changedFilesSet.add(path);
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) {
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, newProgram) {
if (!diagnostics.length)
return emptyArray;
let buildInfoDirectory;
return diagnostics.map((diagnostic) => {
const result = convertToDiagnosticRelatedInformation(diagnostic, 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, 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, newProgram, toPath3) {
const { file } = diagnostic;
const sourceFile = file ? newProgram.getSourceFileByPath(toPath3(file)) : 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 backupBuilderProgramEmitState(state) {
const outFilePath = outFile(state.compilerOptions);
Debug.assert(!state.changedFilesSet.size || outFilePath);
return {
affectedFilesPendingEmit: state.affectedFilesPendingEmit && new Map(state.affectedFilesPendingEmit),
seenEmittedFiles: state.seenEmittedFiles && new Map(state.seenEmittedFiles),
programEmitPending: state.programEmitPending,
emitSignatures: state.emitSignatures && new Map(state.emitSignatures),
outSignature: state.outSignature,
latestChangedDtsFile: state.latestChangedDtsFile,
hasChangedEmitSignature: state.hasChangedEmitSignature,
changedFilesSet: outFilePath ? new Set(state.changedFilesSet) : void 0
};
}
function restoreBuilderProgramEmitState(state, savedEmitState) {
state.affectedFilesPendingEmit = savedEmitState.affectedFilesPendingEmit;
state.seenEmittedFiles = savedEmitState.seenEmittedFiles;
state.programEmitPending = savedEmitState.programEmitPending;
state.emitSignatures = savedEmitState.emitSignatures;
state.outSignature = savedEmitState.outSignature;
state.latestChangedDtsFile = savedEmitState.latestChangedDtsFile;
state.hasChangedEmitSignature = savedEmitState.hasChangedEmitSignature;
if (savedEmitState.changedFilesSet)
state.changedFilesSet = savedEmitState.changedFilesSet;
}
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, _b;
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();
(_b = state.oldExportedModulesMap) == null ? void 0 : _b.clear();
state.affectedFiles = void 0;
}
const nextKey = state.changedFilesSet.keys().next();
if (nextKey.done) {
return void 0;
}
const program = Debug.checkDefined(state.program);
const compilerOptions = program.getCompilerOptions();
if (outFile(compilerOptions)) {
Debug.assert(!state.semanticDiagnosticsPerFile);
return program;
}
state.affectedFiles = BuilderState.getFilesAffectedByWithOldState(
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) {
var _a;
if (!((_a = state.affectedFilesPendingEmit) == null ? void 0 : _a.size))
return;
if (!emitOnlyDtsFiles)
return state.affectedFilesPendingEmit = void 0;
state.affectedFilesPendingEmit.forEach((emitKind, path) => {
const pending = emitKind & 7 /* AllJs */;
if (!pending)
state.affectedFilesPendingEmit.delete(path);
else
state.affectedFilesPendingEmit.set(path, pending);
});
}
function getNextAffectedFilePendingEmit(state, emitOnlyDtsFiles) {
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);
let pendingKind = getPendingEmitKind(emitKind, seenKind);
if (emitOnlyDtsFiles)
pendingKind = pendingKind & 24 /* AllDts */;
if (pendingKind)
return { affectedFile, emitKind: pendingKind };
});
}
function removeDiagnosticsOfLibraryFiles(state) {
if (!state.cleanedDiagnosticsOfLibFiles) {
state.cleanedDiagnosticsOfLibFiles = true;
const program = Debug.checkDefined(state.program);
const options = program.getCompilerOptions();
forEach(
program.getSourceFiles(),
(f) => program.isSourceFileDefaultLibrary(f) && !skipTypeChecking(f, options, 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,
Debug.checkDefined(state.program),
affectedFile,
cancellationToken,
host
);
return;
}
if (state.compilerOptions.assumeChangesOnlyAffectDirectDependencies)
return;
handleDtsMayChangeOfReferencingExportOfAffectedFile(
state,
affectedFile,
cancellationToken,
host
);
}
function handleDtsMayChangeOf(state, path, cancellationToken, host) {
removeSemanticDiagnosticsOf(state, path);
if (!state.changedFilesSet.has(path)) {
const program = Debug.checkDefined(state.program);
const sourceFile = program.getSourceFileByPath(path);
if (sourceFile) {
BuilderState.updateShapeSignature(
state,
program,
sourceFile,
cancellationToken,
host,
/*useFileVersionAsSignature*/
true
);
if (getEmitDeclarations(state.compilerOptions)) {
addToAffectedFilesPendingEmit(state, path, state.compilerOptions.declarationMap ? 24 /* AllDts */ : 8 /* 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, 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,
cancellationToken,
host
));
removeDiagnosticsOfLibraryFiles(state);
return true;
}
function handleDtsMayChangeOfReferencingExportOfAffectedFile(state, affectedFile, cancellationToken, host) {
var _a;
if (!state.exportedModulesMap || !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, cancellationToken, host))
return;
handleDtsMayChangeOf(state, currentPath, cancellationToken, host);
if (isChangedSignature(state, currentPath)) {
const currentSourceFile = Debug.checkDefined(state.program).getSourceFileByPath(currentPath);
queue.push(...BuilderState.getReferencedByPaths(state, currentSourceFile.resolvedPath));
}
}
}
}
const seenFileAndExportsOfFile = /* @__PURE__ */ new Set();
(_a = state.exportedModulesMap.getKeys(affectedFile.resolvedPath)) == null ? void 0 : _a.forEach((exportedFromPath) => {
if (handleDtsMayChangeOfGlobalScope(state, exportedFromPath, cancellationToken, host))
return true;
const references = state.referencedMap.getKeys(exportedFromPath);
return references && forEachKey(
references,
(filePath) => handleDtsMayChangeOfFileAndExportsOfFile(
state,
filePath,
seenFileAndExportsOfFile,
cancellationToken,
host
)
);
});
}
function handleDtsMayChangeOfFileAndExportsOfFile(state, filePath, seenFileAndExportsOfFile, cancellationToken, host) {
var _a, _b;
if (!tryAddToSet(seenFileAndExportsOfFile, filePath))
return void 0;
if (handleDtsMayChangeOfGlobalScope(state, filePath, cancellationToken, host))
return true;
handleDtsMayChangeOf(state, filePath, cancellationToken, host);
(_a = state.exportedModulesMap.getKeys(filePath)) == null ? void 0 : _a.forEach(
(exportedFromPath) => handleDtsMayChangeOfFileAndExportsOfFile(
state,
exportedFromPath,
seenFileAndExportsOfFile,
cancellationToken,
host
)
);
(_b = state.referencedMap.getKeys(filePath)) == null ? void 0 : _b.forEach(
(referencingFilePath) => !seenFileAndExportsOfFile.has(referencingFilePath) && // Not already removed diagnostic file
handleDtsMayChangeOf(
// Dont add to seen since this is not yet done with the export removal
state,
referencingFilePath,
cancellationToken,
host
)
);
return void 0;
}
function getSemanticDiagnosticsOfFile(state, sourceFile, cancellationToken) {
return concatenate(
getBinderAndCheckerDiagnosticsOfFile(state, sourceFile, cancellationToken),
Debug.checkDefined(state.program).getProgramDiagnostics(sourceFile)
);
}
function getBinderAndCheckerDiagnosticsOfFile(state, sourceFile, cancellationToken) {
const path = sourceFile.resolvedPath;
if (state.semanticDiagnosticsPerFile) {
const cachedDiagnostics = state.semanticDiagnosticsPerFile.get(path);
if (cachedDiagnostics) {
return filterSemanticDiagnostics(cachedDiagnostics, state.compilerOptions);
}
}
const diagnostics = Debug.checkDefined(state.program).getBindAndCheckDiagnostics(sourceFile, cancellationToken);
if (state.semanticDiagnosticsPerFile) {
state.semanticDiagnosticsPerFile.set(path, diagnostics);
}
return filterSemanticDiagnostics(diagnostics, state.compilerOptions);
}
function isProgramBundleEmitBuildInfo(info) {
return !!outFile(info.options || {});
}
function getBuildInfo2(state, bundle) {
var _a, _b, _c;
const currentDirectory = Debug.checkDefined(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 root = [];
if (outFile(state.compilerOptions)) {
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 program2 = {
fileNames,
fileInfos: fileInfos2,
root,
options: convertToProgramBuildInfoCompilerOptions(state.compilerOptions),
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
};
const { js, dts, commonSourceDirectory, sourceFiles } = bundle;
state.bundle = bundle = {
commonSourceDirectory,
sourceFiles,
js: js || (!state.compilerOptions.emitDeclarationOnly ? (_a = state.bundle) == null ? void 0 : _a.js : void 0),
dts: dts || (getEmitDeclarations(state.compilerOptions) ? (_b = state.bundle) == null ? void 0 : _b.dts : void 0)
};
return createBuildInfo(program2, bundle);
}
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 || (emitSignatures = [])).push(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 (state.referencedMap) {
referencedMap = arrayFrom(state.referencedMap.keys()).sort(compareStringsCaseSensitive).map((key) => [
toFileId(key),
toFileIdListId(state.referencedMap.getValues(key))
]);
}
let exportedModulesMap;
if (state.exportedModulesMap) {
exportedModulesMap = mapDefined(arrayFrom(state.exportedModulesMap.keys()).sort(compareStringsCaseSensitive), (key) => {
var _a2;
const oldValue = (_a2 = state.oldExportedModulesMap) == null ? void 0 : _a2.get(key);
if (oldValue === void 0)
return [toFileId(key), toFileIdListId(state.exportedModulesMap.getValues(key))];
if (oldValue)
return [toFileId(key), toFileIdListId(oldValue)];
return void 0;
});
}
let semanticDiagnosticsPerFile;
if (state.semanticDiagnosticsPerFile) {
for (const key of arrayFrom(state.semanticDiagnosticsPerFile.keys()).sort(compareStringsCaseSensitive)) {
const value = state.semanticDiagnosticsPerFile.get(key);
(semanticDiagnosticsPerFile || (semanticDiagnosticsPerFile = [])).push(
value.length ? [
toFileId(key),
convertToReusableDiagnostics(value, relativeToBuildInfo)
] : toFileId(key)
);
}
}
let affectedFilesPendingEmit;
if ((_c = state.affectedFilesPendingEmit) == null ? void 0 : _c.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 || (affectedFilesPendingEmit = [])).push(
pendingEmit === fullEmitForOptions ? fileId : (
// Pending full emit per options
pendingEmit === 8 /* Dts */ ? [fileId] : (
// Pending on Dts only
[fileId, pendingEmit]
)
)
// Anything else
);
}
}
}
let changeFileSet;
if (state.changedFilesSet.size) {
for (const path of arrayFrom(state.changedFilesSet.keys()).sort(compareStringsCaseSensitive)) {
(changeFileSet || (changeFileSet = [])).push(toFileId(path));
}
}
const program = {
fileNames,
fileInfos,
root,
options: convertToProgramBuildInfoCompilerOptions(state.compilerOptions),
fileIdsList,
referencedMap,
exportedModulesMap,
semanticDiagnosticsPerFile,
affectedFilesPendingEmit,
changeFileSet,
emitSignatures,
latestChangedDtsFile
};
return createBuildInfo(program, bundle);
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 || (fileIdsList = [])).push(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 convertToProgramBuildInfoCompilerOptions(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] = convertToReusableCompilerOptionValue(
optionInfo,
options[name],
relativeToBuildInfoEnsuringAbsolutePath
);
}
}
return result;
}
}
function convertToReusableCompilerOptionValue(option, value, relativeToBuildInfo) {
if (option) {
Debug.assert(option.type !== "listOrElement");
if (option.type === "list") {
const values = value;
if (option.element.isFilePath && values.length) {
return values.map(relativeToBuildInfo);
}
} else if (option.isFilePath) {
return relativeToBuildInfo(value);
}
}
return value;
}
function convertToReusableDiagnostics(diagnostics, relativeToBuildInfo) {
Debug.assert(!!diagnostics.length);
return diagnostics.map((diagnostic) => {
const result = convertToReusableDiagnosticRelatedInformation(diagnostic, relativeToBuildInfo);
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) => convertToReusableDiagnosticRelatedInformation(r, relativeToBuildInfo)) : [] : void 0;
return result;
});
}
function convertToReusableDiagnosticRelatedInformation(diagnostic, relativeToBuildInfo) {
const { file } = diagnostic;
return {
...diagnostic,
file: file ? relativeToBuildInfo(file.resolvedPath) : void 0,
messageText: isString(diagnostic.messageText) ? diagnostic.messageText : convertToReusableDiagnosticMessageChain(diagnostic.messageText)
};
}
function convertToReusableDiagnosticMessageChain(chain) {
if (chain.repopulateInfo) {
return {
info: chain.repopulateInfo(),
next: convertToReusableDiagnosticMessageChainArray(chain.next)
};
}
const next = convertToReusableDiagnosticMessageChainArray(chain.next);
return next === chain.next ? chain : { ...chain, next };
}
function convertToReusableDiagnosticMessageChainArray(array) {
if (!array)
return array;
return forEach(array, (chain, index) => {
const reusable = convertToReusableDiagnosticMessageChain(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(convertToReusableDiagnosticMessageChain(array[i]));
}
return result;
}) || array;
}
var BuilderProgramKind = /* @__PURE__ */ ((BuilderProgramKind2) => {
BuilderProgramKind2[BuilderProgramKind2["SemanticDiagnosticsBuilderProgram"] = 0] = "SemanticDiagnosticsBuilderProgram";
BuilderProgramKind2[BuilderProgramKind2["EmitAndSemanticDiagnosticsBuilderProgram"] = 1] = "EmitAndSemanticDiagnosticsBuilderProgram";
return BuilderProgramKind2;
})(BuilderProgramKind || {});
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.getState();
if (oldState && newProgram === oldState.program && configFileParsingDiagnostics === newProgram.getConfigFileParsingDiagnostics()) {
newProgram = void 0;
oldState = void 0;
return oldProgram;
}
const state = createBuilderProgramState(newProgram, oldState);
newProgram.getBuildInfo = (bundle) => getBuildInfo2(state, bundle);
newProgram = void 0;
oldProgram = void 0;
oldState = void 0;
const getState = () => state;
const builderProgram = createRedirectedBuilderProgram(getState, configFileParsingDiagnostics);
builderProgram.getState = getState;
builderProgram.saveEmitState = () => backupBuilderProgramEmitState(state);
builderProgram.restoreEmitState = (saved) => restoreBuilderProgramEmitState(state, saved);
builderProgram.hasChangedEmitSignature = () => !!state.hasChangedEmitSignature;
builderProgram.getAllDependencies = (sourceFile) => BuilderState.getAllDependencies(state, Debug.checkDefined(state.program), sourceFile);
builderProgram.getSemanticDiagnostics = getSemanticDiagnostics;
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) {
if (state.buildInfoEmitPending) {
const result = Debug.checkDefined(state.program).emitBuildInfo(writeFile2 || maybeBind(host, host.writeFile), cancellationToken);
state.buildInfoEmitPending = false;
return result;
}
return emitSkippedWithNoDiagnostics;
}
function emitNextAffectedFile(writeFile2, cancellationToken, emitOnlyDtsFiles, customTransformers) {
var _a, _b, _c;
let affected = getNextAffectedFile(state, cancellationToken, host);
const programEmitKind = getBuilderFileEmit(state.compilerOptions);
let emitKind = emitOnlyDtsFiles ? programEmitKind & 24 /* AllDts */ : programEmitKind;
if (!affected) {
if (!outFile(state.compilerOptions)) {
const pendingAffectedFile = getNextAffectedFilePendingEmit(state, emitOnlyDtsFiles);
if (!pendingAffectedFile) {
if (!state.buildInfoEmitPending)
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 };
}
({ affectedFile: affected, emitKind } = pendingAffectedFile);
} else {
if (!state.programEmitPending)
return void 0;
emitKind = state.programEmitPending;
if (emitOnlyDtsFiles)
emitKind = emitKind & 24 /* AllDts */;
if (!emitKind)
return void 0;
affected = state.program;
}
}
let emitOnly;
if (emitKind & 7 /* AllJs */)
emitOnly = 0 /* Js */;
if (emitKind & 24 /* AllDts */)
emitOnly = emitOnly === void 0 ? 1 /* Dts */ : void 0;
if (affected === state.program) {
state.programEmitPending = state.changedFilesSet.size ? getPendingEmitKind(programEmitKind, emitKind) : state.programEmitPending ? getPendingEmitKind(state.programEmitPending, emitKind) : void 0;
}
const result = state.program.emit(
affected === state.program ? void 0 : affected,
getWriteFileCallback(writeFile2, customTransformers),
cancellationToken,
emitOnly,
customTransformers
);
if (affected !== state.program) {
const affectedSourceFile = affected;
state.seenAffectedFiles.add(affectedSourceFile.resolvedPath);
if (state.affectedFilesIndex !== void 0)
state.affectedFilesIndex++;
state.buildInfoEmitPending = true;
const existing = ((_a = state.seenEmittedFiles) == null ? void 0 : _a.get(affectedSourceFile.resolvedPath)) || 0 /* None */;
(state.seenEmittedFiles ?? (state.seenEmittedFiles = /* @__PURE__ */ new Map())).set(affectedSourceFile.resolvedPath, emitKind | existing);
const existingPending = ((_b = state.affectedFilesPendingEmit) == null ? void 0 : _b.get(affectedSourceFile.resolvedPath)) || programEmitKind;
const pendingKind = getPendingEmitKind(existingPending, emitKind | existing);
if (pendingKind)
(state.affectedFilesPendingEmit ?? (state.affectedFilesPendingEmit = /* @__PURE__ */ new Map())).set(affectedSourceFile.resolvedPath, pendingKind);
else
(_c = state.affectedFilesPendingEmit) == null ? void 0 : _c.delete(affectedSourceFile.resolvedPath);
} else {
state.changedFilesSet.clear();
}
return { result, affected };
}
function getWriteFileCallback(writeFile2, customTransformers) {
if (!getEmitDeclarations(state.compilerOptions))
return writeFile2 || maybeBind(host, host.writeFile);
return (fileName, text, writeByteOrderMark, onError, sourceFiles, data) => {
var _a, _b, _c, _d;
if (isDeclarationFileName(fileName)) {
if (!outFile(state.compilerOptions)) {
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.storeFilesChangingSignatureDuringEmit)
(state.filesChangingSignature ?? (state.filesChangingSignature = /* @__PURE__ */ new Set())).add(file.resolvedPath);
if (state.exportedModulesMap)
BuilderState.updateExportedModules(state, file, file.exportedModulesFromDeclarationEmit);
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;
(_c = state.oldExportedModulesMap) == null ? void 0 : _c.clear();
}
}
}
}
if (state.compilerOptions.composite) {
const filePath = sourceFiles[0].resolvedPath;
emitSignature = handleNewSignature((_d = state.emitSignatures) == null ? void 0 : _d.get(filePath), emitSignature);
if (!emitSignature)
return;
(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;
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) {
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);
}
}
return Debug.checkDefined(state.program).emit(
targetSourceFile,
getWriteFileCallback(writeFile2, customTransformers),
cancellationToken,
emitOnlyDtsFiles,
customTransformers
);
}
function getSemanticDiagnosticsOfNextAffectedFile(cancellationToken, ignoreSourceFile) {
while (true) {
const affected = getNextAffectedFile(state, cancellationToken, host);
let result;
if (!affected)
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 {
result = state.program.getSemanticDiagnostics(
/*sourceFile*/
void 0,
cancellationToken
);
state.changedFilesSet.clear();
state.programEmitPending = getBuilderFileEmit(state.compilerOptions);
}
return { result, affected };
}
}
function getSemanticDiagnostics(sourceFile, cancellationToken) {
assertSourceFileOkWithoutNextAffectedCall(state, sourceFile);
const compilerOptions = Debug.checkDefined(state.program).getCompilerOptions();
if (outFile(compilerOptions)) {
Debug.assert(!state.semanticDiagnosticsPerFile);
return Debug.checkDefined(state.program).getSemanticDiagnostics(sourceFile, cancellationToken);
}
if (sourceFile) {
return getSemanticDiagnosticsOfFile(state, sourceFile, cancellationToken);
}
while (getSemanticDiagnosticsOfNextAffectedFile(cancellationToken)) {
}
let diagnostics;
for (const sourceFile2 of Debug.checkDefined(state.program).getSourceFiles()) {
diagnostics = addRange(diagnostics, getSemanticDiagnosticsOfFile(state, sourceFile2, cancellationToken));
}
return diagnostics || emptyArray;
}
}
function addToAffectedFilesPendingEmit(state, affectedFilePendingEmit, kind) {
var _a;
const existingKind = ((_a = state.affectedFilesPendingEmit) == null ? void 0 : _a.get(affectedFilePendingEmit)) || 0 /* None */;
(state.affectedFilesPendingEmit ?? (state.affectedFilesPendingEmit = /* @__PURE__ */ new Map())).set(affectedFilePendingEmit, existingKind | kind);
}
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] || 8 /* Dts */;
}
function toProgramEmitPending(value, options) {
return !value ? getBuilderFileEmit(options || {}) : value;
}
function createBuilderProgramUsingProgramBuildInfo(buildInfo, buildInfoPath, host) {
var _a, _b, _c, _d;
const program = buildInfo.program;
const buildInfoDirectory = getDirectoryPath(getNormalizedAbsolutePath(buildInfoPath, host.getCurrentDirectory()));
const getCanonicalFileName = createGetCanonicalFileName(host.useCaseSensitiveFileNames());
let state;
const filePaths = (_a = program.fileNames) == null ? void 0 : _a.map(toPathInBuildInfoDirectory);
let filePathsSetList;
const latestChangedDtsFile = program.latestChangedDtsFile ? toAbsolutePath(program.latestChangedDtsFile) : void 0;
if (isProgramBundleEmitBuildInfo(program)) {
const fileInfos = /* @__PURE__ */ new Map();
program.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: program.options ? convertToOptionsWithAbsolutePaths(program.options, toAbsolutePath) : {},
latestChangedDtsFile,
outSignature: program.outSignature,
programEmitPending: program.pendingEmit === void 0 ? void 0 : toProgramEmitPending(program.pendingEmit, program.options),
bundle: buildInfo.bundle
};
} else {
filePathsSetList = (_b = program.fileIdsList) == null ? void 0 : _b.map((fileIds) => new Set(fileIds.map(toFilePath)));
const fileInfos = /* @__PURE__ */ new Map();
const emitSignatures = ((_c = program.options) == null ? void 0 : _c.composite) && !outFile(program.options) ? /* @__PURE__ */ new Map() : void 0;
program.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 = program.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 = program.affectedFilesPendingEmit ? getBuilderFileEmit(program.options || {}) : void 0;
state = {
fileInfos,
compilerOptions: program.options ? convertToOptionsWithAbsolutePaths(program.options, toAbsolutePath) : {},
referencedMap: toManyToManyPathMap(program.referencedMap),
exportedModulesMap: toManyToManyPathMap(program.exportedModulesMap),
semanticDiagnosticsPerFile: program.semanticDiagnosticsPerFile && arrayToMap(program.semanticDiagnosticsPerFile, (value) => toFilePath(isNumber(value) ? value : value[0]), (value) => isNumber(value) ? emptyArray : value[1]),
hasReusableDiagnostic: true,
affectedFilesPendingEmit: program.affectedFilesPendingEmit && arrayToMap(program.affectedFilesPendingEmit, (value) => toFilePath(isNumber(value) ? value : value[0]), (value) => toBuilderFileEmit(value, fullEmitForOptions)),
changedFilesSet: new Set(map(program.changeFileSet, toFilePath)),
latestChangedDtsFile,
emitSignatures: (emitSignatures == null ? void 0 : emitSignatures.size) ? emitSignatures : void 0
};
}
return {
getState: () => state,
saveEmitState: noop,
restoreEmitState: noop,
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) {
if (!referenceMap) {
return void 0;
}
const map2 = BuilderState.createManyToManyPathMap();
referenceMap.forEach(
([fileId, fileIdListId]) => map2.set(toFilePath(fileId), toFilePathsSet(fileIdListId))
);
return map2;
}
}
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 = [];
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]) {
roots.push(path);
if (current[1] === fileId)
rootIndex++;
}
} else if (current === fileId) {
roots.push(path);
rootIndex++;
}
}
});
return { fileInfos, roots };
}
function createRedirectedBuilderProgram(getState, configFileParsingDiagnostics) {
return {
getState: notImplemented,
saveEmitState: noop,
restoreEmitState: noop,
getProgram,
getProgramOrUndefined: () => getState().program,
releaseProgram: () => getState().program = void 0,
getCompilerOptions: () => getState().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(getState().program);
}
}
// src/compiler/builderPublic.ts
function createSemanticDiagnosticsBuilderProgram(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics, projectReferences) {
return createBuilderProgram(0 /* SemanticDiagnosticsBuilderProgram */, getBuilderCreationParameters(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics, projectReferences));
}
function createEmitAndSemanticDiagnosticsBuilderProgram(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics, projectReferences) {
return createBuilderProgram(1 /* EmitAndSemanticDiagnosticsBuilderProgram */, getBuilderCreationParameters(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics, projectReferences));
}
function createAbstractBuilder(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics, projectReferences) {
const { newProgram, configFileParsingDiagnostics: newConfigFileParsingDiagnostics } = getBuilderCreationParameters(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics, projectReferences);
return createRedirectedBuilderProgram(() => ({ program: newProgram, compilerOptions: newProgram.getCompilerOptions() }), newConfigFileParsingDiagnostics);
}
// src/compiler/resolutionCache.ts
function removeIgnoredPath(path) {
if (endsWith(path, "/node_modules/.staging")) {
return removeSuffix(path, "/.staging");
}
return some(ignoredPaths, (searchPath) => stringContains(path, searchPath)) ? void 0 : path;
}
function perceivedOsRootLengthForWatching(pathComponents2, length2) {
if (length2 <= 1)
return 1;
let userCheckIndex = 1;
let isDosStyle = pathComponents2[0].search(/[a-zA-Z]:/) === 0;
if (pathComponents2[0] !== directorySeparator && !isDosStyle && // Non dos style paths
pathComponents2[1].search(/[a-zA-Z]\$$/) === 0) {
if (length2 === 2)
return 2;
userCheckIndex = 2;
isDosStyle = true;
}
if (isDosStyle && !pathComponents2[userCheckIndex].match(/^users$/i)) {
return userCheckIndex;
}
return userCheckIndex + 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 canWatchAtTypes(atTypes) {
return canWatchAffectedPackageJsonOrNodeModulesOfAtTypes(getDirectoryPath(atTypes));
}
function isInDirectoryPath(dirComponents, fileOrDirComponents) {
if (fileOrDirComponents.length < fileOrDirComponents.length)
return false;
for (let i = 0; i < dirComponents.length; i++) {
if (fileOrDirComponents[i] !== dirComponents[i])
return false;
}
return true;
}
function canWatchAffectedPackageJsonOrNodeModulesOfAtTypes(fileOrDirPath) {
return canWatchDirectoryOrFile(getPathComponents(fileOrDirPath));
}
function canWatchAffectingLocation(filePath) {
return canWatchAffectedPackageJsonOrNodeModulesOfAtTypes(filePath);
}
function getDirectoryToWatchFailedLookupLocation(failedLookupLocation, failedLookupLocationPath, rootDir, rootPath, rootPathComponents, getCurrentDirectory) {
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;
if (isInDirectoryPath(rootPathComponents, failedLookupPathComponents)) {
if (failedLookupPathComponents.length > rootPathComponents.length + 1) {
return getDirectoryOfFailedLookupWatch(failedLookupComponents, failedLookupPathComponents, Math.max(rootPathComponents.length + 1, perceivedOsRootLength + 1));
} else {
return {
dir: rootDir,
dirPath: rootPath,
nonRecursive: true
};
}
}
return getDirectoryToWatchFromFailedLookupLocationDirectory(
failedLookupComponents,
failedLookupPathComponents,
failedLookupPathComponents.length - 1,
perceivedOsRootLength,
nodeModulesIndex,
rootPathComponents
);
}
function getDirectoryToWatchFromFailedLookupLocationDirectory(dirComponents, dirPathComponents, dirPathComponentsLength, perceivedOsRootLength, nodeModulesIndex, rootPathComponents) {
if (nodeModulesIndex !== -1) {
return getDirectoryOfFailedLookupWatch(dirComponents, dirPathComponents, nodeModulesIndex + 1);
}
let nonRecursive = true;
let length2 = dirPathComponentsLength;
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, nonRecursive);
}
function getDirectoryOfFailedLookupWatch(dirComponents, dirPathComponents, length2, nonRecursive) {
return {
dir: getPathFromPathComponents(dirComponents, length2),
dirPath: getPathFromPathComponents(dirPathComponents, length2),
nonRecursive
};
}
function getDirectoryToWatchFailedLookupLocationFromTypeRoot(typeRoot, typeRootPath, rootPath, rootPathComponents, getCurrentDirectory, filterCustomPath) {
const typeRootPathComponents = getPathComponents(typeRootPath);
if (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
);
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 getRootPathSplitLength(rootPath) {
return rootPath.split(directorySeparator).length - (hasTrailingDirectorySeparator(rootPath) ? 1 : 0);
}
function createResolutionCache(resolutionHost, rootDirForResolution, logChangesWhenResolvingModule) {
let filesWithChangedSetOfUnresolvedImports;
let filesWithInvalidatedResolutions;
let filesWithInvalidatedNonRelativeUnresolvedImports;
const nonRelativeExternalModuleResolutions = createMultiMap();
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()
);
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 typeRootsWatches = /* @__PURE__ */ new Map();
return {
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 getResolvedModule2(resolution) {
return resolution.resolvedModule;
}
function getResolvedTypeReferenceDirective2(resolution) {
return resolution.resolvedTypeReferenceDirective;
}
function clear2() {
clearMap(directoryWatchesOfFailedLookups, closeFileWatcherOf);
clearMap(fileWatchesOfAffectingLocations, closeFileWatcherOf);
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.clearAllExceptPackageJsonInfoCache();
typeReferenceDirectiveResolutionCache.clearAllExceptPackageJsonInfoCache();
libraryResolutionCache.clearAllExceptPackageJsonInfoCache();
nonRelativeExternalModuleResolutions.forEach(watchFailedLookupLocationOfNonRelativeModuleResolutions);
nonRelativeExternalModuleResolutions.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(newProgram.getCompilerOptions(), getCurrentDirectory(), libFileName)),
getResolvedModule2
);
resolvedLibraries.delete(libFileName);
}
});
}
function finishCachingPerDirectoryResolution(newProgram, oldProgram) {
filesWithInvalidatedNonRelativeUnresolvedImports = void 0;
allModuleAndTypeResolutionsAreInvalidated = false;
nonRelativeExternalModuleResolutions.forEach(watchFailedLookupLocationOfNonRelativeModuleResolutions);
nonRelativeExternalModuleResolutions.clear();
if (newProgram !== oldProgram) {
cleanupLibResolutionWatching(newProgram);
newProgram == null ? void 0 : newProgram.getSourceFiles().forEach((newFile) => {
var _a;
const expected = isExternalOrCommonJsModule(newFile) ? ((_a = newFile.packageJsonLocations) == null ? void 0 : _a.length) ?? 0 : 0;
const existing = impliedFormatPackageJsons.get(newFile.path) ?? 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.path, newFile.packageJsonLocations);
else
impliedFormatPackageJsons.delete(newFile.path);
});
impliedFormatPackageJsons.forEach((existing, path) => {
if (!(newProgram == null ? void 0 : newProgram.getSourceFileByPath(path))) {
existing.forEach((location) => fileWatchesOfAffectingLocations.get(location).files--);
impliedFormatPackageJsons.delete(path);
}
});
}
directoryWatchesOfFailedLookups.forEach((watcher, path) => {
if (watcher.refCount === 0) {
directoryWatchesOfFailedLookups.delete(path);
watcher.watcher.close();
}
});
fileWatchesOfAffectingLocations.forEach((watcher, path) => {
if (watcher.files === 0 && watcher.resolutions === 0) {
fileWatchesOfAffectingLocations.delete(path);
watcher.watcher.close();
}
});
hasChangedAutomaticTypeDirectiveNames = false;
}
function resolveModuleName2(moduleName, containingFile, compilerOptions, redirectedReference, mode) {
var _a;
const host = ((_a = resolutionHost.getCompilerHost) == null ? void 0 : _a.call(resolutionHost)) || resolutionHost;
const primaryResult = resolveModuleName(moduleName, containingFile, compilerOptions, host, moduleResolutionCache, redirectedReference, mode);
if (!resolutionHost.getGlobalCache) {
return primaryResult;
}
const globalCache = resolutionHost.getGlobalCache();
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 createModuleResolutionLoader2(containingFile, redirectedReference, options) {
return {
nameAndMode: moduleResolutionNameAndModeGetter,
resolve: (moduleName, resoluionMode) => resolveModuleName2(
moduleName,
containingFile,
options,
redirectedReference,
resoluionMode
)
};
}
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 && program.getResolvedProjectReferenceToRedirect(containingFile);
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);
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);
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 = ((_a = resolutionHost.getCompilerHost) == null ? void 0 : _a.call(resolutionHost)) || 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),
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) {
var _a;
return resolveNamesWithLocalCache({
entries: typeDirectiveReferences,
containingFile,
containingSourceFile,
redirectedReference,
options,
reusedNames,
perFileCache: resolvedTypeReferenceDirectives,
loader: createTypeReferenceResolutionLoader(
containingFile,
redirectedReference,
options,
((_a = resolutionHost.getCompilerHost) == null ? void 0 : _a.call(resolutionHost)) || resolutionHost,
typeReferenceDirectiveResolutionCache
),
getResolutionWithResolvedFileName: getResolvedTypeReferenceDirective2,
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: createModuleResolutionLoader2(
containingFile,
redirectedReference,
options
),
getResolutionWithResolvedFileName: getResolvedModule2,
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) {
var _a;
const host = ((_a = resolutionHost.getCompilerHost) == null ? void 0 : _a.call(resolutionHost)) || 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,
getResolvedModule2,
/*deferWatchingNonRelativeResolution*/
false
);
resolvedLibraries.set(libFileName, resolution);
if (existingResolution) {
stopWatchFailedLookupLocationOfResolution(existingResolution, path, getResolvedModule2);
}
} else {
if (isTraceEnabled(options, host)) {
const resolved = getResolvedModule2(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) {
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;
return resolveModuleName2(moduleName, containingFile, resolutionHost.getCompilationSettings());
}
function isNodeModulesAtTypesDirectory(dirPath) {
return endsWith(dirPath, "/node_modules/@types");
}
function watchFailedLookupLocationsOfExternalModuleResolutions(name, resolution, filePath, getResolutionWithResolvedFileName, deferWatchingNonRelativeResolution) {
var _a;
if (resolution.refCount) {
resolution.refCount++;
Debug.assertIsDefined(resolution.files);
} else {
resolution.refCount = 1;
Debug.assert(!((_a = resolution.files) == null ? void 0 : _a.size));
if (!deferWatchingNonRelativeResolution || isExternalModuleNameRelative(name)) {
watchFailedLookupLocationOfResolution(resolution);
} else {
nonRelativeExternalModuleResolutions.add(name, 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);
}
}
(resolution.files ?? (resolution.files = /* @__PURE__ */ new Set())).add(filePath);
}
function watchFailedLookupLocation(failedLookupLocation, setAtRoot) {
const failedLookupLocationPath = resolutionHost.toPath(failedLookupLocation);
const toWatch = getDirectoryToWatchFailedLookupLocation(
failedLookupLocation,
failedLookupLocationPath,
rootDir,
rootPath,
rootPathComponents,
getCurrentDirectory
);
if (toWatch) {
const { dir, dirPath, nonRecursive } = toWatch;
if (dirPath === rootPath) {
Debug.assert(nonRecursive);
setAtRoot = true;
} else {
setDirectoryWatcher(dir, dirPath, nonRecursive);
}
}
return setAtRoot;
}
function watchFailedLookupLocationOfResolution(resolution) {
Debug.assert(!!resolution.refCount);
const { failedLookupLocations, affectingLocations, node10Result } = resolution;
if (!(failedLookupLocations == null ? void 0 : failedLookupLocations.length) && !(affectingLocations == null ? void 0 : affectingLocations.length) && !node10Result)
return;
if ((failedLookupLocations == null ? void 0 : failedLookupLocations.length) || node10Result)
resolutionsWithFailedLookups.add(resolution);
let setAtRoot = false;
if (failedLookupLocations) {
for (const failedLookupLocation of failedLookupLocations) {
setAtRoot = watchFailedLookupLocation(failedLookupLocation, setAtRoot);
}
}
if (node10Result)
setAtRoot = watchFailedLookupLocation(node10Result, setAtRoot);
if (setAtRoot) {
setDirectoryWatcher(
rootDir,
rootPath,
/*nonRecursive*/
true
);
}
watchAffectingLocationsOfResolution(resolution, !(failedLookupLocations == null ? void 0 : failedLookupLocations.length) && !node10Result);
}
function watchAffectingLocationsOfResolution(resolution, addToResolutionsWithOnlyAffectingLocations) {
Debug.assert(!!resolution.refCount);
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;
if (resolutionHost.realpath) {
locationToWatch = resolutionHost.realpath(affectingLocation);
if (affectingLocation !== locationToWatch) {
const fileWatcher2 = fileWatchesOfAffectingLocations.get(locationToWatch);
if (fileWatcher2) {
if (forResolution)
fileWatcher2.resolutions++;
else
fileWatcher2.files++;
fileWatcher2.paths.add(affectingLocation);
fileWatchesOfAffectingLocations.set(affectingLocation, fileWatcher2);
return;
}
}
}
const paths = /* @__PURE__ */ new Set();
paths.add(locationToWatch);
let actualWatcher = canWatchAffectingLocation(resolutionHost.toPath(locationToWatch)) ? resolutionHost.watchAffectingFileLocation(locationToWatch, (fileName, eventKind) => {
cachedDirectoryStructureHost == null ? void 0 : cachedDirectoryStructureHost.addOrDeleteFile(fileName, resolutionHost.toPath(locationToWatch), eventKind);
const packageJsonMap = moduleResolutionCache.getPackageJsonInfoCache().getInternalMap();
paths.forEach((path) => {
if (watcher.resolutions)
(affectingPathChecks ?? (affectingPathChecks = /* @__PURE__ */ new Set())).add(path);
if (watcher.files)
(affectingPathChecksForFile ?? (affectingPathChecksForFile = /* @__PURE__ */ new Set())).add(path);
packageJsonMap == null ? void 0 : packageJsonMap.delete(resolutionHost.toPath(path));
});
resolutionHost.scheduleInvalidateResolutionsOfFailedLookupLocations();
}) : noopFileWatcher;
const watcher = {
watcher: actualWatcher !== noopFileWatcher ? {
close: () => {
actualWatcher.close();
actualWatcher = noopFileWatcher;
}
} : actualWatcher,
resolutions: forResolution ? 1 : 0,
files: forResolution ? 0 : 1,
paths
};
fileWatchesOfAffectingLocations.set(locationToWatch, watcher);
if (affectingLocation !== locationToWatch) {
fileWatchesOfAffectingLocations.set(affectingLocation, watcher);
paths.add(affectingLocation);
}
}
function watchFailedLookupLocationOfNonRelativeModuleResolutions(resolutions, name) {
const program = resolutionHost.getCurrentProgram();
if (!program || !program.getTypeChecker().tryFindAmbientModuleWithoutAugmentations(name)) {
resolutions.forEach(watchFailedLookupLocationOfResolution);
} else {
resolutions.forEach((resolution) => watchAffectingLocationsOfResolution(
resolution,
/*addToResolutionsWithOnlyAffectingLocations*/
true
));
}
}
function setDirectoryWatcher(dir, dirPath, nonRecursive) {
const dirWatcher = directoryWatchesOfFailedLookups.get(dirPath);
if (dirWatcher) {
Debug.assert(!!nonRecursive === !!dirWatcher.nonRecursive);
dirWatcher.refCount++;
} else {
directoryWatchesOfFailedLookups.set(dirPath, { watcher: createDirectoryWatcher(dir, dirPath, nonRecursive), refCount: 1, nonRecursive });
}
}
function stopWatchFailedLookupLocation(failedLookupLocation, removeAtRoot) {
const failedLookupLocationPath = resolutionHost.toPath(failedLookupLocation);
const toWatch = getDirectoryToWatchFailedLookupLocation(
failedLookupLocation,
failedLookupLocationPath,
rootDir,
rootPath,
rootPathComponents,
getCurrentDirectory
);
if (toWatch) {
const { dirPath } = toWatch;
if (dirPath === rootPath) {
removeAtRoot = true;
} else {
removeDirectoryWatcher(dirPath);
}
}
return removeAtRoot;
}
function stopWatchFailedLookupLocationOfResolution(resolution, filePath, getResolutionWithResolvedFileName) {
Debug.checkDefined(resolution.files).delete(filePath);
resolution.refCount--;
if (resolution.refCount) {
return;
}
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, node10Result } = resolution;
if (resolutionsWithFailedLookups.delete(resolution)) {
let removeAtRoot = false;
if (failedLookupLocations) {
for (const failedLookupLocation of failedLookupLocations) {
removeAtRoot = stopWatchFailedLookupLocation(failedLookupLocation, removeAtRoot);
}
}
if (node10Result)
removeAtRoot = stopWatchFailedLookupLocation(node10Result, 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, getResolvedModule2);
removeResolutionsOfFileFromCache(resolvedTypeReferenceDirectives, filePath, getResolvedTypeReferenceDirective2);
}
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);
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.node10Result && isInvalidatedFailedLookup(resolutionHost.toPath(resolution.node10Result));
}
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(typeRootPath, typeRoot) {
return canWatchTypeRootPath(typeRootPath) ? resolutionHost.watchTypeRootsDirectory(typeRoot, (fileOrDirectory) => {
const fileOrDirectoryPath = resolutionHost.toPath(fileOrDirectory);
if (cachedDirectoryStructureHost) {
cachedDirectoryStructureHost.addOrDeleteFileOrDirectory(fileOrDirectory, fileOrDirectoryPath);
}
hasChangedAutomaticTypeDirectiveNames = true;
resolutionHost.onChangedAutomaticTypeDirectiveNames();
const dirPath = getDirectoryToWatchFailedLookupLocationFromTypeRoot(
typeRoot,
typeRootPath,
rootPath,
rootPathComponents,
getCurrentDirectory,
(dirPath2) => directoryWatchesOfFailedLookups.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,
arrayToMap(typeRoots, (tr) => resolutionHost.toPath(tr)),
{
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 = fileToErrorCount.reduce((acc, value) => Math.max(acc, value[1] || 0), 0);
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 isBuilderProgram2(program) {
return !!program.getState;
}
function listFiles(program, write) {
const options = program.getCompilerOptions();
if (options.explainFiles) {
explainFiles(isBuilderProgram2(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, relativeFileName)) == null ? void 0 : _b.forEach((d) => write(` ${d.messageText}`));
}
}
function explainIfFileIsRedirectAndImpliedFormat(file, 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 (file.impliedNodeFormat) {
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()));
return find(configFile.configFileSpecs.validatedFilesSpec, (fileSpec) => program.getCanonicalFileName(getNormalizedAbsolutePath(fileSpec, basePath)) === filePath);
}
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 useCaseSensitiveFileNames = program.useCaseSensitiveFileNames();
return find((_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})$`, useCaseSensitiveFileNames).test(fileName);
});
}
function fileIncludeReasonToDiagnostics(program, reason, fileNameConvertor) {
var _a, _b;
const options = program.getCompilerOptions();
if (isReferencedFile(reason)) {
const referenceLocation = getReferencedFileLocation((path) => program.getSourceFileByPath(path), 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,
outFile(options) ? 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 = forEachEntry(targetOptionDeclaration.type, (value, key) => value === getEmitScriptTarget(options) ? key : void 0);
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 isListFilesOnly = !!program.getCompilerOptions().listFilesOnly;
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 (!isListFilesOnly) {
addRange(allDiagnostics, program.getGlobalDiagnostics(cancellationToken));
if (allDiagnostics.length === configFileParsingDiagnosticsLength) {
addRange(allDiagnostics, program.getSemanticDiagnostics(
/*sourceFile*/
void 0,
cancellationToken
));
}
}
}
const emitResult = isListFilesOnly ? { emitSkipped: true, diagnostics: emptyArray } : program.emit(
/*targetSourceFile*/
void 0,
writeFile2,
cancellationToken,
emitOnlyDtsFiles,
customTransformers
);
const { emittedFiles, diagnostics: emitDiagnostics } = emitResult;
addRange(allDiagnostics, emitDiagnostics);
const diagnostics = sortAndDeduplicateDiagnostics(allDiagnostics);
diagnostics.forEach(reportDiagnostic);
if (write) {
const currentDir = program.getCurrentDirectory();
forEach(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
};
}
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 useCaseSensitiveFileNames = host.useCaseSensitiveFileNames();
const compilerHost = {
getSourceFile: createGetSourceFile(
(fileName, encoding) => !encoding ? compilerHost.readFile(fileName) : host.readFile(fileName, encoding),
getCompilerOptions,
/*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: () => useCaseSensitiveFileNames,
getCanonicalFileName: createGetCanonicalFileName(useCaseSensitiveFileNames),
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),
storeFilesChangingSignatureDuringEmit: host.storeFilesChangingSignatureDuringEmit
};
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--;
}
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,
storeFilesChangingSignatureDuringEmit: system.storeFilesChangingSignatureDuringEmit,
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 || !buildInfo.program)
return void 0;
return createBuilderProgramUsingProgramBuildInfo(buildInfo, buildInfoPath, host);
}
function createIncrementalCompilerHost(options, system = sys) {
const host = createCompilerHostWorker(
options,
/*setParentNodes*/
void 0,
system
);
host.createHash = maybeBind(system, system.createHash);
host.storeFilesChangingSignatureDuringEmit = system.storeFilesChangingSignatureDuringEmit;
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 createWatchCompilerHost2(rootFilesOrConfigFileName, options, system, createProgram2, reportDiagnostic, reportWatchStatus2, projectReferencesOrWatchOptionsToExtend, watchOptionsOrExtraFileExtensions) {
if (isArray(rootFilesOrConfigFileName)) {
return createWatchCompilerHostOfFilesAndCompilerOptions({
rootFiles: rootFilesOrConfigFileName,
options,
watchOptions: watchOptionsOrExtraFileExtensions,
projectReferences: projectReferencesOrWatchOptionsToExtend,
system,
createProgram: createProgram2,
reportDiagnostic,
reportWatchStatus: reportWatchStatus2
});
} else {
return createWatchCompilerHostOfConfigFile({
configFileName: rootFilesOrConfigFileName,
optionsToExtend: options,
watchOptionsToExtend: projectReferencesOrWatchOptionsToExtend,
extraFileExtensions: watchOptionsOrExtraFileExtensions,
system,
createProgram: createProgram2,
reportDiagnostic,
reportWatchStatus: reportWatchStatus2
});
}
}
function createWatchProgram(host) {
let builderProgram;
let reloadLevel;
let missingFilesMap;
let watchedWildcardDirectories;
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 useCaseSensitiveFileNames = 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, useCaseSensitiveFileNames);
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(useCaseSensitiveFileNames);
writeLog(`Current directory: ${currentDirectory} CaseSensitiveFileNames: ${useCaseSensitiveFileNames}`);
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.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();
watchConfigFileWildCardDirectories();
if (configFileName)
updateExtendedConfigFilesWatches(toPath3(configFileName), compilerOptions, watchOptions, WatchType.ExtendedConfigFile);
return configFileName ? { getCurrentProgram: getCurrentBuilderProgram, getProgram: updateProgram, close } : { getCurrentProgram: getCurrentBuilderProgram, getProgram: updateProgram, updateRootFileNames, close };
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;
}
}
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)) {
debugger;
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;
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;
}
if (hostSourceFile === void 0 || shouldCreateNewSourceFile || isFilePresenceUnknownOnHost(hostSourceFile)) {
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);
reloadLevel = 2 /* Full */;
scheduleProgramUpdate();
}
function updateProgramWithWatchStatus() {
timerToUpdateProgram = void 0;
reportFileChangeDetectedOnCreateProgram = true;
updateProgram();
}
function updateProgram() {
var _a, _b, _c, _d;
switch (reloadLevel) {
case 1 /* Partial */:
(_a = perfLogger) == null ? void 0 : _a.logStartUpdateProgram("PartialConfigReload");
reloadFileNamesFromConfigFile();
break;
case 2 /* Full */:
(_b = perfLogger) == null ? void 0 : _b.logStartUpdateProgram("FullConfigReload");
reloadConfigFile();
break;
default:
(_c = perfLogger) == null ? void 0 : _c.logStartUpdateProgram("SynchronizeProgram");
synchronizeProgram();
break;
}
(_d = perfLogger) == null ? void 0 : _d.logStopUpdateProgram("Done");
return getCurrentBuilderProgram();
}
function reloadFileNamesFromConfigFile() {
writeLog("Reloading new file names and options");
Debug.assert(compilerOptions);
Debug.assert(configFileName);
reloadLevel = 0 /* None */;
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}`);
reloadLevel = 0 /* None */;
if (cachedDirectoryStructureHost) {
cachedDirectoryStructureHost.clearCache();
}
parseConfigFile2();
hasChangedCompilerOptions = true;
synchronizeProgram();
watchConfigFileWildCardDirectories();
updateExtendedConfigFilesWatches(toPath3(configFileName), compilerOptions, watchOptions, WatchType.ExtendedConfigFile);
}
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.reloadLevel)
return config.parsedCommandLine;
if (config.parsedCommandLine && config.reloadLevel === 1 /* Partial */ && !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.reloadLevel = 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.reloadLevel = void 0;
} else {
(parsedConfigs || (parsedConfigs = /* @__PURE__ */ new Map())).set(configPath, config = { parsedCommandLine });
}
watchReferencedProject(configFileName2, configPath, config);
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) {
return (parsedConfigs == null ? void 0 : parsedConfigs.has(missingFilePath)) ? noopFileWatcher : watchFilePath(missingFilePath, missingFilePath, 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() {
if (wildcardDirectories) {
updateWatchingWildcardDirectories(
watchedWildcardDirectories || (watchedWildcardDirectories = /* @__PURE__ */ new Map()),
new Map(Object.entries(wildcardDirectories)),
watchWildcardDirectory
);
} else if (watchedWildcardDirectories) {
clearMap(watchedWildcardDirectories, closeFileWatcherOf);
}
}
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,
writeLog,
toPath: toPath3
}))
return;
if (reloadLevel !== 2 /* Full */) {
reloadLevel = 1 /* Partial */;
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) {
reloadLevel = 2 /* Full */;
} else {
const config = parsedConfigs == null ? void 0 : parsedConfigs.get(projectPath);
if (config)
config.reloadLevel = 2 /* Full */;
resolutionCache.removeResolutionsFromProjectReferenceRedirects(projectPath);
}
scheduleProgramUpdate();
});
},
2e3 /* High */,
watchOptions2,
watchType
),
toPath3
);
}
function watchReferencedProject(configFileName2, configPath, commandLine) {
var _a, _b, _c, _d, _e;
commandLine.watcher || (commandLine.watcher = watchFile2(
configFileName2,
(_fileName, eventKind) => {
updateCachedSystemWithFile(configFileName2, configPath, eventKind);
const config = parsedConfigs == null ? void 0 : parsedConfigs.get(configPath);
if (config)
config.reloadLevel = 2 /* Full */;
resolutionCache.removeResolutionsFromProjectReferenceRedirects(configPath);
scheduleProgramUpdate();
},
2e3 /* High */,
((_a = commandLine.parsedCommandLine) == null ? void 0 : _a.watchOptions) || watchOptions,
WatchType.ConfigFileOfReferencedProject
));
if ((_b = commandLine.parsedCommandLine) == null ? void 0 : _b.wildcardDirectories) {
updateWatchingWildcardDirectories(
commandLine.watchedDirectories || (commandLine.watchedDirectories = /* @__PURE__ */ new Map()),
new Map(Object.entries((_c = commandLine.parsedCommandLine) == null ? void 0 : _c.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,
writeLog,
toPath: toPath3
}))
return;
if (config.reloadLevel !== 2 /* Full */) {
config.reloadLevel = 1 /* Partial */;
scheduleProgramUpdate();
}
},
flags,
((_a2 = commandLine.parsedCommandLine) == null ? void 0 : _a2.watchOptions) || watchOptions,
WatchType.WildcardDirectoryOfReferencedProject
);
}
);
} else if (commandLine.watchedDirectories) {
clearMap(commandLine.watchedDirectories, closeFileWatcherOf);
commandLine.watchedDirectories = void 0;
}
updateExtendedConfigFilesWatches(
configPath,
(_d = commandLine.parsedCommandLine) == null ? void 0 : _d.options,
((_e = commandLine.parsedCommandLine) == null ? void 0 : _e.watchOptions) || watchOptions,
WatchType.ExtendedConfigOfReferencedProject
);
}
}
// src/compiler/tsbuild.ts
var UpToDateStatusType = /* @__PURE__ */ ((UpToDateStatusType2) => {
UpToDateStatusType2[UpToDateStatusType2["Unbuildable"] = 0] = "Unbuildable";
UpToDateStatusType2[UpToDateStatusType2["UpToDate"] = 1] = "UpToDate";
UpToDateStatusType2[UpToDateStatusType2["UpToDateWithUpstreamTypes"] = 2] = "UpToDateWithUpstreamTypes";
UpToDateStatusType2[UpToDateStatusType2["OutOfDateWithPrepend"] = 3] = "OutOfDateWithPrepend";
UpToDateStatusType2[UpToDateStatusType2["OutputMissing"] = 4] = "OutputMissing";
UpToDateStatusType2[UpToDateStatusType2["ErrorReadingFile"] = 5] = "ErrorReadingFile";
UpToDateStatusType2[UpToDateStatusType2["OutOfDateWithSelf"] = 6] = "OutOfDateWithSelf";
UpToDateStatusType2[UpToDateStatusType2["OutOfDateWithUpstream"] = 7] = "OutOfDateWithUpstream";
UpToDateStatusType2[UpToDateStatusType2["OutOfDateBuildInfo"] = 8] = "OutOfDateBuildInfo";
UpToDateStatusType2[UpToDateStatusType2["OutOfDateOptions"] = 9] = "OutOfDateOptions";
UpToDateStatusType2[UpToDateStatusType2["OutOfDateRoots"] = 10] = "OutOfDateRoots";
UpToDateStatusType2[UpToDateStatusType2["UpstreamOutOfDate"] = 11] = "UpstreamOutOfDate";
UpToDateStatusType2[UpToDateStatusType2["UpstreamBlocked"] = 12] = "UpstreamBlocked";
UpToDateStatusType2[UpToDateStatusType2["ComputingUpstream"] = 13] = "ComputingUpstream";
UpToDateStatusType2[UpToDateStatusType2["TsVersionOutputOfDate"] = 14] = "TsVersionOutputOfDate";
UpToDateStatusType2[UpToDateStatusType2["UpToDateWithInputFileText"] = 15] = "UpToDateWithInputFileText";
UpToDateStatusType2[UpToDateStatusType2["ContainerOnly"] = 16] = "ContainerOnly";
UpToDateStatusType2[UpToDateStatusType2["ForceBuild"] = 17] = "ForceBuild";
return UpToDateStatusType2;
})(UpToDateStatusType || {});
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);
var maximumDate = /* @__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];
});
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()
);
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 Map(
getBuildOrderFromAnyBuildOrder(buildOrder).map(
(resolved) => [toResolvedConfigFilePath(state, resolved), true]
)
);
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);
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, reloadLevel) {
const value = projectPendingBuild.get(proj);
if (value === void 0) {
projectPendingBuild.set(proj, reloadLevel);
} else if (value < reloadLevel) {
projectPendingBuild.set(proj, reloadLevel);
}
}
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 /* None */
)
);
if (cancellationToken) {
cancellationToken.throwIfCancellationRequested();
}
}
var InvalidatedProjectKind = /* @__PURE__ */ ((InvalidatedProjectKind2) => {
InvalidatedProjectKind2[InvalidatedProjectKind2["Build"] = 0] = "Build";
InvalidatedProjectKind2[InvalidatedProjectKind2["UpdateBundle"] = 1] = "UpdateBundle";
InvalidatedProjectKind2[InvalidatedProjectKind2["UpdateOutputFileStamps"] = 2] = "UpdateOutputFileStamps";
return InvalidatedProjectKind2;
})(InvalidatedProjectKind || {});
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: 2 /* 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(kind, state, project, projectPath, projectIndex, config, buildOrder) {
let step = kind === 0 /* Build */ ? 0 /* CreateProgram */ : 4 /* EmitBundle */;
let program;
let buildResult;
let invalidatedProjectOfBundle;
return kind === 0 /* Build */ ? {
kind,
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(2 /* SemanticDiagnostics */, cancellationToken);
if (step === 5 /* EmitBuildInfo */) {
return emitBuildInfo(writeFile2, cancellationToken);
}
if (step !== 3 /* Emit */)
return void 0;
return emit(writeFile2, cancellationToken, customTransformers);
},
done
} : {
kind,
project,
projectPath,
buildOrder,
getCompilerOptions: () => config.options,
getCurrentDirectory: () => state.compilerHost.getCurrentDirectory(),
emit: (writeFile2, customTransformers) => {
if (step !== 4 /* EmitBundle */)
return invalidatedProjectOfBundle;
return emitBundle(writeFile2, customTransformers);
},
done
};
function done(cancellationToken, writeFile2, customTransformers) {
executeSteps(8 /* Done */, cancellationToken, writeFile2, customTransformers);
if (kind === 0 /* Build */)
mark("SolutionBuilder::Projects built");
else
mark("SolutionBuilder::Bundles updated");
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;
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 = 7 /* 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 = 7 /* 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) {
state.lastCachedPackageJsonLookups.set(projectPath, state.moduleResolutionCache && map(
state.moduleResolutionCache.getPackageJsonInfoCache().entries(),
([path, data]) => [state.host.realpath && data ? toPath2(state, state.host.realpath(path)) : path, data]
));
state.builderPrograms.set(projectPath, program);
}
step++;
}
function handleDiagnostics(diagnostics, errorFlags, errorType) {
if (diagnostics.length) {
({ buildResult, step } = buildErrors(
state,
projectPath,
program,
config,
diagnostics,
errorFlags,
errorType
));
} else {
step++;
}
}
function getSyntaxDiagnostics(cancellationToken) {
Debug.assertIsDefined(program);
handleDiagnostics(
[
...program.getConfigFileParsingDiagnostics(),
...program.getOptionsDiagnostics(cancellationToken),
...program.getGlobalDiagnostics(cancellationToken),
...program.getSyntacticDiagnostics(
/*sourceFile*/
void 0,
cancellationToken
)
],
8 /* SyntaxErrors */,
"Syntactic"
);
}
function getSemanticDiagnostics(cancellationToken) {
handleDiagnostics(
Debug.checkDefined(program).getSemanticDiagnostics(
/*sourceFile*/
void 0,
cancellationToken
),
16 /* TypeErrors */,
"Semantic"
);
}
function emit(writeFileCallback, cancellationToken, customTransformers) {
var _a, _b, _c;
Debug.assertIsDefined(program);
Debug.assert(step === 3 /* Emit */);
const saved = program.saveEmitState();
let declDiagnostics;
const reportDeclarationDiagnostics = (d) => (declDiagnostics || (declDiagnostics = [])).push(d);
const outputFiles = [];
const { emitResult } = emitFilesAndReportErrors(
program,
reportDeclarationDiagnostics,
/*write*/
void 0,
/*reportSummary*/
void 0,
(name, text, writeByteOrderMark, _onError, _sourceFiles, data) => outputFiles.push({ name, text, writeByteOrderMark, data }),
cancellationToken,
/*emitOnlyDtsFiles*/
false,
customTransformers || ((_b = (_a = state.host).getCustomTransformers) == null ? void 0 : _b.call(_a, project))
);
if (declDiagnostics) {
program.restoreEmitState(saved);
({ buildResult, step } = buildErrors(
state,
projectPath,
program,
config,
declDiagnostics,
32 /* DeclarationEmitErrors */,
"Declaration file"
));
return {
emitSkipped: true,
diagnostics: emitResult.diagnostics
};
}
const { host, compilerHost } = state;
const resultFlags = ((_c = program.hasChangedEmitSignature) == null ? void 0 : _c.call(program)) ? 0 /* None */ : 2 /* DeclarationOutputUnchanged */;
const emitterDiagnostics = createDiagnosticCollection();
const emittedOutputs = /* @__PURE__ */ new Map();
const options = program.getCompilerOptions();
const isIncremental = isIncrementalCompilation(options);
let outputTimeStampMap;
let now;
outputFiles.forEach(({ name, text, writeByteOrderMark, data }) => {
const path = toPath2(state, name);
emittedOutputs.set(toPath2(state, name), name);
if (data == null ? void 0 : data.buildInfo)
setBuildInfo(state, data.buildInfo, projectPath, options, resultFlags);
const modifiedTime = (data == null ? void 0 : data.differsOnlyInMap) ? getModifiedTime(state.host, name) : void 0;
writeFile(writeFileCallback ? { writeFile: writeFileCallback } : compilerHost, emitterDiagnostics, name, text, writeByteOrderMark);
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)));
}
});
finishEmit(
emitterDiagnostics,
emittedOutputs,
outputFiles.length ? outputFiles[0].name : getFirstProjectOutput(config, !host.useCaseSensitiveFileNames()),
resultFlags
);
return emitResult;
}
function emitBuildInfo(writeFileCallback, cancellationToken) {
Debug.assertIsDefined(program);
Debug.assert(step === 5 /* EmitBuildInfo */);
const emitResult = program.emitBuildInfo((name, text, writeByteOrderMark, onError, sourceFiles, data) => {
if (data == null ? void 0 : data.buildInfo)
setBuildInfo(state, data.buildInfo, projectPath, program.getCompilerOptions(), 2 /* DeclarationOutputUnchanged */);
if (writeFileCallback)
writeFileCallback(name, text, writeByteOrderMark, onError, sourceFiles, data);
else
state.compilerHost.writeFile(name, text, writeByteOrderMark, onError, sourceFiles, data);
}, cancellationToken);
if (emitResult.diagnostics.length) {
reportErrors(state, emitResult.diagnostics);
state.diagnostics.set(projectPath, [...state.diagnostics.get(projectPath), ...emitResult.diagnostics]);
buildResult = 64 /* EmitErrors */ & buildResult;
}
if (emitResult.emittedFiles && state.write) {
emitResult.emittedFiles.forEach((name) => listEmittedFile(state, config, name));
}
afterProgramDone(state, program, config);
step = 7 /* QueueReferencingProjects */;
return emitResult;
}
function finishEmit(emitterDiagnostics, emittedOutputs, oldestOutputFileName, resultFlags) {
const emitDiagnostics = emitterDiagnostics.getDiagnostics();
if (emitDiagnostics.length) {
({ buildResult, step } = buildErrors(
state,
projectPath,
program,
config,
emitDiagnostics,
64 /* EmitErrors */,
"Emit"
));
return emitDiagnostics;
}
if (state.write) {
emittedOutputs.forEach((name) => listEmittedFile(state, config, name));
}
updateOutputTimestampsWorker(state, config, projectPath, Diagnostics.Updating_unchanged_output_timestamps_of_project_0, emittedOutputs);
state.diagnostics.delete(projectPath);
state.projectStatus.set(projectPath, {
type: 1 /* UpToDate */,
oldestOutputFileName
});
afterProgramDone(state, program, config);
step = 7 /* QueueReferencingProjects */;
buildResult = resultFlags;
return emitDiagnostics;
}
function emitBundle(writeFileCallback, customTransformers) {
var _a, _b, _c, _d;
Debug.assert(kind === 1 /* UpdateBundle */);
if (state.options.dry) {
reportStatus(state, Diagnostics.A_non_dry_build_would_update_output_of_project_0, project);
buildResult = 1 /* Success */;
step = 7 /* QueueReferencingProjects */;
return void 0;
}
if (state.options.verbose)
reportStatus(state, Diagnostics.Updating_output_of_project_0, project);
const { compilerHost } = state;
state.projectCompilerOptions = config.options;
(_b = (_a = state.host).beforeEmitBundle) == null ? void 0 : _b.call(_a, config);
const outputFiles = emitUsingBuildInfo(
config,
compilerHost,
(ref) => {
const refName = resolveProjectName(state, ref.path);
return parseConfigFile(state, refName, toResolvedConfigFilePath(state, refName));
},
customTransformers || ((_d = (_c = state.host).getCustomTransformers) == null ? void 0 : _d.call(_c, project))
);
if (isString(outputFiles)) {
reportStatus(state, Diagnostics.Cannot_update_output_of_project_0_because_there_was_error_reading_file_1, project, relName(state, outputFiles));
step = 6 /* BuildInvalidatedProjectOfBundle */;
return invalidatedProjectOfBundle = createBuildOrUpdateInvalidedProject(
0 /* Build */,
state,
project,
projectPath,
projectIndex,
config,
buildOrder
);
}
Debug.assert(!!outputFiles.length);
const emitterDiagnostics = createDiagnosticCollection();
const emittedOutputs = /* @__PURE__ */ new Map();
let resultFlags = 2 /* DeclarationOutputUnchanged */;
const existingBuildInfo = state.buildInfoCache.get(projectPath).buildInfo || void 0;
outputFiles.forEach(({ name, text, writeByteOrderMark, data }) => {
var _a2, _b2;
emittedOutputs.set(toPath2(state, name), name);
if (data == null ? void 0 : data.buildInfo) {
if (((_a2 = data.buildInfo.program) == null ? void 0 : _a2.outSignature) !== ((_b2 = existingBuildInfo == null ? void 0 : existingBuildInfo.program) == null ? void 0 : _b2.outSignature)) {
resultFlags &= ~2 /* DeclarationOutputUnchanged */;
}
setBuildInfo(state, data.buildInfo, projectPath, config.options, resultFlags);
}
writeFile(writeFileCallback ? { writeFile: writeFileCallback } : compilerHost, emitterDiagnostics, name, text, writeByteOrderMark);
});
const emitDiagnostics = finishEmit(
emitterDiagnostics,
emittedOutputs,
outputFiles[0].name,
resultFlags
);
return { emitSkipped: false, diagnostics: emitDiagnostics };
}
function executeSteps(till, cancellationToken, writeFile2, customTransformers) {
while (step <= till && step < 8 /* Done */) {
const currentStep = step;
switch (step) {
case 0 /* CreateProgram */:
createProgram2();
break;
case 1 /* SyntaxDiagnostics */:
getSyntaxDiagnostics(cancellationToken);
break;
case 2 /* SemanticDiagnostics */:
getSemanticDiagnostics(cancellationToken);
break;
case 3 /* Emit */:
emit(writeFile2, cancellationToken, customTransformers);
break;
case 5 /* EmitBuildInfo */:
emitBuildInfo(writeFile2, cancellationToken);
break;
case 4 /* EmitBundle */:
emitBundle(writeFile2, customTransformers);
break;
case 6 /* BuildInvalidatedProjectOfBundle */:
Debug.checkDefined(invalidatedProjectOfBundle).done(cancellationToken, writeFile2, customTransformers);
step = 8 /* Done */;
break;
case 7 /* QueueReferencingProjects */:
queueReferencingProjects(state, project, projectPath, projectIndex, config, buildOrder, Debug.checkDefined(buildResult));
step++;
break;
case 8 /* Done */:
default:
assertType(step);
}
Debug.assert(step > currentStep);
}
}
}
function needsBuild({ options }, status, config) {
if (status.type !== 3 /* OutOfDateWithPrepend */ || options.force)
return true;
return config.fileNames.length === 0 || !!getConfigFileParsingDiagnostics(config).length || !isIncrementalCompilation(config.options);
}
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 reloadLevel = state.projectPendingBuild.get(projectPath);
if (reloadLevel === 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 (reloadLevel === 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 (reloadLevel === 1 /* Partial */) {
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: 2 /* 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: needsBuild(state, status, config) ? 0 /* Build */ : 1 /* UpdateBundle */,
status,
project,
projectPath,
projectIndex,
config
};
}
return void 0;
}
function createInvalidatedProjectWithInfo(state, info, buildOrder) {
verboseReportProjectStatus(state, info.project, info.status);
return info.kind !== 2 /* UpdateOutputFileStamps */ ? createBuildOrUpdateInvalidedProject(
info.kind,
state,
info.project,
info.projectPath,
info.projectIndex,
info.config,
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 listEmittedFile({ write }, proj, file) {
if (write && proj.options.listEmittedFiles) {
write(`TSFILE: ${file}`);
}
}
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, config) {
if (program) {
if (state.write)
listFiles(program, state.write);
if (state.host.afterProgramEmitAndDiagnostics) {
state.host.afterProgramEmitAndDiagnostics(program);
}
program.releaseProgram();
} else if (state.host.afterEmitBundle) {
state.host.afterEmitBundle(config);
}
state.projectCompilerOptions = state.baseCompilerOptions;
}
function buildErrors(state, resolvedPath, program, config, diagnostics, buildResult, errorType) {
const canEmitBuildInfo = program && !outFile(program.getCompilerOptions());
reportAndStoreErrors(state, resolvedPath, diagnostics);
state.projectStatus.set(resolvedPath, { type: 0 /* Unbuildable */, reason: `${errorType} errors` });
if (canEmitBuildInfo)
return { buildResult, step: 5 /* EmitBuildInfo */ };
afterProgramDone(state, program, config);
return { buildResult, step: 7 /* QueueReferencingProjects */ };
}
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 setBuildInfo(state, buildInfo, resolvedConfigPath, options, resultFlags) {
const buildInfoPath = getTsBuildInfoEmitOutputFilePath(options);
const existing = getBuildInfoCacheEntry(state, buildInfoPath, resolvedConfigPath);
const modifiedTime = getCurrentTime(state.host);
if (existing) {
existing.buildInfo = buildInfo;
existing.modifiedTime = modifiedTime;
if (!(resultFlags & 2 /* DeclarationOutputUnchanged */))
existing.latestChangedDtsTime = modifiedTime;
} else {
state.buildInfoCache.set(resolvedConfigPath, {
path: toPath2(state, buildInfoPath),
buildInfo,
modifiedTime,
latestChangedDtsTime: resultFlags & 2 /* DeclarationOutputUnchanged */ ? void 0 : modifiedTime
});
}
}
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: 6 /* OutOfDateWithSelf */,
outOfDateOutputFileName: oldestOutputFileName,
newerInputFileName: configFile
};
}
}
function getUpToDateStatusWorker(state, project, resolvedPath) {
var _a, _b;
if (!project.fileNames.length && !canJsonReportNoInputFiles(project.raw)) {
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 (refStatus.type === 0 /* Unbuildable */ || refStatus.type === 12 /* UpstreamBlocked */) {
return {
type: 12 /* UpstreamBlocked */,
upstreamProjectName: ref.path,
upstreamProjectBlocked: refStatus.type === 12 /* UpstreamBlocked */
};
}
if (refStatus.type !== 1 /* UpToDate */) {
return {
type: 11 /* UpstreamOutOfDate */,
upstreamProjectName: ref.path
};
}
if (!force)
(referenceStatuses || (referenceStatuses = [])).push({ ref, refStatus, resolvedRefPath, resolvedConfig });
}
}
if (force)
return { type: 17 /* ForceBuild */ };
const { host } = state;
const buildInfoPath = getTsBuildInfoEmitOutputFilePath(project.options);
let oldestOutputFileName;
let oldestOutputFileTime = maximumDate;
let buildInfoTime;
let buildInfoProgram;
let buildInfoVersionMap;
if (buildInfoPath) {
const buildInfoCacheEntry2 = getBuildInfoCacheEntry(state, buildInfoPath, resolvedPath);
buildInfoTime = (buildInfoCacheEntry2 == null ? void 0 : buildInfoCacheEntry2.modifiedTime) || getModifiedTime(host, buildInfoPath);
if (buildInfoTime === missingFileModifiedTime) {
if (!buildInfoCacheEntry2) {
state.buildInfoCache.set(resolvedPath, {
path: toPath2(state, buildInfoPath),
buildInfo: false,
modifiedTime: buildInfoTime
});
}
return {
type: 4 /* OutputMissing */,
missingOutputFileName: buildInfoPath
};
}
const buildInfo = getBuildInfo3(state, buildInfoPath, resolvedPath, buildInfoTime);
if (!buildInfo) {
return {
type: 5 /* ErrorReadingFile */,
fileName: buildInfoPath
};
}
if ((buildInfo.bundle || buildInfo.program) && buildInfo.version !== version) {
return {
type: 14 /* TsVersionOutputOfDate */,
version: buildInfo.version
};
}
if (buildInfo.program) {
if (((_a = buildInfo.program.changeFileSet) == null ? void 0 : _a.length) || (!project.options.noEmit ? (_b = buildInfo.program.affectedFilesPendingEmit) == null ? void 0 : _b.length : some(buildInfo.program.semanticDiagnosticsPerFile, isArray))) {
return {
type: 8 /* OutOfDateBuildInfo */,
buildInfoFile: buildInfoPath
};
}
if (!project.options.noEmit && getPendingEmitKind(project.options, buildInfo.program.options || {})) {
return {
type: 9 /* OutOfDateOptions */,
buildInfoFile: buildInfoPath
};
}
buildInfoProgram = buildInfo.program;
}
oldestOutputFileTime = buildInfoTime;
oldestOutputFileName = buildInfoPath;
}
let newestInputFileName = void 0;
let newestInputFileTime = minimumDate;
let pseudoInputUpToDate = false;
const seenRoots = /* @__PURE__ */ new Set();
for (const inputFile of project.fileNames) {
const inputTime = getModifiedTime2(state, inputFile);
if (inputTime === missingFileModifiedTime) {
return {
type: 0 /* Unbuildable */,
reason: `${inputFile} does not exist`
};
}
if (buildInfoTime && buildInfoTime < inputTime) {
let version2;
let currentVersion;
if (buildInfoProgram) {
if (!buildInfoVersionMap)
buildInfoVersionMap = getBuildInfoFileVersionMap(buildInfoProgram, buildInfoPath, host);
version2 = buildInfoVersionMap.fileInfos.get(toPath2(state, inputFile));
const text = version2 ? state.readFileWithCache(inputFile) : void 0;
currentVersion = text !== void 0 ? getSourceFileVersionAsHashFromText(host, text) : void 0;
if (version2 && version2 === currentVersion)
pseudoInputUpToDate = true;
}
if (!version2 || version2 !== currentVersion) {
return {
type: 6 /* OutOfDateWithSelf */,
outOfDateOutputFileName: buildInfoPath,
newerInputFileName: inputFile
};
}
}
if (inputTime > newestInputFileTime) {
newestInputFileName = inputFile;
newestInputFileTime = inputTime;
}
if (buildInfoProgram)
seenRoots.add(toPath2(state, inputFile));
}
if (buildInfoProgram) {
if (!buildInfoVersionMap)
buildInfoVersionMap = getBuildInfoFileVersionMap(buildInfoProgram, buildInfoPath, host);
for (const existingRoot of buildInfoVersionMap.roots) {
if (!seenRoots.has(existingRoot)) {
return {
type: 10 /* OutOfDateRoots */,
buildInfoFile: buildInfoPath,
inputFile: existingRoot
};
}
}
}
if (!buildInfoPath) {
const outputs = getAllProjectOutputs(project, !host.useCaseSensitiveFileNames());
const outputTimeStampMap = getOutputTimeStampMap(state, resolvedPath);
for (const output of outputs) {
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: 4 /* OutputMissing */,
missingOutputFileName: output
};
}
if (outputTime < newestInputFileTime) {
return {
type: 6 /* OutOfDateWithSelf */,
outOfDateOutputFileName: output,
newerInputFileName: newestInputFileName
};
}
if (outputTime < oldestOutputFileTime) {
oldestOutputFileTime = outputTime;
oldestOutputFileName = output;
}
}
}
const buildInfoCacheEntry = state.buildInfoCache.get(resolvedPath);
let pseudoUpToDate = false;
let usesPrepend = false;
let upstreamChangedProject;
if (referenceStatuses) {
for (const { ref, refStatus, resolvedConfig, resolvedRefPath } of referenceStatuses) {
usesPrepend = usesPrepend || !!ref.prepend;
if (refStatus.newestInputFileTime && refStatus.newestInputFileTime <= oldestOutputFileTime) {
continue;
}
if (buildInfoCacheEntry && hasSameBuildInfo(state, buildInfoCacheEntry, resolvedRefPath)) {
return {
type: 7 /* OutOfDateWithUpstream */,
outOfDateOutputFileName: buildInfoPath,
newerProjectName: ref.path
};
}
const newestDeclarationFileContentChangedTime = getLatestChangedDtsTime(state, resolvedConfig.options, resolvedRefPath);
if (newestDeclarationFileContentChangedTime && newestDeclarationFileContentChangedTime <= oldestOutputFileTime) {
pseudoUpToDate = true;
upstreamChangedProject = ref.path;
continue;
}
Debug.assert(oldestOutputFileName !== void 0, "Should have an oldest output filename here");
return {
type: 7 /* 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 dependentPackageFileStatus = forEach(
state.lastCachedPackageJsonLookups.get(resolvedPath) || emptyArray,
([path]) => checkConfigFileUpToDateStatus(state, path, oldestOutputFileTime, oldestOutputFileName)
);
if (dependentPackageFileStatus)
return dependentPackageFileStatus;
if (usesPrepend && pseudoUpToDate) {
return {
type: 3 /* OutOfDateWithPrepend */,
outOfDateOutputFileName: oldestOutputFileName,
newerProjectName: upstreamChangedProject
};
}
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: "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);
if (buildInfoPath) {
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 (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 && entry.buildInfo.program && entry.buildInfo.program.latestChangedDtsFile ? state.host.getModifiedTime(getNormalizedAbsolutePath(entry.buildInfo.program.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 (buildResult & 124 /* 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 */) {
if (ref.prepend) {
state.projectStatus.set(nextProjectPath, {
type: 3 /* OutOfDateWithPrepend */,
outOfDateOutputFileName: status.oldestOutputFileName,
newerProjectName: project
});
} else {
status.type = 2 /* UpToDateWithUpstreamTypes */;
}
break;
}
case 15 /* UpToDateWithInputFileText */:
case 2 /* UpToDateWithUpstreamTypes */:
case 3 /* OutOfDateWithPrepend */:
if (!(buildResult & 2 /* DeclarationOutputUnchanged */)) {
state.projectStatus.set(nextProjectPath, {
type: 7 /* OutOfDateWithUpstream */,
outOfDateOutputFileName: status.type === 3 /* OutOfDateWithPrepend */ ? status.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 /* None */);
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 /* None */);
}
}
}
}
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, reloadLevel) {
if (state.host.getParsedCommandLine && reloadLevel === 1 /* Partial */) {
reloadLevel = 2 /* Full */;
}
if (reloadLevel === 2 /* Full */) {
state.configFileCache.delete(resolved);
state.buildOrder = void 0;
}
state.needsSummary = true;
clearProjectStatus(state, resolved);
addProjToQueue(state, resolved, reloadLevel);
enableCache(state);
}
function invalidateProjectAndScheduleBuilds(state, resolvedPath, reloadLevel) {
state.reportFileChangeDetected = true;
invalidateProject(state, resolvedPath, reloadLevel);
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 !== 2 /* UpdateOutputFileStamps */ && (changeDetected || projectsBuilt === 5)) {
scheduleBuildInvalidatedProject(
state,
100,
/*changeDetected*/
false
);
return;
}
const project = createInvalidatedProjectWithInfo(state, info, buildOrder);
project.done();
if (info.kind !== 2 /* 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),
new Map(Object.entries(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 /* Partial */);
},
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),
arrayToMap(parsed.fileNames, (fileName) => toPath2(state, fileName)),
{
createNewValue: (_path, input) => watchFile(
state,
input,
() => invalidateProjectAndScheduleBuilds(state, resolvedPath, 0 /* None */),
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),
new Map(state.lastCachedPackageJsonLookups.get(resolvedPath)),
{
createNewValue: (path, _input) => watchFile(
state,
path,
() => invalidateProjectAndScheduleBuilds(state, resolvedPath, 0 /* None */),
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, reloadLevel) => invalidateProject(state, configFilePath, reloadLevel || 0 /* None */),
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 6 /* 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 7 /* 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 4 /* 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 5 /* 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 8 /* OutOfDateBuildInfo */:
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 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 3 /* OutOfDateWithPrepend */:
return reportStatus(
state,
Diagnostics.Project_0_is_out_of_date_because_output_of_its_dependency_1_has_changed,
relName(state, configFileName),
relName(state, status.newerProjectName)
);
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.Failed_to_parse_file_0_Colon_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 */:
case 13 /* ComputingUpstream */:
break;
default:
assertType(status);
}
}
function verboseReportProjectStatus(state, configFileName, status) {
if (state.options.verbose) {
reportUpToDateStatus(state, configFileName, status);
}
}
// src/jsTyping/_namespaces/ts.JsTyping.ts
var ts_JsTyping_exports = {};
__export(ts_JsTyping_exports, {
NameValidationResult: () => NameValidationResult,
discoverTypings: () => discoverTypings,
isTypingUpToDate: () => isTypingUpToDate,
loadSafeList: () => loadSafeList,
loadTypesMap: () => loadTypesMap,
nodeCoreModuleList: () => nodeCoreModuleList,
nodeCoreModules: () => nodeCoreModules,
nonRelativeModuleNameForTypingCache: () => nonRelativeModuleNameForTypingCache,
prefixedNodeCoreModuleList: () => prefixedNodeCoreModuleList,
renderPackageNameValidationFailure: () => renderPackageNameValidationFailure,
validatePackageName: () => validatePackageName
});
// src/jsTyping/jsTyping.ts
function isTypingUpToDate(cachedTyping, availableTypingVersions) {
const availableVersion = new Version(getProperty(availableTypingVersions, `ts${versionMajorMinor}`) || getProperty(availableTypingVersions, "latest"));
return availableVersion.compareTo(cachedTyping.version) <= 0;
}
var unprefixedNodeCoreModuleList = [
"assert",
"assert/strict",
"async_hooks",
"buffer",
"child_process",
"cluster",
"console",
"constants",
"crypto",
"dgram",
"diagnostics_channel",
"dns",
"dns/promises",
"domain",
"events",
"fs",
"fs/promises",
"http",
"https",
"http2",
"inspector",
"module",
"net",
"os",
"path",
"perf_hooks",
"process",
"punycode",
"querystring",
"readline",
"repl",
"stream",
"stream/promises",
"string_decoder",
"timers",
"timers/promises",
"tls",
"trace_events",
"tty",
"url",
"util",
"util/types",
"v8",
"vm",
"wasi",
"worker_threads",
"zlib"
];
var prefixedNodeCoreModuleList = unprefixedNodeCoreModuleList.map((name) => `node:${name}`);
var nodeCoreModuleList = [...unprefixedNodeCoreModuleList, ...prefixedNodeCoreModuleList];
var nodeCoreModules = new Set(nodeCoreModuleList);
function nonRelativeModuleNameForTypingCache(moduleName) {
return nodeCoreModules.has(moduleName) ? "node" : moduleName;
}
function loadSafeList(host, safeListPath) {
const result = readConfigFile(safeListPath, (path) => host.readFile(path));
return new Map(Object.entries(result.config));
}
function loadTypesMap(host, typesMapPath) {
var _a;
const result = readConfigFile(typesMapPath, (path) => host.readFile(path));
if ((_a = result.config) == null ? void 0 : _a.simpleMap) {
return new Map(Object.entries(result.config.simpleMap));
}
return void 0;
}
function discoverTypings(host, log, fileNames, projectRootPath, safeList, packageNameToTypingLocation, typeAcquisition, unresolvedImports, typesRegistry, compilerOptions) {
if (!typeAcquisition || !typeAcquisition.enable) {
return { cachedTypingPaths: [], newTypingNames: [], filesToWatch: [] };
}
const inferredTypings = /* @__PURE__ */ new Map();
fileNames = mapDefined(fileNames, (fileName) => {
const path = normalizePath(fileName);
if (hasJSFileExtension(path)) {
return path;
}
});
const filesToWatch = [];
if (typeAcquisition.include)
addInferredTypings(typeAcquisition.include, "Explicitly included types");
const exclude = typeAcquisition.exclude || [];
if (!compilerOptions.types) {
const possibleSearchDirs = new Set(fileNames.map(getDirectoryPath));
possibleSearchDirs.add(projectRootPath);
possibleSearchDirs.forEach((searchDir) => {
getTypingNames(searchDir, "bower.json", "bower_components", filesToWatch);
getTypingNames(searchDir, "package.json", "node_modules", filesToWatch);
});
}
if (!typeAcquisition.disableFilenameBasedTypeAcquisition) {
getTypingNamesFromSourceFileNames(fileNames);
}
if (unresolvedImports) {
const module2 = deduplicate(
unresolvedImports.map(nonRelativeModuleNameForTypingCache),
equateStringsCaseSensitive,
compareStringsCaseSensitive
);
addInferredTypings(module2, "Inferred typings from unresolved imports");
}
packageNameToTypingLocation.forEach((typing, name) => {
const registryEntry = typesRegistry.get(name);
if (inferredTypings.has(name) && inferredTypings.get(name) === void 0 && registryEntry !== void 0 && isTypingUpToDate(typing, registryEntry)) {
inferredTypings.set(name, typing.typingLocation);
}
});
for (const excludeTypingName of exclude) {
const didDelete = inferredTypings.delete(excludeTypingName);
if (didDelete && log)
log(`Typing for ${excludeTypingName} is in exclude list, will be ignored.`);
}
const newTypingNames = [];
const cachedTypingPaths = [];
inferredTypings.forEach((inferred, typing) => {
if (inferred !== void 0) {
cachedTypingPaths.push(inferred);
} else {
newTypingNames.push(typing);
}
});
const result = { cachedTypingPaths, newTypingNames, filesToWatch };
if (log)
log(`Result: ${JSON.stringify(result)}`);
return result;
function addInferredTyping(typingName) {
if (!inferredTypings.has(typingName)) {
inferredTypings.set(typingName, void 0);
}
}
function addInferredTypings(typingNames, message) {
if (log)
log(`${message}: ${JSON.stringify(typingNames)}`);
forEach(typingNames, addInferredTyping);
}
function getTypingNames(projectRootPath2, manifestName, modulesDirName, filesToWatch2) {
const manifestPath = combinePaths(projectRootPath2, manifestName);
let manifest;
let manifestTypingNames;
if (host.fileExists(manifestPath)) {
filesToWatch2.push(manifestPath);
manifest = readConfigFile(manifestPath, (path) => host.readFile(path)).config;
manifestTypingNames = flatMap([manifest.dependencies, manifest.devDependencies, manifest.optionalDependencies, manifest.peerDependencies], getOwnKeys);
addInferredTypings(manifestTypingNames, `Typing names in '${manifestPath}' dependencies`);
}
const packagesFolderPath = combinePaths(projectRootPath2, modulesDirName);
filesToWatch2.push(packagesFolderPath);
if (!host.directoryExists(packagesFolderPath)) {
return;
}
const packageNames = [];
const dependencyManifestNames = manifestTypingNames ? manifestTypingNames.map((typingName) => combinePaths(packagesFolderPath, typingName, manifestName)) : host.readDirectory(
packagesFolderPath,
[".json" /* Json */],
/*excludes*/
void 0,
/*includes*/
void 0,
/*depth*/
3
).filter((manifestPath2) => {
if (getBaseFileName(manifestPath2) !== manifestName) {
return false;
}
const pathComponents2 = getPathComponents(normalizePath(manifestPath2));
const isScoped = pathComponents2[pathComponents2.length - 3][0] === "@";
return isScoped && toFileNameLowerCase(pathComponents2[pathComponents2.length - 4]) === modulesDirName || // `node_modules/@foo/bar`
!isScoped && toFileNameLowerCase(pathComponents2[pathComponents2.length - 3]) === modulesDirName;
});
if (log)
log(`Searching for typing names in ${packagesFolderPath}; all files: ${JSON.stringify(dependencyManifestNames)}`);
for (const manifestPath2 of dependencyManifestNames) {
const normalizedFileName = normalizePath(manifestPath2);
const result2 = readConfigFile(normalizedFileName, (path) => host.readFile(path));
const manifest2 = result2.config;
if (!manifest2.name) {
continue;
}
const ownTypes = manifest2.types || manifest2.typings;
if (ownTypes) {
const absolutePath = getNormalizedAbsolutePath(ownTypes, getDirectoryPath(normalizedFileName));
if (host.fileExists(absolutePath)) {
if (log)
log(` Package '${manifest2.name}' provides its own types.`);
inferredTypings.set(manifest2.name, absolutePath);
} else {
if (log)
log(` Package '${manifest2.name}' provides its own types but they are missing.`);
}
} else {
packageNames.push(manifest2.name);
}
}
addInferredTypings(packageNames, " Found package names");
}
function getTypingNamesFromSourceFileNames(fileNames2) {
const fromFileNames = mapDefined(fileNames2, (j) => {
if (!hasJSFileExtension(j))
return void 0;
const inferredTypingName = removeFileExtension(toFileNameLowerCase(getBaseFileName(j)));
const cleanedTypingName = removeMinAndVersionNumbers(inferredTypingName);
return safeList.get(cleanedTypingName);
});
if (fromFileNames.length) {
addInferredTypings(fromFileNames, "Inferred typings from file names");
}
const hasJsxFile = some(fileNames2, (f) => fileExtensionIs(f, ".jsx" /* Jsx */));
if (hasJsxFile) {
if (log)
log(`Inferred 'react' typings due to presence of '.jsx' extension`);
addInferredTyping("react");
}
}
}
var NameValidationResult = /* @__PURE__ */ ((NameValidationResult2) => {
NameValidationResult2[NameValidationResult2["Ok"] = 0] = "Ok";
NameValidationResult2[NameValidationResult2["EmptyName"] = 1] = "EmptyName";
NameValidationResult2[NameValidationResult2["NameTooLong"] = 2] = "NameTooLong";
NameValidationResult2[NameValidationResult2["NameStartsWithDot"] = 3] = "NameStartsWithDot";
NameValidationResult2[NameValidationResult2["NameStartsWithUnderscore"] = 4] = "NameStartsWithUnderscore";
NameValidationResult2[NameValidationResult2["NameContainsNonURISafeCharacters"] = 5] = "NameContainsNonURISafeCharacters";
return NameValidationResult2;
})(NameValidationResult || {});
var maxPackageNameLength = 214;
function validatePackageName(packageName) {
return validatePackageNameWorker(
packageName,
/*supportScopedPackage*/
true
);
}
function validatePackageNameWorker(packageName, supportScopedPackage) {
if (!packageName) {
return 1 /* EmptyName */;
}
if (packageName.length > maxPackageNameLength) {
return 2 /* NameTooLong */;
}
if (packageName.charCodeAt(0) === 46 /* dot */) {
return 3 /* NameStartsWithDot */;
}
if (packageName.charCodeAt(0) === 95 /* _ */) {
return 4 /* NameStartsWithUnderscore */;
}
if (supportScopedPackage) {
const matches = /^@([^/]+)\/([^/]+)$/.exec(packageName);
if (matches) {
const scopeResult = validatePackageNameWorker(
matches[1],
/*supportScopedPackage*/
false
);
if (scopeResult !== 0 /* Ok */) {
return { name: matches[1], isScopeName: true, result: scopeResult };
}
const packageResult = validatePackageNameWorker(
matches[2],
/*supportScopedPackage*/
false
);
if (packageResult !== 0 /* Ok */) {
return { name: matches[2], isScopeName: false, result: packageResult };
}
return 0 /* Ok */;
}
}
if (encodeURIComponent(packageName) !== packageName) {
return 5 /* NameContainsNonURISafeCharacters */;
}
return 0 /* Ok */;
}
function renderPackageNameValidationFailure(result, typing) {
return typeof result === "object" ? renderPackageNameValidationFailureWorker(typing, result.result, result.name, result.isScopeName) : renderPackageNameValidationFailureWorker(
typing,
result,
typing,
/*isScopeName*/
false
);
}
function renderPackageNameValidationFailureWorker(typing, result, name, isScopeName) {
const kind = isScopeName ? "Scope" : "Package";
switch (result) {
case 1 /* EmptyName */:
return `'${typing}':: ${kind} name '${name}' cannot be empty`;
case 2 /* NameTooLong */:
return `'${typing}':: ${kind} name '${name}' should be less than ${maxPackageNameLength} characters`;
case 3 /* NameStartsWithDot */:
return `'${typing}':: ${kind} name '${name}' cannot start with '.'`;
case 4 /* NameStartsWithUnderscore */:
return `'${typing}':: ${kind} name '${name}' cannot start with '_'`;
case 5 /* NameContainsNonURISafeCharacters */:
return `'${typing}':: ${kind} name '${name}' contains non URI safe characters`;
case 0 /* Ok */:
return Debug.fail();
default:
Debug.assertNever(result);
}
}
// src/jsTyping/shared.ts
var ActionSet = "action::set";
var ActionInvalidate = "action::invalidate";
var ActionPackageInstalled = "action::packageInstalled";
var EventTypesRegistry = "event::typesRegistry";
var EventBeginInstallTypes = "event::beginInstallTypes";
var EventEndInstallTypes = "event::endInstallTypes";
var EventInitializationFailed = "event::initializationFailed";
var ActionWatchTypingLocations = "action::watchTypingLocations";
var Arguments;
((Arguments2) => {
Arguments2.GlobalCacheLocation = "--globalTypingsCacheLocation";
Arguments2.LogFile = "--logFile";
Arguments2.EnableTelemetry = "--enableTelemetry";
Arguments2.TypingSafeListLocation = "--typingSafeListLocation";
Arguments2.TypesMapLocation = "--typesMapLocation";
Arguments2.NpmLocation = "--npmLocation";
Arguments2.ValidateDefaultNpmLocation = "--validateDefaultNpmLocation";
})(Arguments || (Arguments = {}));
function hasArgument(argumentName) {
return sys.args.indexOf(argumentName) >= 0;
}
function findArgument(argumentName) {
const index = sys.args.indexOf(argumentName);
return index >= 0 && index < sys.args.length - 1 ? sys.args[index + 1] : void 0;
}
function nowString() {
const d = /* @__PURE__ */ new Date();
return `${padLeft(d.getHours().toString(), 2, "0")}:${padLeft(d.getMinutes().toString(), 2, "0")}:${padLeft(d.getSeconds().toString(), 2, "0")}.${padLeft(d.getMilliseconds().toString(), 3, "0")}`;
}
// src/services/types.ts
var ScriptSnapshot;
((ScriptSnapshot2) => {
class StringScriptSnapshot {
constructor(text) {
this.text = text;
}
getText(start2, end) {
return start2 === 0 && end === this.text.length ? this.text : this.text.substring(start2, end);
}
getLength() {
return this.text.length;
}
getChangeRange() {
return void 0;
}
}
function fromString(text) {
return new StringScriptSnapshot(text);
}
ScriptSnapshot2.fromString = fromString;
})(ScriptSnapshot || (ScriptSnapshot = {}));
var PackageJsonDependencyGroup = /* @__PURE__ */ ((PackageJsonDependencyGroup2) => {
PackageJsonDependencyGroup2[PackageJsonDependencyGroup2["Dependencies"] = 1] = "Dependencies";
PackageJsonDependencyGroup2[PackageJsonDependencyGroup2["DevDependencies"] = 2] = "DevDependencies";
PackageJsonDependencyGroup2[PackageJsonDependencyGroup2["PeerDependencies"] = 4] = "PeerDependencies";
PackageJsonDependencyGroup2[PackageJsonDependencyGroup2["OptionalDependencies"] = 8] = "OptionalDependencies";
PackageJsonDependencyGroup2[PackageJsonDependencyGroup2["All"] = 15] = "All";
return PackageJsonDependencyGroup2;
})(PackageJsonDependencyGroup || {});
var PackageJsonAutoImportPreference = /* @__PURE__ */ ((PackageJsonAutoImportPreference2) => {
PackageJsonAutoImportPreference2[PackageJsonAutoImportPreference2["Off"] = 0] = "Off";
PackageJsonAutoImportPreference2[PackageJsonAutoImportPreference2["On"] = 1] = "On";
PackageJsonAutoImportPreference2[PackageJsonAutoImportPreference2["Auto"] = 2] = "Auto";
return PackageJsonAutoImportPreference2;
})(PackageJsonAutoImportPreference || {});
var LanguageServiceMode = /* @__PURE__ */ ((LanguageServiceMode2) => {
LanguageServiceMode2[LanguageServiceMode2["Semantic"] = 0] = "Semantic";
LanguageServiceMode2[LanguageServiceMode2["PartialSemantic"] = 1] = "PartialSemantic";
LanguageServiceMode2[LanguageServiceMode2["Syntactic"] = 2] = "Syntactic";
return LanguageServiceMode2;
})(LanguageServiceMode || {});
var emptyOptions = {};
var SemanticClassificationFormat = /* @__PURE__ */ ((SemanticClassificationFormat3) => {
SemanticClassificationFormat3["Original"] = "original";
SemanticClassificationFormat3["TwentyTwenty"] = "2020";
return SemanticClassificationFormat3;
})(SemanticClassificationFormat || {});
var OrganizeImportsMode = /* @__PURE__ */ ((OrganizeImportsMode3) => {
OrganizeImportsMode3["All"] = "All";
OrganizeImportsMode3["SortAndCombine"] = "SortAndCombine";
OrganizeImportsMode3["RemoveUnused"] = "RemoveUnused";
return OrganizeImportsMode3;
})(OrganizeImportsMode || {});
var CompletionTriggerKind = /* @__PURE__ */ ((CompletionTriggerKind4) => {
CompletionTriggerKind4[CompletionTriggerKind4["Invoked"] = 1] = "Invoked";
CompletionTriggerKind4[CompletionTriggerKind4["TriggerCharacter"] = 2] = "TriggerCharacter";
CompletionTriggerKind4[CompletionTriggerKind4["TriggerForIncompleteCompletions"] = 3] = "TriggerForIncompleteCompletions";
return CompletionTriggerKind4;
})(CompletionTriggerKind || {});
var InlayHintKind = /* @__PURE__ */ ((InlayHintKind2) => {
InlayHintKind2["Type"] = "Type";
InlayHintKind2["Parameter"] = "Parameter";
InlayHintKind2["Enum"] = "Enum";
return InlayHintKind2;
})(InlayHintKind || {});
var HighlightSpanKind = /* @__PURE__ */ ((HighlightSpanKind2) => {
HighlightSpanKind2["none"] = "none";
HighlightSpanKind2["definition"] = "definition";
HighlightSpanKind2["reference"] = "reference";
HighlightSpanKind2["writtenReference"] = "writtenReference";
return HighlightSpanKind2;
})(HighlightSpanKind || {});
var IndentStyle = /* @__PURE__ */ ((IndentStyle3) => {
IndentStyle3[IndentStyle3["None"] = 0] = "None";
IndentStyle3[IndentStyle3["Block"] = 1] = "Block";
IndentStyle3[IndentStyle3["Smart"] = 2] = "Smart";
return IndentStyle3;
})(IndentStyle || {});
var SemicolonPreference = /* @__PURE__ */ ((SemicolonPreference3) => {
SemicolonPreference3["Ignore"] = "ignore";
SemicolonPreference3["Insert"] = "insert";
SemicolonPreference3["Remove"] = "remove";
return SemicolonPreference3;
})(SemicolonPreference || {});
function getDefaultFormatCodeSettings(newLineCharacter) {
return {
indentSize: 4,
tabSize: 4,
newLineCharacter: newLineCharacter || "\n",
convertTabsToSpaces: true,
indentStyle: 2 /* Smart */,
insertSpaceAfterConstructor: false,
insertSpaceAfterCommaDelimiter: true,
insertSpaceAfterSemicolonInForStatements: true,
insertSpaceBeforeAndAfterBinaryOperators: true,
insertSpaceAfterKeywordsInControlFlowStatements: true,
insertSpaceAfterFunctionKeywordForAnonymousFunctions: false,
insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis: false,
insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets: false,
insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: true,
insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces: false,
insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces: false,
insertSpaceBeforeFunctionParenthesis: false,
placeOpenBraceOnNewLineForFunctions: false,
placeOpenBraceOnNewLineForControlBlocks: false,
semicolons: "ignore" /* Ignore */,
trimTrailingWhitespace: true,
indentSwitchCase: true
};
}
var testFormatSettings = getDefaultFormatCodeSettings("\n");
var SymbolDisplayPartKind = /* @__PURE__ */ ((SymbolDisplayPartKind2) => {
SymbolDisplayPartKind2[SymbolDisplayPartKind2["aliasName"] = 0] = "aliasName";
SymbolDisplayPartKind2[SymbolDisplayPartKind2["className"] = 1] = "className";
SymbolDisplayPartKind2[SymbolDisplayPartKind2["enumName"] = 2] = "enumName";
SymbolDisplayPartKind2[SymbolDisplayPartKind2["fieldName"] = 3] = "fieldName";
SymbolDisplayPartKind2[SymbolDisplayPartKind2["interfaceName"] = 4] = "interfaceName";
SymbolDisplayPartKind2[SymbolDisplayPartKind2["keyword"] = 5] = "keyword";
SymbolDisplayPartKind2[SymbolDisplayPartKind2["lineBreak"] = 6] = "lineBreak";
SymbolDisplayPartKind2[SymbolDisplayPartKind2["numericLiteral"] = 7] = "numericLiteral";
SymbolDisplayPartKind2[SymbolDisplayPartKind2["stringLiteral"] = 8] = "stringLiteral";
SymbolDisplayPartKind2[SymbolDisplayPartKind2["localName"] = 9] = "localName";
SymbolDisplayPartKind2[SymbolDisplayPartKind2["methodName"] = 10] = "methodName";
SymbolDisplayPartKind2[SymbolDisplayPartKind2["moduleName"] = 11] = "moduleName";
SymbolDisplayPartKind2[SymbolDisplayPartKind2["operator"] = 12] = "operator";
SymbolDisplayPartKind2[SymbolDisplayPartKind2["parameterName"] = 13] = "parameterName";
SymbolDisplayPartKind2[SymbolDisplayPartKind2["propertyName"] = 14] = "propertyName";
SymbolDisplayPartKind2[SymbolDisplayPartKind2["punctuation"] = 15] = "punctuation";
SymbolDisplayPartKind2[SymbolDisplayPartKind2["space"] = 16] = "space";
SymbolDisplayPartKind2[SymbolDisplayPartKind2["text"] = 17] = "text";
SymbolDisplayPartKind2[SymbolDisplayPartKind2["typeParameterName"] = 18] = "typeParameterName";
SymbolDisplayPartKind2[SymbolDisplayPartKind2["enumMemberName"] = 19] = "enumMemberName";
SymbolDisplayPartKind2[SymbolDisplayPartKind2["functionName"] = 20] = "functionName";
SymbolDisplayPartKind2[SymbolDisplayPartKind2["regularExpressionLiteral"] = 21] = "regularExpressionLiteral";
SymbolDisplayPartKind2[SymbolDisplayPartKind2["link"] = 22] = "link";
SymbolDisplayPartKind2[SymbolDisplayPartKind2["linkName"] = 23] = "linkName";
SymbolDisplayPartKind2[SymbolDisplayPartKind2["linkText"] = 24] = "linkText";
return SymbolDisplayPartKind2;
})(SymbolDisplayPartKind || {});
var CompletionInfoFlags = /* @__PURE__ */ ((CompletionInfoFlags2) => {
CompletionInfoFlags2[CompletionInfoFlags2["None"] = 0] = "None";
CompletionInfoFlags2[CompletionInfoFlags2["MayIncludeAutoImports"] = 1] = "MayIncludeAutoImports";
CompletionInfoFlags2[CompletionInfoFlags2["IsImportStatementCompletion"] = 2] = "IsImportStatementCompletion";
CompletionInfoFlags2[CompletionInfoFlags2["IsContinuation"] = 4] = "IsContinuation";
CompletionInfoFlags2[CompletionInfoFlags2["ResolvedModuleSpecifiers"] = 8] = "ResolvedModuleSpecifiers";
CompletionInfoFlags2[CompletionInfoFlags2["ResolvedModuleSpecifiersBeyondLimit"] = 16] = "ResolvedModuleSpecifiersBeyondLimit";
CompletionInfoFlags2[CompletionInfoFlags2["MayIncludeMethodSnippets"] = 32] = "MayIncludeMethodSnippets";
return CompletionInfoFlags2;
})(CompletionInfoFlags || {});
var OutliningSpanKind = /* @__PURE__ */ ((OutliningSpanKind2) => {
OutliningSpanKind2["Comment"] = "comment";
OutliningSpanKind2["Region"] = "region";
OutliningSpanKind2["Code"] = "code";
OutliningSpanKind2["Imports"] = "imports";
return OutliningSpanKind2;
})(OutliningSpanKind || {});
var OutputFileType = /* @__PURE__ */ ((OutputFileType2) => {
OutputFileType2[OutputFileType2["JavaScript"] = 0] = "JavaScript";
OutputFileType2[OutputFileType2["SourceMap"] = 1] = "SourceMap";
OutputFileType2[OutputFileType2["Declaration"] = 2] = "Declaration";
return OutputFileType2;
})(OutputFileType || {});
var EndOfLineState = /* @__PURE__ */ ((EndOfLineState3) => {
EndOfLineState3[EndOfLineState3["None"] = 0] = "None";
EndOfLineState3[EndOfLineState3["InMultiLineCommentTrivia"] = 1] = "InMultiLineCommentTrivia";
EndOfLineState3[EndOfLineState3["InSingleQuoteStringLiteral"] = 2] = "InSingleQuoteStringLiteral";
EndOfLineState3[EndOfLineState3["InDoubleQuoteStringLiteral"] = 3] = "InDoubleQuoteStringLiteral";
EndOfLineState3[EndOfLineState3["InTemplateHeadOrNoSubstitutionTemplate"] = 4] = "InTemplateHeadOrNoSubstitutionTemplate";
EndOfLineState3[EndOfLineState3["InTemplateMiddleOrTail"] = 5] = "InTemplateMiddleOrTail";
EndOfLineState3[EndOfLineState3["InTemplateSubstitutionPosition"] = 6] = "InTemplateSubstitutionPosition";
return EndOfLineState3;
})(EndOfLineState || {});
var TokenClass = /* @__PURE__ */ ((TokenClass2) => {
TokenClass2[TokenClass2["Punctuation"] = 0] = "Punctuation";
TokenClass2[TokenClass2["Keyword"] = 1] = "Keyword";
TokenClass2[TokenClass2["Operator"] = 2] = "Operator";
TokenClass2[TokenClass2["Comment"] = 3] = "Comment";
TokenClass2[TokenClass2["Whitespace"] = 4] = "Whitespace";
TokenClass2[TokenClass2["Identifier"] = 5] = "Identifier";
TokenClass2[TokenClass2["NumberLiteral"] = 6] = "NumberLiteral";
TokenClass2[TokenClass2["BigIntLiteral"] = 7] = "BigIntLiteral";
TokenClass2[TokenClass2["StringLiteral"] = 8] = "StringLiteral";
TokenClass2[TokenClass2["RegExpLiteral"] = 9] = "RegExpLiteral";
return TokenClass2;
})(TokenClass || {});
var ScriptElementKind = /* @__PURE__ */ ((ScriptElementKind2) => {
ScriptElementKind2["unknown"] = "";
ScriptElementKind2["warning"] = "warning";
ScriptElementKind2["keyword"] = "keyword";
ScriptElementKind2["scriptElement"] = "script";
ScriptElementKind2["moduleElement"] = "module";
ScriptElementKind2["classElement"] = "class";
ScriptElementKind2["localClassElement"] = "local class";
ScriptElementKind2["interfaceElement"] = "interface";
ScriptElementKind2["typeElement"] = "type";
ScriptElementKind2["enumElement"] = "enum";
ScriptElementKind2["enumMemberElement"] = "enum member";
ScriptElementKind2["variableElement"] = "var";
ScriptElementKind2["localVariableElement"] = "local var";
ScriptElementKind2["functionElement"] = "function";
ScriptElementKind2["localFunctionElement"] = "local function";
ScriptElementKind2["memberFunctionElement"] = "method";
ScriptElementKind2["memberGetAccessorElement"] = "getter";
ScriptElementKind2["memberSetAccessorElement"] = "setter";
ScriptElementKind2["memberVariableElement"] = "property";
ScriptElementKind2["memberAccessorVariableElement"] = "accessor";
ScriptElementKind2["constructorImplementationElement"] = "constructor";
ScriptElementKind2["callSignatureElement"] = "call";
ScriptElementKind2["indexSignatureElement"] = "index";
ScriptElementKind2["constructSignatureElement"] = "construct";
ScriptElementKind2["parameterElement"] = "parameter";
ScriptElementKind2["typeParameterElement"] = "type parameter";
ScriptElementKind2["primitiveType"] = "primitive type";
ScriptElementKind2["label"] = "label";
ScriptElementKind2["alias"] = "alias";
ScriptElementKind2["constElement"] = "const";
ScriptElementKind2["letElement"] = "let";
ScriptElementKind2["directory"] = "directory";
ScriptElementKind2["externalModuleName"] = "external module name";
ScriptElementKind2["jsxAttribute"] = "JSX attribute";
ScriptElementKind2["string"] = "string";
ScriptElementKind2["link"] = "link";
ScriptElementKind2["linkName"] = "link name";
ScriptElementKind2["linkText"] = "link text";
return ScriptElementKind2;
})(ScriptElementKind || {});
var ScriptElementKindModifier = /* @__PURE__ */ ((ScriptElementKindModifier2) => {
ScriptElementKindModifier2["none"] = "";
ScriptElementKindModifier2["publicMemberModifier"] = "public";
ScriptElementKindModifier2["privateMemberModifier"] = "private";
ScriptElementKindModifier2["protectedMemberModifier"] = "protected";
ScriptElementKindModifier2["exportedModifier"] = "export";
ScriptElementKindModifier2["ambientModifier"] = "declare";
ScriptElementKindModifier2["staticModifier"] = "static";
ScriptElementKindModifier2["abstractModifier"] = "abstract";
ScriptElementKindModifier2["optionalModifier"] = "optional";
ScriptElementKindModifier2["deprecatedModifier"] = "deprecated";
ScriptElementKindModifier2["dtsModifier"] = ".d.ts";
ScriptElementKindModifier2["tsModifier"] = ".ts";
ScriptElementKindModifier2["tsxModifier"] = ".tsx";
ScriptElementKindModifier2["jsModifier"] = ".js";
ScriptElementKindModifier2["jsxModifier"] = ".jsx";
ScriptElementKindModifier2["jsonModifier"] = ".json";
ScriptElementKindModifier2["dmtsModifier"] = ".d.mts";
ScriptElementKindModifier2["mtsModifier"] = ".mts";
ScriptElementKindModifier2["mjsModifier"] = ".mjs";
ScriptElementKindModifier2["dctsModifier"] = ".d.cts";
ScriptElementKindModifier2["ctsModifier"] = ".cts";
ScriptElementKindModifier2["cjsModifier"] = ".cjs";
return ScriptElementKindModifier2;
})(ScriptElementKindModifier || {});
var ClassificationTypeNames = /* @__PURE__ */ ((ClassificationTypeNames2) => {
ClassificationTypeNames2["comment"] = "comment";
ClassificationTypeNames2["identifier"] = "identifier";
ClassificationTypeNames2["keyword"] = "keyword";
ClassificationTypeNames2["numericLiteral"] = "number";
ClassificationTypeNames2["bigintLiteral"] = "bigint";
ClassificationTypeNames2["operator"] = "operator";
ClassificationTypeNames2["stringLiteral"] = "string";
ClassificationTypeNames2["whiteSpace"] = "whitespace";
ClassificationTypeNames2["text"] = "text";
ClassificationTypeNames2["punctuation"] = "punctuation";
ClassificationTypeNames2["className"] = "class name";
ClassificationTypeNames2["enumName"] = "enum name";
ClassificationTypeNames2["interfaceName"] = "interface name";
ClassificationTypeNames2["moduleName"] = "module name";
ClassificationTypeNames2["typeParameterName"] = "type parameter name";
ClassificationTypeNames2["typeAliasName"] = "type alias name";
ClassificationTypeNames2["parameterName"] = "parameter name";
ClassificationTypeNames2["docCommentTagName"] = "doc comment tag name";
ClassificationTypeNames2["jsxOpenTagName"] = "jsx open tag name";
ClassificationTypeNames2["jsxCloseTagName"] = "jsx close tag name";
ClassificationTypeNames2["jsxSelfClosingTagName"] = "jsx self closing tag name";
ClassificationTypeNames2["jsxAttribute"] = "jsx attribute";
ClassificationTypeNames2["jsxText"] = "jsx text";
ClassificationTypeNames2["jsxAttributeStringLiteralValue"] = "jsx attribute string literal value";
return ClassificationTypeNames2;
})(ClassificationTypeNames || {});
var ClassificationType = /* @__PURE__ */ ((ClassificationType3) => {
ClassificationType3[ClassificationType3["comment"] = 1] = "comment";
ClassificationType3[ClassificationType3["identifier"] = 2] = "identifier";
ClassificationType3[ClassificationType3["keyword"] = 3] = "keyword";
ClassificationType3[ClassificationType3["numericLiteral"] = 4] = "numericLiteral";
ClassificationType3[ClassificationType3["operator"] = 5] = "operator";
ClassificationType3[ClassificationType3["stringLiteral"] = 6] = "stringLiteral";
ClassificationType3[ClassificationType3["regularExpressionLiteral"] = 7] = "regularExpressionLiteral";
ClassificationType3[ClassificationType3["whiteSpace"] = 8] = "whiteSpace";
ClassificationType3[ClassificationType3["text"] = 9] = "text";
ClassificationType3[ClassificationType3["punctuation"] = 10] = "punctuation";
ClassificationType3[ClassificationType3["className"] = 11] = "className";
ClassificationType3[ClassificationType3["enumName"] = 12] = "enumName";
ClassificationType3[ClassificationType3["interfaceName"] = 13] = "interfaceName";
ClassificationType3[ClassificationType3["moduleName"] = 14] = "moduleName";
ClassificationType3[ClassificationType3["typeParameterName"] = 15] = "typeParameterName";
ClassificationType3[ClassificationType3["typeAliasName"] = 16] = "typeAliasName";
ClassificationType3[ClassificationType3["parameterName"] = 17] = "parameterName";
ClassificationType3[ClassificationType3["docCommentTagName"] = 18] = "docCommentTagName";
ClassificationType3[ClassificationType3["jsxOpenTagName"] = 19] = "jsxOpenTagName";
ClassificationType3[ClassificationType3["jsxCloseTagName"] = 20] = "jsxCloseTagName";
ClassificationType3[ClassificationType3["jsxSelfClosingTagName"] = 21] = "jsxSelfClosingTagName";
ClassificationType3[ClassificationType3["jsxAttribute"] = 22] = "jsxAttribute";
ClassificationType3[ClassificationType3["jsxText"] = 23] = "jsxText";
ClassificationType3[ClassificationType3["jsxAttributeStringLiteralValue"] = 24] = "jsxAttributeStringLiteralValue";
ClassificationType3[ClassificationType3["bigintLiteral"] = 25] = "bigintLiteral";
return ClassificationType3;
})(ClassificationType || {});
// src/services/utilities.ts
var scanner = createScanner(
99 /* Latest */,
/*skipTrivia*/
true
);
var SemanticMeaning = /* @__PURE__ */ ((SemanticMeaning3) => {
SemanticMeaning3[SemanticMeaning3["None"] = 0] = "None";
SemanticMeaning3[SemanticMeaning3["Value"] = 1] = "Value";
SemanticMeaning3[SemanticMeaning3["Type"] = 2] = "Type";
SemanticMeaning3[SemanticMeaning3["Namespace"] = 4] = "Namespace";
SemanticMeaning3[SemanticMeaning3["All"] = 7] = "All";
return SemanticMeaning3;
})(SemanticMeaning || {});
function getMeaningFromDeclaration(node) {
switch (node.kind) {
case 259 /* VariableDeclaration */:
return isInJSFile(node) && getJSDocEnumTag(node) ? 7 /* All */ : 1 /* Value */;
case 168 /* Parameter */:
case 207 /* BindingElement */:
case 171 /* PropertyDeclaration */:
case 170 /* PropertySignature */:
case 302 /* PropertyAssignment */:
case 303 /* ShorthandPropertyAssignment */:
case 173 /* MethodDeclaration */:
case 172 /* MethodSignature */:
case 175 /* Constructor */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
case 261 /* FunctionDeclaration */:
case 217 /* FunctionExpression */:
case 218 /* ArrowFunction */:
case 298 /* CatchClause */:
case 290 /* JsxAttribute */:
return 1 /* Value */;
case 167 /* TypeParameter */:
case 263 /* InterfaceDeclaration */:
case 264 /* TypeAliasDeclaration */:
case 186 /* TypeLiteral */:
return 2 /* Type */;
case 352 /* JSDocTypedefTag */:
return node.name === void 0 ? 1 /* Value */ | 2 /* Type */ : 2 /* Type */;
case 305 /* EnumMember */:
case 262 /* ClassDeclaration */:
return 1 /* Value */ | 2 /* Type */;
case 266 /* ModuleDeclaration */:
if (isAmbientModule(node)) {
return 4 /* Namespace */ | 1 /* Value */;
} else if (getModuleInstanceState(node) === 1 /* Instantiated */) {
return 4 /* Namespace */ | 1 /* Value */;
} else {
return 4 /* Namespace */;
}
case 265 /* EnumDeclaration */:
case 274 /* NamedImports */:
case 275 /* ImportSpecifier */:
case 270 /* ImportEqualsDeclaration */:
case 271 /* ImportDeclaration */:
case 276 /* ExportAssignment */:
case 277 /* ExportDeclaration */:
return 7 /* All */;
case 311 /* SourceFile */:
return 4 /* Namespace */ | 1 /* Value */;
}
return 7 /* All */;
}
function getMeaningFromLocation(node) {
node = getAdjustedReferenceLocation(node);
const parent2 = node.parent;
if (node.kind === 311 /* SourceFile */) {
return 1 /* Value */;
} else if (isExportAssignment(parent2) || isExportSpecifier(parent2) || isExternalModuleReference(parent2) || isImportSpecifier(parent2) || isImportClause(parent2) || isImportEqualsDeclaration(parent2) && node === parent2.name) {
return 7 /* All */;
} else if (isInRightSideOfInternalImportEqualsDeclaration(node)) {
return getMeaningFromRightHandSideOfImportEquals(node);
} else if (isDeclarationName(node)) {
return getMeaningFromDeclaration(parent2);
} else if (isEntityName(node) && findAncestor(node, or(isJSDocNameReference, isJSDocLinkLike, isJSDocMemberName))) {
return 7 /* All */;
} else if (isTypeReference(node)) {
return 2 /* Type */;
} else if (isNamespaceReference(node)) {
return 4 /* Namespace */;
} else if (isTypeParameterDeclaration(parent2)) {
Debug.assert(isJSDocTemplateTag(parent2.parent));
return 2 /* Type */;
} else if (isLiteralTypeNode(parent2)) {
return 2 /* Type */ | 1 /* Value */;
} else {
return 1 /* Value */;
}
}
function getMeaningFromRightHandSideOfImportEquals(node) {
const name = node.kind === 165 /* QualifiedName */ ? node : isQualifiedName(node.parent) && node.parent.right === node ? node.parent : void 0;
return name && name.parent.kind === 270 /* ImportEqualsDeclaration */ ? 7 /* All */ : 4 /* Namespace */;
}
function isInRightSideOfInternalImportEqualsDeclaration(node) {
while (node.parent.kind === 165 /* QualifiedName */) {
node = node.parent;
}
return isInternalModuleImportEqualsDeclaration(node.parent) && node.parent.moduleReference === node;
}
function isNamespaceReference(node) {
return isQualifiedNameNamespaceReference(node) || isPropertyAccessNamespaceReference(node);
}
function isQualifiedNameNamespaceReference(node) {
let root = node;
let isLastClause = true;
if (root.parent.kind === 165 /* QualifiedName */) {
while (root.parent && root.parent.kind === 165 /* QualifiedName */) {
root = root.parent;
}
isLastClause = root.right === node;
}
return root.parent.kind === 182 /* TypeReference */ && !isLastClause;
}
function isPropertyAccessNamespaceReference(node) {
let root = node;
let isLastClause = true;
if (root.parent.kind === 210 /* PropertyAccessExpression */) {
while (root.parent && root.parent.kind === 210 /* PropertyAccessExpression */) {
root = root.parent;
}
isLastClause = root.name === node;
}
if (!isLastClause && root.parent.kind === 232 /* ExpressionWithTypeArguments */ && root.parent.parent.kind === 297 /* HeritageClause */) {
const decl = root.parent.parent.parent;
return decl.kind === 262 /* ClassDeclaration */ && root.parent.parent.token === 119 /* ImplementsKeyword */ || decl.kind === 263 /* InterfaceDeclaration */ && root.parent.parent.token === 96 /* ExtendsKeyword */;
}
return false;
}
function isTypeReference(node) {
if (isRightSideOfQualifiedNameOrPropertyAccess(node)) {
node = node.parent;
}
switch (node.kind) {
case 110 /* ThisKeyword */:
return !isExpressionNode(node);
case 196 /* ThisType */:
return true;
}
switch (node.parent.kind) {
case 182 /* TypeReference */:
return true;
case 204 /* ImportType */:
return !node.parent.isTypeOf;
case 232 /* ExpressionWithTypeArguments */:
return isPartOfTypeNode(node.parent);
}
return false;
}
function isCallExpressionTarget(node, includeElementAccess = false, skipPastOuterExpressions = false) {
return isCalleeWorker(node, isCallExpression, selectExpressionOfCallOrNewExpressionOrDecorator, includeElementAccess, skipPastOuterExpressions);
}
function isNewExpressionTarget(node, includeElementAccess = false, skipPastOuterExpressions = false) {
return isCalleeWorker(node, isNewExpression, selectExpressionOfCallOrNewExpressionOrDecorator, includeElementAccess, skipPastOuterExpressions);
}
function isCallOrNewExpressionTarget(node, includeElementAccess = false, skipPastOuterExpressions = false) {
return isCalleeWorker(node, isCallOrNewExpression, selectExpressionOfCallOrNewExpressionOrDecorator, includeElementAccess, skipPastOuterExpressions);
}
function isTaggedTemplateTag(node, includeElementAccess = false, skipPastOuterExpressions = false) {
return isCalleeWorker(node, isTaggedTemplateExpression, selectTagOfTaggedTemplateExpression, includeElementAccess, skipPastOuterExpressions);
}
function isDecoratorTarget(node, includeElementAccess = false, skipPastOuterExpressions = false) {
return isCalleeWorker(node, isDecorator, selectExpressionOfCallOrNewExpressionOrDecorator, includeElementAccess, skipPastOuterExpressions);
}
function isJsxOpeningLikeElementTagName(node, includeElementAccess = false, skipPastOuterExpressions = false) {
return isCalleeWorker(node, isJsxOpeningLikeElement, selectTagNameOfJsxOpeningLikeElement, includeElementAccess, skipPastOuterExpressions);
}
function selectExpressionOfCallOrNewExpressionOrDecorator(node) {
return node.expression;
}
function selectTagOfTaggedTemplateExpression(node) {
return node.tag;
}
function selectTagNameOfJsxOpeningLikeElement(node) {
return node.tagName;
}
function isCalleeWorker(node, pred, calleeSelector, includeElementAccess, skipPastOuterExpressions) {
let target = includeElementAccess ? climbPastPropertyOrElementAccess(node) : climbPastPropertyAccess(node);
if (skipPastOuterExpressions) {
target = skipOuterExpressions(target);
}
return !!target && !!target.parent && pred(target.parent) && calleeSelector(target.parent) === target;
}
function climbPastPropertyAccess(node) {
return isRightSideOfPropertyAccess(node) ? node.parent : node;
}
function climbPastPropertyOrElementAccess(node) {
return isRightSideOfPropertyAccess(node) || isArgumentExpressionOfElementAccess(node) ? node.parent : node;
}
function getTargetLabel(referenceNode, labelName) {
while (referenceNode) {
if (referenceNode.kind === 255 /* LabeledStatement */ && referenceNode.label.escapedText === labelName) {
return referenceNode.label;
}
referenceNode = referenceNode.parent;
}
return void 0;
}
function hasPropertyAccessExpressionWithName(node, funcName) {
if (!isPropertyAccessExpression(node.expression)) {
return false;
}
return node.expression.name.text === funcName;
}
function isJumpStatementTarget(node) {
var _a;
return isIdentifier(node) && ((_a = tryCast(node.parent, isBreakOrContinueStatement)) == null ? void 0 : _a.label) === node;
}
function isLabelOfLabeledStatement(node) {
var _a;
return isIdentifier(node) && ((_a = tryCast(node.parent, isLabeledStatement)) == null ? void 0 : _a.label) === node;
}
function isLabelName(node) {
return isLabelOfLabeledStatement(node) || isJumpStatementTarget(node);
}
function isTagName(node) {
var _a;
return ((_a = tryCast(node.parent, isJSDocTag)) == null ? void 0 : _a.tagName) === node;
}
function isRightSideOfQualifiedName(node) {
var _a;
return ((_a = tryCast(node.parent, isQualifiedName)) == null ? void 0 : _a.right) === node;
}
function isRightSideOfPropertyAccess(node) {
var _a;
return ((_a = tryCast(node.parent, isPropertyAccessExpression)) == null ? void 0 : _a.name) === node;
}
function isArgumentExpressionOfElementAccess(node) {
var _a;
return ((_a = tryCast(node.parent, isElementAccessExpression)) == null ? void 0 : _a.argumentExpression) === node;
}
function isNameOfModuleDeclaration(node) {
var _a;
return ((_a = tryCast(node.parent, isModuleDeclaration)) == null ? void 0 : _a.name) === node;
}
function isNameOfFunctionDeclaration(node) {
var _a;
return isIdentifier(node) && ((_a = tryCast(node.parent, isFunctionLike)) == null ? void 0 : _a.name) === node;
}
function isLiteralNameOfPropertyDeclarationOrIndexAccess(node) {
switch (node.parent.kind) {
case 171 /* PropertyDeclaration */:
case 170 /* PropertySignature */:
case 302 /* PropertyAssignment */:
case 305 /* EnumMember */:
case 173 /* MethodDeclaration */:
case 172 /* MethodSignature */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
case 266 /* ModuleDeclaration */:
return getNameOfDeclaration(node.parent) === node;
case 211 /* ElementAccessExpression */:
return node.parent.argumentExpression === node;
case 166 /* ComputedPropertyName */:
return true;
case 200 /* LiteralType */:
return node.parent.parent.kind === 198 /* IndexedAccessType */;
default:
return false;
}
}
function isExpressionOfExternalModuleImportEqualsDeclaration(node) {
return isExternalModuleImportEqualsDeclaration(node.parent.parent) && getExternalModuleImportEqualsDeclarationExpression(node.parent.parent) === node;
}
function getContainerNode(node) {
if (isJSDocTypeAlias(node)) {
node = node.parent.parent;
}
while (true) {
node = node.parent;
if (!node) {
return void 0;
}
switch (node.kind) {
case 311 /* SourceFile */:
case 173 /* MethodDeclaration */:
case 172 /* MethodSignature */:
case 261 /* FunctionDeclaration */:
case 217 /* FunctionExpression */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
case 262 /* ClassDeclaration */:
case 263 /* InterfaceDeclaration */:
case 265 /* EnumDeclaration */:
case 266 /* ModuleDeclaration */:
return node;
}
}
}
function getNodeKind(node) {
switch (node.kind) {
case 311 /* SourceFile */:
return isExternalModule(node) ? "module" /* moduleElement */ : "script" /* scriptElement */;
case 266 /* ModuleDeclaration */:
return "module" /* moduleElement */;
case 262 /* ClassDeclaration */:
case 230 /* ClassExpression */:
return "class" /* classElement */;
case 263 /* InterfaceDeclaration */:
return "interface" /* interfaceElement */;
case 264 /* TypeAliasDeclaration */:
case 344 /* JSDocCallbackTag */:
case 352 /* JSDocTypedefTag */:
return "type" /* typeElement */;
case 265 /* EnumDeclaration */:
return "enum" /* enumElement */;
case 259 /* VariableDeclaration */:
return getKindOfVariableDeclaration(node);
case 207 /* BindingElement */:
return getKindOfVariableDeclaration(getRootDeclaration(node));
case 218 /* ArrowFunction */:
case 261 /* FunctionDeclaration */:
case 217 /* FunctionExpression */:
return "function" /* functionElement */;
case 176 /* GetAccessor */:
return "getter" /* memberGetAccessorElement */;
case 177 /* SetAccessor */:
return "setter" /* memberSetAccessorElement */;
case 173 /* MethodDeclaration */:
case 172 /* MethodSignature */:
return "method" /* memberFunctionElement */;
case 302 /* PropertyAssignment */:
const { initializer } = node;
return isFunctionLike(initializer) ? "method" /* memberFunctionElement */ : "property" /* memberVariableElement */;
case 171 /* PropertyDeclaration */:
case 170 /* PropertySignature */:
case 303 /* ShorthandPropertyAssignment */:
case 304 /* SpreadAssignment */:
return "property" /* memberVariableElement */;
case 180 /* IndexSignature */:
return "index" /* indexSignatureElement */;
case 179 /* ConstructSignature */:
return "construct" /* constructSignatureElement */;
case 178 /* CallSignature */:
return "call" /* callSignatureElement */;
case 175 /* Constructor */:
case 174 /* ClassStaticBlockDeclaration */:
return "constructor" /* constructorImplementationElement */;
case 167 /* TypeParameter */:
return "type parameter" /* typeParameterElement */;
case 305 /* EnumMember */:
return "enum member" /* enumMemberElement */;
case 168 /* Parameter */:
return hasSyntacticModifier(node, 16476 /* ParameterPropertyModifier */) ? "property" /* memberVariableElement */ : "parameter" /* parameterElement */;
case 270 /* ImportEqualsDeclaration */:
case 275 /* ImportSpecifier */:
case 280 /* ExportSpecifier */:
case 273 /* NamespaceImport */:
case 279 /* NamespaceExport */:
return "alias" /* alias */;
case 225 /* BinaryExpression */:
const kind = getAssignmentDeclarationKind(node);
const { right } = node;
switch (kind) {
case 7 /* ObjectDefinePropertyValue */:
case 8 /* ObjectDefinePropertyExports */:
case 9 /* ObjectDefinePrototypeProperty */:
case 0 /* None */:
return "" /* unknown */;
case 1 /* ExportsProperty */:
case 2 /* ModuleExports */:
const rightKind = getNodeKind(right);
return rightKind === "" /* unknown */ ? "const" /* constElement */ : rightKind;
case 3 /* PrototypeProperty */:
return isFunctionExpression(right) ? "method" /* memberFunctionElement */ : "property" /* memberVariableElement */;
case 4 /* ThisProperty */:
return "property" /* memberVariableElement */;
case 5 /* Property */:
return isFunctionExpression(right) ? "method" /* memberFunctionElement */ : "property" /* memberVariableElement */;
case 6 /* Prototype */:
return "local class" /* localClassElement */;
default: {
assertType(kind);
return "" /* unknown */;
}
}
case 80 /* Identifier */:
return isImportClause(node.parent) ? "alias" /* alias */ : "" /* unknown */;
case 276 /* ExportAssignment */:
const scriptKind = getNodeKind(node.expression);
return scriptKind === "" /* unknown */ ? "const" /* constElement */ : scriptKind;
default:
return "" /* unknown */;
}
function getKindOfVariableDeclaration(v) {
return isVarConst(v) ? "const" /* constElement */ : isLet(v) ? "let" /* letElement */ : "var" /* variableElement */;
}
}
function isThis(node) {
switch (node.kind) {
case 110 /* ThisKeyword */:
return true;
case 80 /* Identifier */:
return identifierIsThisKeyword(node) && node.parent.kind === 168 /* Parameter */;
default:
return false;
}
}
var tripleSlashDirectivePrefixRegex = /^\/\/\/\s*;
function getLineStartPositionForPosition(position, sourceFile) {
const lineStarts = getLineStarts(sourceFile);
const line = sourceFile.getLineAndCharacterOfPosition(position).line;
return lineStarts[line];
}
function rangeContainsRange(r1, r2) {
return startEndContainsRange(r1.pos, r1.end, r2);
}
function rangeContainsRangeExclusive(r1, r2) {
return rangeContainsPositionExclusive(r1, r2.pos) && rangeContainsPositionExclusive(r1, r2.end);
}
function rangeContainsPosition(r, pos) {
return r.pos <= pos && pos <= r.end;
}
function rangeContainsPositionExclusive(r, pos) {
return r.pos < pos && pos < r.end;
}
function startEndContainsRange(start2, end, range) {
return start2 <= range.pos && end >= range.end;
}
function rangeContainsStartEnd(range, start2, end) {
return range.pos <= start2 && range.end >= end;
}
function rangeOverlapsWithStartEnd(r1, start2, end) {
return startEndOverlapsWithStartEnd(r1.pos, r1.end, start2, end);
}
function nodeOverlapsWithStartEnd(node, sourceFile, start2, end) {
return startEndOverlapsWithStartEnd(node.getStart(sourceFile), node.end, start2, end);
}
function startEndOverlapsWithStartEnd(start1, end1, start2, end2) {
const start3 = Math.max(start1, start2);
const end = Math.min(end1, end2);
return start3 < end;
}
function positionBelongsToNode(candidate, position, sourceFile) {
Debug.assert(candidate.pos <= position);
return position < candidate.end || !isCompletedNode(candidate, sourceFile);
}
function isCompletedNode(n, sourceFile) {
if (n === void 0 || nodeIsMissing(n)) {
return false;
}
switch (n.kind) {
case 262 /* ClassDeclaration */:
case 263 /* InterfaceDeclaration */:
case 265 /* EnumDeclaration */:
case 209 /* ObjectLiteralExpression */:
case 205 /* ObjectBindingPattern */:
case 186 /* TypeLiteral */:
case 240 /* Block */:
case 267 /* ModuleBlock */:
case 268 /* CaseBlock */:
case 274 /* NamedImports */:
case 278 /* NamedExports */:
return nodeEndsWith(n, 20 /* CloseBraceToken */, sourceFile);
case 298 /* CatchClause */:
return isCompletedNode(n.block, sourceFile);
case 213 /* NewExpression */:
if (!n.arguments) {
return true;
}
case 212 /* CallExpression */:
case 216 /* ParenthesizedExpression */:
case 195 /* ParenthesizedType */:
return nodeEndsWith(n, 22 /* CloseParenToken */, sourceFile);
case 183 /* FunctionType */:
case 184 /* ConstructorType */:
return isCompletedNode(n.type, sourceFile);
case 175 /* Constructor */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
case 261 /* FunctionDeclaration */:
case 217 /* FunctionExpression */:
case 173 /* MethodDeclaration */:
case 172 /* MethodSignature */:
case 179 /* ConstructSignature */:
case 178 /* CallSignature */:
case 218 /* ArrowFunction */:
if (n.body) {
return isCompletedNode(n.body, sourceFile);
}
if (n.type) {
return isCompletedNode(n.type, sourceFile);
}
return hasChildOfKind(n, 22 /* CloseParenToken */, sourceFile);
case 266 /* ModuleDeclaration */:
return !!n.body && isCompletedNode(n.body, sourceFile);
case 244 /* IfStatement */:
if (n.elseStatement) {
return isCompletedNode(n.elseStatement, sourceFile);
}
return isCompletedNode(n.thenStatement, sourceFile);
case 243 /* ExpressionStatement */:
return isCompletedNode(n.expression, sourceFile) || hasChildOfKind(n, 27 /* SemicolonToken */, sourceFile);
case 208 /* ArrayLiteralExpression */:
case 206 /* ArrayBindingPattern */:
case 211 /* ElementAccessExpression */:
case 166 /* ComputedPropertyName */:
case 188 /* TupleType */:
return nodeEndsWith(n, 24 /* CloseBracketToken */, sourceFile);
case 180 /* IndexSignature */:
if (n.type) {
return isCompletedNode(n.type, sourceFile);
}
return hasChildOfKind(n, 24 /* CloseBracketToken */, sourceFile);
case 295 /* CaseClause */:
case 296 /* DefaultClause */:
return false;
case 247 /* ForStatement */:
case 248 /* ForInStatement */:
case 249 /* ForOfStatement */:
case 246 /* WhileStatement */:
return isCompletedNode(n.statement, sourceFile);
case 245 /* DoStatement */:
return hasChildOfKind(n, 117 /* WhileKeyword */, sourceFile) ? nodeEndsWith(n, 22 /* CloseParenToken */, sourceFile) : isCompletedNode(n.statement, sourceFile);
case 185 /* TypeQuery */:
return isCompletedNode(n.exprName, sourceFile);
case 220 /* TypeOfExpression */:
case 219 /* DeleteExpression */:
case 221 /* VoidExpression */:
case 228 /* YieldExpression */:
case 229 /* SpreadElement */:
const unaryWordExpression = n;
return isCompletedNode(unaryWordExpression.expression, sourceFile);
case 214 /* TaggedTemplateExpression */:
return isCompletedNode(n.template, sourceFile);
case 227 /* TemplateExpression */:
const lastSpan = lastOrUndefined(n.templateSpans);
return isCompletedNode(lastSpan, sourceFile);
case 238 /* TemplateSpan */:
return nodeIsPresent(n.literal);
case 277 /* ExportDeclaration */:
case 271 /* ImportDeclaration */:
return nodeIsPresent(n.moduleSpecifier);
case 223 /* PrefixUnaryExpression */:
return isCompletedNode(n.operand, sourceFile);
case 225 /* BinaryExpression */:
return isCompletedNode(n.right, sourceFile);
case 226 /* ConditionalExpression */:
return isCompletedNode(n.whenFalse, sourceFile);
default:
return true;
}
}
function nodeEndsWith(n, expectedLastToken, sourceFile) {
const children = n.getChildren(sourceFile);
if (children.length) {
const lastChild = last(children);
if (lastChild.kind === expectedLastToken) {
return true;
} else if (lastChild.kind === 27 /* SemicolonToken */ && children.length !== 1) {
return children[children.length - 2].kind === expectedLastToken;
}
}
return false;
}
function findListItemInfo(node) {
const list = findContainingList(node);
if (!list) {
return void 0;
}
const children = list.getChildren();
const listItemIndex = indexOfNode(children, node);
return {
listItemIndex,
list
};
}
function hasChildOfKind(n, kind, sourceFile) {
return !!findChildOfKind(n, kind, sourceFile);
}
function findChildOfKind(n, kind, sourceFile) {
return find(n.getChildren(sourceFile), (c) => c.kind === kind);
}
function findContainingList(node) {
const syntaxList = find(node.parent.getChildren(), (c) => isSyntaxList(c) && rangeContainsRange(c, node));
Debug.assert(!syntaxList || contains(syntaxList.getChildren(), node));
return syntaxList;
}
function isDefaultModifier2(node) {
return node.kind === 90 /* DefaultKeyword */;
}
function isClassKeyword(node) {
return node.kind === 86 /* ClassKeyword */;
}
function isFunctionKeyword(node) {
return node.kind === 100 /* FunctionKeyword */;
}
function getAdjustedLocationForClass(node) {
if (isNamedDeclaration(node)) {
return node.name;
}
if (isClassDeclaration(node)) {
const defaultModifier = node.modifiers && find(node.modifiers, isDefaultModifier2);
if (defaultModifier)
return defaultModifier;
}
if (isClassExpression(node)) {
const classKeyword = find(node.getChildren(), isClassKeyword);
if (classKeyword)
return classKeyword;
}
}
function getAdjustedLocationForFunction(node) {
if (isNamedDeclaration(node)) {
return node.name;
}
if (isFunctionDeclaration(node)) {
const defaultModifier = find(node.modifiers, isDefaultModifier2);
if (defaultModifier)
return defaultModifier;
}
if (isFunctionExpression(node)) {
const functionKeyword = find(node.getChildren(), isFunctionKeyword);
if (functionKeyword)
return functionKeyword;
}
}
function getAncestorTypeNode(node) {
let lastTypeNode;
findAncestor(node, (a) => {
if (isTypeNode(a)) {
lastTypeNode = a;
}
return !isQualifiedName(a.parent) && !isTypeNode(a.parent) && !isTypeElement(a.parent);
});
return lastTypeNode;
}
function getContextualTypeFromParentOrAncestorTypeNode(node, checker) {
if (node.flags & (8388608 /* JSDoc */ & ~262144 /* JavaScriptFile */))
return void 0;
const contextualType = getContextualTypeFromParent(node, checker);
if (contextualType)
return contextualType;
const ancestorTypeNode = getAncestorTypeNode(node);
return ancestorTypeNode && checker.getTypeAtLocation(ancestorTypeNode);
}
function getAdjustedLocationForDeclaration(node, forRename) {
if (!forRename) {
switch (node.kind) {
case 262 /* ClassDeclaration */:
case 230 /* ClassExpression */:
return getAdjustedLocationForClass(node);
case 261 /* FunctionDeclaration */:
case 217 /* FunctionExpression */:
return getAdjustedLocationForFunction(node);
case 175 /* Constructor */:
return node;
}
}
if (isNamedDeclaration(node)) {
return node.name;
}
}
function getAdjustedLocationForImportDeclaration(node, forRename) {
if (node.importClause) {
if (node.importClause.name && node.importClause.namedBindings) {
return;
}
if (node.importClause.name) {
return node.importClause.name;
}
if (node.importClause.namedBindings) {
if (isNamedImports(node.importClause.namedBindings)) {
const onlyBinding = singleOrUndefined(node.importClause.namedBindings.elements);
if (!onlyBinding) {
return;
}
return onlyBinding.name;
} else if (isNamespaceImport(node.importClause.namedBindings)) {
return node.importClause.namedBindings.name;
}
}
}
if (!forRename) {
return node.moduleSpecifier;
}
}
function getAdjustedLocationForExportDeclaration(node, forRename) {
if (node.exportClause) {
if (isNamedExports(node.exportClause)) {
const onlyBinding = singleOrUndefined(node.exportClause.elements);
if (!onlyBinding) {
return;
}
return node.exportClause.elements[0].name;
} else if (isNamespaceExport(node.exportClause)) {
return node.exportClause.name;
}
}
if (!forRename) {
return node.moduleSpecifier;
}
}
function getAdjustedLocationForHeritageClause(node) {
if (node.types.length === 1) {
return node.types[0].expression;
}
}
function getAdjustedLocation(node, forRename) {
const { parent: parent2 } = node;
if (isModifier(node) && (forRename || node.kind !== 90 /* DefaultKeyword */) ? canHaveModifiers(parent2) && contains(parent2.modifiers, node) : node.kind === 86 /* ClassKeyword */ ? isClassDeclaration(parent2) || isClassExpression(node) : node.kind === 100 /* FunctionKeyword */ ? isFunctionDeclaration(parent2) || isFunctionExpression(node) : node.kind === 120 /* InterfaceKeyword */ ? isInterfaceDeclaration(parent2) : node.kind === 94 /* EnumKeyword */ ? isEnumDeclaration(parent2) : node.kind === 156 /* TypeKeyword */ ? isTypeAliasDeclaration(parent2) : node.kind === 145 /* NamespaceKeyword */ || node.kind === 144 /* ModuleKeyword */ ? isModuleDeclaration(parent2) : node.kind === 102 /* ImportKeyword */ ? isImportEqualsDeclaration(parent2) : node.kind === 139 /* GetKeyword */ ? isGetAccessorDeclaration(parent2) : node.kind === 153 /* SetKeyword */ && isSetAccessorDeclaration(parent2)) {
const location = getAdjustedLocationForDeclaration(parent2, forRename);
if (location) {
return location;
}
}
if ((node.kind === 115 /* VarKeyword */ || node.kind === 87 /* ConstKeyword */ || node.kind === 121 /* LetKeyword */) && isVariableDeclarationList(parent2) && parent2.declarations.length === 1) {
const decl = parent2.declarations[0];
if (isIdentifier(decl.name)) {
return decl.name;
}
}
if (node.kind === 156 /* TypeKeyword */) {
if (isImportClause(parent2) && parent2.isTypeOnly) {
const location = getAdjustedLocationForImportDeclaration(parent2.parent, forRename);
if (location) {
return location;
}
}
if (isExportDeclaration(parent2) && parent2.isTypeOnly) {
const location = getAdjustedLocationForExportDeclaration(parent2, forRename);
if (location) {
return location;
}
}
}
if (node.kind === 130 /* AsKeyword */) {
if (isImportSpecifier(parent2) && parent2.propertyName || isExportSpecifier(parent2) && parent2.propertyName || isNamespaceImport(parent2) || isNamespaceExport(parent2)) {
return parent2.name;
}
if (isExportDeclaration(parent2) && parent2.exportClause && isNamespaceExport(parent2.exportClause)) {
return parent2.exportClause.name;
}
}
if (node.kind === 102 /* ImportKeyword */ && isImportDeclaration(parent2)) {
const location = getAdjustedLocationForImportDeclaration(parent2, forRename);
if (location) {
return location;
}
}
if (node.kind === 95 /* ExportKeyword */) {
if (isExportDeclaration(parent2)) {
const location = getAdjustedLocationForExportDeclaration(parent2, forRename);
if (location) {
return location;
}
}
if (isExportAssignment(parent2)) {
return skipOuterExpressions(parent2.expression);
}
}
if (node.kind === 149 /* RequireKeyword */ && isExternalModuleReference(parent2)) {
return parent2.expression;
}
if (node.kind === 160 /* FromKeyword */ && (isImportDeclaration(parent2) || isExportDeclaration(parent2)) && parent2.moduleSpecifier) {
return parent2.moduleSpecifier;
}
if ((node.kind === 96 /* ExtendsKeyword */ || node.kind === 119 /* ImplementsKeyword */) && isHeritageClause(parent2) && parent2.token === node.kind) {
const location = getAdjustedLocationForHeritageClause(parent2);
if (location) {
return location;
}
}
if (node.kind === 96 /* ExtendsKeyword */) {
if (isTypeParameterDeclaration(parent2) && parent2.constraint && isTypeReferenceNode(parent2.constraint)) {
return parent2.constraint.typeName;
}
if (isConditionalTypeNode(parent2) && isTypeReferenceNode(parent2.extendsType)) {
return parent2.extendsType.typeName;
}
}
if (node.kind === 140 /* InferKeyword */ && isInferTypeNode(parent2)) {
return parent2.typeParameter.name;
}
if (node.kind === 103 /* InKeyword */ && isTypeParameterDeclaration(parent2) && isMappedTypeNode(parent2.parent)) {
return parent2.name;
}
if (node.kind === 143 /* KeyOfKeyword */ && isTypeOperatorNode(parent2) && parent2.operator === 143 /* KeyOfKeyword */ && isTypeReferenceNode(parent2.type)) {
return parent2.type.typeName;
}
if (node.kind === 148 /* ReadonlyKeyword */ && isTypeOperatorNode(parent2) && parent2.operator === 148 /* ReadonlyKeyword */ && isArrayTypeNode(parent2.type) && isTypeReferenceNode(parent2.type.elementType)) {
return parent2.type.elementType.typeName;
}
if (!forRename) {
if (node.kind === 105 /* NewKeyword */ && isNewExpression(parent2) || node.kind === 116 /* VoidKeyword */ && isVoidExpression(parent2) || node.kind === 114 /* TypeOfKeyword */ && isTypeOfExpression(parent2) || node.kind === 135 /* AwaitKeyword */ && isAwaitExpression(parent2) || node.kind === 127 /* YieldKeyword */ && isYieldExpression(parent2) || node.kind === 91 /* DeleteKeyword */ && isDeleteExpression(parent2)) {
if (parent2.expression) {
return skipOuterExpressions(parent2.expression);
}
}
if ((node.kind === 103 /* InKeyword */ || node.kind === 104 /* InstanceOfKeyword */) && isBinaryExpression(parent2) && parent2.operatorToken === node) {
return skipOuterExpressions(parent2.right);
}
if (node.kind === 130 /* AsKeyword */ && isAsExpression(parent2) && isTypeReferenceNode(parent2.type)) {
return parent2.type.typeName;
}
if (node.kind === 103 /* InKeyword */ && isForInStatement(parent2) || node.kind === 164 /* OfKeyword */ && isForOfStatement(parent2)) {
return skipOuterExpressions(parent2.expression);
}
}
return node;
}
function getAdjustedReferenceLocation(node) {
return getAdjustedLocation(
node,
/*forRename*/
false
);
}
function getAdjustedRenameLocation(node) {
return getAdjustedLocation(
node,
/*forRename*/
true
);
}
function getTouchingPropertyName(sourceFile, position) {
return getTouchingToken(sourceFile, position, (n) => isPropertyNameLiteral(n) || isKeyword(n.kind) || isPrivateIdentifier(n));
}
function getTouchingToken(sourceFile, position, includePrecedingTokenAtEndPosition) {
return getTokenAtPositionWorker(
sourceFile,
position,
/*allowPositionInLeadingTrivia*/
false,
includePrecedingTokenAtEndPosition,
/*includeEndPosition*/
false
);
}
function getTokenAtPosition(sourceFile, position) {
return getTokenAtPositionWorker(
sourceFile,
position,
/*allowPositionInLeadingTrivia*/
true,
/*includePrecedingTokenAtEndPosition*/
void 0,
/*includeEndPosition*/
false
);
}
function getTokenAtPositionWorker(sourceFile, position, allowPositionInLeadingTrivia, includePrecedingTokenAtEndPosition, includeEndPosition) {
let current = sourceFile;
let foundToken;
outer:
while (true) {
const children = current.getChildren(sourceFile);
const i = binarySearchKey(children, position, (_, i2) => i2, (middle, _) => {
const end = children[middle].getEnd();
if (end < position) {
return -1 /* LessThan */;
}
const start2 = allowPositionInLeadingTrivia ? children[middle].getFullStart() : children[middle].getStart(
sourceFile,
/*includeJsDocComment*/
true
);
if (start2 > position) {
return 1 /* GreaterThan */;
}
if (nodeContainsPosition(children[middle], start2, end)) {
if (children[middle - 1]) {
if (nodeContainsPosition(children[middle - 1])) {
return 1 /* GreaterThan */;
}
}
return 0 /* EqualTo */;
}
if (includePrecedingTokenAtEndPosition && start2 === position && children[middle - 1] && children[middle - 1].getEnd() === position && nodeContainsPosition(children[middle - 1])) {
return 1 /* GreaterThan */;
}
return -1 /* LessThan */;
});
if (foundToken) {
return foundToken;
}
if (i >= 0 && children[i]) {
current = children[i];
continue outer;
}
return current;
}
function nodeContainsPosition(node, start2, end) {
end ?? (end = node.getEnd());
if (end < position) {
return false;
}
start2 ?? (start2 = allowPositionInLeadingTrivia ? node.getFullStart() : node.getStart(
sourceFile,
/*includeJsDocComment*/
true
));
if (start2 > position) {
return false;
}
if (position < end || position === end && (node.kind === 1 /* EndOfFileToken */ || includeEndPosition)) {
return true;
} else if (includePrecedingTokenAtEndPosition && end === position) {
const previousToken = findPrecedingToken(position, sourceFile, node);
if (previousToken && includePrecedingTokenAtEndPosition(previousToken)) {
foundToken = previousToken;
return true;
}
}
return false;
}
}
function findFirstNonJsxWhitespaceToken(sourceFile, position) {
let tokenAtPosition = getTokenAtPosition(sourceFile, position);
while (isWhiteSpaceOnlyJsxText(tokenAtPosition)) {
const nextToken = findNextToken(tokenAtPosition, tokenAtPosition.parent, sourceFile);
if (!nextToken)
return;
tokenAtPosition = nextToken;
}
return tokenAtPosition;
}
function findTokenOnLeftOfPosition(file, position) {
const tokenAtPosition = getTokenAtPosition(file, position);
if (isToken(tokenAtPosition) && position > tokenAtPosition.getStart(file) && position < tokenAtPosition.getEnd()) {
return tokenAtPosition;
}
return findPrecedingToken(position, file);
}
function findNextToken(previousToken, parent2, sourceFile) {
return find2(parent2);
function find2(n) {
if (isToken(n) && n.pos === previousToken.end) {
return n;
}
return firstDefined(n.getChildren(sourceFile), (child) => {
const shouldDiveInChildNode = (
// previous token is enclosed somewhere in the child
child.pos <= previousToken.pos && child.end > previousToken.end || // previous token ends exactly at the beginning of child
child.pos === previousToken.end
);
return shouldDiveInChildNode && nodeHasTokens(child, sourceFile) ? find2(child) : void 0;
});
}
}
function findPrecedingToken(position, sourceFile, startNode2, excludeJsdoc) {
const result = find2(startNode2 || sourceFile);
Debug.assert(!(result && isWhiteSpaceOnlyJsxText(result)));
return result;
function find2(n) {
if (isNonWhitespaceToken(n) && n.kind !== 1 /* EndOfFileToken */) {
return n;
}
const children = n.getChildren(sourceFile);
const i = binarySearchKey(children, position, (_, i2) => i2, (middle, _) => {
if (position < children[middle].end) {
if (!children[middle - 1] || position >= children[middle - 1].end) {
return 0 /* EqualTo */;
}
return 1 /* GreaterThan */;
}
return -1 /* LessThan */;
});
if (i >= 0 && children[i]) {
const child = children[i];
if (position < child.end) {
const start2 = child.getStart(
sourceFile,
/*includeJsDoc*/
!excludeJsdoc
);
const lookInPreviousChild = start2 >= position || // cursor in the leading trivia
!nodeHasTokens(child, sourceFile) || isWhiteSpaceOnlyJsxText(child);
if (lookInPreviousChild) {
const candidate2 = findRightmostChildNodeWithTokens(
children,
/*exclusiveStartPosition*/
i,
sourceFile,
n.kind
);
if (candidate2) {
if (!excludeJsdoc && isJSDocCommentContainingNode(candidate2) && candidate2.getChildren(sourceFile).length) {
return find2(candidate2);
}
return findRightmostToken(candidate2, sourceFile);
}
return void 0;
} else {
return find2(child);
}
}
}
Debug.assert(startNode2 !== void 0 || n.kind === 311 /* SourceFile */ || n.kind === 1 /* EndOfFileToken */ || isJSDocCommentContainingNode(n));
const candidate = findRightmostChildNodeWithTokens(
children,
/*exclusiveStartPosition*/
children.length,
sourceFile,
n.kind
);
return candidate && findRightmostToken(candidate, sourceFile);
}
}
function isNonWhitespaceToken(n) {
return isToken(n) && !isWhiteSpaceOnlyJsxText(n);
}
function findRightmostToken(n, sourceFile) {
if (isNonWhitespaceToken(n)) {
return n;
}
const children = n.getChildren(sourceFile);
if (children.length === 0) {
return n;
}
const candidate = findRightmostChildNodeWithTokens(
children,
/*exclusiveStartPosition*/
children.length,
sourceFile,
n.kind
);
return candidate && findRightmostToken(candidate, sourceFile);
}
function findRightmostChildNodeWithTokens(children, exclusiveStartPosition, sourceFile, parentKind) {
for (let i = exclusiveStartPosition - 1; i >= 0; i--) {
const child = children[i];
if (isWhiteSpaceOnlyJsxText(child)) {
if (i === 0 && (parentKind === 12 /* JsxText */ || parentKind === 284 /* JsxSelfClosingElement */)) {
Debug.fail("`JsxText` tokens should not be the first child of `JsxElement | JsxSelfClosingElement`");
}
} else if (nodeHasTokens(children[i], sourceFile)) {
return children[i];
}
}
}
function isInString(sourceFile, position, previousToken = findPrecedingToken(position, sourceFile)) {
if (previousToken && isStringTextContainingNode(previousToken)) {
const start2 = previousToken.getStart(sourceFile);
const end = previousToken.getEnd();
if (start2 < position && position < end) {
return true;
}
if (position === end) {
return !!previousToken.isUnterminated;
}
}
return false;
}
function isInsideJsxElementOrAttribute(sourceFile, position) {
const token = getTokenAtPosition(sourceFile, position);
if (!token) {
return false;
}
if (token.kind === 12 /* JsxText */) {
return true;
}
if (token.kind === 30 /* LessThanToken */ && token.parent.kind === 12 /* JsxText */) {
return true;
}
if (token.kind === 30 /* LessThanToken */ && token.parent.kind === 293 /* JsxExpression */) {
return true;
}
if (token && token.kind === 20 /* CloseBraceToken */ && token.parent.kind === 293 /* JsxExpression */) {
return true;
}
if (token.kind === 30 /* LessThanToken */ && token.parent.kind === 286 /* JsxClosingElement */) {
return true;
}
return false;
}
function isWhiteSpaceOnlyJsxText(node) {
return isJsxText(node) && node.containsOnlyTriviaWhiteSpaces;
}
function isInTemplateString(sourceFile, position) {
const token = getTokenAtPosition(sourceFile, position);
return isTemplateLiteralKind(token.kind) && position > token.getStart(sourceFile);
}
function isInJSXText(sourceFile, position) {
const token = getTokenAtPosition(sourceFile, position);
if (isJsxText(token)) {
return true;
}
if (token.kind === 19 /* OpenBraceToken */ && isJsxExpression(token.parent) && isJsxElement(token.parent.parent)) {
return true;
}
if (token.kind === 30 /* LessThanToken */ && isJsxOpeningLikeElement(token.parent) && isJsxElement(token.parent.parent)) {
return true;
}
return false;
}
function isInsideJsxElement(sourceFile, position) {
function isInsideJsxElementTraversal(node) {
while (node) {
if (node.kind >= 284 /* JsxSelfClosingElement */ && node.kind <= 293 /* JsxExpression */ || node.kind === 12 /* JsxText */ || node.kind === 30 /* LessThanToken */ || node.kind === 32 /* GreaterThanToken */ || node.kind === 80 /* Identifier */ || node.kind === 20 /* CloseBraceToken */ || node.kind === 19 /* OpenBraceToken */ || node.kind === 44 /* SlashToken */) {
node = node.parent;
} else if (node.kind === 283 /* JsxElement */) {
if (position > node.getStart(sourceFile))
return true;
node = node.parent;
} else {
return false;
}
}
return false;
}
return isInsideJsxElementTraversal(getTokenAtPosition(sourceFile, position));
}
function findPrecedingMatchingToken(token, matchingTokenKind, sourceFile) {
const closeTokenText = tokenToString(token.kind);
const matchingTokenText = tokenToString(matchingTokenKind);
const tokenFullStart = token.getFullStart();
const bestGuessIndex = sourceFile.text.lastIndexOf(matchingTokenText, tokenFullStart);
if (bestGuessIndex === -1) {
return void 0;
}
if (sourceFile.text.lastIndexOf(closeTokenText, tokenFullStart - 1) < bestGuessIndex) {
const nodeAtGuess = findPrecedingToken(bestGuessIndex + 1, sourceFile);
if (nodeAtGuess && nodeAtGuess.kind === matchingTokenKind) {
return nodeAtGuess;
}
}
const tokenKind = token.kind;
let remainingMatchingTokens = 0;
while (true) {
const preceding = findPrecedingToken(token.getFullStart(), sourceFile);
if (!preceding) {
return void 0;
}
token = preceding;
if (token.kind === matchingTokenKind) {
if (remainingMatchingTokens === 0) {
return token;
}
remainingMatchingTokens--;
} else if (token.kind === tokenKind) {
remainingMatchingTokens++;
}
}
}
function removeOptionality(type, isOptionalExpression, isOptionalChain2) {
return isOptionalExpression ? type.getNonNullableType() : isOptionalChain2 ? type.getNonOptionalType() : type;
}
function isPossiblyTypeArgumentPosition(token, sourceFile, checker) {
const info = getPossibleTypeArgumentsInfo(token, sourceFile);
return info !== void 0 && (isPartOfTypeNode(info.called) || getPossibleGenericSignatures(info.called, info.nTypeArguments, checker).length !== 0 || isPossiblyTypeArgumentPosition(info.called, sourceFile, checker));
}
function getPossibleGenericSignatures(called, typeArgumentCount, checker) {
let type = checker.getTypeAtLocation(called);
if (isOptionalChain(called.parent)) {
type = removeOptionality(
type,
isOptionalChainRoot(called.parent),
/*isOptionalChain*/
true
);
}
const signatures = isNewExpression(called.parent) ? type.getConstructSignatures() : type.getCallSignatures();
return signatures.filter((candidate) => !!candidate.typeParameters && candidate.typeParameters.length >= typeArgumentCount);
}
function getPossibleTypeArgumentsInfo(tokenIn, sourceFile) {
if (sourceFile.text.lastIndexOf("<", tokenIn ? tokenIn.pos : sourceFile.text.length) === -1) {
return void 0;
}
let token = tokenIn;
let remainingLessThanTokens = 0;
let nTypeArguments = 0;
while (token) {
switch (token.kind) {
case 30 /* LessThanToken */:
token = findPrecedingToken(token.getFullStart(), sourceFile);
if (token && token.kind === 29 /* QuestionDotToken */) {
token = findPrecedingToken(token.getFullStart(), sourceFile);
}
if (!token || !isIdentifier(token))
return void 0;
if (!remainingLessThanTokens) {
return isDeclarationName(token) ? void 0 : { called: token, nTypeArguments };
}
remainingLessThanTokens--;
break;
case 50 /* GreaterThanGreaterThanGreaterThanToken */:
remainingLessThanTokens = 3;
break;
case 49 /* GreaterThanGreaterThanToken */:
remainingLessThanTokens = 2;
break;
case 32 /* GreaterThanToken */:
remainingLessThanTokens++;
break;
case 20 /* CloseBraceToken */:
token = findPrecedingMatchingToken(token, 19 /* OpenBraceToken */, sourceFile);
if (!token)
return void 0;
break;
case 22 /* CloseParenToken */:
token = findPrecedingMatchingToken(token, 21 /* OpenParenToken */, sourceFile);
if (!token)
return void 0;
break;
case 24 /* CloseBracketToken */:
token = findPrecedingMatchingToken(token, 23 /* OpenBracketToken */, sourceFile);
if (!token)
return void 0;
break;
case 28 /* CommaToken */:
nTypeArguments++;
break;
case 39 /* EqualsGreaterThanToken */:
case 80 /* Identifier */:
case 11 /* StringLiteral */:
case 9 /* NumericLiteral */:
case 10 /* BigIntLiteral */:
case 112 /* TrueKeyword */:
case 97 /* FalseKeyword */:
case 114 /* TypeOfKeyword */:
case 96 /* ExtendsKeyword */:
case 143 /* KeyOfKeyword */:
case 25 /* DotToken */:
case 52 /* BarToken */:
case 58 /* QuestionToken */:
case 59 /* ColonToken */:
break;
default:
if (isTypeNode(token)) {
break;
}
return void 0;
}
token = findPrecedingToken(token.getFullStart(), sourceFile);
}
return void 0;
}
function isInComment(sourceFile, position, tokenAtPosition) {
return ts_formatting_exports.getRangeOfEnclosingComment(
sourceFile,
position,
/*precedingToken*/
void 0,
tokenAtPosition
);
}
function hasDocComment(sourceFile, position) {
const token = getTokenAtPosition(sourceFile, position);
return !!findAncestor(token, isJSDoc);
}
function nodeHasTokens(n, sourceFile) {
return n.kind === 1 /* EndOfFileToken */ ? !!n.jsDoc : n.getWidth(sourceFile) !== 0;
}
function getNodeModifiers(node, excludeFlags = 0 /* None */) {
const result = [];
const flags = isDeclaration(node) ? getCombinedNodeFlagsAlwaysIncludeJSDoc(node) & ~excludeFlags : 0 /* None */;
if (flags & 8 /* Private */)
result.push("private" /* privateMemberModifier */);
if (flags & 16 /* Protected */)
result.push("protected" /* protectedMemberModifier */);
if (flags & 4 /* Public */)
result.push("public" /* publicMemberModifier */);
if (flags & 32 /* Static */ || isClassStaticBlockDeclaration(node))
result.push("static" /* staticModifier */);
if (flags & 256 /* Abstract */)
result.push("abstract" /* abstractModifier */);
if (flags & 1 /* Export */)
result.push("export" /* exportedModifier */);
if (flags & 8192 /* Deprecated */)
result.push("deprecated" /* deprecatedModifier */);
if (node.flags & 16777216 /* Ambient */)
result.push("declare" /* ambientModifier */);
if (node.kind === 276 /* ExportAssignment */)
result.push("export" /* exportedModifier */);
return result.length > 0 ? result.join(",") : "" /* none */;
}
function getTypeArgumentOrTypeParameterList(node) {
if (node.kind === 182 /* TypeReference */ || node.kind === 212 /* CallExpression */) {
return node.typeArguments;
}
if (isFunctionLike(node) || node.kind === 262 /* ClassDeclaration */ || node.kind === 263 /* InterfaceDeclaration */) {
return node.typeParameters;
}
return void 0;
}
function isComment(kind) {
return kind === 2 /* SingleLineCommentTrivia */ || kind === 3 /* MultiLineCommentTrivia */;
}
function isStringOrRegularExpressionOrTemplateLiteral(kind) {
if (kind === 11 /* StringLiteral */ || kind === 14 /* RegularExpressionLiteral */ || isTemplateLiteralKind(kind)) {
return true;
}
return false;
}
function areIntersectedTypesAvoidingStringReduction(checker, t1, t2) {
return !!(t1.flags & 4 /* String */) && checker.isEmptyAnonymousObjectType(t2);
}
function isStringAndEmptyAnonymousObjectIntersection(type) {
if (!type.isIntersection()) {
return false;
}
const { types, checker } = type;
return types.length === 2 && (areIntersectedTypesAvoidingStringReduction(checker, types[0], types[1]) || areIntersectedTypesAvoidingStringReduction(checker, types[1], types[0]));
}
function isInsideTemplateLiteral(node, position, sourceFile) {
return isTemplateLiteralKind(node.kind) && (node.getStart(sourceFile) < position && position < node.end) || !!node.isUnterminated && position === node.end;
}
function isAccessibilityModifier(kind) {
switch (kind) {
case 125 /* PublicKeyword */:
case 123 /* PrivateKeyword */:
case 124 /* ProtectedKeyword */:
return true;
}
return false;
}
function cloneCompilerOptions(options) {
const result = clone(options);
setConfigFileInOptions(result, options && options.configFile);
return result;
}
function isArrayLiteralOrObjectLiteralDestructuringPattern(node) {
if (node.kind === 208 /* ArrayLiteralExpression */ || node.kind === 209 /* ObjectLiteralExpression */) {
if (node.parent.kind === 225 /* BinaryExpression */ && node.parent.left === node && node.parent.operatorToken.kind === 64 /* EqualsToken */) {
return true;
}
if (node.parent.kind === 249 /* ForOfStatement */ && node.parent.initializer === node) {
return true;
}
if (isArrayLiteralOrObjectLiteralDestructuringPattern(node.parent.kind === 302 /* PropertyAssignment */ ? node.parent.parent : node.parent)) {
return true;
}
}
return false;
}
function isInReferenceComment(sourceFile, position) {
return isInReferenceCommentWorker(
sourceFile,
position,
/*shouldBeReference*/
true
);
}
function isInNonReferenceComment(sourceFile, position) {
return isInReferenceCommentWorker(
sourceFile,
position,
/*shouldBeReference*/
false
);
}
function isInReferenceCommentWorker(sourceFile, position, shouldBeReference) {
const range = isInComment(
sourceFile,
position,
/*tokenAtPosition*/
void 0
);
return !!range && shouldBeReference === tripleSlashDirectivePrefixRegex.test(sourceFile.text.substring(range.pos, range.end));
}
function getReplacementSpanForContextToken(contextToken) {
if (!contextToken)
return void 0;
switch (contextToken.kind) {
case 11 /* StringLiteral */:
case 15 /* NoSubstitutionTemplateLiteral */:
return createTextSpanFromStringLiteralLikeContent(contextToken);
default:
return createTextSpanFromNode(contextToken);
}
}
function createTextSpanFromNode(node, sourceFile, endNode2) {
return createTextSpanFromBounds(node.getStart(sourceFile), (endNode2 || node).getEnd());
}
function createTextSpanFromStringLiteralLikeContent(node) {
if (node.isUnterminated)
return void 0;
return createTextSpanFromBounds(node.getStart() + 1, node.getEnd() - 1);
}
function createTextRangeFromNode(node, sourceFile) {
return createRange(node.getStart(sourceFile), node.end);
}
function createTextSpanFromRange(range) {
return createTextSpanFromBounds(range.pos, range.end);
}
function createTextRangeFromSpan(span) {
return createRange(span.start, span.start + span.length);
}
function createTextChangeFromStartLength(start2, length2, newText) {
return createTextChange(createTextSpan(start2, length2), newText);
}
function createTextChange(span, newText) {
return { span, newText };
}
var typeKeywords = [
133 /* AnyKeyword */,
131 /* AssertsKeyword */,
162 /* BigIntKeyword */,
136 /* BooleanKeyword */,
97 /* FalseKeyword */,
140 /* InferKeyword */,
143 /* KeyOfKeyword */,
146 /* NeverKeyword */,
106 /* NullKeyword */,
150 /* NumberKeyword */,
151 /* ObjectKeyword */,
148 /* ReadonlyKeyword */,
154 /* StringKeyword */,
155 /* SymbolKeyword */,
114 /* TypeOfKeyword */,
112 /* TrueKeyword */,
116 /* VoidKeyword */,
157 /* UndefinedKeyword */,
158 /* UniqueKeyword */,
159 /* UnknownKeyword */
];
function isTypeKeyword(kind) {
return contains(typeKeywords, kind);
}
function isTypeKeywordToken(node) {
return node.kind === 156 /* TypeKeyword */;
}
function isTypeKeywordTokenOrIdentifier(node) {
return isTypeKeywordToken(node) || isIdentifier(node) && node.text === "type";
}
function isExternalModuleSymbol(moduleSymbol) {
return !!(moduleSymbol.flags & 1536 /* Module */) && moduleSymbol.name.charCodeAt(0) === 34 /* doubleQuote */;
}
function nodeSeenTracker() {
const seen = [];
return (node) => {
const id = getNodeId(node);
return !seen[id] && (seen[id] = true);
};
}
function getSnapshotText(snap) {
return snap.getText(0, snap.getLength());
}
function repeatString(str, count) {
let result = "";
for (let i = 0; i < count; i++) {
result += str;
}
return result;
}
function skipConstraint(type) {
return type.isTypeParameter() ? type.getConstraint() || type : type;
}
function getNameFromPropertyName(name) {
return name.kind === 166 /* ComputedPropertyName */ ? isStringOrNumericLiteralLike(name.expression) ? name.expression.text : void 0 : isPrivateIdentifier(name) ? idText(name) : getTextOfIdentifierOrLiteral(name);
}
function programContainsModules(program) {
return program.getSourceFiles().some((s) => !s.isDeclarationFile && !program.isSourceFileFromExternalLibrary(s) && !!(s.externalModuleIndicator || s.commonJsModuleIndicator));
}
function programContainsEsModules(program) {
return program.getSourceFiles().some((s) => !s.isDeclarationFile && !program.isSourceFileFromExternalLibrary(s) && !!s.externalModuleIndicator);
}
function compilerOptionsIndicateEsModules(compilerOptions) {
return !!compilerOptions.module || getEmitScriptTarget(compilerOptions) >= 2 /* ES2015 */ || !!compilerOptions.noEmit;
}
function createModuleSpecifierResolutionHost(program, host) {
return {
fileExists: (fileName) => program.fileExists(fileName),
getCurrentDirectory: () => host.getCurrentDirectory(),
readFile: maybeBind(host, host.readFile),
useCaseSensitiveFileNames: maybeBind(host, host.useCaseSensitiveFileNames),
getSymlinkCache: maybeBind(host, host.getSymlinkCache) || program.getSymlinkCache,
getModuleSpecifierCache: maybeBind(host, host.getModuleSpecifierCache),
getPackageJsonInfoCache: () => {
var _a;
return (_a = program.getModuleResolutionCache()) == null ? void 0 : _a.getPackageJsonInfoCache();
},
getGlobalTypingsCacheLocation: maybeBind(host, host.getGlobalTypingsCacheLocation),
redirectTargetsMap: program.redirectTargetsMap,
getProjectReferenceRedirect: (fileName) => program.getProjectReferenceRedirect(fileName),
isSourceOfProjectReferenceRedirect: (fileName) => program.isSourceOfProjectReferenceRedirect(fileName),
getNearestAncestorDirectoryWithPackageJson: maybeBind(host, host.getNearestAncestorDirectoryWithPackageJson),
getFileIncludeReasons: () => program.getFileIncludeReasons()
};
}
function getModuleSpecifierResolverHost(program, host) {
return {
...createModuleSpecifierResolutionHost(program, host),
getCommonSourceDirectory: () => program.getCommonSourceDirectory()
};
}
function moduleResolutionUsesNodeModules(moduleResolution) {
return moduleResolution === 2 /* Node10 */ || moduleResolution >= 3 /* Node16 */ && moduleResolution <= 99 /* NodeNext */ || moduleResolution === 100 /* Bundler */;
}
function makeImportIfNecessary(defaultImport, namedImports, moduleSpecifier, quotePreference) {
return defaultImport || namedImports && namedImports.length ? makeImport(defaultImport, namedImports, moduleSpecifier, quotePreference) : void 0;
}
function makeImport(defaultImport, namedImports, moduleSpecifier, quotePreference, isTypeOnly) {
return factory.createImportDeclaration(
/*modifiers*/
void 0,
defaultImport || namedImports ? factory.createImportClause(!!isTypeOnly, defaultImport, namedImports && namedImports.length ? factory.createNamedImports(namedImports) : void 0) : void 0,
typeof moduleSpecifier === "string" ? makeStringLiteral(moduleSpecifier, quotePreference) : moduleSpecifier,
/*assertClause*/
void 0
);
}
function makeStringLiteral(text, quotePreference) {
return factory.createStringLiteral(text, quotePreference === 0 /* Single */);
}
var QuotePreference = /* @__PURE__ */ ((QuotePreference7) => {
QuotePreference7[QuotePreference7["Single"] = 0] = "Single";
QuotePreference7[QuotePreference7["Double"] = 1] = "Double";
return QuotePreference7;
})(QuotePreference || {});
function quotePreferenceFromString(str, sourceFile) {
return isStringDoubleQuoted(str, sourceFile) ? 1 /* Double */ : 0 /* Single */;
}
function getQuotePreference(sourceFile, preferences) {
if (preferences.quotePreference && preferences.quotePreference !== "auto") {
return preferences.quotePreference === "single" ? 0 /* Single */ : 1 /* Double */;
} else {
const firstModuleSpecifier = sourceFile.imports && find(sourceFile.imports, (n) => isStringLiteral(n) && !nodeIsSynthesized(n.parent));
return firstModuleSpecifier ? quotePreferenceFromString(firstModuleSpecifier, sourceFile) : 1 /* Double */;
}
}
function getQuoteFromPreference(qp) {
switch (qp) {
case 0 /* Single */:
return "'";
case 1 /* Double */:
return '"';
default:
return Debug.assertNever(qp);
}
}
function symbolNameNoDefault(symbol) {
const escaped = symbolEscapedNameNoDefault(symbol);
return escaped === void 0 ? void 0 : unescapeLeadingUnderscores(escaped);
}
function symbolEscapedNameNoDefault(symbol) {
if (symbol.escapedName !== "default" /* Default */) {
return symbol.escapedName;
}
return firstDefined(symbol.declarations, (decl) => {
const name = getNameOfDeclaration(decl);
return name && name.kind === 80 /* Identifier */ ? name.escapedText : void 0;
});
}
function isModuleSpecifierLike(node) {
return isStringLiteralLike(node) && (isExternalModuleReference(node.parent) || isImportDeclaration(node.parent) || isRequireCall(
node.parent,
/*requireStringLiteralLikeArgument*/
false
) && node.parent.arguments[0] === node || isImportCall(node.parent) && node.parent.arguments[0] === node);
}
function isObjectBindingElementWithoutPropertyName(bindingElement) {
return isBindingElement(bindingElement) && isObjectBindingPattern(bindingElement.parent) && isIdentifier(bindingElement.name) && !bindingElement.propertyName;
}
function getPropertySymbolFromBindingElement(checker, bindingElement) {
const typeOfPattern = checker.getTypeAtLocation(bindingElement.parent);
return typeOfPattern && checker.getPropertyOfType(typeOfPattern, bindingElement.name.text);
}
function getParentNodeInSpan(node, file, span) {
if (!node)
return void 0;
while (node.parent) {
if (isSourceFile(node.parent) || !spanContainsNode(span, node.parent, file)) {
return node;
}
node = node.parent;
}
}
function spanContainsNode(span, node, file) {
return textSpanContainsPosition(span, node.getStart(file)) && node.getEnd() <= textSpanEnd(span);
}
function findModifier(node, kind) {
return canHaveModifiers(node) ? find(node.modifiers, (m) => m.kind === kind) : void 0;
}
function insertImports(changes, sourceFile, imports, blankLineBetween, preferences) {
const decl = isArray(imports) ? imports[0] : imports;
const importKindPredicate = decl.kind === 242 /* VariableStatement */ ? isRequireVariableStatement : isAnyImportSyntax;
const existingImportStatements = filter(sourceFile.statements, importKindPredicate);
let sortKind = isArray(imports) ? ts_OrganizeImports_exports.detectImportDeclarationSorting(imports, preferences) : 3 /* Both */;
const comparer = ts_OrganizeImports_exports.getOrganizeImportsComparer(preferences, sortKind === 2 /* CaseInsensitive */);
const sortedNewImports = isArray(imports) ? stableSort(imports, (a, b) => ts_OrganizeImports_exports.compareImportsOrRequireStatements(a, b, comparer)) : [imports];
if (!existingImportStatements.length) {
changes.insertNodesAtTopOfFile(sourceFile, sortedNewImports, blankLineBetween);
} else if (existingImportStatements && (sortKind = ts_OrganizeImports_exports.detectImportDeclarationSorting(existingImportStatements, preferences))) {
const comparer2 = ts_OrganizeImports_exports.getOrganizeImportsComparer(preferences, sortKind === 2 /* CaseInsensitive */);
for (const newImport of sortedNewImports) {
const insertionIndex = ts_OrganizeImports_exports.getImportDeclarationInsertionIndex(existingImportStatements, newImport, comparer2);
if (insertionIndex === 0) {
const options = existingImportStatements[0] === sourceFile.statements[0] ? { leadingTriviaOption: ts_textChanges_exports.LeadingTriviaOption.Exclude } : {};
changes.insertNodeBefore(
sourceFile,
existingImportStatements[0],
newImport,
/*blankLineBetween*/
false,
options
);
} else {
const prevImport = existingImportStatements[insertionIndex - 1];
changes.insertNodeAfter(sourceFile, prevImport, newImport);
}
}
} else {
const lastExistingImport = lastOrUndefined(existingImportStatements);
if (lastExistingImport) {
changes.insertNodesAfter(sourceFile, lastExistingImport, sortedNewImports);
} else {
changes.insertNodesAtTopOfFile(sourceFile, sortedNewImports, blankLineBetween);
}
}
}
function getTypeKeywordOfTypeOnlyImport(importClause, sourceFile) {
Debug.assert(importClause.isTypeOnly);
return cast(importClause.getChildAt(0, sourceFile), isTypeKeywordToken);
}
function textSpansEqual(a, b) {
return !!a && !!b && a.start === b.start && a.length === b.length;
}
function documentSpansEqual(a, b) {
return a.fileName === b.fileName && textSpansEqual(a.textSpan, b.textSpan);
}
function forEachUnique(array, callback) {
if (array) {
for (let i = 0; i < array.length; i++) {
if (array.indexOf(array[i]) === i) {
const result = callback(array[i], i);
if (result) {
return result;
}
}
}
}
return void 0;
}
function isTextWhiteSpaceLike(text, startPos, endPos) {
for (let i = startPos; i < endPos; i++) {
if (!isWhiteSpaceLike(text.charCodeAt(i))) {
return false;
}
}
return true;
}
function getMappedLocation(location, sourceMapper, fileExists) {
const mapsTo = sourceMapper.tryGetSourcePosition(location);
return mapsTo && (!fileExists || fileExists(normalizePath(mapsTo.fileName)) ? mapsTo : void 0);
}
function getMappedDocumentSpan(documentSpan, sourceMapper, fileExists) {
const { fileName, textSpan } = documentSpan;
const newPosition = getMappedLocation({ fileName, pos: textSpan.start }, sourceMapper, fileExists);
if (!newPosition)
return void 0;
const newEndPosition = getMappedLocation({ fileName, pos: textSpan.start + textSpan.length }, sourceMapper, fileExists);
const newLength = newEndPosition ? newEndPosition.pos - newPosition.pos : textSpan.length;
return {
fileName: newPosition.fileName,
textSpan: {
start: newPosition.pos,
length: newLength
},
originalFileName: documentSpan.fileName,
originalTextSpan: documentSpan.textSpan,
contextSpan: getMappedContextSpan(documentSpan, sourceMapper, fileExists),
originalContextSpan: documentSpan.contextSpan
};
}
function getMappedContextSpan(documentSpan, sourceMapper, fileExists) {
const contextSpanStart = documentSpan.contextSpan && getMappedLocation(
{ fileName: documentSpan.fileName, pos: documentSpan.contextSpan.start },
sourceMapper,
fileExists
);
const contextSpanEnd = documentSpan.contextSpan && getMappedLocation(
{ fileName: documentSpan.fileName, pos: documentSpan.contextSpan.start + documentSpan.contextSpan.length },
sourceMapper,
fileExists
);
return contextSpanStart && contextSpanEnd ? { start: contextSpanStart.pos, length: contextSpanEnd.pos - contextSpanStart.pos } : void 0;
}
function isFirstDeclarationOfSymbolParameter(symbol) {
const declaration = symbol.declarations ? firstOrUndefined(symbol.declarations) : void 0;
return !!findAncestor(declaration, (n) => isParameter(n) ? true : isBindingElement(n) || isObjectBindingPattern(n) || isArrayBindingPattern(n) ? false : "quit");
}
var displayPartWriter = getDisplayPartWriter();
function getDisplayPartWriter() {
const absoluteMaximumLength = defaultMaximumTruncationLength * 10;
let displayParts;
let lineStart;
let indent3;
let length2;
resetWriter();
const unknownWrite = (text) => writeKind(text, 17 /* text */);
return {
displayParts: () => {
const finalText = displayParts.length && displayParts[displayParts.length - 1].text;
if (length2 > absoluteMaximumLength && finalText && finalText !== "...") {
if (!isWhiteSpaceLike(finalText.charCodeAt(finalText.length - 1))) {
displayParts.push(displayPart(" ", 16 /* space */));
}
displayParts.push(displayPart("...", 15 /* punctuation */));
}
return displayParts;
},
writeKeyword: (text) => writeKind(text, 5 /* keyword */),
writeOperator: (text) => writeKind(text, 12 /* operator */),
writePunctuation: (text) => writeKind(text, 15 /* punctuation */),
writeTrailingSemicolon: (text) => writeKind(text, 15 /* punctuation */),
writeSpace: (text) => writeKind(text, 16 /* space */),
writeStringLiteral: (text) => writeKind(text, 8 /* stringLiteral */),
writeParameter: (text) => writeKind(text, 13 /* parameterName */),
writeProperty: (text) => writeKind(text, 14 /* propertyName */),
writeLiteral: (text) => writeKind(text, 8 /* stringLiteral */),
writeSymbol,
writeLine,
write: unknownWrite,
writeComment: unknownWrite,
getText: () => "",
getTextPos: () => 0,
getColumn: () => 0,
getLine: () => 0,
isAtStartOfLine: () => false,
hasTrailingWhitespace: () => false,
hasTrailingComment: () => false,
rawWrite: notImplemented,
getIndent: () => indent3,
increaseIndent: () => {
indent3++;
},
decreaseIndent: () => {
indent3--;
},
clear: resetWriter
};
function writeIndent() {
if (length2 > absoluteMaximumLength)
return;
if (lineStart) {
const indentString = getIndentString(indent3);
if (indentString) {
length2 += indentString.length;
displayParts.push(displayPart(indentString, 16 /* space */));
}
lineStart = false;
}
}
function writeKind(text, kind) {
if (length2 > absoluteMaximumLength)
return;
writeIndent();
length2 += text.length;
displayParts.push(displayPart(text, kind));
}
function writeSymbol(text, symbol) {
if (length2 > absoluteMaximumLength)
return;
writeIndent();
length2 += text.length;
displayParts.push(symbolPart(text, symbol));
}
function writeLine() {
if (length2 > absoluteMaximumLength)
return;
length2 += 1;
displayParts.push(lineBreakPart());
lineStart = true;
}
function resetWriter() {
displayParts = [];
lineStart = true;
indent3 = 0;
length2 = 0;
}
}
function symbolPart(text, symbol) {
return displayPart(text, displayPartKind(symbol));
function displayPartKind(symbol2) {
const flags = symbol2.flags;
if (flags & 3 /* Variable */) {
return isFirstDeclarationOfSymbolParameter(symbol2) ? 13 /* parameterName */ : 9 /* localName */;
}
if (flags & 4 /* Property */)
return 14 /* propertyName */;
if (flags & 32768 /* GetAccessor */)
return 14 /* propertyName */;
if (flags & 65536 /* SetAccessor */)
return 14 /* propertyName */;
if (flags & 8 /* EnumMember */)
return 19 /* enumMemberName */;
if (flags & 16 /* Function */)
return 20 /* functionName */;
if (flags & 32 /* Class */)
return 1 /* className */;
if (flags & 64 /* Interface */)
return 4 /* interfaceName */;
if (flags & 384 /* Enum */)
return 2 /* enumName */;
if (flags & 1536 /* Module */)
return 11 /* moduleName */;
if (flags & 8192 /* Method */)
return 10 /* methodName */;
if (flags & 262144 /* TypeParameter */)
return 18 /* typeParameterName */;
if (flags & 524288 /* TypeAlias */)
return 0 /* aliasName */;
if (flags & 2097152 /* Alias */)
return 0 /* aliasName */;
return 17 /* text */;
}
}
function displayPart(text, kind) {
return { text, kind: SymbolDisplayPartKind[kind] };
}
function spacePart() {
return displayPart(" ", 16 /* space */);
}
function keywordPart(kind) {
return displayPart(tokenToString(kind), 5 /* keyword */);
}
function punctuationPart(kind) {
return displayPart(tokenToString(kind), 15 /* punctuation */);
}
function operatorPart(kind) {
return displayPart(tokenToString(kind), 12 /* operator */);
}
function parameterNamePart(text) {
return displayPart(text, 13 /* parameterName */);
}
function propertyNamePart(text) {
return displayPart(text, 14 /* propertyName */);
}
function textOrKeywordPart(text) {
const kind = stringToToken(text);
return kind === void 0 ? textPart(text) : keywordPart(kind);
}
function textPart(text) {
return displayPart(text, 17 /* text */);
}
function typeAliasNamePart(text) {
return displayPart(text, 0 /* aliasName */);
}
function typeParameterNamePart(text) {
return displayPart(text, 18 /* typeParameterName */);
}
function linkTextPart(text) {
return displayPart(text, 24 /* linkText */);
}
function linkNamePart(text, target) {
return {
text,
kind: SymbolDisplayPartKind[23 /* linkName */],
target: {
fileName: getSourceFileOfNode(target).fileName,
textSpan: createTextSpanFromNode(target)
}
};
}
function linkPart(text) {
return displayPart(text, 22 /* link */);
}
function buildLinkParts(link, checker) {
var _a;
const prefix = isJSDocLink(link) ? "link" : isJSDocLinkCode(link) ? "linkcode" : "linkplain";
const parts = [linkPart(`{@${prefix} `)];
if (!link.name) {
if (link.text) {
parts.push(linkTextPart(link.text));
}
} else {
const symbol = checker == null ? void 0 : checker.getSymbolAtLocation(link.name);
const suffix = findLinkNameEnd(link.text);
const name = getTextOfNode(link.name) + link.text.slice(0, suffix);
const text = skipSeparatorFromLinkText(link.text.slice(suffix));
const decl = (symbol == null ? void 0 : symbol.valueDeclaration) || ((_a = symbol == null ? void 0 : symbol.declarations) == null ? void 0 : _a[0]);
if (decl) {
parts.push(linkNamePart(name, decl));
if (text)
parts.push(linkTextPart(text));
} else {
parts.push(linkTextPart(name + (suffix ? "" : " ") + text));
}
}
parts.push(linkPart("}"));
return parts;
}
function skipSeparatorFromLinkText(text) {
let pos = 0;
if (text.charCodeAt(pos++) === 124 /* bar */) {
while (pos < text.length && text.charCodeAt(pos) === 32 /* space */)
pos++;
return text.slice(pos);
}
return text;
}
function findLinkNameEnd(text) {
let pos = text.indexOf("://");
if (pos === 0) {
while (pos < text.length && text.charCodeAt(pos) !== 124 /* bar */)
pos++;
return pos;
}
if (text.indexOf("()") === 0)
return 2;
if (text.charAt(0) === "<") {
let brackets2 = 0;
let i = 0;
while (i < text.length) {
if (text[i] === "<")
brackets2++;
if (text[i] === ">")
brackets2--;
i++;
if (!brackets2)
return i;
}
}
return 0;
}
var lineFeed2 = "\n";
function getNewLineOrDefaultFromHost(host, formatSettings) {
var _a;
return (formatSettings == null ? void 0 : formatSettings.newLineCharacter) || ((_a = host.getNewLine) == null ? void 0 : _a.call(host)) || lineFeed2;
}
function lineBreakPart() {
return displayPart("\n", 6 /* lineBreak */);
}
function mapToDisplayParts(writeDisplayParts) {
try {
writeDisplayParts(displayPartWriter);
return displayPartWriter.displayParts();
} finally {
displayPartWriter.clear();
}
}
function typeToDisplayParts(typechecker, type, enclosingDeclaration, flags = 0 /* None */) {
return mapToDisplayParts((writer) => {
typechecker.writeType(type, enclosingDeclaration, flags | 1024 /* MultilineObjectLiterals */ | 16384 /* UseAliasDefinedOutsideCurrentScope */, writer);
});
}
function symbolToDisplayParts(typeChecker, symbol, enclosingDeclaration, meaning, flags = 0 /* None */) {
return mapToDisplayParts((writer) => {
typeChecker.writeSymbol(symbol, enclosingDeclaration, meaning, flags | 8 /* UseAliasDefinedOutsideCurrentScope */, writer);
});
}
function signatureToDisplayParts(typechecker, signature, enclosingDeclaration, flags = 0 /* None */) {
flags |= 16384 /* UseAliasDefinedOutsideCurrentScope */ | 1024 /* MultilineObjectLiterals */ | 32 /* WriteTypeArgumentsOfSignature */ | 8192 /* OmitParameterModifiers */;
return mapToDisplayParts((writer) => {
typechecker.writeSignature(
signature,
enclosingDeclaration,
flags,
/*kind*/
void 0,
writer
);
});
}
function nodeToDisplayParts(node, enclosingDeclaration) {
const file = enclosingDeclaration.getSourceFile();
return mapToDisplayParts((writer) => {
const printer = createPrinterWithRemoveCommentsOmitTrailingSemicolon();
printer.writeNode(4 /* Unspecified */, node, file, writer);
});
}
function isImportOrExportSpecifierName(location) {
return !!location.parent && isImportOrExportSpecifier(location.parent) && location.parent.propertyName === location;
}
function getScriptKind(fileName, host) {
return ensureScriptKind(fileName, host.getScriptKind && host.getScriptKind(fileName));
}
function getSymbolTarget(symbol, checker) {
let next = symbol;
while (isAliasSymbol(next) || isTransientSymbol(next) && next.links.target) {
if (isTransientSymbol(next) && next.links.target) {
next = next.links.target;
} else {
next = skipAlias(next, checker);
}
}
return next;
}
function isAliasSymbol(symbol) {
return (symbol.flags & 2097152 /* Alias */) !== 0;
}
function getUniqueSymbolId(symbol, checker) {
return getSymbolId(skipAlias(symbol, checker));
}
function getFirstNonSpaceCharacterPosition(text, position) {
while (isWhiteSpaceLike(text.charCodeAt(position))) {
position += 1;
}
return position;
}
function getPrecedingNonSpaceCharacterPosition(text, position) {
while (position > -1 && isWhiteSpaceSingleLine(text.charCodeAt(position))) {
position -= 1;
}
return position + 1;
}
function getSynthesizedDeepClone(node, includeTrivia = true) {
const clone2 = node && getSynthesizedDeepCloneWorker(node);
if (clone2 && !includeTrivia)
suppressLeadingAndTrailingTrivia(clone2);
return clone2;
}
function getSynthesizedDeepCloneWithReplacements(node, includeTrivia, replaceNode) {
let clone2 = replaceNode(node);
if (clone2) {
setOriginalNode(clone2, node);
} else {
clone2 = getSynthesizedDeepCloneWorker(node, replaceNode);
}
if (clone2 && !includeTrivia)
suppressLeadingAndTrailingTrivia(clone2);
return clone2;
}
function getSynthesizedDeepCloneWorker(node, replaceNode) {
const nodeClone = replaceNode ? (n) => getSynthesizedDeepCloneWithReplacements(
n,
/*includeTrivia*/
true,
replaceNode
) : getSynthesizedDeepClone;
const nodesClone = replaceNode ? (ns) => ns && getSynthesizedDeepClonesWithReplacements(
ns,
/*includeTrivia*/
true,
replaceNode
) : (ns) => ns && getSynthesizedDeepClones(ns);
const visited = visitEachChild(node, nodeClone, nullTransformationContext, nodesClone, nodeClone);
if (visited === node) {
const clone2 = isStringLiteral(node) ? setOriginalNode(factory.createStringLiteralFromNode(node), node) : isNumericLiteral(node) ? setOriginalNode(factory.createNumericLiteral(node.text, node.numericLiteralFlags), node) : factory.cloneNode(node);
return setTextRange(clone2, node);
}
visited.parent = void 0;
return visited;
}
function getSynthesizedDeepClones(nodes, includeTrivia = true) {
if (nodes) {
const cloned = factory.createNodeArray(nodes.map((n) => getSynthesizedDeepClone(n, includeTrivia)), nodes.hasTrailingComma);
setTextRange(cloned, nodes);
return cloned;
}
return nodes;
}
function getSynthesizedDeepClonesWithReplacements(nodes, includeTrivia, replaceNode) {
return factory.createNodeArray(nodes.map((n) => getSynthesizedDeepCloneWithReplacements(n, includeTrivia, replaceNode)), nodes.hasTrailingComma);
}
function suppressLeadingAndTrailingTrivia(node) {
suppressLeadingTrivia(node);
suppressTrailingTrivia(node);
}
function suppressLeadingTrivia(node) {
addEmitFlagsRecursively(node, 1024 /* NoLeadingComments */, getFirstChild);
}
function suppressTrailingTrivia(node) {
addEmitFlagsRecursively(node, 2048 /* NoTrailingComments */, getLastChild);
}
function copyComments(sourceNode, targetNode) {
const sourceFile = sourceNode.getSourceFile();
const text = sourceFile.text;
if (hasLeadingLineBreak(sourceNode, text)) {
copyLeadingComments(sourceNode, targetNode, sourceFile);
} else {
copyTrailingAsLeadingComments(sourceNode, targetNode, sourceFile);
}
copyTrailingComments(sourceNode, targetNode, sourceFile);
}
function hasLeadingLineBreak(node, text) {
const start2 = node.getFullStart();
const end = node.getStart();
for (let i = start2; i < end; i++) {
if (text.charCodeAt(i) === 10 /* lineFeed */)
return true;
}
return false;
}
function addEmitFlagsRecursively(node, flag, getChild) {
addEmitFlags(node, flag);
const child = getChild(node);
if (child)
addEmitFlagsRecursively(child, flag, getChild);
}
function getFirstChild(node) {
return node.forEachChild((child) => child);
}
function getUniqueName(baseName, sourceFile) {
let nameText = baseName;
for (let i = 1; !isFileLevelUniqueName(sourceFile, nameText); i++) {
nameText = `${baseName}_${i}`;
}
return nameText;
}
function getRenameLocation(edits, renameFilename, name, preferLastLocation) {
let delta = 0;
let lastPos = -1;
for (const { fileName, textChanges: textChanges2 } of edits) {
Debug.assert(fileName === renameFilename);
for (const change of textChanges2) {
const { span, newText } = change;
const index = indexInTextChange(newText, escapeString(name));
if (index !== -1) {
lastPos = span.start + delta + index;
if (!preferLastLocation) {
return lastPos;
}
}
delta += newText.length - span.length;
}
}
Debug.assert(preferLastLocation);
Debug.assert(lastPos >= 0);
return lastPos;
}
function copyLeadingComments(sourceNode, targetNode, sourceFile, commentKind, hasTrailingNewLine) {
forEachLeadingCommentRange(sourceFile.text, sourceNode.pos, getAddCommentsFunction(targetNode, sourceFile, commentKind, hasTrailingNewLine, addSyntheticLeadingComment));
}
function copyTrailingComments(sourceNode, targetNode, sourceFile, commentKind, hasTrailingNewLine) {
forEachTrailingCommentRange(sourceFile.text, sourceNode.end, getAddCommentsFunction(targetNode, sourceFile, commentKind, hasTrailingNewLine, addSyntheticTrailingComment));
}
function copyTrailingAsLeadingComments(sourceNode, targetNode, sourceFile, commentKind, hasTrailingNewLine) {
forEachTrailingCommentRange(sourceFile.text, sourceNode.pos, getAddCommentsFunction(targetNode, sourceFile, commentKind, hasTrailingNewLine, addSyntheticLeadingComment));
}
function getAddCommentsFunction(targetNode, sourceFile, commentKind, hasTrailingNewLine, cb) {
return (pos, end, kind, htnl) => {
if (kind === 3 /* MultiLineCommentTrivia */) {
pos += 2;
end -= 2;
} else {
pos += 2;
}
cb(targetNode, commentKind || kind, sourceFile.text.slice(pos, end), hasTrailingNewLine !== void 0 ? hasTrailingNewLine : htnl);
};
}
function indexInTextChange(change, name) {
if (startsWith(change, name))
return 0;
let idx = change.indexOf(" " + name);
if (idx === -1)
idx = change.indexOf("." + name);
if (idx === -1)
idx = change.indexOf('"' + name);
return idx === -1 ? -1 : idx + 1;
}
function needsParentheses(expression) {
return isBinaryExpression(expression) && expression.operatorToken.kind === 28 /* CommaToken */ || isObjectLiteralExpression(expression) || isAsExpression(expression) && isObjectLiteralExpression(expression.expression);
}
function getContextualTypeFromParent(node, checker, contextFlags) {
const parent2 = walkUpParenthesizedExpressions(node.parent);
switch (parent2.kind) {
case 213 /* NewExpression */:
return checker.getContextualType(parent2, contextFlags);
case 225 /* BinaryExpression */: {
const { left, operatorToken, right } = parent2;
return isEqualityOperatorKind(operatorToken.kind) ? checker.getTypeAtLocation(node === right ? left : right) : checker.getContextualType(node, contextFlags);
}
case 295 /* CaseClause */:
return getSwitchedType(parent2, checker);
default:
return checker.getContextualType(node, contextFlags);
}
}
function quote(sourceFile, preferences, text) {
const quotePreference = getQuotePreference(sourceFile, preferences);
const quoted = JSON.stringify(text);
return quotePreference === 0 /* Single */ ? `'${stripQuotes(quoted).replace(/'/g, "\\'").replace(/\\"/g, '"')}'` : quoted;
}
function isEqualityOperatorKind(kind) {
switch (kind) {
case 37 /* EqualsEqualsEqualsToken */:
case 35 /* EqualsEqualsToken */:
case 38 /* ExclamationEqualsEqualsToken */:
case 36 /* ExclamationEqualsToken */:
return true;
default:
return false;
}
}
function isStringLiteralOrTemplate(node) {
switch (node.kind) {
case 11 /* StringLiteral */:
case 15 /* NoSubstitutionTemplateLiteral */:
case 227 /* TemplateExpression */:
case 214 /* TaggedTemplateExpression */:
return true;
default:
return false;
}
}
function hasIndexSignature(type) {
return !!type.getStringIndexType() || !!type.getNumberIndexType();
}
function getSwitchedType(caseClause, checker) {
return checker.getTypeAtLocation(caseClause.parent.parent.expression);
}
var ANONYMOUS = "anonymous function";
function getTypeNodeIfAccessible(type, enclosingScope, program, host) {
const checker = program.getTypeChecker();
let typeIsAccessible = true;
const notAccessible = () => typeIsAccessible = false;
const res = checker.typeToTypeNode(type, enclosingScope, 1 /* NoTruncation */, {
trackSymbol: (symbol, declaration, meaning) => {
typeIsAccessible = typeIsAccessible && checker.isSymbolAccessible(
symbol,
declaration,
meaning,
/*shouldComputeAliasToMarkVisible*/
false
).accessibility === 0 /* Accessible */;
return !typeIsAccessible;
},
reportInaccessibleThisError: notAccessible,
reportPrivateInBaseOfClassExpression: notAccessible,
reportInaccessibleUniqueSymbolError: notAccessible,
moduleResolverHost: getModuleSpecifierResolverHost(program, host)
});
return typeIsAccessible ? res : void 0;
}
function syntaxRequiresTrailingCommaOrSemicolonOrASI(kind) {
return kind === 178 /* CallSignature */ || kind === 179 /* ConstructSignature */ || kind === 180 /* IndexSignature */ || kind === 170 /* PropertySignature */ || kind === 172 /* MethodSignature */;
}
function syntaxRequiresTrailingFunctionBlockOrSemicolonOrASI(kind) {
return kind === 261 /* FunctionDeclaration */ || kind === 175 /* Constructor */ || kind === 173 /* MethodDeclaration */ || kind === 176 /* GetAccessor */ || kind === 177 /* SetAccessor */;
}
function syntaxRequiresTrailingModuleBlockOrSemicolonOrASI(kind) {
return kind === 266 /* ModuleDeclaration */;
}
function syntaxRequiresTrailingSemicolonOrASI(kind) {
return kind === 242 /* VariableStatement */ || kind === 243 /* ExpressionStatement */ || kind === 245 /* DoStatement */ || kind === 250 /* ContinueStatement */ || kind === 251 /* BreakStatement */ || kind === 252 /* ReturnStatement */ || kind === 256 /* ThrowStatement */ || kind === 258 /* DebuggerStatement */ || kind === 171 /* PropertyDeclaration */ || kind === 264 /* TypeAliasDeclaration */ || kind === 271 /* ImportDeclaration */ || kind === 270 /* ImportEqualsDeclaration */ || kind === 277 /* ExportDeclaration */ || kind === 269 /* NamespaceExportDeclaration */ || kind === 276 /* ExportAssignment */;
}
var syntaxMayBeASICandidate = or(
syntaxRequiresTrailingCommaOrSemicolonOrASI,
syntaxRequiresTrailingFunctionBlockOrSemicolonOrASI,
syntaxRequiresTrailingModuleBlockOrSemicolonOrASI,
syntaxRequiresTrailingSemicolonOrASI
);
function nodeIsASICandidate(node, sourceFile) {
const lastToken = node.getLastToken(sourceFile);
if (lastToken && lastToken.kind === 27 /* SemicolonToken */) {
return false;
}
if (syntaxRequiresTrailingCommaOrSemicolonOrASI(node.kind)) {
if (lastToken && lastToken.kind === 28 /* CommaToken */) {
return false;
}
} else if (syntaxRequiresTrailingModuleBlockOrSemicolonOrASI(node.kind)) {
const lastChild = last(node.getChildren(sourceFile));
if (lastChild && isModuleBlock(lastChild)) {
return false;
}
} else if (syntaxRequiresTrailingFunctionBlockOrSemicolonOrASI(node.kind)) {
const lastChild = last(node.getChildren(sourceFile));
if (lastChild && isFunctionBlock(lastChild)) {
return false;
}
} else if (!syntaxRequiresTrailingSemicolonOrASI(node.kind)) {
return false;
}
if (node.kind === 245 /* DoStatement */) {
return true;
}
const topNode = findAncestor(node, (ancestor) => !ancestor.parent);
const nextToken = findNextToken(node, topNode, sourceFile);
if (!nextToken || nextToken.kind === 20 /* CloseBraceToken */) {
return true;
}
const startLine = sourceFile.getLineAndCharacterOfPosition(node.getEnd()).line;
const endLine = sourceFile.getLineAndCharacterOfPosition(nextToken.getStart(sourceFile)).line;
return startLine !== endLine;
}
function positionIsASICandidate(pos, context, sourceFile) {
const contextAncestor = findAncestor(context, (ancestor) => {
if (ancestor.end !== pos) {
return "quit";
}
return syntaxMayBeASICandidate(ancestor.kind);
});
return !!contextAncestor && nodeIsASICandidate(contextAncestor, sourceFile);
}
function probablyUsesSemicolons(sourceFile) {
let withSemicolon = 0;
let withoutSemicolon = 0;
const nStatementsToObserve = 5;
forEachChild(sourceFile, function visit(node) {
if (syntaxRequiresTrailingSemicolonOrASI(node.kind)) {
const lastToken = node.getLastToken(sourceFile);
if ((lastToken == null ? void 0 : lastToken.kind) === 27 /* SemicolonToken */) {
withSemicolon++;
} else {
withoutSemicolon++;
}
} else if (syntaxRequiresTrailingCommaOrSemicolonOrASI(node.kind)) {
const lastToken = node.getLastToken(sourceFile);
if ((lastToken == null ? void 0 : lastToken.kind) === 27 /* SemicolonToken */) {
withSemicolon++;
} else if (lastToken && lastToken.kind !== 28 /* CommaToken */) {
const lastTokenLine = getLineAndCharacterOfPosition(sourceFile, lastToken.getStart(sourceFile)).line;
const nextTokenLine = getLineAndCharacterOfPosition(sourceFile, getSpanOfTokenAtPosition(sourceFile, lastToken.end).start).line;
if (lastTokenLine !== nextTokenLine) {
withoutSemicolon++;
}
}
}
if (withSemicolon + withoutSemicolon >= nStatementsToObserve) {
return true;
}
return forEachChild(node, visit);
});
if (withSemicolon === 0 && withoutSemicolon <= 1) {
return true;
}
return withSemicolon / withoutSemicolon > 1 / nStatementsToObserve;
}
function tryGetDirectories(host, directoryName) {
return tryIOAndConsumeErrors(host, host.getDirectories, directoryName) || [];
}
function tryReadDirectory(host, path, extensions, exclude, include) {
return tryIOAndConsumeErrors(host, host.readDirectory, path, extensions, exclude, include) || emptyArray;
}
function tryFileExists(host, path) {
return tryIOAndConsumeErrors(host, host.fileExists, path);
}
function tryDirectoryExists(host, path) {
return tryAndIgnoreErrors(() => directoryProbablyExists(path, host)) || false;
}
function tryAndIgnoreErrors(cb) {
try {
return cb();
} catch {
return void 0;
}
}
function tryIOAndConsumeErrors(host, toApply, ...args) {
return tryAndIgnoreErrors(() => toApply && toApply.apply(host, args));
}
function findPackageJsons(startDirectory, host, stopDirectory) {
const paths = [];
forEachAncestorDirectory(startDirectory, (ancestor) => {
if (ancestor === stopDirectory) {
return true;
}
const currentConfigPath = combinePaths(ancestor, "package.json");
if (tryFileExists(host, currentConfigPath)) {
paths.push(currentConfigPath);
}
});
return paths;
}
function findPackageJson(directory, host) {
let packageJson;
forEachAncestorDirectory(directory, (ancestor) => {
if (ancestor === "node_modules")
return true;
packageJson = findConfigFile(ancestor, (f) => tryFileExists(host, f), "package.json");
if (packageJson) {
return true;
}
});
return packageJson;
}
function getPackageJsonsVisibleToFile(fileName, host) {
if (!host.fileExists) {
return [];
}
const packageJsons = [];
forEachAncestorDirectory(getDirectoryPath(fileName), (ancestor) => {
const packageJsonFileName = combinePaths(ancestor, "package.json");
if (host.fileExists(packageJsonFileName)) {
const info = createPackageJsonInfo(packageJsonFileName, host);
if (info) {
packageJsons.push(info);
}
}
});
return packageJsons;
}
function createPackageJsonInfo(fileName, host) {
if (!host.readFile) {
return void 0;
}
const dependencyKeys = ["dependencies", "devDependencies", "optionalDependencies", "peerDependencies"];
const stringContent = host.readFile(fileName) || "";
const content = tryParseJson(stringContent);
const info = {};
if (content) {
for (const key of dependencyKeys) {
const dependencies = content[key];
if (!dependencies) {
continue;
}
const dependencyMap = /* @__PURE__ */ new Map();
for (const packageName in dependencies) {
dependencyMap.set(packageName, dependencies[packageName]);
}
info[key] = dependencyMap;
}
}
const dependencyGroups = [
[1 /* Dependencies */, info.dependencies],
[2 /* DevDependencies */, info.devDependencies],
[8 /* OptionalDependencies */, info.optionalDependencies],
[4 /* PeerDependencies */, info.peerDependencies]
];
return {
...info,
parseable: !!content,
fileName,
get,
has(dependencyName, inGroups) {
return !!get(dependencyName, inGroups);
}
};
function get(dependencyName, inGroups = 15 /* All */) {
for (const [group2, deps] of dependencyGroups) {
if (deps && inGroups & group2) {
const dep = deps.get(dependencyName);
if (dep !== void 0) {
return dep;
}
}
}
}
}
function createPackageJsonImportFilter(fromFile, preferences, host) {
const packageJsons = (host.getPackageJsonsVisibleToFile && host.getPackageJsonsVisibleToFile(fromFile.fileName) || getPackageJsonsVisibleToFile(fromFile.fileName, host)).filter((p) => p.parseable);
let usesNodeCoreModules;
let ambientModuleCache;
let sourceFileCache;
return {
allowsImportingAmbientModule,
allowsImportingSourceFile,
allowsImportingSpecifier
};
function moduleSpecifierIsCoveredByPackageJson(specifier) {
const packageName = getNodeModuleRootSpecifier(specifier);
for (const packageJson of packageJsons) {
if (packageJson.has(packageName) || packageJson.has(getTypesPackageName(packageName))) {
return true;
}
}
return false;
}
function allowsImportingAmbientModule(moduleSymbol, moduleSpecifierResolutionHost) {
if (!packageJsons.length || !moduleSymbol.valueDeclaration) {
return true;
}
if (!ambientModuleCache) {
ambientModuleCache = /* @__PURE__ */ new Map();
} else {
const cached = ambientModuleCache.get(moduleSymbol);
if (cached !== void 0) {
return cached;
}
}
const declaredModuleSpecifier = stripQuotes(moduleSymbol.getName());
if (isAllowedCoreNodeModulesImport(declaredModuleSpecifier)) {
ambientModuleCache.set(moduleSymbol, true);
return true;
}
const declaringSourceFile = moduleSymbol.valueDeclaration.getSourceFile();
const declaringNodeModuleName = getNodeModulesPackageNameFromFileName(declaringSourceFile.fileName, moduleSpecifierResolutionHost);
if (typeof declaringNodeModuleName === "undefined") {
ambientModuleCache.set(moduleSymbol, true);
return true;
}
const result = moduleSpecifierIsCoveredByPackageJson(declaringNodeModuleName) || moduleSpecifierIsCoveredByPackageJson(declaredModuleSpecifier);
ambientModuleCache.set(moduleSymbol, result);
return result;
}
function allowsImportingSourceFile(sourceFile, moduleSpecifierResolutionHost) {
if (!packageJsons.length) {
return true;
}
if (!sourceFileCache) {
sourceFileCache = /* @__PURE__ */ new Map();
} else {
const cached = sourceFileCache.get(sourceFile);
if (cached !== void 0) {
return cached;
}
}
const moduleSpecifier = getNodeModulesPackageNameFromFileName(sourceFile.fileName, moduleSpecifierResolutionHost);
if (!moduleSpecifier) {
sourceFileCache.set(sourceFile, true);
return true;
}
const result = moduleSpecifierIsCoveredByPackageJson(moduleSpecifier);
sourceFileCache.set(sourceFile, result);
return result;
}
function allowsImportingSpecifier(moduleSpecifier) {
if (!packageJsons.length || isAllowedCoreNodeModulesImport(moduleSpecifier)) {
return true;
}
if (pathIsRelative(moduleSpecifier) || isRootedDiskPath(moduleSpecifier)) {
return true;
}
return moduleSpecifierIsCoveredByPackageJson(moduleSpecifier);
}
function isAllowedCoreNodeModulesImport(moduleSpecifier) {
if (isSourceFileJS(fromFile) && ts_JsTyping_exports.nodeCoreModules.has(moduleSpecifier)) {
if (usesNodeCoreModules === void 0) {
usesNodeCoreModules = consumesNodeCoreModules(fromFile);
}
if (usesNodeCoreModules) {
return true;
}
}
return false;
}
function getNodeModulesPackageNameFromFileName(importedFileName, moduleSpecifierResolutionHost) {
if (!stringContains(importedFileName, "node_modules")) {
return void 0;
}
const specifier = ts_moduleSpecifiers_exports.getNodeModulesPackageName(
host.getCompilationSettings(),
fromFile,
importedFileName,
moduleSpecifierResolutionHost,
preferences
);
if (!specifier) {
return void 0;
}
if (!pathIsRelative(specifier) && !isRootedDiskPath(specifier)) {
return getNodeModuleRootSpecifier(specifier);
}
}
function getNodeModuleRootSpecifier(fullSpecifier) {
const components = getPathComponents(getPackageNameFromTypesPackageName(fullSpecifier)).slice(1);
if (startsWith(components[0], "@")) {
return `${components[0]}/${components[1]}`;
}
return components[0];
}
}
function tryParseJson(text) {
try {
return JSON.parse(text);
} catch {
return void 0;
}
}
function consumesNodeCoreModules(sourceFile) {
return some(sourceFile.imports, ({ text }) => ts_JsTyping_exports.nodeCoreModules.has(text));
}
function isInsideNodeModules(fileOrDirectory) {
return contains(getPathComponents(fileOrDirectory), "node_modules");
}
function isDiagnosticWithLocation(diagnostic) {
return diagnostic.file !== void 0 && diagnostic.start !== void 0 && diagnostic.length !== void 0;
}
function findDiagnosticForNode(node, sortedFileDiagnostics) {
const span = createTextSpanFromNode(node);
const index = binarySearchKey(sortedFileDiagnostics, span, identity, compareTextSpans);
if (index >= 0) {
const diagnostic = sortedFileDiagnostics[index];
Debug.assertEqual(diagnostic.file, node.getSourceFile(), "Diagnostics proided to 'findDiagnosticForNode' must be from a single SourceFile");
return cast(diagnostic, isDiagnosticWithLocation);
}
}
function getDiagnosticsWithinSpan(span, sortedFileDiagnostics) {
var _a;
let index = binarySearchKey(sortedFileDiagnostics, span.start, (diag2) => diag2.start, compareValues);
if (index < 0) {
index = ~index;
}
while (((_a = sortedFileDiagnostics[index - 1]) == null ? void 0 : _a.start) === span.start) {
index--;
}
const result = [];
const end = textSpanEnd(span);
while (true) {
const diagnostic = tryCast(sortedFileDiagnostics[index], isDiagnosticWithLocation);
if (!diagnostic || diagnostic.start > end) {
break;
}
if (textSpanContainsTextSpan(span, diagnostic)) {
result.push(diagnostic);
}
index++;
}
return result;
}
function getRefactorContextSpan({ startPosition, endPosition }) {
return createTextSpanFromBounds(startPosition, endPosition === void 0 ? startPosition : endPosition);
}
function getFixableErrorSpanExpression(sourceFile, span) {
const token = getTokenAtPosition(sourceFile, span.start);
const expression = findAncestor(token, (node) => {
if (node.getStart(sourceFile) < span.start || node.getEnd() > textSpanEnd(span)) {
return "quit";
}
return isExpression(node) && textSpansEqual(span, createTextSpanFromNode(node, sourceFile));
});
return expression;
}
function mapOneOrMany(valueOrArray, f, resultSelector = identity) {
return valueOrArray ? isArray(valueOrArray) ? resultSelector(map(valueOrArray, f)) : f(valueOrArray, 0) : void 0;
}
function firstOrOnly(valueOrArray) {
return isArray(valueOrArray) ? first(valueOrArray) : valueOrArray;
}
function getNamesForExportedSymbol(symbol, scriptTarget) {
if (needsNameFromDeclaration(symbol)) {
const fromDeclaration = getDefaultLikeExportNameFromDeclaration(symbol);
if (fromDeclaration)
return fromDeclaration;
const fileNameCase = ts_codefix_exports.moduleSymbolToValidIdentifier(
getSymbolParentOrFail(symbol),
scriptTarget,
/*forceCapitalize*/
false
);
const capitalized = ts_codefix_exports.moduleSymbolToValidIdentifier(
getSymbolParentOrFail(symbol),
scriptTarget,
/*forceCapitalize*/
true
);
if (fileNameCase === capitalized)
return fileNameCase;
return [fileNameCase, capitalized];
}
return symbol.name;
}
function getNameForExportedSymbol(symbol, scriptTarget, preferCapitalized) {
if (needsNameFromDeclaration(symbol)) {
return getDefaultLikeExportNameFromDeclaration(symbol) || ts_codefix_exports.moduleSymbolToValidIdentifier(getSymbolParentOrFail(symbol), scriptTarget, !!preferCapitalized);
}
return symbol.name;
}
function needsNameFromDeclaration(symbol) {
return !(symbol.flags & 33554432 /* Transient */) && (symbol.escapedName === "export=" /* ExportEquals */ || symbol.escapedName === "default" /* Default */);
}
function getDefaultLikeExportNameFromDeclaration(symbol) {
return firstDefined(
symbol.declarations,
(d) => {
var _a, _b;
return isExportAssignment(d) ? (_a = tryCast(skipOuterExpressions(d.expression), isIdentifier)) == null ? void 0 : _a.text : (_b = tryCast(getNameOfDeclaration(d), isIdentifier)) == null ? void 0 : _b.text;
}
);
}
function getSymbolParentOrFail(symbol) {
var _a;
return Debug.checkDefined(
symbol.parent,
`Symbol parent was undefined. Flags: ${Debug.formatSymbolFlags(symbol.flags)}. Declarations: ${(_a = symbol.declarations) == null ? void 0 : _a.map((d) => {
const kind = Debug.formatSyntaxKind(d.kind);
const inJS = isInJSFile(d);
const { expression } = d;
return (inJS ? "[JS]" : "") + kind + (expression ? ` (expression: ${Debug.formatSyntaxKind(expression.kind)})` : "");
}).join(", ")}.`
);
}
function stringContainsAt(haystack, needle, startIndex) {
const needleLength = needle.length;
if (needleLength + startIndex > haystack.length) {
return false;
}
for (let i = 0; i < needleLength; i++) {
if (needle.charCodeAt(i) !== haystack.charCodeAt(i + startIndex))
return false;
}
return true;
}
function startsWithUnderscore(name) {
return name.charCodeAt(0) === 95 /* _ */;
}
function isGlobalDeclaration(declaration) {
return !isNonGlobalDeclaration(declaration);
}
function isNonGlobalDeclaration(declaration) {
const sourceFile = declaration.getSourceFile();
if (!sourceFile.externalModuleIndicator && !sourceFile.commonJsModuleIndicator) {
return false;
}
return isInJSFile(declaration) || !findAncestor(declaration, (d) => isModuleDeclaration(d) && isGlobalScopeAugmentation(d));
}
function isDeprecatedDeclaration(decl) {
return !!(getCombinedNodeFlagsAlwaysIncludeJSDoc(decl) & 8192 /* Deprecated */);
}
function shouldUseUriStyleNodeCoreModules(file, program) {
const decisionFromFile = firstDefined(file.imports, (node) => {
if (ts_JsTyping_exports.nodeCoreModules.has(node.text)) {
return startsWith(node.text, "node:");
}
});
return decisionFromFile ?? program.usesUriStyleNodeCoreModules;
}
function getNewLineKind(newLineCharacter) {
return newLineCharacter === "\n" ? 1 /* LineFeed */ : 0 /* CarriageReturnLineFeed */;
}
function diagnosticToString(diag2) {
return isArray(diag2) ? formatStringFromArgs(getLocaleSpecificMessage(diag2[0]), diag2.slice(1)) : getLocaleSpecificMessage(diag2);
}
function getFormatCodeSettingsForWriting({ options }, sourceFile) {
const shouldAutoDetectSemicolonPreference = !options.semicolons || options.semicolons === "ignore" /* Ignore */;
const shouldRemoveSemicolons = options.semicolons === "remove" /* Remove */ || shouldAutoDetectSemicolonPreference && !probablyUsesSemicolons(sourceFile);
return {
...options,
semicolons: shouldRemoveSemicolons ? "remove" /* Remove */ : "ignore" /* Ignore */
};
}
function jsxModeNeedsExplicitImport(jsx) {
return jsx === 2 /* React */ || jsx === 3 /* ReactNative */;
}
function isSourceFileFromLibrary(program, node) {
return program.isSourceFileFromExternalLibrary(node) || program.isSourceFileDefaultLibrary(node);
}
function newCaseClauseTracker(checker, clauses) {
const existingStrings = /* @__PURE__ */ new Set();
const existingNumbers = /* @__PURE__ */ new Set();
const existingBigInts = /* @__PURE__ */ new Set();
for (const clause of clauses) {
if (!isDefaultClause(clause)) {
const expression = skipParentheses(clause.expression);
if (isLiteralExpression(expression)) {
switch (expression.kind) {
case 15 /* NoSubstitutionTemplateLiteral */:
case 11 /* StringLiteral */:
existingStrings.add(expression.text);
break;
case 9 /* NumericLiteral */:
existingNumbers.add(parseInt(expression.text));
break;
case 10 /* BigIntLiteral */:
const parsedBigInt = parseBigInt(endsWith(expression.text, "n") ? expression.text.slice(0, -1) : expression.text);
if (parsedBigInt) {
existingBigInts.add(pseudoBigIntToString(parsedBigInt));
}
break;
}
} else {
const symbol = checker.getSymbolAtLocation(clause.expression);
if (symbol && symbol.valueDeclaration && isEnumMember(symbol.valueDeclaration)) {
const enumValue = checker.getConstantValue(symbol.valueDeclaration);
if (enumValue !== void 0) {
addValue(enumValue);
}
}
}
}
}
return {
addValue,
hasValue
};
function addValue(value) {
switch (typeof value) {
case "string":
existingStrings.add(value);
break;
case "number":
existingNumbers.add(value);
}
}
function hasValue(value) {
switch (typeof value) {
case "string":
return existingStrings.has(value);
case "number":
return existingNumbers.has(value);
case "object":
return existingBigInts.has(pseudoBigIntToString(value));
}
}
}
function fileShouldUseJavaScriptRequire(file, program, host, preferRequire) {
var _a;
const fileName = typeof file === "string" ? file : file.fileName;
if (!hasJSFileExtension(fileName)) {
return false;
}
const compilerOptions = program.getCompilerOptions();
const moduleKind = getEmitModuleKind(compilerOptions);
const impliedNodeFormat = typeof file === "string" ? getImpliedNodeFormatForFile(toPath(file, host.getCurrentDirectory(), hostGetCanonicalFileName(host)), (_a = program.getPackageJsonInfoCache) == null ? void 0 : _a.call(program), host, compilerOptions) : file.impliedNodeFormat;
if (impliedNodeFormat === 99 /* ESNext */) {
return false;
}
if (impliedNodeFormat === 1 /* CommonJS */) {
return true;
}
if (compilerOptions.verbatimModuleSyntax && moduleKind === 1 /* CommonJS */) {
return true;
}
if (compilerOptions.verbatimModuleSyntax && emitModuleKindIsNonNodeESM(moduleKind)) {
return false;
}
if (typeof file === "object") {
if (file.commonJsModuleIndicator) {
return true;
}
if (file.externalModuleIndicator) {
return false;
}
}
return preferRequire;
}
// src/services/exportInfoMap.ts
var ImportKind = /* @__PURE__ */ ((ImportKind2) => {
ImportKind2[ImportKind2["Named"] = 0] = "Named";
ImportKind2[ImportKind2["Default"] = 1] = "Default";
ImportKind2[ImportKind2["Namespace"] = 2] = "Namespace";
ImportKind2[ImportKind2["CommonJS"] = 3] = "CommonJS";
return ImportKind2;
})(ImportKind || {});
var ExportKind = /* @__PURE__ */ ((ExportKind3) => {
ExportKind3[ExportKind3["Named"] = 0] = "Named";
ExportKind3[ExportKind3["Default"] = 1] = "Default";
ExportKind3[ExportKind3["ExportEquals"] = 2] = "ExportEquals";
ExportKind3[ExportKind3["UMD"] = 3] = "UMD";
return ExportKind3;
})(ExportKind || {});
function createCacheableExportInfoMap(host) {
let exportInfoId = 1;
const exportInfo = createMultiMap();
const symbols = /* @__PURE__ */ new Map();
const packages = /* @__PURE__ */ new Map();
let usableByFileName;
const cache = {
isUsableByFile: (importingFile) => importingFile === usableByFileName,
isEmpty: () => !exportInfo.size,
clear: () => {
exportInfo.clear();
symbols.clear();
usableByFileName = void 0;
},
add: (importingFile, symbol, symbolTableKey, moduleSymbol, moduleFile, exportKind, isFromPackageJson, checker) => {
if (importingFile !== usableByFileName) {
cache.clear();
usableByFileName = importingFile;
}
let packageName;
if (moduleFile) {
const nodeModulesPathParts = getNodeModulePathParts(moduleFile.fileName);
if (nodeModulesPathParts) {
const { topLevelNodeModulesIndex, topLevelPackageNameIndex, packageRootIndex } = nodeModulesPathParts;
packageName = unmangleScopedPackageName(getPackageNameFromTypesPackageName(moduleFile.fileName.substring(topLevelPackageNameIndex + 1, packageRootIndex)));
if (startsWith(importingFile, moduleFile.path.substring(0, topLevelNodeModulesIndex))) {
const prevDeepestNodeModulesPath = packages.get(packageName);
const nodeModulesPath = moduleFile.fileName.substring(0, topLevelPackageNameIndex + 1);
if (prevDeepestNodeModulesPath) {
const prevDeepestNodeModulesIndex = prevDeepestNodeModulesPath.indexOf(nodeModulesPathPart);
if (topLevelNodeModulesIndex > prevDeepestNodeModulesIndex) {
packages.set(packageName, nodeModulesPath);
}
} else {
packages.set(packageName, nodeModulesPath);
}
}
}
}
const isDefault = exportKind === 1 /* Default */;
const namedSymbol = isDefault && getLocalSymbolForExportDefault(symbol) || symbol;
const names = exportKind === 0 /* Named */ || isExternalModuleSymbol(namedSymbol) ? unescapeLeadingUnderscores(symbolTableKey) : getNamesForExportedSymbol(
namedSymbol,
/*scriptTarget*/
void 0
);
const symbolName2 = typeof names === "string" ? names : names[0];
const capitalizedSymbolName = typeof names === "string" ? void 0 : names[1];
const moduleName = stripQuotes(moduleSymbol.name);
const id = exportInfoId++;
const target = skipAlias(symbol, checker);
const storedSymbol = symbol.flags & 33554432 /* Transient */ ? void 0 : symbol;
const storedModuleSymbol = moduleSymbol.flags & 33554432 /* Transient */ ? void 0 : moduleSymbol;
if (!storedSymbol || !storedModuleSymbol)
symbols.set(id, [symbol, moduleSymbol]);
exportInfo.add(key(symbolName2, symbol, isExternalModuleNameRelative(moduleName) ? void 0 : moduleName, checker), {
id,
symbolTableKey,
symbolName: symbolName2,
capitalizedSymbolName,
moduleName,
moduleFile,
moduleFileName: moduleFile == null ? void 0 : moduleFile.fileName,
packageName,
exportKind,
targetFlags: target.flags,
isFromPackageJson,
symbol: storedSymbol,
moduleSymbol: storedModuleSymbol
});
},
get: (importingFile, key2) => {
if (importingFile !== usableByFileName)
return;
const result = exportInfo.get(key2);
return result == null ? void 0 : result.map(rehydrateCachedInfo);
},
search: (importingFile, preferCapitalized, matches, action) => {
if (importingFile !== usableByFileName)
return;
return forEachEntry(exportInfo, (info, key2) => {
const { symbolName: symbolName2, ambientModuleName } = parseKey(key2);
const name = preferCapitalized && info[0].capitalizedSymbolName || symbolName2;
if (matches(name, info[0].targetFlags)) {
const rehydrated = info.map(rehydrateCachedInfo);
const filtered = rehydrated.filter((r, i) => isNotShadowedByDeeperNodeModulesPackage(r, info[i].packageName));
if (filtered.length) {
const res = action(filtered, name, !!ambientModuleName, key2);
if (res !== void 0)
return res;
}
}
});
},
releaseSymbols: () => {
symbols.clear();
},
onFileChanged: (oldSourceFile, newSourceFile, typeAcquisitionEnabled) => {
if (fileIsGlobalOnly(oldSourceFile) && fileIsGlobalOnly(newSourceFile)) {
return false;
}
if (usableByFileName && usableByFileName !== newSourceFile.path || // If ATA is enabled, auto-imports uses existing imports to guess whether you want auto-imports from node.
// Adding or removing imports from node could change the outcome of that guess, so could change the suggestions list.
typeAcquisitionEnabled && consumesNodeCoreModules(oldSourceFile) !== consumesNodeCoreModules(newSourceFile) || // Module agumentation and ambient module changes can add or remove exports available to be auto-imported.
// Changes elsewhere in the file can change the *type* of an export in a module augmentation,
// but type info is gathered in getCompletionEntryDetails, which doesn't use the cache.
!arrayIsEqualTo(oldSourceFile.moduleAugmentations, newSourceFile.moduleAugmentations) || !ambientModuleDeclarationsAreEqual(oldSourceFile, newSourceFile)) {
cache.clear();
return true;
}
usableByFileName = newSourceFile.path;
return false;
}
};
if (Debug.isDebugging) {
Object.defineProperty(cache, "__cache", { get: () => exportInfo });
}
return cache;
function rehydrateCachedInfo(info) {
if (info.symbol && info.moduleSymbol)
return info;
const { id, exportKind, targetFlags, isFromPackageJson, moduleFileName } = info;
const [cachedSymbol, cachedModuleSymbol] = symbols.get(id) || emptyArray;
if (cachedSymbol && cachedModuleSymbol) {
return {
symbol: cachedSymbol,
moduleSymbol: cachedModuleSymbol,
moduleFileName,
exportKind,
targetFlags,
isFromPackageJson
};
}
const checker = (isFromPackageJson ? host.getPackageJsonAutoImportProvider() : host.getCurrentProgram()).getTypeChecker();
const moduleSymbol = info.moduleSymbol || cachedModuleSymbol || Debug.checkDefined(info.moduleFile ? checker.getMergedSymbol(info.moduleFile.symbol) : checker.tryFindAmbientModule(info.moduleName));
const symbol = info.symbol || cachedSymbol || Debug.checkDefined(
exportKind === 2 /* ExportEquals */ ? checker.resolveExternalModuleSymbol(moduleSymbol) : checker.tryGetMemberInModuleExportsAndProperties(unescapeLeadingUnderscores(info.symbolTableKey), moduleSymbol),
`Could not find symbol '${info.symbolName}' by key '${info.symbolTableKey}' in module ${moduleSymbol.name}`
);
symbols.set(id, [symbol, moduleSymbol]);
return {
symbol,
moduleSymbol,
moduleFileName,
exportKind,
targetFlags,
isFromPackageJson
};
}
function key(importedName, symbol, ambientModuleName, checker) {
const moduleKey = ambientModuleName || "";
return `${importedName}|${getSymbolId(skipAlias(symbol, checker))}|${moduleKey}`;
}
function parseKey(key2) {
const symbolName2 = key2.substring(0, key2.indexOf("|"));
const moduleKey = key2.substring(key2.lastIndexOf("|") + 1);
const ambientModuleName = moduleKey === "" ? void 0 : moduleKey;
return { symbolName: symbolName2, ambientModuleName };
}
function fileIsGlobalOnly(file) {
return !file.commonJsModuleIndicator && !file.externalModuleIndicator && !file.moduleAugmentations && !file.ambientModuleNames;
}
function ambientModuleDeclarationsAreEqual(oldSourceFile, newSourceFile) {
if (!arrayIsEqualTo(oldSourceFile.ambientModuleNames, newSourceFile.ambientModuleNames)) {
return false;
}
let oldFileStatementIndex = -1;
let newFileStatementIndex = -1;
for (const ambientModuleName of newSourceFile.ambientModuleNames) {
const isMatchingModuleDeclaration = (node) => isNonGlobalAmbientModule(node) && node.name.text === ambientModuleName;
oldFileStatementIndex = findIndex(oldSourceFile.statements, isMatchingModuleDeclaration, oldFileStatementIndex + 1);
newFileStatementIndex = findIndex(newSourceFile.statements, isMatchingModuleDeclaration, newFileStatementIndex + 1);
if (oldSourceFile.statements[oldFileStatementIndex] !== newSourceFile.statements[newFileStatementIndex]) {
return false;
}
}
return true;
}
function isNotShadowedByDeeperNodeModulesPackage(info, packageName) {
if (!packageName || !info.moduleFileName)
return true;
const typingsCacheLocation = host.getGlobalTypingsCacheLocation();
if (typingsCacheLocation && startsWith(info.moduleFileName, typingsCacheLocation))
return true;
const packageDeepestNodeModulesPath = packages.get(packageName);
return !packageDeepestNodeModulesPath || startsWith(info.moduleFileName, packageDeepestNodeModulesPath);
}
}
function isImportableFile(program, from, to, preferences, packageJsonFilter, moduleSpecifierResolutionHost, moduleSpecifierCache) {
var _a;
if (from === to)
return false;
const cachedResult = moduleSpecifierCache == null ? void 0 : moduleSpecifierCache.get(from.path, to.path, preferences, {});
if ((cachedResult == null ? void 0 : cachedResult.isBlockedByPackageJsonDependencies) !== void 0) {
return !cachedResult.isBlockedByPackageJsonDependencies;
}
const getCanonicalFileName = hostGetCanonicalFileName(moduleSpecifierResolutionHost);
const globalTypingsCache = (_a = moduleSpecifierResolutionHost.getGlobalTypingsCacheLocation) == null ? void 0 : _a.call(moduleSpecifierResolutionHost);
const hasImportablePath = !!ts_moduleSpecifiers_exports.forEachFileNameOfModule(
from.fileName,
to.fileName,
moduleSpecifierResolutionHost,
/*preferSymlinks*/
false,
(toPath3) => {
const toFile = program.getSourceFile(toPath3);
return (toFile === to || !toFile) && isImportablePath(from.fileName, toPath3, getCanonicalFileName, globalTypingsCache);
}
);
if (packageJsonFilter) {
const isAutoImportable = hasImportablePath && packageJsonFilter.allowsImportingSourceFile(to, moduleSpecifierResolutionHost);
moduleSpecifierCache == null ? void 0 : moduleSpecifierCache.setBlockedByPackageJsonDependencies(from.path, to.path, preferences, {}, !isAutoImportable);
return isAutoImportable;
}
return hasImportablePath;
}
function isImportablePath(fromPath, toPath3, getCanonicalFileName, globalCachePath) {
const toNodeModules = forEachAncestorDirectory(toPath3, (ancestor) => getBaseFileName(ancestor) === "node_modules" ? ancestor : void 0);
const toNodeModulesParent = toNodeModules && getDirectoryPath(getCanonicalFileName(toNodeModules));
return toNodeModulesParent === void 0 || startsWith(getCanonicalFileName(fromPath), toNodeModulesParent) || !!globalCachePath && startsWith(getCanonicalFileName(globalCachePath), toNodeModulesParent);
}
function forEachExternalModuleToImportFrom(program, host, preferences, useAutoImportProvider, cb) {
var _a, _b;
const useCaseSensitiveFileNames = hostUsesCaseSensitiveFileNames(host);
const excludePatterns = preferences.autoImportFileExcludePatterns && mapDefined(preferences.autoImportFileExcludePatterns, (spec) => {
const pattern = getPatternFromSpec(spec, "", "exclude");
return pattern ? getRegexFromPattern(pattern, useCaseSensitiveFileNames) : void 0;
});
forEachExternalModule(program.getTypeChecker(), program.getSourceFiles(), excludePatterns, (module2, file) => cb(
module2,
file,
program,
/*isFromPackageJson*/
false
));
const autoImportProvider = useAutoImportProvider && ((_a = host.getPackageJsonAutoImportProvider) == null ? void 0 : _a.call(host));
if (autoImportProvider) {
const start2 = timestamp();
const checker = program.getTypeChecker();
forEachExternalModule(autoImportProvider.getTypeChecker(), autoImportProvider.getSourceFiles(), excludePatterns, (module2, file) => {
if (file && !program.getSourceFile(file.fileName) || !file && !checker.resolveName(
module2.name,
/*location*/
void 0,
1536 /* Module */,
/*excludeGlobals*/
false
)) {
cb(
module2,
file,
autoImportProvider,
/*isFromPackageJson*/
true
);
}
});
(_b = host.log) == null ? void 0 : _b.call(host, `forEachExternalModuleToImportFrom autoImportProvider: ${timestamp() - start2}`);
}
}
function forEachExternalModule(checker, allSourceFiles, excludePatterns, cb) {
var _a;
const isExcluded = excludePatterns && ((fileName) => excludePatterns.some((p) => p.test(fileName)));
for (const ambient of checker.getAmbientModules()) {
if (!stringContains(ambient.name, "*") && !(excludePatterns && ((_a = ambient.declarations) == null ? void 0 : _a.every((d) => isExcluded(d.getSourceFile().fileName))))) {
cb(
ambient,
/*sourceFile*/
void 0
);
}
}
for (const sourceFile of allSourceFiles) {
if (isExternalOrCommonJsModule(sourceFile) && !(isExcluded == null ? void 0 : isExcluded(sourceFile.fileName))) {
cb(checker.getMergedSymbol(sourceFile.symbol), sourceFile);
}
}
}
function getExportInfoMap(importingFile, host, program, preferences, cancellationToken) {
var _a, _b, _c, _d, _e;
const start2 = timestamp();
(_a = host.getPackageJsonAutoImportProvider) == null ? void 0 : _a.call(host);
const cache = ((_b = host.getCachedExportInfoMap) == null ? void 0 : _b.call(host)) || createCacheableExportInfoMap({
getCurrentProgram: () => program,
getPackageJsonAutoImportProvider: () => {
var _a2;
return (_a2 = host.getPackageJsonAutoImportProvider) == null ? void 0 : _a2.call(host);
},
getGlobalTypingsCacheLocation: () => {
var _a2;
return (_a2 = host.getGlobalTypingsCacheLocation) == null ? void 0 : _a2.call(host);
}
});
if (cache.isUsableByFile(importingFile.path)) {
(_c = host.log) == null ? void 0 : _c.call(host, "getExportInfoMap: cache hit");
return cache;
}
(_d = host.log) == null ? void 0 : _d.call(host, "getExportInfoMap: cache miss or empty; calculating new results");
const compilerOptions = program.getCompilerOptions();
let moduleCount = 0;
try {
forEachExternalModuleToImportFrom(
program,
host,
preferences,
/*useAutoImportProvider*/
true,
(moduleSymbol, moduleFile, program2, isFromPackageJson) => {
if (++moduleCount % 100 === 0)
cancellationToken == null ? void 0 : cancellationToken.throwIfCancellationRequested();
const seenExports = /* @__PURE__ */ new Map();
const checker = program2.getTypeChecker();
const defaultInfo = getDefaultLikeExportInfo(moduleSymbol, checker, compilerOptions);
if (defaultInfo && isImportableSymbol(defaultInfo.symbol, checker)) {
cache.add(
importingFile.path,
defaultInfo.symbol,
defaultInfo.exportKind === 1 /* Default */ ? "default" /* Default */ : "export=" /* ExportEquals */,
moduleSymbol,
moduleFile,
defaultInfo.exportKind,
isFromPackageJson,
checker
);
}
checker.forEachExportAndPropertyOfModule(moduleSymbol, (exported, key) => {
if (exported !== (defaultInfo == null ? void 0 : defaultInfo.symbol) && isImportableSymbol(exported, checker) && addToSeen(seenExports, key)) {
cache.add(
importingFile.path,
exported,
key,
moduleSymbol,
moduleFile,
0 /* Named */,
isFromPackageJson,
checker
);
}
});
}
);
} catch (err) {
cache.clear();
throw err;
}
(_e = host.log) == null ? void 0 : _e.call(host, `getExportInfoMap: done in ${timestamp() - start2} ms`);
return cache;
}
function getDefaultLikeExportInfo(moduleSymbol, checker, compilerOptions) {
const exported = getDefaultLikeExportWorker(moduleSymbol, checker);
if (!exported)
return void 0;
const { symbol, exportKind } = exported;
const info = getDefaultExportInfoWorker(symbol, checker, compilerOptions);
return info && { symbol, exportKind, ...info };
}
function isImportableSymbol(symbol, checker) {
return !checker.isUndefinedSymbol(symbol) && !checker.isUnknownSymbol(symbol) && !isKnownSymbol(symbol) && !isPrivateIdentifierSymbol(symbol);
}
function getDefaultLikeExportWorker(moduleSymbol, checker) {
const exportEquals = checker.resolveExternalModuleSymbol(moduleSymbol);
if (exportEquals !== moduleSymbol)
return { symbol: exportEquals, exportKind: 2 /* ExportEquals */ };
const defaultExport = checker.tryGetMemberInModuleExports("default" /* Default */, moduleSymbol);
if (defaultExport)
return { symbol: defaultExport, exportKind: 1 /* Default */ };
}
function getDefaultExportInfoWorker(defaultExport, checker, compilerOptions) {
const localSymbol = getLocalSymbolForExportDefault(defaultExport);
if (localSymbol)
return { resolvedSymbol: localSymbol, name: localSymbol.name };
const name = getNameForExportDefault(defaultExport);
if (name !== void 0)
return { resolvedSymbol: defaultExport, name };
if (defaultExport.flags & 2097152 /* Alias */) {
const aliased = checker.getImmediateAliasedSymbol(defaultExport);
if (aliased && aliased.parent) {
return getDefaultExportInfoWorker(aliased, checker, compilerOptions);
}
}
if (defaultExport.escapedName !== "default" /* Default */ && defaultExport.escapedName !== "export=" /* ExportEquals */) {
return { resolvedSymbol: defaultExport, name: defaultExport.getName() };
}
return { resolvedSymbol: defaultExport, name: getNameForExportedSymbol(defaultExport, compilerOptions.target) };
}
function getNameForExportDefault(symbol) {
return symbol.declarations && firstDefined(symbol.declarations, (declaration) => {
var _a;
if (isExportAssignment(declaration)) {
return (_a = tryCast(skipOuterExpressions(declaration.expression), isIdentifier)) == null ? void 0 : _a.text;
} else if (isExportSpecifier(declaration)) {
Debug.assert(declaration.name.text === "default" /* Default */, "Expected the specifier to be a default export");
return declaration.propertyName && declaration.propertyName.text;
}
});
}
// src/services/classifier.ts
function createClassifier() {
const scanner2 = createScanner(
99 /* Latest */,
/*skipTrivia*/
false
);
function getClassificationsForLine(text, lexState, syntacticClassifierAbsent) {
return convertClassificationsToResult(getEncodedLexicalClassifications(text, lexState, syntacticClassifierAbsent), text);
}
function getEncodedLexicalClassifications(text, lexState, syntacticClassifierAbsent) {
let token = 0 /* Unknown */;
let lastNonTriviaToken = 0 /* Unknown */;
const templateStack = [];
const { prefix, pushTemplate } = getPrefixFromLexState(lexState);
text = prefix + text;
const offset = prefix.length;
if (pushTemplate) {
templateStack.push(16 /* TemplateHead */);
}
scanner2.setText(text);
let endOfLineState = 0 /* None */;
const spans = [];
let angleBracketStack = 0;
do {
token = scanner2.scan();
if (!isTrivia(token)) {
handleToken();
lastNonTriviaToken = token;
}
const end = scanner2.getTokenEnd();
pushEncodedClassification(scanner2.getTokenStart(), end, offset, classFromKind(token), spans);
if (end >= text.length) {
const end2 = getNewEndOfLineState(scanner2, token, lastOrUndefined(templateStack));
if (end2 !== void 0) {
endOfLineState = end2;
}
}
} while (token !== 1 /* EndOfFileToken */);
function handleToken() {
switch (token) {
case 44 /* SlashToken */:
case 69 /* SlashEqualsToken */:
if (!noRegexTable[lastNonTriviaToken] && scanner2.reScanSlashToken() === 14 /* RegularExpressionLiteral */) {
token = 14 /* RegularExpressionLiteral */;
}
break;
case 30 /* LessThanToken */:
if (lastNonTriviaToken === 80 /* Identifier */) {
angleBracketStack++;
}
break;
case 32 /* GreaterThanToken */:
if (angleBracketStack > 0) {
angleBracketStack--;
}
break;
case 133 /* AnyKeyword */:
case 154 /* StringKeyword */:
case 150 /* NumberKeyword */:
case 136 /* BooleanKeyword */:
case 155 /* SymbolKeyword */:
if (angleBracketStack > 0 && !syntacticClassifierAbsent) {
token = 80 /* Identifier */;
}
break;
case 16 /* TemplateHead */:
templateStack.push(token);
break;
case 19 /* OpenBraceToken */:
if (templateStack.length > 0) {
templateStack.push(token);
}
break;
case 20 /* CloseBraceToken */:
if (templateStack.length > 0) {
const lastTemplateStackToken = lastOrUndefined(templateStack);
if (lastTemplateStackToken === 16 /* TemplateHead */) {
token = scanner2.reScanTemplateToken(
/*isTaggedTemplate*/
false
);
if (token === 18 /* TemplateTail */) {
templateStack.pop();
} else {
Debug.assertEqual(token, 17 /* TemplateMiddle */, "Should have been a template middle.");
}
} else {
Debug.assertEqual(lastTemplateStackToken, 19 /* OpenBraceToken */, "Should have been an open brace");
templateStack.pop();
}
}
break;
default:
if (!isKeyword(token)) {
break;
}
if (lastNonTriviaToken === 25 /* DotToken */) {
token = 80 /* Identifier */;
} else if (isKeyword(lastNonTriviaToken) && isKeyword(token) && !canFollow(lastNonTriviaToken, token)) {
token = 80 /* Identifier */;
}
}
}
return { endOfLineState, spans };
}
return { getClassificationsForLine, getEncodedLexicalClassifications };
}
var noRegexTable = arrayToNumericMap([
80 /* Identifier */,
11 /* StringLiteral */,
9 /* NumericLiteral */,
10 /* BigIntLiteral */,
14 /* RegularExpressionLiteral */,
110 /* ThisKeyword */,
46 /* PlusPlusToken */,
47 /* MinusMinusToken */,
22 /* CloseParenToken */,
24 /* CloseBracketToken */,
20 /* CloseBraceToken */,
112 /* TrueKeyword */,
97 /* FalseKeyword */
], (token) => token, () => true);
function getNewEndOfLineState(scanner2, token, lastOnTemplateStack) {
switch (token) {
case 11 /* StringLiteral */: {
if (!scanner2.isUnterminated())
return void 0;
const tokenText = scanner2.getTokenText();
const lastCharIndex = tokenText.length - 1;
let numBackslashes = 0;
while (tokenText.charCodeAt(lastCharIndex - numBackslashes) === 92 /* backslash */) {
numBackslashes++;
}
if ((numBackslashes & 1) === 0)
return void 0;
return tokenText.charCodeAt(0) === 34 /* doubleQuote */ ? 3 /* InDoubleQuoteStringLiteral */ : 2 /* InSingleQuoteStringLiteral */;
}
case 3 /* MultiLineCommentTrivia */:
return scanner2.isUnterminated() ? 1 /* InMultiLineCommentTrivia */ : void 0;
default:
if (isTemplateLiteralKind(token)) {
if (!scanner2.isUnterminated()) {
return void 0;
}
switch (token) {
case 18 /* TemplateTail */:
return 5 /* InTemplateMiddleOrTail */;
case 15 /* NoSubstitutionTemplateLiteral */:
return 4 /* InTemplateHeadOrNoSubstitutionTemplate */;
default:
return Debug.fail("Only 'NoSubstitutionTemplateLiteral's and 'TemplateTail's can be unterminated; got SyntaxKind #" + token);
}
}
return lastOnTemplateStack === 16 /* TemplateHead */ ? 6 /* InTemplateSubstitutionPosition */ : void 0;
}
}
function pushEncodedClassification(start2, end, offset, classification, result) {
if (classification === 8 /* whiteSpace */) {
return;
}
if (start2 === 0 && offset > 0) {
start2 += offset;
}
const length2 = end - start2;
if (length2 > 0) {
result.push(start2 - offset, length2, classification);
}
}
function convertClassificationsToResult(classifications, text) {
const entries = [];
const dense = classifications.spans;
let lastEnd = 0;
for (let i = 0; i < dense.length; i += 3) {
const start2 = dense[i];
const length2 = dense[i + 1];
const type = dense[i + 2];
if (lastEnd >= 0) {
const whitespaceLength2 = start2 - lastEnd;
if (whitespaceLength2 > 0) {
entries.push({ length: whitespaceLength2, classification: 4 /* Whitespace */ });
}
}
entries.push({ length: length2, classification: convertClassification(type) });
lastEnd = start2 + length2;
}
const whitespaceLength = text.length - lastEnd;
if (whitespaceLength > 0) {
entries.push({ length: whitespaceLength, classification: 4 /* Whitespace */ });
}
return { entries, finalLexState: classifications.endOfLineState };
}
function convertClassification(type) {
switch (type) {
case 1 /* comment */:
return 3 /* Comment */;
case 3 /* keyword */:
return 1 /* Keyword */;
case 4 /* numericLiteral */:
return 6 /* NumberLiteral */;
case 25 /* bigintLiteral */:
return 7 /* BigIntLiteral */;
case 5 /* operator */:
return 2 /* Operator */;
case 6 /* stringLiteral */:
return 8 /* StringLiteral */;
case 8 /* whiteSpace */:
return 4 /* Whitespace */;
case 10 /* punctuation */:
return 0 /* Punctuation */;
case 2 /* identifier */:
case 11 /* className */:
case 12 /* enumName */:
case 13 /* interfaceName */:
case 14 /* moduleName */:
case 15 /* typeParameterName */:
case 16 /* typeAliasName */:
case 9 /* text */:
case 17 /* parameterName */:
return 5 /* Identifier */;
default:
return void 0;
}
}
function canFollow(keyword1, keyword2) {
if (!isAccessibilityModifier(keyword1)) {
return true;
}
switch (keyword2) {
case 139 /* GetKeyword */:
case 153 /* SetKeyword */:
case 137 /* ConstructorKeyword */:
case 126 /* StaticKeyword */:
case 129 /* AccessorKeyword */:
return true;
default:
return false;
}
}
function getPrefixFromLexState(lexState) {
switch (lexState) {
case 3 /* InDoubleQuoteStringLiteral */:
return { prefix: '"\\\n' };
case 2 /* InSingleQuoteStringLiteral */:
return { prefix: "'\\\n" };
case 1 /* InMultiLineCommentTrivia */:
return { prefix: "/*\n" };
case 4 /* InTemplateHeadOrNoSubstitutionTemplate */:
return { prefix: "`\n" };
case 5 /* InTemplateMiddleOrTail */:
return { prefix: "}\n", pushTemplate: true };
case 6 /* InTemplateSubstitutionPosition */:
return { prefix: "", pushTemplate: true };
case 0 /* None */:
return { prefix: "" };
default:
return Debug.assertNever(lexState);
}
}
function isBinaryExpressionOperatorToken(token) {
switch (token) {
case 42 /* AsteriskToken */:
case 44 /* SlashToken */:
case 45 /* PercentToken */:
case 40 /* PlusToken */:
case 41 /* MinusToken */:
case 48 /* LessThanLessThanToken */:
case 49 /* GreaterThanGreaterThanToken */:
case 50 /* GreaterThanGreaterThanGreaterThanToken */:
case 30 /* LessThanToken */:
case 32 /* GreaterThanToken */:
case 33 /* LessThanEqualsToken */:
case 34 /* GreaterThanEqualsToken */:
case 104 /* InstanceOfKeyword */:
case 103 /* InKeyword */:
case 130 /* AsKeyword */:
case 152 /* SatisfiesKeyword */:
case 35 /* EqualsEqualsToken */:
case 36 /* ExclamationEqualsToken */:
case 37 /* EqualsEqualsEqualsToken */:
case 38 /* ExclamationEqualsEqualsToken */:
case 51 /* AmpersandToken */:
case 53 /* CaretToken */:
case 52 /* BarToken */:
case 56 /* AmpersandAmpersandToken */:
case 57 /* BarBarToken */:
case 75 /* BarEqualsToken */:
case 74 /* AmpersandEqualsToken */:
case 79 /* CaretEqualsToken */:
case 71 /* LessThanLessThanEqualsToken */:
case 72 /* GreaterThanGreaterThanEqualsToken */:
case 73 /* GreaterThanGreaterThanGreaterThanEqualsToken */:
case 65 /* PlusEqualsToken */:
case 66 /* MinusEqualsToken */:
case 67 /* AsteriskEqualsToken */:
case 69 /* SlashEqualsToken */:
case 70 /* PercentEqualsToken */:
case 64 /* EqualsToken */:
case 28 /* CommaToken */:
case 61 /* QuestionQuestionToken */:
case 76 /* BarBarEqualsToken */:
case 77 /* AmpersandAmpersandEqualsToken */:
case 78 /* QuestionQuestionEqualsToken */:
return true;
default:
return false;
}
}
function isPrefixUnaryExpressionOperatorToken(token) {
switch (token) {
case 40 /* PlusToken */:
case 41 /* MinusToken */:
case 55 /* TildeToken */:
case 54 /* ExclamationToken */:
case 46 /* PlusPlusToken */:
case 47 /* MinusMinusToken */:
return true;
default:
return false;
}
}
function classFromKind(token) {
if (isKeyword(token)) {
return 3 /* keyword */;
} else if (isBinaryExpressionOperatorToken(token) || isPrefixUnaryExpressionOperatorToken(token)) {
return 5 /* operator */;
} else if (token >= 19 /* FirstPunctuation */ && token <= 79 /* LastPunctuation */) {
return 10 /* punctuation */;
}
switch (token) {
case 9 /* NumericLiteral */:
return 4 /* numericLiteral */;
case 10 /* BigIntLiteral */:
return 25 /* bigintLiteral */;
case 11 /* StringLiteral */:
return 6 /* stringLiteral */;
case 14 /* RegularExpressionLiteral */:
return 7 /* regularExpressionLiteral */;
case 7 /* ConflictMarkerTrivia */:
case 3 /* MultiLineCommentTrivia */:
case 2 /* SingleLineCommentTrivia */:
return 1 /* comment */;
case 5 /* WhitespaceTrivia */:
case 4 /* NewLineTrivia */:
return 8 /* whiteSpace */;
case 80 /* Identifier */:
default:
if (isTemplateLiteralKind(token)) {
return 6 /* stringLiteral */;
}
return 2 /* identifier */;
}
}
function getSemanticClassifications(typeChecker, cancellationToken, sourceFile, classifiableNames, span) {
return convertClassificationsToSpans(getEncodedSemanticClassifications(typeChecker, cancellationToken, sourceFile, classifiableNames, span));
}
function checkForClassificationCancellation(cancellationToken, kind) {
switch (kind) {
case 266 /* ModuleDeclaration */:
case 262 /* ClassDeclaration */:
case 263 /* InterfaceDeclaration */:
case 261 /* FunctionDeclaration */:
case 230 /* ClassExpression */:
case 217 /* FunctionExpression */:
case 218 /* ArrowFunction */:
cancellationToken.throwIfCancellationRequested();
}
}
function getEncodedSemanticClassifications(typeChecker, cancellationToken, sourceFile, classifiableNames, span) {
const spans = [];
sourceFile.forEachChild(function cb(node) {
if (!node || !textSpanIntersectsWith(span, node.pos, node.getFullWidth())) {
return;
}
checkForClassificationCancellation(cancellationToken, node.kind);
if (isIdentifier(node) && !nodeIsMissing(node) && classifiableNames.has(node.escapedText)) {
const symbol = typeChecker.getSymbolAtLocation(node);
const type = symbol && classifySymbol(symbol, getMeaningFromLocation(node), typeChecker);
if (type) {
pushClassification(node.getStart(sourceFile), node.getEnd(), type);
}
}
node.forEachChild(cb);
});
return { spans, endOfLineState: 0 /* None */ };
function pushClassification(start2, end, type) {
const length2 = end - start2;
Debug.assert(length2 > 0, `Classification had non-positive length of ${length2}`);
spans.push(start2);
spans.push(length2);
spans.push(type);
}
}
function classifySymbol(symbol, meaningAtPosition, checker) {
const flags = symbol.getFlags();
if ((flags & 2885600 /* Classifiable */) === 0 /* None */) {
return void 0;
} else if (flags & 32 /* Class */) {
return 11 /* className */;
} else if (flags & 384 /* Enum */) {
return 12 /* enumName */;
} else if (flags & 524288 /* TypeAlias */) {
return 16 /* typeAliasName */;
} else if (flags & 1536 /* Module */) {
return meaningAtPosition & 4 /* Namespace */ || meaningAtPosition & 1 /* Value */ && hasValueSideModule(symbol) ? 14 /* moduleName */ : void 0;
} else if (flags & 2097152 /* Alias */) {
return classifySymbol(checker.getAliasedSymbol(symbol), meaningAtPosition, checker);
} else if (meaningAtPosition & 2 /* Type */) {
return flags & 64 /* Interface */ ? 13 /* interfaceName */ : flags & 262144 /* TypeParameter */ ? 15 /* typeParameterName */ : void 0;
} else {
return void 0;
}
}
function hasValueSideModule(symbol) {
return some(symbol.declarations, (declaration) => isModuleDeclaration(declaration) && getModuleInstanceState(declaration) === 1 /* Instantiated */);
}
function getClassificationTypeName(type) {
switch (type) {
case 1 /* comment */:
return "comment" /* comment */;
case 2 /* identifier */:
return "identifier" /* identifier */;
case 3 /* keyword */:
return "keyword" /* keyword */;
case 4 /* numericLiteral */:
return "number" /* numericLiteral */;
case 25 /* bigintLiteral */:
return "bigint" /* bigintLiteral */;
case 5 /* operator */:
return "operator" /* operator */;
case 6 /* stringLiteral */:
return "string" /* stringLiteral */;
case 8 /* whiteSpace */:
return "whitespace" /* whiteSpace */;
case 9 /* text */:
return "text" /* text */;
case 10 /* punctuation */:
return "punctuation" /* punctuation */;
case 11 /* className */:
return "class name" /* className */;
case 12 /* enumName */:
return "enum name" /* enumName */;
case 13 /* interfaceName */:
return "interface name" /* interfaceName */;
case 14 /* moduleName */:
return "module name" /* moduleName */;
case 15 /* typeParameterName */:
return "type parameter name" /* typeParameterName */;
case 16 /* typeAliasName */:
return "type alias name" /* typeAliasName */;
case 17 /* parameterName */:
return "parameter name" /* parameterName */;
case 18 /* docCommentTagName */:
return "doc comment tag name" /* docCommentTagName */;
case 19 /* jsxOpenTagName */:
return "jsx open tag name" /* jsxOpenTagName */;
case 20 /* jsxCloseTagName */:
return "jsx close tag name" /* jsxCloseTagName */;
case 21 /* jsxSelfClosingTagName */:
return "jsx self closing tag name" /* jsxSelfClosingTagName */;
case 22 /* jsxAttribute */:
return "jsx attribute" /* jsxAttribute */;
case 23 /* jsxText */:
return "jsx text" /* jsxText */;
case 24 /* jsxAttributeStringLiteralValue */:
return "jsx attribute string literal value" /* jsxAttributeStringLiteralValue */;
default:
return void 0;
}
}
function convertClassificationsToSpans(classifications) {
Debug.assert(classifications.spans.length % 3 === 0);
const dense = classifications.spans;
const result = [];
for (let i = 0; i < dense.length; i += 3) {
result.push({
textSpan: createTextSpan(dense[i], dense[i + 1]),
classificationType: getClassificationTypeName(dense[i + 2])
});
}
return result;
}
function getSyntacticClassifications(cancellationToken, sourceFile, span) {
return convertClassificationsToSpans(getEncodedSyntacticClassifications(cancellationToken, sourceFile, span));
}
function getEncodedSyntacticClassifications(cancellationToken, sourceFile, span) {
const spanStart = span.start;
const spanLength = span.length;
const triviaScanner = createScanner(
99 /* Latest */,
/*skipTrivia*/
false,
sourceFile.languageVariant,
sourceFile.text
);
const mergeConflictScanner = createScanner(
99 /* Latest */,
/*skipTrivia*/
false,
sourceFile.languageVariant,
sourceFile.text
);
const result = [];
processElement(sourceFile);
return { spans: result, endOfLineState: 0 /* None */ };
function pushClassification(start2, length2, type) {
result.push(start2);
result.push(length2);
result.push(type);
}
function classifyLeadingTriviaAndGetTokenStart(token) {
triviaScanner.resetTokenState(token.pos);
while (true) {
const start2 = triviaScanner.getTokenEnd();
if (!couldStartTrivia(sourceFile.text, start2)) {
return start2;
}
const kind = triviaScanner.scan();
const end = triviaScanner.getTokenEnd();
const width = end - start2;
if (!isTrivia(kind)) {
return start2;
}
switch (kind) {
case 4 /* NewLineTrivia */:
case 5 /* WhitespaceTrivia */:
continue;
case 2 /* SingleLineCommentTrivia */:
case 3 /* MultiLineCommentTrivia */:
classifyComment(token, kind, start2, width);
triviaScanner.resetTokenState(end);
continue;
case 7 /* ConflictMarkerTrivia */:
const text = sourceFile.text;
const ch = text.charCodeAt(start2);
if (ch === 60 /* lessThan */ || ch === 62 /* greaterThan */) {
pushClassification(start2, width, 1 /* comment */);
continue;
}
Debug.assert(ch === 124 /* bar */ || ch === 61 /* equals */);
classifyDisabledMergeCode(text, start2, end);
break;
case 6 /* ShebangTrivia */:
break;
default:
Debug.assertNever(kind);
}
}
}
function classifyComment(token, kind, start2, width) {
if (kind === 3 /* MultiLineCommentTrivia */) {
const docCommentAndDiagnostics = parseIsolatedJSDocComment(sourceFile.text, start2, width);
if (docCommentAndDiagnostics && docCommentAndDiagnostics.jsDoc) {
setParent(docCommentAndDiagnostics.jsDoc, token);
classifyJSDocComment(docCommentAndDiagnostics.jsDoc);
return;
}
} else if (kind === 2 /* SingleLineCommentTrivia */) {
if (tryClassifyTripleSlashComment(start2, width)) {
return;
}
}
pushCommentRange(start2, width);
}
function pushCommentRange(start2, width) {
pushClassification(start2, width, 1 /* comment */);
}
function classifyJSDocComment(docComment) {
var _a, _b, _c, _d, _e, _f, _g, _h;
let pos = docComment.pos;
if (docComment.tags) {
for (const tag of docComment.tags) {
if (tag.pos !== pos) {
pushCommentRange(pos, tag.pos - pos);
}
pushClassification(tag.pos, 1, 10 /* punctuation */);
pushClassification(tag.tagName.pos, tag.tagName.end - tag.tagName.pos, 18 /* docCommentTagName */);
pos = tag.tagName.end;
let commentStart = tag.tagName.end;
switch (tag.kind) {
case 347 /* JSDocParameterTag */:
const param = tag;
processJSDocParameterTag(param);
commentStart = param.isNameFirst && ((_a = param.typeExpression) == null ? void 0 : _a.end) || param.name.end;
break;
case 354 /* JSDocPropertyTag */:
const prop = tag;
commentStart = prop.isNameFirst && ((_b = prop.typeExpression) == null ? void 0 : _b.end) || prop.name.end;
break;
case 351 /* JSDocTemplateTag */:
processJSDocTemplateTag(tag);
pos = tag.end;
commentStart = tag.typeParameters.end;
break;
case 352 /* JSDocTypedefTag */:
const type = tag;
commentStart = ((_c = type.typeExpression) == null ? void 0 : _c.kind) === 315 /* JSDocTypeExpression */ && ((_d = type.fullName) == null ? void 0 : _d.end) || ((_e = type.typeExpression) == null ? void 0 : _e.end) || commentStart;
break;
case 344 /* JSDocCallbackTag */:
commentStart = tag.typeExpression.end;
break;
case 350 /* JSDocTypeTag */:
processElement(tag.typeExpression);
pos = tag.end;
commentStart = tag.typeExpression.end;
break;
case 349 /* JSDocThisTag */:
case 346 /* JSDocEnumTag */:
commentStart = tag.typeExpression.end;
break;
case 348 /* JSDocReturnTag */:
processElement(tag.typeExpression);
pos = tag.end;
commentStart = ((_f = tag.typeExpression) == null ? void 0 : _f.end) || commentStart;
break;
case 353 /* JSDocSeeTag */:
commentStart = ((_g = tag.name) == null ? void 0 : _g.end) || commentStart;
break;
case 334 /* JSDocAugmentsTag */:
case 335 /* JSDocImplementsTag */:
commentStart = tag.class.end;
break;
case 355 /* JSDocThrowsTag */:
processElement(tag.typeExpression);
pos = tag.end;
commentStart = ((_h = tag.typeExpression) == null ? void 0 : _h.end) || commentStart;
break;
}
if (typeof tag.comment === "object") {
pushCommentRange(tag.comment.pos, tag.comment.end - tag.comment.pos);
} else if (typeof tag.comment === "string") {
pushCommentRange(commentStart, tag.end - commentStart);
}
}
}
if (pos !== docComment.end) {
pushCommentRange(pos, docComment.end - pos);
}
return;
function processJSDocParameterTag(tag) {
if (tag.isNameFirst) {
pushCommentRange(pos, tag.name.pos - pos);
pushClassification(tag.name.pos, tag.name.end - tag.name.pos, 17 /* parameterName */);
pos = tag.name.end;
}
if (tag.typeExpression) {
pushCommentRange(pos, tag.typeExpression.pos - pos);
processElement(tag.typeExpression);
pos = tag.typeExpression.end;
}
if (!tag.isNameFirst) {
pushCommentRange(pos, tag.name.pos - pos);
pushClassification(tag.name.pos, tag.name.end - tag.name.pos, 17 /* parameterName */);
pos = tag.name.end;
}
}
}
function tryClassifyTripleSlashComment(start2, width) {
const tripleSlashXMLCommentRegEx = /^(\/\/\/\s*)(<)(?:(\S+)((?:[^/]|\/[^>])*)(\/>)?)?/im;
const attributeRegex = /(\s)(\S+)(\s*)(=)(\s*)('[^']+'|"[^"]+")/img;
const text = sourceFile.text.substr(start2, width);
const match = tripleSlashXMLCommentRegEx.exec(text);
if (!match) {
return false;
}
if (!match[3] || !(match[3] in commentPragmas)) {
return false;
}
let pos = start2;
pushCommentRange(pos, match[1].length);
pos += match[1].length;
pushClassification(pos, match[2].length, 10 /* punctuation */);
pos += match[2].length;
pushClassification(pos, match[3].length, 21 /* jsxSelfClosingTagName */);
pos += match[3].length;
const attrText = match[4];
let attrPos = pos;
while (true) {
const attrMatch = attributeRegex.exec(attrText);
if (!attrMatch) {
break;
}
const newAttrPos = pos + attrMatch.index + attrMatch[1].length;
if (newAttrPos > attrPos) {
pushCommentRange(attrPos, newAttrPos - attrPos);
attrPos = newAttrPos;
}
pushClassification(attrPos, attrMatch[2].length, 22 /* jsxAttribute */);
attrPos += attrMatch[2].length;
if (attrMatch[3].length) {
pushCommentRange(attrPos, attrMatch[3].length);
attrPos += attrMatch[3].length;
}
pushClassification(attrPos, attrMatch[4].length, 5 /* operator */);
attrPos += attrMatch[4].length;
if (attrMatch[5].length) {
pushCommentRange(attrPos, attrMatch[5].length);
attrPos += attrMatch[5].length;
}
pushClassification(attrPos, attrMatch[6].length, 24 /* jsxAttributeStringLiteralValue */);
attrPos += attrMatch[6].length;
}
pos += match[4].length;
if (pos > attrPos) {
pushCommentRange(attrPos, pos - attrPos);
}
if (match[5]) {
pushClassification(pos, match[5].length, 10 /* punctuation */);
pos += match[5].length;
}
const end = start2 + width;
if (pos < end) {
pushCommentRange(pos, end - pos);
}
return true;
}
function processJSDocTemplateTag(tag) {
for (const child of tag.getChildren()) {
processElement(child);
}
}
function classifyDisabledMergeCode(text, start2, end) {
let i;
for (i = start2; i < end; i++) {
if (isLineBreak(text.charCodeAt(i))) {
break;
}
}
pushClassification(start2, i - start2, 1 /* comment */);
mergeConflictScanner.resetTokenState(i);
while (mergeConflictScanner.getTokenEnd() < end) {
classifyDisabledCodeToken();
}
}
function classifyDisabledCodeToken() {
const start2 = mergeConflictScanner.getTokenEnd();
const tokenKind = mergeConflictScanner.scan();
const end = mergeConflictScanner.getTokenEnd();
const type = classifyTokenType(tokenKind);
if (type) {
pushClassification(start2, end - start2, type);
}
}
function tryClassifyNode(node) {
if (isJSDoc(node)) {
return true;
}
if (nodeIsMissing(node)) {
return true;
}
const classifiedElementName = tryClassifyJsxElementName(node);
if (!isToken(node) && node.kind !== 12 /* JsxText */ && classifiedElementName === void 0) {
return false;
}
const tokenStart = node.kind === 12 /* JsxText */ ? node.pos : classifyLeadingTriviaAndGetTokenStart(node);
const tokenWidth = node.end - tokenStart;
Debug.assert(tokenWidth >= 0);
if (tokenWidth > 0) {
const type = classifiedElementName || classifyTokenType(node.kind, node);
if (type) {
pushClassification(tokenStart, tokenWidth, type);
}
}
return true;
}
function tryClassifyJsxElementName(token) {
switch (token.parent && token.parent.kind) {
case 285 /* JsxOpeningElement */:
if (token.parent.tagName === token) {
return 19 /* jsxOpenTagName */;
}
break;
case 286 /* JsxClosingElement */:
if (token.parent.tagName === token) {
return 20 /* jsxCloseTagName */;
}
break;
case 284 /* JsxSelfClosingElement */:
if (token.parent.tagName === token) {
return 21 /* jsxSelfClosingTagName */;
}
break;
case 290 /* JsxAttribute */:
if (token.parent.name === token) {
return 22 /* jsxAttribute */;
}
break;
}
return void 0;
}
function classifyTokenType(tokenKind, token) {
if (isKeyword(tokenKind)) {
return 3 /* keyword */;
}
if (tokenKind === 30 /* LessThanToken */ || tokenKind === 32 /* GreaterThanToken */) {
if (token && getTypeArgumentOrTypeParameterList(token.parent)) {
return 10 /* punctuation */;
}
}
if (isPunctuation(tokenKind)) {
if (token) {
const parent2 = token.parent;
if (tokenKind === 64 /* EqualsToken */) {
if (parent2.kind === 259 /* VariableDeclaration */ || parent2.kind === 171 /* PropertyDeclaration */ || parent2.kind === 168 /* Parameter */ || parent2.kind === 290 /* JsxAttribute */) {
return 5 /* operator */;
}
}
if (parent2.kind === 225 /* BinaryExpression */ || parent2.kind === 223 /* PrefixUnaryExpression */ || parent2.kind === 224 /* PostfixUnaryExpression */ || parent2.kind === 226 /* ConditionalExpression */) {
return 5 /* operator */;
}
}
return 10 /* punctuation */;
} else if (tokenKind === 9 /* NumericLiteral */) {
return 4 /* numericLiteral */;
} else if (tokenKind === 10 /* BigIntLiteral */) {
return 25 /* bigintLiteral */;
} else if (tokenKind === 11 /* StringLiteral */) {
return token && token.parent.kind === 290 /* JsxAttribute */ ? 24 /* jsxAttributeStringLiteralValue */ : 6 /* stringLiteral */;
} else if (tokenKind === 14 /* RegularExpressionLiteral */) {
return 6 /* stringLiteral */;
} else if (isTemplateLiteralKind(tokenKind)) {
return 6 /* stringLiteral */;
} else if (tokenKind === 12 /* JsxText */) {
return 23 /* jsxText */;
} else if (tokenKind === 80 /* Identifier */) {
if (token) {
switch (token.parent.kind) {
case 262 /* ClassDeclaration */:
if (token.parent.name === token) {
return 11 /* className */;
}
return;
case 167 /* TypeParameter */:
if (token.parent.name === token) {
return 15 /* typeParameterName */;
}
return;
case 263 /* InterfaceDeclaration */:
if (token.parent.name === token) {
return 13 /* interfaceName */;
}
return;
case 265 /* EnumDeclaration */:
if (token.parent.name === token) {
return 12 /* enumName */;
}
return;
case 266 /* ModuleDeclaration */:
if (token.parent.name === token) {
return 14 /* moduleName */;
}
return;
case 168 /* Parameter */:
if (token.parent.name === token) {
return isThisIdentifier(token) ? 3 /* keyword */ : 17 /* parameterName */;
}
return;
}
if (isConstTypeReference(token.parent)) {
return 3 /* keyword */;
}
}
return 2 /* identifier */;
}
}
function processElement(element) {
if (!element) {
return;
}
if (decodedTextSpanIntersectsWith(spanStart, spanLength, element.pos, element.getFullWidth())) {
checkForClassificationCancellation(cancellationToken, element.kind);
for (const child of element.getChildren(sourceFile)) {
if (!tryClassifyNode(child)) {
processElement(child);
}
}
}
}
}
// src/services/documentHighlights.ts
var DocumentHighlights;
((DocumentHighlights3) => {
function getDocumentHighlights(program, cancellationToken, sourceFile, position, sourceFilesToSearch) {
const node = getTouchingPropertyName(sourceFile, position);
if (node.parent && (isJsxOpeningElement(node.parent) && node.parent.tagName === node || isJsxClosingElement(node.parent))) {
const { openingElement, closingElement } = node.parent.parent;
const highlightSpans = [openingElement, closingElement].map(({ tagName }) => getHighlightSpanForNode(tagName, sourceFile));
return [{ fileName: sourceFile.fileName, highlightSpans }];
}
return getSemanticDocumentHighlights(position, node, program, cancellationToken, sourceFilesToSearch) || getSyntacticDocumentHighlights(node, sourceFile);
}
DocumentHighlights3.getDocumentHighlights = getDocumentHighlights;
function getHighlightSpanForNode(node, sourceFile) {
return {
fileName: sourceFile.fileName,
textSpan: createTextSpanFromNode(node, sourceFile),
kind: "none" /* none */
};
}
function getSemanticDocumentHighlights(position, node, program, cancellationToken, sourceFilesToSearch) {
const sourceFilesSet = new Set(sourceFilesToSearch.map((f) => f.fileName));
const referenceEntries = ts_FindAllReferences_exports.getReferenceEntriesForNode(
position,
node,
program,
sourceFilesToSearch,
cancellationToken,
/*options*/
void 0,
sourceFilesSet
);
if (!referenceEntries)
return void 0;
const map2 = arrayToMultiMap(referenceEntries.map(ts_FindAllReferences_exports.toHighlightSpan), (e) => e.fileName, (e) => e.span);
const getCanonicalFileName = createGetCanonicalFileName(program.useCaseSensitiveFileNames());
return arrayFrom(mapDefinedIterator(map2.entries(), ([fileName, highlightSpans]) => {
if (!sourceFilesSet.has(fileName)) {
if (!program.redirectTargetsMap.has(toPath(fileName, program.getCurrentDirectory(), getCanonicalFileName))) {
return void 0;
}
const redirectTarget = program.getSourceFile(fileName);
const redirect = find(sourceFilesToSearch, (f) => !!f.redirectInfo && f.redirectInfo.redirectTarget === redirectTarget);
fileName = redirect.fileName;
Debug.assert(sourceFilesSet.has(fileName));
}
return { fileName, highlightSpans };
}));
}
function getSyntacticDocumentHighlights(node, sourceFile) {
const highlightSpans = getHighlightSpans(node, sourceFile);
return highlightSpans && [{ fileName: sourceFile.fileName, highlightSpans }];
}
function getHighlightSpans(node, sourceFile) {
switch (node.kind) {
case 101 /* IfKeyword */:
case 93 /* ElseKeyword */:
return isIfStatement(node.parent) ? getIfElseOccurrences(node.parent, sourceFile) : void 0;
case 107 /* ReturnKeyword */:
return useParent(node.parent, isReturnStatement, getReturnOccurrences);
case 111 /* ThrowKeyword */:
return useParent(node.parent, isThrowStatement, getThrowOccurrences);
case 113 /* TryKeyword */:
case 85 /* CatchKeyword */:
case 98 /* FinallyKeyword */:
const tryStatement = node.kind === 85 /* CatchKeyword */ ? node.parent.parent : node.parent;
return useParent(tryStatement, isTryStatement, getTryCatchFinallyOccurrences);
case 109 /* SwitchKeyword */:
return useParent(node.parent, isSwitchStatement, getSwitchCaseDefaultOccurrences);
case 84 /* CaseKeyword */:
case 90 /* DefaultKeyword */: {
if (isDefaultClause(node.parent) || isCaseClause(node.parent)) {
return useParent(node.parent.parent.parent, isSwitchStatement, getSwitchCaseDefaultOccurrences);
}
return void 0;
}
case 83 /* BreakKeyword */:
case 88 /* ContinueKeyword */:
return useParent(node.parent, isBreakOrContinueStatement, getBreakOrContinueStatementOccurrences);
case 99 /* ForKeyword */:
case 117 /* WhileKeyword */:
case 92 /* DoKeyword */:
return useParent(node.parent, (n) => isIterationStatement(
n,
/*lookInLabeledStatements*/
true
), getLoopBreakContinueOccurrences);
case 137 /* ConstructorKeyword */:
return getFromAllDeclarations(isConstructorDeclaration, [137 /* ConstructorKeyword */]);
case 139 /* GetKeyword */:
case 153 /* SetKeyword */:
return getFromAllDeclarations(isAccessor, [139 /* GetKeyword */, 153 /* SetKeyword */]);
case 135 /* AwaitKeyword */:
return useParent(node.parent, isAwaitExpression, getAsyncAndAwaitOccurrences);
case 134 /* AsyncKeyword */:
return highlightSpans(getAsyncAndAwaitOccurrences(node));
case 127 /* YieldKeyword */:
return highlightSpans(getYieldOccurrences(node));
case 103 /* InKeyword */:
return void 0;
default:
return isModifierKind(node.kind) && (isDeclaration(node.parent) || isVariableStatement(node.parent)) ? highlightSpans(getModifierOccurrences(node.kind, node.parent)) : void 0;
}
function getFromAllDeclarations(nodeTest, keywords) {
return useParent(node.parent, nodeTest, (decl) => {
var _a;
return mapDefined((_a = tryCast(decl, canHaveSymbol)) == null ? void 0 : _a.symbol.declarations, (d) => nodeTest(d) ? find(d.getChildren(sourceFile), (c) => contains(keywords, c.kind)) : void 0);
});
}
function useParent(node2, nodeTest, getNodes4) {
return nodeTest(node2) ? highlightSpans(getNodes4(node2, sourceFile)) : void 0;
}
function highlightSpans(nodes) {
return nodes && nodes.map((node2) => getHighlightSpanForNode(node2, sourceFile));
}
}
function aggregateOwnedThrowStatements(node) {
if (isThrowStatement(node)) {
return [node];
} else if (isTryStatement(node)) {
return concatenate(
node.catchClause ? aggregateOwnedThrowStatements(node.catchClause) : node.tryBlock && aggregateOwnedThrowStatements(node.tryBlock),
node.finallyBlock && aggregateOwnedThrowStatements(node.finallyBlock)
);
}
return isFunctionLike(node) ? void 0 : flatMapChildren(node, aggregateOwnedThrowStatements);
}
function getThrowStatementOwner(throwStatement) {
let child = throwStatement;
while (child.parent) {
const parent2 = child.parent;
if (isFunctionBlock(parent2) || parent2.kind === 311 /* SourceFile */) {
return parent2;
}
if (isTryStatement(parent2) && parent2.tryBlock === child && parent2.catchClause) {
return child;
}
child = parent2;
}
return void 0;
}
function aggregateAllBreakAndContinueStatements(node) {
return isBreakOrContinueStatement(node) ? [node] : isFunctionLike(node) ? void 0 : flatMapChildren(node, aggregateAllBreakAndContinueStatements);
}
function flatMapChildren(node, cb) {
const result = [];
node.forEachChild((child) => {
const value = cb(child);
if (value !== void 0) {
result.push(...toArray(value));
}
});
return result;
}
function ownsBreakOrContinueStatement(owner, statement) {
const actualOwner = getBreakOrContinueOwner(statement);
return !!actualOwner && actualOwner === owner;
}
function getBreakOrContinueOwner(statement) {
return findAncestor(statement, (node) => {
switch (node.kind) {
case 254 /* SwitchStatement */:
if (statement.kind === 250 /* ContinueStatement */) {
return false;
}
case 247 /* ForStatement */:
case 248 /* ForInStatement */:
case 249 /* ForOfStatement */:
case 246 /* WhileStatement */:
case 245 /* DoStatement */:
return !statement.label || isLabeledBy(node, statement.label.escapedText);
default:
return isFunctionLike(node) && "quit";
}
});
}
function getModifierOccurrences(modifier, declaration) {
return mapDefined(getNodesToSearchForModifier(declaration, modifierToFlag(modifier)), (node) => findModifier(node, modifier));
}
function getNodesToSearchForModifier(declaration, modifierFlag) {
const container = declaration.parent;
switch (container.kind) {
case 267 /* ModuleBlock */:
case 311 /* SourceFile */:
case 240 /* Block */:
case 295 /* CaseClause */:
case 296 /* DefaultClause */:
if (modifierFlag & 256 /* Abstract */ && isClassDeclaration(declaration)) {
return [...declaration.members, declaration];
} else {
return container.statements;
}
case 175 /* Constructor */:
case 173 /* MethodDeclaration */:
case 261 /* FunctionDeclaration */:
return [...container.parameters, ...isClassLike(container.parent) ? container.parent.members : []];
case 262 /* ClassDeclaration */:
case 230 /* ClassExpression */:
case 263 /* InterfaceDeclaration */:
case 186 /* TypeLiteral */:
const nodes = container.members;
if (modifierFlag & (28 /* AccessibilityModifier */ | 64 /* Readonly */)) {
const constructor = find(container.members, isConstructorDeclaration);
if (constructor) {
return [...nodes, ...constructor.parameters];
}
} else if (modifierFlag & 256 /* Abstract */) {
return [...nodes, container];
}
return nodes;
case 209 /* ObjectLiteralExpression */:
return void 0;
default:
Debug.assertNever(container, "Invalid container kind.");
}
}
function pushKeywordIf(keywordList, token, ...expected) {
if (token && contains(expected, token.kind)) {
keywordList.push(token);
return true;
}
return false;
}
function getLoopBreakContinueOccurrences(loopNode) {
const keywords = [];
if (pushKeywordIf(keywords, loopNode.getFirstToken(), 99 /* ForKeyword */, 117 /* WhileKeyword */, 92 /* DoKeyword */)) {
if (loopNode.kind === 245 /* DoStatement */) {
const loopTokens = loopNode.getChildren();
for (let i = loopTokens.length - 1; i >= 0; i--) {
if (pushKeywordIf(keywords, loopTokens[i], 117 /* WhileKeyword */)) {
break;
}
}
}
}
forEach(aggregateAllBreakAndContinueStatements(loopNode.statement), (statement) => {
if (ownsBreakOrContinueStatement(loopNode, statement)) {
pushKeywordIf(keywords, statement.getFirstToken(), 83 /* BreakKeyword */, 88 /* ContinueKeyword */);
}
});
return keywords;
}
function getBreakOrContinueStatementOccurrences(breakOrContinueStatement) {
const owner = getBreakOrContinueOwner(breakOrContinueStatement);
if (owner) {
switch (owner.kind) {
case 247 /* ForStatement */:
case 248 /* ForInStatement */:
case 249 /* ForOfStatement */:
case 245 /* DoStatement */:
case 246 /* WhileStatement */:
return getLoopBreakContinueOccurrences(owner);
case 254 /* SwitchStatement */:
return getSwitchCaseDefaultOccurrences(owner);
}
}
return void 0;
}
function getSwitchCaseDefaultOccurrences(switchStatement) {
const keywords = [];
pushKeywordIf(keywords, switchStatement.getFirstToken(), 109 /* SwitchKeyword */);
forEach(switchStatement.caseBlock.clauses, (clause) => {
pushKeywordIf(keywords, clause.getFirstToken(), 84 /* CaseKeyword */, 90 /* DefaultKeyword */);
forEach(aggregateAllBreakAndContinueStatements(clause), (statement) => {
if (ownsBreakOrContinueStatement(switchStatement, statement)) {
pushKeywordIf(keywords, statement.getFirstToken(), 83 /* BreakKeyword */);
}
});
});
return keywords;
}
function getTryCatchFinallyOccurrences(tryStatement, sourceFile) {
const keywords = [];
pushKeywordIf(keywords, tryStatement.getFirstToken(), 113 /* TryKeyword */);
if (tryStatement.catchClause) {
pushKeywordIf(keywords, tryStatement.catchClause.getFirstToken(), 85 /* CatchKeyword */);
}
if (tryStatement.finallyBlock) {
const finallyKeyword = findChildOfKind(tryStatement, 98 /* FinallyKeyword */, sourceFile);
pushKeywordIf(keywords, finallyKeyword, 98 /* FinallyKeyword */);
}
return keywords;
}
function getThrowOccurrences(throwStatement, sourceFile) {
const owner = getThrowStatementOwner(throwStatement);
if (!owner) {
return void 0;
}
const keywords = [];
forEach(aggregateOwnedThrowStatements(owner), (throwStatement2) => {
keywords.push(findChildOfKind(throwStatement2, 111 /* ThrowKeyword */, sourceFile));
});
if (isFunctionBlock(owner)) {
forEachReturnStatement(owner, (returnStatement) => {
keywords.push(findChildOfKind(returnStatement, 107 /* ReturnKeyword */, sourceFile));
});
}
return keywords;
}
function getReturnOccurrences(returnStatement, sourceFile) {
const func = getContainingFunction(returnStatement);
if (!func) {
return void 0;
}
const keywords = [];
forEachReturnStatement(cast(func.body, isBlock), (returnStatement2) => {
keywords.push(findChildOfKind(returnStatement2, 107 /* ReturnKeyword */, sourceFile));
});
forEach(aggregateOwnedThrowStatements(func.body), (throwStatement) => {
keywords.push(findChildOfKind(throwStatement, 111 /* ThrowKeyword */, sourceFile));
});
return keywords;
}
function getAsyncAndAwaitOccurrences(node) {
const func = getContainingFunction(node);
if (!func) {
return void 0;
}
const keywords = [];
if (func.modifiers) {
func.modifiers.forEach((modifier) => {
pushKeywordIf(keywords, modifier, 134 /* AsyncKeyword */);
});
}
forEachChild(func, (child) => {
traverseWithoutCrossingFunction(child, (node2) => {
if (isAwaitExpression(node2)) {
pushKeywordIf(keywords, node2.getFirstToken(), 135 /* AwaitKeyword */);
}
});
});
return keywords;
}
function getYieldOccurrences(node) {
const func = getContainingFunction(node);
if (!func) {
return void 0;
}
const keywords = [];
forEachChild(func, (child) => {
traverseWithoutCrossingFunction(child, (node2) => {
if (isYieldExpression(node2)) {
pushKeywordIf(keywords, node2.getFirstToken(), 127 /* YieldKeyword */);
}
});
});
return keywords;
}
function traverseWithoutCrossingFunction(node, cb) {
cb(node);
if (!isFunctionLike(node) && !isClassLike(node) && !isInterfaceDeclaration(node) && !isModuleDeclaration(node) && !isTypeAliasDeclaration(node) && !isTypeNode(node)) {
forEachChild(node, (child) => traverseWithoutCrossingFunction(child, cb));
}
}
function getIfElseOccurrences(ifStatement, sourceFile) {
const keywords = getIfElseKeywords(ifStatement, sourceFile);
const result = [];
for (let i = 0; i < keywords.length; i++) {
if (keywords[i].kind === 93 /* ElseKeyword */ && i < keywords.length - 1) {
const elseKeyword = keywords[i];
const ifKeyword = keywords[i + 1];
let shouldCombineElseAndIf = true;
for (let j = ifKeyword.getStart(sourceFile) - 1; j >= elseKeyword.end; j--) {
if (!isWhiteSpaceSingleLine(sourceFile.text.charCodeAt(j))) {
shouldCombineElseAndIf = false;
break;
}
}
if (shouldCombineElseAndIf) {
result.push({
fileName: sourceFile.fileName,
textSpan: createTextSpanFromBounds(elseKeyword.getStart(), ifKeyword.end),
kind: "reference" /* reference */
});
i++;
continue;
}
}
result.push(getHighlightSpanForNode(keywords[i], sourceFile));
}
return result;
}
function getIfElseKeywords(ifStatement, sourceFile) {
const keywords = [];
while (isIfStatement(ifStatement.parent) && ifStatement.parent.elseStatement === ifStatement) {
ifStatement = ifStatement.parent;
}
while (true) {
const children = ifStatement.getChildren(sourceFile);
pushKeywordIf(keywords, children[0], 101 /* IfKeyword */);
for (let i = children.length - 1; i >= 0; i--) {
if (pushKeywordIf(keywords, children[i], 93 /* ElseKeyword */)) {
break;
}
}
if (!ifStatement.elseStatement || !isIfStatement(ifStatement.elseStatement)) {
break;
}
ifStatement = ifStatement.elseStatement;
}
return keywords;
}
function isLabeledBy(node, labelName) {
return !!findAncestor(node.parent, (owner) => !isLabeledStatement(owner) ? "quit" : owner.label.escapedText === labelName);
}
})(DocumentHighlights || (DocumentHighlights = {}));
// src/services/documentRegistry.ts
function isDocumentRegistryEntry(entry) {
return !!entry.sourceFile;
}
function createDocumentRegistry(useCaseSensitiveFileNames, currentDirectory) {
return createDocumentRegistryInternal(useCaseSensitiveFileNames, currentDirectory);
}
function createDocumentRegistryInternal(useCaseSensitiveFileNames, currentDirectory = "", externalCache) {
const buckets = /* @__PURE__ */ new Map();
const getCanonicalFileName = createGetCanonicalFileName(!!useCaseSensitiveFileNames);
function reportStats() {
const bucketInfoArray = arrayFrom(buckets.keys()).filter((name) => name && name.charAt(0) === "_").map((name) => {
const entries = buckets.get(name);
const sourceFiles = [];
entries.forEach((entry, name2) => {
if (isDocumentRegistryEntry(entry)) {
sourceFiles.push({
name: name2,
scriptKind: entry.sourceFile.scriptKind,
refCount: entry.languageServiceRefCount
});
} else {
entry.forEach((value, scriptKind) => sourceFiles.push({ name: name2, scriptKind, refCount: value.languageServiceRefCount }));
}
});
sourceFiles.sort((x, y) => y.refCount - x.refCount);
return {
bucket: name,
sourceFiles
};
});
return JSON.stringify(bucketInfoArray, void 0, 2);
}
function getCompilationSettings(settingsOrHost) {
if (typeof settingsOrHost.getCompilationSettings === "function") {
return settingsOrHost.getCompilationSettings();
}
return settingsOrHost;
}
function acquireDocument(fileName, compilationSettings, scriptSnapshot, version2, scriptKind, languageVersionOrOptions) {
const path = toPath(fileName, currentDirectory, getCanonicalFileName);
const key = getKeyForCompilationSettings(getCompilationSettings(compilationSettings));
return acquireDocumentWithKey(fileName, path, compilationSettings, key, scriptSnapshot, version2, scriptKind, languageVersionOrOptions);
}
function acquireDocumentWithKey(fileName, path, compilationSettings, key, scriptSnapshot, version2, scriptKind, languageVersionOrOptions) {
return acquireOrUpdateDocument(
fileName,
path,
compilationSettings,
key,
scriptSnapshot,
version2,
/*acquiring*/
true,
scriptKind,
languageVersionOrOptions
);
}
function updateDocument(fileName, compilationSettings, scriptSnapshot, version2, scriptKind, languageVersionOrOptions) {
const path = toPath(fileName, currentDirectory, getCanonicalFileName);
const key = getKeyForCompilationSettings(getCompilationSettings(compilationSettings));
return updateDocumentWithKey(fileName, path, compilationSettings, key, scriptSnapshot, version2, scriptKind, languageVersionOrOptions);
}
function updateDocumentWithKey(fileName, path, compilationSettings, key, scriptSnapshot, version2, scriptKind, languageVersionOrOptions) {
return acquireOrUpdateDocument(
fileName,
path,
getCompilationSettings(compilationSettings),
key,
scriptSnapshot,
version2,
/*acquiring*/
false,
scriptKind,
languageVersionOrOptions
);
}
function getDocumentRegistryEntry(bucketEntry, scriptKind) {
const entry = isDocumentRegistryEntry(bucketEntry) ? bucketEntry : bucketEntry.get(Debug.checkDefined(scriptKind, "If there are more than one scriptKind's for same document the scriptKind should be provided"));
Debug.assert(scriptKind === void 0 || !entry || entry.sourceFile.scriptKind === scriptKind, `Script kind should match provided ScriptKind:${scriptKind} and sourceFile.scriptKind: ${entry == null ? void 0 : entry.sourceFile.scriptKind}, !entry: ${!entry}`);
return entry;
}
function acquireOrUpdateDocument(fileName, path, compilationSettingsOrHost, key, scriptSnapshot, version2, acquiring, scriptKind, languageVersionOrOptions) {
var _a, _b, _c, _d;
scriptKind = ensureScriptKind(fileName, scriptKind);
const compilationSettings = getCompilationSettings(compilationSettingsOrHost);
const host = compilationSettingsOrHost === compilationSettings ? void 0 : compilationSettingsOrHost;
const scriptTarget = scriptKind === 6 /* JSON */ ? 100 /* JSON */ : getEmitScriptTarget(compilationSettings);
const sourceFileOptions = typeof languageVersionOrOptions === "object" ? languageVersionOrOptions : {
languageVersion: scriptTarget,
impliedNodeFormat: host && getImpliedNodeFormatForFile(path, (_d = (_c = (_b = (_a = host.getCompilerHost) == null ? void 0 : _a.call(host)) == null ? void 0 : _b.getModuleResolutionCache) == null ? void 0 : _c.call(_b)) == null ? void 0 : _d.getPackageJsonInfoCache(), host, compilationSettings),
setExternalModuleIndicator: getSetExternalModuleIndicator(compilationSettings)
};
sourceFileOptions.languageVersion = scriptTarget;
const oldBucketCount = buckets.size;
const keyWithMode = getDocumentRegistryBucketKeyWithMode(key, sourceFileOptions.impliedNodeFormat);
const bucket = getOrUpdate(buckets, keyWithMode, () => /* @__PURE__ */ new Map());
if (tracing) {
if (buckets.size > oldBucketCount) {
tracing.instant(tracing.Phase.Session, "createdDocumentRegistryBucket", { configFilePath: compilationSettings.configFilePath, key: keyWithMode });
}
const otherBucketKey = !isDeclarationFileName(path) && forEachEntry(buckets, (bucket2, bucketKey) => bucketKey !== keyWithMode && bucket2.has(path) && bucketKey);
if (otherBucketKey) {
tracing.instant(tracing.Phase.Session, "documentRegistryBucketOverlap", { path, key1: otherBucketKey, key2: keyWithMode });
}
}
const bucketEntry = bucket.get(path);
let entry = bucketEntry && getDocumentRegistryEntry(bucketEntry, scriptKind);
if (!entry && externalCache) {
const sourceFile = externalCache.getDocument(keyWithMode, path);
if (sourceFile) {
Debug.assert(acquiring);
entry = {
sourceFile,
languageServiceRefCount: 0
};
setBucketEntry();
}
}
if (!entry) {
const sourceFile = createLanguageServiceSourceFile(
fileName,
scriptSnapshot,
sourceFileOptions,
version2,
/*setNodeParents*/
false,
scriptKind
);
if (externalCache) {
externalCache.setDocument(keyWithMode, path, sourceFile);
}
entry = {
sourceFile,
languageServiceRefCount: 1
};
setBucketEntry();
} else {
if (entry.sourceFile.version !== version2) {
entry.sourceFile = updateLanguageServiceSourceFile(
entry.sourceFile,
scriptSnapshot,
version2,
scriptSnapshot.getChangeRange(entry.sourceFile.scriptSnapshot)
);
if (externalCache) {
externalCache.setDocument(keyWithMode, path, entry.sourceFile);
}
}
if (acquiring) {
entry.languageServiceRefCount++;
}
}
Debug.assert(entry.languageServiceRefCount !== 0);
return entry.sourceFile;
function setBucketEntry() {
if (!bucketEntry) {
bucket.set(path, entry);
} else if (isDocumentRegistryEntry(bucketEntry)) {
const scriptKindMap = /* @__PURE__ */ new Map();
scriptKindMap.set(bucketEntry.sourceFile.scriptKind, bucketEntry);
scriptKindMap.set(scriptKind, entry);
bucket.set(path, scriptKindMap);
} else {
bucketEntry.set(scriptKind, entry);
}
}
}
function releaseDocument(fileName, compilationSettings, scriptKind, impliedNodeFormat) {
const path = toPath(fileName, currentDirectory, getCanonicalFileName);
const key = getKeyForCompilationSettings(compilationSettings);
return releaseDocumentWithKey(path, key, scriptKind, impliedNodeFormat);
}
function releaseDocumentWithKey(path, key, scriptKind, impliedNodeFormat) {
const bucket = Debug.checkDefined(buckets.get(getDocumentRegistryBucketKeyWithMode(key, impliedNodeFormat)));
const bucketEntry = bucket.get(path);
const entry = getDocumentRegistryEntry(bucketEntry, scriptKind);
entry.languageServiceRefCount--;
Debug.assert(entry.languageServiceRefCount >= 0);
if (entry.languageServiceRefCount === 0) {
if (isDocumentRegistryEntry(bucketEntry)) {
bucket.delete(path);
} else {
bucketEntry.delete(scriptKind);
if (bucketEntry.size === 1) {
bucket.set(path, firstDefinedIterator(bucketEntry.values(), identity));
}
}
}
}
function getLanguageServiceRefCounts(path, scriptKind) {
return arrayFrom(buckets.entries(), ([key, bucket]) => {
const bucketEntry = bucket.get(path);
const entry = bucketEntry && getDocumentRegistryEntry(bucketEntry, scriptKind);
return [key, entry && entry.languageServiceRefCount];
});
}
return {
acquireDocument,
acquireDocumentWithKey,
updateDocument,
updateDocumentWithKey,
releaseDocument,
releaseDocumentWithKey,
getLanguageServiceRefCounts,
reportStats,
getKeyForCompilationSettings
};
}
function getKeyForCompilationSettings(settings) {
return getKeyForCompilerOptions(settings, sourceFileAffectingCompilerOptions);
}
function getDocumentRegistryBucketKeyWithMode(key, mode) {
return mode ? `${key}|${mode}` : key;
}
// src/services/getEditsForFileRename.ts
function getEditsForFileRename(program, oldFileOrDirPath, newFileOrDirPath, host, formatContext, preferences, sourceMapper) {
const useCaseSensitiveFileNames = hostUsesCaseSensitiveFileNames(host);
const getCanonicalFileName = createGetCanonicalFileName(useCaseSensitiveFileNames);
const oldToNew = getPathUpdater(oldFileOrDirPath, newFileOrDirPath, getCanonicalFileName, sourceMapper);
const newToOld = getPathUpdater(newFileOrDirPath, oldFileOrDirPath, getCanonicalFileName, sourceMapper);
return ts_textChanges_exports.ChangeTracker.with({ host, formatContext, preferences }, (changeTracker) => {
updateTsconfigFiles(program, changeTracker, oldToNew, oldFileOrDirPath, newFileOrDirPath, host.getCurrentDirectory(), useCaseSensitiveFileNames);
updateImports(program, changeTracker, oldToNew, newToOld, host, getCanonicalFileName);
});
}
function getPathUpdater(oldFileOrDirPath, newFileOrDirPath, getCanonicalFileName, sourceMapper) {
const canonicalOldPath = getCanonicalFileName(oldFileOrDirPath);
return (path) => {
const originalPath = sourceMapper && sourceMapper.tryGetSourcePosition({ fileName: path, pos: 0 });
const updatedPath = getUpdatedPath(originalPath ? originalPath.fileName : path);
return originalPath ? updatedPath === void 0 ? void 0 : makeCorrespondingRelativeChange(originalPath.fileName, updatedPath, path, getCanonicalFileName) : updatedPath;
};
function getUpdatedPath(pathToUpdate) {
if (getCanonicalFileName(pathToUpdate) === canonicalOldPath)
return newFileOrDirPath;
const suffix = tryRemoveDirectoryPrefix(pathToUpdate, canonicalOldPath, getCanonicalFileName);
return suffix === void 0 ? void 0 : newFileOrDirPath + "/" + suffix;
}
}
function makeCorrespondingRelativeChange(a0, b0, a1, getCanonicalFileName) {
const rel = getRelativePathFromFile(a0, b0, getCanonicalFileName);
return combinePathsSafe(getDirectoryPath(a1), rel);
}
function updateTsconfigFiles(program, changeTracker, oldToNew, oldFileOrDirPath, newFileOrDirPath, currentDirectory, useCaseSensitiveFileNames) {
const { configFile } = program.getCompilerOptions();
if (!configFile)
return;
const configDir = getDirectoryPath(configFile.fileName);
const jsonObjectLiteral = getTsConfigObjectLiteralExpression(configFile);
if (!jsonObjectLiteral)
return;
forEachProperty(jsonObjectLiteral, (property, propertyName) => {
switch (propertyName) {
case "files":
case "include":
case "exclude": {
const foundExactMatch = updatePaths(property);
if (foundExactMatch || propertyName !== "include" || !isArrayLiteralExpression(property.initializer))
return;
const includes = mapDefined(property.initializer.elements, (e) => isStringLiteral(e) ? e.text : void 0);
if (includes.length === 0)
return;
const matchers = getFileMatcherPatterns(
configDir,
/*excludes*/
[],
includes,
useCaseSensitiveFileNames,
currentDirectory
);
if (getRegexFromPattern(Debug.checkDefined(matchers.includeFilePattern), useCaseSensitiveFileNames).test(oldFileOrDirPath) && !getRegexFromPattern(Debug.checkDefined(matchers.includeFilePattern), useCaseSensitiveFileNames).test(newFileOrDirPath)) {
changeTracker.insertNodeAfter(configFile, last(property.initializer.elements), factory.createStringLiteral(relativePath(newFileOrDirPath)));
}
return;
}
case "compilerOptions":
forEachProperty(property.initializer, (property2, propertyName2) => {
const option = getOptionFromName(propertyName2);
Debug.assert((option == null ? void 0 : option.type) !== "listOrElement");
if (option && (option.isFilePath || option.type === "list" && option.element.isFilePath)) {
updatePaths(property2);
} else if (propertyName2 === "paths") {
forEachProperty(property2.initializer, (pathsProperty) => {
if (!isArrayLiteralExpression(pathsProperty.initializer))
return;
for (const e of pathsProperty.initializer.elements) {
tryUpdateString(e);
}
});
}
});
return;
}
});
function updatePaths(property) {
const elements = isArrayLiteralExpression(property.initializer) ? property.initializer.elements : [property.initializer];
let foundExactMatch = false;
for (const element of elements) {
foundExactMatch = tryUpdateString(element) || foundExactMatch;
}
return foundExactMatch;
}
function tryUpdateString(element) {
if (!isStringLiteral(element))
return false;
const elementFileName = combinePathsSafe(configDir, element.text);
const updated = oldToNew(elementFileName);
if (updated !== void 0) {
changeTracker.replaceRangeWithText(configFile, createStringRange(element, configFile), relativePath(updated));
return true;
}
return false;
}
function relativePath(path) {
return getRelativePathFromDirectory(
configDir,
path,
/*ignoreCase*/
!useCaseSensitiveFileNames
);
}
}
function updateImports(program, changeTracker, oldToNew, newToOld, host, getCanonicalFileName) {
const allFiles = program.getSourceFiles();
for (const sourceFile of allFiles) {
const newFromOld = oldToNew(sourceFile.fileName);
const newImportFromPath = newFromOld ?? sourceFile.fileName;
const newImportFromDirectory = getDirectoryPath(newImportFromPath);
const oldFromNew = newToOld(sourceFile.fileName);
const oldImportFromPath = oldFromNew || sourceFile.fileName;
const oldImportFromDirectory = getDirectoryPath(oldImportFromPath);
const importingSourceFileMoved = newFromOld !== void 0 || oldFromNew !== void 0;
updateImportsWorker(
sourceFile,
changeTracker,
(referenceText) => {
if (!pathIsRelative(referenceText))
return void 0;
const oldAbsolute = combinePathsSafe(oldImportFromDirectory, referenceText);
const newAbsolute = oldToNew(oldAbsolute);
return newAbsolute === void 0 ? void 0 : ensurePathIsNonModuleName(getRelativePathFromDirectory(newImportFromDirectory, newAbsolute, getCanonicalFileName));
},
(importLiteral) => {
const importedModuleSymbol = program.getTypeChecker().getSymbolAtLocation(importLiteral);
if ((importedModuleSymbol == null ? void 0 : importedModuleSymbol.declarations) && importedModuleSymbol.declarations.some((d) => isAmbientModule(d)))
return void 0;
const toImport = oldFromNew !== void 0 ? getSourceFileToImportFromResolved(
importLiteral,
resolveModuleName(importLiteral.text, oldImportFromPath, program.getCompilerOptions(), host),
oldToNew,
allFiles
) : getSourceFileToImport(importedModuleSymbol, importLiteral, sourceFile, program, host, oldToNew);
return toImport !== void 0 && (toImport.updated || importingSourceFileMoved && pathIsRelative(importLiteral.text)) ? ts_moduleSpecifiers_exports.updateModuleSpecifier(program.getCompilerOptions(), sourceFile, getCanonicalFileName(newImportFromPath), toImport.newFileName, createModuleSpecifierResolutionHost(program, host), importLiteral.text) : void 0;
}
);
}
}
function combineNormal(pathA, pathB) {
return normalizePath(combinePaths(pathA, pathB));
}
function combinePathsSafe(pathA, pathB) {
return ensurePathIsNonModuleName(combineNormal(pathA, pathB));
}
function getSourceFileToImport(importedModuleSymbol, importLiteral, importingSourceFile, program, host, oldToNew) {
var _a;
if (importedModuleSymbol) {
const oldFileName = find(importedModuleSymbol.declarations, isSourceFile).fileName;
const newFileName = oldToNew(oldFileName);
return newFileName === void 0 ? { newFileName: oldFileName, updated: false } : { newFileName, updated: true };
} else {
const mode = getModeForUsageLocation(importingSourceFile, importLiteral);
const resolved = host.resolveModuleNameLiterals || !host.resolveModuleNames ? (_a = importingSourceFile.resolvedModules) == null ? void 0 : _a.get(importLiteral.text, mode) : host.getResolvedModuleWithFailedLookupLocationsFromCache && host.getResolvedModuleWithFailedLookupLocationsFromCache(importLiteral.text, importingSourceFile.fileName, mode);
return getSourceFileToImportFromResolved(importLiteral, resolved, oldToNew, program.getSourceFiles());
}
}
function getSourceFileToImportFromResolved(importLiteral, resolved, oldToNew, sourceFiles) {
if (!resolved)
return void 0;
if (resolved.resolvedModule) {
const result2 = tryChange(resolved.resolvedModule.resolvedFileName);
if (result2)
return result2;
}
const result = forEach(resolved.failedLookupLocations, tryChangeWithIgnoringPackageJsonExisting) || pathIsRelative(importLiteral.text) && forEach(resolved.failedLookupLocations, tryChangeWithIgnoringPackageJson);
if (result)
return result;
return resolved.resolvedModule && { newFileName: resolved.resolvedModule.resolvedFileName, updated: false };
function tryChangeWithIgnoringPackageJsonExisting(oldFileName) {
const newFileName = oldToNew(oldFileName);
return newFileName && find(sourceFiles, (src) => src.fileName === newFileName) ? tryChangeWithIgnoringPackageJson(oldFileName) : void 0;
}
function tryChangeWithIgnoringPackageJson(oldFileName) {
return !endsWith(oldFileName, "/package.json") ? tryChange(oldFileName) : void 0;
}
function tryChange(oldFileName) {
const newFileName = oldToNew(oldFileName);
return newFileName && { newFileName, updated: true };
}
}
function updateImportsWorker(sourceFile, changeTracker, updateRef, updateImport2) {
for (const ref of sourceFile.referencedFiles || emptyArray) {
const updated = updateRef(ref.fileName);
if (updated !== void 0 && updated !== sourceFile.text.slice(ref.pos, ref.end))
changeTracker.replaceRangeWithText(sourceFile, ref, updated);
}
for (const importStringLiteral of sourceFile.imports) {
const updated = updateImport2(importStringLiteral);
if (updated !== void 0 && updated !== importStringLiteral.text)
changeTracker.replaceRangeWithText(sourceFile, createStringRange(importStringLiteral, sourceFile), updated);
}
}
function createStringRange(node, sourceFile) {
return createRange(node.getStart(sourceFile) + 1, node.end - 1);
}
function forEachProperty(objectLiteral, cb) {
if (!isObjectLiteralExpression(objectLiteral))
return;
for (const property of objectLiteral.properties) {
if (isPropertyAssignment(property) && isStringLiteral(property.name)) {
cb(property, property.name.text);
}
}
}
// src/services/patternMatcher.ts
var PatternMatchKind = /* @__PURE__ */ ((PatternMatchKind2) => {
PatternMatchKind2[PatternMatchKind2["exact"] = 0] = "exact";
PatternMatchKind2[PatternMatchKind2["prefix"] = 1] = "prefix";
PatternMatchKind2[PatternMatchKind2["substring"] = 2] = "substring";
PatternMatchKind2[PatternMatchKind2["camelCase"] = 3] = "camelCase";
return PatternMatchKind2;
})(PatternMatchKind || {});
function createPatternMatch(kind, isCaseSensitive) {
return {
kind,
isCaseSensitive
};
}
function createPatternMatcher(pattern) {
const stringToWordSpans = /* @__PURE__ */ new Map();
const dotSeparatedSegments = pattern.trim().split(".").map((p) => createSegment(p.trim()));
if (dotSeparatedSegments.some((segment) => !segment.subWordTextChunks.length))
return void 0;
return {
getFullMatch: (containers, candidate) => getFullMatch(containers, candidate, dotSeparatedSegments, stringToWordSpans),
getMatchForLastSegmentOfPattern: (candidate) => matchSegment(candidate, last(dotSeparatedSegments), stringToWordSpans),
patternContainsDots: dotSeparatedSegments.length > 1
};
}
function getFullMatch(candidateContainers, candidate, dotSeparatedSegments, stringToWordSpans) {
const candidateMatch = matchSegment(candidate, last(dotSeparatedSegments), stringToWordSpans);
if (!candidateMatch) {
return void 0;
}
if (dotSeparatedSegments.length - 1 > candidateContainers.length) {
return void 0;
}
let bestMatch;
for (let i = dotSeparatedSegments.length - 2, j = candidateContainers.length - 1; i >= 0; i -= 1, j -= 1) {
bestMatch = betterMatch(bestMatch, matchSegment(candidateContainers[j], dotSeparatedSegments[i], stringToWordSpans));
}
return bestMatch;
}
function getWordSpans(word, stringToWordSpans) {
let spans = stringToWordSpans.get(word);
if (!spans) {
stringToWordSpans.set(word, spans = breakIntoWordSpans(word));
}
return spans;
}
function matchTextChunk(candidate, chunk, stringToWordSpans) {
const index = indexOfIgnoringCase(candidate, chunk.textLowerCase);
if (index === 0) {
return createPatternMatch(
chunk.text.length === candidate.length ? 0 /* exact */ : 1 /* prefix */,
/*isCaseSensitive:*/
startsWith(candidate, chunk.text)
);
}
if (chunk.isLowerCase) {
if (index === -1)
return void 0;
const wordSpans = getWordSpans(candidate, stringToWordSpans);
for (const span of wordSpans) {
if (partStartsWith(
candidate,
span,
chunk.text,
/*ignoreCase*/
true
)) {
return createPatternMatch(
2 /* substring */,
/*isCaseSensitive:*/
partStartsWith(
candidate,
span,
chunk.text,
/*ignoreCase*/
false
)
);
}
}
if (chunk.text.length < candidate.length && isUpperCaseLetter(candidate.charCodeAt(index))) {
return createPatternMatch(
2 /* substring */,
/*isCaseSensitive*/
false
);
}
} else {
if (candidate.indexOf(chunk.text) > 0) {
return createPatternMatch(
2 /* substring */,
/*isCaseSensitive*/
true
);
}
if (chunk.characterSpans.length > 0) {
const candidateParts = getWordSpans(candidate, stringToWordSpans);
const isCaseSensitive = tryCamelCaseMatch(
candidate,
candidateParts,
chunk,
/*ignoreCase*/
false
) ? true : tryCamelCaseMatch(
candidate,
candidateParts,
chunk,
/*ignoreCase*/
true
) ? false : void 0;
if (isCaseSensitive !== void 0) {
return createPatternMatch(3 /* camelCase */, isCaseSensitive);
}
}
}
}
function matchSegment(candidate, segment, stringToWordSpans) {
if (every2(segment.totalTextChunk.text, (ch) => ch !== 32 /* space */ && ch !== 42 /* asterisk */)) {
const match = matchTextChunk(candidate, segment.totalTextChunk, stringToWordSpans);
if (match)
return match;
}
const subWordTextChunks = segment.subWordTextChunks;
let bestMatch;
for (const subWordTextChunk of subWordTextChunks) {
bestMatch = betterMatch(bestMatch, matchTextChunk(candidate, subWordTextChunk, stringToWordSpans));
}
return bestMatch;
}
function betterMatch(a, b) {
return min([a, b], compareMatches);
}
function compareMatches(a, b) {
return a === void 0 ? 1 /* GreaterThan */ : b === void 0 ? -1 /* LessThan */ : compareValues(a.kind, b.kind) || compareBooleans(!a.isCaseSensitive, !b.isCaseSensitive);
}
function partStartsWith(candidate, candidateSpan, pattern, ignoreCase, patternSpan = { start: 0, length: pattern.length }) {
return patternSpan.length <= candidateSpan.length && everyInRange(0, patternSpan.length, (i) => equalChars(pattern.charCodeAt(patternSpan.start + i), candidate.charCodeAt(candidateSpan.start + i), ignoreCase));
}
function equalChars(ch1, ch2, ignoreCase) {
return ignoreCase ? toLowerCase2(ch1) === toLowerCase2(ch2) : ch1 === ch2;
}
function tryCamelCaseMatch(candidate, candidateParts, chunk, ignoreCase) {
const chunkCharacterSpans = chunk.characterSpans;
let currentCandidate = 0;
let currentChunkSpan = 0;
let firstMatch;
let contiguous;
while (true) {
if (currentChunkSpan === chunkCharacterSpans.length) {
return true;
} else if (currentCandidate === candidateParts.length) {
return false;
}
let candidatePart = candidateParts[currentCandidate];
let gotOneMatchThisCandidate = false;
for (; currentChunkSpan < chunkCharacterSpans.length; currentChunkSpan++) {
const chunkCharacterSpan = chunkCharacterSpans[currentChunkSpan];
if (gotOneMatchThisCandidate) {
if (!isUpperCaseLetter(chunk.text.charCodeAt(chunkCharacterSpans[currentChunkSpan - 1].start)) || !isUpperCaseLetter(chunk.text.charCodeAt(chunkCharacterSpans[currentChunkSpan].start))) {
break;
}
}
if (!partStartsWith(candidate, candidatePart, chunk.text, ignoreCase, chunkCharacterSpan)) {
break;
}
gotOneMatchThisCandidate = true;
firstMatch = firstMatch === void 0 ? currentCandidate : firstMatch;
contiguous = contiguous === void 0 ? true : contiguous;
candidatePart = createTextSpan(candidatePart.start + chunkCharacterSpan.length, candidatePart.length - chunkCharacterSpan.length);
}
if (!gotOneMatchThisCandidate && contiguous !== void 0) {
contiguous = false;
}
currentCandidate++;
}
}
function createSegment(text) {
return {
totalTextChunk: createTextChunk(text),
subWordTextChunks: breakPatternIntoTextChunks(text)
};
}
function isUpperCaseLetter(ch) {
if (ch >= 65 /* A */ && ch <= 90 /* Z */) {
return true;
}
if (ch < 127 /* maxAsciiCharacter */ || !isUnicodeIdentifierStart(ch, 99 /* Latest */)) {
return false;
}
const str = String.fromCharCode(ch);
return str === str.toUpperCase();
}
function isLowerCaseLetter(ch) {
if (ch >= 97 /* a */ && ch <= 122 /* z */) {
return true;
}
if (ch < 127 /* maxAsciiCharacter */ || !isUnicodeIdentifierStart(ch, 99 /* Latest */)) {
return false;
}
const str = String.fromCharCode(ch);
return str === str.toLowerCase();
}
function indexOfIgnoringCase(str, value) {
const n = str.length - value.length;
for (let start2 = 0; start2 <= n; start2++) {
if (every2(value, (valueChar, i) => toLowerCase2(str.charCodeAt(i + start2)) === valueChar)) {
return start2;
}
}
return -1;
}
function toLowerCase2(ch) {
if (ch >= 65 /* A */ && ch <= 90 /* Z */) {
return 97 /* a */ + (ch - 65 /* A */);
}
if (ch < 127 /* maxAsciiCharacter */) {
return ch;
}
return String.fromCharCode(ch).toLowerCase().charCodeAt(0);
}
function isDigit2(ch) {
return ch >= 48 /* _0 */ && ch <= 57 /* _9 */;
}
function isWordChar(ch) {
return isUpperCaseLetter(ch) || isLowerCaseLetter(ch) || isDigit2(ch) || ch === 95 /* _ */ || ch === 36 /* $ */;
}
function breakPatternIntoTextChunks(pattern) {
const result = [];
let wordStart = 0;
let wordLength = 0;
for (let i = 0; i < pattern.length; i++) {
const ch = pattern.charCodeAt(i);
if (isWordChar(ch)) {
if (wordLength === 0) {
wordStart = i;
}
wordLength++;
} else {
if (wordLength > 0) {
result.push(createTextChunk(pattern.substr(wordStart, wordLength)));
wordLength = 0;
}
}
}
if (wordLength > 0) {
result.push(createTextChunk(pattern.substr(wordStart, wordLength)));
}
return result;
}
function createTextChunk(text) {
const textLowerCase = text.toLowerCase();
return {
text,
textLowerCase,
isLowerCase: text === textLowerCase,
characterSpans: breakIntoCharacterSpans(text)
};
}
function breakIntoCharacterSpans(identifier) {
return breakIntoSpans(
identifier,
/*word*/
false
);
}
function breakIntoWordSpans(identifier) {
return breakIntoSpans(
identifier,
/*word*/
true
);
}
function breakIntoSpans(identifier, word) {
const result = [];
let wordStart = 0;
for (let i = 1; i < identifier.length; i++) {
const lastIsDigit = isDigit2(identifier.charCodeAt(i - 1));
const currentIsDigit = isDigit2(identifier.charCodeAt(i));
const hasTransitionFromLowerToUpper = transitionFromLowerToUpper(identifier, word, i);
const hasTransitionFromUpperToLower = word && transitionFromUpperToLower(identifier, i, wordStart);
if (charIsPunctuation(identifier.charCodeAt(i - 1)) || charIsPunctuation(identifier.charCodeAt(i)) || lastIsDigit !== currentIsDigit || hasTransitionFromLowerToUpper || hasTransitionFromUpperToLower) {
if (!isAllPunctuation(identifier, wordStart, i)) {
result.push(createTextSpan(wordStart, i - wordStart));
}
wordStart = i;
}
}
if (!isAllPunctuation(identifier, wordStart, identifier.length)) {
result.push(createTextSpan(wordStart, identifier.length - wordStart));
}
return result;
}
function charIsPunctuation(ch) {
switch (ch) {
case 33 /* exclamation */:
case 34 /* doubleQuote */:
case 35 /* hash */:
case 37 /* percent */:
case 38 /* ampersand */:
case 39 /* singleQuote */:
case 40 /* openParen */:
case 41 /* closeParen */:
case 42 /* asterisk */:
case 44 /* comma */:
case 45 /* minus */:
case 46 /* dot */:
case 47 /* slash */:
case 58 /* colon */:
case 59 /* semicolon */:
case 63 /* question */:
case 64 /* at */:
case 91 /* openBracket */:
case 92 /* backslash */:
case 93 /* closeBracket */:
case 95 /* _ */:
case 123 /* openBrace */:
case 125 /* closeBrace */:
return true;
}
return false;
}
function isAllPunctuation(identifier, start2, end) {
return every2(identifier, (ch) => charIsPunctuation(ch) && ch !== 95 /* _ */, start2, end);
}
function transitionFromUpperToLower(identifier, index, wordStart) {
return index !== wordStart && index + 1 < identifier.length && isUpperCaseLetter(identifier.charCodeAt(index)) && isLowerCaseLetter(identifier.charCodeAt(index + 1)) && every2(identifier, isUpperCaseLetter, wordStart, index);
}
function transitionFromLowerToUpper(identifier, word, index) {
const lastIsUpper = isUpperCaseLetter(identifier.charCodeAt(index - 1));
const currentIsUpper = isUpperCaseLetter(identifier.charCodeAt(index));
return currentIsUpper && (!word || !lastIsUpper);
}
function everyInRange(start2, end, pred) {
for (let i = start2; i < end; i++) {
if (!pred(i)) {
return false;
}
}
return true;
}
function every2(s, pred, start2 = 0, end = s.length) {
return everyInRange(start2, end, (i) => pred(s.charCodeAt(i), i));
}
// src/services/preProcess.ts
function preProcessFile(sourceText, readImportFiles = true, detectJavaScriptImports = false) {
const pragmaContext = {
languageVersion: 1 /* ES5 */,
// controls whether the token scanner considers unicode identifiers or not - shouldn't matter, since we're only using it for trivia
pragmas: void 0,
checkJsDirective: void 0,
referencedFiles: [],
typeReferenceDirectives: [],
libReferenceDirectives: [],
amdDependencies: [],
hasNoDefaultLib: void 0,
moduleName: void 0
};
const importedFiles = [];
let ambientExternalModules;
let lastToken;
let currentToken;
let braceNesting = 0;
let externalModule = false;
function nextToken() {
lastToken = currentToken;
currentToken = scanner.scan();
if (currentToken === 19 /* OpenBraceToken */) {
braceNesting++;
} else if (currentToken === 20 /* CloseBraceToken */) {
braceNesting--;
}
return currentToken;
}
function getFileReference() {
const fileName = scanner.getTokenValue();
const pos = scanner.getTokenStart();
return { fileName, pos, end: pos + fileName.length };
}
function recordAmbientExternalModule() {
if (!ambientExternalModules) {
ambientExternalModules = [];
}
ambientExternalModules.push({ ref: getFileReference(), depth: braceNesting });
}
function recordModuleName() {
importedFiles.push(getFileReference());
markAsExternalModuleIfTopLevel();
}
function markAsExternalModuleIfTopLevel() {
if (braceNesting === 0) {
externalModule = true;
}
}
function tryConsumeDeclare() {
let token = scanner.getToken();
if (token === 138 /* DeclareKeyword */) {
token = nextToken();
if (token === 144 /* ModuleKeyword */) {
token = nextToken();
if (token === 11 /* StringLiteral */) {
recordAmbientExternalModule();
}
}
return true;
}
return false;
}
function tryConsumeImport() {
if (lastToken === 25 /* DotToken */) {
return false;
}
let token = scanner.getToken();
if (token === 102 /* ImportKeyword */) {
token = nextToken();
if (token === 21 /* OpenParenToken */) {
token = nextToken();
if (token === 11 /* StringLiteral */ || token === 15 /* NoSubstitutionTemplateLiteral */) {
recordModuleName();
return true;
}
} else if (token === 11 /* StringLiteral */) {
recordModuleName();
return true;
} else {
if (token === 156 /* TypeKeyword */) {
const skipTypeKeyword = scanner.lookAhead(() => {
const token2 = scanner.scan();
return token2 !== 160 /* FromKeyword */ && (token2 === 42 /* AsteriskToken */ || token2 === 19 /* OpenBraceToken */ || token2 === 80 /* Identifier */ || isKeyword(token2));
});
if (skipTypeKeyword) {
token = nextToken();
}
}
if (token === 80 /* Identifier */ || isKeyword(token)) {
token = nextToken();
if (token === 160 /* FromKeyword */) {
token = nextToken();
if (token === 11 /* StringLiteral */) {
recordModuleName();
return true;
}
} else if (token === 64 /* EqualsToken */) {
if (tryConsumeRequireCall(
/*skipCurrentToken*/
true
)) {
return true;
}
} else if (token === 28 /* CommaToken */) {
token = nextToken();
} else {
return true;
}
}
if (token === 19 /* OpenBraceToken */) {
token = nextToken();
while (token !== 20 /* CloseBraceToken */ && token !== 1 /* EndOfFileToken */) {
token = nextToken();
}
if (token === 20 /* CloseBraceToken */) {
token = nextToken();
if (token === 160 /* FromKeyword */) {
token = nextToken();
if (token === 11 /* StringLiteral */) {
recordModuleName();
}
}
}
} else if (token === 42 /* AsteriskToken */) {
token = nextToken();
if (token === 130 /* AsKeyword */) {
token = nextToken();
if (token === 80 /* Identifier */ || isKeyword(token)) {
token = nextToken();
if (token === 160 /* FromKeyword */) {
token = nextToken();
if (token === 11 /* StringLiteral */) {
recordModuleName();
}
}
}
}
}
}
return true;
}
return false;
}
function tryConsumeExport() {
let token = scanner.getToken();
if (token === 95 /* ExportKeyword */) {
markAsExternalModuleIfTopLevel();
token = nextToken();
if (token === 156 /* TypeKeyword */) {
const skipTypeKeyword = scanner.lookAhead(() => {
const token2 = scanner.scan();
return token2 === 42 /* AsteriskToken */ || token2 === 19 /* OpenBraceToken */;
});
if (skipTypeKeyword) {
token = nextToken();
}
}
if (token === 19 /* OpenBraceToken */) {
token = nextToken();
while (token !== 20 /* CloseBraceToken */ && token !== 1 /* EndOfFileToken */) {
token = nextToken();
}
if (token === 20 /* CloseBraceToken */) {
token = nextToken();
if (token === 160 /* FromKeyword */) {
token = nextToken();
if (token === 11 /* StringLiteral */) {
recordModuleName();
}
}
}
} else if (token === 42 /* AsteriskToken */) {
token = nextToken();
if (token === 160 /* FromKeyword */) {
token = nextToken();
if (token === 11 /* StringLiteral */) {
recordModuleName();
}
}
} else if (token === 102 /* ImportKeyword */) {
token = nextToken();
if (token === 156 /* TypeKeyword */) {
const skipTypeKeyword = scanner.lookAhead(() => {
const token2 = scanner.scan();
return token2 === 80 /* Identifier */ || isKeyword(token2);
});
if (skipTypeKeyword) {
token = nextToken();
}
}
if (token === 80 /* Identifier */ || isKeyword(token)) {
token = nextToken();
if (token === 64 /* EqualsToken */) {
if (tryConsumeRequireCall(
/*skipCurrentToken*/
true
)) {
return true;
}
}
}
}
return true;
}
return false;
}
function tryConsumeRequireCall(skipCurrentToken, allowTemplateLiterals = false) {
let token = skipCurrentToken ? nextToken() : scanner.getToken();
if (token === 149 /* RequireKeyword */) {
token = nextToken();
if (token === 21 /* OpenParenToken */) {
token = nextToken();
if (token === 11 /* StringLiteral */ || allowTemplateLiterals && token === 15 /* NoSubstitutionTemplateLiteral */) {
recordModuleName();
}
}
return true;
}
return false;
}
function tryConsumeDefine() {
let token = scanner.getToken();
if (token === 80 /* Identifier */ && scanner.getTokenValue() === "define") {
token = nextToken();
if (token !== 21 /* OpenParenToken */) {
return true;
}
token = nextToken();
if (token === 11 /* StringLiteral */ || token === 15 /* NoSubstitutionTemplateLiteral */) {
token = nextToken();
if (token === 28 /* CommaToken */) {
token = nextToken();
} else {
return true;
}
}
if (token !== 23 /* OpenBracketToken */) {
return true;
}
token = nextToken();
while (token !== 24 /* CloseBracketToken */ && token !== 1 /* EndOfFileToken */) {
if (token === 11 /* StringLiteral */ || token === 15 /* NoSubstitutionTemplateLiteral */) {
recordModuleName();
}
token = nextToken();
}
return true;
}
return false;
}
function processImports() {
scanner.setText(sourceText);
nextToken();
while (true) {
if (scanner.getToken() === 1 /* EndOfFileToken */) {
break;
}
if (scanner.getToken() === 16 /* TemplateHead */) {
const stack = [scanner.getToken()];
loop:
while (length(stack)) {
const token = scanner.scan();
switch (token) {
case 1 /* EndOfFileToken */:
break loop;
case 102 /* ImportKeyword */:
tryConsumeImport();
break;
case 16 /* TemplateHead */:
stack.push(token);
break;
case 19 /* OpenBraceToken */:
if (length(stack)) {
stack.push(token);
}
break;
case 20 /* CloseBraceToken */:
if (length(stack)) {
if (lastOrUndefined(stack) === 16 /* TemplateHead */) {
if (scanner.reScanTemplateToken(
/*isTaggedTemplate*/
false
) === 18 /* TemplateTail */) {
stack.pop();
}
} else {
stack.pop();
}
}
break;
}
}
nextToken();
}
if (tryConsumeDeclare() || tryConsumeImport() || tryConsumeExport() || detectJavaScriptImports && (tryConsumeRequireCall(
/*skipCurrentToken*/
false,
/*allowTemplateLiterals*/
true
) || tryConsumeDefine())) {
continue;
} else {
nextToken();
}
}
scanner.setText(void 0);
}
if (readImportFiles) {
processImports();
}
processCommentPragmas(pragmaContext, sourceText);
processPragmasIntoFields(pragmaContext, noop);
if (externalModule) {
if (ambientExternalModules) {
for (const decl of ambientExternalModules) {
importedFiles.push(decl.ref);
}
}
return { referencedFiles: pragmaContext.referencedFiles, typeReferenceDirectives: pragmaContext.typeReferenceDirectives, libReferenceDirectives: pragmaContext.libReferenceDirectives, importedFiles, isLibFile: !!pragmaContext.hasNoDefaultLib, ambientExternalModules: void 0 };
} else {
let ambientModuleNames;
if (ambientExternalModules) {
for (const decl of ambientExternalModules) {
if (decl.depth === 0) {
if (!ambientModuleNames) {
ambientModuleNames = [];
}
ambientModuleNames.push(decl.ref.fileName);
} else {
importedFiles.push(decl.ref);
}
}
}
return { referencedFiles: pragmaContext.referencedFiles, typeReferenceDirectives: pragmaContext.typeReferenceDirectives, libReferenceDirectives: pragmaContext.libReferenceDirectives, importedFiles, isLibFile: !!pragmaContext.hasNoDefaultLib, ambientExternalModules: ambientModuleNames };
}
}
// src/services/sourcemaps.ts
var base64UrlRegExp = /^data:(?:application\/json(?:;charset=[uU][tT][fF]-8);base64,([A-Za-z0-9+\/=]+)$)?/;
function getSourceMapper(host) {
const getCanonicalFileName = createGetCanonicalFileName(host.useCaseSensitiveFileNames());
const currentDirectory = host.getCurrentDirectory();
const sourceFileLike = /* @__PURE__ */ new Map();
const documentPositionMappers = /* @__PURE__ */ new Map();
return { tryGetSourcePosition, tryGetGeneratedPosition, toLineColumnOffset, clearCache };
function toPath3(fileName) {
return toPath(fileName, currentDirectory, getCanonicalFileName);
}
function getDocumentPositionMapper2(generatedFileName, sourceFileName) {
const path = toPath3(generatedFileName);
const value = documentPositionMappers.get(path);
if (value)
return value;
let mapper;
if (host.getDocumentPositionMapper) {
mapper = host.getDocumentPositionMapper(generatedFileName, sourceFileName);
} else if (host.readFile) {
const file = getSourceFileLike(generatedFileName);
mapper = file && getDocumentPositionMapper(
{ getSourceFileLike, getCanonicalFileName, log: (s) => host.log(s) },
generatedFileName,
getLineInfo(file.text, getLineStarts(file)),
(f) => !host.fileExists || host.fileExists(f) ? host.readFile(f) : void 0
);
}
documentPositionMappers.set(path, mapper || identitySourceMapConsumer);
return mapper || identitySourceMapConsumer;
}
function tryGetSourcePosition(info) {
if (!isDeclarationFileName(info.fileName))
return void 0;
const file = getSourceFile(info.fileName);
if (!file)
return void 0;
const newLoc = getDocumentPositionMapper2(info.fileName).getSourcePosition(info);
return !newLoc || newLoc === info ? void 0 : tryGetSourcePosition(newLoc) || newLoc;
}
function tryGetGeneratedPosition(info) {
if (isDeclarationFileName(info.fileName))
return void 0;
const sourceFile = getSourceFile(info.fileName);
if (!sourceFile)
return void 0;
const program = host.getProgram();
if (program.isSourceOfProjectReferenceRedirect(sourceFile.fileName)) {
return void 0;
}
const options = program.getCompilerOptions();
const outPath = outFile(options);
const declarationPath = outPath ? removeFileExtension(outPath) + ".d.ts" /* Dts */ : getDeclarationEmitOutputFilePathWorker(info.fileName, program.getCompilerOptions(), currentDirectory, program.getCommonSourceDirectory(), getCanonicalFileName);
if (declarationPath === void 0)
return void 0;
const newLoc = getDocumentPositionMapper2(declarationPath, info.fileName).getGeneratedPosition(info);
return newLoc === info ? void 0 : newLoc;
}
function getSourceFile(fileName) {
const program = host.getProgram();
if (!program)
return void 0;
const path = toPath3(fileName);
const file = program.getSourceFileByPath(path);
return file && file.resolvedPath === path ? file : void 0;
}
function getOrCreateSourceFileLike(fileName) {
const path = toPath3(fileName);
const fileFromCache = sourceFileLike.get(path);
if (fileFromCache !== void 0)
return fileFromCache ? fileFromCache : void 0;
if (!host.readFile || host.fileExists && !host.fileExists(path)) {
sourceFileLike.set(path, false);
return void 0;
}
const text = host.readFile(path);
const file = text ? createSourceFileLike(text) : false;
sourceFileLike.set(path, file);
return file ? file : void 0;
}
function getSourceFileLike(fileName) {
return !host.getSourceFileLike ? getSourceFile(fileName) || getOrCreateSourceFileLike(fileName) : host.getSourceFileLike(fileName);
}
function toLineColumnOffset(fileName, position) {
const file = getSourceFileLike(fileName);
return file.getLineAndCharacterOfPosition(position);
}
function clearCache() {
sourceFileLike.clear();
documentPositionMappers.clear();
}
}
function getDocumentPositionMapper(host, generatedFileName, generatedFileLineInfo, readMapFile) {
let mapFileName = tryGetSourceMappingURL(generatedFileLineInfo);
if (mapFileName) {
const match = base64UrlRegExp.exec(mapFileName);
if (match) {
if (match[1]) {
const base64Object = match[1];
return convertDocumentToSourceMapper(host, base64decode(sys, base64Object), generatedFileName);
}
mapFileName = void 0;
}
}
const possibleMapLocations = [];
if (mapFileName) {
possibleMapLocations.push(mapFileName);
}
possibleMapLocations.push(generatedFileName + ".map");
const originalMapFileName = mapFileName && getNormalizedAbsolutePath(mapFileName, getDirectoryPath(generatedFileName));
for (const location of possibleMapLocations) {
const mapFileName2 = getNormalizedAbsolutePath(location, getDirectoryPath(generatedFileName));
const mapFileContents = readMapFile(mapFileName2, originalMapFileName);
if (isString(mapFileContents)) {
return convertDocumentToSourceMapper(host, mapFileContents, mapFileName2);
}
if (mapFileContents !== void 0) {
return mapFileContents || void 0;
}
}
return void 0;
}
function convertDocumentToSourceMapper(host, contents, mapFileName) {
const map2 = tryParseRawSourceMap(contents);
if (!map2 || !map2.sources || !map2.file || !map2.mappings) {
return void 0;
}
if (map2.sourcesContent && map2.sourcesContent.some(isString))
return void 0;
return createDocumentPositionMapper(host, map2, mapFileName);
}
function createSourceFileLike(text, lineMap) {
return {
text,
lineMap,
getLineAndCharacterOfPosition(pos) {
return computeLineAndCharacterOfPosition(getLineStarts(this), pos);
}
};
}
// src/services/suggestionDiagnostics.ts
var visitedNestedConvertibleFunctions = /* @__PURE__ */ new Map();
function computeSuggestionDiagnostics(sourceFile, program, cancellationToken) {
program.getSemanticDiagnostics(sourceFile, cancellationToken);
const diags = [];
const checker = program.getTypeChecker();
const isCommonJSFile = sourceFile.impliedNodeFormat === 1 /* CommonJS */ || fileExtensionIsOneOf(sourceFile.fileName, [".cts" /* Cts */, ".cjs" /* Cjs */]);
if (!isCommonJSFile && sourceFile.commonJsModuleIndicator && (programContainsEsModules(program) || compilerOptionsIndicateEsModules(program.getCompilerOptions())) && containsTopLevelCommonjs(sourceFile)) {
diags.push(createDiagnosticForNode(getErrorNodeFromCommonJsIndicator(sourceFile.commonJsModuleIndicator), Diagnostics.File_is_a_CommonJS_module_it_may_be_converted_to_an_ES_module));
}
const isJsFile = isSourceFileJS(sourceFile);
visitedNestedConvertibleFunctions.clear();
check(sourceFile);
if (getAllowSyntheticDefaultImports(program.getCompilerOptions())) {
for (const moduleSpecifier of sourceFile.imports) {
const importNode = importFromModuleSpecifier(moduleSpecifier);
const name = importNameForConvertToDefaultImport(importNode);
if (!name)
continue;
const module2 = getResolvedModule(sourceFile, moduleSpecifier.text, getModeForUsageLocation(sourceFile, moduleSpecifier));
const resolvedFile = module2 && program.getSourceFile(module2.resolvedFileName);
if (resolvedFile && resolvedFile.externalModuleIndicator && resolvedFile.externalModuleIndicator !== true && isExportAssignment(resolvedFile.externalModuleIndicator) && resolvedFile.externalModuleIndicator.isExportEquals) {
diags.push(createDiagnosticForNode(name, Diagnostics.Import_may_be_converted_to_a_default_import));
}
}
}
addRange(diags, sourceFile.bindSuggestionDiagnostics);
addRange(diags, program.getSuggestionDiagnostics(sourceFile, cancellationToken));
return diags.sort((d1, d2) => d1.start - d2.start);
function check(node) {
if (isJsFile) {
if (canBeConvertedToClass(node, checker)) {
diags.push(createDiagnosticForNode(isVariableDeclaration(node.parent) ? node.parent.name : node, Diagnostics.This_constructor_function_may_be_converted_to_a_class_declaration));
}
} else {
if (isVariableStatement(node) && node.parent === sourceFile && node.declarationList.flags & 2 /* Const */ && node.declarationList.declarations.length === 1) {
const init = node.declarationList.declarations[0].initializer;
if (init && isRequireCall(
init,
/*requireStringLiteralLikeArgument*/
true
)) {
diags.push(createDiagnosticForNode(init, Diagnostics.require_call_may_be_converted_to_an_import));
}
}
const jsdocTypedefNode = ts_codefix_exports.getJSDocTypedefNode(node);
if (jsdocTypedefNode) {
diags.push(createDiagnosticForNode(jsdocTypedefNode, Diagnostics.JSDoc_typedef_may_be_converted_to_TypeScript_type));
}
if (ts_codefix_exports.parameterShouldGetTypeFromJSDoc(node)) {
diags.push(createDiagnosticForNode(node.name || node, Diagnostics.JSDoc_types_may_be_moved_to_TypeScript_types));
}
}
if (canBeConvertedToAsync(node)) {
addConvertToAsyncFunctionDiagnostics(node, checker, diags);
}
node.forEachChild(check);
}
}
function containsTopLevelCommonjs(sourceFile) {
return sourceFile.statements.some((statement) => {
switch (statement.kind) {
case 242 /* VariableStatement */:
return statement.declarationList.declarations.some((decl) => !!decl.initializer && isRequireCall(
propertyAccessLeftHandSide(decl.initializer),
/*requireStringLiteralLikeArgument*/
true
));
case 243 /* ExpressionStatement */: {
const { expression } = statement;
if (!isBinaryExpression(expression))
return isRequireCall(
expression,
/*requireStringLiteralLikeArgument*/
true
);
const kind = getAssignmentDeclarationKind(expression);
return kind === 1 /* ExportsProperty */ || kind === 2 /* ModuleExports */;
}
default:
return false;
}
});
}
function propertyAccessLeftHandSide(node) {
return isPropertyAccessExpression(node) ? propertyAccessLeftHandSide(node.expression) : node;
}
function importNameForConvertToDefaultImport(node) {
switch (node.kind) {
case 271 /* ImportDeclaration */:
const { importClause, moduleSpecifier } = node;
return importClause && !importClause.name && importClause.namedBindings && importClause.namedBindings.kind === 273 /* NamespaceImport */ && isStringLiteral(moduleSpecifier) ? importClause.namedBindings.name : void 0;
case 270 /* ImportEqualsDeclaration */:
return node.name;
default:
return void 0;
}
}
function addConvertToAsyncFunctionDiagnostics(node, checker, diags) {
if (isConvertibleFunction(node, checker) && !visitedNestedConvertibleFunctions.has(getKeyFromNode(node))) {
diags.push(createDiagnosticForNode(
!node.name && isVariableDeclaration(node.parent) && isIdentifier(node.parent.name) ? node.parent.name : node,
Diagnostics.This_may_be_converted_to_an_async_function
));
}
}
function isConvertibleFunction(node, checker) {
return !isAsyncFunction(node) && node.body && isBlock(node.body) && hasReturnStatementWithPromiseHandler(node.body, checker) && returnsPromise(node, checker);
}
function returnsPromise(node, checker) {
const signature = checker.getSignatureFromDeclaration(node);
const returnType = signature ? checker.getReturnTypeOfSignature(signature) : void 0;
return !!returnType && !!checker.getPromisedTypeOfPromise(returnType);
}
function getErrorNodeFromCommonJsIndicator(commonJsModuleIndicator) {
return isBinaryExpression(commonJsModuleIndicator) ? commonJsModuleIndicator.left : commonJsModuleIndicator;
}
function hasReturnStatementWithPromiseHandler(body, checker) {
return !!forEachReturnStatement(body, (statement) => isReturnStatementWithFixablePromiseHandler(statement, checker));
}
function isReturnStatementWithFixablePromiseHandler(node, checker) {
return isReturnStatement(node) && !!node.expression && isFixablePromiseHandler(node.expression, checker);
}
function isFixablePromiseHandler(node, checker) {
if (!isPromiseHandler(node) || !hasSupportedNumberOfArguments(node) || !node.arguments.every((arg) => isFixablePromiseArgument(arg, checker))) {
return false;
}
let currentNode = node.expression.expression;
while (isPromiseHandler(currentNode) || isPropertyAccessExpression(currentNode)) {
if (isCallExpression(currentNode)) {
if (!hasSupportedNumberOfArguments(currentNode) || !currentNode.arguments.every((arg) => isFixablePromiseArgument(arg, checker))) {
return false;
}
currentNode = currentNode.expression.expression;
} else {
currentNode = currentNode.expression;
}
}
return true;
}
function isPromiseHandler(node) {
return isCallExpression(node) && (hasPropertyAccessExpressionWithName(node, "then") || hasPropertyAccessExpressionWithName(node, "catch") || hasPropertyAccessExpressionWithName(node, "finally"));
}
function hasSupportedNumberOfArguments(node) {
const name = node.expression.name.text;
const maxArguments = name === "then" ? 2 : name === "catch" ? 1 : name === "finally" ? 1 : 0;
if (node.arguments.length > maxArguments)
return false;
if (node.arguments.length < maxArguments)
return true;
return maxArguments === 1 || some(node.arguments, (arg) => {
return arg.kind === 106 /* NullKeyword */ || isIdentifier(arg) && arg.text === "undefined";
});
}
function isFixablePromiseArgument(arg, checker) {
switch (arg.kind) {
case 261 /* FunctionDeclaration */:
case 217 /* FunctionExpression */:
const functionFlags = getFunctionFlags(arg);
if (functionFlags & 1 /* Generator */) {
return false;
}
case 218 /* ArrowFunction */:
visitedNestedConvertibleFunctions.set(getKeyFromNode(arg), true);
case 106 /* NullKeyword */:
return true;
case 80 /* Identifier */:
case 210 /* PropertyAccessExpression */: {
const symbol = checker.getSymbolAtLocation(arg);
if (!symbol) {
return false;
}
return checker.isUndefinedSymbol(symbol) || some(skipAlias(symbol, checker).declarations, (d) => isFunctionLike(d) || hasInitializer(d) && !!d.initializer && isFunctionLike(d.initializer));
}
default:
return false;
}
}
function getKeyFromNode(exp) {
return `${exp.pos.toString()}:${exp.end.toString()}`;
}
function canBeConvertedToClass(node, checker) {
var _a, _b, _c, _d;
if (isFunctionExpression(node)) {
if (isVariableDeclaration(node.parent) && ((_a = node.symbol.members) == null ? void 0 : _a.size)) {
return true;
}
const symbol = checker.getSymbolOfExpando(
node,
/*allowDeclaration*/
false
);
return !!(symbol && (((_b = symbol.exports) == null ? void 0 : _b.size) || ((_c = symbol.members) == null ? void 0 : _c.size)));
}
if (isFunctionDeclaration(node)) {
return !!((_d = node.symbol.members) == null ? void 0 : _d.size);
}
return false;
}
function canBeConvertedToAsync(node) {
switch (node.kind) {
case 261 /* FunctionDeclaration */:
case 173 /* MethodDeclaration */:
case 217 /* FunctionExpression */:
case 218 /* ArrowFunction */:
return true;
default:
return false;
}
}
// src/services/transpile.ts
var optionsRedundantWithVerbatimModuleSyntax = /* @__PURE__ */ new Set([
"isolatedModules",
"preserveValueImports",
"importsNotUsedAsValues"
]);
function transpileModule(input, transpileOptions) {
const diagnostics = [];
const options = transpileOptions.compilerOptions ? fixupCompilerOptions(transpileOptions.compilerOptions, diagnostics) : {};
const defaultOptions = getDefaultCompilerOptions2();
for (const key in defaultOptions) {
if (hasProperty(defaultOptions, key) && options[key] === void 0) {
options[key] = defaultOptions[key];
}
}
for (const option of transpileOptionValueCompilerOptions) {
if (options.verbatimModuleSyntax && optionsRedundantWithVerbatimModuleSyntax.has(option.name)) {
continue;
}
options[option.name] = option.transpileOptionValue;
}
options.suppressOutputPathCheck = true;
options.allowNonTsExtensions = true;
const newLine = getNewLineCharacter(options);
const compilerHost = {
getSourceFile: (fileName) => fileName === normalizePath(inputFileName) ? sourceFile : void 0,
writeFile: (name, text) => {
if (fileExtensionIs(name, ".map")) {
Debug.assertEqual(sourceMapText, void 0, "Unexpected multiple source map outputs, file:", name);
sourceMapText = text;
} else {
Debug.assertEqual(outputText, void 0, "Unexpected multiple outputs, file:", name);
outputText = text;
}
},
getDefaultLibFileName: () => "lib.d.ts",
useCaseSensitiveFileNames: () => false,
getCanonicalFileName: (fileName) => fileName,
getCurrentDirectory: () => "",
getNewLine: () => newLine,
fileExists: (fileName) => fileName === inputFileName,
readFile: () => "",
directoryExists: () => true,
getDirectories: () => []
};
const inputFileName = transpileOptions.fileName || (transpileOptions.compilerOptions && transpileOptions.compilerOptions.jsx ? "module.tsx" : "module.ts");
const sourceFile = createSourceFile(
inputFileName,
input,
{
languageVersion: getEmitScriptTarget(options),
impliedNodeFormat: getImpliedNodeFormatForFile(
toPath(inputFileName, "", compilerHost.getCanonicalFileName),
/*packageJsonInfoCache*/
void 0,
compilerHost,
options
),
setExternalModuleIndicator: getSetExternalModuleIndicator(options)
}
);
if (transpileOptions.moduleName) {
sourceFile.moduleName = transpileOptions.moduleName;
}
if (transpileOptions.renamedDependencies) {
sourceFile.renamedDependencies = new Map(Object.entries(transpileOptions.renamedDependencies));
}
let outputText;
let sourceMapText;
const program = createProgram([inputFileName], options, compilerHost);
if (transpileOptions.reportDiagnostics) {
addRange(
/*to*/
diagnostics,
/*from*/
program.getSyntacticDiagnostics(sourceFile)
);
addRange(
/*to*/
diagnostics,
/*from*/
program.getOptionsDiagnostics()
);
}
program.emit(
/*targetSourceFile*/
void 0,
/*writeFile*/
void 0,
/*cancellationToken*/
void 0,
/*emitOnlyDtsFiles*/
void 0,
transpileOptions.transformers
);
if (outputText === void 0)
return Debug.fail("Output generation failed");
return { outputText, diagnostics, sourceMapText };
}
function transpile(input, compilerOptions, fileName, diagnostics, moduleName) {
const output = transpileModule(input, { compilerOptions, fileName, reportDiagnostics: !!diagnostics, moduleName });
addRange(diagnostics, output.diagnostics);
return output.outputText;
}
var commandLineOptionsStringToEnum;
function fixupCompilerOptions(options, diagnostics) {
commandLineOptionsStringToEnum = commandLineOptionsStringToEnum || filter(optionDeclarations, (o) => typeof o.type === "object" && !forEachEntry(o.type, (v) => typeof v !== "number"));
options = cloneCompilerOptions(options);
for (const opt of commandLineOptionsStringToEnum) {
if (!hasProperty(options, opt.name)) {
continue;
}
const value = options[opt.name];
if (isString(value)) {
options[opt.name] = parseCustomTypeOption(opt, value, diagnostics);
} else {
if (!forEachEntry(opt.type, (v) => v === value)) {
diagnostics.push(createCompilerDiagnosticForInvalidCustomType(opt));
}
}
}
return options;
}
// src/services/_namespaces/ts.NavigateTo.ts
var ts_NavigateTo_exports = {};
__export(ts_NavigateTo_exports, {
getNavigateToItems: () => getNavigateToItems
});
// src/services/navigateTo.ts
function getNavigateToItems(sourceFiles, checker, cancellationToken, searchValue, maxResultCount, excludeDtsFiles) {
const patternMatcher = createPatternMatcher(searchValue);
if (!patternMatcher)
return emptyArray;
const rawItems = [];
for (const sourceFile of sourceFiles) {
cancellationToken.throwIfCancellationRequested();
if (excludeDtsFiles && sourceFile.isDeclarationFile) {
continue;
}
sourceFile.getNamedDeclarations().forEach((declarations, name) => {
getItemsFromNamedDeclaration(patternMatcher, name, declarations, checker, sourceFile.fileName, rawItems);
});
}
rawItems.sort(compareNavigateToItems);
return (maxResultCount === void 0 ? rawItems : rawItems.slice(0, maxResultCount)).map(createNavigateToItem);
}
function getItemsFromNamedDeclaration(patternMatcher, name, declarations, checker, fileName, rawItems) {
const match = patternMatcher.getMatchForLastSegmentOfPattern(name);
if (!match) {
return;
}
for (const declaration of declarations) {
if (!shouldKeepItem(declaration, checker))
continue;
if (patternMatcher.patternContainsDots) {
const fullMatch = patternMatcher.getFullMatch(getContainers(declaration), name);
if (fullMatch) {
rawItems.push({ name, fileName, matchKind: fullMatch.kind, isCaseSensitive: fullMatch.isCaseSensitive, declaration });
}
} else {
rawItems.push({ name, fileName, matchKind: match.kind, isCaseSensitive: match.isCaseSensitive, declaration });
}
}
}
function shouldKeepItem(declaration, checker) {
switch (declaration.kind) {
case 272 /* ImportClause */:
case 275 /* ImportSpecifier */:
case 270 /* ImportEqualsDeclaration */:
const importer = checker.getSymbolAtLocation(declaration.name);
const imported = checker.getAliasedSymbol(importer);
return importer.escapedName !== imported.escapedName;
default:
return true;
}
}
function tryAddSingleDeclarationName(declaration, containers) {
const name = getNameOfDeclaration(declaration);
return !!name && (pushLiteral(name, containers) || name.kind === 166 /* ComputedPropertyName */ && tryAddComputedPropertyName(name.expression, containers));
}
function tryAddComputedPropertyName(expression, containers) {
return pushLiteral(expression, containers) || isPropertyAccessExpression(expression) && (containers.push(expression.name.text), true) && tryAddComputedPropertyName(expression.expression, containers);
}
function pushLiteral(node, containers) {
return isPropertyNameLiteral(node) && (containers.push(getTextOfIdentifierOrLiteral(node)), true);
}
function getContainers(declaration) {
const containers = [];
const name = getNameOfDeclaration(declaration);
if (name && name.kind === 166 /* ComputedPropertyName */ && !tryAddComputedPropertyName(name.expression, containers)) {
return emptyArray;
}
containers.shift();
let container = getContainerNode(declaration);
while (container) {
if (!tryAddSingleDeclarationName(container, containers)) {
return emptyArray;
}
container = getContainerNode(container);
}
return containers.reverse();
}
function compareNavigateToItems(i1, i2) {
return compareValues(i1.matchKind, i2.matchKind) || compareStringsCaseSensitiveUI(i1.name, i2.name);
}
function createNavigateToItem(rawItem) {
const declaration = rawItem.declaration;
const container = getContainerNode(declaration);
const containerName = container && getNameOfDeclaration(container);
return {
name: rawItem.name,
kind: getNodeKind(declaration),
kindModifiers: getNodeModifiers(declaration),
matchKind: PatternMatchKind[rawItem.matchKind],
isCaseSensitive: rawItem.isCaseSensitive,
fileName: rawItem.fileName,
textSpan: createTextSpanFromNode(declaration),
// TODO(jfreeman): What should be the containerName when the container has a computed name?
containerName: containerName ? containerName.text : "",
containerKind: containerName ? getNodeKind(container) : "" /* unknown */
};
}
// src/services/_namespaces/ts.NavigationBar.ts
var ts_NavigationBar_exports = {};
__export(ts_NavigationBar_exports, {
getNavigationBarItems: () => getNavigationBarItems,
getNavigationTree: () => getNavigationTree
});
// src/services/navigationBar.ts
var whiteSpaceRegex = /\s+/g;
var maxLength = 150;
var curCancellationToken;
var curSourceFile;
var parentsStack = [];
var parent;
var trackedEs5ClassesStack = [];
var trackedEs5Classes;
var emptyChildItemArray = [];
function getNavigationBarItems(sourceFile, cancellationToken) {
curCancellationToken = cancellationToken;
curSourceFile = sourceFile;
try {
return map(primaryNavBarMenuItems(rootNavigationBarNode(sourceFile)), convertToPrimaryNavBarMenuItem);
} finally {
reset();
}
}
function getNavigationTree(sourceFile, cancellationToken) {
curCancellationToken = cancellationToken;
curSourceFile = sourceFile;
try {
return convertToTree(rootNavigationBarNode(sourceFile));
} finally {
reset();
}
}
function reset() {
curSourceFile = void 0;
curCancellationToken = void 0;
parentsStack = [];
parent = void 0;
emptyChildItemArray = [];
}
function nodeText(node) {
return cleanText(node.getText(curSourceFile));
}
function navigationBarNodeKind(n) {
return n.node.kind;
}
function pushChild(parent2, child) {
if (parent2.children) {
parent2.children.push(child);
} else {
parent2.children = [child];
}
}
function rootNavigationBarNode(sourceFile) {
Debug.assert(!parentsStack.length);
const root = { node: sourceFile, name: void 0, additionalNodes: void 0, parent: void 0, children: void 0, indent: 0 };
parent = root;
for (const statement of sourceFile.statements) {
addChildrenRecursively(statement);
}
endNode();
Debug.assert(!parent && !parentsStack.length);
return root;
}
function addLeafNode(node, name) {
pushChild(parent, emptyNavigationBarNode(node, name));
}
function emptyNavigationBarNode(node, name) {
return {
node,
name: name || (isDeclaration(node) || isExpression(node) ? getNameOfDeclaration(node) : void 0),
additionalNodes: void 0,
parent,
children: void 0,
indent: parent.indent + 1
};
}
function addTrackedEs5Class(name) {
if (!trackedEs5Classes) {
trackedEs5Classes = /* @__PURE__ */ new Map();
}
trackedEs5Classes.set(name, true);
}
function endNestedNodes(depth) {
for (let i = 0; i < depth; i++)
endNode();
}
function startNestedNodes(targetNode, entityName) {
const names = [];
while (!isPropertyNameLiteral(entityName)) {
const name = getNameOrArgument(entityName);
const nameText = getElementOrPropertyAccessName(entityName);
entityName = entityName.expression;
if (nameText === "prototype" || isPrivateIdentifier(name))
continue;
names.push(name);
}
names.push(entityName);
for (let i = names.length - 1; i > 0; i--) {
const name = names[i];
startNode(targetNode, name);
}
return [names.length - 1, names[0]];
}
function startNode(node, name) {
const navNode = emptyNavigationBarNode(node, name);
pushChild(parent, navNode);
parentsStack.push(parent);
trackedEs5ClassesStack.push(trackedEs5Classes);
trackedEs5Classes = void 0;
parent = navNode;
}
function endNode() {
if (parent.children) {
mergeChildren(parent.children, parent);
sortChildren(parent.children);
}
parent = parentsStack.pop();
trackedEs5Classes = trackedEs5ClassesStack.pop();
}
function addNodeWithRecursiveChild(node, child, name) {
startNode(node, name);
addChildrenRecursively(child);
endNode();
}
function addNodeWithRecursiveInitializer(node) {
if (node.initializer && isFunctionOrClassExpression(node.initializer)) {
startNode(node);
forEachChild(node.initializer, addChildrenRecursively);
endNode();
} else {
addNodeWithRecursiveChild(node, node.initializer);
}
}
function hasNavigationBarName(node) {
return !hasDynamicName(node) || node.kind !== 225 /* BinaryExpression */ && isPropertyAccessExpression(node.name.expression) && isIdentifier(node.name.expression.expression) && idText(node.name.expression.expression) === "Symbol";
}
function addChildrenRecursively(node) {
curCancellationToken.throwIfCancellationRequested();
if (!node || isToken(node)) {
return;
}
switch (node.kind) {
case 175 /* Constructor */:
const ctr = node;
addNodeWithRecursiveChild(ctr, ctr.body);
for (const param of ctr.parameters) {
if (isParameterPropertyDeclaration(param, ctr)) {
addLeafNode(param);
}
}
break;
case 173 /* MethodDeclaration */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
case 172 /* MethodSignature */:
if (hasNavigationBarName(node)) {
addNodeWithRecursiveChild(node, node.body);
}
break;
case 171 /* PropertyDeclaration */:
if (hasNavigationBarName(node)) {
addNodeWithRecursiveInitializer(node);
}
break;
case 170 /* PropertySignature */:
if (hasNavigationBarName(node)) {
addLeafNode(node);
}
break;
case 272 /* ImportClause */:
const importClause = node;
if (importClause.name) {
addLeafNode(importClause.name);
}
const { namedBindings } = importClause;
if (namedBindings) {
if (namedBindings.kind === 273 /* NamespaceImport */) {
addLeafNode(namedBindings);
} else {
for (const element of namedBindings.elements) {
addLeafNode(element);
}
}
}
break;
case 303 /* ShorthandPropertyAssignment */:
addNodeWithRecursiveChild(node, node.name);
break;
case 304 /* SpreadAssignment */:
const { expression } = node;
isIdentifier(expression) ? addLeafNode(node, expression) : addLeafNode(node);
break;
case 207 /* BindingElement */:
case 302 /* PropertyAssignment */:
case 259 /* VariableDeclaration */: {
const child = node;
if (isBindingPattern(child.name)) {
addChildrenRecursively(child.name);
} else {
addNodeWithRecursiveInitializer(child);
}
break;
}
case 261 /* FunctionDeclaration */:
const nameNode = node.name;
if (nameNode && isIdentifier(nameNode)) {
addTrackedEs5Class(nameNode.text);
}
addNodeWithRecursiveChild(node, node.body);
break;
case 218 /* ArrowFunction */:
case 217 /* FunctionExpression */:
addNodeWithRecursiveChild(node, node.body);
break;
case 265 /* EnumDeclaration */:
startNode(node);
for (const member of node.members) {
if (!isComputedProperty(member)) {
addLeafNode(member);
}
}
endNode();
break;
case 262 /* ClassDeclaration */:
case 230 /* ClassExpression */:
case 263 /* InterfaceDeclaration */:
startNode(node);
for (const member of node.members) {
addChildrenRecursively(member);
}
endNode();
break;
case 266 /* ModuleDeclaration */:
addNodeWithRecursiveChild(node, getInteriorModule(node).body);
break;
case 276 /* ExportAssignment */: {
const expression2 = node.expression;
const child = isObjectLiteralExpression(expression2) || isCallExpression(expression2) ? expression2 : isArrowFunction(expression2) || isFunctionExpression(expression2) ? expression2.body : void 0;
if (child) {
startNode(node);
addChildrenRecursively(child);
endNode();
} else {
addLeafNode(node);
}
break;
}
case 280 /* ExportSpecifier */:
case 270 /* ImportEqualsDeclaration */:
case 180 /* IndexSignature */:
case 178 /* CallSignature */:
case 179 /* ConstructSignature */:
case 264 /* TypeAliasDeclaration */:
addLeafNode(node);
break;
case 212 /* CallExpression */:
case 225 /* BinaryExpression */: {
const special = getAssignmentDeclarationKind(node);
switch (special) {
case 1 /* ExportsProperty */:
case 2 /* ModuleExports */:
addNodeWithRecursiveChild(node, node.right);
return;
case 6 /* Prototype */:
case 3 /* PrototypeProperty */: {
const binaryExpression = node;
const assignmentTarget = binaryExpression.left;
const prototypeAccess = special === 3 /* PrototypeProperty */ ? assignmentTarget.expression : assignmentTarget;
let depth = 0;
let className;
if (isIdentifier(prototypeAccess.expression)) {
addTrackedEs5Class(prototypeAccess.expression.text);
className = prototypeAccess.expression;
} else {
[depth, className] = startNestedNodes(binaryExpression, prototypeAccess.expression);
}
if (special === 6 /* Prototype */) {
if (isObjectLiteralExpression(binaryExpression.right)) {
if (binaryExpression.right.properties.length > 0) {
startNode(binaryExpression, className);
forEachChild(binaryExpression.right, addChildrenRecursively);
endNode();
}
}
} else if (isFunctionExpression(binaryExpression.right) || isArrowFunction(binaryExpression.right)) {
addNodeWithRecursiveChild(
node,
binaryExpression.right,
className
);
} else {
startNode(binaryExpression, className);
addNodeWithRecursiveChild(node, binaryExpression.right, assignmentTarget.name);
endNode();
}
endNestedNodes(depth);
return;
}
case 7 /* ObjectDefinePropertyValue */:
case 9 /* ObjectDefinePrototypeProperty */: {
const defineCall = node;
const className = special === 7 /* ObjectDefinePropertyValue */ ? defineCall.arguments[0] : defineCall.arguments[0].expression;
const memberName = defineCall.arguments[1];
const [depth, classNameIdentifier] = startNestedNodes(node, className);
startNode(node, classNameIdentifier);
startNode(node, setTextRange(factory.createIdentifier(memberName.text), memberName));
addChildrenRecursively(node.arguments[2]);
endNode();
endNode();
endNestedNodes(depth);
return;
}
case 5 /* Property */: {
const binaryExpression = node;
const assignmentTarget = binaryExpression.left;
const targetFunction = assignmentTarget.expression;
if (isIdentifier(targetFunction) && getElementOrPropertyAccessName(assignmentTarget) !== "prototype" && trackedEs5Classes && trackedEs5Classes.has(targetFunction.text)) {
if (isFunctionExpression(binaryExpression.right) || isArrowFunction(binaryExpression.right)) {
addNodeWithRecursiveChild(node, binaryExpression.right, targetFunction);
} else if (isBindableStaticAccessExpression(assignmentTarget)) {
startNode(binaryExpression, targetFunction);
addNodeWithRecursiveChild(binaryExpression.left, binaryExpression.right, getNameOrArgument(assignmentTarget));
endNode();
}
return;
}
break;
}
case 4 /* ThisProperty */:
case 0 /* None */:
case 8 /* ObjectDefinePropertyExports */:
break;
default:
Debug.assertNever(special);
}
}
default:
if (hasJSDocNodes(node)) {
forEach(node.jsDoc, (jsDoc) => {
forEach(jsDoc.tags, (tag) => {
if (isJSDocTypeAlias(tag)) {
addLeafNode(tag);
}
});
});
}
forEachChild(node, addChildrenRecursively);
}
}
function mergeChildren(children, node) {
const nameToItems = /* @__PURE__ */ new Map();
filterMutate(children, (child, index) => {
const declName = child.name || getNameOfDeclaration(child.node);
const name = declName && nodeText(declName);
if (!name) {
return true;
}
const itemsWithSameName = nameToItems.get(name);
if (!itemsWithSameName) {
nameToItems.set(name, child);
return true;
}
if (itemsWithSameName instanceof Array) {
for (const itemWithSameName of itemsWithSameName) {
if (tryMerge(itemWithSameName, child, index, node)) {
return false;
}
}
itemsWithSameName.push(child);
return true;
} else {
const itemWithSameName = itemsWithSameName;
if (tryMerge(itemWithSameName, child, index, node)) {
return false;
}
nameToItems.set(name, [itemWithSameName, child]);
return true;
}
});
}
var isEs5ClassMember = {
[5 /* Property */]: true,
[3 /* PrototypeProperty */]: true,
[7 /* ObjectDefinePropertyValue */]: true,
[9 /* ObjectDefinePrototypeProperty */]: true,
[0 /* None */]: false,
[1 /* ExportsProperty */]: false,
[2 /* ModuleExports */]: false,
[8 /* ObjectDefinePropertyExports */]: false,
[6 /* Prototype */]: true,
[4 /* ThisProperty */]: false
};
function tryMergeEs5Class(a, b, bIndex, parent2) {
function isPossibleConstructor(node) {
return isFunctionExpression(node) || isFunctionDeclaration(node) || isVariableDeclaration(node);
}
const bAssignmentDeclarationKind = isBinaryExpression(b.node) || isCallExpression(b.node) ? getAssignmentDeclarationKind(b.node) : 0 /* None */;
const aAssignmentDeclarationKind = isBinaryExpression(a.node) || isCallExpression(a.node) ? getAssignmentDeclarationKind(a.node) : 0 /* None */;
if (isEs5ClassMember[bAssignmentDeclarationKind] && isEs5ClassMember[aAssignmentDeclarationKind] || isPossibleConstructor(a.node) && isEs5ClassMember[bAssignmentDeclarationKind] || isPossibleConstructor(b.node) && isEs5ClassMember[aAssignmentDeclarationKind] || isClassDeclaration(a.node) && isSynthesized(a.node) && isEs5ClassMember[bAssignmentDeclarationKind] || isClassDeclaration(b.node) && isEs5ClassMember[aAssignmentDeclarationKind] || isClassDeclaration(a.node) && isSynthesized(a.node) && isPossibleConstructor(b.node) || isClassDeclaration(b.node) && isPossibleConstructor(a.node) && isSynthesized(a.node)) {
let lastANode = a.additionalNodes && lastOrUndefined(a.additionalNodes) || a.node;
if (!isClassDeclaration(a.node) && !isClassDeclaration(b.node) || isPossibleConstructor(a.node) || isPossibleConstructor(b.node)) {
const ctorFunction = isPossibleConstructor(a.node) ? a.node : isPossibleConstructor(b.node) ? b.node : void 0;
if (ctorFunction !== void 0) {
const ctorNode = setTextRange(
factory.createConstructorDeclaration(
/*modifiers*/
void 0,
[],
/*body*/
void 0
),
ctorFunction
);
const ctor = emptyNavigationBarNode(ctorNode);
ctor.indent = a.indent + 1;
ctor.children = a.node === ctorFunction ? a.children : b.children;
a.children = a.node === ctorFunction ? concatenate([ctor], b.children || [b]) : concatenate(a.children || [{ ...a }], [ctor]);
} else {
if (a.children || b.children) {
a.children = concatenate(a.children || [{ ...a }], b.children || [b]);
if (a.children) {
mergeChildren(a.children, a);
sortChildren(a.children);
}
}
}
lastANode = a.node = setTextRange(factory.createClassDeclaration(
/*modifiers*/
void 0,
a.name || factory.createIdentifier("__class__"),
/*typeParameters*/
void 0,
/*heritageClauses*/
void 0,
[]
), a.node);
} else {
a.children = concatenate(a.children, b.children);
if (a.children) {
mergeChildren(a.children, a);
}
}
const bNode = b.node;
if (parent2.children[bIndex - 1].node.end === lastANode.end) {
setTextRange(lastANode, { pos: lastANode.pos, end: bNode.end });
} else {
if (!a.additionalNodes)
a.additionalNodes = [];
a.additionalNodes.push(setTextRange(factory.createClassDeclaration(
/*modifiers*/
void 0,
a.name || factory.createIdentifier("__class__"),
/*typeParameters*/
void 0,
/*heritageClauses*/
void 0,
[]
), b.node));
}
return true;
}
return bAssignmentDeclarationKind === 0 /* None */ ? false : true;
}
function tryMerge(a, b, bIndex, parent2) {
if (tryMergeEs5Class(a, b, bIndex, parent2)) {
return true;
}
if (shouldReallyMerge(a.node, b.node, parent2)) {
merge(a, b);
return true;
}
return false;
}
function shouldReallyMerge(a, b, parent2) {
if (a.kind !== b.kind || a.parent !== b.parent && !(isOwnChild(a, parent2) && isOwnChild(b, parent2))) {
return false;
}
switch (a.kind) {
case 171 /* PropertyDeclaration */:
case 173 /* MethodDeclaration */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
return isStatic(a) === isStatic(b);
case 266 /* ModuleDeclaration */:
return areSameModule(a, b) && getFullyQualifiedModuleName(a) === getFullyQualifiedModuleName(b);
default:
return true;
}
}
function isSynthesized(node) {
return !!(node.flags & 8 /* Synthesized */);
}
function isOwnChild(n, parent2) {
const par = isModuleBlock(n.parent) ? n.parent.parent : n.parent;
return par === parent2.node || contains(parent2.additionalNodes, par);
}
function areSameModule(a, b) {
if (!a.body || !b.body) {
return a.body === b.body;
}
return a.body.kind === b.body.kind && (a.body.kind !== 266 /* ModuleDeclaration */ || areSameModule(a.body, b.body));
}
function merge(target, source) {
target.additionalNodes = target.additionalNodes || [];
target.additionalNodes.push(source.node);
if (source.additionalNodes) {
target.additionalNodes.push(...source.additionalNodes);
}
target.children = concatenate(target.children, source.children);
if (target.children) {
mergeChildren(target.children, target);
sortChildren(target.children);
}
}
function sortChildren(children) {
children.sort(compareChildren);
}
function compareChildren(child1, child2) {
return compareStringsCaseSensitiveUI(tryGetName(child1.node), tryGetName(child2.node)) || compareValues(navigationBarNodeKind(child1), navigationBarNodeKind(child2));
}
function tryGetName(node) {
if (node.kind === 266 /* ModuleDeclaration */) {
return getModuleName(node);
}
const declName = getNameOfDeclaration(node);
if (declName && isPropertyName(declName)) {
const propertyName = getPropertyNameForPropertyNameNode(declName);
return propertyName && unescapeLeadingUnderscores(propertyName);
}
switch (node.kind) {
case 217 /* FunctionExpression */:
case 218 /* ArrowFunction */:
case 230 /* ClassExpression */:
return getFunctionOrClassName(node);
default:
return void 0;
}
}
function getItemName(node, name) {
if (node.kind === 266 /* ModuleDeclaration */) {
return cleanText(getModuleName(node));
}
if (name) {
const text = isIdentifier(name) ? name.text : isElementAccessExpression(name) ? `[${nodeText(name.argumentExpression)}]` : nodeText(name);
if (text.length > 0) {
return cleanText(text);
}
}
switch (node.kind) {
case 311 /* SourceFile */:
const sourceFile = node;
return isExternalModule(sourceFile) ? `"${escapeString(getBaseFileName(removeFileExtension(normalizePath(sourceFile.fileName))))}"` : "";
case 276 /* ExportAssignment */:
return isExportAssignment(node) && node.isExportEquals ? "export=" /* ExportEquals */ : "default" /* Default */;
case 218 /* ArrowFunction */:
case 261 /* FunctionDeclaration */:
case 217 /* FunctionExpression */:
case 262 /* ClassDeclaration */:
case 230 /* ClassExpression */:
if (getSyntacticModifierFlags(node) & 1024 /* Default */) {
return "default";
}
return getFunctionOrClassName(node);
case 175 /* Constructor */:
return "constructor";
case 179 /* ConstructSignature */:
return "new()";
case 178 /* CallSignature */:
return "()";
case 180 /* IndexSignature */:
return "[]";
default:
return "";
}
}
function primaryNavBarMenuItems(root) {
const primaryNavBarMenuItems2 = [];
function recur(item) {
if (shouldAppearInPrimaryNavBarMenu(item)) {
primaryNavBarMenuItems2.push(item);
if (item.children) {
for (const child of item.children) {
recur(child);
}
}
}
}
recur(root);
return primaryNavBarMenuItems2;
function shouldAppearInPrimaryNavBarMenu(item) {
if (item.children) {
return true;
}
switch (navigationBarNodeKind(item)) {
case 262 /* ClassDeclaration */:
case 230 /* ClassExpression */:
case 265 /* EnumDeclaration */:
case 263 /* InterfaceDeclaration */:
case 266 /* ModuleDeclaration */:
case 311 /* SourceFile */:
case 264 /* TypeAliasDeclaration */:
case 352 /* JSDocTypedefTag */:
case 344 /* JSDocCallbackTag */:
return true;
case 218 /* ArrowFunction */:
case 261 /* FunctionDeclaration */:
case 217 /* FunctionExpression */:
return isTopLevelFunctionDeclaration(item);
default:
return false;
}
function isTopLevelFunctionDeclaration(item2) {
if (!item2.node.body) {
return false;
}
switch (navigationBarNodeKind(item2.parent)) {
case 267 /* ModuleBlock */:
case 311 /* SourceFile */:
case 173 /* MethodDeclaration */:
case 175 /* Constructor */:
return true;
default:
return false;
}
}
}
}
function convertToTree(n) {
return {
text: getItemName(n.node, n.name),
kind: getNodeKind(n.node),
kindModifiers: getModifiers2(n.node),
spans: getSpans(n),
nameSpan: n.name && getNodeSpan(n.name),
childItems: map(n.children, convertToTree)
};
}
function convertToPrimaryNavBarMenuItem(n) {
return {
text: getItemName(n.node, n.name),
kind: getNodeKind(n.node),
kindModifiers: getModifiers2(n.node),
spans: getSpans(n),
childItems: map(n.children, convertToSecondaryNavBarMenuItem) || emptyChildItemArray,
indent: n.indent,
bolded: false,
grayed: false
};
function convertToSecondaryNavBarMenuItem(n2) {
return {
text: getItemName(n2.node, n2.name),
kind: getNodeKind(n2.node),
kindModifiers: getNodeModifiers(n2.node),
spans: getSpans(n2),
childItems: emptyChildItemArray,
indent: 0,
bolded: false,
grayed: false
};
}
}
function getSpans(n) {
const spans = [getNodeSpan(n.node)];
if (n.additionalNodes) {
for (const node of n.additionalNodes) {
spans.push(getNodeSpan(node));
}
}
return spans;
}
function getModuleName(moduleDeclaration) {
if (isAmbientModule(moduleDeclaration)) {
return getTextOfNode(moduleDeclaration.name);
}
return getFullyQualifiedModuleName(moduleDeclaration);
}
function getFullyQualifiedModuleName(moduleDeclaration) {
const result = [getTextOfIdentifierOrLiteral(moduleDeclaration.name)];
while (moduleDeclaration.body && moduleDeclaration.body.kind === 266 /* ModuleDeclaration */) {
moduleDeclaration = moduleDeclaration.body;
result.push(getTextOfIdentifierOrLiteral(moduleDeclaration.name));
}
return result.join(".");
}
function getInteriorModule(decl) {
return decl.body && isModuleDeclaration(decl.body) ? getInteriorModule(decl.body) : decl;
}
function isComputedProperty(member) {
return !member.name || member.name.kind === 166 /* ComputedPropertyName */;
}
function getNodeSpan(node) {
return node.kind === 311 /* SourceFile */ ? createTextSpanFromRange(node) : createTextSpanFromNode(node, curSourceFile);
}
function getModifiers2(node) {
if (node.parent && node.parent.kind === 259 /* VariableDeclaration */) {
node = node.parent;
}
return getNodeModifiers(node);
}
function getFunctionOrClassName(node) {
const { parent: parent2 } = node;
if (node.name && getFullWidth(node.name) > 0) {
return cleanText(declarationNameToString(node.name));
} else if (isVariableDeclaration(parent2)) {
return cleanText(declarationNameToString(parent2.name));
} else if (isBinaryExpression(parent2) && parent2.operatorToken.kind === 64 /* EqualsToken */) {
return nodeText(parent2.left).replace(whiteSpaceRegex, "");
} else if (isPropertyAssignment(parent2)) {
return nodeText(parent2.name);
} else if (getSyntacticModifierFlags(node) & 1024 /* Default */) {
return "default";
} else if (isClassLike(node)) {
return "";
} else if (isCallExpression(parent2)) {
let name = getCalledExpressionName(parent2.expression);
if (name !== void 0) {
name = cleanText(name);
if (name.length > maxLength) {
return `${name} callback`;
}
const args = cleanText(mapDefined(parent2.arguments, (a) => isStringLiteralLike(a) ? a.getText(curSourceFile) : void 0).join(", "));
return `${name}(${args}) callback`;
}
}
return "";
}
function getCalledExpressionName(expr) {
if (isIdentifier(expr)) {
return expr.text;
} else if (isPropertyAccessExpression(expr)) {
const left = getCalledExpressionName(expr.expression);
const right = expr.name.text;
return left === void 0 ? right : `${left}.${right}`;
} else {
return void 0;
}
}
function isFunctionOrClassExpression(node) {
switch (node.kind) {
case 218 /* ArrowFunction */:
case 217 /* FunctionExpression */:
case 230 /* ClassExpression */:
return true;
default:
return false;
}
}
function cleanText(text) {
text = text.length > maxLength ? text.substring(0, maxLength) + "..." : text;
return text.replace(/\\?(\r?\n|\r|\u2028|\u2029)/g, "");
}
// src/services/_namespaces/ts.refactor.ts
var ts_refactor_exports = {};
__export(ts_refactor_exports, {
addExportToChanges: () => addExportToChanges,
addExports: () => addExports,
addNewFileToTsconfig: () => addNewFileToTsconfig,
addOrRemoveBracesToArrowFunction: () => ts_refactor_addOrRemoveBracesToArrowFunction_exports,
convertArrowFunctionOrFunctionExpression: () => ts_refactor_convertArrowFunctionOrFunctionExpression_exports,
convertParamsToDestructuredObject: () => ts_refactor_convertParamsToDestructuredObject_exports,
convertStringOrTemplateLiteral: () => ts_refactor_convertStringOrTemplateLiteral_exports,
convertToOptionalChainExpression: () => ts_refactor_convertToOptionalChainExpression_exports,
createNewFileName: () => createNewFileName,
createOldFileImportsFromTargetFile: () => createOldFileImportsFromTargetFile,
deleteMovedStatements: () => deleteMovedStatements,
deleteUnusedImports: () => deleteUnusedImports,
deleteUnusedOldImports: () => deleteUnusedOldImports,
doChangeNamedToNamespaceOrDefault: () => doChangeNamedToNamespaceOrDefault,
extractSymbol: () => ts_refactor_extractSymbol_exports,
filterImport: () => filterImport,
forEachImportInStatement: () => forEachImportInStatement,
generateGetAccessorAndSetAccessor: () => ts_refactor_generateGetAccessorAndSetAccessor_exports,
getApplicableRefactors: () => getApplicableRefactors,
getEditsForRefactor: () => getEditsForRefactor,
getStatementsToMove: () => getStatementsToMove,
getTopLevelDeclarationStatement: () => getTopLevelDeclarationStatement,
getUsageInfo: () => getUsageInfo,
inferFunctionReturnType: () => ts_refactor_inferFunctionReturnType_exports,
isRefactorErrorInfo: () => isRefactorErrorInfo,
isTopLevelDeclaration: () => isTopLevelDeclaration,
makeImportOrRequire: () => makeImportOrRequire,
moduleSpecifierFromImport: () => moduleSpecifierFromImport,
nameOfTopLevelDeclaration: () => nameOfTopLevelDeclaration,
refactorKindBeginsWith: () => refactorKindBeginsWith,
registerRefactor: () => registerRefactor,
updateImportsInOtherFiles: () => updateImportsInOtherFiles
});
// src/services/refactorProvider.ts
var refactors = /* @__PURE__ */ new Map();
function registerRefactor(name, refactor) {
refactors.set(name, refactor);
}
function getApplicableRefactors(context, includeInteractiveActions) {
return arrayFrom(flatMapIterator(refactors.values(), (refactor) => {
var _a;
return context.cancellationToken && context.cancellationToken.isCancellationRequested() || !((_a = refactor.kinds) == null ? void 0 : _a.some((kind) => refactorKindBeginsWith(kind, context.kind))) ? void 0 : refactor.getAvailableActions(context, includeInteractiveActions);
}));
}
function getEditsForRefactor(context, refactorName13, actionName2, interactiveRefactorArguments) {
const refactor = refactors.get(refactorName13);
return refactor && refactor.getEditsForAction(context, actionName2, interactiveRefactorArguments);
}
// src/services/refactors/convertExport.ts
var refactorName = "Convert export";
var defaultToNamedAction = {
name: "Convert default export to named export",
description: Diagnostics.Convert_default_export_to_named_export.message,
kind: "refactor.rewrite.export.named"
};
var namedToDefaultAction = {
name: "Convert named export to default export",
description: Diagnostics.Convert_named_export_to_default_export.message,
kind: "refactor.rewrite.export.default"
};
registerRefactor(refactorName, {
kinds: [
defaultToNamedAction.kind,
namedToDefaultAction.kind
],
getAvailableActions: function getRefactorActionsToConvertBetweenNamedAndDefaultExports(context) {
const info = getInfo2(context, context.triggerReason === "invoked");
if (!info)
return emptyArray;
if (!isRefactorErrorInfo(info)) {
const action = info.wasDefault ? defaultToNamedAction : namedToDefaultAction;
return [{ name: refactorName, description: action.description, actions: [action] }];
}
if (context.preferences.provideRefactorNotApplicableReason) {
return [
{ name: refactorName, description: Diagnostics.Convert_default_export_to_named_export.message, actions: [
{ ...defaultToNamedAction, notApplicableReason: info.error },
{ ...namedToDefaultAction, notApplicableReason: info.error }
] }
];
}
return emptyArray;
},
getEditsForAction: function getRefactorEditsToConvertBetweenNamedAndDefaultExports(context, actionName2) {
Debug.assert(actionName2 === defaultToNamedAction.name || actionName2 === namedToDefaultAction.name, "Unexpected action name");
const info = getInfo2(context);
Debug.assert(info && !isRefactorErrorInfo(info), "Expected applicable refactor info");
const edits = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange(context.file, context.program, info, t, context.cancellationToken));
return { edits, renameFilename: void 0, renameLocation: void 0 };
}
});
function getInfo2(context, considerPartialSpans = true) {
const { file, program } = context;
const span = getRefactorContextSpan(context);
const token = getTokenAtPosition(file, span.start);
const exportNode = !!(token.parent && getSyntacticModifierFlags(token.parent) & 1 /* Export */) && considerPartialSpans ? token.parent : getParentNodeInSpan(token, file, span);
if (!exportNode || !isSourceFile(exportNode.parent) && !(isModuleBlock(exportNode.parent) && isAmbientModule(exportNode.parent.parent))) {
return { error: getLocaleSpecificMessage(Diagnostics.Could_not_find_export_statement) };
}
const checker = program.getTypeChecker();
const exportingModuleSymbol = getExportingModuleSymbol(exportNode.parent, checker);
const flags = getSyntacticModifierFlags(exportNode) || (isExportAssignment(exportNode) && !exportNode.isExportEquals ? 1025 /* ExportDefault */ : 0 /* None */);
const wasDefault = !!(flags & 1024 /* Default */);
if (!(flags & 1 /* Export */) || !wasDefault && exportingModuleSymbol.exports.has("default" /* Default */)) {
return { error: getLocaleSpecificMessage(Diagnostics.This_file_already_has_a_default_export) };
}
const noSymbolError = (id) => isIdentifier(id) && checker.getSymbolAtLocation(id) ? void 0 : { error: getLocaleSpecificMessage(Diagnostics.Can_only_convert_named_export) };
switch (exportNode.kind) {
case 261 /* FunctionDeclaration */:
case 262 /* ClassDeclaration */:
case 263 /* InterfaceDeclaration */:
case 265 /* EnumDeclaration */:
case 264 /* TypeAliasDeclaration */:
case 266 /* ModuleDeclaration */: {
const node = exportNode;
if (!node.name)
return void 0;
return noSymbolError(node.name) || { exportNode: node, exportName: node.name, wasDefault, exportingModuleSymbol };
}
case 242 /* VariableStatement */: {
const vs = exportNode;
if (!(vs.declarationList.flags & 2 /* Const */) || vs.declarationList.declarations.length !== 1) {
return void 0;
}
const decl = first(vs.declarationList.declarations);
if (!decl.initializer)
return void 0;
Debug.assert(!wasDefault, "Can't have a default flag here");
return noSymbolError(decl.name) || { exportNode: vs, exportName: decl.name, wasDefault, exportingModuleSymbol };
}
case 276 /* ExportAssignment */: {
const node = exportNode;
if (node.isExportEquals)
return void 0;
return noSymbolError(node.expression) || { exportNode: node, exportName: node.expression, wasDefault, exportingModuleSymbol };
}
default:
return void 0;
}
}
function doChange(exportingSourceFile, program, info, changes, cancellationToken) {
changeExport(exportingSourceFile, info, changes, program.getTypeChecker());
changeImports(program, info, changes, cancellationToken);
}
function changeExport(exportingSourceFile, { wasDefault, exportNode, exportName }, changes, checker) {
if (wasDefault) {
if (isExportAssignment(exportNode) && !exportNode.isExportEquals) {
const exp = exportNode.expression;
const spec = makeExportSpecifier(exp.text, exp.text);
changes.replaceNode(exportingSourceFile, exportNode, factory.createExportDeclaration(
/*modifiers*/
void 0,
/*isTypeOnly*/
false,
factory.createNamedExports([spec])
));
} else {
changes.delete(exportingSourceFile, Debug.checkDefined(findModifier(exportNode, 90 /* DefaultKeyword */), "Should find a default keyword in modifier list"));
}
} else {
const exportKeyword = Debug.checkDefined(findModifier(exportNode, 95 /* ExportKeyword */), "Should find an export keyword in modifier list");
switch (exportNode.kind) {
case 261 /* FunctionDeclaration */:
case 262 /* ClassDeclaration */:
case 263 /* InterfaceDeclaration */:
changes.insertNodeAfter(exportingSourceFile, exportKeyword, factory.createToken(90 /* DefaultKeyword */));
break;
case 242 /* VariableStatement */:
const decl = first(exportNode.declarationList.declarations);
if (!ts_FindAllReferences_exports.Core.isSymbolReferencedInFile(exportName, checker, exportingSourceFile) && !decl.type) {
changes.replaceNode(exportingSourceFile, exportNode, factory.createExportDefault(Debug.checkDefined(decl.initializer, "Initializer was previously known to be present")));
break;
}
case 265 /* EnumDeclaration */:
case 264 /* TypeAliasDeclaration */:
case 266 /* ModuleDeclaration */:
changes.deleteModifier(exportingSourceFile, exportKeyword);
changes.insertNodeAfter(exportingSourceFile, exportNode, factory.createExportDefault(factory.createIdentifier(exportName.text)));
break;
default:
Debug.fail(`Unexpected exportNode kind ${exportNode.kind}`);
}
}
}
function changeImports(program, { wasDefault, exportName, exportingModuleSymbol }, changes, cancellationToken) {
const checker = program.getTypeChecker();
const exportSymbol = Debug.checkDefined(checker.getSymbolAtLocation(exportName), "Export name should resolve to a symbol");
ts_FindAllReferences_exports.Core.eachExportReference(program.getSourceFiles(), checker, cancellationToken, exportSymbol, exportingModuleSymbol, exportName.text, wasDefault, (ref) => {
if (exportName === ref)
return;
const importingSourceFile = ref.getSourceFile();
if (wasDefault) {
changeDefaultToNamedImport(importingSourceFile, ref, changes, exportName.text);
} else {
changeNamedToDefaultImport(importingSourceFile, ref, changes);
}
});
}
function changeDefaultToNamedImport(importingSourceFile, ref, changes, exportName) {
const { parent: parent2 } = ref;
switch (parent2.kind) {
case 210 /* PropertyAccessExpression */:
changes.replaceNode(importingSourceFile, ref, factory.createIdentifier(exportName));
break;
case 275 /* ImportSpecifier */:
case 280 /* ExportSpecifier */: {
const spec = parent2;
changes.replaceNode(importingSourceFile, spec, makeImportSpecifier(exportName, spec.name.text));
break;
}
case 272 /* ImportClause */: {
const clause = parent2;
Debug.assert(clause.name === ref, "Import clause name should match provided ref");
const spec = makeImportSpecifier(exportName, ref.text);
const { namedBindings } = clause;
if (!namedBindings) {
changes.replaceNode(importingSourceFile, ref, factory.createNamedImports([spec]));
} else if (namedBindings.kind === 273 /* NamespaceImport */) {
changes.deleteRange(importingSourceFile, { pos: ref.getStart(importingSourceFile), end: namedBindings.getStart(importingSourceFile) });
const quotePreference = isStringLiteral(clause.parent.moduleSpecifier) ? quotePreferenceFromString(clause.parent.moduleSpecifier, importingSourceFile) : 1 /* Double */;
const newImport = makeImport(
/*defaultImport*/
void 0,
[makeImportSpecifier(exportName, ref.text)],
clause.parent.moduleSpecifier,
quotePreference
);
changes.insertNodeAfter(importingSourceFile, clause.parent, newImport);
} else {
changes.delete(importingSourceFile, ref);
changes.insertNodeAtEndOfList(importingSourceFile, namedBindings.elements, spec);
}
break;
}
case 204 /* ImportType */:
const importTypeNode = parent2;
changes.replaceNode(importingSourceFile, parent2, factory.createImportTypeNode(importTypeNode.argument, importTypeNode.assertions, factory.createIdentifier(exportName), importTypeNode.typeArguments, importTypeNode.isTypeOf));
break;
default:
Debug.failBadSyntaxKind(parent2);
}
}
function changeNamedToDefaultImport(importingSourceFile, ref, changes) {
const parent2 = ref.parent;
switch (parent2.kind) {
case 210 /* PropertyAccessExpression */:
changes.replaceNode(importingSourceFile, ref, factory.createIdentifier("default"));
break;
case 275 /* ImportSpecifier */: {
const defaultImport = factory.createIdentifier(parent2.name.text);
if (parent2.parent.elements.length === 1) {
changes.replaceNode(importingSourceFile, parent2.parent, defaultImport);
} else {
changes.delete(importingSourceFile, parent2);
changes.insertNodeBefore(importingSourceFile, parent2.parent, defaultImport);
}
break;
}
case 280 /* ExportSpecifier */: {
changes.replaceNode(importingSourceFile, parent2, makeExportSpecifier("default", parent2.name.text));
break;
}
default:
Debug.assertNever(parent2, `Unexpected parent kind ${parent2.kind}`);
}
}
function makeImportSpecifier(propertyName, name) {
return factory.createImportSpecifier(
/*isTypeOnly*/
false,
propertyName === name ? void 0 : factory.createIdentifier(propertyName),
factory.createIdentifier(name)
);
}
function makeExportSpecifier(propertyName, name) {
return factory.createExportSpecifier(
/*isTypeOnly*/
false,
propertyName === name ? void 0 : factory.createIdentifier(propertyName),
factory.createIdentifier(name)
);
}
function getExportingModuleSymbol(parent2, checker) {
if (isSourceFile(parent2)) {
return parent2.symbol;
}
const symbol = parent2.parent.symbol;
if (symbol.valueDeclaration && isExternalModuleAugmentation(symbol.valueDeclaration)) {
return checker.getMergedSymbol(symbol);
}
return symbol;
}
// src/services/refactors/convertImport.ts
var refactorName2 = "Convert import";
var actions = {
[0 /* Named */]: {
name: "Convert namespace import to named imports",
description: Diagnostics.Convert_namespace_import_to_named_imports.message,
kind: "refactor.rewrite.import.named"
},
[2 /* Namespace */]: {
name: "Convert named imports to namespace import",
description: Diagnostics.Convert_named_imports_to_namespace_import.message,
kind: "refactor.rewrite.import.namespace"
},
[1 /* Default */]: {
name: "Convert named imports to default import",
description: Diagnostics.Convert_named_imports_to_default_import.message,
kind: "refactor.rewrite.import.default"
}
};
registerRefactor(refactorName2, {
kinds: getOwnValues(actions).map((a) => a.kind),
getAvailableActions: function getRefactorActionsToConvertBetweenNamedAndNamespacedImports(context) {
const info = getImportConversionInfo(context, context.triggerReason === "invoked");
if (!info)
return emptyArray;
if (!isRefactorErrorInfo(info)) {
const action = actions[info.convertTo];
return [{ name: refactorName2, description: action.description, actions: [action] }];
}
if (context.preferences.provideRefactorNotApplicableReason) {
return getOwnValues(actions).map((action) => ({
name: refactorName2,
description: action.description,
actions: [{ ...action, notApplicableReason: info.error }]
}));
}
return emptyArray;
},
getEditsForAction: function getRefactorEditsToConvertBetweenNamedAndNamespacedImports(context, actionName2) {
Debug.assert(some(getOwnValues(actions), (action) => action.name === actionName2), "Unexpected action name");
const info = getImportConversionInfo(context);
Debug.assert(info && !isRefactorErrorInfo(info), "Expected applicable refactor info");
const edits = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange2(context.file, context.program, t, info));
return { edits, renameFilename: void 0, renameLocation: void 0 };
}
});
function getImportConversionInfo(context, considerPartialSpans = true) {
const { file } = context;
const span = getRefactorContextSpan(context);
const token = getTokenAtPosition(file, span.start);
const importDecl = considerPartialSpans ? findAncestor(token, isImportDeclaration) : getParentNodeInSpan(token, file, span);
if (!importDecl || !isImportDeclaration(importDecl))
return { error: "Selection is not an import declaration." };
const end = span.start + span.length;
const nextToken = findNextToken(importDecl, importDecl.parent, file);
if (nextToken && end > nextToken.getStart())
return void 0;
const { importClause } = importDecl;
if (!importClause) {
return { error: getLocaleSpecificMessage(Diagnostics.Could_not_find_import_clause) };
}
if (!importClause.namedBindings) {
return { error: getLocaleSpecificMessage(Diagnostics.Could_not_find_namespace_import_or_named_imports) };
}
if (importClause.namedBindings.kind === 273 /* NamespaceImport */) {
return { convertTo: 0 /* Named */, import: importClause.namedBindings };
}
const shouldUseDefault = getShouldUseDefault(context.program, importClause);
return shouldUseDefault ? { convertTo: 1 /* Default */, import: importClause.namedBindings } : { convertTo: 2 /* Namespace */, import: importClause.namedBindings };
}
function getShouldUseDefault(program, importClause) {
return getAllowSyntheticDefaultImports(program.getCompilerOptions()) && isExportEqualsModule(importClause.parent.moduleSpecifier, program.getTypeChecker());
}
function doChange2(sourceFile, program, changes, info) {
const checker = program.getTypeChecker();
if (info.convertTo === 0 /* Named */) {
doChangeNamespaceToNamed(sourceFile, checker, changes, info.import, getAllowSyntheticDefaultImports(program.getCompilerOptions()));
} else {
doChangeNamedToNamespaceOrDefault(sourceFile, program, changes, info.import, info.convertTo === 1 /* Default */);
}
}
function doChangeNamespaceToNamed(sourceFile, checker, changes, toConvert, allowSyntheticDefaultImports) {
let usedAsNamespaceOrDefault = false;
const nodesToReplace = [];
const conflictingNames = /* @__PURE__ */ new Map();
ts_FindAllReferences_exports.Core.eachSymbolReferenceInFile(toConvert.name, checker, sourceFile, (id) => {
if (!isPropertyAccessOrQualifiedName(id.parent)) {
usedAsNamespaceOrDefault = true;
} else {
const exportName = getRightOfPropertyAccessOrQualifiedName(id.parent).text;
if (checker.resolveName(
exportName,
id,
67108863 /* All */,
/*excludeGlobals*/
true
)) {
conflictingNames.set(exportName, true);
}
Debug.assert(getLeftOfPropertyAccessOrQualifiedName(id.parent) === id, "Parent expression should match id");
nodesToReplace.push(id.parent);
}
});
const exportNameToImportName = /* @__PURE__ */ new Map();
for (const propertyAccessOrQualifiedName of nodesToReplace) {
const exportName = getRightOfPropertyAccessOrQualifiedName(propertyAccessOrQualifiedName).text;
let importName = exportNameToImportName.get(exportName);
if (importName === void 0) {
exportNameToImportName.set(exportName, importName = conflictingNames.has(exportName) ? getUniqueName(exportName, sourceFile) : exportName);
}
changes.replaceNode(sourceFile, propertyAccessOrQualifiedName, factory.createIdentifier(importName));
}
const importSpecifiers = [];
exportNameToImportName.forEach((name, propertyName) => {
importSpecifiers.push(factory.createImportSpecifier(
/*isTypeOnly*/
false,
name === propertyName ? void 0 : factory.createIdentifier(propertyName),
factory.createIdentifier(name)
));
});
const importDecl = toConvert.parent.parent;
if (usedAsNamespaceOrDefault && !allowSyntheticDefaultImports) {
changes.insertNodeAfter(sourceFile, importDecl, updateImport(
importDecl,
/*defaultImportName*/
void 0,
importSpecifiers
));
} else {
changes.replaceNode(sourceFile, importDecl, updateImport(importDecl, usedAsNamespaceOrDefault ? factory.createIdentifier(toConvert.name.text) : void 0, importSpecifiers));
}
}
function getRightOfPropertyAccessOrQualifiedName(propertyAccessOrQualifiedName) {
return isPropertyAccessExpression(propertyAccessOrQualifiedName) ? propertyAccessOrQualifiedName.name : propertyAccessOrQualifiedName.right;
}
function getLeftOfPropertyAccessOrQualifiedName(propertyAccessOrQualifiedName) {
return isPropertyAccessExpression(propertyAccessOrQualifiedName) ? propertyAccessOrQualifiedName.expression : propertyAccessOrQualifiedName.left;
}
function doChangeNamedToNamespaceOrDefault(sourceFile, program, changes, toConvert, shouldUseDefault = getShouldUseDefault(program, toConvert.parent)) {
const checker = program.getTypeChecker();
const importDecl = toConvert.parent.parent;
const { moduleSpecifier } = importDecl;
const toConvertSymbols = /* @__PURE__ */ new Set();
toConvert.elements.forEach((namedImport) => {
const symbol = checker.getSymbolAtLocation(namedImport.name);
if (symbol) {
toConvertSymbols.add(symbol);
}
});
const preferredName = moduleSpecifier && isStringLiteral(moduleSpecifier) ? ts_codefix_exports.moduleSpecifierToValidIdentifier(moduleSpecifier.text, 99 /* ESNext */) : "module";
function hasNamespaceNameConflict(namedImport) {
return !!ts_FindAllReferences_exports.Core.eachSymbolReferenceInFile(namedImport.name, checker, sourceFile, (id) => {
const symbol = checker.resolveName(
preferredName,
id,
67108863 /* All */,
/*excludeGlobals*/
true
);
if (symbol) {
if (toConvertSymbols.has(symbol)) {
return isExportSpecifier(id.parent);
}
return true;
}
return false;
});
}
const namespaceNameConflicts = toConvert.elements.some(hasNamespaceNameConflict);
const namespaceImportName = namespaceNameConflicts ? getUniqueName(preferredName, sourceFile) : preferredName;
const neededNamedImports = /* @__PURE__ */ new Set();
for (const element of toConvert.elements) {
const propertyName = (element.propertyName || element.name).text;
ts_FindAllReferences_exports.Core.eachSymbolReferenceInFile(element.name, checker, sourceFile, (id) => {
const access = factory.createPropertyAccessExpression(factory.createIdentifier(namespaceImportName), propertyName);
if (isShorthandPropertyAssignment(id.parent)) {
changes.replaceNode(sourceFile, id.parent, factory.createPropertyAssignment(id.text, access));
} else if (isExportSpecifier(id.parent)) {
neededNamedImports.add(element);
} else {
changes.replaceNode(sourceFile, id, access);
}
});
}
changes.replaceNode(sourceFile, toConvert, shouldUseDefault ? factory.createIdentifier(namespaceImportName) : factory.createNamespaceImport(factory.createIdentifier(namespaceImportName)));
if (neededNamedImports.size) {
const newNamedImports = arrayFrom(neededNamedImports.values(), (element) => factory.createImportSpecifier(element.isTypeOnly, element.propertyName && factory.createIdentifier(element.propertyName.text), factory.createIdentifier(element.name.text)));
changes.insertNodeAfter(sourceFile, toConvert.parent.parent, updateImport(
importDecl,
/*defaultImportName*/
void 0,
newNamedImports
));
}
}
function isExportEqualsModule(moduleSpecifier, checker) {
const externalModule = checker.resolveExternalModuleName(moduleSpecifier);
if (!externalModule)
return false;
const exportEquals = checker.resolveExternalModuleSymbol(externalModule);
return externalModule !== exportEquals;
}
function updateImport(old, defaultImportName, elements) {
return factory.createImportDeclaration(
/*modifiers*/
void 0,
factory.createImportClause(
/*isTypeOnly*/
false,
defaultImportName,
elements && elements.length ? factory.createNamedImports(elements) : void 0
),
old.moduleSpecifier,
/*assertClause*/
void 0
);
}
// src/services/refactors/extractType.ts
var refactorName3 = "Extract type";
var extractToTypeAliasAction = {
name: "Extract to type alias",
description: getLocaleSpecificMessage(Diagnostics.Extract_to_type_alias),
kind: "refactor.extract.type"
};
var extractToInterfaceAction = {
name: "Extract to interface",
description: getLocaleSpecificMessage(Diagnostics.Extract_to_interface),
kind: "refactor.extract.interface"
};
var extractToTypeDefAction = {
name: "Extract to typedef",
description: getLocaleSpecificMessage(Diagnostics.Extract_to_typedef),
kind: "refactor.extract.typedef"
};
registerRefactor(refactorName3, {
kinds: [
extractToTypeAliasAction.kind,
extractToInterfaceAction.kind,
extractToTypeDefAction.kind
],
getAvailableActions: function getRefactorActionsToExtractType(context) {
const info = getRangeToExtract(context, context.triggerReason === "invoked");
if (!info)
return emptyArray;
if (!isRefactorErrorInfo(info)) {
return [{
name: refactorName3,
description: getLocaleSpecificMessage(Diagnostics.Extract_type),
actions: info.isJS ? [extractToTypeDefAction] : append([extractToTypeAliasAction], info.typeElements && extractToInterfaceAction)
}];
}
if (context.preferences.provideRefactorNotApplicableReason) {
return [{
name: refactorName3,
description: getLocaleSpecificMessage(Diagnostics.Extract_type),
actions: [
{ ...extractToTypeDefAction, notApplicableReason: info.error },
{ ...extractToTypeAliasAction, notApplicableReason: info.error },
{ ...extractToInterfaceAction, notApplicableReason: info.error }
]
}];
}
return emptyArray;
},
getEditsForAction: function getRefactorEditsToExtractType(context, actionName2) {
const { file } = context;
const info = getRangeToExtract(context);
Debug.assert(info && !isRefactorErrorInfo(info), "Expected to find a range to extract");
const name = getUniqueName("NewType", file);
const edits = ts_textChanges_exports.ChangeTracker.with(context, (changes) => {
switch (actionName2) {
case extractToTypeAliasAction.name:
Debug.assert(!info.isJS, "Invalid actionName/JS combo");
return doTypeAliasChange(changes, file, name, info);
case extractToTypeDefAction.name:
Debug.assert(info.isJS, "Invalid actionName/JS combo");
return doTypedefChange(changes, context, file, name, info);
case extractToInterfaceAction.name:
Debug.assert(!info.isJS && !!info.typeElements, "Invalid actionName/JS combo");
return doInterfaceChange(changes, file, name, info);
default:
Debug.fail("Unexpected action name");
}
});
const renameFilename = file.fileName;
const renameLocation = getRenameLocation(
edits,
renameFilename,
name,
/*preferLastLocation*/
false
);
return { edits, renameFilename, renameLocation };
}
});
function getRangeToExtract(context, considerEmptySpans = true) {
const { file, startPosition } = context;
const isJS = isSourceFileJS(file);
const current = getTokenAtPosition(file, startPosition);
const range = createTextRangeFromSpan(getRefactorContextSpan(context));
const cursorRequest = range.pos === range.end && considerEmptySpans;
const selection = findAncestor(current, (node) => node.parent && isTypeNode(node) && !rangeContainsSkipTrivia(range, node.parent, file) && (cursorRequest || nodeOverlapsWithStartEnd(current, file, range.pos, range.end)));
if (!selection || !isTypeNode(selection))
return { error: getLocaleSpecificMessage(Diagnostics.Selection_is_not_a_valid_type_node) };
const checker = context.program.getTypeChecker();
const enclosingNode = getEnclosingNode(selection, isJS);
if (enclosingNode === void 0)
return { error: getLocaleSpecificMessage(Diagnostics.No_type_could_be_extracted_from_this_type_node) };
const typeParameters = collectTypeParameters(checker, selection, enclosingNode, file);
if (!typeParameters)
return { error: getLocaleSpecificMessage(Diagnostics.No_type_could_be_extracted_from_this_type_node) };
const typeElements = flattenTypeLiteralNodeReference(checker, selection);
return { isJS, selection, enclosingNode, typeParameters, typeElements };
}
function flattenTypeLiteralNodeReference(checker, node) {
if (!node)
return void 0;
if (isIntersectionTypeNode(node)) {
const result = [];
const seen = /* @__PURE__ */ new Map();
for (const type of node.types) {
const flattenedTypeMembers = flattenTypeLiteralNodeReference(checker, type);
if (!flattenedTypeMembers || !flattenedTypeMembers.every((type2) => type2.name && addToSeen(seen, getNameFromPropertyName(type2.name)))) {
return void 0;
}
addRange(result, flattenedTypeMembers);
}
return result;
} else if (isParenthesizedTypeNode(node)) {
return flattenTypeLiteralNodeReference(checker, node.type);
} else if (isTypeLiteralNode(node)) {
return node.members;
}
return void 0;
}
function rangeContainsSkipTrivia(r1, node, file) {
return rangeContainsStartEnd(r1, skipTrivia(file.text, node.pos), node.end);
}
function collectTypeParameters(checker, selection, enclosingNode, file) {
const result = [];
return visitor(selection) ? void 0 : result;
function visitor(node) {
if (isTypeReferenceNode(node)) {
if (isIdentifier(node.typeName)) {
const typeName = node.typeName;
const symbol = checker.resolveName(
typeName.text,
typeName,
262144 /* TypeParameter */,
/*excludeGlobals*/
true
);
for (const decl of (symbol == null ? void 0 : symbol.declarations) || emptyArray) {
if (isTypeParameterDeclaration(decl) && decl.getSourceFile() === file) {
if (decl.name.escapedText === typeName.escapedText && rangeContainsSkipTrivia(decl, selection, file)) {
return true;
}
if (rangeContainsSkipTrivia(enclosingNode, decl, file) && !rangeContainsSkipTrivia(selection, decl, file)) {
pushIfUnique(result, decl);
break;
}
}
}
}
} else if (isInferTypeNode(node)) {
const conditionalTypeNode = findAncestor(node, (n) => isConditionalTypeNode(n) && rangeContainsSkipTrivia(n.extendsType, node, file));
if (!conditionalTypeNode || !rangeContainsSkipTrivia(selection, conditionalTypeNode, file)) {
return true;
}
} else if (isTypePredicateNode(node) || isThisTypeNode(node)) {
const functionLikeNode = findAncestor(node.parent, isFunctionLike);
if (functionLikeNode && functionLikeNode.type && rangeContainsSkipTrivia(functionLikeNode.type, node, file) && !rangeContainsSkipTrivia(selection, functionLikeNode, file)) {
return true;
}
} else if (isTypeQueryNode(node)) {
if (isIdentifier(node.exprName)) {
const symbol = checker.resolveName(
node.exprName.text,
node.exprName,
111551 /* Value */,
/*excludeGlobals*/
false
);
if ((symbol == null ? void 0 : symbol.valueDeclaration) && rangeContainsSkipTrivia(enclosingNode, symbol.valueDeclaration, file) && !rangeContainsSkipTrivia(selection, symbol.valueDeclaration, file)) {
return true;
}
} else {
if (isThisIdentifier(node.exprName.left) && !rangeContainsSkipTrivia(selection, node.parent, file)) {
return true;
}
}
}
if (file && isTupleTypeNode(node) && getLineAndCharacterOfPosition(file, node.pos).line === getLineAndCharacterOfPosition(file, node.end).line) {
setEmitFlags(node, 1 /* SingleLine */);
}
return forEachChild(node, visitor);
}
}
function doTypeAliasChange(changes, file, name, info) {
const { enclosingNode, selection, typeParameters } = info;
const newTypeNode = factory.createTypeAliasDeclaration(
/*modifiers*/
void 0,
name,
typeParameters.map((id) => factory.updateTypeParameterDeclaration(
id,
id.modifiers,
id.name,
id.constraint,
/*defaultType*/
void 0
)),
selection
);
changes.insertNodeBefore(
file,
enclosingNode,
ignoreSourceNewlines(newTypeNode),
/*blankLineBetween*/
true
);
changes.replaceNode(file, selection, factory.createTypeReferenceNode(name, typeParameters.map((id) => factory.createTypeReferenceNode(
id.name,
/*typeArguments*/
void 0
))), { leadingTriviaOption: ts_textChanges_exports.LeadingTriviaOption.Exclude, trailingTriviaOption: ts_textChanges_exports.TrailingTriviaOption.ExcludeWhitespace });
}
function doInterfaceChange(changes, file, name, info) {
var _a;
const { enclosingNode, selection, typeParameters, typeElements } = info;
const newTypeNode = factory.createInterfaceDeclaration(
/*modifiers*/
void 0,
name,
typeParameters,
/*heritageClauses*/
void 0,
typeElements
);
setTextRange(newTypeNode, (_a = typeElements[0]) == null ? void 0 : _a.parent);
changes.insertNodeBefore(
file,
enclosingNode,
ignoreSourceNewlines(newTypeNode),
/*blankLineBetween*/
true
);
changes.replaceNode(file, selection, factory.createTypeReferenceNode(name, typeParameters.map((id) => factory.createTypeReferenceNode(
id.name,
/*typeArguments*/
void 0
))), { leadingTriviaOption: ts_textChanges_exports.LeadingTriviaOption.Exclude, trailingTriviaOption: ts_textChanges_exports.TrailingTriviaOption.ExcludeWhitespace });
}
function doTypedefChange(changes, context, file, name, info) {
var _a;
const { enclosingNode, selection, typeParameters } = info;
setEmitFlags(selection, 3072 /* NoComments */ | 4096 /* NoNestedComments */);
const node = factory.createJSDocTypedefTag(
factory.createIdentifier("typedef"),
factory.createJSDocTypeExpression(selection),
factory.createIdentifier(name)
);
const templates = [];
forEach(typeParameters, (typeParameter) => {
const constraint = getEffectiveConstraintOfTypeParameter(typeParameter);
const parameter = factory.createTypeParameterDeclaration(
/*modifiers*/
void 0,
typeParameter.name
);
const template = factory.createJSDocTemplateTag(
factory.createIdentifier("template"),
constraint && cast(constraint, isJSDocTypeExpression),
[parameter]
);
templates.push(template);
});
const jsDoc = factory.createJSDocComment(
/*comment*/
void 0,
factory.createNodeArray(concatenate(templates, [node]))
);
if (isJSDoc(enclosingNode)) {
const pos = enclosingNode.getStart(file);
const newLineCharacter = getNewLineOrDefaultFromHost(context.host, (_a = context.formatContext) == null ? void 0 : _a.options);
changes.insertNodeAt(file, enclosingNode.getStart(file), jsDoc, {
suffix: newLineCharacter + newLineCharacter + file.text.slice(getPrecedingNonSpaceCharacterPosition(file.text, pos - 1), pos)
});
} else {
changes.insertNodeBefore(
file,
enclosingNode,
jsDoc,
/*blankLineBetween*/
true
);
}
changes.replaceNode(file, selection, factory.createTypeReferenceNode(name, typeParameters.map((id) => factory.createTypeReferenceNode(
id.name,
/*typeArguments*/
void 0
))));
}
function getEnclosingNode(node, isJS) {
return findAncestor(node, isStatement) || (isJS ? findAncestor(node, isJSDoc) : void 0);
}
// src/services/refactors/helpers.ts
function isRefactorErrorInfo(info) {
return info.error !== void 0;
}
function refactorKindBeginsWith(known, requested) {
if (!requested)
return true;
return known.substr(0, requested.length) === requested;
}
// src/services/refactors/moveToNewFile.ts
var refactorName4 = "Move to a new file";
var description = getLocaleSpecificMessage(Diagnostics.Move_to_a_new_file);
var moveToNewFileAction = {
name: refactorName4,
description,
kind: "refactor.move.newFile"
};
registerRefactor(refactorName4, {
kinds: [moveToNewFileAction.kind],
getAvailableActions: function getRefactorActionsToMoveToNewFile(context) {
const statements = getStatementsToMove(context);
if (context.preferences.allowTextChangesInNewFiles && statements) {
return [{ name: refactorName4, description, actions: [moveToNewFileAction] }];
}
if (context.preferences.provideRefactorNotApplicableReason) {
return [{
name: refactorName4,
description,
actions: [{ ...moveToNewFileAction, notApplicableReason: getLocaleSpecificMessage(Diagnostics.Selection_is_not_a_valid_statement_or_statements) }]
}];
}
return emptyArray;
},
getEditsForAction: function getRefactorEditsToMoveToNewFile(context, actionName2) {
Debug.assert(actionName2 === refactorName4, "Wrong refactor invoked");
const statements = Debug.checkDefined(getStatementsToMove(context));
const edits = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange3(context.file, context.program, statements, t, context.host, context.preferences, context));
return { edits, renameFilename: void 0, renameLocation: void 0 };
}
});
function doChange3(oldFile, program, toMove, changes, host, preferences, context) {
const checker = program.getTypeChecker();
const usage = getUsageInfo(oldFile, toMove.all, checker);
const newFilename = createNewFileName(oldFile, program, context, host);
changes.createNewFile(oldFile, newFilename, getNewStatementsAndRemoveFromOldFile(oldFile, usage, changes, toMove, program, host, newFilename, preferences));
addNewFileToTsconfig(program, changes, oldFile.fileName, newFilename, hostGetCanonicalFileName(host));
}
function getNewStatementsAndRemoveFromOldFile(oldFile, usage, changes, toMove, program, host, newFilename, preferences) {
const checker = program.getTypeChecker();
const prologueDirectives = takeWhile(oldFile.statements, isPrologueDirective);
if (oldFile.externalModuleIndicator === void 0 && oldFile.commonJsModuleIndicator === void 0 && usage.oldImportsNeededByTargetFile.size === 0) {
deleteMovedStatements(oldFile, toMove.ranges, changes);
return [...prologueDirectives, ...toMove.all];
}
const useEsModuleSyntax = !fileShouldUseJavaScriptRequire(newFilename, program, host, !!oldFile.commonJsModuleIndicator);
const quotePreference = getQuotePreference(oldFile, preferences);
const importsFromNewFile = createOldFileImportsFromTargetFile(oldFile, usage.oldFileImportsFromTargetFile, newFilename, program, host, useEsModuleSyntax, quotePreference);
if (importsFromNewFile) {
insertImports(
changes,
oldFile,
importsFromNewFile,
/*blankLineBetween*/
true,
preferences
);
}
deleteUnusedOldImports(oldFile, toMove.all, changes, usage.unusedImportsFromOldFile, checker);
deleteMovedStatements(oldFile, toMove.ranges, changes);
updateImportsInOtherFiles(changes, program, host, oldFile, usage.movedSymbols, newFilename, quotePreference);
const imports = getNewFileImportsAndAddExportInOldFile(oldFile, usage.oldImportsNeededByTargetFile, usage.targetFileImportsFromOldFile, changes, checker, program, host, useEsModuleSyntax, quotePreference);
const body = addExports(oldFile, toMove.all, usage.oldFileImportsFromTargetFile, useEsModuleSyntax);
if (imports.length && body.length) {
return [
...prologueDirectives,
...imports,
4 /* NewLineTrivia */,
...body
];
}
return [
...prologueDirectives,
...imports,
...body
];
}
function getNewFileImportsAndAddExportInOldFile(oldFile, importsToCopy, newFileImportsFromOldFile, changes, checker, program, host, useEsModuleSyntax, quotePreference) {
const copiedOldImports = [];
for (const oldStatement of oldFile.statements) {
forEachImportInStatement(oldStatement, (i) => {
append(copiedOldImports, filterImport(i, moduleSpecifierFromImport(i), (name) => importsToCopy.has(checker.getSymbolAtLocation(name))));
});
}
let oldFileDefault;
const oldFileNamedImports = [];
const markSeenTop = nodeSeenTracker();
newFileImportsFromOldFile.forEach((symbol) => {
if (!symbol.declarations) {
return;
}
for (const decl of symbol.declarations) {
if (!isTopLevelDeclaration(decl))
continue;
const name = nameOfTopLevelDeclaration(decl);
if (!name)
continue;
const top = getTopLevelDeclarationStatement(decl);
if (markSeenTop(top)) {
addExportToChanges(oldFile, top, name, changes, useEsModuleSyntax);
}
if (hasSyntacticModifier(decl, 1024 /* Default */)) {
oldFileDefault = name;
} else {
oldFileNamedImports.push(name.text);
}
}
});
append(copiedOldImports, makeImportOrRequire(oldFile, oldFileDefault, oldFileNamedImports, getBaseFileName(oldFile.fileName), program, host, useEsModuleSyntax, quotePreference));
return copiedOldImports;
}
// src/services/refactors/moveToFile.ts
var refactorNameForMoveToFile = "Move to file";
var description2 = getLocaleSpecificMessage(Diagnostics.Move_to_file);
var moveToFileAction = {
name: "Move to file",
description: description2,
kind: "refactor.move.file"
};
registerRefactor(refactorNameForMoveToFile, {
kinds: [moveToFileAction.kind],
getAvailableActions: function getRefactorActionsToMoveToFile(context, interactiveRefactorArguments) {
const statements = getStatementsToMove(context);
if (!interactiveRefactorArguments) {
return emptyArray;
}
if (context.preferences.allowTextChangesInNewFiles && statements) {
return [{ name: refactorNameForMoveToFile, description: description2, actions: [moveToFileAction] }];
}
if (context.preferences.provideRefactorNotApplicableReason) {
return [{
name: refactorNameForMoveToFile,
description: description2,
actions: [{ ...moveToFileAction, notApplicableReason: getLocaleSpecificMessage(Diagnostics.Selection_is_not_a_valid_statement_or_statements) }]
}];
}
return emptyArray;
},
getEditsForAction: function getRefactorEditsToMoveToFile(context, actionName2, interactiveRefactorArguments) {
Debug.assert(actionName2 === refactorNameForMoveToFile, "Wrong refactor invoked");
const statements = Debug.checkDefined(getStatementsToMove(context));
Debug.assert(interactiveRefactorArguments, "No interactive refactor arguments available");
const targetFile = interactiveRefactorArguments.targetFile;
if (hasJSFileExtension(targetFile) || hasTSFileExtension(targetFile)) {
const edits = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange4(context, context.file, interactiveRefactorArguments.targetFile, context.program, statements, t, context.host, context.preferences));
return { edits, renameFilename: void 0, renameLocation: void 0 };
}
return { edits: [], renameFilename: void 0, renameLocation: void 0, notApplicableReason: getLocaleSpecificMessage(Diagnostics.Cannot_move_to_file_selected_file_is_invalid) };
}
});
function doChange4(context, oldFile, targetFile, program, toMove, changes, host, preferences) {
const checker = program.getTypeChecker();
const usage = getUsageInfo(oldFile, toMove.all, checker);
if (!host.fileExists(targetFile)) {
changes.createNewFile(oldFile, targetFile, getNewStatementsAndRemoveFromOldFile2(oldFile, targetFile, usage, changes, toMove, program, host, preferences));
addNewFileToTsconfig(program, changes, oldFile.fileName, targetFile, hostGetCanonicalFileName(host));
} else {
const targetSourceFile = Debug.checkDefined(program.getSourceFile(targetFile));
const importAdder = ts_codefix_exports.createImportAdder(targetSourceFile, context.program, context.preferences, context.host);
getNewStatementsAndRemoveFromOldFile2(oldFile, targetSourceFile, usage, changes, toMove, program, host, preferences, importAdder);
}
}
function getNewStatementsAndRemoveFromOldFile2(oldFile, targetFile, usage, changes, toMove, program, host, preferences, importAdder) {
const checker = program.getTypeChecker();
const prologueDirectives = takeWhile(oldFile.statements, isPrologueDirective);
if (oldFile.externalModuleIndicator === void 0 && oldFile.commonJsModuleIndicator === void 0 && usage.oldImportsNeededByTargetFile.size === 0 && usage.targetFileImportsFromOldFile.size === 0 && typeof targetFile === "string") {
deleteMovedStatements(oldFile, toMove.ranges, changes);
return [...prologueDirectives, ...toMove.all];
}
const targetFileName = typeof targetFile === "string" ? targetFile : targetFile.fileName;
const useEsModuleSyntax = !fileShouldUseJavaScriptRequire(targetFileName, program, host, !!oldFile.commonJsModuleIndicator);
const quotePreference = getQuotePreference(oldFile, preferences);
const importsFromTargetFile = createOldFileImportsFromTargetFile(oldFile, usage.oldFileImportsFromTargetFile, targetFileName, program, host, useEsModuleSyntax, quotePreference);
if (importsFromTargetFile) {
insertImports(
changes,
oldFile,
importsFromTargetFile,
/*blankLineBetween*/
true,
preferences
);
}
deleteUnusedOldImports(oldFile, toMove.all, changes, usage.unusedImportsFromOldFile, checker);
deleteMovedStatements(oldFile, toMove.ranges, changes);
updateImportsInOtherFiles(changes, program, host, oldFile, usage.movedSymbols, targetFileName, quotePreference);
const imports = getTargetFileImportsAndAddExportInOldFile(oldFile, targetFileName, usage.oldImportsNeededByTargetFile, usage.targetFileImportsFromOldFile, changes, checker, program, host, useEsModuleSyntax, quotePreference, importAdder);
const body = addExports(oldFile, toMove.all, usage.oldFileImportsFromTargetFile, useEsModuleSyntax);
if (typeof targetFile !== "string") {
if (targetFile.statements.length > 0) {
changes.insertNodesAfter(targetFile, targetFile.statements[targetFile.statements.length - 1], body);
} else {
changes.insertNodesAtEndOfFile(
targetFile,
body,
/*blankLineBetween*/
false
);
}
if (imports.length > 0) {
insertImports(
changes,
targetFile,
imports,
/*blankLineBetween*/
true,
preferences
);
}
}
if (importAdder) {
importAdder.writeFixes(changes);
}
if (imports.length && body.length) {
return [
...prologueDirectives,
...imports,
4 /* NewLineTrivia */,
...body
];
}
return [
...prologueDirectives,
...imports,
...body
];
}
function getTargetFileImportsAndAddExportInOldFile(oldFile, targetFile, importsToCopy, targetFileImportsFromOldFile, changes, checker, program, host, useEsModuleSyntax, quotePreference, importAdder) {
const copiedOldImports = [];
if (importAdder) {
importsToCopy.forEach((isValidTypeOnlyUseSite, symbol) => {
try {
importAdder.addImportFromExportedSymbol(skipAlias(symbol, checker), isValidTypeOnlyUseSite);
} catch {
for (const oldStatement of oldFile.statements) {
forEachImportInStatement(oldStatement, (i) => {
append(copiedOldImports, filterImport(i, factory.createStringLiteral(moduleSpecifierFromImport(i).text), (name) => importsToCopy.has(checker.getSymbolAtLocation(name))));
});
}
}
});
} else {
const targetSourceFile = program.getSourceFile(targetFile);
for (const oldStatement of oldFile.statements) {
forEachImportInStatement(oldStatement, (i) => {
var _a, _b;
const moduleSpecifier = moduleSpecifierFromImport(i);
const resolved = (_a = oldFile.resolvedModules) == null ? void 0 : _a.get(moduleSpecifier.text, getModeForUsageLocation(oldFile, moduleSpecifier));
const fileName = (_b = resolved == null ? void 0 : resolved.resolvedModule) == null ? void 0 : _b.resolvedFileName;
if (fileName && targetSourceFile) {
const newModuleSpecifier = getModuleSpecifier(program.getCompilerOptions(), targetSourceFile, targetSourceFile.path, fileName, createModuleSpecifierResolutionHost(program, host));
append(copiedOldImports, filterImport(i, makeStringLiteral(newModuleSpecifier, quotePreference), (name) => importsToCopy.has(checker.getSymbolAtLocation(name))));
} else {
append(copiedOldImports, filterImport(i, factory.createStringLiteral(moduleSpecifierFromImport(i).text), (name) => importsToCopy.has(checker.getSymbolAtLocation(name))));
}
});
}
}
const targetFileSourceFile = program.getSourceFile(targetFile);
let oldFileDefault;
const oldFileNamedImports = [];
const markSeenTop = nodeSeenTracker();
targetFileImportsFromOldFile.forEach((symbol) => {
if (!symbol.declarations) {
return;
}
for (const decl of symbol.declarations) {
if (!isTopLevelDeclaration(decl))
continue;
const name = nameOfTopLevelDeclaration(decl);
if (!name)
continue;
const top = getTopLevelDeclarationStatement(decl);
if (markSeenTop(top)) {
addExportToChanges(oldFile, top, name, changes, useEsModuleSyntax);
}
if (importAdder && checker.isUnknownSymbol(symbol)) {
importAdder.addImportFromExportedSymbol(skipAlias(symbol, checker));
} else {
if (hasSyntacticModifier(decl, 1024 /* Default */)) {
oldFileDefault = name;
} else {
oldFileNamedImports.push(name.text);
}
}
}
});
return targetFileSourceFile ? append(copiedOldImports, makeImportOrRequire(targetFileSourceFile, oldFileDefault, oldFileNamedImports, oldFile.fileName, program, host, useEsModuleSyntax, quotePreference)) : append(copiedOldImports, makeImportOrRequire(oldFile, oldFileDefault, oldFileNamedImports, oldFile.fileName, program, host, useEsModuleSyntax, quotePreference));
}
function addNewFileToTsconfig(program, changes, oldFileName, newFileNameWithExtension, getCanonicalFileName) {
const cfg = program.getCompilerOptions().configFile;
if (!cfg)
return;
const newFileAbsolutePath = normalizePath(combinePaths(oldFileName, "..", newFileNameWithExtension));
const newFilePath = getRelativePathFromFile(cfg.fileName, newFileAbsolutePath, getCanonicalFileName);
const cfgObject = cfg.statements[0] && tryCast(cfg.statements[0].expression, isObjectLiteralExpression);
const filesProp = cfgObject && find(cfgObject.properties, (prop) => isPropertyAssignment(prop) && isStringLiteral(prop.name) && prop.name.text === "files");
if (filesProp && isArrayLiteralExpression(filesProp.initializer)) {
changes.insertNodeInListAfter(cfg, last(filesProp.initializer.elements), factory.createStringLiteral(newFilePath), filesProp.initializer.elements);
}
}
function deleteMovedStatements(sourceFile, moved, changes) {
for (const { first: first2, afterLast } of moved) {
changes.deleteNodeRangeExcludingEnd(sourceFile, first2, afterLast);
}
}
function deleteUnusedOldImports(oldFile, toMove, changes, toDelete, checker) {
for (const statement of oldFile.statements) {
if (contains(toMove, statement))
continue;
forEachImportInStatement(statement, (i) => deleteUnusedImports(oldFile, i, changes, (name) => toDelete.has(checker.getSymbolAtLocation(name))));
}
}
function updateImportsInOtherFiles(changes, program, host, oldFile, movedSymbols, targetFileName, quotePreference) {
const checker = program.getTypeChecker();
for (const sourceFile of program.getSourceFiles()) {
if (sourceFile === oldFile)
continue;
for (const statement of sourceFile.statements) {
forEachImportInStatement(statement, (importNode) => {
if (checker.getSymbolAtLocation(moduleSpecifierFromImport(importNode)) !== oldFile.symbol)
return;
const shouldMove = (name) => {
const symbol = isBindingElement(name.parent) ? getPropertySymbolFromBindingElement(checker, name.parent) : skipAlias(checker.getSymbolAtLocation(name), checker);
return !!symbol && movedSymbols.has(symbol);
};
deleteUnusedImports(sourceFile, importNode, changes, shouldMove);
const pathToTargetFileWithExtension = resolvePath(getDirectoryPath(oldFile.path), targetFileName);
const newModuleSpecifier = getModuleSpecifier(program.getCompilerOptions(), sourceFile, sourceFile.path, pathToTargetFileWithExtension, createModuleSpecifierResolutionHost(program, host));
const newImportDeclaration = filterImport(importNode, makeStringLiteral(newModuleSpecifier, quotePreference), shouldMove);
if (newImportDeclaration)
changes.insertNodeAfter(sourceFile, statement, newImportDeclaration);
const ns = getNamespaceLikeImport(importNode);
if (ns)
updateNamespaceLikeImport(changes, sourceFile, checker, movedSymbols, newModuleSpecifier, ns, importNode, quotePreference);
});
}
}
}
function getNamespaceLikeImport(node) {
switch (node.kind) {
case 271 /* ImportDeclaration */:
return node.importClause && node.importClause.namedBindings && node.importClause.namedBindings.kind === 273 /* NamespaceImport */ ? node.importClause.namedBindings.name : void 0;
case 270 /* ImportEqualsDeclaration */:
return node.name;
case 259 /* VariableDeclaration */:
return tryCast(node.name, isIdentifier);
default:
return Debug.assertNever(node, `Unexpected node kind ${node.kind}`);
}
}
function updateNamespaceLikeImport(changes, sourceFile, checker, movedSymbols, newModuleSpecifier, oldImportId, oldImportNode, quotePreference) {
const preferredNewNamespaceName = ts_codefix_exports.moduleSpecifierToValidIdentifier(newModuleSpecifier, 99 /* ESNext */);
let needUniqueName = false;
const toChange = [];
ts_FindAllReferences_exports.Core.eachSymbolReferenceInFile(oldImportId, checker, sourceFile, (ref) => {
if (!isPropertyAccessExpression(ref.parent))
return;
needUniqueName = needUniqueName || !!checker.resolveName(
preferredNewNamespaceName,
ref,
67108863 /* All */,
/*excludeGlobals*/
true
);
if (movedSymbols.has(checker.getSymbolAtLocation(ref.parent.name))) {
toChange.push(ref);
}
});
if (toChange.length) {
const newNamespaceName = needUniqueName ? getUniqueName(preferredNewNamespaceName, sourceFile) : preferredNewNamespaceName;
for (const ref of toChange) {
changes.replaceNode(sourceFile, ref, factory.createIdentifier(newNamespaceName));
}
changes.insertNodeAfter(sourceFile, oldImportNode, updateNamespaceLikeImportNode(oldImportNode, preferredNewNamespaceName, newModuleSpecifier, quotePreference));
}
}
function updateNamespaceLikeImportNode(node, newNamespaceName, newModuleSpecifier, quotePreference) {
const newNamespaceId = factory.createIdentifier(newNamespaceName);
const newModuleString = makeStringLiteral(newModuleSpecifier, quotePreference);
switch (node.kind) {
case 271 /* ImportDeclaration */:
return factory.createImportDeclaration(
/*modifiers*/
void 0,
factory.createImportClause(
/*isTypeOnly*/
false,
/*name*/
void 0,
factory.createNamespaceImport(newNamespaceId)
),
newModuleString,
/*assertClause*/
void 0
);
case 270 /* ImportEqualsDeclaration */:
return factory.createImportEqualsDeclaration(
/*modifiers*/
void 0,
/*isTypeOnly*/
false,
newNamespaceId,
factory.createExternalModuleReference(newModuleString)
);
case 259 /* VariableDeclaration */:
return factory.createVariableDeclaration(
newNamespaceId,
/*exclamationToken*/
void 0,
/*type*/
void 0,
createRequireCall(newModuleString)
);
default:
return Debug.assertNever(node, `Unexpected node kind ${node.kind}`);
}
}
function createRequireCall(moduleSpecifier) {
return factory.createCallExpression(
factory.createIdentifier("require"),
/*typeArguments*/
void 0,
[moduleSpecifier]
);
}
function moduleSpecifierFromImport(i) {
return i.kind === 271 /* ImportDeclaration */ ? i.moduleSpecifier : i.kind === 270 /* ImportEqualsDeclaration */ ? i.moduleReference.expression : i.initializer.arguments[0];
}
function forEachImportInStatement(statement, cb) {
if (isImportDeclaration(statement)) {
if (isStringLiteral(statement.moduleSpecifier))
cb(statement);
} else if (isImportEqualsDeclaration(statement)) {
if (isExternalModuleReference(statement.moduleReference) && isStringLiteralLike(statement.moduleReference.expression)) {
cb(statement);
}
} else if (isVariableStatement(statement)) {
for (const decl of statement.declarationList.declarations) {
if (decl.initializer && isRequireCall(
decl.initializer,
/*requireStringLiteralLikeArgument*/
true
)) {
cb(decl);
}
}
}
}
function createOldFileImportsFromTargetFile(sourceFile, targetFileNeedExport, targetFileNameWithExtension, program, host, useEs6Imports, quotePreference) {
let defaultImport;
const imports = [];
targetFileNeedExport.forEach((symbol) => {
if (symbol.escapedName === "default" /* Default */) {
defaultImport = factory.createIdentifier(symbolNameNoDefault(symbol));
} else {
imports.push(symbol.name);
}
});
return makeImportOrRequire(sourceFile, defaultImport, imports, targetFileNameWithExtension, program, host, useEs6Imports, quotePreference);
}
function makeImportOrRequire(sourceFile, defaultImport, imports, targetFileNameWithExtension, program, host, useEs6Imports, quotePreference) {
const pathToTargetFile = resolvePath(getDirectoryPath(sourceFile.path), targetFileNameWithExtension);
const pathToTargetFileWithCorrectExtension = getModuleSpecifier(program.getCompilerOptions(), sourceFile, sourceFile.path, pathToTargetFile, createModuleSpecifierResolutionHost(program, host));
if (useEs6Imports) {
const specifiers = imports.map((i) => factory.createImportSpecifier(
/*isTypeOnly*/
false,
/*propertyName*/
void 0,
factory.createIdentifier(i)
));
return makeImportIfNecessary(defaultImport, specifiers, pathToTargetFileWithCorrectExtension, quotePreference);
} else {
Debug.assert(!defaultImport, "No default import should exist");
const bindingElements = imports.map((i) => factory.createBindingElement(
/*dotDotDotToken*/
void 0,
/*propertyName*/
void 0,
i
));
return bindingElements.length ? makeVariableStatement(
factory.createObjectBindingPattern(bindingElements),
/*type*/
void 0,
createRequireCall(makeStringLiteral(pathToTargetFileWithCorrectExtension, quotePreference))
) : void 0;
}
}
function makeVariableStatement(name, type, initializer, flags = 2 /* Const */) {
return factory.createVariableStatement(
/*modifiers*/
void 0,
factory.createVariableDeclarationList([factory.createVariableDeclaration(
name,
/*exclamationToken*/
void 0,
type,
initializer
)], flags)
);
}
function addExports(sourceFile, toMove, needExport, useEs6Exports) {
return flatMap(toMove, (statement) => {
if (isTopLevelDeclarationStatement(statement) && !isExported(sourceFile, statement, useEs6Exports) && forEachTopLevelDeclaration(statement, (d) => {
var _a;
return needExport.has(Debug.checkDefined((_a = tryCast(d, canHaveSymbol)) == null ? void 0 : _a.symbol));
})) {
const exports = addExport(getSynthesizedDeepClone(statement), useEs6Exports);
if (exports)
return exports;
}
return getSynthesizedDeepClone(statement);
});
}
function isExported(sourceFile, decl, useEs6Exports, name) {
var _a;
if (useEs6Exports) {
return !isExpressionStatement(decl) && hasSyntacticModifier(decl, 1 /* Export */) || !!(name && sourceFile.symbol && ((_a = sourceFile.symbol.exports) == null ? void 0 : _a.has(name.escapedText)));
}
return !!sourceFile.symbol && !!sourceFile.symbol.exports && getNamesToExportInCommonJS(decl).some((name2) => sourceFile.symbol.exports.has(escapeLeadingUnderscores(name2)));
}
function deleteUnusedImports(sourceFile, importDecl, changes, isUnused) {
switch (importDecl.kind) {
case 271 /* ImportDeclaration */:
deleteUnusedImportsInDeclaration(sourceFile, importDecl, changes, isUnused);
break;
case 270 /* ImportEqualsDeclaration */:
if (isUnused(importDecl.name)) {
changes.delete(sourceFile, importDecl);
}
break;
case 259 /* VariableDeclaration */:
deleteUnusedImportsInVariableDeclaration(sourceFile, importDecl, changes, isUnused);
break;
default:
Debug.assertNever(importDecl, `Unexpected import decl kind ${importDecl.kind}`);
}
}
function deleteUnusedImportsInDeclaration(sourceFile, importDecl, changes, isUnused) {
if (!importDecl.importClause)
return;
const { name, namedBindings } = importDecl.importClause;
const defaultUnused = !name || isUnused(name);
const namedBindingsUnused = !namedBindings || (namedBindings.kind === 273 /* NamespaceImport */ ? isUnused(namedBindings.name) : namedBindings.elements.length !== 0 && namedBindings.elements.every((e) => isUnused(e.name)));
if (defaultUnused && namedBindingsUnused) {
changes.delete(sourceFile, importDecl);
} else {
if (name && defaultUnused) {
changes.delete(sourceFile, name);
}
if (namedBindings) {
if (namedBindingsUnused) {
changes.replaceNode(
sourceFile,
importDecl.importClause,
factory.updateImportClause(
importDecl.importClause,
importDecl.importClause.isTypeOnly,
name,
/*namedBindings*/
void 0
)
);
} else if (namedBindings.kind === 274 /* NamedImports */) {
for (const element of namedBindings.elements) {
if (isUnused(element.name))
changes.delete(sourceFile, element);
}
}
}
}
}
function deleteUnusedImportsInVariableDeclaration(sourceFile, varDecl, changes, isUnused) {
const { name } = varDecl;
switch (name.kind) {
case 80 /* Identifier */:
if (isUnused(name)) {
if (varDecl.initializer && isRequireCall(
varDecl.initializer,
/*requireStringLiteralLikeArgument*/
true
)) {
changes.delete(
sourceFile,
isVariableDeclarationList(varDecl.parent) && length(varDecl.parent.declarations) === 1 ? varDecl.parent.parent : varDecl
);
} else {
changes.delete(sourceFile, name);
}
}
break;
case 206 /* ArrayBindingPattern */:
break;
case 205 /* ObjectBindingPattern */:
if (name.elements.every((e) => isIdentifier(e.name) && isUnused(e.name))) {
changes.delete(
sourceFile,
isVariableDeclarationList(varDecl.parent) && varDecl.parent.declarations.length === 1 ? varDecl.parent.parent : varDecl
);
} else {
for (const element of name.elements) {
if (isIdentifier(element.name) && isUnused(element.name)) {
changes.delete(sourceFile, element.name);
}
}
}
break;
}
}
function isTopLevelDeclarationStatement(node) {
Debug.assert(isSourceFile(node.parent), "Node parent should be a SourceFile");
return isNonVariableTopLevelDeclaration(node) || isVariableStatement(node);
}
function addExport(decl, useEs6Exports) {
return useEs6Exports ? [addEs6Export(decl)] : addCommonjsExport(decl);
}
function addEs6Export(d) {
const modifiers = canHaveModifiers(d) ? concatenate([factory.createModifier(95 /* ExportKeyword */)], getModifiers(d)) : void 0;
switch (d.kind) {
case 261 /* FunctionDeclaration */:
return factory.updateFunctionDeclaration(d, modifiers, d.asteriskToken, d.name, d.typeParameters, d.parameters, d.type, d.body);
case 262 /* ClassDeclaration */:
const decorators = canHaveDecorators(d) ? getDecorators(d) : void 0;
return factory.updateClassDeclaration(d, concatenate(decorators, modifiers), d.name, d.typeParameters, d.heritageClauses, d.members);
case 242 /* VariableStatement */:
return factory.updateVariableStatement(d, modifiers, d.declarationList);
case 266 /* ModuleDeclaration */:
return factory.updateModuleDeclaration(d, modifiers, d.name, d.body);
case 265 /* EnumDeclaration */:
return factory.updateEnumDeclaration(d, modifiers, d.name, d.members);
case 264 /* TypeAliasDeclaration */:
return factory.updateTypeAliasDeclaration(d, modifiers, d.name, d.typeParameters, d.type);
case 263 /* InterfaceDeclaration */:
return factory.updateInterfaceDeclaration(d, modifiers, d.name, d.typeParameters, d.heritageClauses, d.members);
case 270 /* ImportEqualsDeclaration */:
return factory.updateImportEqualsDeclaration(d, modifiers, d.isTypeOnly, d.name, d.moduleReference);
case 243 /* ExpressionStatement */:
return Debug.fail();
default:
return Debug.assertNever(d, `Unexpected declaration kind ${d.kind}`);
}
}
function addCommonjsExport(decl) {
return [decl, ...getNamesToExportInCommonJS(decl).map(createExportAssignment)];
}
function createExportAssignment(name) {
return factory.createExpressionStatement(
factory.createBinaryExpression(
factory.createPropertyAccessExpression(factory.createIdentifier("exports"), factory.createIdentifier(name)),
64 /* EqualsToken */,
factory.createIdentifier(name)
)
);
}
function getNamesToExportInCommonJS(decl) {
switch (decl.kind) {
case 261 /* FunctionDeclaration */:
case 262 /* ClassDeclaration */:
return [decl.name.text];
case 242 /* VariableStatement */:
return mapDefined(decl.declarationList.declarations, (d) => isIdentifier(d.name) ? d.name.text : void 0);
case 266 /* ModuleDeclaration */:
case 265 /* EnumDeclaration */:
case 264 /* TypeAliasDeclaration */:
case 263 /* InterfaceDeclaration */:
case 270 /* ImportEqualsDeclaration */:
return emptyArray;
case 243 /* ExpressionStatement */:
return Debug.fail("Can't export an ExpressionStatement");
default:
return Debug.assertNever(decl, `Unexpected decl kind ${decl.kind}`);
}
}
function filterImport(i, moduleSpecifier, keep) {
switch (i.kind) {
case 271 /* ImportDeclaration */: {
const clause = i.importClause;
if (!clause)
return void 0;
const defaultImport = clause.name && keep(clause.name) ? clause.name : void 0;
const namedBindings = clause.namedBindings && filterNamedBindings(clause.namedBindings, keep);
return defaultImport || namedBindings ? factory.createImportDeclaration(
/*modifiers*/
void 0,
factory.createImportClause(clause.isTypeOnly, defaultImport, namedBindings),
getSynthesizedDeepClone(moduleSpecifier),
/*assertClause*/
void 0
) : void 0;
}
case 270 /* ImportEqualsDeclaration */:
return keep(i.name) ? i : void 0;
case 259 /* VariableDeclaration */: {
const name = filterBindingName(i.name, keep);
return name ? makeVariableStatement(name, i.type, createRequireCall(moduleSpecifier), i.parent.flags) : void 0;
}
default:
return Debug.assertNever(i, `Unexpected import kind ${i.kind}`);
}
}
function filterNamedBindings(namedBindings, keep) {
if (namedBindings.kind === 273 /* NamespaceImport */) {
return keep(namedBindings.name) ? namedBindings : void 0;
} else {
const newElements = namedBindings.elements.filter((e) => keep(e.name));
return newElements.length ? factory.createNamedImports(newElements) : void 0;
}
}
function filterBindingName(name, keep) {
switch (name.kind) {
case 80 /* Identifier */:
return keep(name) ? name : void 0;
case 206 /* ArrayBindingPattern */:
return name;
case 205 /* ObjectBindingPattern */: {
const newElements = name.elements.filter((prop) => prop.propertyName || !isIdentifier(prop.name) || keep(prop.name));
return newElements.length ? factory.createObjectBindingPattern(newElements) : void 0;
}
}
}
function nameOfTopLevelDeclaration(d) {
return isExpressionStatement(d) ? tryCast(d.expression.left.name, isIdentifier) : tryCast(d.name, isIdentifier);
}
function getTopLevelDeclarationStatement(d) {
switch (d.kind) {
case 259 /* VariableDeclaration */:
return d.parent.parent;
case 207 /* BindingElement */:
return getTopLevelDeclarationStatement(
cast(d.parent.parent, (p) => isVariableDeclaration(p) || isBindingElement(p))
);
default:
return d;
}
}
function addExportToChanges(sourceFile, decl, name, changes, useEs6Exports) {
if (isExported(sourceFile, decl, useEs6Exports, name))
return;
if (useEs6Exports) {
if (!isExpressionStatement(decl))
changes.insertExportModifier(sourceFile, decl);
} else {
const names = getNamesToExportInCommonJS(decl);
if (names.length !== 0)
changes.insertNodesAfter(sourceFile, decl, names.map(createExportAssignment));
}
}
function createNewFileName(oldFile, program, context, host) {
const checker = program.getTypeChecker();
const toMove = getStatementsToMove(context);
let usage;
if (toMove) {
usage = getUsageInfo(oldFile, toMove.all, checker);
const currentDirectory = getDirectoryPath(oldFile.fileName);
const extension = extensionFromPath(oldFile.fileName);
const newFileName = combinePaths(
// new file is always placed in the same directory as the old file
currentDirectory,
// ensures the filename computed below isn't already taken
makeUniqueFilename(
// infers a name for the new file from the symbols being moved
inferNewFileName(usage.oldFileImportsFromTargetFile, usage.movedSymbols),
extension,
currentDirectory,
host
)
) + extension;
return newFileName;
}
return "";
}
function getRangeToMove(context) {
const { file } = context;
const range = createTextRangeFromSpan(getRefactorContextSpan(context));
const { statements } = file;
const startNodeIndex = findIndex(statements, (s) => s.end > range.pos);
if (startNodeIndex === -1)
return void 0;
const startStatement = statements[startNodeIndex];
if (isNamedDeclaration(startStatement) && startStatement.name && rangeContainsRange(startStatement.name, range)) {
return { toMove: [statements[startNodeIndex]], afterLast: statements[startNodeIndex + 1] };
}
if (range.pos > startStatement.getStart(file))
return void 0;
const afterEndNodeIndex = findIndex(statements, (s) => s.end > range.end, startNodeIndex);
if (afterEndNodeIndex !== -1 && (afterEndNodeIndex === 0 || statements[afterEndNodeIndex].getStart(file) < range.end))
return void 0;
return {
toMove: statements.slice(startNodeIndex, afterEndNodeIndex === -1 ? statements.length : afterEndNodeIndex),
afterLast: afterEndNodeIndex === -1 ? void 0 : statements[afterEndNodeIndex]
};
}
function getStatementsToMove(context) {
const rangeToMove = getRangeToMove(context);
if (rangeToMove === void 0)
return void 0;
const all = [];
const ranges = [];
const { toMove, afterLast } = rangeToMove;
getRangesWhere(toMove, isAllowedStatementToMove, (start2, afterEndIndex) => {
for (let i = start2; i < afterEndIndex; i++)
all.push(toMove[i]);
ranges.push({ first: toMove[start2], afterLast });
});
return all.length === 0 ? void 0 : { all, ranges };
}
function isAllowedStatementToMove(statement) {
return !isPureImport(statement) && !isPrologueDirective(statement);
}
function isPureImport(node) {
switch (node.kind) {
case 271 /* ImportDeclaration */:
return true;
case 270 /* ImportEqualsDeclaration */:
return !hasSyntacticModifier(node, 1 /* Export */);
case 242 /* VariableStatement */:
return node.declarationList.declarations.every((d) => !!d.initializer && isRequireCall(
d.initializer,
/*requireStringLiteralLikeArgument*/
true
));
default:
return false;
}
}
function getUsageInfo(oldFile, toMove, checker) {
const movedSymbols = /* @__PURE__ */ new Set();
const oldImportsNeededByTargetFile = /* @__PURE__ */ new Map();
const targetFileImportsFromOldFile = /* @__PURE__ */ new Set();
const containsJsx = find(toMove, (statement) => !!(statement.transformFlags & 2 /* ContainsJsx */));
const jsxNamespaceSymbol = getJsxNamespaceSymbol(containsJsx);
if (jsxNamespaceSymbol) {
oldImportsNeededByTargetFile.set(jsxNamespaceSymbol, false);
}
for (const statement of toMove) {
forEachTopLevelDeclaration(statement, (decl) => {
movedSymbols.add(Debug.checkDefined(isExpressionStatement(decl) ? checker.getSymbolAtLocation(decl.expression.left) : decl.symbol, "Need a symbol here"));
});
}
for (const statement of toMove) {
forEachReference(statement, checker, (symbol, isValidTypeOnlyUseSite) => {
if (!symbol.declarations)
return;
for (const decl of symbol.declarations) {
if (isInImport(decl)) {
const prevIsTypeOnly = oldImportsNeededByTargetFile.get(symbol);
oldImportsNeededByTargetFile.set(symbol, prevIsTypeOnly === void 0 ? isValidTypeOnlyUseSite : prevIsTypeOnly && isValidTypeOnlyUseSite);
} else if (isTopLevelDeclaration(decl) && sourceFileOfTopLevelDeclaration(decl) === oldFile && !movedSymbols.has(symbol)) {
targetFileImportsFromOldFile.add(symbol);
}
}
});
}
const unusedImportsFromOldFile = new Set(oldImportsNeededByTargetFile.keys());
const oldFileImportsFromTargetFile = /* @__PURE__ */ new Set();
for (const statement of oldFile.statements) {
if (contains(toMove, statement))
continue;
if (jsxNamespaceSymbol && !!(statement.transformFlags & 2 /* ContainsJsx */)) {
unusedImportsFromOldFile.delete(jsxNamespaceSymbol);
}
forEachReference(statement, checker, (symbol) => {
if (movedSymbols.has(symbol))
oldFileImportsFromTargetFile.add(symbol);
unusedImportsFromOldFile.delete(symbol);
});
}
return { movedSymbols, targetFileImportsFromOldFile, oldFileImportsFromTargetFile, oldImportsNeededByTargetFile, unusedImportsFromOldFile };
function getJsxNamespaceSymbol(containsJsx2) {
if (containsJsx2 === void 0) {
return void 0;
}
const jsxNamespace = checker.getJsxNamespace(containsJsx2);
const jsxNamespaceSymbol2 = checker.resolveName(
jsxNamespace,
containsJsx2,
1920 /* Namespace */,
/*excludeGlobals*/
true
);
return !!jsxNamespaceSymbol2 && some(jsxNamespaceSymbol2.declarations, isInImport) ? jsxNamespaceSymbol2 : void 0;
}
}
function makeUniqueFilename(proposedFilename, extension, inDirectory, host) {
let newFilename = proposedFilename;
for (let i = 1; ; i++) {
const name = combinePaths(inDirectory, newFilename + extension);
if (!host.fileExists(name))
return newFilename;
newFilename = `${proposedFilename}.${i}`;
}
}
function inferNewFileName(importsFromNewFile, movedSymbols) {
return forEachKey(importsFromNewFile, symbolNameNoDefault) || forEachKey(movedSymbols, symbolNameNoDefault) || "newFile";
}
function forEachReference(node, checker, onReference) {
node.forEachChild(function cb(node2) {
if (isIdentifier(node2) && !isDeclarationName(node2)) {
const sym = checker.getSymbolAtLocation(node2);
if (sym)
onReference(sym, isValidTypeOnlyAliasUseSite(node2));
} else {
node2.forEachChild(cb);
}
});
}
function forEachTopLevelDeclaration(statement, cb) {
switch (statement.kind) {
case 261 /* FunctionDeclaration */:
case 262 /* ClassDeclaration */:
case 266 /* ModuleDeclaration */:
case 265 /* EnumDeclaration */:
case 264 /* TypeAliasDeclaration */:
case 263 /* InterfaceDeclaration */:
case 270 /* ImportEqualsDeclaration */:
return cb(statement);
case 242 /* VariableStatement */:
return firstDefined(statement.declarationList.declarations, (decl) => forEachTopLevelDeclarationInBindingName(decl.name, cb));
case 243 /* ExpressionStatement */: {
const { expression } = statement;
return isBinaryExpression(expression) && getAssignmentDeclarationKind(expression) === 1 /* ExportsProperty */ ? cb(statement) : void 0;
}
}
}
function isInImport(decl) {
switch (decl.kind) {
case 270 /* ImportEqualsDeclaration */:
case 275 /* ImportSpecifier */:
case 272 /* ImportClause */:
case 273 /* NamespaceImport */:
return true;
case 259 /* VariableDeclaration */:
return isVariableDeclarationInImport(decl);
case 207 /* BindingElement */:
return isVariableDeclaration(decl.parent.parent) && isVariableDeclarationInImport(decl.parent.parent);
default:
return false;
}
}
function isVariableDeclarationInImport(decl) {
return isSourceFile(decl.parent.parent.parent) && !!decl.initializer && isRequireCall(
decl.initializer,
/*requireStringLiteralLikeArgument*/
true
);
}
function isTopLevelDeclaration(node) {
return isNonVariableTopLevelDeclaration(node) && isSourceFile(node.parent) || isVariableDeclaration(node) && isSourceFile(node.parent.parent.parent);
}
function sourceFileOfTopLevelDeclaration(node) {
return isVariableDeclaration(node) ? node.parent.parent.parent : node.parent;
}
function forEachTopLevelDeclarationInBindingName(name, cb) {
switch (name.kind) {
case 80 /* Identifier */:
return cb(cast(name.parent, (x) => isVariableDeclaration(x) || isBindingElement(x)));
case 206 /* ArrayBindingPattern */:
case 205 /* ObjectBindingPattern */:
return firstDefined(name.elements, (em) => isOmittedExpression(em) ? void 0 : forEachTopLevelDeclarationInBindingName(em.name, cb));
default:
return Debug.assertNever(name, `Unexpected name kind ${name.kind}`);
}
}
function isNonVariableTopLevelDeclaration(node) {
switch (node.kind) {
case 261 /* FunctionDeclaration */:
case 262 /* ClassDeclaration */:
case 266 /* ModuleDeclaration */:
case 265 /* EnumDeclaration */:
case 264 /* TypeAliasDeclaration */:
case 263 /* InterfaceDeclaration */:
case 270 /* ImportEqualsDeclaration */:
return true;
default:
return false;
}
}
// src/services/_namespaces/ts.refactor.addOrRemoveBracesToArrowFunction.ts
var ts_refactor_addOrRemoveBracesToArrowFunction_exports = {};
// src/services/refactors/convertOverloadListToSingleSignature.ts
var refactorName5 = "Convert overload list to single signature";
var refactorDescription = Diagnostics.Convert_overload_list_to_single_signature.message;
var functionOverloadAction = {
name: refactorName5,
description: refactorDescription,
kind: "refactor.rewrite.function.overloadList"
};
registerRefactor(refactorName5, {
kinds: [functionOverloadAction.kind],
getEditsForAction: getRefactorEditsToConvertOverloadsToOneSignature,
getAvailableActions: getRefactorActionsToConvertOverloadsToOneSignature
});
function getRefactorActionsToConvertOverloadsToOneSignature(context) {
const { file, startPosition, program } = context;
const info = getConvertableOverloadListAtPosition(file, startPosition, program);
if (!info)
return emptyArray;
return [{
name: refactorName5,
description: refactorDescription,
actions: [functionOverloadAction]
}];
}
function getRefactorEditsToConvertOverloadsToOneSignature(context) {
const { file, startPosition, program } = context;
const signatureDecls = getConvertableOverloadListAtPosition(file, startPosition, program);
if (!signatureDecls)
return void 0;
const checker = program.getTypeChecker();
const lastDeclaration = signatureDecls[signatureDecls.length - 1];
let updated = lastDeclaration;
switch (lastDeclaration.kind) {
case 172 /* MethodSignature */: {
updated = factory.updateMethodSignature(
lastDeclaration,
lastDeclaration.modifiers,
lastDeclaration.name,
lastDeclaration.questionToken,
lastDeclaration.typeParameters,
getNewParametersForCombinedSignature(signatureDecls),
lastDeclaration.type
);
break;
}
case 173 /* MethodDeclaration */: {
updated = factory.updateMethodDeclaration(
lastDeclaration,
lastDeclaration.modifiers,
lastDeclaration.asteriskToken,
lastDeclaration.name,
lastDeclaration.questionToken,
lastDeclaration.typeParameters,
getNewParametersForCombinedSignature(signatureDecls),
lastDeclaration.type,
lastDeclaration.body
);
break;
}
case 178 /* CallSignature */: {
updated = factory.updateCallSignature(
lastDeclaration,
lastDeclaration.typeParameters,
getNewParametersForCombinedSignature(signatureDecls),
lastDeclaration.type
);
break;
}
case 175 /* Constructor */: {
updated = factory.updateConstructorDeclaration(
lastDeclaration,
lastDeclaration.modifiers,
getNewParametersForCombinedSignature(signatureDecls),
lastDeclaration.body
);
break;
}
case 179 /* ConstructSignature */: {
updated = factory.updateConstructSignature(
lastDeclaration,
lastDeclaration.typeParameters,
getNewParametersForCombinedSignature(signatureDecls),
lastDeclaration.type
);
break;
}
case 261 /* FunctionDeclaration */: {
updated = factory.updateFunctionDeclaration(
lastDeclaration,
lastDeclaration.modifiers,
lastDeclaration.asteriskToken,
lastDeclaration.name,
lastDeclaration.typeParameters,
getNewParametersForCombinedSignature(signatureDecls),
lastDeclaration.type,
lastDeclaration.body
);
break;
}
default:
return Debug.failBadSyntaxKind(lastDeclaration, "Unhandled signature kind in overload list conversion refactoring");
}
if (updated === lastDeclaration) {
return;
}
const edits = ts_textChanges_exports.ChangeTracker.with(context, (t) => {
t.replaceNodeRange(file, signatureDecls[0], signatureDecls[signatureDecls.length - 1], updated);
});
return { renameFilename: void 0, renameLocation: void 0, edits };
function getNewParametersForCombinedSignature(signatureDeclarations) {
const lastSig = signatureDeclarations[signatureDeclarations.length - 1];
if (isFunctionLikeDeclaration(lastSig) && lastSig.body) {
signatureDeclarations = signatureDeclarations.slice(0, signatureDeclarations.length - 1);
}
return factory.createNodeArray([
factory.createParameterDeclaration(
/*modifiers*/
void 0,
factory.createToken(26 /* DotDotDotToken */),
"args",
/*questionToken*/
void 0,
factory.createUnionTypeNode(map(signatureDeclarations, convertSignatureParametersToTuple))
)
]);
}
function convertSignatureParametersToTuple(decl) {
const members = map(decl.parameters, convertParameterToNamedTupleMember);
return setEmitFlags(factory.createTupleTypeNode(members), some(members, (m) => !!length(getSyntheticLeadingComments(m))) ? 0 /* None */ : 1 /* SingleLine */);
}
function convertParameterToNamedTupleMember(p) {
Debug.assert(isIdentifier(p.name));
const result = setTextRange(factory.createNamedTupleMember(
p.dotDotDotToken,
p.name,
p.questionToken,
p.type || factory.createKeywordTypeNode(133 /* AnyKeyword */)
), p);
const parameterDocComment = p.symbol && p.symbol.getDocumentationComment(checker);
if (parameterDocComment) {
const newComment = displayPartsToString(parameterDocComment);
if (newComment.length) {
setSyntheticLeadingComments(result, [{
text: `*
${newComment.split("\n").map((c) => ` * ${c}`).join("\n")}
`,
kind: 3 /* MultiLineCommentTrivia */,
pos: -1,
end: -1,
hasTrailingNewLine: true,
hasLeadingNewline: true
}]);
}
}
return result;
}
}
function isConvertableSignatureDeclaration(d) {
switch (d.kind) {
case 172 /* MethodSignature */:
case 173 /* MethodDeclaration */:
case 178 /* CallSignature */:
case 175 /* Constructor */:
case 179 /* ConstructSignature */:
case 261 /* FunctionDeclaration */:
return true;
}
return false;
}
function getConvertableOverloadListAtPosition(file, startPosition, program) {
const node = getTokenAtPosition(file, startPosition);
const containingDecl = findAncestor(node, isConvertableSignatureDeclaration);
if (!containingDecl) {
return;
}
if (isFunctionLikeDeclaration(containingDecl) && containingDecl.body && rangeContainsPosition(containingDecl.body, startPosition)) {
return;
}
const checker = program.getTypeChecker();
const signatureSymbol = containingDecl.symbol;
if (!signatureSymbol) {
return;
}
const decls = signatureSymbol.declarations;
if (length(decls) <= 1) {
return;
}
if (!every(decls, (d) => getSourceFileOfNode(d) === file)) {
return;
}
if (!isConvertableSignatureDeclaration(decls[0])) {
return;
}
const kindOne = decls[0].kind;
if (!every(decls, (d) => d.kind === kindOne)) {
return;
}
const signatureDecls = decls;
if (some(signatureDecls, (d) => !!d.typeParameters || some(d.parameters, (p) => !!p.modifiers || !isIdentifier(p.name)))) {
return;
}
const signatures = mapDefined(signatureDecls, (d) => checker.getSignatureFromDeclaration(d));
if (length(signatures) !== length(decls)) {
return;
}
const returnOne = checker.getReturnTypeOfSignature(signatures[0]);
if (!every(signatures, (s) => checker.getReturnTypeOfSignature(s) === returnOne)) {
return;
}
return signatureDecls;
}
// src/services/refactors/addOrRemoveBracesToArrowFunction.ts
var refactorName6 = "Add or remove braces in an arrow function";
var refactorDescription2 = Diagnostics.Add_or_remove_braces_in_an_arrow_function.message;
var addBracesAction = {
name: "Add braces to arrow function",
description: Diagnostics.Add_braces_to_arrow_function.message,
kind: "refactor.rewrite.arrow.braces.add"
};
var removeBracesAction = {
name: "Remove braces from arrow function",
description: Diagnostics.Remove_braces_from_arrow_function.message,
kind: "refactor.rewrite.arrow.braces.remove"
};
registerRefactor(refactorName6, {
kinds: [removeBracesAction.kind],
getEditsForAction: getRefactorEditsToRemoveFunctionBraces,
getAvailableActions: getRefactorActionsToRemoveFunctionBraces
});
function getRefactorActionsToRemoveFunctionBraces(context) {
const { file, startPosition, triggerReason } = context;
const info = getConvertibleArrowFunctionAtPosition(file, startPosition, triggerReason === "invoked");
if (!info)
return emptyArray;
if (!isRefactorErrorInfo(info)) {
return [{
name: refactorName6,
description: refactorDescription2,
actions: [
info.addBraces ? addBracesAction : removeBracesAction
]
}];
}
if (context.preferences.provideRefactorNotApplicableReason) {
return [{
name: refactorName6,
description: refactorDescription2,
actions: [
{ ...addBracesAction, notApplicableReason: info.error },
{ ...removeBracesAction, notApplicableReason: info.error }
]
}];
}
return emptyArray;
}
function getRefactorEditsToRemoveFunctionBraces(context, actionName2) {
const { file, startPosition } = context;
const info = getConvertibleArrowFunctionAtPosition(file, startPosition);
Debug.assert(info && !isRefactorErrorInfo(info), "Expected applicable refactor info");
const { expression, returnStatement, func } = info;
let body;
if (actionName2 === addBracesAction.name) {
const returnStatement2 = factory.createReturnStatement(expression);
body = factory.createBlock(
[returnStatement2],
/*multiLine*/
true
);
copyLeadingComments(
expression,
returnStatement2,
file,
3 /* MultiLineCommentTrivia */,
/*hasTrailingNewLine*/
true
);
} else if (actionName2 === removeBracesAction.name && returnStatement) {
const actualExpression = expression || factory.createVoidZero();
body = needsParentheses(actualExpression) ? factory.createParenthesizedExpression(actualExpression) : actualExpression;
copyTrailingAsLeadingComments(
returnStatement,
body,
file,
3 /* MultiLineCommentTrivia */,
/*hasTrailingNewLine*/
false
);
copyLeadingComments(
returnStatement,
body,
file,
3 /* MultiLineCommentTrivia */,
/*hasTrailingNewLine*/
false
);
copyTrailingComments(
returnStatement,
body,
file,
3 /* MultiLineCommentTrivia */,
/*hasTrailingNewLine*/
false
);
} else {
Debug.fail("invalid action");
}
const edits = ts_textChanges_exports.ChangeTracker.with(context, (t) => {
t.replaceNode(file, func.body, body);
});
return { renameFilename: void 0, renameLocation: void 0, edits };
}
function getConvertibleArrowFunctionAtPosition(file, startPosition, considerFunctionBodies = true, kind) {
const node = getTokenAtPosition(file, startPosition);
const func = getContainingFunction(node);
if (!func) {
return {
error: getLocaleSpecificMessage(Diagnostics.Could_not_find_a_containing_arrow_function)
};
}
if (!isArrowFunction(func)) {
return {
error: getLocaleSpecificMessage(Diagnostics.Containing_function_is_not_an_arrow_function)
};
}
if (!rangeContainsRange(func, node) || rangeContainsRange(func.body, node) && !considerFunctionBodies) {
return void 0;
}
if (refactorKindBeginsWith(addBracesAction.kind, kind) && isExpression(func.body)) {
return { func, addBraces: true, expression: func.body };
} else if (refactorKindBeginsWith(removeBracesAction.kind, kind) && isBlock(func.body) && func.body.statements.length === 1) {
const firstStatement = first(func.body.statements);
if (isReturnStatement(firstStatement)) {
return { func, addBraces: false, expression: firstStatement.expression, returnStatement: firstStatement };
}
}
return void 0;
}
// src/services/_namespaces/ts.refactor.convertArrowFunctionOrFunctionExpression.ts
var ts_refactor_convertArrowFunctionOrFunctionExpression_exports = {};
// src/services/refactors/convertArrowFunctionOrFunctionExpression.ts
var refactorName7 = "Convert arrow function or function expression";
var refactorDescription3 = getLocaleSpecificMessage(Diagnostics.Convert_arrow_function_or_function_expression);
var toAnonymousFunctionAction = {
name: "Convert to anonymous function",
description: getLocaleSpecificMessage(Diagnostics.Convert_to_anonymous_function),
kind: "refactor.rewrite.function.anonymous"
};
var toNamedFunctionAction = {
name: "Convert to named function",
description: getLocaleSpecificMessage(Diagnostics.Convert_to_named_function),
kind: "refactor.rewrite.function.named"
};
var toArrowFunctionAction = {
name: "Convert to arrow function",
description: getLocaleSpecificMessage(Diagnostics.Convert_to_arrow_function),
kind: "refactor.rewrite.function.arrow"
};
registerRefactor(refactorName7, {
kinds: [
toAnonymousFunctionAction.kind,
toNamedFunctionAction.kind,
toArrowFunctionAction.kind
],
getEditsForAction: getRefactorEditsToConvertFunctionExpressions,
getAvailableActions: getRefactorActionsToConvertFunctionExpressions
});
function getRefactorActionsToConvertFunctionExpressions(context) {
const { file, startPosition, program, kind } = context;
const info = getFunctionInfo(file, startPosition, program);
if (!info)
return emptyArray;
const { selectedVariableDeclaration, func } = info;
const possibleActions = [];
const errors = [];
if (refactorKindBeginsWith(toNamedFunctionAction.kind, kind)) {
const error = selectedVariableDeclaration || isArrowFunction(func) && isVariableDeclaration(func.parent) ? void 0 : getLocaleSpecificMessage(Diagnostics.Could_not_convert_to_named_function);
if (error) {
errors.push({ ...toNamedFunctionAction, notApplicableReason: error });
} else {
possibleActions.push(toNamedFunctionAction);
}
}
if (refactorKindBeginsWith(toAnonymousFunctionAction.kind, kind)) {
const error = !selectedVariableDeclaration && isArrowFunction(func) ? void 0 : getLocaleSpecificMessage(Diagnostics.Could_not_convert_to_anonymous_function);
if (error) {
errors.push({ ...toAnonymousFunctionAction, notApplicableReason: error });
} else {
possibleActions.push(toAnonymousFunctionAction);
}
}
if (refactorKindBeginsWith(toArrowFunctionAction.kind, kind)) {
const error = isFunctionExpression(func) ? void 0 : getLocaleSpecificMessage(Diagnostics.Could_not_convert_to_arrow_function);
if (error) {
errors.push({ ...toArrowFunctionAction, notApplicableReason: error });
} else {
possibleActions.push(toArrowFunctionAction);
}
}
return [{
name: refactorName7,
description: refactorDescription3,
actions: possibleActions.length === 0 && context.preferences.provideRefactorNotApplicableReason ? errors : possibleActions
}];
}
function getRefactorEditsToConvertFunctionExpressions(context, actionName2) {
const { file, startPosition, program } = context;
const info = getFunctionInfo(file, startPosition, program);
if (!info)
return void 0;
const { func } = info;
const edits = [];
switch (actionName2) {
case toAnonymousFunctionAction.name:
edits.push(...getEditInfoForConvertToAnonymousFunction(context, func));
break;
case toNamedFunctionAction.name:
const variableInfo = getVariableInfo(func);
if (!variableInfo)
return void 0;
edits.push(...getEditInfoForConvertToNamedFunction(context, func, variableInfo));
break;
case toArrowFunctionAction.name:
if (!isFunctionExpression(func))
return void 0;
edits.push(...getEditInfoForConvertToArrowFunction(context, func));
break;
default:
return Debug.fail("invalid action");
}
return { renameFilename: void 0, renameLocation: void 0, edits };
}
function containingThis(node) {
let containsThis = false;
node.forEachChild(function checkThis(child) {
if (isThis(child)) {
containsThis = true;
return;
}
if (!isClassLike(child) && !isFunctionDeclaration(child) && !isFunctionExpression(child)) {
forEachChild(child, checkThis);
}
});
return containsThis;
}
function getFunctionInfo(file, startPosition, program) {
const token = getTokenAtPosition(file, startPosition);
const typeChecker = program.getTypeChecker();
const func = tryGetFunctionFromVariableDeclaration(file, typeChecker, token.parent);
if (func && !containingThis(func.body) && !typeChecker.containsArgumentsReference(func)) {
return { selectedVariableDeclaration: true, func };
}
const maybeFunc = getContainingFunction(token);
if (maybeFunc && (isFunctionExpression(maybeFunc) || isArrowFunction(maybeFunc)) && !rangeContainsRange(maybeFunc.body, token) && !containingThis(maybeFunc.body) && !typeChecker.containsArgumentsReference(maybeFunc)) {
if (isFunctionExpression(maybeFunc) && isFunctionReferencedInFile(file, typeChecker, maybeFunc))
return void 0;
return { selectedVariableDeclaration: false, func: maybeFunc };
}
return void 0;
}
function isSingleVariableDeclaration(parent2) {
return isVariableDeclaration(parent2) || isVariableDeclarationList(parent2) && parent2.declarations.length === 1;
}
function tryGetFunctionFromVariableDeclaration(sourceFile, typeChecker, parent2) {
if (!isSingleVariableDeclaration(parent2)) {
return void 0;
}
const variableDeclaration = isVariableDeclaration(parent2) ? parent2 : first(parent2.declarations);
const initializer = variableDeclaration.initializer;
if (initializer && (isArrowFunction(initializer) || isFunctionExpression(initializer) && !isFunctionReferencedInFile(sourceFile, typeChecker, initializer))) {
return initializer;
}
return void 0;
}
function convertToBlock(body) {
if (isExpression(body)) {
const returnStatement = factory.createReturnStatement(body);
const file = body.getSourceFile();
setTextRange(returnStatement, body);
suppressLeadingAndTrailingTrivia(returnStatement);
copyTrailingAsLeadingComments(
body,
returnStatement,
file,
/*commentKind*/
void 0,
/*hasTrailingNewLine*/
true
);
return factory.createBlock(
[returnStatement],
/*multiLine*/
true
);
} else {
return body;
}
}
function getVariableInfo(func) {
const variableDeclaration = func.parent;
if (!isVariableDeclaration(variableDeclaration) || !isVariableDeclarationInVariableStatement(variableDeclaration))
return void 0;
const variableDeclarationList = variableDeclaration.parent;
const statement = variableDeclarationList.parent;
if (!isVariableDeclarationList(variableDeclarationList) || !isVariableStatement(statement) || !isIdentifier(variableDeclaration.name))
return void 0;
return { variableDeclaration, variableDeclarationList, statement, name: variableDeclaration.name };
}
function getEditInfoForConvertToAnonymousFunction(context, func) {
const { file } = context;
const body = convertToBlock(func.body);
const newNode = factory.createFunctionExpression(
func.modifiers,
func.asteriskToken,
/*name*/
void 0,
func.typeParameters,
func.parameters,
func.type,
body
);
return ts_textChanges_exports.ChangeTracker.with(context, (t) => t.replaceNode(file, func, newNode));
}
function getEditInfoForConvertToNamedFunction(context, func, variableInfo) {
const { file } = context;
const body = convertToBlock(func.body);
const { variableDeclaration, variableDeclarationList, statement, name } = variableInfo;
suppressLeadingTrivia(statement);
const modifiersFlags = getCombinedModifierFlags(variableDeclaration) & 1 /* Export */ | getEffectiveModifierFlags(func);
const modifiers = factory.createModifiersFromModifierFlags(modifiersFlags);
const newNode = factory.createFunctionDeclaration(length(modifiers) ? modifiers : void 0, func.asteriskToken, name, func.typeParameters, func.parameters, func.type, body);
if (variableDeclarationList.declarations.length === 1) {
return ts_textChanges_exports.ChangeTracker.with(context, (t) => t.replaceNode(file, statement, newNode));
} else {
return ts_textChanges_exports.ChangeTracker.with(context, (t) => {
t.delete(file, variableDeclaration);
t.insertNodeAfter(file, statement, newNode);
});
}
}
function getEditInfoForConvertToArrowFunction(context, func) {
const { file } = context;
const statements = func.body.statements;
const head = statements[0];
let body;
if (canBeConvertedToExpression(func.body, head)) {
body = head.expression;
suppressLeadingAndTrailingTrivia(body);
copyComments(head, body);
} else {
body = func.body;
}
const newNode = factory.createArrowFunction(func.modifiers, func.typeParameters, func.parameters, func.type, factory.createToken(39 /* EqualsGreaterThanToken */), body);
return ts_textChanges_exports.ChangeTracker.with(context, (t) => t.replaceNode(file, func, newNode));
}
function canBeConvertedToExpression(body, head) {
return body.statements.length === 1 && (isReturnStatement(head) && !!head.expression);
}
function isFunctionReferencedInFile(sourceFile, typeChecker, node) {
return !!node.name && ts_FindAllReferences_exports.Core.isSymbolReferencedInFile(node.name, typeChecker, sourceFile);
}
// src/services/_namespaces/ts.refactor.convertParamsToDestructuredObject.ts
var ts_refactor_convertParamsToDestructuredObject_exports = {};
// src/services/refactors/convertParamsToDestructuredObject.ts
var refactorName8 = "Convert parameters to destructured object";
var minimumParameterLength = 1;
var refactorDescription4 = getLocaleSpecificMessage(Diagnostics.Convert_parameters_to_destructured_object);
var toDestructuredAction = {
name: refactorName8,
description: refactorDescription4,
kind: "refactor.rewrite.parameters.toDestructured"
};
registerRefactor(refactorName8, {
kinds: [toDestructuredAction.kind],
getEditsForAction: getRefactorEditsToConvertParametersToDestructuredObject,
getAvailableActions: getRefactorActionsToConvertParametersToDestructuredObject
});
function getRefactorActionsToConvertParametersToDestructuredObject(context) {
const { file, startPosition } = context;
const isJSFile = isSourceFileJS(file);
if (isJSFile)
return emptyArray;
const functionDeclaration = getFunctionDeclarationAtPosition(file, startPosition, context.program.getTypeChecker());
if (!functionDeclaration)
return emptyArray;
return [{
name: refactorName8,
description: refactorDescription4,
actions: [toDestructuredAction]
}];
}
function getRefactorEditsToConvertParametersToDestructuredObject(context, actionName2) {
Debug.assert(actionName2 === refactorName8, "Unexpected action name");
const { file, startPosition, program, cancellationToken, host } = context;
const functionDeclaration = getFunctionDeclarationAtPosition(file, startPosition, program.getTypeChecker());
if (!functionDeclaration || !cancellationToken)
return void 0;
const groupedReferences = getGroupedReferences(functionDeclaration, program, cancellationToken);
if (groupedReferences.valid) {
const edits = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange5(file, program, host, t, functionDeclaration, groupedReferences));
return { renameFilename: void 0, renameLocation: void 0, edits };
}
return { edits: [] };
}
function doChange5(sourceFile, program, host, changes, functionDeclaration, groupedReferences) {
const signature = groupedReferences.signature;
const newFunctionDeclarationParams = map(createNewParameters(functionDeclaration, program, host), (param) => getSynthesizedDeepClone(param));
if (signature) {
const newSignatureParams = map(createNewParameters(signature, program, host), (param) => getSynthesizedDeepClone(param));
replaceParameters(signature, newSignatureParams);
}
replaceParameters(functionDeclaration, newFunctionDeclarationParams);
const functionCalls = sortAndDeduplicate(
groupedReferences.functionCalls,
/*comparer*/
(a, b) => compareValues(a.pos, b.pos)
);
for (const call of functionCalls) {
if (call.arguments && call.arguments.length) {
const newArgument = getSynthesizedDeepClone(
createNewArgument(functionDeclaration, call.arguments),
/*includeTrivia*/
true
);
changes.replaceNodeRange(
getSourceFileOfNode(call),
first(call.arguments),
last(call.arguments),
newArgument,
{ leadingTriviaOption: ts_textChanges_exports.LeadingTriviaOption.IncludeAll, trailingTriviaOption: ts_textChanges_exports.TrailingTriviaOption.Include }
);
}
}
function replaceParameters(declarationOrSignature, parameterDeclarations) {
changes.replaceNodeRangeWithNodes(
sourceFile,
first(declarationOrSignature.parameters),
last(declarationOrSignature.parameters),
parameterDeclarations,
{
joiner: ", ",
// indentation is set to 0 because otherwise the object parameter will be indented if there is a `this` parameter
indentation: 0,
leadingTriviaOption: ts_textChanges_exports.LeadingTriviaOption.IncludeAll,
trailingTriviaOption: ts_textChanges_exports.TrailingTriviaOption.Include
}
);
}
}
function getGroupedReferences(functionDeclaration, program, cancellationToken) {
const functionNames = getFunctionNames(functionDeclaration);
const classNames = isConstructorDeclaration(functionDeclaration) ? getClassNames(functionDeclaration) : [];
const names = deduplicate([...functionNames, ...classNames], equateValues);
const checker = program.getTypeChecker();
const references = flatMap(
names,
/*mapfn*/
(name) => ts_FindAllReferences_exports.getReferenceEntriesForNode(-1, name, program, program.getSourceFiles(), cancellationToken)
);
const groupedReferences = groupReferences(references);
if (!every(
groupedReferences.declarations,
/*callback*/
(decl) => contains(names, decl)
)) {
groupedReferences.valid = false;
}
return groupedReferences;
function groupReferences(referenceEntries) {
const classReferences = { accessExpressions: [], typeUsages: [] };
const groupedReferences2 = { functionCalls: [], declarations: [], classReferences, valid: true };
const functionSymbols = map(functionNames, getSymbolTargetAtLocation);
const classSymbols = map(classNames, getSymbolTargetAtLocation);
const isConstructor = isConstructorDeclaration(functionDeclaration);
const contextualSymbols = map(functionNames, (name) => getSymbolForContextualType(name, checker));
for (const entry of referenceEntries) {
if (entry.kind === ts_FindAllReferences_exports.EntryKind.Span) {
groupedReferences2.valid = false;
continue;
}
if (contains(contextualSymbols, getSymbolTargetAtLocation(entry.node))) {
if (isValidMethodSignature(entry.node.parent)) {
groupedReferences2.signature = entry.node.parent;
continue;
}
const call = entryToFunctionCall(entry);
if (call) {
groupedReferences2.functionCalls.push(call);
continue;
}
}
const contextualSymbol = getSymbolForContextualType(entry.node, checker);
if (contextualSymbol && contains(contextualSymbols, contextualSymbol)) {
const decl = entryToDeclaration(entry);
if (decl) {
groupedReferences2.declarations.push(decl);
continue;
}
}
if (contains(functionSymbols, getSymbolTargetAtLocation(entry.node)) || isNewExpressionTarget(entry.node)) {
const importOrExportReference = entryToImportOrExport(entry);
if (importOrExportReference) {
continue;
}
const decl = entryToDeclaration(entry);
if (decl) {
groupedReferences2.declarations.push(decl);
continue;
}
const call = entryToFunctionCall(entry);
if (call) {
groupedReferences2.functionCalls.push(call);
continue;
}
}
if (isConstructor && contains(classSymbols, getSymbolTargetAtLocation(entry.node))) {
const importOrExportReference = entryToImportOrExport(entry);
if (importOrExportReference) {
continue;
}
const decl = entryToDeclaration(entry);
if (decl) {
groupedReferences2.declarations.push(decl);
continue;
}
const accessExpression = entryToAccessExpression(entry);
if (accessExpression) {
classReferences.accessExpressions.push(accessExpression);
continue;
}
if (isClassDeclaration(functionDeclaration.parent)) {
const type = entryToType(entry);
if (type) {
classReferences.typeUsages.push(type);
continue;
}
}
}
groupedReferences2.valid = false;
}
return groupedReferences2;
}
function getSymbolTargetAtLocation(node) {
const symbol = checker.getSymbolAtLocation(node);
return symbol && getSymbolTarget(symbol, checker);
}
}
function getSymbolForContextualType(node, checker) {
const element = getContainingObjectLiteralElement(node);
if (element) {
const contextualType = checker.getContextualTypeForObjectLiteralElement(element);
const symbol = contextualType == null ? void 0 : contextualType.getSymbol();
if (symbol && !(getCheckFlags(symbol) & 6 /* Synthetic */)) {
return symbol;
}
}
}
function entryToImportOrExport(entry) {
const node = entry.node;
if (isImportSpecifier(node.parent) || isImportClause(node.parent) || isImportEqualsDeclaration(node.parent) || isNamespaceImport(node.parent)) {
return node;
}
if (isExportSpecifier(node.parent) || isExportAssignment(node.parent)) {
return node;
}
return void 0;
}
function entryToDeclaration(entry) {
if (isDeclaration(entry.node.parent)) {
return entry.node;
}
return void 0;
}
function entryToFunctionCall(entry) {
if (entry.node.parent) {
const functionReference = entry.node;
const parent2 = functionReference.parent;
switch (parent2.kind) {
case 212 /* CallExpression */:
case 213 /* NewExpression */:
const callOrNewExpression = tryCast(parent2, isCallOrNewExpression);
if (callOrNewExpression && callOrNewExpression.expression === functionReference) {
return callOrNewExpression;
}
break;
case 210 /* PropertyAccessExpression */:
const propertyAccessExpression = tryCast(parent2, isPropertyAccessExpression);
if (propertyAccessExpression && propertyAccessExpression.parent && propertyAccessExpression.name === functionReference) {
const callOrNewExpression2 = tryCast(propertyAccessExpression.parent, isCallOrNewExpression);
if (callOrNewExpression2 && callOrNewExpression2.expression === propertyAccessExpression) {
return callOrNewExpression2;
}
}
break;
case 211 /* ElementAccessExpression */:
const elementAccessExpression = tryCast(parent2, isElementAccessExpression);
if (elementAccessExpression && elementAccessExpression.parent && elementAccessExpression.argumentExpression === functionReference) {
const callOrNewExpression2 = tryCast(elementAccessExpression.parent, isCallOrNewExpression);
if (callOrNewExpression2 && callOrNewExpression2.expression === elementAccessExpression) {
return callOrNewExpression2;
}
}
break;
}
}
return void 0;
}
function entryToAccessExpression(entry) {
if (entry.node.parent) {
const reference = entry.node;
const parent2 = reference.parent;
switch (parent2.kind) {
case 210 /* PropertyAccessExpression */:
const propertyAccessExpression = tryCast(parent2, isPropertyAccessExpression);
if (propertyAccessExpression && propertyAccessExpression.expression === reference) {
return propertyAccessExpression;
}
break;
case 211 /* ElementAccessExpression */:
const elementAccessExpression = tryCast(parent2, isElementAccessExpression);
if (elementAccessExpression && elementAccessExpression.expression === reference) {
return elementAccessExpression;
}
break;
}
}
return void 0;
}
function entryToType(entry) {
const reference = entry.node;
if (getMeaningFromLocation(reference) === 2 /* Type */ || isExpressionWithTypeArgumentsInClassExtendsClause(reference.parent)) {
return reference;
}
return void 0;
}
function getFunctionDeclarationAtPosition(file, startPosition, checker) {
const node = getTouchingToken(file, startPosition);
const functionDeclaration = getContainingFunctionDeclaration(node);
if (isTopLevelJSDoc(node))
return void 0;
if (functionDeclaration && isValidFunctionDeclaration(functionDeclaration, checker) && rangeContainsRange(functionDeclaration, node) && !(functionDeclaration.body && rangeContainsRange(functionDeclaration.body, node)))
return functionDeclaration;
return void 0;
}
function isTopLevelJSDoc(node) {
const containingJSDoc = findAncestor(node, isJSDocNode);
if (containingJSDoc) {
const containingNonJSDoc = findAncestor(containingJSDoc, (n) => !isJSDocNode(n));
return !!containingNonJSDoc && isFunctionLikeDeclaration(containingNonJSDoc);
}
return false;
}
function isValidMethodSignature(node) {
return isMethodSignature(node) && (isInterfaceDeclaration(node.parent) || isTypeLiteralNode(node.parent));
}
function isValidFunctionDeclaration(functionDeclaration, checker) {
var _a;
if (!isValidParameterNodeArray(functionDeclaration.parameters, checker))
return false;
switch (functionDeclaration.kind) {
case 261 /* FunctionDeclaration */:
return hasNameOrDefault(functionDeclaration) && isSingleImplementation(functionDeclaration, checker);
case 173 /* MethodDeclaration */:
if (isObjectLiteralExpression(functionDeclaration.parent)) {
const contextualSymbol = getSymbolForContextualType(functionDeclaration.name, checker);
return ((_a = contextualSymbol == null ? void 0 : contextualSymbol.declarations) == null ? void 0 : _a.length) === 1 && isSingleImplementation(functionDeclaration, checker);
}
return isSingleImplementation(functionDeclaration, checker);
case 175 /* Constructor */:
if (isClassDeclaration(functionDeclaration.parent)) {
return hasNameOrDefault(functionDeclaration.parent) && isSingleImplementation(functionDeclaration, checker);
} else {
return isValidVariableDeclaration(functionDeclaration.parent.parent) && isSingleImplementation(functionDeclaration, checker);
}
case 217 /* FunctionExpression */:
case 218 /* ArrowFunction */:
return isValidVariableDeclaration(functionDeclaration.parent);
}
return false;
}
function isSingleImplementation(functionDeclaration, checker) {
return !!functionDeclaration.body && !checker.isImplementationOfOverload(functionDeclaration);
}
function hasNameOrDefault(functionOrClassDeclaration) {
if (!functionOrClassDeclaration.name) {
const defaultKeyword = findModifier(functionOrClassDeclaration, 90 /* DefaultKeyword */);
return !!defaultKeyword;
}
return true;
}
function isValidParameterNodeArray(parameters, checker) {
return getRefactorableParametersLength(parameters) >= minimumParameterLength && every(
parameters,
/*callback*/
(paramDecl) => isValidParameterDeclaration(paramDecl, checker)
);
}
function isValidParameterDeclaration(parameterDeclaration, checker) {
if (isRestParameter(parameterDeclaration)) {
const type = checker.getTypeAtLocation(parameterDeclaration);
if (!checker.isArrayType(type) && !checker.isTupleType(type))
return false;
}
return !parameterDeclaration.modifiers && isIdentifier(parameterDeclaration.name);
}
function isValidVariableDeclaration(node) {
return isVariableDeclaration(node) && isVarConst(node) && isIdentifier(node.name) && !node.type;
}
function hasThisParameter(parameters) {
return parameters.length > 0 && isThis(parameters[0].name);
}
function getRefactorableParametersLength(parameters) {
if (hasThisParameter(parameters)) {
return parameters.length - 1;
}
return parameters.length;
}
function getRefactorableParameters(parameters) {
if (hasThisParameter(parameters)) {
parameters = factory.createNodeArray(parameters.slice(1), parameters.hasTrailingComma);
}
return parameters;
}
function createPropertyOrShorthandAssignment(name, initializer) {
if (isIdentifier(initializer) && getTextOfIdentifierOrLiteral(initializer) === name) {
return factory.createShorthandPropertyAssignment(name);
}
return factory.createPropertyAssignment(name, initializer);
}
function createNewArgument(functionDeclaration, functionArguments) {
const parameters = getRefactorableParameters(functionDeclaration.parameters);
const hasRestParameter2 = isRestParameter(last(parameters));
const nonRestArguments = hasRestParameter2 ? functionArguments.slice(0, parameters.length - 1) : functionArguments;
const properties = map(nonRestArguments, (arg, i) => {
const parameterName = getParameterName(parameters[i]);
const property = createPropertyOrShorthandAssignment(parameterName, arg);
suppressLeadingAndTrailingTrivia(property.name);
if (isPropertyAssignment(property))
suppressLeadingAndTrailingTrivia(property.initializer);
copyComments(arg, property);
return property;
});
if (hasRestParameter2 && functionArguments.length >= parameters.length) {
const restArguments = functionArguments.slice(parameters.length - 1);
const restProperty = factory.createPropertyAssignment(getParameterName(last(parameters)), factory.createArrayLiteralExpression(restArguments));
properties.push(restProperty);
}
const objectLiteral = factory.createObjectLiteralExpression(
properties,
/*multiLine*/
false
);
return objectLiteral;
}
function createNewParameters(functionDeclaration, program, host) {
const checker = program.getTypeChecker();
const refactorableParameters = getRefactorableParameters(functionDeclaration.parameters);
const bindingElements = map(refactorableParameters, createBindingElementFromParameterDeclaration);
const objectParameterName = factory.createObjectBindingPattern(bindingElements);
const objectParameterType = createParameterTypeNode(refactorableParameters);
let objectInitializer;
if (every(refactorableParameters, isOptionalParameter)) {
objectInitializer = factory.createObjectLiteralExpression();
}
const objectParameter = factory.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
objectParameterName,
/*questionToken*/
void 0,
objectParameterType,
objectInitializer
);
if (hasThisParameter(functionDeclaration.parameters)) {
const thisParameter = functionDeclaration.parameters[0];
const newThisParameter = factory.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
thisParameter.name,
/*questionToken*/
void 0,
thisParameter.type
);
suppressLeadingAndTrailingTrivia(newThisParameter.name);
copyComments(thisParameter.name, newThisParameter.name);
if (thisParameter.type) {
suppressLeadingAndTrailingTrivia(newThisParameter.type);
copyComments(thisParameter.type, newThisParameter.type);
}
return factory.createNodeArray([newThisParameter, objectParameter]);
}
return factory.createNodeArray([objectParameter]);
function createBindingElementFromParameterDeclaration(parameterDeclaration) {
const element = factory.createBindingElement(
/*dotDotDotToken*/
void 0,
/*propertyName*/
void 0,
getParameterName(parameterDeclaration),
isRestParameter(parameterDeclaration) && isOptionalParameter(parameterDeclaration) ? factory.createArrayLiteralExpression() : parameterDeclaration.initializer
);
suppressLeadingAndTrailingTrivia(element);
if (parameterDeclaration.initializer && element.initializer) {
copyComments(parameterDeclaration.initializer, element.initializer);
}
return element;
}
function createParameterTypeNode(parameters) {
const members = map(parameters, createPropertySignatureFromParameterDeclaration);
const typeNode = addEmitFlags(factory.createTypeLiteralNode(members), 1 /* SingleLine */);
return typeNode;
}
function createPropertySignatureFromParameterDeclaration(parameterDeclaration) {
let parameterType = parameterDeclaration.type;
if (!parameterType && (parameterDeclaration.initializer || isRestParameter(parameterDeclaration))) {
parameterType = getTypeNode3(parameterDeclaration);
}
const propertySignature = factory.createPropertySignature(
/*modifiers*/
void 0,
getParameterName(parameterDeclaration),
isOptionalParameter(parameterDeclaration) ? factory.createToken(58 /* QuestionToken */) : parameterDeclaration.questionToken,
parameterType
);
suppressLeadingAndTrailingTrivia(propertySignature);
copyComments(parameterDeclaration.name, propertySignature.name);
if (parameterDeclaration.type && propertySignature.type) {
copyComments(parameterDeclaration.type, propertySignature.type);
}
return propertySignature;
}
function getTypeNode3(node) {
const type = checker.getTypeAtLocation(node);
return getTypeNodeIfAccessible(type, node, program, host);
}
function isOptionalParameter(parameterDeclaration) {
if (isRestParameter(parameterDeclaration)) {
const type = checker.getTypeAtLocation(parameterDeclaration);
return !checker.isTupleType(type);
}
return checker.isOptionalParameter(parameterDeclaration);
}
}
function getParameterName(paramDeclaration) {
return getTextOfIdentifierOrLiteral(paramDeclaration.name);
}
function getClassNames(constructorDeclaration) {
switch (constructorDeclaration.parent.kind) {
case 262 /* ClassDeclaration */:
const classDeclaration = constructorDeclaration.parent;
if (classDeclaration.name)
return [classDeclaration.name];
const defaultModifier = Debug.checkDefined(
findModifier(classDeclaration, 90 /* DefaultKeyword */),
"Nameless class declaration should be a default export"
);
return [defaultModifier];
case 230 /* ClassExpression */:
const classExpression = constructorDeclaration.parent;
const variableDeclaration = constructorDeclaration.parent.parent;
const className = classExpression.name;
if (className)
return [className, variableDeclaration.name];
return [variableDeclaration.name];
}
}
function getFunctionNames(functionDeclaration) {
switch (functionDeclaration.kind) {
case 261 /* FunctionDeclaration */:
if (functionDeclaration.name)
return [functionDeclaration.name];
const defaultModifier = Debug.checkDefined(
findModifier(functionDeclaration, 90 /* DefaultKeyword */),
"Nameless function declaration should be a default export"
);
return [defaultModifier];
case 173 /* MethodDeclaration */:
return [functionDeclaration.name];
case 175 /* Constructor */:
const ctrKeyword = Debug.checkDefined(
findChildOfKind(functionDeclaration, 137 /* ConstructorKeyword */, functionDeclaration.getSourceFile()),
"Constructor declaration should have constructor keyword"
);
if (functionDeclaration.parent.kind === 230 /* ClassExpression */) {
const variableDeclaration = functionDeclaration.parent.parent;
return [variableDeclaration.name, ctrKeyword];
}
return [ctrKeyword];
case 218 /* ArrowFunction */:
return [functionDeclaration.parent.name];
case 217 /* FunctionExpression */:
if (functionDeclaration.name)
return [functionDeclaration.name, functionDeclaration.parent.name];
return [functionDeclaration.parent.name];
default:
return Debug.assertNever(functionDeclaration, `Unexpected function declaration kind ${functionDeclaration.kind}`);
}
}
// src/services/_namespaces/ts.refactor.convertStringOrTemplateLiteral.ts
var ts_refactor_convertStringOrTemplateLiteral_exports = {};
// src/services/refactors/convertStringOrTemplateLiteral.ts
var refactorName9 = "Convert to template string";
var refactorDescription5 = getLocaleSpecificMessage(Diagnostics.Convert_to_template_string);
var convertStringAction = {
name: refactorName9,
description: refactorDescription5,
kind: "refactor.rewrite.string"
};
registerRefactor(refactorName9, {
kinds: [convertStringAction.kind],
getEditsForAction: getRefactorEditsToConvertToTemplateString,
getAvailableActions: getRefactorActionsToConvertToTemplateString
});
function getRefactorActionsToConvertToTemplateString(context) {
const { file, startPosition } = context;
const node = getNodeOrParentOfParentheses(file, startPosition);
const maybeBinary = getParentBinaryExpression(node);
const refactorInfo = { name: refactorName9, description: refactorDescription5, actions: [] };
if (isBinaryExpression(maybeBinary) && treeToArray(maybeBinary).isValidConcatenation) {
refactorInfo.actions.push(convertStringAction);
return [refactorInfo];
} else if (context.preferences.provideRefactorNotApplicableReason) {
refactorInfo.actions.push({
...convertStringAction,
notApplicableReason: getLocaleSpecificMessage(Diagnostics.Can_only_convert_string_concatenation)
});
return [refactorInfo];
}
return emptyArray;
}
function getNodeOrParentOfParentheses(file, startPosition) {
const node = getTokenAtPosition(file, startPosition);
const nestedBinary = getParentBinaryExpression(node);
const isNonStringBinary = !treeToArray(nestedBinary).isValidConcatenation;
if (isNonStringBinary && isParenthesizedExpression(nestedBinary.parent) && isBinaryExpression(nestedBinary.parent.parent)) {
return nestedBinary.parent.parent;
}
return node;
}
function getRefactorEditsToConvertToTemplateString(context, actionName2) {
const { file, startPosition } = context;
const node = getNodeOrParentOfParentheses(file, startPosition);
switch (actionName2) {
case refactorDescription5:
return { edits: getEditsForToTemplateLiteral(context, node) };
default:
return Debug.fail("invalid action");
}
}
function getEditsForToTemplateLiteral(context, node) {
const maybeBinary = getParentBinaryExpression(node);
const file = context.file;
const templateLiteral = nodesToTemplate(treeToArray(maybeBinary), file);
const trailingCommentRanges = getTrailingCommentRanges(file.text, maybeBinary.end);
if (trailingCommentRanges) {
const lastComment = trailingCommentRanges[trailingCommentRanges.length - 1];
const trailingRange = { pos: trailingCommentRanges[0].pos, end: lastComment.end };
return ts_textChanges_exports.ChangeTracker.with(context, (t) => {
t.deleteRange(file, trailingRange);
t.replaceNode(file, maybeBinary, templateLiteral);
});
} else {
return ts_textChanges_exports.ChangeTracker.with(context, (t) => t.replaceNode(file, maybeBinary, templateLiteral));
}
}
function isNotEqualsOperator(node) {
return node.operatorToken.kind !== 64 /* EqualsToken */;
}
function getParentBinaryExpression(expr) {
const container = findAncestor(expr.parent, (n) => {
switch (n.kind) {
case 210 /* PropertyAccessExpression */:
case 211 /* ElementAccessExpression */:
return false;
case 227 /* TemplateExpression */:
case 225 /* BinaryExpression */:
return !(isBinaryExpression(n.parent) && isNotEqualsOperator(n.parent));
default:
return "quit";
}
});
return container || expr;
}
function treeToArray(current) {
const loop = (current2) => {
if (!isBinaryExpression(current2)) {
return {
nodes: [current2],
operators: [],
validOperators: true,
hasString: isStringLiteral(current2) || isNoSubstitutionTemplateLiteral(current2)
};
}
const { nodes: nodes2, operators: operators2, hasString: leftHasString, validOperators: leftOperatorValid } = loop(current2.left);
if (!(leftHasString || isStringLiteral(current2.right) || isTemplateExpression(current2.right))) {
return { nodes: [current2], operators: [], hasString: false, validOperators: true };
}
const currentOperatorValid = current2.operatorToken.kind === 40 /* PlusToken */;
const validOperators2 = leftOperatorValid && currentOperatorValid;
nodes2.push(current2.right);
operators2.push(current2.operatorToken);
return { nodes: nodes2, operators: operators2, hasString: true, validOperators: validOperators2 };
};
const { nodes, operators, validOperators, hasString } = loop(current);
return { nodes, operators, isValidConcatenation: validOperators && hasString };
}
var copyTrailingOperatorComments = (operators, file) => (index, targetNode) => {
if (index < operators.length) {
copyTrailingComments(
operators[index],
targetNode,
file,
3 /* MultiLineCommentTrivia */,
/*hasTrailingNewLine*/
false
);
}
};
var copyCommentFromMultiNode = (nodes, file, copyOperatorComments) => (indexes, targetNode) => {
while (indexes.length > 0) {
const index = indexes.shift();
copyTrailingComments(
nodes[index],
targetNode,
file,
3 /* MultiLineCommentTrivia */,
/*hasTrailingNewLine*/
false
);
copyOperatorComments(index, targetNode);
}
};
function escapeRawStringForTemplate(s) {
return s.replace(/\\.|[$`]/g, (m) => m[0] === "\\" ? m : "\\" + m);
}
function getRawTextOfTemplate(node) {
const rightShaving = isTemplateHead(node) || isTemplateMiddle(node) ? -2 : -1;
return getTextOfNode(node).slice(1, rightShaving);
}
function concatConsecutiveString(index, nodes) {
const indexes = [];
let text = "", rawText = "";
while (index < nodes.length) {
const node = nodes[index];
if (isStringLiteralLike(node)) {
text += node.text;
rawText += escapeRawStringForTemplate(getTextOfNode(node).slice(1, -1));
indexes.push(index);
index++;
} else if (isTemplateExpression(node)) {
text += node.head.text;
rawText += getRawTextOfTemplate(node.head);
break;
} else {
break;
}
}
return [index, text, rawText, indexes];
}
function nodesToTemplate({ nodes, operators }, file) {
const copyOperatorComments = copyTrailingOperatorComments(operators, file);
const copyCommentFromStringLiterals = copyCommentFromMultiNode(nodes, file, copyOperatorComments);
const [begin, headText, rawHeadText, headIndexes] = concatConsecutiveString(0, nodes);
if (begin === nodes.length) {
const noSubstitutionTemplateLiteral = factory.createNoSubstitutionTemplateLiteral(headText, rawHeadText);
copyCommentFromStringLiterals(headIndexes, noSubstitutionTemplateLiteral);
return noSubstitutionTemplateLiteral;
}
const templateSpans = [];
const templateHead = factory.createTemplateHead(headText, rawHeadText);
copyCommentFromStringLiterals(headIndexes, templateHead);
for (let i = begin; i < nodes.length; i++) {
const currentNode = getExpressionFromParenthesesOrExpression(nodes[i]);
copyOperatorComments(i, currentNode);
const [newIndex, subsequentText, rawSubsequentText, stringIndexes] = concatConsecutiveString(i + 1, nodes);
i = newIndex - 1;
const isLast = i === nodes.length - 1;
if (isTemplateExpression(currentNode)) {
const spans = map(currentNode.templateSpans, (span, index) => {
copyExpressionComments(span);
const isLastSpan = index === currentNode.templateSpans.length - 1;
const text = span.literal.text + (isLastSpan ? subsequentText : "");
const rawText = getRawTextOfTemplate(span.literal) + (isLastSpan ? rawSubsequentText : "");
return factory.createTemplateSpan(span.expression, isLast && isLastSpan ? factory.createTemplateTail(text, rawText) : factory.createTemplateMiddle(text, rawText));
});
templateSpans.push(...spans);
} else {
const templatePart = isLast ? factory.createTemplateTail(subsequentText, rawSubsequentText) : factory.createTemplateMiddle(subsequentText, rawSubsequentText);
copyCommentFromStringLiterals(stringIndexes, templatePart);
templateSpans.push(factory.createTemplateSpan(currentNode, templatePart));
}
}
return factory.createTemplateExpression(templateHead, templateSpans);
}
function copyExpressionComments(node) {
const file = node.getSourceFile();
copyTrailingComments(
node,
node.expression,
file,
3 /* MultiLineCommentTrivia */,
/*hasTrailingNewLine*/
false
);
copyTrailingAsLeadingComments(
node.expression,
node.expression,
file,
3 /* MultiLineCommentTrivia */,
/*hasTrailingNewLine*/
false
);
}
function getExpressionFromParenthesesOrExpression(node) {
if (isParenthesizedExpression(node)) {
copyExpressionComments(node);
node = node.expression;
}
return node;
}
// src/services/_namespaces/ts.refactor.convertToOptionalChainExpression.ts
var ts_refactor_convertToOptionalChainExpression_exports = {};
// src/services/refactors/convertToOptionalChainExpression.ts
var refactorName10 = "Convert to optional chain expression";
var convertToOptionalChainExpressionMessage = getLocaleSpecificMessage(Diagnostics.Convert_to_optional_chain_expression);
var toOptionalChainAction = {
name: refactorName10,
description: convertToOptionalChainExpressionMessage,
kind: "refactor.rewrite.expression.optionalChain"
};
registerRefactor(refactorName10, {
kinds: [toOptionalChainAction.kind],
getEditsForAction: getRefactorEditsToConvertToOptionalChain,
getAvailableActions: getRefactorActionsToConvertToOptionalChain
});
function getRefactorActionsToConvertToOptionalChain(context) {
const info = getInfo3(context, context.triggerReason === "invoked");
if (!info)
return emptyArray;
if (!isRefactorErrorInfo(info)) {
return [{
name: refactorName10,
description: convertToOptionalChainExpressionMessage,
actions: [toOptionalChainAction]
}];
}
if (context.preferences.provideRefactorNotApplicableReason) {
return [{
name: refactorName10,
description: convertToOptionalChainExpressionMessage,
actions: [{ ...toOptionalChainAction, notApplicableReason: info.error }]
}];
}
return emptyArray;
}
function getRefactorEditsToConvertToOptionalChain(context, actionName2) {
const info = getInfo3(context);
Debug.assert(info && !isRefactorErrorInfo(info), "Expected applicable refactor info");
const edits = ts_textChanges_exports.ChangeTracker.with(
context,
(t) => doChange6(context.file, context.program.getTypeChecker(), t, info, actionName2)
);
return { edits, renameFilename: void 0, renameLocation: void 0 };
}
function isValidExpression(node) {
return isBinaryExpression(node) || isConditionalExpression(node);
}
function isValidStatement(node) {
return isExpressionStatement(node) || isReturnStatement(node) || isVariableStatement(node);
}
function isValidExpressionOrStatement(node) {
return isValidExpression(node) || isValidStatement(node);
}
function getInfo3(context, considerEmptySpans = true) {
const { file, program } = context;
const span = getRefactorContextSpan(context);
const forEmptySpan = span.length === 0;
if (forEmptySpan && !considerEmptySpans)
return void 0;
const startToken = getTokenAtPosition(file, span.start);
const endToken = findTokenOnLeftOfPosition(file, span.start + span.length);
const adjustedSpan = createTextSpanFromBounds(startToken.pos, endToken && endToken.end >= startToken.pos ? endToken.getEnd() : startToken.getEnd());
const parent2 = forEmptySpan ? getValidParentNodeOfEmptySpan(startToken) : getValidParentNodeContainingSpan(startToken, adjustedSpan);
const expression = parent2 && isValidExpressionOrStatement(parent2) ? getExpression(parent2) : void 0;
if (!expression)
return { error: getLocaleSpecificMessage(Diagnostics.Could_not_find_convertible_access_expression) };
const checker = program.getTypeChecker();
return isConditionalExpression(expression) ? getConditionalInfo(expression, checker) : getBinaryInfo(expression);
}
function getConditionalInfo(expression, checker) {
const condition = expression.condition;
const finalExpression = getFinalExpressionInChain(expression.whenTrue);
if (!finalExpression || checker.isNullableType(checker.getTypeAtLocation(finalExpression))) {
return { error: getLocaleSpecificMessage(Diagnostics.Could_not_find_convertible_access_expression) };
}
if ((isPropertyAccessExpression(condition) || isIdentifier(condition)) && getMatchingStart(condition, finalExpression.expression)) {
return { finalExpression, occurrences: [condition], expression };
} else if (isBinaryExpression(condition)) {
const occurrences = getOccurrencesInExpression(finalExpression.expression, condition);
return occurrences ? { finalExpression, occurrences, expression } : { error: getLocaleSpecificMessage(Diagnostics.Could_not_find_matching_access_expressions) };
}
}
function getBinaryInfo(expression) {
if (expression.operatorToken.kind !== 56 /* AmpersandAmpersandToken */) {
return { error: getLocaleSpecificMessage(Diagnostics.Can_only_convert_logical_AND_access_chains) };
}
const finalExpression = getFinalExpressionInChain(expression.right);
if (!finalExpression)
return { error: getLocaleSpecificMessage(Diagnostics.Could_not_find_convertible_access_expression) };
const occurrences = getOccurrencesInExpression(finalExpression.expression, expression.left);
return occurrences ? { finalExpression, occurrences, expression } : { error: getLocaleSpecificMessage(Diagnostics.Could_not_find_matching_access_expressions) };
}
function getOccurrencesInExpression(matchTo, expression) {
const occurrences = [];
while (isBinaryExpression(expression) && expression.operatorToken.kind === 56 /* AmpersandAmpersandToken */) {
const match = getMatchingStart(skipParentheses(matchTo), skipParentheses(expression.right));
if (!match) {
break;
}
occurrences.push(match);
matchTo = match;
expression = expression.left;
}
const finalMatch = getMatchingStart(matchTo, expression);
if (finalMatch) {
occurrences.push(finalMatch);
}
return occurrences.length > 0 ? occurrences : void 0;
}
function getMatchingStart(chain, subchain) {
if (!isIdentifier(subchain) && !isPropertyAccessExpression(subchain) && !isElementAccessExpression(subchain)) {
return void 0;
}
return chainStartsWith(chain, subchain) ? subchain : void 0;
}
function chainStartsWith(chain, subchain) {
while (isCallExpression(chain) || isPropertyAccessExpression(chain) || isElementAccessExpression(chain)) {
if (getTextOfChainNode(chain) === getTextOfChainNode(subchain))
break;
chain = chain.expression;
}
while (isPropertyAccessExpression(chain) && isPropertyAccessExpression(subchain) || isElementAccessExpression(chain) && isElementAccessExpression(subchain)) {
if (getTextOfChainNode(chain) !== getTextOfChainNode(subchain))
return false;
chain = chain.expression;
subchain = subchain.expression;
}
return isIdentifier(chain) && isIdentifier(subchain) && chain.getText() === subchain.getText();
}
function getTextOfChainNode(node) {
if (isIdentifier(node) || isStringOrNumericLiteralLike(node)) {
return node.getText();
}
if (isPropertyAccessExpression(node)) {
return getTextOfChainNode(node.name);
}
if (isElementAccessExpression(node)) {
return getTextOfChainNode(node.argumentExpression);
}
return void 0;
}
function getValidParentNodeContainingSpan(node, span) {
while (node.parent) {
if (isValidExpressionOrStatement(node) && span.length !== 0 && node.end >= span.start + span.length) {
return node;
}
node = node.parent;
}
return void 0;
}
function getValidParentNodeOfEmptySpan(node) {
while (node.parent) {
if (isValidExpressionOrStatement(node) && !isValidExpressionOrStatement(node.parent)) {
return node;
}
node = node.parent;
}
return void 0;
}
function getExpression(node) {
if (isValidExpression(node)) {
return node;
}
if (isVariableStatement(node)) {
const variable = getSingleVariableOfVariableStatement(node);
const initializer = variable == null ? void 0 : variable.initializer;
return initializer && isValidExpression(initializer) ? initializer : void 0;
}
return node.expression && isValidExpression(node.expression) ? node.expression : void 0;
}
function getFinalExpressionInChain(node) {
node = skipParentheses(node);
if (isBinaryExpression(node)) {
return getFinalExpressionInChain(node.left);
} else if ((isPropertyAccessExpression(node) || isElementAccessExpression(node) || isCallExpression(node)) && !isOptionalChain(node)) {
return node;
}
return void 0;
}
function convertOccurrences(checker, toConvert, occurrences) {
if (isPropertyAccessExpression(toConvert) || isElementAccessExpression(toConvert) || isCallExpression(toConvert)) {
const chain = convertOccurrences(checker, toConvert.expression, occurrences);
const lastOccurrence = occurrences.length > 0 ? occurrences[occurrences.length - 1] : void 0;
const isOccurrence = (lastOccurrence == null ? void 0 : lastOccurrence.getText()) === toConvert.expression.getText();
if (isOccurrence)
occurrences.pop();
if (isCallExpression(toConvert)) {
return isOccurrence ? factory.createCallChain(chain, factory.createToken(29 /* QuestionDotToken */), toConvert.typeArguments, toConvert.arguments) : factory.createCallChain(chain, toConvert.questionDotToken, toConvert.typeArguments, toConvert.arguments);
} else if (isPropertyAccessExpression(toConvert)) {
return isOccurrence ? factory.createPropertyAccessChain(chain, factory.createToken(29 /* QuestionDotToken */), toConvert.name) : factory.createPropertyAccessChain(chain, toConvert.questionDotToken, toConvert.name);
} else if (isElementAccessExpression(toConvert)) {
return isOccurrence ? factory.createElementAccessChain(chain, factory.createToken(29 /* QuestionDotToken */), toConvert.argumentExpression) : factory.createElementAccessChain(chain, toConvert.questionDotToken, toConvert.argumentExpression);
}
}
return toConvert;
}
function doChange6(sourceFile, checker, changes, info, _actionName) {
const { finalExpression, occurrences, expression } = info;
const firstOccurrence = occurrences[occurrences.length - 1];
const convertedChain = convertOccurrences(checker, finalExpression, occurrences);
if (convertedChain && (isPropertyAccessExpression(convertedChain) || isElementAccessExpression(convertedChain) || isCallExpression(convertedChain))) {
if (isBinaryExpression(expression)) {
changes.replaceNodeRange(sourceFile, firstOccurrence, finalExpression, convertedChain);
} else if (isConditionalExpression(expression)) {
changes.replaceNode(
sourceFile,
expression,
factory.createBinaryExpression(convertedChain, factory.createToken(61 /* QuestionQuestionToken */), expression.whenFalse)
);
}
}
}
// src/services/_namespaces/ts.refactor.extractSymbol.ts
var ts_refactor_extractSymbol_exports = {};
__export(ts_refactor_extractSymbol_exports, {
Messages: () => Messages,
RangeFacts: () => RangeFacts,
getRangeToExtract: () => getRangeToExtract2,
getRefactorActionsToExtractSymbol: () => getRefactorActionsToExtractSymbol,
getRefactorEditsToExtractSymbol: () => getRefactorEditsToExtractSymbol
});
// src/services/refactors/extractSymbol.ts
var refactorName11 = "Extract Symbol";
var extractConstantAction = {
name: "Extract Constant",
description: getLocaleSpecificMessage(Diagnostics.Extract_constant),
kind: "refactor.extract.constant"
};
var extractFunctionAction = {
name: "Extract Function",
description: getLocaleSpecificMessage(Diagnostics.Extract_function),
kind: "refactor.extract.function"
};
registerRefactor(refactorName11, {
kinds: [
extractConstantAction.kind,
extractFunctionAction.kind
],
getEditsForAction: getRefactorEditsToExtractSymbol,
getAvailableActions: getRefactorActionsToExtractSymbol
});
function getRefactorActionsToExtractSymbol(context) {
const requestedRefactor = context.kind;
const rangeToExtract = getRangeToExtract2(context.file, getRefactorContextSpan(context), context.triggerReason === "invoked");
const targetRange = rangeToExtract.targetRange;
if (targetRange === void 0) {
if (!rangeToExtract.errors || rangeToExtract.errors.length === 0 || !context.preferences.provideRefactorNotApplicableReason) {
return emptyArray;
}
const errors = [];
if (refactorKindBeginsWith(extractFunctionAction.kind, requestedRefactor)) {
errors.push({
name: refactorName11,
description: extractFunctionAction.description,
actions: [{ ...extractFunctionAction, notApplicableReason: getStringError(rangeToExtract.errors) }]
});
}
if (refactorKindBeginsWith(extractConstantAction.kind, requestedRefactor)) {
errors.push({
name: refactorName11,
description: extractConstantAction.description,
actions: [{ ...extractConstantAction, notApplicableReason: getStringError(rangeToExtract.errors) }]
});
}
return errors;
}
const extractions = getPossibleExtractions(targetRange, context);
if (extractions === void 0) {
return emptyArray;
}
const functionActions = [];
const usedFunctionNames = /* @__PURE__ */ new Map();
let innermostErrorFunctionAction;
const constantActions = [];
const usedConstantNames = /* @__PURE__ */ new Map();
let innermostErrorConstantAction;
let i = 0;
for (const { functionExtraction, constantExtraction } of extractions) {
if (refactorKindBeginsWith(extractFunctionAction.kind, requestedRefactor)) {
const description3 = functionExtraction.description;
if (functionExtraction.errors.length === 0) {
if (!usedFunctionNames.has(description3)) {
usedFunctionNames.set(description3, true);
functionActions.push({
description: description3,
name: `function_scope_${i}`,
kind: extractFunctionAction.kind
});
}
} else if (!innermostErrorFunctionAction) {
innermostErrorFunctionAction = {
description: description3,
name: `function_scope_${i}`,
notApplicableReason: getStringError(functionExtraction.errors),
kind: extractFunctionAction.kind
};
}
}
if (refactorKindBeginsWith(extractConstantAction.kind, requestedRefactor)) {
const description3 = constantExtraction.description;
if (constantExtraction.errors.length === 0) {
if (!usedConstantNames.has(description3)) {
usedConstantNames.set(description3, true);
constantActions.push({
description: description3,
name: `constant_scope_${i}`,
kind: extractConstantAction.kind
});
}
} else if (!innermostErrorConstantAction) {
innermostErrorConstantAction = {
description: description3,
name: `constant_scope_${i}`,
notApplicableReason: getStringError(constantExtraction.errors),
kind: extractConstantAction.kind
};
}
}
i++;
}
const infos = [];
if (functionActions.length) {
infos.push({
name: refactorName11,
description: getLocaleSpecificMessage(Diagnostics.Extract_function),
actions: functionActions
});
} else if (context.preferences.provideRefactorNotApplicableReason && innermostErrorFunctionAction) {
infos.push({
name: refactorName11,
description: getLocaleSpecificMessage(Diagnostics.Extract_function),
actions: [innermostErrorFunctionAction]
});
}
if (constantActions.length) {
infos.push({
name: refactorName11,
description: getLocaleSpecificMessage(Diagnostics.Extract_constant),
actions: constantActions
});
} else if (context.preferences.provideRefactorNotApplicableReason && innermostErrorConstantAction) {
infos.push({
name: refactorName11,
description: getLocaleSpecificMessage(Diagnostics.Extract_constant),
actions: [innermostErrorConstantAction]
});
}
return infos.length ? infos : emptyArray;
function getStringError(errors) {
let error = errors[0].messageText;
if (typeof error !== "string") {
error = error.messageText;
}
return error;
}
}
function getRefactorEditsToExtractSymbol(context, actionName2) {
const rangeToExtract = getRangeToExtract2(context.file, getRefactorContextSpan(context));
const targetRange = rangeToExtract.targetRange;
const parsedFunctionIndexMatch = /^function_scope_(\d+)$/.exec(actionName2);
if (parsedFunctionIndexMatch) {
const index = +parsedFunctionIndexMatch[1];
Debug.assert(isFinite(index), "Expected to parse a finite number from the function scope index");
return getFunctionExtractionAtIndex(targetRange, context, index);
}
const parsedConstantIndexMatch = /^constant_scope_(\d+)$/.exec(actionName2);
if (parsedConstantIndexMatch) {
const index = +parsedConstantIndexMatch[1];
Debug.assert(isFinite(index), "Expected to parse a finite number from the constant scope index");
return getConstantExtractionAtIndex(targetRange, context, index);
}
Debug.fail("Unrecognized action name");
}
var Messages;
((Messages2) => {
function createMessage(message) {
return { message, code: 0, category: 3 /* Message */, key: message };
}
Messages2.cannotExtractRange = createMessage("Cannot extract range.");
Messages2.cannotExtractImport = createMessage("Cannot extract import statement.");
Messages2.cannotExtractSuper = createMessage("Cannot extract super call.");
Messages2.cannotExtractJSDoc = createMessage("Cannot extract JSDoc.");
Messages2.cannotExtractEmpty = createMessage("Cannot extract empty range.");
Messages2.expressionExpected = createMessage("expression expected.");
Messages2.uselessConstantType = createMessage("No reason to extract constant of type.");
Messages2.statementOrExpressionExpected = createMessage("Statement or expression expected.");
Messages2.cannotExtractRangeContainingConditionalBreakOrContinueStatements = createMessage("Cannot extract range containing conditional break or continue statements.");
Messages2.cannotExtractRangeContainingConditionalReturnStatement = createMessage("Cannot extract range containing conditional return statement.");
Messages2.cannotExtractRangeContainingLabeledBreakOrContinueStatementWithTargetOutsideOfTheRange = createMessage("Cannot extract range containing labeled break or continue with target outside of the range.");
Messages2.cannotExtractRangeThatContainsWritesToReferencesLocatedOutsideOfTheTargetRangeInGenerators = createMessage("Cannot extract range containing writes to references located outside of the target range in generators.");
Messages2.typeWillNotBeVisibleInTheNewScope = createMessage("Type will not visible in the new scope.");
Messages2.functionWillNotBeVisibleInTheNewScope = createMessage("Function will not visible in the new scope.");
Messages2.cannotExtractIdentifier = createMessage("Select more than a single identifier.");
Messages2.cannotExtractExportedEntity = createMessage("Cannot extract exported declaration");
Messages2.cannotWriteInExpression = createMessage("Cannot write back side-effects when extracting an expression");
Messages2.cannotExtractReadonlyPropertyInitializerOutsideConstructor = createMessage("Cannot move initialization of read-only class property outside of the constructor");
Messages2.cannotExtractAmbientBlock = createMessage("Cannot extract code from ambient contexts");
Messages2.cannotAccessVariablesFromNestedScopes = createMessage("Cannot access variables from nested scopes");
Messages2.cannotExtractToJSClass = createMessage("Cannot extract constant to a class scope in JS");
Messages2.cannotExtractToExpressionArrowFunction = createMessage("Cannot extract constant to an arrow function without a block");
Messages2.cannotExtractFunctionsContainingThisToMethod = createMessage("Cannot extract functions containing this to method");
})(Messages || (Messages = {}));
var RangeFacts = /* @__PURE__ */ ((RangeFacts2) => {
RangeFacts2[RangeFacts2["None"] = 0] = "None";
RangeFacts2[RangeFacts2["HasReturn"] = 1] = "HasReturn";
RangeFacts2[RangeFacts2["IsGenerator"] = 2] = "IsGenerator";
RangeFacts2[RangeFacts2["IsAsyncFunction"] = 4] = "IsAsyncFunction";
RangeFacts2[RangeFacts2["UsesThis"] = 8] = "UsesThis";
RangeFacts2[RangeFacts2["UsesThisInFunction"] = 16] = "UsesThisInFunction";
RangeFacts2[RangeFacts2["InStaticRegion"] = 32] = "InStaticRegion";
return RangeFacts2;
})(RangeFacts || {});
function getRangeToExtract2(sourceFile, span, invoked = true) {
const { length: length2 } = span;
if (length2 === 0 && !invoked) {
return { errors: [createFileDiagnostic(sourceFile, span.start, length2, Messages.cannotExtractEmpty)] };
}
const cursorRequest = length2 === 0 && invoked;
const startToken = findFirstNonJsxWhitespaceToken(sourceFile, span.start);
const endToken = findTokenOnLeftOfPosition(sourceFile, textSpanEnd(span));
const adjustedSpan = startToken && endToken && invoked ? getAdjustedSpanFromNodes(startToken, endToken, sourceFile) : span;
const start2 = cursorRequest ? getExtractableParent(startToken) : getParentNodeInSpan(startToken, sourceFile, adjustedSpan);
const end = cursorRequest ? start2 : getParentNodeInSpan(endToken, sourceFile, adjustedSpan);
let rangeFacts = 0 /* None */;
let thisNode;
if (!start2 || !end) {
return { errors: [createFileDiagnostic(sourceFile, span.start, length2, Messages.cannotExtractRange)] };
}
if (start2.flags & 8388608 /* JSDoc */) {
return { errors: [createFileDiagnostic(sourceFile, span.start, length2, Messages.cannotExtractJSDoc)] };
}
if (start2.parent !== end.parent) {
return { errors: [createFileDiagnostic(sourceFile, span.start, length2, Messages.cannotExtractRange)] };
}
if (start2 !== end) {
if (!isBlockLike(start2.parent)) {
return { errors: [createFileDiagnostic(sourceFile, span.start, length2, Messages.cannotExtractRange)] };
}
const statements = [];
for (const statement of start2.parent.statements) {
if (statement === start2 || statements.length) {
const errors2 = checkNode(statement);
if (errors2) {
return { errors: errors2 };
}
statements.push(statement);
}
if (statement === end) {
break;
}
}
if (!statements.length) {
return { errors: [createFileDiagnostic(sourceFile, span.start, length2, Messages.cannotExtractRange)] };
}
return { targetRange: { range: statements, facts: rangeFacts, thisNode } };
}
if (isReturnStatement(start2) && !start2.expression) {
return { errors: [createFileDiagnostic(sourceFile, span.start, length2, Messages.cannotExtractRange)] };
}
const node = refineNode(start2);
const errors = checkRootNode(node) || checkNode(node);
if (errors) {
return { errors };
}
return { targetRange: { range: getStatementOrExpressionRange(node), facts: rangeFacts, thisNode } };
function refineNode(node2) {
if (isReturnStatement(node2)) {
if (node2.expression) {
return node2.expression;
}
} else if (isVariableStatement(node2) || isVariableDeclarationList(node2)) {
const declarations = isVariableStatement(node2) ? node2.declarationList.declarations : node2.declarations;
let numInitializers = 0;
let lastInitializer;
for (const declaration of declarations) {
if (declaration.initializer) {
numInitializers++;
lastInitializer = declaration.initializer;
}
}
if (numInitializers === 1) {
return lastInitializer;
}
} else if (isVariableDeclaration(node2)) {
if (node2.initializer) {
return node2.initializer;
}
}
return node2;
}
function checkRootNode(node2) {
if (isIdentifier(isExpressionStatement(node2) ? node2.expression : node2)) {
return [createDiagnosticForNode(node2, Messages.cannotExtractIdentifier)];
}
return void 0;
}
function checkForStaticContext(nodeToCheck, containingClass) {
let current = nodeToCheck;
while (current !== containingClass) {
if (current.kind === 171 /* PropertyDeclaration */) {
if (isStatic(current)) {
rangeFacts |= 32 /* InStaticRegion */;
}
break;
} else if (current.kind === 168 /* Parameter */) {
const ctorOrMethod = getContainingFunction(current);
if (ctorOrMethod.kind === 175 /* Constructor */) {
rangeFacts |= 32 /* InStaticRegion */;
}
break;
} else if (current.kind === 173 /* MethodDeclaration */) {
if (isStatic(current)) {
rangeFacts |= 32 /* InStaticRegion */;
}
}
current = current.parent;
}
}
function checkNode(nodeToCheck) {
let PermittedJumps;
((PermittedJumps2) => {
PermittedJumps2[PermittedJumps2["None"] = 0] = "None";
PermittedJumps2[PermittedJumps2["Break"] = 1] = "Break";
PermittedJumps2[PermittedJumps2["Continue"] = 2] = "Continue";
PermittedJumps2[PermittedJumps2["Return"] = 4] = "Return";
})(PermittedJumps || (PermittedJumps = {}));
Debug.assert(nodeToCheck.pos <= nodeToCheck.end, "This failure could trigger https://github.com/Microsoft/TypeScript/issues/20809 (1)");
Debug.assert(!positionIsSynthesized(nodeToCheck.pos), "This failure could trigger https://github.com/Microsoft/TypeScript/issues/20809 (2)");
if (!isStatement(nodeToCheck) && !(isExpressionNode(nodeToCheck) && isExtractableExpression(nodeToCheck)) && !isStringLiteralJsxAttribute(nodeToCheck)) {
return [createDiagnosticForNode(nodeToCheck, Messages.statementOrExpressionExpected)];
}
if (nodeToCheck.flags & 16777216 /* Ambient */) {
return [createDiagnosticForNode(nodeToCheck, Messages.cannotExtractAmbientBlock)];
}
const containingClass = getContainingClass(nodeToCheck);
if (containingClass) {
checkForStaticContext(nodeToCheck, containingClass);
}
let errors2;
let permittedJumps = 4 /* Return */;
let seenLabels;
visit(nodeToCheck);
if (rangeFacts & 8 /* UsesThis */) {
const container = getThisContainer(
nodeToCheck,
/*includeArrowFunctions*/
false,
/*includeClassComputedPropertyName*/
false
);
if (container.kind === 261 /* FunctionDeclaration */ || container.kind === 173 /* MethodDeclaration */ && container.parent.kind === 209 /* ObjectLiteralExpression */ || container.kind === 217 /* FunctionExpression */) {
rangeFacts |= 16 /* UsesThisInFunction */;
}
}
return errors2;
function visit(node2) {
if (errors2) {
return true;
}
if (isDeclaration(node2)) {
const declaringNode = node2.kind === 259 /* VariableDeclaration */ ? node2.parent.parent : node2;
if (hasSyntacticModifier(declaringNode, 1 /* Export */)) {
(errors2 || (errors2 = [])).push(createDiagnosticForNode(node2, Messages.cannotExtractExportedEntity));
return true;
}
}
switch (node2.kind) {
case 271 /* ImportDeclaration */:
(errors2 || (errors2 = [])).push(createDiagnosticForNode(node2, Messages.cannotExtractImport));
return true;
case 276 /* ExportAssignment */:
(errors2 || (errors2 = [])).push(createDiagnosticForNode(node2, Messages.cannotExtractExportedEntity));
return true;
case 108 /* SuperKeyword */:
if (node2.parent.kind === 212 /* CallExpression */) {
const containingClass2 = getContainingClass(node2);
if (containingClass2 === void 0 || containingClass2.pos < span.start || containingClass2.end >= span.start + span.length) {
(errors2 || (errors2 = [])).push(createDiagnosticForNode(node2, Messages.cannotExtractSuper));
return true;
}
} else {
rangeFacts |= 8 /* UsesThis */;
thisNode = node2;
}
break;
case 218 /* ArrowFunction */:
forEachChild(node2, function check(n) {
if (isThis(n)) {
rangeFacts |= 8 /* UsesThis */;
thisNode = node2;
} else if (isClassLike(n) || isFunctionLike(n) && !isArrowFunction(n)) {
return false;
} else {
forEachChild(n, check);
}
});
case 262 /* ClassDeclaration */:
case 261 /* FunctionDeclaration */:
if (isSourceFile(node2.parent) && node2.parent.externalModuleIndicator === void 0) {
(errors2 || (errors2 = [])).push(createDiagnosticForNode(node2, Messages.functionWillNotBeVisibleInTheNewScope));
}
case 230 /* ClassExpression */:
case 217 /* FunctionExpression */:
case 173 /* MethodDeclaration */:
case 175 /* Constructor */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
return false;
}
const savedPermittedJumps = permittedJumps;
switch (node2.kind) {
case 244 /* IfStatement */:
permittedJumps &= ~4 /* Return */;
break;
case 257 /* TryStatement */:
permittedJumps = 0 /* None */;
break;
case 240 /* Block */:
if (node2.parent && node2.parent.kind === 257 /* TryStatement */ && node2.parent.finallyBlock === node2) {
permittedJumps = 4 /* Return */;
}
break;
case 296 /* DefaultClause */:
case 295 /* CaseClause */:
permittedJumps |= 1 /* Break */;
break;
default:
if (isIterationStatement(
node2,
/*lookInLabeledStatements*/
false
)) {
permittedJumps |= 1 /* Break */ | 2 /* Continue */;
}
break;
}
switch (node2.kind) {
case 196 /* ThisType */:
case 110 /* ThisKeyword */:
rangeFacts |= 8 /* UsesThis */;
thisNode = node2;
break;
case 255 /* LabeledStatement */: {
const label = node2.label;
(seenLabels || (seenLabels = [])).push(label.escapedText);
forEachChild(node2, visit);
seenLabels.pop();
break;
}
case 251 /* BreakStatement */:
case 250 /* ContinueStatement */: {
const label = node2.label;
if (label) {
if (!contains(seenLabels, label.escapedText)) {
(errors2 || (errors2 = [])).push(createDiagnosticForNode(node2, Messages.cannotExtractRangeContainingLabeledBreakOrContinueStatementWithTargetOutsideOfTheRange));
}
} else {
if (!(permittedJumps & (node2.kind === 251 /* BreakStatement */ ? 1 /* Break */ : 2 /* Continue */))) {
(errors2 || (errors2 = [])).push(createDiagnosticForNode(node2, Messages.cannotExtractRangeContainingConditionalBreakOrContinueStatements));
}
}
break;
}
case 222 /* AwaitExpression */:
rangeFacts |= 4 /* IsAsyncFunction */;
break;
case 228 /* YieldExpression */:
rangeFacts |= 2 /* IsGenerator */;
break;
case 252 /* ReturnStatement */:
if (permittedJumps & 4 /* Return */) {
rangeFacts |= 1 /* HasReturn */;
} else {
(errors2 || (errors2 = [])).push(createDiagnosticForNode(node2, Messages.cannotExtractRangeContainingConditionalReturnStatement));
}
break;
default:
forEachChild(node2, visit);
break;
}
permittedJumps = savedPermittedJumps;
}
}
}
function getAdjustedSpanFromNodes(startNode2, endNode2, sourceFile) {
const start2 = startNode2.getStart(sourceFile);
let end = endNode2.getEnd();
if (sourceFile.text.charCodeAt(end) === 59 /* semicolon */) {
end++;
}
return { start: start2, length: end - start2 };
}
function getStatementOrExpressionRange(node) {
if (isStatement(node)) {
return [node];
}
if (isExpressionNode(node)) {
return isExpressionStatement(node.parent) ? [node.parent] : node;
}
if (isStringLiteralJsxAttribute(node)) {
return node;
}
return void 0;
}
function isScope(node) {
return isArrowFunction(node) ? isFunctionBody(node.body) : isFunctionLikeDeclaration(node) || isSourceFile(node) || isModuleBlock(node) || isClassLike(node);
}
function collectEnclosingScopes(range) {
let current = isReadonlyArray(range.range) ? first(range.range) : range.range;
if (range.facts & 8 /* UsesThis */ && !(range.facts & 16 /* UsesThisInFunction */)) {
const containingClass = getContainingClass(current);
if (containingClass) {
const containingFunction = findAncestor(current, isFunctionLikeDeclaration);
return containingFunction ? [containingFunction, containingClass] : [containingClass];
}
}
const scopes = [];
while (true) {
current = current.parent;
if (current.kind === 168 /* Parameter */) {
current = findAncestor(current, (parent2) => isFunctionLikeDeclaration(parent2)).parent;
}
if (isScope(current)) {
scopes.push(current);
if (current.kind === 311 /* SourceFile */) {
return scopes;
}
}
}
}
function getFunctionExtractionAtIndex(targetRange, context, requestedChangesIndex) {
const { scopes, readsAndWrites: { target, usagesPerScope, functionErrorsPerScope, exposedVariableDeclarations } } = getPossibleExtractionsWorker(targetRange, context);
Debug.assert(!functionErrorsPerScope[requestedChangesIndex].length, "The extraction went missing? How?");
context.cancellationToken.throwIfCancellationRequested();
return extractFunctionInScope(target, scopes[requestedChangesIndex], usagesPerScope[requestedChangesIndex], exposedVariableDeclarations, targetRange, context);
}
function getConstantExtractionAtIndex(targetRange, context, requestedChangesIndex) {
const { scopes, readsAndWrites: { target, usagesPerScope, constantErrorsPerScope, exposedVariableDeclarations } } = getPossibleExtractionsWorker(targetRange, context);
Debug.assert(!constantErrorsPerScope[requestedChangesIndex].length, "The extraction went missing? How?");
Debug.assert(exposedVariableDeclarations.length === 0, "Extract constant accepted a range containing a variable declaration?");
context.cancellationToken.throwIfCancellationRequested();
const expression = isExpression(target) ? target : target.statements[0].expression;
return extractConstantInScope(expression, scopes[requestedChangesIndex], usagesPerScope[requestedChangesIndex], targetRange.facts, context);
}
function getPossibleExtractions(targetRange, context) {
const { scopes, readsAndWrites: { functionErrorsPerScope, constantErrorsPerScope } } = getPossibleExtractionsWorker(targetRange, context);
const extractions = scopes.map((scope, i) => {
const functionDescriptionPart = getDescriptionForFunctionInScope(scope);
const constantDescriptionPart = getDescriptionForConstantInScope(scope);
const scopeDescription = isFunctionLikeDeclaration(scope) ? getDescriptionForFunctionLikeDeclaration(scope) : isClassLike(scope) ? getDescriptionForClassLikeDeclaration(scope) : getDescriptionForModuleLikeDeclaration(scope);
let functionDescription;
let constantDescription;
if (scopeDescription === 1 /* Global */) {
functionDescription = formatStringFromArgs(getLocaleSpecificMessage(Diagnostics.Extract_to_0_in_1_scope), [functionDescriptionPart, "global"]);
constantDescription = formatStringFromArgs(getLocaleSpecificMessage(Diagnostics.Extract_to_0_in_1_scope), [constantDescriptionPart, "global"]);
} else if (scopeDescription === 0 /* Module */) {
functionDescription = formatStringFromArgs(getLocaleSpecificMessage(Diagnostics.Extract_to_0_in_1_scope), [functionDescriptionPart, "module"]);
constantDescription = formatStringFromArgs(getLocaleSpecificMessage(Diagnostics.Extract_to_0_in_1_scope), [constantDescriptionPart, "module"]);
} else {
functionDescription = formatStringFromArgs(getLocaleSpecificMessage(Diagnostics.Extract_to_0_in_1), [functionDescriptionPart, scopeDescription]);
constantDescription = formatStringFromArgs(getLocaleSpecificMessage(Diagnostics.Extract_to_0_in_1), [constantDescriptionPart, scopeDescription]);
}
if (i === 0 && !isClassLike(scope)) {
constantDescription = formatStringFromArgs(getLocaleSpecificMessage(Diagnostics.Extract_to_0_in_enclosing_scope), [constantDescriptionPart]);
}
return {
functionExtraction: {
description: functionDescription,
errors: functionErrorsPerScope[i]
},
constantExtraction: {
description: constantDescription,
errors: constantErrorsPerScope[i]
}
};
});
return extractions;
}
function getPossibleExtractionsWorker(targetRange, context) {
const { file: sourceFile } = context;
const scopes = collectEnclosingScopes(targetRange);
const enclosingTextRange = getEnclosingTextRange(targetRange, sourceFile);
const readsAndWrites = collectReadsAndWrites(
targetRange,
scopes,
enclosingTextRange,
sourceFile,
context.program.getTypeChecker(),
context.cancellationToken
);
return { scopes, readsAndWrites };
}
function getDescriptionForFunctionInScope(scope) {
return isFunctionLikeDeclaration(scope) ? "inner function" : isClassLike(scope) ? "method" : "function";
}
function getDescriptionForConstantInScope(scope) {
return isClassLike(scope) ? "readonly field" : "constant";
}
function getDescriptionForFunctionLikeDeclaration(scope) {
switch (scope.kind) {
case 175 /* Constructor */:
return "constructor";
case 217 /* FunctionExpression */:
case 261 /* FunctionDeclaration */:
return scope.name ? `function '${scope.name.text}'` : ANONYMOUS;
case 218 /* ArrowFunction */:
return "arrow function";
case 173 /* MethodDeclaration */:
return `method '${scope.name.getText()}'`;
case 176 /* GetAccessor */:
return `'get ${scope.name.getText()}'`;
case 177 /* SetAccessor */:
return `'set ${scope.name.getText()}'`;
default:
Debug.assertNever(scope, `Unexpected scope kind ${scope.kind}`);
}
}
function getDescriptionForClassLikeDeclaration(scope) {
return scope.kind === 262 /* ClassDeclaration */ ? scope.name ? `class '${scope.name.text}'` : "anonymous class declaration" : scope.name ? `class expression '${scope.name.text}'` : "anonymous class expression";
}
function getDescriptionForModuleLikeDeclaration(scope) {
return scope.kind === 267 /* ModuleBlock */ ? `namespace '${scope.parent.name.getText()}'` : scope.externalModuleIndicator ? 0 /* Module */ : 1 /* Global */;
}
function extractFunctionInScope(node, scope, { usages: usagesInScope, typeParameterUsages, substitutions }, exposedVariableDeclarations, range, context) {
const checker = context.program.getTypeChecker();
const scriptTarget = getEmitScriptTarget(context.program.getCompilerOptions());
const importAdder = ts_codefix_exports.createImportAdder(context.file, context.program, context.preferences, context.host);
const file = scope.getSourceFile();
const functionNameText = getUniqueName(isClassLike(scope) ? "newMethod" : "newFunction", file);
const isJS = isInJSFile(scope);
const functionName = factory.createIdentifier(functionNameText);
let returnType;
const parameters = [];
const callArguments = [];
let writes;
usagesInScope.forEach((usage, name) => {
let typeNode;
if (!isJS) {
let type = checker.getTypeOfSymbolAtLocation(usage.symbol, usage.node);
type = checker.getBaseTypeOfLiteralType(type);
typeNode = ts_codefix_exports.typeToAutoImportableTypeNode(checker, importAdder, type, scope, scriptTarget, 1 /* NoTruncation */);
}
const paramDecl = factory.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
/*name*/
name,
/*questionToken*/
void 0,
typeNode
);
parameters.push(paramDecl);
if (usage.usage === 2 /* Write */) {
(writes || (writes = [])).push(usage);
}
callArguments.push(factory.createIdentifier(name));
});
const typeParametersAndDeclarations = arrayFrom(typeParameterUsages.values(), (type) => ({ type, declaration: getFirstDeclarationBeforePosition(type, context.startPosition) }));
const sortedTypeParametersAndDeclarations = typeParametersAndDeclarations.sort(compareTypesByDeclarationOrder);
const typeParameters = sortedTypeParametersAndDeclarations.length === 0 ? void 0 : mapDefined(sortedTypeParametersAndDeclarations, ({ declaration }) => declaration);
const callTypeArguments = typeParameters !== void 0 ? typeParameters.map((decl) => factory.createTypeReferenceNode(
decl.name,
/*typeArguments*/
void 0
)) : void 0;
if (isExpression(node) && !isJS) {
const contextualType = checker.getContextualType(node);
returnType = checker.typeToTypeNode(contextualType, scope, 1 /* NoTruncation */);
}
const { body, returnValueProperty } = transformFunctionBody(node, exposedVariableDeclarations, writes, substitutions, !!(range.facts & 1 /* HasReturn */));
suppressLeadingAndTrailingTrivia(body);
let newFunction;
const callThis = !!(range.facts & 16 /* UsesThisInFunction */);
if (isClassLike(scope)) {
const modifiers = isJS ? [] : [factory.createModifier(123 /* PrivateKeyword */)];
if (range.facts & 32 /* InStaticRegion */) {
modifiers.push(factory.createModifier(126 /* StaticKeyword */));
}
if (range.facts & 4 /* IsAsyncFunction */) {
modifiers.push(factory.createModifier(134 /* AsyncKeyword */));
}
newFunction = factory.createMethodDeclaration(
modifiers.length ? modifiers : void 0,
range.facts & 2 /* IsGenerator */ ? factory.createToken(42 /* AsteriskToken */) : void 0,
functionName,
/*questionToken*/
void 0,
typeParameters,
parameters,
returnType,
body
);
} else {
if (callThis) {
parameters.unshift(
factory.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
/*name*/
"this",
/*questionToken*/
void 0,
checker.typeToTypeNode(
checker.getTypeAtLocation(range.thisNode),
scope,
1 /* NoTruncation */
),
/*initializer*/
void 0
)
);
}
newFunction = factory.createFunctionDeclaration(
range.facts & 4 /* IsAsyncFunction */ ? [factory.createToken(134 /* AsyncKeyword */)] : void 0,
range.facts & 2 /* IsGenerator */ ? factory.createToken(42 /* AsteriskToken */) : void 0,
functionName,
typeParameters,
parameters,
returnType,
body
);
}
const changeTracker = ts_textChanges_exports.ChangeTracker.fromContext(context);
const minInsertionPos = (isReadonlyArray(range.range) ? last(range.range) : range.range).end;
const nodeToInsertBefore = getNodeToInsertFunctionBefore(minInsertionPos, scope);
if (nodeToInsertBefore) {
changeTracker.insertNodeBefore(
context.file,
nodeToInsertBefore,
newFunction,
/*blankLineBetween*/
true
);
} else {
changeTracker.insertNodeAtEndOfScope(context.file, scope, newFunction);
}
importAdder.writeFixes(changeTracker);
const newNodes = [];
const called = getCalledExpression(scope, range, functionNameText);
if (callThis) {
callArguments.unshift(factory.createIdentifier("this"));
}
let call = factory.createCallExpression(
callThis ? factory.createPropertyAccessExpression(
called,
"call"
) : called,
callTypeArguments,
// Note that no attempt is made to take advantage of type argument inference
callArguments
);
if (range.facts & 2 /* IsGenerator */) {
call = factory.createYieldExpression(factory.createToken(42 /* AsteriskToken */), call);
}
if (range.facts & 4 /* IsAsyncFunction */) {
call = factory.createAwaitExpression(call);
}
if (isInJSXContent(node)) {
call = factory.createJsxExpression(
/*dotDotDotToken*/
void 0,
call
);
}
if (exposedVariableDeclarations.length && !writes) {
Debug.assert(!returnValueProperty, "Expected no returnValueProperty");
Debug.assert(!(range.facts & 1 /* HasReturn */), "Expected RangeFacts.HasReturn flag to be unset");
if (exposedVariableDeclarations.length === 1) {
const variableDeclaration = exposedVariableDeclarations[0];
newNodes.push(factory.createVariableStatement(
/*modifiers*/
void 0,
factory.createVariableDeclarationList(
[factory.createVariableDeclaration(
getSynthesizedDeepClone(variableDeclaration.name),
/*exclamationToken*/
void 0,
/*type*/
getSynthesizedDeepClone(variableDeclaration.type),
/*initializer*/
call
)],
variableDeclaration.parent.flags
)
));
} else {
const bindingElements = [];
const typeElements = [];
let commonNodeFlags = exposedVariableDeclarations[0].parent.flags;
let sawExplicitType = false;
for (const variableDeclaration of exposedVariableDeclarations) {
bindingElements.push(factory.createBindingElement(
/*dotDotDotToken*/
void 0,
/*propertyName*/
void 0,
/*name*/
getSynthesizedDeepClone(variableDeclaration.name)
));
const variableType = checker.typeToTypeNode(
checker.getBaseTypeOfLiteralType(checker.getTypeAtLocation(variableDeclaration)),
scope,
1 /* NoTruncation */
);
typeElements.push(factory.createPropertySignature(
/*modifiers*/
void 0,
/*name*/
variableDeclaration.symbol.name,
/*questionToken*/
void 0,
/*type*/
variableType
));
sawExplicitType = sawExplicitType || variableDeclaration.type !== void 0;
commonNodeFlags = commonNodeFlags & variableDeclaration.parent.flags;
}
const typeLiteral = sawExplicitType ? factory.createTypeLiteralNode(typeElements) : void 0;
if (typeLiteral) {
setEmitFlags(typeLiteral, 1 /* SingleLine */);
}
newNodes.push(factory.createVariableStatement(
/*modifiers*/
void 0,
factory.createVariableDeclarationList(
[factory.createVariableDeclaration(
factory.createObjectBindingPattern(bindingElements),
/*exclamationToken*/
void 0,
/*type*/
typeLiteral,
/*initializer*/
call
)],
commonNodeFlags
)
));
}
} else if (exposedVariableDeclarations.length || writes) {
if (exposedVariableDeclarations.length) {
for (const variableDeclaration of exposedVariableDeclarations) {
let flags = variableDeclaration.parent.flags;
if (flags & 2 /* Const */) {
flags = flags & ~2 /* Const */ | 1 /* Let */;
}
newNodes.push(factory.createVariableStatement(
/*modifiers*/
void 0,
factory.createVariableDeclarationList(
[factory.createVariableDeclaration(
variableDeclaration.symbol.name,
/*exclamationToken*/
void 0,
getTypeDeepCloneUnionUndefined(variableDeclaration.type)
)],
flags
)
));
}
}
if (returnValueProperty) {
newNodes.push(factory.createVariableStatement(
/*modifiers*/
void 0,
factory.createVariableDeclarationList(
[factory.createVariableDeclaration(
returnValueProperty,
/*exclamationToken*/
void 0,
getTypeDeepCloneUnionUndefined(returnType)
)],
1 /* Let */
)
));
}
const assignments = getPropertyAssignmentsForWritesAndVariableDeclarations(exposedVariableDeclarations, writes);
if (returnValueProperty) {
assignments.unshift(factory.createShorthandPropertyAssignment(returnValueProperty));
}
if (assignments.length === 1) {
Debug.assert(!returnValueProperty, "Shouldn't have returnValueProperty here");
newNodes.push(factory.createExpressionStatement(factory.createAssignment(assignments[0].name, call)));
if (range.facts & 1 /* HasReturn */) {
newNodes.push(factory.createReturnStatement());
}
} else {
newNodes.push(factory.createExpressionStatement(factory.createAssignment(factory.createObjectLiteralExpression(assignments), call)));
if (returnValueProperty) {
newNodes.push(factory.createReturnStatement(factory.createIdentifier(returnValueProperty)));
}
}
} else {
if (range.facts & 1 /* HasReturn */) {
newNodes.push(factory.createReturnStatement(call));
} else if (isReadonlyArray(range.range)) {
newNodes.push(factory.createExpressionStatement(call));
} else {
newNodes.push(call);
}
}
if (isReadonlyArray(range.range)) {
changeTracker.replaceNodeRangeWithNodes(context.file, first(range.range), last(range.range), newNodes);
} else {
changeTracker.replaceNodeWithNodes(context.file, range.range, newNodes);
}
const edits = changeTracker.getChanges();
const renameRange = isReadonlyArray(range.range) ? first(range.range) : range.range;
const renameFilename = renameRange.getSourceFile().fileName;
const renameLocation = getRenameLocation(
edits,
renameFilename,
functionNameText,
/*preferLastLocation*/
false
);
return { renameFilename, renameLocation, edits };
function getTypeDeepCloneUnionUndefined(typeNode) {
if (typeNode === void 0) {
return void 0;
}
const clone2 = getSynthesizedDeepClone(typeNode);
let withoutParens = clone2;
while (isParenthesizedTypeNode(withoutParens)) {
withoutParens = withoutParens.type;
}
return isUnionTypeNode(withoutParens) && find(withoutParens.types, (t) => t.kind === 157 /* UndefinedKeyword */) ? clone2 : factory.createUnionTypeNode([clone2, factory.createKeywordTypeNode(157 /* UndefinedKeyword */)]);
}
}
function extractConstantInScope(node, scope, { substitutions }, rangeFacts, context) {
const checker = context.program.getTypeChecker();
const file = scope.getSourceFile();
const localNameText = isPropertyAccessExpression(node) && !isClassLike(scope) && !checker.resolveName(
node.name.text,
node,
111551 /* Value */,
/*excludeGlobals*/
false
) && !isPrivateIdentifier(node.name) && !identifierToKeywordKind(node.name) ? node.name.text : getUniqueName(isClassLike(scope) ? "newProperty" : "newLocal", file);
const isJS = isInJSFile(scope);
let variableType = isJS || !checker.isContextSensitive(node) ? void 0 : checker.typeToTypeNode(checker.getContextualType(node), scope, 1 /* NoTruncation */);
let initializer = transformConstantInitializer(skipParentheses(node), substitutions);
({ variableType, initializer } = transformFunctionInitializerAndType(variableType, initializer));
suppressLeadingAndTrailingTrivia(initializer);
const changeTracker = ts_textChanges_exports.ChangeTracker.fromContext(context);
if (isClassLike(scope)) {
Debug.assert(!isJS, "Cannot extract to a JS class");
const modifiers = [];
modifiers.push(factory.createModifier(123 /* PrivateKeyword */));
if (rangeFacts & 32 /* InStaticRegion */) {
modifiers.push(factory.createModifier(126 /* StaticKeyword */));
}
modifiers.push(factory.createModifier(148 /* ReadonlyKeyword */));
const newVariable = factory.createPropertyDeclaration(
modifiers,
localNameText,
/*questionOrExclamationToken*/
void 0,
variableType,
initializer
);
let localReference = factory.createPropertyAccessExpression(
rangeFacts & 32 /* InStaticRegion */ ? factory.createIdentifier(scope.name.getText()) : factory.createThis(),
factory.createIdentifier(localNameText)
);
if (isInJSXContent(node)) {
localReference = factory.createJsxExpression(
/*dotDotDotToken*/
void 0,
localReference
);
}
const maxInsertionPos = node.pos;
const nodeToInsertBefore = getNodeToInsertPropertyBefore(maxInsertionPos, scope);
changeTracker.insertNodeBefore(
context.file,
nodeToInsertBefore,
newVariable,
/*blankLineBetween*/
true
);
changeTracker.replaceNode(context.file, node, localReference);
} else {
const newVariableDeclaration = factory.createVariableDeclaration(
localNameText,
/*exclamationToken*/
void 0,
variableType,
initializer
);
const oldVariableDeclaration = getContainingVariableDeclarationIfInList(node, scope);
if (oldVariableDeclaration) {
changeTracker.insertNodeBefore(context.file, oldVariableDeclaration, newVariableDeclaration);
const localReference = factory.createIdentifier(localNameText);
changeTracker.replaceNode(context.file, node, localReference);
} else if (node.parent.kind === 243 /* ExpressionStatement */ && scope === findAncestor(node, isScope)) {
const newVariableStatement = factory.createVariableStatement(
/*modifiers*/
void 0,
factory.createVariableDeclarationList([newVariableDeclaration], 2 /* Const */)
);
changeTracker.replaceNode(context.file, node.parent, newVariableStatement);
} else {
const newVariableStatement = factory.createVariableStatement(
/*modifiers*/
void 0,
factory.createVariableDeclarationList([newVariableDeclaration], 2 /* Const */)
);
const nodeToInsertBefore = getNodeToInsertConstantBefore(node, scope);
if (nodeToInsertBefore.pos === 0) {
changeTracker.insertNodeAtTopOfFile(
context.file,
newVariableStatement,
/*blankLineBetween*/
false
);
} else {
changeTracker.insertNodeBefore(
context.file,
nodeToInsertBefore,
newVariableStatement,
/*blankLineBetween*/
false
);
}
if (node.parent.kind === 243 /* ExpressionStatement */) {
changeTracker.delete(context.file, node.parent);
} else {
let localReference = factory.createIdentifier(localNameText);
if (isInJSXContent(node)) {
localReference = factory.createJsxExpression(
/*dotDotDotToken*/
void 0,
localReference
);
}
changeTracker.replaceNode(context.file, node, localReference);
}
}
}
const edits = changeTracker.getChanges();
const renameFilename = node.getSourceFile().fileName;
const renameLocation = getRenameLocation(
edits,
renameFilename,
localNameText,
/*preferLastLocation*/
true
);
return { renameFilename, renameLocation, edits };
function transformFunctionInitializerAndType(variableType2, initializer2) {
if (variableType2 === void 0)
return { variableType: variableType2, initializer: initializer2 };
if (!isFunctionExpression(initializer2) && !isArrowFunction(initializer2) || !!initializer2.typeParameters)
return { variableType: variableType2, initializer: initializer2 };
const functionType = checker.getTypeAtLocation(node);
const functionSignature = singleOrUndefined(checker.getSignaturesOfType(functionType, 0 /* Call */));
if (!functionSignature)
return { variableType: variableType2, initializer: initializer2 };
if (!!functionSignature.getTypeParameters())
return { variableType: variableType2, initializer: initializer2 };
const parameters = [];
let hasAny = false;
for (const p of initializer2.parameters) {
if (p.type) {
parameters.push(p);
} else {
const paramType = checker.getTypeAtLocation(p);
if (paramType === checker.getAnyType())
hasAny = true;
parameters.push(factory.updateParameterDeclaration(
p,
p.modifiers,
p.dotDotDotToken,
p.name,
p.questionToken,
p.type || checker.typeToTypeNode(paramType, scope, 1 /* NoTruncation */),
p.initializer
));
}
}
if (hasAny)
return { variableType: variableType2, initializer: initializer2 };
variableType2 = void 0;
if (isArrowFunction(initializer2)) {
initializer2 = factory.updateArrowFunction(
initializer2,
canHaveModifiers(node) ? getModifiers(node) : void 0,
initializer2.typeParameters,
parameters,
initializer2.type || checker.typeToTypeNode(functionSignature.getReturnType(), scope, 1 /* NoTruncation */),
initializer2.equalsGreaterThanToken,
initializer2.body
);
} else {
if (functionSignature && !!functionSignature.thisParameter) {
const firstParameter = firstOrUndefined(parameters);
if (!firstParameter || isIdentifier(firstParameter.name) && firstParameter.name.escapedText !== "this") {
const thisType = checker.getTypeOfSymbolAtLocation(functionSignature.thisParameter, node);
parameters.splice(0, 0, factory.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
"this",
/*questionToken*/
void 0,
checker.typeToTypeNode(thisType, scope, 1 /* NoTruncation */)
));
}
}
initializer2 = factory.updateFunctionExpression(
initializer2,
canHaveModifiers(node) ? getModifiers(node) : void 0,
initializer2.asteriskToken,
initializer2.name,
initializer2.typeParameters,
parameters,
initializer2.type || checker.typeToTypeNode(functionSignature.getReturnType(), scope, 1 /* NoTruncation */),
initializer2.body
);
}
return { variableType: variableType2, initializer: initializer2 };
}
}
function getContainingVariableDeclarationIfInList(node, scope) {
let prevNode;
while (node !== void 0 && node !== scope) {
if (isVariableDeclaration(node) && node.initializer === prevNode && isVariableDeclarationList(node.parent) && node.parent.declarations.length > 1) {
return node;
}
prevNode = node;
node = node.parent;
}
}
function getFirstDeclarationBeforePosition(type, position) {
let firstDeclaration;
const symbol = type.symbol;
if (symbol && symbol.declarations) {
for (const declaration of symbol.declarations) {
if ((firstDeclaration === void 0 || declaration.pos < firstDeclaration.pos) && declaration.pos < position) {
firstDeclaration = declaration;
}
}
}
return firstDeclaration;
}
function compareTypesByDeclarationOrder({ type: type1, declaration: declaration1 }, { type: type2, declaration: declaration2 }) {
return compareProperties(declaration1, declaration2, "pos", compareValues) || compareStringsCaseSensitive(
type1.symbol ? type1.symbol.getName() : "",
type2.symbol ? type2.symbol.getName() : ""
) || compareValues(type1.id, type2.id);
}
function getCalledExpression(scope, range, functionNameText) {
const functionReference = factory.createIdentifier(functionNameText);
if (isClassLike(scope)) {
const lhs = range.facts & 32 /* InStaticRegion */ ? factory.createIdentifier(scope.name.text) : factory.createThis();
return factory.createPropertyAccessExpression(lhs, functionReference);
} else {
return functionReference;
}
}
function transformFunctionBody(body, exposedVariableDeclarations, writes, substitutions, hasReturn2) {
const hasWritesOrVariableDeclarations = writes !== void 0 || exposedVariableDeclarations.length > 0;
if (isBlock(body) && !hasWritesOrVariableDeclarations && substitutions.size === 0) {
return { body: factory.createBlock(
body.statements,
/*multiLine*/
true
), returnValueProperty: void 0 };
}
let returnValueProperty;
let ignoreReturns = false;
const statements = factory.createNodeArray(isBlock(body) ? body.statements.slice(0) : [isStatement(body) ? body : factory.createReturnStatement(skipParentheses(body))]);
if (hasWritesOrVariableDeclarations || substitutions.size) {
const rewrittenStatements = visitNodes2(statements, visitor, isStatement).slice();
if (hasWritesOrVariableDeclarations && !hasReturn2 && isStatement(body)) {
const assignments = getPropertyAssignmentsForWritesAndVariableDeclarations(exposedVariableDeclarations, writes);
if (assignments.length === 1) {
rewrittenStatements.push(factory.createReturnStatement(assignments[0].name));
} else {
rewrittenStatements.push(factory.createReturnStatement(factory.createObjectLiteralExpression(assignments)));
}
}
return { body: factory.createBlock(
rewrittenStatements,
/*multiLine*/
true
), returnValueProperty };
} else {
return { body: factory.createBlock(
statements,
/*multiLine*/
true
), returnValueProperty: void 0 };
}
function visitor(node) {
if (!ignoreReturns && isReturnStatement(node) && hasWritesOrVariableDeclarations) {
const assignments = getPropertyAssignmentsForWritesAndVariableDeclarations(exposedVariableDeclarations, writes);
if (node.expression) {
if (!returnValueProperty) {
returnValueProperty = "__return";
}
assignments.unshift(factory.createPropertyAssignment(returnValueProperty, visitNode(node.expression, visitor, isExpression)));
}
if (assignments.length === 1) {
return factory.createReturnStatement(assignments[0].name);
} else {
return factory.createReturnStatement(factory.createObjectLiteralExpression(assignments));
}
} else {
const oldIgnoreReturns = ignoreReturns;
ignoreReturns = ignoreReturns || isFunctionLikeDeclaration(node) || isClassLike(node);
const substitution = substitutions.get(getNodeId(node).toString());
const result = substitution ? getSynthesizedDeepClone(substitution) : visitEachChild(node, visitor, nullTransformationContext);
ignoreReturns = oldIgnoreReturns;
return result;
}
}
}
function transformConstantInitializer(initializer, substitutions) {
return substitutions.size ? visitor(initializer) : initializer;
function visitor(node) {
const substitution = substitutions.get(getNodeId(node).toString());
return substitution ? getSynthesizedDeepClone(substitution) : visitEachChild(node, visitor, nullTransformationContext);
}
}
function getStatementsOrClassElements(scope) {
if (isFunctionLikeDeclaration(scope)) {
const body = scope.body;
if (isBlock(body)) {
return body.statements;
}
} else if (isModuleBlock(scope) || isSourceFile(scope)) {
return scope.statements;
} else if (isClassLike(scope)) {
return scope.members;
} else {
assertType(scope);
}
return emptyArray;
}
function getNodeToInsertFunctionBefore(minPos, scope) {
return find(getStatementsOrClassElements(scope), (child) => child.pos >= minPos && isFunctionLikeDeclaration(child) && !isConstructorDeclaration(child));
}
function getNodeToInsertPropertyBefore(maxPos, scope) {
const members = scope.members;
Debug.assert(members.length > 0, "Found no members");
let prevMember;
let allProperties = true;
for (const member of members) {
if (member.pos > maxPos) {
return prevMember || members[0];
}
if (allProperties && !isPropertyDeclaration(member)) {
if (prevMember !== void 0) {
return member;
}
allProperties = false;
}
prevMember = member;
}
if (prevMember === void 0)
return Debug.fail();
return prevMember;
}
function getNodeToInsertConstantBefore(node, scope) {
Debug.assert(!isClassLike(scope));
let prevScope;
for (let curr = node; curr !== scope; curr = curr.parent) {
if (isScope(curr)) {
prevScope = curr;
}
}
for (let curr = (prevScope || node).parent; ; curr = curr.parent) {
if (isBlockLike(curr)) {
let prevStatement;
for (const statement of curr.statements) {
if (statement.pos > node.pos) {
break;
}
prevStatement = statement;
}
if (!prevStatement && isCaseClause(curr)) {
Debug.assert(isSwitchStatement(curr.parent.parent), "Grandparent isn't a switch statement");
return curr.parent.parent;
}
return Debug.checkDefined(prevStatement, "prevStatement failed to get set");
}
Debug.assert(curr !== scope, "Didn't encounter a block-like before encountering scope");
}
}
function getPropertyAssignmentsForWritesAndVariableDeclarations(exposedVariableDeclarations, writes) {
const variableAssignments = map(exposedVariableDeclarations, (v) => factory.createShorthandPropertyAssignment(v.symbol.name));
const writeAssignments = map(writes, (w) => factory.createShorthandPropertyAssignment(w.symbol.name));
return variableAssignments === void 0 ? writeAssignments : writeAssignments === void 0 ? variableAssignments : variableAssignments.concat(writeAssignments);
}
function isReadonlyArray(v) {
return isArray(v);
}
function getEnclosingTextRange(targetRange, sourceFile) {
return isReadonlyArray(targetRange.range) ? { pos: first(targetRange.range).getStart(sourceFile), end: last(targetRange.range).getEnd() } : targetRange.range;
}
function collectReadsAndWrites(targetRange, scopes, enclosingTextRange, sourceFile, checker, cancellationToken) {
const allTypeParameterUsages = /* @__PURE__ */ new Map();
const usagesPerScope = [];
const substitutionsPerScope = [];
const functionErrorsPerScope = [];
const constantErrorsPerScope = [];
const visibleDeclarationsInExtractedRange = [];
const exposedVariableSymbolSet = /* @__PURE__ */ new Map();
const exposedVariableDeclarations = [];
let firstExposedNonVariableDeclaration;
const expression = !isReadonlyArray(targetRange.range) ? targetRange.range : targetRange.range.length === 1 && isExpressionStatement(targetRange.range[0]) ? targetRange.range[0].expression : void 0;
let expressionDiagnostic;
if (expression === void 0) {
const statements = targetRange.range;
const start2 = first(statements).getStart();
const end = last(statements).end;
expressionDiagnostic = createFileDiagnostic(sourceFile, start2, end - start2, Messages.expressionExpected);
} else if (checker.getTypeAtLocation(expression).flags & (16384 /* Void */ | 131072 /* Never */)) {
expressionDiagnostic = createDiagnosticForNode(expression, Messages.uselessConstantType);
}
for (const scope of scopes) {
usagesPerScope.push({ usages: /* @__PURE__ */ new Map(), typeParameterUsages: /* @__PURE__ */ new Map(), substitutions: /* @__PURE__ */ new Map() });
substitutionsPerScope.push(/* @__PURE__ */ new Map());
functionErrorsPerScope.push([]);
const constantErrors = [];
if (expressionDiagnostic) {
constantErrors.push(expressionDiagnostic);
}
if (isClassLike(scope) && isInJSFile(scope)) {
constantErrors.push(createDiagnosticForNode(scope, Messages.cannotExtractToJSClass));
}
if (isArrowFunction(scope) && !isBlock(scope.body)) {
constantErrors.push(createDiagnosticForNode(scope, Messages.cannotExtractToExpressionArrowFunction));
}
constantErrorsPerScope.push(constantErrors);
}
const seenUsages = /* @__PURE__ */ new Map();
const target = isReadonlyArray(targetRange.range) ? factory.createBlock(targetRange.range) : targetRange.range;
const unmodifiedNode = isReadonlyArray(targetRange.range) ? first(targetRange.range) : targetRange.range;
const inGenericContext = isInGenericContext(unmodifiedNode);
collectUsages(target);
if (inGenericContext && !isReadonlyArray(targetRange.range) && !isJsxAttribute(targetRange.range)) {
const contextualType = checker.getContextualType(targetRange.range);
recordTypeParameterUsages(contextualType);
}
if (allTypeParameterUsages.size > 0) {
const seenTypeParameterUsages = /* @__PURE__ */ new Map();
let i = 0;
for (let curr = unmodifiedNode; curr !== void 0 && i < scopes.length; curr = curr.parent) {
if (curr === scopes[i]) {
seenTypeParameterUsages.forEach((typeParameter, id) => {
usagesPerScope[i].typeParameterUsages.set(id, typeParameter);
});
i++;
}
if (isDeclarationWithTypeParameters(curr)) {
for (const typeParameterDecl of getEffectiveTypeParameterDeclarations(curr)) {
const typeParameter = checker.getTypeAtLocation(typeParameterDecl);
if (allTypeParameterUsages.has(typeParameter.id.toString())) {
seenTypeParameterUsages.set(typeParameter.id.toString(), typeParameter);
}
}
}
}
Debug.assert(i === scopes.length, "Should have iterated all scopes");
}
if (visibleDeclarationsInExtractedRange.length) {
const containingLexicalScopeOfExtraction = isBlockScope(scopes[0], scopes[0].parent) ? scopes[0] : getEnclosingBlockScopeContainer(scopes[0]);
forEachChild(containingLexicalScopeOfExtraction, checkForUsedDeclarations);
}
for (let i = 0; i < scopes.length; i++) {
const scopeUsages = usagesPerScope[i];
if (i > 0 && (scopeUsages.usages.size > 0 || scopeUsages.typeParameterUsages.size > 0)) {
const errorNode = isReadonlyArray(targetRange.range) ? targetRange.range[0] : targetRange.range;
constantErrorsPerScope[i].push(createDiagnosticForNode(errorNode, Messages.cannotAccessVariablesFromNestedScopes));
}
if (targetRange.facts & 16 /* UsesThisInFunction */ && isClassLike(scopes[i])) {
functionErrorsPerScope[i].push(createDiagnosticForNode(targetRange.thisNode, Messages.cannotExtractFunctionsContainingThisToMethod));
}
let hasWrite = false;
let readonlyClassPropertyWrite;
usagesPerScope[i].usages.forEach((value) => {
if (value.usage === 2 /* Write */) {
hasWrite = true;
if (value.symbol.flags & 106500 /* ClassMember */ && value.symbol.valueDeclaration && hasEffectiveModifier(value.symbol.valueDeclaration, 64 /* Readonly */)) {
readonlyClassPropertyWrite = value.symbol.valueDeclaration;
}
}
});
Debug.assert(isReadonlyArray(targetRange.range) || exposedVariableDeclarations.length === 0, "No variable declarations expected if something was extracted");
if (hasWrite && !isReadonlyArray(targetRange.range)) {
const diag2 = createDiagnosticForNode(targetRange.range, Messages.cannotWriteInExpression);
functionErrorsPerScope[i].push(diag2);
constantErrorsPerScope[i].push(diag2);
} else if (readonlyClassPropertyWrite && i > 0) {
const diag2 = createDiagnosticForNode(readonlyClassPropertyWrite, Messages.cannotExtractReadonlyPropertyInitializerOutsideConstructor);
functionErrorsPerScope[i].push(diag2);
constantErrorsPerScope[i].push(diag2);
} else if (firstExposedNonVariableDeclaration) {
const diag2 = createDiagnosticForNode(firstExposedNonVariableDeclaration, Messages.cannotExtractExportedEntity);
functionErrorsPerScope[i].push(diag2);
constantErrorsPerScope[i].push(diag2);
}
}
return { target, usagesPerScope, functionErrorsPerScope, constantErrorsPerScope, exposedVariableDeclarations };
function isInGenericContext(node) {
return !!findAncestor(node, (n) => isDeclarationWithTypeParameters(n) && getEffectiveTypeParameterDeclarations(n).length !== 0);
}
function recordTypeParameterUsages(type) {
const symbolWalker = checker.getSymbolWalker(() => (cancellationToken.throwIfCancellationRequested(), true));
const { visitedTypes } = symbolWalker.walkType(type);
for (const visitedType of visitedTypes) {
if (visitedType.isTypeParameter()) {
allTypeParameterUsages.set(visitedType.id.toString(), visitedType);
}
}
}
function collectUsages(node, valueUsage = 1 /* Read */) {
if (inGenericContext) {
const type = checker.getTypeAtLocation(node);
recordTypeParameterUsages(type);
}
if (isDeclaration(node) && node.symbol) {
visibleDeclarationsInExtractedRange.push(node);
}
if (isAssignmentExpression(node)) {
collectUsages(node.left, 2 /* Write */);
collectUsages(node.right);
} else if (isUnaryExpressionWithWrite(node)) {
collectUsages(node.operand, 2 /* Write */);
} else if (isPropertyAccessExpression(node) || isElementAccessExpression(node)) {
forEachChild(node, collectUsages);
} else if (isIdentifier(node)) {
if (!node.parent) {
return;
}
if (isQualifiedName(node.parent) && node !== node.parent.left) {
return;
}
if (isPropertyAccessExpression(node.parent) && node !== node.parent.expression) {
return;
}
recordUsage(
node,
valueUsage,
/*isTypeNode*/
isPartOfTypeNode(node)
);
} else {
forEachChild(node, collectUsages);
}
}
function recordUsage(n, usage, isTypeNode2) {
const symbolId = recordUsagebySymbol(n, usage, isTypeNode2);
if (symbolId) {
for (let i = 0; i < scopes.length; i++) {
const substitution = substitutionsPerScope[i].get(symbolId);
if (substitution) {
usagesPerScope[i].substitutions.set(getNodeId(n).toString(), substitution);
}
}
}
}
function recordUsagebySymbol(identifier, usage, isTypeName) {
const symbol = getSymbolReferencedByIdentifier(identifier);
if (!symbol) {
return void 0;
}
const symbolId = getSymbolId(symbol).toString();
const lastUsage = seenUsages.get(symbolId);
if (lastUsage && lastUsage >= usage) {
return symbolId;
}
seenUsages.set(symbolId, usage);
if (lastUsage) {
for (const perScope of usagesPerScope) {
const prevEntry = perScope.usages.get(identifier.text);
if (prevEntry) {
perScope.usages.set(identifier.text, { usage, symbol, node: identifier });
}
}
return symbolId;
}
const decls = symbol.getDeclarations();
const declInFile = decls && find(decls, (d) => d.getSourceFile() === sourceFile);
if (!declInFile) {
return void 0;
}
if (rangeContainsStartEnd(enclosingTextRange, declInFile.getStart(), declInFile.end)) {
return void 0;
}
if (targetRange.facts & 2 /* IsGenerator */ && usage === 2 /* Write */) {
const diag2 = createDiagnosticForNode(identifier, Messages.cannotExtractRangeThatContainsWritesToReferencesLocatedOutsideOfTheTargetRangeInGenerators);
for (const errors of functionErrorsPerScope) {
errors.push(diag2);
}
for (const errors of constantErrorsPerScope) {
errors.push(diag2);
}
}
for (let i = 0; i < scopes.length; i++) {
const scope = scopes[i];
const resolvedSymbol = checker.resolveName(
symbol.name,
scope,
symbol.flags,
/*excludeGlobals*/
false
);
if (resolvedSymbol === symbol) {
continue;
}
if (!substitutionsPerScope[i].has(symbolId)) {
const substitution = tryReplaceWithQualifiedNameOrPropertyAccess(symbol.exportSymbol || symbol, scope, isTypeName);
if (substitution) {
substitutionsPerScope[i].set(symbolId, substitution);
} else if (isTypeName) {
if (!(symbol.flags & 262144 /* TypeParameter */)) {
const diag2 = createDiagnosticForNode(identifier, Messages.typeWillNotBeVisibleInTheNewScope);
functionErrorsPerScope[i].push(diag2);
constantErrorsPerScope[i].push(diag2);
}
} else {
usagesPerScope[i].usages.set(identifier.text, { usage, symbol, node: identifier });
}
}
}
return symbolId;
}
function checkForUsedDeclarations(node) {
if (node === targetRange.range || isReadonlyArray(targetRange.range) && targetRange.range.indexOf(node) >= 0) {
return;
}
const sym = isIdentifier(node) ? getSymbolReferencedByIdentifier(node) : checker.getSymbolAtLocation(node);
if (sym) {
const decl = find(visibleDeclarationsInExtractedRange, (d) => d.symbol === sym);
if (decl) {
if (isVariableDeclaration(decl)) {
const idString = decl.symbol.id.toString();
if (!exposedVariableSymbolSet.has(idString)) {
exposedVariableDeclarations.push(decl);
exposedVariableSymbolSet.set(idString, true);
}
} else {
firstExposedNonVariableDeclaration = firstExposedNonVariableDeclaration || decl;
}
}
}
forEachChild(node, checkForUsedDeclarations);
}
function getSymbolReferencedByIdentifier(identifier) {
return identifier.parent && isShorthandPropertyAssignment(identifier.parent) && identifier.parent.name === identifier ? checker.getShorthandAssignmentValueSymbol(identifier.parent) : checker.getSymbolAtLocation(identifier);
}
function tryReplaceWithQualifiedNameOrPropertyAccess(symbol, scopeDecl, isTypeNode2) {
if (!symbol) {
return void 0;
}
const decls = symbol.getDeclarations();
if (decls && decls.some((d) => d.parent === scopeDecl)) {
return factory.createIdentifier(symbol.name);
}
const prefix = tryReplaceWithQualifiedNameOrPropertyAccess(symbol.parent, scopeDecl, isTypeNode2);
if (prefix === void 0) {
return void 0;
}
return isTypeNode2 ? factory.createQualifiedName(prefix, factory.createIdentifier(symbol.name)) : factory.createPropertyAccessExpression(prefix, symbol.name);
}
}
function getExtractableParent(node) {
return findAncestor(node, (node2) => node2.parent && isExtractableExpression(node2) && !isBinaryExpression(node2.parent));
}
function isExtractableExpression(node) {
const { parent: parent2 } = node;
switch (parent2.kind) {
case 305 /* EnumMember */:
return false;
}
switch (node.kind) {
case 11 /* StringLiteral */:
return parent2.kind !== 271 /* ImportDeclaration */ && parent2.kind !== 275 /* ImportSpecifier */;
case 229 /* SpreadElement */:
case 205 /* ObjectBindingPattern */:
case 207 /* BindingElement */:
return false;
case 80 /* Identifier */:
return parent2.kind !== 207 /* BindingElement */ && parent2.kind !== 275 /* ImportSpecifier */ && parent2.kind !== 280 /* ExportSpecifier */;
}
return true;
}
function isBlockLike(node) {
switch (node.kind) {
case 240 /* Block */:
case 311 /* SourceFile */:
case 267 /* ModuleBlock */:
case 295 /* CaseClause */:
return true;
default:
return false;
}
}
function isInJSXContent(node) {
return isStringLiteralJsxAttribute(node) || (isJsxElement(node) || isJsxSelfClosingElement(node) || isJsxFragment(node)) && (isJsxElement(node.parent) || isJsxFragment(node.parent));
}
function isStringLiteralJsxAttribute(node) {
return isStringLiteral(node) && node.parent && isJsxAttribute(node.parent);
}
// src/services/_namespaces/ts.refactor.generateGetAccessorAndSetAccessor.ts
var ts_refactor_generateGetAccessorAndSetAccessor_exports = {};
// src/services/refactors/generateGetAccessorAndSetAccessor.ts
var actionName = "Generate 'get' and 'set' accessors";
var actionDescription = Diagnostics.Generate_get_and_set_accessors.message;
var generateGetSetAction = {
name: actionName,
description: actionDescription,
kind: "refactor.rewrite.property.generateAccessors"
};
registerRefactor(actionName, {
kinds: [generateGetSetAction.kind],
getEditsForAction: function getRefactorActionsToGenerateGetAndSetAccessors(context, actionName2) {
if (!context.endPosition)
return void 0;
const info = ts_codefix_exports.getAccessorConvertiblePropertyAtPosition(context.file, context.program, context.startPosition, context.endPosition);
Debug.assert(info && !isRefactorErrorInfo(info), "Expected applicable refactor info");
const edits = ts_codefix_exports.generateAccessorFromProperty(context.file, context.program, context.startPosition, context.endPosition, context, actionName2);
if (!edits)
return void 0;
const renameFilename = context.file.fileName;
const nameNeedRename = info.renameAccessor ? info.accessorName : info.fieldName;
const renameLocationOffset = isIdentifier(nameNeedRename) ? 0 : -1;
const renameLocation = renameLocationOffset + getRenameLocation(
edits,
renameFilename,
nameNeedRename.text,
/*preferLastLocation*/
isParameter(info.declaration)
);
return { renameFilename, renameLocation, edits };
},
getAvailableActions(context) {
if (!context.endPosition)
return emptyArray;
const info = ts_codefix_exports.getAccessorConvertiblePropertyAtPosition(context.file, context.program, context.startPosition, context.endPosition, context.triggerReason === "invoked");
if (!info)
return emptyArray;
if (!isRefactorErrorInfo(info)) {
return [{
name: actionName,
description: actionDescription,
actions: [generateGetSetAction]
}];
}
if (context.preferences.provideRefactorNotApplicableReason) {
return [{
name: actionName,
description: actionDescription,
actions: [{ ...generateGetSetAction, notApplicableReason: info.error }]
}];
}
return emptyArray;
}
});
// src/services/_namespaces/ts.refactor.inferFunctionReturnType.ts
var ts_refactor_inferFunctionReturnType_exports = {};
// src/services/refactors/inferFunctionReturnType.ts
var refactorName12 = "Infer function return type";
var refactorDescription6 = Diagnostics.Infer_function_return_type.message;
var inferReturnTypeAction = {
name: refactorName12,
description: refactorDescription6,
kind: "refactor.rewrite.function.returnType"
};
registerRefactor(refactorName12, {
kinds: [inferReturnTypeAction.kind],
getEditsForAction: getRefactorEditsToInferReturnType,
getAvailableActions: getRefactorActionsToInferReturnType
});
function getRefactorEditsToInferReturnType(context) {
const info = getInfo4(context);
if (info && !isRefactorErrorInfo(info)) {
const edits = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange7(context.file, t, info.declaration, info.returnTypeNode));
return { renameFilename: void 0, renameLocation: void 0, edits };
}
return void 0;
}
function getRefactorActionsToInferReturnType(context) {
const info = getInfo4(context);
if (!info)
return emptyArray;
if (!isRefactorErrorInfo(info)) {
return [{
name: refactorName12,
description: refactorDescription6,
actions: [inferReturnTypeAction]
}];
}
if (context.preferences.provideRefactorNotApplicableReason) {
return [{
name: refactorName12,
description: refactorDescription6,
actions: [{ ...inferReturnTypeAction, notApplicableReason: info.error }]
}];
}
return emptyArray;
}
function doChange7(sourceFile, changes, declaration, typeNode) {
const closeParen = findChildOfKind(declaration, 22 /* CloseParenToken */, sourceFile);
const needParens = isArrowFunction(declaration) && closeParen === void 0;
const endNode2 = needParens ? first(declaration.parameters) : closeParen;
if (endNode2) {
if (needParens) {
changes.insertNodeBefore(sourceFile, endNode2, factory.createToken(21 /* OpenParenToken */));
changes.insertNodeAfter(sourceFile, endNode2, factory.createToken(22 /* CloseParenToken */));
}
changes.insertNodeAt(sourceFile, endNode2.end, typeNode, { prefix: ": " });
}
}
function getInfo4(context) {
if (isInJSFile(context.file) || !refactorKindBeginsWith(inferReturnTypeAction.kind, context.kind))
return;
const token = getTokenAtPosition(context.file, context.startPosition);
const declaration = findAncestor(token, (n) => isBlock(n) || n.parent && isArrowFunction(n.parent) && (n.kind === 39 /* EqualsGreaterThanToken */ || n.parent.body === n) ? "quit" : isConvertibleDeclaration(n));
if (!declaration || !declaration.body || declaration.type) {
return { error: getLocaleSpecificMessage(Diagnostics.Return_type_must_be_inferred_from_a_function) };
}
const typeChecker = context.program.getTypeChecker();
const returnType = tryGetReturnType(typeChecker, declaration);
if (!returnType) {
return { error: getLocaleSpecificMessage(Diagnostics.Could_not_determine_function_return_type) };
}
const returnTypeNode = typeChecker.typeToTypeNode(returnType, declaration, 1 /* NoTruncation */);
if (returnTypeNode) {
return { declaration, returnTypeNode };
}
}
function isConvertibleDeclaration(node) {
switch (node.kind) {
case 261 /* FunctionDeclaration */:
case 217 /* FunctionExpression */:
case 218 /* ArrowFunction */:
case 173 /* MethodDeclaration */:
return true;
default:
return false;
}
}
function tryGetReturnType(typeChecker, node) {
if (typeChecker.isImplementationOfOverload(node)) {
const signatures = typeChecker.getTypeAtLocation(node).getCallSignatures();
if (signatures.length > 1) {
return typeChecker.getUnionType(mapDefined(signatures, (s) => s.getReturnType()));
}
}
const signature = typeChecker.getSignatureFromDeclaration(node);
if (signature) {
return typeChecker.getReturnTypeOfSignature(signature);
}
}
// src/services/classifier2020.ts
var TokenEncodingConsts = /* @__PURE__ */ ((TokenEncodingConsts2) => {
TokenEncodingConsts2[TokenEncodingConsts2["typeOffset"] = 8] = "typeOffset";
TokenEncodingConsts2[TokenEncodingConsts2["modifierMask"] = 255] = "modifierMask";
return TokenEncodingConsts2;
})(TokenEncodingConsts || {});
var TokenType = /* @__PURE__ */ ((TokenType2) => {
TokenType2[TokenType2["class"] = 0] = "class";
TokenType2[TokenType2["enum"] = 1] = "enum";
TokenType2[TokenType2["interface"] = 2] = "interface";
TokenType2[TokenType2["namespace"] = 3] = "namespace";
TokenType2[TokenType2["typeParameter"] = 4] = "typeParameter";
TokenType2[TokenType2["type"] = 5] = "type";
TokenType2[TokenType2["parameter"] = 6] = "parameter";
TokenType2[TokenType2["variable"] = 7] = "variable";
TokenType2[TokenType2["enumMember"] = 8] = "enumMember";
TokenType2[TokenType2["property"] = 9] = "property";
TokenType2[TokenType2["function"] = 10] = "function";
TokenType2[TokenType2["member"] = 11] = "member";
return TokenType2;
})(TokenType || {});
var TokenModifier = /* @__PURE__ */ ((TokenModifier2) => {
TokenModifier2[TokenModifier2["declaration"] = 0] = "declaration";
TokenModifier2[TokenModifier2["static"] = 1] = "static";
TokenModifier2[TokenModifier2["async"] = 2] = "async";
TokenModifier2[TokenModifier2["readonly"] = 3] = "readonly";
TokenModifier2[TokenModifier2["defaultLibrary"] = 4] = "defaultLibrary";
TokenModifier2[TokenModifier2["local"] = 5] = "local";
return TokenModifier2;
})(TokenModifier || {});
function getSemanticClassifications2(program, cancellationToken, sourceFile, span) {
const classifications = getEncodedSemanticClassifications2(program, cancellationToken, sourceFile, span);
Debug.assert(classifications.spans.length % 3 === 0);
const dense = classifications.spans;
const result = [];
for (let i = 0; i < dense.length; i += 3) {
result.push({
textSpan: createTextSpan(dense[i], dense[i + 1]),
classificationType: dense[i + 2]
});
}
return result;
}
function getEncodedSemanticClassifications2(program, cancellationToken, sourceFile, span) {
return {
spans: getSemanticTokens(program, sourceFile, span, cancellationToken),
endOfLineState: 0 /* None */
};
}
function getSemanticTokens(program, sourceFile, span, cancellationToken) {
const resultTokens = [];
const collector = (node, typeIdx, modifierSet) => {
resultTokens.push(node.getStart(sourceFile), node.getWidth(sourceFile), (typeIdx + 1 << 8 /* typeOffset */) + modifierSet);
};
if (program && sourceFile) {
collectTokens(program, sourceFile, span, collector, cancellationToken);
}
return resultTokens;
}
function collectTokens(program, sourceFile, span, collector, cancellationToken) {
const typeChecker = program.getTypeChecker();
let inJSXElement = false;
function visit(node) {
switch (node.kind) {
case 266 /* ModuleDeclaration */:
case 262 /* ClassDeclaration */:
case 263 /* InterfaceDeclaration */:
case 261 /* FunctionDeclaration */:
case 230 /* ClassExpression */:
case 217 /* FunctionExpression */:
case 218 /* ArrowFunction */:
cancellationToken.throwIfCancellationRequested();
}
if (!node || !textSpanIntersectsWith(span, node.pos, node.getFullWidth()) || node.getFullWidth() === 0) {
return;
}
const prevInJSXElement = inJSXElement;
if (isJsxElement(node) || isJsxSelfClosingElement(node)) {
inJSXElement = true;
}
if (isJsxExpression(node)) {
inJSXElement = false;
}
if (isIdentifier(node) && !inJSXElement && !inImportClause(node) && !isInfinityOrNaNString(node.escapedText)) {
let symbol = typeChecker.getSymbolAtLocation(node);
if (symbol) {
if (symbol.flags & 2097152 /* Alias */) {
symbol = typeChecker.getAliasedSymbol(symbol);
}
let typeIdx = classifySymbol2(symbol, getMeaningFromLocation(node));
if (typeIdx !== void 0) {
let modifierSet = 0;
if (node.parent) {
const parentIsDeclaration = isBindingElement(node.parent) || tokenFromDeclarationMapping.get(node.parent.kind) === typeIdx;
if (parentIsDeclaration && node.parent.name === node) {
modifierSet = 1 << 0 /* declaration */;
}
}
if (typeIdx === 6 /* parameter */ && isRightSideOfQualifiedNameOrPropertyAccess2(node)) {
typeIdx = 9 /* property */;
}
typeIdx = reclassifyByType(typeChecker, node, typeIdx);
const decl = symbol.valueDeclaration;
if (decl) {
const modifiers = getCombinedModifierFlags(decl);
const nodeFlags = getCombinedNodeFlags(decl);
if (modifiers & 32 /* Static */) {
modifierSet |= 1 << 1 /* static */;
}
if (modifiers & 512 /* Async */) {
modifierSet |= 1 << 2 /* async */;
}
if (typeIdx !== 0 /* class */ && typeIdx !== 2 /* interface */) {
if (modifiers & 64 /* Readonly */ || nodeFlags & 2 /* Const */ || symbol.getFlags() & 8 /* EnumMember */) {
modifierSet |= 1 << 3 /* readonly */;
}
}
if ((typeIdx === 7 /* variable */ || typeIdx === 10 /* function */) && isLocalDeclaration(decl, sourceFile)) {
modifierSet |= 1 << 5 /* local */;
}
if (program.isSourceFileDefaultLibrary(decl.getSourceFile())) {
modifierSet |= 1 << 4 /* defaultLibrary */;
}
} else if (symbol.declarations && symbol.declarations.some((d) => program.isSourceFileDefaultLibrary(d.getSourceFile()))) {
modifierSet |= 1 << 4 /* defaultLibrary */;
}
collector(node, typeIdx, modifierSet);
}
}
}
forEachChild(node, visit);
inJSXElement = prevInJSXElement;
}
visit(sourceFile);
}
function classifySymbol2(symbol, meaning) {
const flags = symbol.getFlags();
if (flags & 32 /* Class */) {
return 0 /* class */;
} else if (flags & 384 /* Enum */) {
return 1 /* enum */;
} else if (flags & 524288 /* TypeAlias */) {
return 5 /* type */;
} else if (flags & 64 /* Interface */) {
if (meaning & 2 /* Type */) {
return 2 /* interface */;
}
} else if (flags & 262144 /* TypeParameter */) {
return 4 /* typeParameter */;
}
let decl = symbol.valueDeclaration || symbol.declarations && symbol.declarations[0];
if (decl && isBindingElement(decl)) {
decl = getDeclarationForBindingElement(decl);
}
return decl && tokenFromDeclarationMapping.get(decl.kind);
}
function reclassifyByType(typeChecker, node, typeIdx) {
if (typeIdx === 7 /* variable */ || typeIdx === 9 /* property */ || typeIdx === 6 /* parameter */) {
const type = typeChecker.getTypeAtLocation(node);
if (type) {
const test = (condition) => {
return condition(type) || type.isUnion() && type.types.some(condition);
};
if (typeIdx !== 6 /* parameter */ && test((t) => t.getConstructSignatures().length > 0)) {
return 0 /* class */;
}
if (test((t) => t.getCallSignatures().length > 0) && !test((t) => t.getProperties().length > 0) || isExpressionInCallExpression(node)) {
return typeIdx === 9 /* property */ ? 11 /* member */ : 10 /* function */;
}
}
}
return typeIdx;
}
function isLocalDeclaration(decl, sourceFile) {
if (isBindingElement(decl)) {
decl = getDeclarationForBindingElement(decl);
}
if (isVariableDeclaration(decl)) {
return (!isSourceFile(decl.parent.parent.parent) || isCatchClause(decl.parent)) && decl.getSourceFile() === sourceFile;
} else if (isFunctionDeclaration(decl)) {
return !isSourceFile(decl.parent) && decl.getSourceFile() === sourceFile;
}
return false;
}
function getDeclarationForBindingElement(element) {
while (true) {
if (isBindingElement(element.parent.parent)) {
element = element.parent.parent;
} else {
return element.parent.parent;
}
}
}
function inImportClause(node) {
const parent2 = node.parent;
return parent2 && (isImportClause(parent2) || isImportSpecifier(parent2) || isNamespaceImport(parent2));
}
function isExpressionInCallExpression(node) {
while (isRightSideOfQualifiedNameOrPropertyAccess2(node)) {
node = node.parent;
}
return isCallExpression(node.parent) && node.parent.expression === node;
}
function isRightSideOfQualifiedNameOrPropertyAccess2(node) {
return isQualifiedName(node.parent) && node.parent.right === node || isPropertyAccessExpression(node.parent) && node.parent.name === node;
}
var tokenFromDeclarationMapping = /* @__PURE__ */ new Map([
[259 /* VariableDeclaration */, 7 /* variable */],
[168 /* Parameter */, 6 /* parameter */],
[171 /* PropertyDeclaration */, 9 /* property */],
[266 /* ModuleDeclaration */, 3 /* namespace */],
[265 /* EnumDeclaration */, 1 /* enum */],
[305 /* EnumMember */, 8 /* enumMember */],
[262 /* ClassDeclaration */, 0 /* class */],
[173 /* MethodDeclaration */, 11 /* member */],
[261 /* FunctionDeclaration */, 10 /* function */],
[217 /* FunctionExpression */, 10 /* function */],
[172 /* MethodSignature */, 11 /* member */],
[176 /* GetAccessor */, 9 /* property */],
[177 /* SetAccessor */, 9 /* property */],
[170 /* PropertySignature */, 9 /* property */],
[263 /* InterfaceDeclaration */, 2 /* interface */],
[264 /* TypeAliasDeclaration */, 5 /* type */],
[167 /* TypeParameter */, 4 /* typeParameter */],
[302 /* PropertyAssignment */, 9 /* property */],
[303 /* ShorthandPropertyAssignment */, 9 /* property */]
]);
// src/services/services.ts
var servicesVersion = "0.8";
function createNode(kind, pos, end, parent2) {
const node = isNodeKind(kind) ? new NodeObject(kind, pos, end) : kind === 80 /* Identifier */ ? new IdentifierObject(80 /* Identifier */, pos, end) : kind === 81 /* PrivateIdentifier */ ? new PrivateIdentifierObject(81 /* PrivateIdentifier */, pos, end) : new TokenObject(kind, pos, end);
node.parent = parent2;
node.flags = parent2.flags & 50720768 /* ContextFlags */;
return node;
}
var NodeObject = class {
constructor(kind, pos, end) {
this.pos = pos;
this.end = end;
this.flags = 0 /* None */;
this.modifierFlagsCache = 0 /* None */;
this.transformFlags = 0 /* None */;
this.parent = void 0;
this.kind = kind;
}
assertHasRealPosition(message) {
Debug.assert(!positionIsSynthesized(this.pos) && !positionIsSynthesized(this.end), message || "Node must have a real position for this operation");
}
getSourceFile() {
return getSourceFileOfNode(this);
}
getStart(sourceFile, includeJsDocComment) {
this.assertHasRealPosition();
return getTokenPosOfNode(this, sourceFile, includeJsDocComment);
}
getFullStart() {
this.assertHasRealPosition();
return this.pos;
}
getEnd() {
this.assertHasRealPosition();
return this.end;
}
getWidth(sourceFile) {
this.assertHasRealPosition();
return this.getEnd() - this.getStart(sourceFile);
}
getFullWidth() {
this.assertHasRealPosition();
return this.end - this.pos;
}
getLeadingTriviaWidth(sourceFile) {
this.assertHasRealPosition();
return this.getStart(sourceFile) - this.pos;
}
getFullText(sourceFile) {
this.assertHasRealPosition();
return (sourceFile || this.getSourceFile()).text.substring(this.pos, this.end);
}
getText(sourceFile) {
this.assertHasRealPosition();
if (!sourceFile) {
sourceFile = this.getSourceFile();
}
return sourceFile.text.substring(this.getStart(sourceFile), this.getEnd());
}
getChildCount(sourceFile) {
return this.getChildren(sourceFile).length;
}
getChildAt(index, sourceFile) {
return this.getChildren(sourceFile)[index];
}
getChildren(sourceFile) {
this.assertHasRealPosition("Node without a real position cannot be scanned and thus has no token nodes - use forEachChild and collect the result if that's fine");
return this._children || (this._children = createChildren(this, sourceFile));
}
getFirstToken(sourceFile) {
this.assertHasRealPosition();
const children = this.getChildren(sourceFile);
if (!children.length) {
return void 0;
}
const child = find(children, (kid) => kid.kind < 315 /* FirstJSDocNode */ || kid.kind > 356 /* LastJSDocNode */);
return child.kind < 165 /* FirstNode */ ? child : child.getFirstToken(sourceFile);
}
getLastToken(sourceFile) {
this.assertHasRealPosition();
const children = this.getChildren(sourceFile);
const child = lastOrUndefined(children);
if (!child) {
return void 0;
}
return child.kind < 165 /* FirstNode */ ? child : child.getLastToken(sourceFile);
}
forEachChild(cbNode, cbNodeArray) {
return forEachChild(this, cbNode, cbNodeArray);
}
};
function createChildren(node, sourceFile) {
if (!isNodeKind(node.kind)) {
return emptyArray;
}
const children = [];
if (isJSDocCommentContainingNode(node)) {
node.forEachChild((child) => {
children.push(child);
});
return children;
}
scanner.setText((sourceFile || node.getSourceFile()).text);
let pos = node.pos;
const processNode = (child) => {
addSyntheticNodes(children, pos, child.pos, node);
children.push(child);
pos = child.end;
};
const processNodes = (nodes) => {
addSyntheticNodes(children, pos, nodes.pos, node);
children.push(createSyntaxList(nodes, node));
pos = nodes.end;
};
forEach(node.jsDoc, processNode);
pos = node.pos;
node.forEachChild(processNode, processNodes);
addSyntheticNodes(children, pos, node.end, node);
scanner.setText(void 0);
return children;
}
function addSyntheticNodes(nodes, pos, end, parent2) {
scanner.resetTokenState(pos);
while (pos < end) {
const token = scanner.scan();
const textPos = scanner.getTokenEnd();
if (textPos <= end) {
if (token === 80 /* Identifier */) {
if (hasTabstop(parent2)) {
continue;
}
Debug.fail(`Did not expect ${Debug.formatSyntaxKind(parent2.kind)} to have an Identifier in its trivia`);
}
nodes.push(createNode(token, pos, textPos, parent2));
}
pos = textPos;
if (token === 1 /* EndOfFileToken */) {
break;
}
}
}
function createSyntaxList(nodes, parent2) {
const list = createNode(357 /* SyntaxList */, nodes.pos, nodes.end, parent2);
list._children = [];
let pos = nodes.pos;
for (const node of nodes) {
addSyntheticNodes(list._children, pos, node.pos, parent2);
list._children.push(node);
pos = node.end;
}
addSyntheticNodes(list._children, pos, nodes.end, parent2);
return list;
}
var TokenOrIdentifierObject = class {
constructor(pos, end) {
this.pos = pos;
this.end = end;
this.flags = 0 /* None */;
this.modifierFlagsCache = 0 /* None */;
this.transformFlags = 0 /* None */;
this.parent = void 0;
}
getSourceFile() {
return getSourceFileOfNode(this);
}
getStart(sourceFile, includeJsDocComment) {
return getTokenPosOfNode(this, sourceFile, includeJsDocComment);
}
getFullStart() {
return this.pos;
}
getEnd() {
return this.end;
}
getWidth(sourceFile) {
return this.getEnd() - this.getStart(sourceFile);
}
getFullWidth() {
return this.end - this.pos;
}
getLeadingTriviaWidth(sourceFile) {
return this.getStart(sourceFile) - this.pos;
}
getFullText(sourceFile) {
return (sourceFile || this.getSourceFile()).text.substring(this.pos, this.end);
}
getText(sourceFile) {
if (!sourceFile) {
sourceFile = this.getSourceFile();
}
return sourceFile.text.substring(this.getStart(sourceFile), this.getEnd());
}
getChildCount() {
return this.getChildren().length;
}
getChildAt(index) {
return this.getChildren()[index];
}
getChildren() {
return this.kind === 1 /* EndOfFileToken */ ? this.jsDoc || emptyArray : emptyArray;
}
getFirstToken() {
return void 0;
}
getLastToken() {
return void 0;
}
forEachChild() {
return void 0;
}
};
var SymbolObject = class {
constructor(flags, name) {
this.id = 0;
this.mergeId = 0;
this.flags = flags;
this.escapedName = name;
}
getFlags() {
return this.flags;
}
get name() {
return symbolName(this);
}
getEscapedName() {
return this.escapedName;
}
getName() {
return this.name;
}
getDeclarations() {
return this.declarations;
}
getDocumentationComment(checker) {
if (!this.documentationComment) {
this.documentationComment = emptyArray;
if (!this.declarations && isTransientSymbol(this) && this.links.target && isTransientSymbol(this.links.target) && this.links.target.links.tupleLabelDeclaration) {
const labelDecl = this.links.target.links.tupleLabelDeclaration;
this.documentationComment = getDocumentationComment([labelDecl], checker);
} else {
this.documentationComment = getDocumentationComment(this.declarations, checker);
}
}
return this.documentationComment;
}
getContextualDocumentationComment(context, checker) {
if (context) {
if (isGetAccessor(context)) {
if (!this.contextualGetAccessorDocumentationComment) {
this.contextualGetAccessorDocumentationComment = getDocumentationComment(filter(this.declarations, isGetAccessor), checker);
}
if (length(this.contextualGetAccessorDocumentationComment)) {
return this.contextualGetAccessorDocumentationComment;
}
}
if (isSetAccessor(context)) {
if (!this.contextualSetAccessorDocumentationComment) {
this.contextualSetAccessorDocumentationComment = getDocumentationComment(filter(this.declarations, isSetAccessor), checker);
}
if (length(this.contextualSetAccessorDocumentationComment)) {
return this.contextualSetAccessorDocumentationComment;
}
}
}
return this.getDocumentationComment(checker);
}
getJsDocTags(checker) {
if (this.tags === void 0) {
this.tags = getJsDocTagsOfDeclarations(this.declarations, checker);
}
return this.tags;
}
getContextualJsDocTags(context, checker) {
if (context) {
if (isGetAccessor(context)) {
if (!this.contextualGetAccessorTags) {
this.contextualGetAccessorTags = getJsDocTagsOfDeclarations(filter(this.declarations, isGetAccessor), checker);
}
if (length(this.contextualGetAccessorTags)) {
return this.contextualGetAccessorTags;
}
}
if (isSetAccessor(context)) {
if (!this.contextualSetAccessorTags) {
this.contextualSetAccessorTags = getJsDocTagsOfDeclarations(filter(this.declarations, isSetAccessor), checker);
}
if (length(this.contextualSetAccessorTags)) {
return this.contextualSetAccessorTags;
}
}
}
return this.getJsDocTags(checker);
}
};
var TokenObject = class extends TokenOrIdentifierObject {
constructor(kind, pos, end) {
super(pos, end);
this.kind = kind;
}
};
var IdentifierObject = class extends TokenOrIdentifierObject {
constructor(_kind, pos, end) {
super(pos, end);
this.kind = 80 /* Identifier */;
}
get text() {
return idText(this);
}
};
IdentifierObject.prototype.kind = 80 /* Identifier */;
var PrivateIdentifierObject = class extends TokenOrIdentifierObject {
constructor(_kind, pos, end) {
super(pos, end);
this.kind = 81 /* PrivateIdentifier */;
}
get text() {
return idText(this);
}
};
PrivateIdentifierObject.prototype.kind = 81 /* PrivateIdentifier */;
var TypeObject = class {
constructor(checker, flags) {
this.checker = checker;
this.flags = flags;
}
getFlags() {
return this.flags;
}
getSymbol() {
return this.symbol;
}
getProperties() {
return this.checker.getPropertiesOfType(this);
}
getProperty(propertyName) {
return this.checker.getPropertyOfType(this, propertyName);
}
getApparentProperties() {
return this.checker.getAugmentedPropertiesOfType(this);
}
getCallSignatures() {
return this.checker.getSignaturesOfType(this, 0 /* Call */);
}
getConstructSignatures() {
return this.checker.getSignaturesOfType(this, 1 /* Construct */);
}
getStringIndexType() {
return this.checker.getIndexTypeOfType(this, 0 /* String */);
}
getNumberIndexType() {
return this.checker.getIndexTypeOfType(this, 1 /* Number */);
}
getBaseTypes() {
return this.isClassOrInterface() ? this.checker.getBaseTypes(this) : void 0;
}
isNullableType() {
return this.checker.isNullableType(this);
}
getNonNullableType() {
return this.checker.getNonNullableType(this);
}
getNonOptionalType() {
return this.checker.getNonOptionalType(this);
}
getConstraint() {
return this.checker.getBaseConstraintOfType(this);
}
getDefault() {
return this.checker.getDefaultFromTypeParameter(this);
}
isUnion() {
return !!(this.flags & 1048576 /* Union */);
}
isIntersection() {
return !!(this.flags & 2097152 /* Intersection */);
}
isUnionOrIntersection() {
return !!(this.flags & 3145728 /* UnionOrIntersection */);
}
isLiteral() {
return !!(this.flags & (128 /* StringLiteral */ | 256 /* NumberLiteral */ | 2048 /* BigIntLiteral */));
}
isStringLiteral() {
return !!(this.flags & 128 /* StringLiteral */);
}
isNumberLiteral() {
return !!(this.flags & 256 /* NumberLiteral */);
}
isTypeParameter() {
return !!(this.flags & 262144 /* TypeParameter */);
}
isClassOrInterface() {
return !!(getObjectFlags(this) & 3 /* ClassOrInterface */);
}
isClass() {
return !!(getObjectFlags(this) & 1 /* Class */);
}
isIndexType() {
return !!(this.flags & 4194304 /* Index */);
}
/**
* This polyfills `referenceType.typeArguments` for API consumers
*/
get typeArguments() {
if (getObjectFlags(this) & 4 /* Reference */) {
return this.checker.getTypeArguments(this);
}
return void 0;
}
};
var SignatureObject = class {
// same
constructor(checker, flags) {
this.checker = checker;
this.flags = flags;
}
getDeclaration() {
return this.declaration;
}
getTypeParameters() {
return this.typeParameters;
}
getParameters() {
return this.parameters;
}
getReturnType() {
return this.checker.getReturnTypeOfSignature(this);
}
getTypeParameterAtPosition(pos) {
const type = this.checker.getParameterType(this, pos);
if (type.isIndexType() && isThisTypeParameter(type.type)) {
const constraint = type.type.getConstraint();
if (constraint) {
return this.checker.getIndexType(constraint);
}
}
return type;
}
getDocumentationComment() {
return this.documentationComment || (this.documentationComment = getDocumentationComment(singleElementArray(this.declaration), this.checker));
}
getJsDocTags() {
return this.jsDocTags || (this.jsDocTags = getJsDocTagsOfDeclarations(singleElementArray(this.declaration), this.checker));
}
};
function hasJSDocInheritDocTag(node) {
return getJSDocTags(node).some((tag) => tag.tagName.text === "inheritDoc" || tag.tagName.text === "inheritdoc");
}
function getJsDocTagsOfDeclarations(declarations, checker) {
if (!declarations)
return emptyArray;
let tags = ts_JsDoc_exports.getJsDocTagsFromDeclarations(declarations, checker);
if (checker && (tags.length === 0 || declarations.some(hasJSDocInheritDocTag))) {
const seenSymbols = /* @__PURE__ */ new Set();
for (const declaration of declarations) {
const inheritedTags = findBaseOfDeclaration(checker, declaration, (symbol) => {
var _a;
if (!seenSymbols.has(symbol)) {
seenSymbols.add(symbol);
if (declaration.kind === 176 /* GetAccessor */ || declaration.kind === 177 /* SetAccessor */) {
return symbol.getContextualJsDocTags(declaration, checker);
}
return ((_a = symbol.declarations) == null ? void 0 : _a.length) === 1 ? symbol.getJsDocTags() : void 0;
}
});
if (inheritedTags) {
tags = [...inheritedTags, ...tags];
}
}
}
return tags;
}
function getDocumentationComment(declarations, checker) {
if (!declarations)
return emptyArray;
let doc = ts_JsDoc_exports.getJsDocCommentsFromDeclarations(declarations, checker);
if (checker && (doc.length === 0 || declarations.some(hasJSDocInheritDocTag))) {
const seenSymbols = /* @__PURE__ */ new Set();
for (const declaration of declarations) {
const inheritedDocs = findBaseOfDeclaration(checker, declaration, (symbol) => {
if (!seenSymbols.has(symbol)) {
seenSymbols.add(symbol);
if (declaration.kind === 176 /* GetAccessor */ || declaration.kind === 177 /* SetAccessor */) {
return symbol.getContextualDocumentationComment(declaration, checker);
}
return symbol.getDocumentationComment(checker);
}
});
if (inheritedDocs)
doc = doc.length === 0 ? inheritedDocs.slice() : inheritedDocs.concat(lineBreakPart(), doc);
}
}
return doc;
}
function findBaseOfDeclaration(checker, declaration, cb) {
var _a;
const classOrInterfaceDeclaration = ((_a = declaration.parent) == null ? void 0 : _a.kind) === 175 /* Constructor */ ? declaration.parent.parent : declaration.parent;
if (!classOrInterfaceDeclaration)
return;
const isStaticMember = hasStaticModifier(declaration);
return firstDefined(getAllSuperTypeNodes(classOrInterfaceDeclaration), (superTypeNode) => {
const baseType = checker.getTypeAtLocation(superTypeNode);
const type = isStaticMember && baseType.symbol ? checker.getTypeOfSymbol(baseType.symbol) : baseType;
const symbol = checker.getPropertyOfType(type, declaration.symbol.name);
return symbol ? cb(symbol) : void 0;
});
}
var SourceFileObject = class extends NodeObject {
constructor(kind, pos, end) {
super(kind, pos, end);
this.kind = 311 /* SourceFile */;
}
update(newText, textChangeRange) {
return updateSourceFile(this, newText, textChangeRange);
}
getLineAndCharacterOfPosition(position) {
return getLineAndCharacterOfPosition(this, position);
}
getLineStarts() {
return getLineStarts(this);
}
getPositionOfLineAndCharacter(line, character, allowEdits) {
return computePositionOfLineAndCharacter(getLineStarts(this), line, character, this.text, allowEdits);
}
getLineEndOfPosition(pos) {
const { line } = this.getLineAndCharacterOfPosition(pos);
const lineStarts = this.getLineStarts();
let lastCharPos;
if (line + 1 >= lineStarts.length) {
lastCharPos = this.getEnd();
}
if (!lastCharPos) {
lastCharPos = lineStarts[line + 1] - 1;
}
const fullText = this.getFullText();
return fullText[lastCharPos] === "\n" && fullText[lastCharPos - 1] === "\r" ? lastCharPos - 1 : lastCharPos;
}
getNamedDeclarations() {
if (!this.namedDeclarations) {
this.namedDeclarations = this.computeNamedDeclarations();
}
return this.namedDeclarations;
}
computeNamedDeclarations() {
const result = createMultiMap();
this.forEachChild(visit);
return result;
function addDeclaration(declaration) {
const name = getDeclarationName(declaration);
if (name) {
result.add(name, declaration);
}
}
function getDeclarations(name) {
let declarations = result.get(name);
if (!declarations) {
result.set(name, declarations = []);
}
return declarations;
}
function getDeclarationName(declaration) {
const name = getNonAssignedNameOfDeclaration(declaration);
return name && (isComputedPropertyName(name) && isPropertyAccessExpression(name.expression) ? name.expression.name.text : isPropertyName(name) ? getNameFromPropertyName(name) : void 0);
}
function visit(node) {
switch (node.kind) {
case 261 /* FunctionDeclaration */:
case 217 /* FunctionExpression */:
case 173 /* MethodDeclaration */:
case 172 /* MethodSignature */:
const functionDeclaration = node;
const declarationName = getDeclarationName(functionDeclaration);
if (declarationName) {
const declarations = getDeclarations(declarationName);
const lastDeclaration = lastOrUndefined(declarations);
if (lastDeclaration && functionDeclaration.parent === lastDeclaration.parent && functionDeclaration.symbol === lastDeclaration.symbol) {
if (functionDeclaration.body && !lastDeclaration.body) {
declarations[declarations.length - 1] = functionDeclaration;
}
} else {
declarations.push(functionDeclaration);
}
}
forEachChild(node, visit);
break;
case 262 /* ClassDeclaration */:
case 230 /* ClassExpression */:
case 263 /* InterfaceDeclaration */:
case 264 /* TypeAliasDeclaration */:
case 265 /* EnumDeclaration */:
case 266 /* ModuleDeclaration */:
case 270 /* ImportEqualsDeclaration */:
case 280 /* ExportSpecifier */:
case 275 /* ImportSpecifier */:
case 272 /* ImportClause */:
case 273 /* NamespaceImport */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
case 186 /* TypeLiteral */:
addDeclaration(node);
forEachChild(node, visit);
break;
case 168 /* Parameter */:
if (!hasSyntacticModifier(node, 16476 /* ParameterPropertyModifier */)) {
break;
}
case 259 /* VariableDeclaration */:
case 207 /* BindingElement */: {
const decl = node;
if (isBindingPattern(decl.name)) {
forEachChild(decl.name, visit);
break;
}
if (decl.initializer) {
visit(decl.initializer);
}
}
case 305 /* EnumMember */:
case 171 /* PropertyDeclaration */:
case 170 /* PropertySignature */:
addDeclaration(node);
break;
case 277 /* ExportDeclaration */:
const exportDeclaration = node;
if (exportDeclaration.exportClause) {
if (isNamedExports(exportDeclaration.exportClause)) {
forEach(exportDeclaration.exportClause.elements, visit);
} else {
visit(exportDeclaration.exportClause.name);
}
}
break;
case 271 /* ImportDeclaration */:
const importClause = node.importClause;
if (importClause) {
if (importClause.name) {
addDeclaration(importClause.name);
}
if (importClause.namedBindings) {
if (importClause.namedBindings.kind === 273 /* NamespaceImport */) {
addDeclaration(importClause.namedBindings);
} else {
forEach(importClause.namedBindings.elements, visit);
}
}
}
break;
case 225 /* BinaryExpression */:
if (getAssignmentDeclarationKind(node) !== 0 /* None */) {
addDeclaration(node);
}
default:
forEachChild(node, visit);
}
}
}
};
var SourceMapSourceObject = class {
constructor(fileName, text, skipTrivia2) {
this.fileName = fileName;
this.text = text;
this.skipTrivia = skipTrivia2;
}
getLineAndCharacterOfPosition(pos) {
return getLineAndCharacterOfPosition(this, pos);
}
};
function getServicesObjectAllocator() {
return {
getNodeConstructor: () => NodeObject,
getTokenConstructor: () => TokenObject,
getIdentifierConstructor: () => IdentifierObject,
getPrivateIdentifierConstructor: () => PrivateIdentifierObject,
getSourceFileConstructor: () => SourceFileObject,
getSymbolConstructor: () => SymbolObject,
getTypeConstructor: () => TypeObject,
getSignatureConstructor: () => SignatureObject,
getSourceMapSourceConstructor: () => SourceMapSourceObject
};
}
function toEditorSettings(optionsAsMap) {
let allPropertiesAreCamelCased = true;
for (const key in optionsAsMap) {
if (hasProperty(optionsAsMap, key) && !isCamelCase(key)) {
allPropertiesAreCamelCased = false;
break;
}
}
if (allPropertiesAreCamelCased) {
return optionsAsMap;
}
const settings = {};
for (const key in optionsAsMap) {
if (hasProperty(optionsAsMap, key)) {
const newKey = isCamelCase(key) ? key : key.charAt(0).toLowerCase() + key.substr(1);
settings[newKey] = optionsAsMap[key];
}
}
return settings;
}
function isCamelCase(s) {
return !s.length || s.charAt(0) === s.charAt(0).toLowerCase();
}
function displayPartsToString(displayParts) {
if (displayParts) {
return map(displayParts, (displayPart2) => displayPart2.text).join("");
}
return "";
}
function getDefaultCompilerOptions2() {
return {
target: 1 /* ES5 */,
jsx: 1 /* Preserve */
};
}
function getSupportedCodeFixes() {
return ts_codefix_exports.getSupportedErrorCodes();
}
var SyntaxTreeCache = class {
constructor(host) {
this.host = host;
}
getCurrentSourceFile(fileName) {
var _a, _b, _c, _d, _e, _f, _g, _h;
const scriptSnapshot = this.host.getScriptSnapshot(fileName);
if (!scriptSnapshot) {
throw new Error("Could not find file: '" + fileName + "'.");
}
const scriptKind = getScriptKind(fileName, this.host);
const version2 = this.host.getScriptVersion(fileName);
let sourceFile;
if (this.currentFileName !== fileName) {
const options = {
languageVersion: 99 /* Latest */,
impliedNodeFormat: getImpliedNodeFormatForFile(
toPath(fileName, this.host.getCurrentDirectory(), ((_c = (_b = (_a = this.host).getCompilerHost) == null ? void 0 : _b.call(_a)) == null ? void 0 : _c.getCanonicalFileName) || hostGetCanonicalFileName(this.host)),
(_h = (_g = (_f = (_e = (_d = this.host).getCompilerHost) == null ? void 0 : _e.call(_d)) == null ? void 0 : _f.getModuleResolutionCache) == null ? void 0 : _g.call(_f)) == null ? void 0 : _h.getPackageJsonInfoCache(),
this.host,
this.host.getCompilationSettings()
),
setExternalModuleIndicator: getSetExternalModuleIndicator(this.host.getCompilationSettings())
};
sourceFile = createLanguageServiceSourceFile(
fileName,
scriptSnapshot,
options,
version2,
/*setNodeParents*/
true,
scriptKind
);
} else if (this.currentFileVersion !== version2) {
const editRange = scriptSnapshot.getChangeRange(this.currentFileScriptSnapshot);
sourceFile = updateLanguageServiceSourceFile(this.currentSourceFile, scriptSnapshot, version2, editRange);
}
if (sourceFile) {
this.currentFileVersion = version2;
this.currentFileName = fileName;
this.currentFileScriptSnapshot = scriptSnapshot;
this.currentSourceFile = sourceFile;
}
return this.currentSourceFile;
}
};
function setSourceFileFields(sourceFile, scriptSnapshot, version2) {
sourceFile.version = version2;
sourceFile.scriptSnapshot = scriptSnapshot;
}
function createLanguageServiceSourceFile(fileName, scriptSnapshot, scriptTargetOrOptions, version2, setNodeParents, scriptKind) {
const sourceFile = createSourceFile(fileName, getSnapshotText(scriptSnapshot), scriptTargetOrOptions, setNodeParents, scriptKind);
setSourceFileFields(sourceFile, scriptSnapshot, version2);
return sourceFile;
}
function updateLanguageServiceSourceFile(sourceFile, scriptSnapshot, version2, textChangeRange, aggressiveChecks) {
if (textChangeRange) {
if (version2 !== sourceFile.version) {
let newText;
const prefix = textChangeRange.span.start !== 0 ? sourceFile.text.substr(0, textChangeRange.span.start) : "";
const suffix = textSpanEnd(textChangeRange.span) !== sourceFile.text.length ? sourceFile.text.substr(textSpanEnd(textChangeRange.span)) : "";
if (textChangeRange.newLength === 0) {
newText = prefix && suffix ? prefix + suffix : prefix || suffix;
} else {
const changedText = scriptSnapshot.getText(textChangeRange.span.start, textChangeRange.span.start + textChangeRange.newLength);
newText = prefix && suffix ? prefix + changedText + suffix : prefix ? prefix + changedText : changedText + suffix;
}
const newSourceFile = updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks);
setSourceFileFields(newSourceFile, scriptSnapshot, version2);
newSourceFile.nameTable = void 0;
if (sourceFile !== newSourceFile && sourceFile.scriptSnapshot) {
if (sourceFile.scriptSnapshot.dispose) {
sourceFile.scriptSnapshot.dispose();
}
sourceFile.scriptSnapshot = void 0;
}
return newSourceFile;
}
}
const options = {
languageVersion: sourceFile.languageVersion,
impliedNodeFormat: sourceFile.impliedNodeFormat,
setExternalModuleIndicator: sourceFile.setExternalModuleIndicator
};
return createLanguageServiceSourceFile(
sourceFile.fileName,
scriptSnapshot,
options,
version2,
/*setNodeParents*/
true,
sourceFile.scriptKind
);
}
var NoopCancellationToken = {
isCancellationRequested: returnFalse,
throwIfCancellationRequested: noop
};
var CancellationTokenObject = class {
constructor(cancellationToken) {
this.cancellationToken = cancellationToken;
}
isCancellationRequested() {
return this.cancellationToken.isCancellationRequested();
}
throwIfCancellationRequested() {
var _a;
if (this.isCancellationRequested()) {
(_a = tracing) == null ? void 0 : _a.instant(tracing.Phase.Session, "cancellationThrown", { kind: "CancellationTokenObject" });
throw new OperationCanceledException();
}
}
};
var ThrottledCancellationToken = class {
constructor(hostCancellationToken, throttleWaitMilliseconds = 20) {
this.hostCancellationToken = hostCancellationToken;
this.throttleWaitMilliseconds = throttleWaitMilliseconds;
// Store when we last tried to cancel. Checking cancellation can be expensive (as we have
// to marshall over to the host layer). So we only bother actually checking once enough
// time has passed.
this.lastCancellationCheckTime = 0;
}
isCancellationRequested() {
const time = timestamp();
const duration = Math.abs(time - this.lastCancellationCheckTime);
if (duration >= this.throttleWaitMilliseconds) {
this.lastCancellationCheckTime = time;
return this.hostCancellationToken.isCancellationRequested();
}
return false;
}
throwIfCancellationRequested() {
var _a;
if (this.isCancellationRequested()) {
(_a = tracing) == null ? void 0 : _a.instant(tracing.Phase.Session, "cancellationThrown", { kind: "ThrottledCancellationToken" });
throw new OperationCanceledException();
}
}
};
var invalidOperationsInPartialSemanticMode = [
"getSemanticDiagnostics",
"getSuggestionDiagnostics",
"getCompilerOptionsDiagnostics",
"getSemanticClassifications",
"getEncodedSemanticClassifications",
"getCodeFixesAtPosition",
"getCombinedCodeFix",
"applyCodeActionCommand",
"organizeImports",
"getEditsForFileRename",
"getEmitOutput",
"getApplicableRefactors",
"getEditsForRefactor",
"prepareCallHierarchy",
"provideCallHierarchyIncomingCalls",
"provideCallHierarchyOutgoingCalls",
"provideInlayHints",
"getSupportedCodeFixes"
];
var invalidOperationsInSyntacticMode = [
...invalidOperationsInPartialSemanticMode,
"getCompletionsAtPosition",
"getCompletionEntryDetails",
"getCompletionEntrySymbol",
"getSignatureHelpItems",
"getQuickInfoAtPosition",
"getDefinitionAtPosition",
"getDefinitionAndBoundSpan",
"getImplementationAtPosition",
"getTypeDefinitionAtPosition",
"getReferencesAtPosition",
"findReferences",
"getDocumentHighlights",
"getNavigateToItems",
"getRenameInfo",
"findRenameLocations",
"getApplicableRefactors"
];
function createLanguageService(host, documentRegistry = createDocumentRegistry(host.useCaseSensitiveFileNames && host.useCaseSensitiveFileNames(), host.getCurrentDirectory()), syntaxOnlyOrLanguageServiceMode) {
var _a;
let languageServiceMode;
if (syntaxOnlyOrLanguageServiceMode === void 0) {
languageServiceMode = 0 /* Semantic */;
} else if (typeof syntaxOnlyOrLanguageServiceMode === "boolean") {
languageServiceMode = syntaxOnlyOrLanguageServiceMode ? 2 /* Syntactic */ : 0 /* Semantic */;
} else {
languageServiceMode = syntaxOnlyOrLanguageServiceMode;
}
const syntaxTreeCache = new SyntaxTreeCache(host);
let program;
let lastProjectVersion;
let lastTypesRootVersion = 0;
const cancellationToken = host.getCancellationToken ? new CancellationTokenObject(host.getCancellationToken()) : NoopCancellationToken;
const currentDirectory = host.getCurrentDirectory();
maybeSetLocalizedDiagnosticMessages((_a = host.getLocalizedDiagnosticMessages) == null ? void 0 : _a.bind(host));
function log(message) {
if (host.log) {
host.log(message);
}
}
const useCaseSensitiveFileNames = hostUsesCaseSensitiveFileNames(host);
const getCanonicalFileName = createGetCanonicalFileName(useCaseSensitiveFileNames);
const sourceMapper = getSourceMapper({
useCaseSensitiveFileNames: () => useCaseSensitiveFileNames,
getCurrentDirectory: () => currentDirectory,
getProgram,
fileExists: maybeBind(host, host.fileExists),
readFile: maybeBind(host, host.readFile),
getDocumentPositionMapper: maybeBind(host, host.getDocumentPositionMapper),
getSourceFileLike: maybeBind(host, host.getSourceFileLike),
log
});
function getValidSourceFile(fileName) {
const sourceFile = program.getSourceFile(fileName);
if (!sourceFile) {
const error = new Error(`Could not find source file: '${fileName}'.`);
error.ProgramFiles = program.getSourceFiles().map((f) => f.fileName);
throw error;
}
return sourceFile;
}
function synchronizeHostData() {
var _a2, _b, _c;
Debug.assert(languageServiceMode !== 2 /* Syntactic */);
if (host.getProjectVersion) {
const hostProjectVersion = host.getProjectVersion();
if (hostProjectVersion) {
if (lastProjectVersion === hostProjectVersion && !((_a2 = host.hasChangedAutomaticTypeDirectiveNames) == null ? void 0 : _a2.call(host))) {
return;
}
lastProjectVersion = hostProjectVersion;
}
}
const typeRootsVersion = host.getTypeRootsVersion ? host.getTypeRootsVersion() : 0;
if (lastTypesRootVersion !== typeRootsVersion) {
log("TypeRoots version has changed; provide new program");
program = void 0;
lastTypesRootVersion = typeRootsVersion;
}
const rootFileNames = host.getScriptFileNames().slice();
const newSettings = host.getCompilationSettings() || getDefaultCompilerOptions2();
const hasInvalidatedResolutions = host.hasInvalidatedResolutions || returnFalse;
const hasInvalidatedLibResolutions = maybeBind(host, host.hasInvalidatedLibResolutions) || returnFalse;
const hasChangedAutomaticTypeDirectiveNames = maybeBind(host, host.hasChangedAutomaticTypeDirectiveNames);
const projectReferences = (_b = host.getProjectReferences) == null ? void 0 : _b.call(host);
let parsedCommandLines;
let compilerHost = {
getSourceFile: getOrCreateSourceFile,
getSourceFileByPath: getOrCreateSourceFileByPath,
getCancellationToken: () => cancellationToken,
getCanonicalFileName,
useCaseSensitiveFileNames: () => useCaseSensitiveFileNames,
getNewLine: () => getNewLineCharacter(newSettings),
getDefaultLibFileName: (options2) => host.getDefaultLibFileName(options2),
writeFile: noop,
getCurrentDirectory: () => currentDirectory,
fileExists: (fileName) => host.fileExists(fileName),
readFile: (fileName) => host.readFile && host.readFile(fileName),
getSymlinkCache: maybeBind(host, host.getSymlinkCache),
realpath: maybeBind(host, host.realpath),
directoryExists: (directoryName) => {
return directoryProbablyExists(directoryName, host);
},
getDirectories: (path) => {
return host.getDirectories ? host.getDirectories(path) : [];
},
readDirectory: (path, extensions, exclude, include, depth) => {
Debug.checkDefined(host.readDirectory, "'LanguageServiceHost.readDirectory' must be implemented to correctly process 'projectReferences'");
return host.readDirectory(path, extensions, exclude, include, depth);
},
onReleaseOldSourceFile,
onReleaseParsedCommandLine,
hasInvalidatedResolutions,
hasInvalidatedLibResolutions,
hasChangedAutomaticTypeDirectiveNames,
trace: maybeBind(host, host.trace),
resolveModuleNames: maybeBind(host, host.resolveModuleNames),
getModuleResolutionCache: maybeBind(host, host.getModuleResolutionCache),
createHash: maybeBind(host, host.createHash),
resolveTypeReferenceDirectives: maybeBind(host, host.resolveTypeReferenceDirectives),
resolveModuleNameLiterals: maybeBind(host, host.resolveModuleNameLiterals),
resolveTypeReferenceDirectiveReferences: maybeBind(host, host.resolveTypeReferenceDirectiveReferences),
resolveLibrary: maybeBind(host, host.resolveLibrary),
useSourceOfProjectReferenceRedirect: maybeBind(host, host.useSourceOfProjectReferenceRedirect),
getParsedCommandLine
};
const originalGetSourceFile = compilerHost.getSourceFile;
const { getSourceFileWithCache } = changeCompilerHostLikeToUseCache(
compilerHost,
(fileName) => toPath(fileName, currentDirectory, getCanonicalFileName),
(...args) => originalGetSourceFile.call(compilerHost, ...args)
);
compilerHost.getSourceFile = getSourceFileWithCache;
(_c = host.setCompilerHost) == null ? void 0 : _c.call(host, compilerHost);
const parseConfigHost = {
useCaseSensitiveFileNames,
fileExists: (fileName) => compilerHost.fileExists(fileName),
readFile: (fileName) => compilerHost.readFile(fileName),
readDirectory: (...args) => compilerHost.readDirectory(...args),
trace: compilerHost.trace,
getCurrentDirectory: compilerHost.getCurrentDirectory,
onUnRecoverableConfigFileDiagnostic: noop
};
const documentRegistryBucketKey = documentRegistry.getKeyForCompilationSettings(newSettings);
let releasedScriptKinds = /* @__PURE__ */ new Set();
if (isProgramUptoDate(program, rootFileNames, newSettings, (_path, fileName) => host.getScriptVersion(fileName), (fileName) => compilerHost.fileExists(fileName), hasInvalidatedResolutions, hasInvalidatedLibResolutions, hasChangedAutomaticTypeDirectiveNames, getParsedCommandLine, projectReferences)) {
compilerHost = void 0;
parsedCommandLines = void 0;
releasedScriptKinds = void 0;
return;
}
const options = {
rootNames: rootFileNames,
options: newSettings,
host: compilerHost,
oldProgram: program,
projectReferences
};
program = createProgram(options);
compilerHost = void 0;
parsedCommandLines = void 0;
releasedScriptKinds = void 0;
sourceMapper.clearCache();
program.getTypeChecker();
return;
function getParsedCommandLine(fileName) {
const path = toPath(fileName, currentDirectory, getCanonicalFileName);
const existing = parsedCommandLines == null ? void 0 : parsedCommandLines.get(path);
if (existing !== void 0)
return existing || void 0;
const result = host.getParsedCommandLine ? host.getParsedCommandLine(fileName) : getParsedCommandLineOfConfigFileUsingSourceFile(fileName);
(parsedCommandLines || (parsedCommandLines = /* @__PURE__ */ new Map())).set(path, result || false);
return result;
}
function getParsedCommandLineOfConfigFileUsingSourceFile(configFileName) {
const result = getOrCreateSourceFile(configFileName, 100 /* JSON */);
if (!result)
return void 0;
result.path = toPath(configFileName, currentDirectory, getCanonicalFileName);
result.resolvedPath = result.path;
result.originalFileName = result.fileName;
return parseJsonSourceFileConfigFileContent(
result,
parseConfigHost,
getNormalizedAbsolutePath(getDirectoryPath(configFileName), currentDirectory),
/*existingOptions*/
void 0,
getNormalizedAbsolutePath(configFileName, currentDirectory)
);
}
function onReleaseParsedCommandLine(configFileName, oldResolvedRef, oldOptions) {
var _a3;
if (host.getParsedCommandLine) {
(_a3 = host.onReleaseParsedCommandLine) == null ? void 0 : _a3.call(host, configFileName, oldResolvedRef, oldOptions);
} else if (oldResolvedRef) {
onReleaseOldSourceFile(oldResolvedRef.sourceFile, oldOptions);
}
}
function onReleaseOldSourceFile(oldSourceFile, oldOptions) {
const oldSettingsKey = documentRegistry.getKeyForCompilationSettings(oldOptions);
documentRegistry.releaseDocumentWithKey(oldSourceFile.resolvedPath, oldSettingsKey, oldSourceFile.scriptKind, oldSourceFile.impliedNodeFormat);
}
function getOrCreateSourceFile(fileName, languageVersionOrOptions, onError, shouldCreateNewSourceFile) {
return getOrCreateSourceFileByPath(fileName, toPath(fileName, currentDirectory, getCanonicalFileName), languageVersionOrOptions, onError, shouldCreateNewSourceFile);
}
function getOrCreateSourceFileByPath(fileName, path, languageVersionOrOptions, _onError, shouldCreateNewSourceFile) {
Debug.assert(compilerHost, "getOrCreateSourceFileByPath called after typical CompilerHost lifetime, check the callstack something with a reference to an old host.");
const scriptSnapshot = host.getScriptSnapshot(fileName);
if (!scriptSnapshot) {
return void 0;
}
const scriptKind = getScriptKind(fileName, host);
const scriptVersion = host.getScriptVersion(fileName);
if (!shouldCreateNewSourceFile) {
const oldSourceFile = program && program.getSourceFileByPath(path);
if (oldSourceFile) {
if (scriptKind === oldSourceFile.scriptKind || releasedScriptKinds.has(oldSourceFile.resolvedPath)) {
return documentRegistry.updateDocumentWithKey(fileName, path, host, documentRegistryBucketKey, scriptSnapshot, scriptVersion, scriptKind, languageVersionOrOptions);
} else {
documentRegistry.releaseDocumentWithKey(oldSourceFile.resolvedPath, documentRegistry.getKeyForCompilationSettings(program.getCompilerOptions()), oldSourceFile.scriptKind, oldSourceFile.impliedNodeFormat);
releasedScriptKinds.add(oldSourceFile.resolvedPath);
}
}
}
return documentRegistry.acquireDocumentWithKey(fileName, path, host, documentRegistryBucketKey, scriptSnapshot, scriptVersion, scriptKind, languageVersionOrOptions);
}
}
function getProgram() {
if (languageServiceMode === 2 /* Syntactic */) {
Debug.assert(program === void 0);
return void 0;
}
synchronizeHostData();
return program;
}
function getAutoImportProvider() {
var _a2;
return (_a2 = host.getPackageJsonAutoImportProvider) == null ? void 0 : _a2.call(host);
}
function updateIsDefinitionOfReferencedSymbols(referencedSymbols, knownSymbolSpans) {
const checker = program.getTypeChecker();
const symbol = getSymbolForProgram();
if (!symbol)
return false;
for (const referencedSymbol of referencedSymbols) {
for (const ref of referencedSymbol.references) {
const refNode = getNodeForSpan(ref);
Debug.assertIsDefined(refNode);
if (knownSymbolSpans.has(ref) || ts_FindAllReferences_exports.isDeclarationOfSymbol(refNode, symbol)) {
knownSymbolSpans.add(ref);
ref.isDefinition = true;
const mappedSpan = getMappedDocumentSpan(ref, sourceMapper, maybeBind(host, host.fileExists));
if (mappedSpan) {
knownSymbolSpans.add(mappedSpan);
}
} else {
ref.isDefinition = false;
}
}
}
return true;
function getSymbolForProgram() {
for (const referencedSymbol of referencedSymbols) {
for (const ref of referencedSymbol.references) {
if (knownSymbolSpans.has(ref)) {
const refNode = getNodeForSpan(ref);
Debug.assertIsDefined(refNode);
return checker.getSymbolAtLocation(refNode);
}
const mappedSpan = getMappedDocumentSpan(ref, sourceMapper, maybeBind(host, host.fileExists));
if (mappedSpan && knownSymbolSpans.has(mappedSpan)) {
const refNode = getNodeForSpan(mappedSpan);
if (refNode) {
return checker.getSymbolAtLocation(refNode);
}
}
}
}
return void 0;
}
function getNodeForSpan(docSpan) {
const sourceFile = program.getSourceFile(docSpan.fileName);
if (!sourceFile)
return void 0;
const rawNode = getTouchingPropertyName(sourceFile, docSpan.textSpan.start);
const adjustedNode = ts_FindAllReferences_exports.Core.getAdjustedNode(rawNode, { use: ts_FindAllReferences_exports.FindReferencesUse.References });
return adjustedNode;
}
}
function cleanupSemanticCache() {
program = void 0;
}
function dispose() {
if (program) {
const key = documentRegistry.getKeyForCompilationSettings(program.getCompilerOptions());
forEach(program.getSourceFiles(), (f) => documentRegistry.releaseDocumentWithKey(f.resolvedPath, key, f.scriptKind, f.impliedNodeFormat));
program = void 0;
}
host = void 0;
}
function getSyntacticDiagnostics(fileName) {
synchronizeHostData();
return program.getSyntacticDiagnostics(getValidSourceFile(fileName), cancellationToken).slice();
}
function getSemanticDiagnostics(fileName) {
synchronizeHostData();
const targetSourceFile = getValidSourceFile(fileName);
const semanticDiagnostics = program.getSemanticDiagnostics(targetSourceFile, cancellationToken);
if (!getEmitDeclarations(program.getCompilerOptions())) {
return semanticDiagnostics.slice();
}
const declarationDiagnostics = program.getDeclarationDiagnostics(targetSourceFile, cancellationToken);
return [...semanticDiagnostics, ...declarationDiagnostics];
}
function getSuggestionDiagnostics(fileName) {
synchronizeHostData();
return computeSuggestionDiagnostics(getValidSourceFile(fileName), program, cancellationToken);
}
function getCompilerOptionsDiagnostics() {
synchronizeHostData();
return [...program.getOptionsDiagnostics(cancellationToken), ...program.getGlobalDiagnostics(cancellationToken)];
}
function getCompletionsAtPosition2(fileName, position, options = emptyOptions, formattingSettings) {
const fullPreferences = {
...identity(options),
// avoid excess property check
includeCompletionsForModuleExports: options.includeCompletionsForModuleExports || options.includeExternalModuleExports,
includeCompletionsWithInsertText: options.includeCompletionsWithInsertText || options.includeInsertTextCompletions
};
synchronizeHostData();
return ts_Completions_exports.getCompletionsAtPosition(
host,
program,
log,
getValidSourceFile(fileName),
position,
fullPreferences,
options.triggerCharacter,
options.triggerKind,
cancellationToken,
formattingSettings && ts_formatting_exports.getFormatContext(formattingSettings, host),
options.includeSymbol
);
}
function getCompletionEntryDetails2(fileName, position, name, formattingOptions, source, preferences = emptyOptions, data) {
synchronizeHostData();
return ts_Completions_exports.getCompletionEntryDetails(
program,
log,
getValidSourceFile(fileName),
position,
{ name, source, data },
host,
formattingOptions && ts_formatting_exports.getFormatContext(formattingOptions, host),
// TODO: GH#18217
preferences,
cancellationToken
);
}
function getCompletionEntrySymbol2(fileName, position, name, source, preferences = emptyOptions) {
synchronizeHostData();
return ts_Completions_exports.getCompletionEntrySymbol(program, log, getValidSourceFile(fileName), position, { name, source }, host, preferences);
}
function getQuickInfoAtPosition(fileName, position) {
synchronizeHostData();
const sourceFile = getValidSourceFile(fileName);
const node = getTouchingPropertyName(sourceFile, position);
if (node === sourceFile) {
return void 0;
}
const typeChecker = program.getTypeChecker();
const nodeForQuickInfo = getNodeForQuickInfo(node);
const symbol = getSymbolAtLocationForQuickInfo(nodeForQuickInfo, typeChecker);
if (!symbol || typeChecker.isUnknownSymbol(symbol)) {
const type = shouldGetType(sourceFile, nodeForQuickInfo, position) ? typeChecker.getTypeAtLocation(nodeForQuickInfo) : void 0;
return type && {
kind: "" /* unknown */,
kindModifiers: "" /* none */,
textSpan: createTextSpanFromNode(nodeForQuickInfo, sourceFile),
displayParts: typeChecker.runWithCancellationToken(cancellationToken, (typeChecker2) => typeToDisplayParts(typeChecker2, type, getContainerNode(nodeForQuickInfo))),
documentation: type.symbol ? type.symbol.getDocumentationComment(typeChecker) : void 0,
tags: type.symbol ? type.symbol.getJsDocTags(typeChecker) : void 0
};
}
const { symbolKind, displayParts, documentation, tags } = typeChecker.runWithCancellationToken(
cancellationToken,
(typeChecker2) => ts_SymbolDisplay_exports.getSymbolDisplayPartsDocumentationAndSymbolKind(typeChecker2, symbol, sourceFile, getContainerNode(nodeForQuickInfo), nodeForQuickInfo)
);
return {
kind: symbolKind,
kindModifiers: ts_SymbolDisplay_exports.getSymbolModifiers(typeChecker, symbol),
textSpan: createTextSpanFromNode(nodeForQuickInfo, sourceFile),
displayParts,
documentation,
tags
};
}
function getNodeForQuickInfo(node) {
if (isNewExpression(node.parent) && node.pos === node.parent.pos) {
return node.parent.expression;
}
if (isNamedTupleMember(node.parent) && node.pos === node.parent.pos) {
return node.parent;
}
if (isImportMeta(node.parent) && node.parent.name === node) {
return node.parent;
}
if (isJsxNamespacedName(node.parent)) {
return node.parent;
}
return node;
}
function shouldGetType(sourceFile, node, position) {
switch (node.kind) {
case 80 /* Identifier */:
return !isLabelName(node) && !isTagName(node) && !isConstTypeReference(node.parent);
case 210 /* PropertyAccessExpression */:
case 165 /* QualifiedName */:
return !isInComment(sourceFile, position);
case 110 /* ThisKeyword */:
case 196 /* ThisType */:
case 108 /* SuperKeyword */:
case 201 /* NamedTupleMember */:
return true;
case 235 /* MetaProperty */:
return isImportMeta(node);
default:
return false;
}
}
function getDefinitionAtPosition2(fileName, position, searchOtherFilesOnly, stopAtAlias) {
synchronizeHostData();
return ts_GoToDefinition_exports.getDefinitionAtPosition(program, getValidSourceFile(fileName), position, searchOtherFilesOnly, stopAtAlias);
}
function getDefinitionAndBoundSpan2(fileName, position) {
synchronizeHostData();
return ts_GoToDefinition_exports.getDefinitionAndBoundSpan(program, getValidSourceFile(fileName), position);
}
function getTypeDefinitionAtPosition2(fileName, position) {
synchronizeHostData();
return ts_GoToDefinition_exports.getTypeDefinitionAtPosition(program.getTypeChecker(), getValidSourceFile(fileName), position);
}
function getImplementationAtPosition(fileName, position) {
synchronizeHostData();
return ts_FindAllReferences_exports.getImplementationsAtPosition(program, cancellationToken, program.getSourceFiles(), getValidSourceFile(fileName), position);
}
function getDocumentHighlights(fileName, position, filesToSearch) {
const normalizedFileName = normalizePath(fileName);
Debug.assert(filesToSearch.some((f) => normalizePath(f) === normalizedFileName));
synchronizeHostData();
const sourceFilesToSearch = mapDefined(filesToSearch, (fileName2) => program.getSourceFile(fileName2));
const sourceFile = getValidSourceFile(fileName);
return DocumentHighlights.getDocumentHighlights(program, cancellationToken, sourceFile, position, sourceFilesToSearch);
}
function findRenameLocations(fileName, position, findInStrings, findInComments, preferences) {
synchronizeHostData();
const sourceFile = getValidSourceFile(fileName);
const node = getAdjustedRenameLocation(getTouchingPropertyName(sourceFile, position));
if (!ts_Rename_exports.nodeIsEligibleForRename(node))
return void 0;
if (isIdentifier(node) && (isJsxOpeningElement(node.parent) || isJsxClosingElement(node.parent)) && isIntrinsicJsxName(node.escapedText)) {
const { openingElement, closingElement } = node.parent.parent;
return [openingElement, closingElement].map((node2) => {
const textSpan = createTextSpanFromNode(node2.tagName, sourceFile);
return {
fileName: sourceFile.fileName,
textSpan,
...ts_FindAllReferences_exports.toContextSpan(textSpan, sourceFile, node2.parent)
};
});
} else {
const quotePreference = getQuotePreference(sourceFile, preferences ?? emptyOptions);
const providePrefixAndSuffixTextForRename = typeof preferences === "boolean" ? preferences : preferences == null ? void 0 : preferences.providePrefixAndSuffixTextForRename;
return getReferencesWorker2(
node,
position,
{ findInStrings, findInComments, providePrefixAndSuffixTextForRename, use: ts_FindAllReferences_exports.FindReferencesUse.Rename },
(entry, originalNode, checker) => ts_FindAllReferences_exports.toRenameLocation(entry, originalNode, checker, providePrefixAndSuffixTextForRename || false, quotePreference)
);
}
}
function getReferencesAtPosition(fileName, position) {
synchronizeHostData();
return getReferencesWorker2(getTouchingPropertyName(getValidSourceFile(fileName), position), position, { use: ts_FindAllReferences_exports.FindReferencesUse.References }, ts_FindAllReferences_exports.toReferenceEntry);
}
function getReferencesWorker2(node, position, options, cb) {
synchronizeHostData();
const sourceFiles = options && options.use === ts_FindAllReferences_exports.FindReferencesUse.Rename ? program.getSourceFiles().filter((sourceFile) => !program.isSourceFileDefaultLibrary(sourceFile)) : program.getSourceFiles();
return ts_FindAllReferences_exports.findReferenceOrRenameEntries(program, cancellationToken, sourceFiles, node, position, options, cb);
}
function findReferences(fileName, position) {
synchronizeHostData();
return ts_FindAllReferences_exports.findReferencedSymbols(program, cancellationToken, program.getSourceFiles(), getValidSourceFile(fileName), position);
}
function getFileReferences(fileName) {
synchronizeHostData();
return ts_FindAllReferences_exports.Core.getReferencesForFileName(fileName, program, program.getSourceFiles()).map(ts_FindAllReferences_exports.toReferenceEntry);
}
function getNavigateToItems2(searchValue, maxResultCount, fileName, excludeDtsFiles = false) {
synchronizeHostData();
const sourceFiles = fileName ? [getValidSourceFile(fileName)] : program.getSourceFiles();
return getNavigateToItems(sourceFiles, program.getTypeChecker(), cancellationToken, searchValue, maxResultCount, excludeDtsFiles);
}
function getEmitOutput(fileName, emitOnlyDtsFiles, forceDtsEmit) {
synchronizeHostData();
const sourceFile = getValidSourceFile(fileName);
const customTransformers = host.getCustomTransformers && host.getCustomTransformers();
return getFileEmitOutput(program, sourceFile, !!emitOnlyDtsFiles, cancellationToken, customTransformers, forceDtsEmit);
}
function getSignatureHelpItems2(fileName, position, { triggerReason } = emptyOptions) {
synchronizeHostData();
const sourceFile = getValidSourceFile(fileName);
return ts_SignatureHelp_exports.getSignatureHelpItems(program, sourceFile, position, triggerReason, cancellationToken);
}
function getNonBoundSourceFile(fileName) {
return syntaxTreeCache.getCurrentSourceFile(fileName);
}
function getNameOrDottedNameSpan(fileName, startPos, _endPos) {
const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
const node = getTouchingPropertyName(sourceFile, startPos);
if (node === sourceFile) {
return void 0;
}
switch (node.kind) {
case 210 /* PropertyAccessExpression */:
case 165 /* QualifiedName */:
case 11 /* StringLiteral */:
case 97 /* FalseKeyword */:
case 112 /* TrueKeyword */:
case 106 /* NullKeyword */:
case 108 /* SuperKeyword */:
case 110 /* ThisKeyword */:
case 196 /* ThisType */:
case 80 /* Identifier */:
break;
default:
return void 0;
}
let nodeForStartPos = node;
while (true) {
if (isRightSideOfPropertyAccess(nodeForStartPos) || isRightSideOfQualifiedName(nodeForStartPos)) {
nodeForStartPos = nodeForStartPos.parent;
} else if (isNameOfModuleDeclaration(nodeForStartPos)) {
if (nodeForStartPos.parent.parent.kind === 266 /* ModuleDeclaration */ && nodeForStartPos.parent.parent.body === nodeForStartPos.parent) {
nodeForStartPos = nodeForStartPos.parent.parent.name;
} else {
break;
}
} else {
break;
}
}
return createTextSpanFromBounds(nodeForStartPos.getStart(), node.getEnd());
}
function getBreakpointStatementAtPosition(fileName, position) {
const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
return ts_BreakpointResolver_exports.spanInSourceFileAtLocation(sourceFile, position);
}
function getNavigationBarItems2(fileName) {
return getNavigationBarItems(syntaxTreeCache.getCurrentSourceFile(fileName), cancellationToken);
}
function getNavigationTree2(fileName) {
return getNavigationTree(syntaxTreeCache.getCurrentSourceFile(fileName), cancellationToken);
}
function getSemanticClassifications3(fileName, span, format) {
synchronizeHostData();
const responseFormat = format || "original" /* Original */;
if (responseFormat === "2020" /* TwentyTwenty */) {
return getSemanticClassifications2(program, cancellationToken, getValidSourceFile(fileName), span);
} else {
return getSemanticClassifications(program.getTypeChecker(), cancellationToken, getValidSourceFile(fileName), program.getClassifiableNames(), span);
}
}
function getEncodedSemanticClassifications3(fileName, span, format) {
synchronizeHostData();
const responseFormat = format || "original" /* Original */;
if (responseFormat === "original" /* Original */) {
return getEncodedSemanticClassifications(program.getTypeChecker(), cancellationToken, getValidSourceFile(fileName), program.getClassifiableNames(), span);
} else {
return getEncodedSemanticClassifications2(program, cancellationToken, getValidSourceFile(fileName), span);
}
}
function getSyntacticClassifications2(fileName, span) {
return getSyntacticClassifications(cancellationToken, syntaxTreeCache.getCurrentSourceFile(fileName), span);
}
function getEncodedSyntacticClassifications2(fileName, span) {
return getEncodedSyntacticClassifications(cancellationToken, syntaxTreeCache.getCurrentSourceFile(fileName), span);
}
function getOutliningSpans(fileName) {
const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
return ts_OutliningElementsCollector_exports.collectElements(sourceFile, cancellationToken);
}
const braceMatching = new Map(Object.entries({
[19 /* OpenBraceToken */]: 20 /* CloseBraceToken */,
[21 /* OpenParenToken */]: 22 /* CloseParenToken */,
[23 /* OpenBracketToken */]: 24 /* CloseBracketToken */,
[32 /* GreaterThanToken */]: 30 /* LessThanToken */
}));
braceMatching.forEach((value, key) => braceMatching.set(value.toString(), Number(key)));
function getBraceMatchingAtPosition(fileName, position) {
const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
const token = getTouchingToken(sourceFile, position);
const matchKind = token.getStart(sourceFile) === position ? braceMatching.get(token.kind.toString()) : void 0;
const match = matchKind && findChildOfKind(token.parent, matchKind, sourceFile);
return match ? [createTextSpanFromNode(token, sourceFile), createTextSpanFromNode(match, sourceFile)].sort((a, b) => a.start - b.start) : emptyArray;
}
function getIndentationAtPosition(fileName, position, editorOptions) {
let start2 = timestamp();
const settings = toEditorSettings(editorOptions);
const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
log("getIndentationAtPosition: getCurrentSourceFile: " + (timestamp() - start2));
start2 = timestamp();
const result = ts_formatting_exports.SmartIndenter.getIndentation(position, sourceFile, settings);
log("getIndentationAtPosition: computeIndentation : " + (timestamp() - start2));
return result;
}
function getFormattingEditsForRange(fileName, start2, end, options) {
const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
return ts_formatting_exports.formatSelection(start2, end, sourceFile, ts_formatting_exports.getFormatContext(toEditorSettings(options), host));
}
function getFormattingEditsForDocument(fileName, options) {
return ts_formatting_exports.formatDocument(syntaxTreeCache.getCurrentSourceFile(fileName), ts_formatting_exports.getFormatContext(toEditorSettings(options), host));
}
function getFormattingEditsAfterKeystroke(fileName, position, key, options) {
const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
const formatContext = ts_formatting_exports.getFormatContext(toEditorSettings(options), host);
if (!isInComment(sourceFile, position)) {
switch (key) {
case "{":
return ts_formatting_exports.formatOnOpeningCurly(position, sourceFile, formatContext);
case "}":
return ts_formatting_exports.formatOnClosingCurly(position, sourceFile, formatContext);
case ";":
return ts_formatting_exports.formatOnSemicolon(position, sourceFile, formatContext);
case "\n":
return ts_formatting_exports.formatOnEnter(position, sourceFile, formatContext);
}
}
return [];
}
function getCodeFixesAtPosition(fileName, start2, end, errorCodes64, formatOptions, preferences = emptyOptions) {
synchronizeHostData();
const sourceFile = getValidSourceFile(fileName);
const span = createTextSpanFromBounds(start2, end);
const formatContext = ts_formatting_exports.getFormatContext(formatOptions, host);
return flatMap(deduplicate(errorCodes64, equateValues, compareValues), (errorCode) => {
cancellationToken.throwIfCancellationRequested();
return ts_codefix_exports.getFixes({ errorCode, sourceFile, span, program, host, cancellationToken, formatContext, preferences });
});
}
function getCombinedCodeFix(scope, fixId52, formatOptions, preferences = emptyOptions) {
synchronizeHostData();
Debug.assert(scope.type === "file");
const sourceFile = getValidSourceFile(scope.fileName);
const formatContext = ts_formatting_exports.getFormatContext(formatOptions, host);
return ts_codefix_exports.getAllFixes({ fixId: fixId52, sourceFile, program, host, cancellationToken, formatContext, preferences });
}
function organizeImports2(args, formatOptions, preferences = emptyOptions) {
synchronizeHostData();
Debug.assert(args.type === "file");
const sourceFile = getValidSourceFile(args.fileName);
const formatContext = ts_formatting_exports.getFormatContext(formatOptions, host);
const mode = args.mode ?? (args.skipDestructiveCodeActions ? "SortAndCombine" /* SortAndCombine */ : "All" /* All */);
return ts_OrganizeImports_exports.organizeImports(sourceFile, formatContext, host, program, preferences, mode);
}
function getEditsForFileRename2(oldFilePath, newFilePath, formatOptions, preferences = emptyOptions) {
return getEditsForFileRename(getProgram(), oldFilePath, newFilePath, host, ts_formatting_exports.getFormatContext(formatOptions, host), preferences, sourceMapper);
}
function applyCodeActionCommand(fileName, actionOrFormatSettingsOrUndefined) {
const action = typeof fileName === "string" ? actionOrFormatSettingsOrUndefined : fileName;
return isArray(action) ? Promise.all(action.map((a) => applySingleCodeActionCommand(a))) : applySingleCodeActionCommand(action);
}
function applySingleCodeActionCommand(action) {
const getPath = (path) => toPath(path, currentDirectory, getCanonicalFileName);
Debug.assertEqual(action.type, "install package");
return host.installPackage ? host.installPackage({ fileName: getPath(action.file), packageName: action.packageName }) : Promise.reject("Host does not implement `installPackage`");
}
function getDocCommentTemplateAtPosition2(fileName, position, options, formatOptions) {
const formatSettings = formatOptions ? ts_formatting_exports.getFormatContext(formatOptions, host).options : void 0;
return ts_JsDoc_exports.getDocCommentTemplateAtPosition(getNewLineOrDefaultFromHost(host, formatSettings), syntaxTreeCache.getCurrentSourceFile(fileName), position, options);
}
function isValidBraceCompletionAtPosition(fileName, position, openingBrace) {
if (openingBrace === 60 /* lessThan */) {
return false;
}
const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
if (isInString(sourceFile, position)) {
return false;
}
if (isInsideJsxElementOrAttribute(sourceFile, position)) {
return openingBrace === 123 /* openBrace */;
}
if (isInTemplateString(sourceFile, position)) {
return false;
}
switch (openingBrace) {
case 39 /* singleQuote */:
case 34 /* doubleQuote */:
case 96 /* backtick */:
return !isInComment(sourceFile, position);
}
return true;
}
function getJsxClosingTagAtPosition(fileName, position) {
const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
const token = findPrecedingToken(position, sourceFile);
if (!token)
return void 0;
const element = token.kind === 32 /* GreaterThanToken */ && isJsxOpeningElement(token.parent) ? token.parent.parent : isJsxText(token) && isJsxElement(token.parent) ? token.parent : void 0;
if (element && isUnclosedTag(element)) {
return { newText: `${element.openingElement.tagName.getText(sourceFile)}>` };
}
const fragment = token.kind === 32 /* GreaterThanToken */ && isJsxOpeningFragment(token.parent) ? token.parent.parent : isJsxText(token) && isJsxFragment(token.parent) ? token.parent : void 0;
if (fragment && isUnclosedFragment(fragment)) {
return { newText: ">" };
}
}
function getLinkedEditingRangeAtPosition(fileName, position) {
const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
const token = findPrecedingToken(position, sourceFile);
if (!token || token.parent.kind === 311 /* SourceFile */)
return void 0;
const jsxTagWordPattern = "[a-zA-Z0-9:\\-\\._$]*";
if (isJsxFragment(token.parent.parent)) {
const openFragment = token.parent.parent.openingFragment;
const closeFragment = token.parent.parent.closingFragment;
if (containsParseError(openFragment) || containsParseError(closeFragment))
return void 0;
const openPos = openFragment.getStart(sourceFile) + 1;
const closePos = closeFragment.getStart(sourceFile) + 2;
if (position !== openPos && position !== closePos)
return void 0;
return {
ranges: [{ start: openPos, length: 0 }, { start: closePos, length: 0 }],
wordPattern: jsxTagWordPattern
};
} else {
const tag = findAncestor(
token.parent,
(n) => {
if (isJsxOpeningElement(n) || isJsxClosingElement(n)) {
return true;
}
return false;
}
);
if (!tag)
return void 0;
Debug.assert(isJsxOpeningElement(tag) || isJsxClosingElement(tag), "tag should be opening or closing element");
const openTag = tag.parent.openingElement;
const closeTag = tag.parent.closingElement;
const openTagStart = openTag.tagName.getStart(sourceFile);
const openTagEnd = openTag.tagName.end;
const closeTagStart = closeTag.tagName.getStart(sourceFile);
const closeTagEnd = closeTag.tagName.end;
if (!(openTagStart <= position && position <= openTagEnd || closeTagStart <= position && position <= closeTagEnd))
return void 0;
const openingTagText = openTag.tagName.getText(sourceFile);
if (openingTagText !== closeTag.tagName.getText(sourceFile))
return void 0;
return {
ranges: [{ start: openTagStart, length: openTagEnd - openTagStart }, { start: closeTagStart, length: closeTagEnd - closeTagStart }],
wordPattern: jsxTagWordPattern
};
}
}
function getLinesForRange(sourceFile, textRange) {
return {
lineStarts: sourceFile.getLineStarts(),
firstLine: sourceFile.getLineAndCharacterOfPosition(textRange.pos).line,
lastLine: sourceFile.getLineAndCharacterOfPosition(textRange.end).line
};
}
function toggleLineComment(fileName, textRange, insertComment) {
const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
const textChanges2 = [];
const { lineStarts, firstLine, lastLine } = getLinesForRange(sourceFile, textRange);
let isCommenting = insertComment || false;
let leftMostPosition = Number.MAX_VALUE;
const lineTextStarts = /* @__PURE__ */ new Map();
const firstNonWhitespaceCharacterRegex = new RegExp(/\S/);
const isJsx = isInsideJsxElement(sourceFile, lineStarts[firstLine]);
const openComment = isJsx ? "{/*" : "//";
for (let i = firstLine; i <= lastLine; i++) {
const lineText = sourceFile.text.substring(lineStarts[i], sourceFile.getLineEndOfPosition(lineStarts[i]));
const regExec = firstNonWhitespaceCharacterRegex.exec(lineText);
if (regExec) {
leftMostPosition = Math.min(leftMostPosition, regExec.index);
lineTextStarts.set(i.toString(), regExec.index);
if (lineText.substr(regExec.index, openComment.length) !== openComment) {
isCommenting = insertComment === void 0 || insertComment;
}
}
}
for (let i = firstLine; i <= lastLine; i++) {
if (firstLine !== lastLine && lineStarts[i] === textRange.end) {
continue;
}
const lineTextStart = lineTextStarts.get(i.toString());
if (lineTextStart !== void 0) {
if (isJsx) {
textChanges2.push.apply(textChanges2, toggleMultilineComment(fileName, { pos: lineStarts[i] + leftMostPosition, end: sourceFile.getLineEndOfPosition(lineStarts[i]) }, isCommenting, isJsx));
} else if (isCommenting) {
textChanges2.push({
newText: openComment,
span: {
length: 0,
start: lineStarts[i] + leftMostPosition
}
});
} else if (sourceFile.text.substr(lineStarts[i] + lineTextStart, openComment.length) === openComment) {
textChanges2.push({
newText: "",
span: {
length: openComment.length,
start: lineStarts[i] + lineTextStart
}
});
}
}
}
return textChanges2;
}
function toggleMultilineComment(fileName, textRange, insertComment, isInsideJsx) {
var _a2;
const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
const textChanges2 = [];
const { text } = sourceFile;
let hasComment = false;
let isCommenting = insertComment || false;
const positions = [];
let { pos } = textRange;
const isJsx = isInsideJsx !== void 0 ? isInsideJsx : isInsideJsxElement(sourceFile, pos);
const openMultiline = isJsx ? "{/*" : "/*";
const closeMultiline = isJsx ? "*/}" : "*/";
const openMultilineRegex = isJsx ? "\\{\\/\\*" : "\\/\\*";
const closeMultilineRegex = isJsx ? "\\*\\/\\}" : "\\*\\/";
while (pos <= textRange.end) {
const offset = text.substr(pos, openMultiline.length) === openMultiline ? openMultiline.length : 0;
const commentRange = isInComment(sourceFile, pos + offset);
if (commentRange) {
if (isJsx) {
commentRange.pos--;
commentRange.end++;
}
positions.push(commentRange.pos);
if (commentRange.kind === 3 /* MultiLineCommentTrivia */) {
positions.push(commentRange.end);
}
hasComment = true;
pos = commentRange.end + 1;
} else {
const newPos = text.substring(pos, textRange.end).search(`(${openMultilineRegex})|(${closeMultilineRegex})`);
isCommenting = insertComment !== void 0 ? insertComment : isCommenting || !isTextWhiteSpaceLike(text, pos, newPos === -1 ? textRange.end : pos + newPos);
pos = newPos === -1 ? textRange.end + 1 : pos + newPos + closeMultiline.length;
}
}
if (isCommenting || !hasComment) {
if (((_a2 = isInComment(sourceFile, textRange.pos)) == null ? void 0 : _a2.kind) !== 2 /* SingleLineCommentTrivia */) {
insertSorted(positions, textRange.pos, compareValues);
}
insertSorted(positions, textRange.end, compareValues);
const firstPos = positions[0];
if (text.substr(firstPos, openMultiline.length) !== openMultiline) {
textChanges2.push({
newText: openMultiline,
span: {
length: 0,
start: firstPos
}
});
}
for (let i = 1; i < positions.length - 1; i++) {
if (text.substr(positions[i] - closeMultiline.length, closeMultiline.length) !== closeMultiline) {
textChanges2.push({
newText: closeMultiline,
span: {
length: 0,
start: positions[i]
}
});
}
if (text.substr(positions[i], openMultiline.length) !== openMultiline) {
textChanges2.push({
newText: openMultiline,
span: {
length: 0,
start: positions[i]
}
});
}
}
if (textChanges2.length % 2 !== 0) {
textChanges2.push({
newText: closeMultiline,
span: {
length: 0,
start: positions[positions.length - 1]
}
});
}
} else {
for (const pos2 of positions) {
const from = pos2 - closeMultiline.length > 0 ? pos2 - closeMultiline.length : 0;
const offset = text.substr(from, closeMultiline.length) === closeMultiline ? closeMultiline.length : 0;
textChanges2.push({
newText: "",
span: {
length: openMultiline.length,
start: pos2 - offset
}
});
}
}
return textChanges2;
}
function commentSelection(fileName, textRange) {
const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
const { firstLine, lastLine } = getLinesForRange(sourceFile, textRange);
return firstLine === lastLine && textRange.pos !== textRange.end ? toggleMultilineComment(
fileName,
textRange,
/*insertComment*/
true
) : toggleLineComment(
fileName,
textRange,
/*insertComment*/
true
);
}
function uncommentSelection(fileName, textRange) {
const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
const textChanges2 = [];
const { pos } = textRange;
let { end } = textRange;
if (pos === end) {
end += isInsideJsxElement(sourceFile, pos) ? 2 : 1;
}
for (let i = pos; i <= end; i++) {
const commentRange = isInComment(sourceFile, i);
if (commentRange) {
switch (commentRange.kind) {
case 2 /* SingleLineCommentTrivia */:
textChanges2.push.apply(textChanges2, toggleLineComment(
fileName,
{ end: commentRange.end, pos: commentRange.pos + 1 },
/*insertComment*/
false
));
break;
case 3 /* MultiLineCommentTrivia */:
textChanges2.push.apply(textChanges2, toggleMultilineComment(
fileName,
{ end: commentRange.end, pos: commentRange.pos + 1 },
/*insertComment*/
false
));
}
i = commentRange.end + 1;
}
}
return textChanges2;
}
function isUnclosedTag({ openingElement, closingElement, parent: parent2 }) {
return !tagNamesAreEquivalent(openingElement.tagName, closingElement.tagName) || isJsxElement(parent2) && tagNamesAreEquivalent(openingElement.tagName, parent2.openingElement.tagName) && isUnclosedTag(parent2);
}
function isUnclosedFragment({ closingFragment, parent: parent2 }) {
return !!(closingFragment.flags & 131072 /* ThisNodeHasError */) || isJsxFragment(parent2) && isUnclosedFragment(parent2);
}
function getSpanOfEnclosingComment(fileName, position, onlyMultiLine) {
const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
const range = ts_formatting_exports.getRangeOfEnclosingComment(sourceFile, position);
return range && (!onlyMultiLine || range.kind === 3 /* MultiLineCommentTrivia */) ? createTextSpanFromRange(range) : void 0;
}
function getTodoComments(fileName, descriptors) {
synchronizeHostData();
const sourceFile = getValidSourceFile(fileName);
cancellationToken.throwIfCancellationRequested();
const fileContents = sourceFile.text;
const result = [];
if (descriptors.length > 0 && !isNodeModulesFile(sourceFile.fileName)) {
const regExp = getTodoCommentsRegExp();
let matchArray;
while (matchArray = regExp.exec(fileContents)) {
cancellationToken.throwIfCancellationRequested();
const firstDescriptorCaptureIndex = 3;
Debug.assert(matchArray.length === descriptors.length + firstDescriptorCaptureIndex);
const preamble = matchArray[1];
const matchPosition = matchArray.index + preamble.length;
if (!isInComment(sourceFile, matchPosition)) {
continue;
}
let descriptor;
for (let i = 0; i < descriptors.length; i++) {
if (matchArray[i + firstDescriptorCaptureIndex]) {
descriptor = descriptors[i];
}
}
if (descriptor === void 0)
return Debug.fail();
if (isLetterOrDigit(fileContents.charCodeAt(matchPosition + descriptor.text.length))) {
continue;
}
const message = matchArray[2];
result.push({ descriptor, message, position: matchPosition });
}
}
return result;
function escapeRegExp(str) {
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}
function getTodoCommentsRegExp() {
const singleLineCommentStart = /(?:\/\/+\s*)/.source;
const multiLineCommentStart = /(?:\/\*+\s*)/.source;
const anyNumberOfSpacesAndAsterisksAtStartOfLine = /(?:^(?:\s|\*)*)/.source;
const preamble = "(" + anyNumberOfSpacesAndAsterisksAtStartOfLine + "|" + singleLineCommentStart + "|" + multiLineCommentStart + ")";
const literals = "(?:" + map(descriptors, (d) => "(" + escapeRegExp(d.text) + ")").join("|") + ")";
const endOfLineOrEndOfComment = /(?:$|\*\/)/.source;
const messageRemainder = /(?:.*?)/.source;
const messagePortion = "(" + literals + messageRemainder + ")";
const regExpString = preamble + messagePortion + endOfLineOrEndOfComment;
return new RegExp(regExpString, "gim");
}
function isLetterOrDigit(char) {
return char >= 97 /* a */ && char <= 122 /* z */ || char >= 65 /* A */ && char <= 90 /* Z */ || char >= 48 /* _0 */ && char <= 57 /* _9 */;
}
function isNodeModulesFile(path) {
return stringContains(path, "/node_modules/");
}
}
function getRenameInfo2(fileName, position, preferences) {
synchronizeHostData();
return ts_Rename_exports.getRenameInfo(program, getValidSourceFile(fileName), position, preferences || {});
}
function getRefactorContext(file, positionOrRange, preferences, formatOptions, triggerReason, kind) {
const [startPosition, endPosition] = typeof positionOrRange === "number" ? [positionOrRange, void 0] : [positionOrRange.pos, positionOrRange.end];
return {
file,
startPosition,
endPosition,
program: getProgram(),
host,
formatContext: ts_formatting_exports.getFormatContext(formatOptions, host),
// TODO: GH#18217
cancellationToken,
preferences,
triggerReason,
kind
};
}
function getInlayHintsContext(file, span, preferences) {
return {
file,
program: getProgram(),
host,
span,
preferences,
cancellationToken
};
}
function getSmartSelectionRange2(fileName, position) {
return ts_SmartSelectionRange_exports.getSmartSelectionRange(position, syntaxTreeCache.getCurrentSourceFile(fileName));
}
function getApplicableRefactors2(fileName, positionOrRange, preferences = emptyOptions, triggerReason, kind, includeInteractiveActions) {
synchronizeHostData();
const file = getValidSourceFile(fileName);
return ts_refactor_exports.getApplicableRefactors(getRefactorContext(file, positionOrRange, preferences, emptyOptions, triggerReason, kind), includeInteractiveActions);
}
function getMoveToRefactoringFileSuggestions(fileName, positionOrRange, preferences = emptyOptions) {
synchronizeHostData();
const sourceFile = getValidSourceFile(fileName);
const allFiles = Debug.checkDefined(program.getSourceFiles());
const extension = extensionFromPath(fileName);
const files = mapDefined(allFiles, (file) => !(program == null ? void 0 : program.isSourceFileFromExternalLibrary(sourceFile)) && !(sourceFile === getValidSourceFile(file.fileName) || extension === ".ts" /* Ts */ && extensionFromPath(file.fileName) === ".d.ts" /* Dts */ || extension === ".d.ts" /* Dts */ && startsWith(getBaseFileName(file.fileName), "lib.") && extensionFromPath(file.fileName) === ".d.ts" /* Dts */) && extension === extensionFromPath(file.fileName) ? file.fileName : void 0);
const newFileName = createNewFileName(sourceFile, program, getRefactorContext(sourceFile, positionOrRange, preferences, emptyOptions), host);
return { newFileName, files };
}
function getEditsForRefactor2(fileName, formatOptions, positionOrRange, refactorName13, actionName2, preferences = emptyOptions, interactiveRefactorArguments) {
synchronizeHostData();
const file = getValidSourceFile(fileName);
return ts_refactor_exports.getEditsForRefactor(getRefactorContext(file, positionOrRange, preferences, formatOptions), refactorName13, actionName2, interactiveRefactorArguments);
}
function toLineColumnOffset(fileName, position) {
if (position === 0) {
return { line: 0, character: 0 };
}
return sourceMapper.toLineColumnOffset(fileName, position);
}
function prepareCallHierarchy(fileName, position) {
synchronizeHostData();
const declarations = ts_CallHierarchy_exports.resolveCallHierarchyDeclaration(program, getTouchingPropertyName(getValidSourceFile(fileName), position));
return declarations && mapOneOrMany(declarations, (declaration) => ts_CallHierarchy_exports.createCallHierarchyItem(program, declaration));
}
function provideCallHierarchyIncomingCalls(fileName, position) {
synchronizeHostData();
const sourceFile = getValidSourceFile(fileName);
const declaration = firstOrOnly(ts_CallHierarchy_exports.resolveCallHierarchyDeclaration(program, position === 0 ? sourceFile : getTouchingPropertyName(sourceFile, position)));
return declaration ? ts_CallHierarchy_exports.getIncomingCalls(program, declaration, cancellationToken) : [];
}
function provideCallHierarchyOutgoingCalls(fileName, position) {
synchronizeHostData();
const sourceFile = getValidSourceFile(fileName);
const declaration = firstOrOnly(ts_CallHierarchy_exports.resolveCallHierarchyDeclaration(program, position === 0 ? sourceFile : getTouchingPropertyName(sourceFile, position)));
return declaration ? ts_CallHierarchy_exports.getOutgoingCalls(program, declaration) : [];
}
function provideInlayHints2(fileName, span, preferences = emptyOptions) {
synchronizeHostData();
const sourceFile = getValidSourceFile(fileName);
return ts_InlayHints_exports.provideInlayHints(getInlayHintsContext(sourceFile, span, preferences));
}
const ls = {
dispose,
cleanupSemanticCache,
getSyntacticDiagnostics,
getSemanticDiagnostics,
getSuggestionDiagnostics,
getCompilerOptionsDiagnostics,
getSyntacticClassifications: getSyntacticClassifications2,
getSemanticClassifications: getSemanticClassifications3,
getEncodedSyntacticClassifications: getEncodedSyntacticClassifications2,
getEncodedSemanticClassifications: getEncodedSemanticClassifications3,
getCompletionsAtPosition: getCompletionsAtPosition2,
getCompletionEntryDetails: getCompletionEntryDetails2,
getCompletionEntrySymbol: getCompletionEntrySymbol2,
getSignatureHelpItems: getSignatureHelpItems2,
getQuickInfoAtPosition,
getDefinitionAtPosition: getDefinitionAtPosition2,
getDefinitionAndBoundSpan: getDefinitionAndBoundSpan2,
getImplementationAtPosition,
getTypeDefinitionAtPosition: getTypeDefinitionAtPosition2,
getReferencesAtPosition,
findReferences,
getFileReferences,
getDocumentHighlights,
getNameOrDottedNameSpan,
getBreakpointStatementAtPosition,
getNavigateToItems: getNavigateToItems2,
getRenameInfo: getRenameInfo2,
getSmartSelectionRange: getSmartSelectionRange2,
findRenameLocations,
getNavigationBarItems: getNavigationBarItems2,
getNavigationTree: getNavigationTree2,
getOutliningSpans,
getTodoComments,
getBraceMatchingAtPosition,
getIndentationAtPosition,
getFormattingEditsForRange,
getFormattingEditsForDocument,
getFormattingEditsAfterKeystroke,
getDocCommentTemplateAtPosition: getDocCommentTemplateAtPosition2,
isValidBraceCompletionAtPosition,
getJsxClosingTagAtPosition,
getLinkedEditingRangeAtPosition,
getSpanOfEnclosingComment,
getCodeFixesAtPosition,
getCombinedCodeFix,
applyCodeActionCommand,
organizeImports: organizeImports2,
getEditsForFileRename: getEditsForFileRename2,
getEmitOutput,
getNonBoundSourceFile,
getProgram,
getCurrentProgram: () => program,
getAutoImportProvider,
updateIsDefinitionOfReferencedSymbols,
getApplicableRefactors: getApplicableRefactors2,
getEditsForRefactor: getEditsForRefactor2,
getMoveToRefactoringFileSuggestions,
toLineColumnOffset,
getSourceMapper: () => sourceMapper,
clearSourceMapperCache: () => sourceMapper.clearCache(),
prepareCallHierarchy,
provideCallHierarchyIncomingCalls,
provideCallHierarchyOutgoingCalls,
toggleLineComment,
toggleMultilineComment,
commentSelection,
uncommentSelection,
provideInlayHints: provideInlayHints2,
getSupportedCodeFixes
};
switch (languageServiceMode) {
case 0 /* Semantic */:
break;
case 1 /* PartialSemantic */:
invalidOperationsInPartialSemanticMode.forEach(
(key) => ls[key] = () => {
throw new Error(`LanguageService Operation: ${key} not allowed in LanguageServiceMode.PartialSemantic`);
}
);
break;
case 2 /* Syntactic */:
invalidOperationsInSyntacticMode.forEach(
(key) => ls[key] = () => {
throw new Error(`LanguageService Operation: ${key} not allowed in LanguageServiceMode.Syntactic`);
}
);
break;
default:
Debug.assertNever(languageServiceMode);
}
return ls;
}
function getNameTable(sourceFile) {
if (!sourceFile.nameTable) {
initializeNameTable(sourceFile);
}
return sourceFile.nameTable;
}
function initializeNameTable(sourceFile) {
const nameTable = sourceFile.nameTable = /* @__PURE__ */ new Map();
sourceFile.forEachChild(function walk(node) {
if (isIdentifier(node) && !isTagName(node) && node.escapedText || isStringOrNumericLiteralLike(node) && literalIsName(node)) {
const text = getEscapedTextOfIdentifierOrLiteral(node);
nameTable.set(text, nameTable.get(text) === void 0 ? node.pos : -1);
} else if (isPrivateIdentifier(node)) {
const text = node.escapedText;
nameTable.set(text, nameTable.get(text) === void 0 ? node.pos : -1);
}
forEachChild(node, walk);
if (hasJSDocNodes(node)) {
for (const jsDoc of node.jsDoc) {
forEachChild(jsDoc, walk);
}
}
});
}
function literalIsName(node) {
return isDeclarationName(node) || node.parent.kind === 282 /* ExternalModuleReference */ || isArgumentOfElementAccessExpression(node) || isLiteralComputedPropertyDeclarationName(node);
}
function getContainingObjectLiteralElement(node) {
const element = getContainingObjectLiteralElementWorker(node);
return element && (isObjectLiteralExpression(element.parent) || isJsxAttributes(element.parent)) ? element : void 0;
}
function getContainingObjectLiteralElementWorker(node) {
switch (node.kind) {
case 11 /* StringLiteral */:
case 15 /* NoSubstitutionTemplateLiteral */:
case 9 /* NumericLiteral */:
if (node.parent.kind === 166 /* ComputedPropertyName */) {
return isObjectLiteralElement(node.parent.parent) ? node.parent.parent : void 0;
}
case 80 /* Identifier */:
return isObjectLiteralElement(node.parent) && (node.parent.parent.kind === 209 /* ObjectLiteralExpression */ || node.parent.parent.kind === 291 /* JsxAttributes */) && node.parent.name === node ? node.parent : void 0;
}
return void 0;
}
function getSymbolAtLocationForQuickInfo(node, checker) {
const object = getContainingObjectLiteralElement(node);
if (object) {
const contextualType = checker.getContextualType(object.parent);
const properties = contextualType && getPropertySymbolsFromContextualType(
object,
checker,
contextualType,
/*unionSymbolOk*/
false
);
if (properties && properties.length === 1) {
return first(properties);
}
}
return checker.getSymbolAtLocation(node);
}
function getPropertySymbolsFromContextualType(node, checker, contextualType, unionSymbolOk) {
const name = getNameFromPropertyName(node.name);
if (!name)
return emptyArray;
if (!contextualType.isUnion()) {
const symbol = contextualType.getProperty(name);
return symbol ? [symbol] : emptyArray;
}
const discriminatedPropertySymbols = mapDefined(contextualType.types, (t) => (isObjectLiteralExpression(node.parent) || isJsxAttributes(node.parent)) && checker.isTypeInvalidDueToUnionDiscriminant(t, node.parent) ? void 0 : t.getProperty(name));
if (unionSymbolOk && (discriminatedPropertySymbols.length === 0 || discriminatedPropertySymbols.length === contextualType.types.length)) {
const symbol = contextualType.getProperty(name);
if (symbol)
return [symbol];
}
if (discriminatedPropertySymbols.length === 0) {
return mapDefined(contextualType.types, (t) => t.getProperty(name));
}
return discriminatedPropertySymbols;
}
function isArgumentOfElementAccessExpression(node) {
return node && node.parent && node.parent.kind === 211 /* ElementAccessExpression */ && node.parent.argumentExpression === node;
}
function getDefaultLibFilePath(options) {
if (sys) {
return combinePaths(getDirectoryPath(normalizePath(sys.getExecutingFilePath())), getDefaultLibFileName(options));
}
throw new Error("getDefaultLibFilePath is only supported when consumed as a node module. ");
}
setObjectAllocator(getServicesObjectAllocator());
// src/services/transform.ts
function transform(source, transformers, compilerOptions) {
const diagnostics = [];
compilerOptions = fixupCompilerOptions(compilerOptions, diagnostics);
const nodes = isArray(source) ? source : [source];
const result = transformNodes(
/*resolver*/
void 0,
/*host*/
void 0,
factory,
compilerOptions,
nodes,
transformers,
/*allowDtsFiles*/
true
);
result.diagnostics = concatenate(result.diagnostics, diagnostics);
return result;
}
// src/services/shims.ts
var debugObjectHost = function() {
return this;
}();
function logInternalError(logger, err) {
if (logger) {
logger.log("*INTERNAL ERROR* - Exception in typescript services: " + err.message);
}
}
var ScriptSnapshotShimAdapter = class {
constructor(scriptSnapshotShim) {
this.scriptSnapshotShim = scriptSnapshotShim;
}
getText(start2, end) {
return this.scriptSnapshotShim.getText(start2, end);
}
getLength() {
return this.scriptSnapshotShim.getLength();
}
getChangeRange(oldSnapshot) {
const oldSnapshotShim = oldSnapshot;
const encoded = this.scriptSnapshotShim.getChangeRange(oldSnapshotShim.scriptSnapshotShim);
if (encoded === null) {
return null;
}
const decoded = JSON.parse(encoded);
return createTextChangeRange(
createTextSpan(decoded.span.start, decoded.span.length),
decoded.newLength
);
}
dispose() {
if ("dispose" in this.scriptSnapshotShim) {
this.scriptSnapshotShim.dispose();
}
}
};
var LanguageServiceShimHostAdapter = class {
constructor(shimHost) {
this.shimHost = shimHost;
this.loggingEnabled = false;
this.tracingEnabled = false;
if ("getModuleResolutionsForFile" in this.shimHost) {
this.resolveModuleNames = (moduleNames, containingFile) => {
const resolutionsInFile = JSON.parse(this.shimHost.getModuleResolutionsForFile(containingFile));
return map(moduleNames, (name) => {
const result = getProperty(resolutionsInFile, name);
return result ? { resolvedFileName: result, extension: extensionFromPath(result), isExternalLibraryImport: false } : void 0;
});
};
}
if ("directoryExists" in this.shimHost) {
this.directoryExists = (directoryName) => this.shimHost.directoryExists(directoryName);
}
if ("getTypeReferenceDirectiveResolutionsForFile" in this.shimHost) {
this.resolveTypeReferenceDirectives = (typeDirectiveNames, containingFile) => {
const typeDirectivesForFile = JSON.parse(this.shimHost.getTypeReferenceDirectiveResolutionsForFile(containingFile));
return map(typeDirectiveNames, (name) => getProperty(typeDirectivesForFile, isString(name) ? name : toFileNameLowerCase(name.fileName)));
};
}
}
log(s) {
if (this.loggingEnabled) {
this.shimHost.log(s);
}
}
trace(s) {
if (this.tracingEnabled) {
this.shimHost.trace(s);
}
}
error(s) {
this.shimHost.error(s);
}
getProjectVersion() {
if (!this.shimHost.getProjectVersion) {
return void 0;
}
return this.shimHost.getProjectVersion();
}
getTypeRootsVersion() {
if (!this.shimHost.getTypeRootsVersion) {
return 0;
}
return this.shimHost.getTypeRootsVersion();
}
useCaseSensitiveFileNames() {
return this.shimHost.useCaseSensitiveFileNames ? this.shimHost.useCaseSensitiveFileNames() : false;
}
getCompilationSettings() {
const settingsJson = this.shimHost.getCompilationSettings();
if (settingsJson === null || settingsJson === "") {
throw Error("LanguageServiceShimHostAdapter.getCompilationSettings: empty compilationSettings");
}
const compilerOptions = JSON.parse(settingsJson);
compilerOptions.allowNonTsExtensions = true;
return compilerOptions;
}
getScriptFileNames() {
const encoded = this.shimHost.getScriptFileNames();
return JSON.parse(encoded);
}
getScriptSnapshot(fileName) {
const scriptSnapshot = this.shimHost.getScriptSnapshot(fileName);
return scriptSnapshot && new ScriptSnapshotShimAdapter(scriptSnapshot);
}
getScriptKind(fileName) {
if ("getScriptKind" in this.shimHost) {
return this.shimHost.getScriptKind(fileName);
} else {
return 0 /* Unknown */;
}
}
getScriptVersion(fileName) {
return this.shimHost.getScriptVersion(fileName);
}
getLocalizedDiagnosticMessages() {
const diagnosticMessagesJson = this.shimHost.getLocalizedDiagnosticMessages();
if (diagnosticMessagesJson === null || diagnosticMessagesJson === "") {
return null;
}
try {
return JSON.parse(diagnosticMessagesJson);
} catch (e) {
this.log(e.description || "diagnosticMessages.generated.json has invalid JSON format");
return null;
}
}
getCancellationToken() {
const hostCancellationToken = this.shimHost.getCancellationToken();
return new ThrottledCancellationToken(hostCancellationToken);
}
getCurrentDirectory() {
return this.shimHost.getCurrentDirectory();
}
getDirectories(path) {
return JSON.parse(this.shimHost.getDirectories(path));
}
getDefaultLibFileName(options) {
return this.shimHost.getDefaultLibFileName(JSON.stringify(options));
}
readDirectory(path, extensions, exclude, include, depth) {
const pattern = getFileMatcherPatterns(
path,
exclude,
include,
this.shimHost.useCaseSensitiveFileNames(),
this.shimHost.getCurrentDirectory()
);
return JSON.parse(this.shimHost.readDirectory(
path,
JSON.stringify(extensions),
JSON.stringify(pattern.basePaths),
pattern.excludePattern,
pattern.includeFilePattern,
pattern.includeDirectoryPattern,
depth
));
}
readFile(path, encoding) {
return this.shimHost.readFile(path, encoding);
}
fileExists(path) {
return this.shimHost.fileExists(path);
}
};
var CoreServicesShimHostAdapter = class {
constructor(shimHost) {
this.shimHost = shimHost;
this.useCaseSensitiveFileNames = this.shimHost.useCaseSensitiveFileNames ? this.shimHost.useCaseSensitiveFileNames() : false;
if ("directoryExists" in this.shimHost) {
this.directoryExists = (directoryName) => this.shimHost.directoryExists(directoryName);
} else {
this.directoryExists = void 0;
}
if ("realpath" in this.shimHost) {
this.realpath = (path) => this.shimHost.realpath(path);
} else {
this.realpath = void 0;
}
}
readDirectory(rootDir, extensions, exclude, include, depth) {
const pattern = getFileMatcherPatterns(
rootDir,
exclude,
include,
this.shimHost.useCaseSensitiveFileNames(),
this.shimHost.getCurrentDirectory()
);
return JSON.parse(this.shimHost.readDirectory(
rootDir,
JSON.stringify(extensions),
JSON.stringify(pattern.basePaths),
pattern.excludePattern,
pattern.includeFilePattern,
pattern.includeDirectoryPattern,
depth
));
}
fileExists(fileName) {
return this.shimHost.fileExists(fileName);
}
readFile(fileName) {
return this.shimHost.readFile(fileName);
}
getDirectories(path) {
return JSON.parse(this.shimHost.getDirectories(path));
}
};
function simpleForwardCall(logger, actionDescription2, action, logPerformance) {
let start2;
if (logPerformance) {
logger.log(actionDescription2);
start2 = timestamp();
}
const result = action();
if (logPerformance) {
const end = timestamp();
logger.log(`${actionDescription2} completed in ${end - start2} msec`);
if (isString(result)) {
let str = result;
if (str.length > 128) {
str = str.substring(0, 128) + "...";
}
logger.log(` result.length=${str.length}, result='${JSON.stringify(str)}'`);
}
}
return result;
}
function forwardJSONCall(logger, actionDescription2, action, logPerformance) {
return forwardCall(
logger,
actionDescription2,
/*returnJson*/
true,
action,
logPerformance
);
}
function forwardCall(logger, actionDescription2, returnJson, action, logPerformance) {
try {
const result = simpleForwardCall(logger, actionDescription2, action, logPerformance);
return returnJson ? JSON.stringify({ result }) : result;
} catch (err) {
if (err instanceof OperationCanceledException) {
return JSON.stringify({ canceled: true });
}
logInternalError(logger, err);
err.description = actionDescription2;
return JSON.stringify({ error: err });
}
}
var ShimBase = class {
constructor(factory2) {
this.factory = factory2;
factory2.registerShim(this);
}
dispose(_dummy) {
this.factory.unregisterShim(this);
}
};
function realizeDiagnostics(diagnostics, newLine) {
return diagnostics.map((d) => realizeDiagnostic(d, newLine));
}
function realizeDiagnostic(diagnostic, newLine) {
return {
message: flattenDiagnosticMessageText(diagnostic.messageText, newLine),
start: diagnostic.start,
// TODO: GH#18217
length: diagnostic.length,
// TODO: GH#18217
category: diagnosticCategoryName(diagnostic),
code: diagnostic.code,
reportsUnnecessary: diagnostic.reportsUnnecessary,
reportsDeprecated: diagnostic.reportsDeprecated
};
}
var LanguageServiceShimObject = class extends ShimBase {
constructor(factory2, host, languageService) {
super(factory2);
this.host = host;
this.languageService = languageService;
this.logPerformance = false;
this.logger = this.host;
}
forwardJSONCall(actionDescription2, action) {
return forwardJSONCall(this.logger, actionDescription2, action, this.logPerformance);
}
/// DISPOSE
/**
* Ensure (almost) deterministic release of internal Javascript resources when
* some external native objects holds onto us (e.g. Com/Interop).
*/
dispose(dummy) {
this.logger.log("dispose()");
this.languageService.dispose();
this.languageService = null;
if (debugObjectHost && debugObjectHost.CollectGarbage) {
debugObjectHost.CollectGarbage();
this.logger.log("CollectGarbage()");
}
this.logger = null;
super.dispose(dummy);
}
/// REFRESH
/**
* Update the list of scripts known to the compiler
*/
refresh(throwOnError) {
this.forwardJSONCall(
`refresh(${throwOnError})`,
() => null
// eslint-disable-line no-null/no-null
);
}
cleanupSemanticCache() {
this.forwardJSONCall(
"cleanupSemanticCache()",
() => {
this.languageService.cleanupSemanticCache();
return null;
}
);
}
realizeDiagnostics(diagnostics) {
const newLine = getNewLineOrDefaultFromHost(
this.host,
/*formatSettings*/
void 0
);
return realizeDiagnostics(diagnostics, newLine);
}
getSyntacticClassifications(fileName, start2, length2) {
return this.forwardJSONCall(
`getSyntacticClassifications('${fileName}', ${start2}, ${length2})`,
() => this.languageService.getSyntacticClassifications(fileName, createTextSpan(start2, length2))
);
}
getSemanticClassifications(fileName, start2, length2) {
return this.forwardJSONCall(
`getSemanticClassifications('${fileName}', ${start2}, ${length2})`,
() => this.languageService.getSemanticClassifications(fileName, createTextSpan(start2, length2))
);
}
getEncodedSyntacticClassifications(fileName, start2, length2) {
return this.forwardJSONCall(
`getEncodedSyntacticClassifications('${fileName}', ${start2}, ${length2})`,
// directly serialize the spans out to a string. This is much faster to decode
// on the managed side versus a full JSON array.
() => convertClassifications(this.languageService.getEncodedSyntacticClassifications(fileName, createTextSpan(start2, length2)))
);
}
getEncodedSemanticClassifications(fileName, start2, length2) {
return this.forwardJSONCall(
`getEncodedSemanticClassifications('${fileName}', ${start2}, ${length2})`,
// directly serialize the spans out to a string. This is much faster to decode
// on the managed side versus a full JSON array.
() => convertClassifications(this.languageService.getEncodedSemanticClassifications(fileName, createTextSpan(start2, length2)))
);
}
getSyntacticDiagnostics(fileName) {
return this.forwardJSONCall(
`getSyntacticDiagnostics('${fileName}')`,
() => {
const diagnostics = this.languageService.getSyntacticDiagnostics(fileName);
return this.realizeDiagnostics(diagnostics);
}
);
}
getSemanticDiagnostics(fileName) {
return this.forwardJSONCall(
`getSemanticDiagnostics('${fileName}')`,
() => {
const diagnostics = this.languageService.getSemanticDiagnostics(fileName);
return this.realizeDiagnostics(diagnostics);
}
);
}
getSuggestionDiagnostics(fileName) {
return this.forwardJSONCall(`getSuggestionDiagnostics('${fileName}')`, () => this.realizeDiagnostics(this.languageService.getSuggestionDiagnostics(fileName)));
}
getCompilerOptionsDiagnostics() {
return this.forwardJSONCall(
"getCompilerOptionsDiagnostics()",
() => {
const diagnostics = this.languageService.getCompilerOptionsDiagnostics();
return this.realizeDiagnostics(diagnostics);
}
);
}
/// QUICKINFO
/**
* Computes a string representation of the type at the requested position
* in the active file.
*/
getQuickInfoAtPosition(fileName, position) {
return this.forwardJSONCall(
`getQuickInfoAtPosition('${fileName}', ${position})`,
() => this.languageService.getQuickInfoAtPosition(fileName, position)
);
}
/// NAMEORDOTTEDNAMESPAN
/**
* Computes span information of the name or dotted name at the requested position
* in the active file.
*/
getNameOrDottedNameSpan(fileName, startPos, endPos) {
return this.forwardJSONCall(
`getNameOrDottedNameSpan('${fileName}', ${startPos}, ${endPos})`,
() => this.languageService.getNameOrDottedNameSpan(fileName, startPos, endPos)
);
}
/**
* STATEMENTSPAN
* Computes span information of statement at the requested position in the active file.
*/
getBreakpointStatementAtPosition(fileName, position) {
return this.forwardJSONCall(
`getBreakpointStatementAtPosition('${fileName}', ${position})`,
() => this.languageService.getBreakpointStatementAtPosition(fileName, position)
);
}
/// SIGNATUREHELP
getSignatureHelpItems(fileName, position, options) {
return this.forwardJSONCall(
`getSignatureHelpItems('${fileName}', ${position})`,
() => this.languageService.getSignatureHelpItems(fileName, position, options)
);
}
/// GOTO DEFINITION
/**
* Computes the definition location and file for the symbol
* at the requested position.
*/
getDefinitionAtPosition(fileName, position) {
return this.forwardJSONCall(
`getDefinitionAtPosition('${fileName}', ${position})`,
() => this.languageService.getDefinitionAtPosition(fileName, position)
);
}
/**
* Computes the definition location and file for the symbol
* at the requested position.
*/
getDefinitionAndBoundSpan(fileName, position) {
return this.forwardJSONCall(
`getDefinitionAndBoundSpan('${fileName}', ${position})`,
() => this.languageService.getDefinitionAndBoundSpan(fileName, position)
);
}
/// GOTO Type
/**
* Computes the definition location of the type of the symbol
* at the requested position.
*/
getTypeDefinitionAtPosition(fileName, position) {
return this.forwardJSONCall(
`getTypeDefinitionAtPosition('${fileName}', ${position})`,
() => this.languageService.getTypeDefinitionAtPosition(fileName, position)
);
}
/// GOTO Implementation
/**
* Computes the implementation location of the symbol
* at the requested position.
*/
getImplementationAtPosition(fileName, position) {
return this.forwardJSONCall(
`getImplementationAtPosition('${fileName}', ${position})`,
() => this.languageService.getImplementationAtPosition(fileName, position)
);
}
getRenameInfo(fileName, position, preferences) {
return this.forwardJSONCall(
`getRenameInfo('${fileName}', ${position})`,
() => this.languageService.getRenameInfo(fileName, position, preferences)
);
}
getSmartSelectionRange(fileName, position) {
return this.forwardJSONCall(
`getSmartSelectionRange('${fileName}', ${position})`,
() => this.languageService.getSmartSelectionRange(fileName, position)
);
}
findRenameLocations(fileName, position, findInStrings, findInComments, preferences) {
return this.forwardJSONCall(
`findRenameLocations('${fileName}', ${position}, ${findInStrings}, ${findInComments})`,
() => this.languageService.findRenameLocations(fileName, position, findInStrings, findInComments, preferences)
);
}
/// GET BRACE MATCHING
getBraceMatchingAtPosition(fileName, position) {
return this.forwardJSONCall(
`getBraceMatchingAtPosition('${fileName}', ${position})`,
() => this.languageService.getBraceMatchingAtPosition(fileName, position)
);
}
isValidBraceCompletionAtPosition(fileName, position, openingBrace) {
return this.forwardJSONCall(
`isValidBraceCompletionAtPosition('${fileName}', ${position}, ${openingBrace})`,
() => this.languageService.isValidBraceCompletionAtPosition(fileName, position, openingBrace)
);
}
getSpanOfEnclosingComment(fileName, position, onlyMultiLine) {
return this.forwardJSONCall(
`getSpanOfEnclosingComment('${fileName}', ${position})`,
() => this.languageService.getSpanOfEnclosingComment(fileName, position, onlyMultiLine)
);
}
/// GET SMART INDENT
getIndentationAtPosition(fileName, position, options) {
return this.forwardJSONCall(
`getIndentationAtPosition('${fileName}', ${position})`,
() => {
const localOptions = JSON.parse(options);
return this.languageService.getIndentationAtPosition(fileName, position, localOptions);
}
);
}
/// GET REFERENCES
getReferencesAtPosition(fileName, position) {
return this.forwardJSONCall(
`getReferencesAtPosition('${fileName}', ${position})`,
() => this.languageService.getReferencesAtPosition(fileName, position)
);
}
findReferences(fileName, position) {
return this.forwardJSONCall(
`findReferences('${fileName}', ${position})`,
() => this.languageService.findReferences(fileName, position)
);
}
getFileReferences(fileName) {
return this.forwardJSONCall(
`getFileReferences('${fileName})`,
() => this.languageService.getFileReferences(fileName)
);
}
getDocumentHighlights(fileName, position, filesToSearch) {
return this.forwardJSONCall(
`getDocumentHighlights('${fileName}', ${position})`,
() => {
const results = this.languageService.getDocumentHighlights(fileName, position, JSON.parse(filesToSearch));
const normalizedName = toFileNameLowerCase(normalizeSlashes(fileName));
return filter(results, (r) => toFileNameLowerCase(normalizeSlashes(r.fileName)) === normalizedName);
}
);
}
/// COMPLETION LISTS
/**
* Get a string based representation of the completions
* to provide at the given source position and providing a member completion
* list if requested.
*/
getCompletionsAtPosition(fileName, position, preferences, formattingSettings) {
return this.forwardJSONCall(
`getCompletionsAtPosition('${fileName}', ${position}, ${preferences}, ${formattingSettings})`,
() => this.languageService.getCompletionsAtPosition(fileName, position, preferences, formattingSettings)
);
}
/** Get a string based representation of a completion list entry details */
getCompletionEntryDetails(fileName, position, entryName, formatOptions, source, preferences, data) {
return this.forwardJSONCall(
`getCompletionEntryDetails('${fileName}', ${position}, '${entryName}')`,
() => {
const localOptions = formatOptions === void 0 ? void 0 : JSON.parse(formatOptions);
return this.languageService.getCompletionEntryDetails(fileName, position, entryName, localOptions, source, preferences, data);
}
);
}
getFormattingEditsForRange(fileName, start2, end, options) {
return this.forwardJSONCall(
`getFormattingEditsForRange('${fileName}', ${start2}, ${end})`,
() => {
const localOptions = JSON.parse(options);
return this.languageService.getFormattingEditsForRange(fileName, start2, end, localOptions);
}
);
}
getFormattingEditsForDocument(fileName, options) {
return this.forwardJSONCall(
`getFormattingEditsForDocument('${fileName}')`,
() => {
const localOptions = JSON.parse(options);
return this.languageService.getFormattingEditsForDocument(fileName, localOptions);
}
);
}
getFormattingEditsAfterKeystroke(fileName, position, key, options) {
return this.forwardJSONCall(
`getFormattingEditsAfterKeystroke('${fileName}', ${position}, '${key}')`,
() => {
const localOptions = JSON.parse(options);
return this.languageService.getFormattingEditsAfterKeystroke(fileName, position, key, localOptions);
}
);
}
getDocCommentTemplateAtPosition(fileName, position, options, formatOptions) {
return this.forwardJSONCall(
`getDocCommentTemplateAtPosition('${fileName}', ${position})`,
() => this.languageService.getDocCommentTemplateAtPosition(fileName, position, options, formatOptions)
);
}
/// NAVIGATE TO
/** Return a list of symbols that are interesting to navigate to */
getNavigateToItems(searchValue, maxResultCount, fileName) {
return this.forwardJSONCall(
`getNavigateToItems('${searchValue}', ${maxResultCount}, ${fileName})`,
() => this.languageService.getNavigateToItems(searchValue, maxResultCount, fileName)
);
}
getNavigationBarItems(fileName) {
return this.forwardJSONCall(
`getNavigationBarItems('${fileName}')`,
() => this.languageService.getNavigationBarItems(fileName)
);
}
getNavigationTree(fileName) {
return this.forwardJSONCall(
`getNavigationTree('${fileName}')`,
() => this.languageService.getNavigationTree(fileName)
);
}
getOutliningSpans(fileName) {
return this.forwardJSONCall(
`getOutliningSpans('${fileName}')`,
() => this.languageService.getOutliningSpans(fileName)
);
}
getTodoComments(fileName, descriptors) {
return this.forwardJSONCall(
`getTodoComments('${fileName}')`,
() => this.languageService.getTodoComments(fileName, JSON.parse(descriptors))
);
}
/// CALL HIERARCHY
prepareCallHierarchy(fileName, position) {
return this.forwardJSONCall(
`prepareCallHierarchy('${fileName}', ${position})`,
() => this.languageService.prepareCallHierarchy(fileName, position)
);
}
provideCallHierarchyIncomingCalls(fileName, position) {
return this.forwardJSONCall(
`provideCallHierarchyIncomingCalls('${fileName}', ${position})`,
() => this.languageService.provideCallHierarchyIncomingCalls(fileName, position)
);
}
provideCallHierarchyOutgoingCalls(fileName, position) {
return this.forwardJSONCall(
`provideCallHierarchyOutgoingCalls('${fileName}', ${position})`,
() => this.languageService.provideCallHierarchyOutgoingCalls(fileName, position)
);
}
provideInlayHints(fileName, span, preference) {
return this.forwardJSONCall(
`provideInlayHints('${fileName}', '${JSON.stringify(span)}', ${JSON.stringify(preference)})`,
() => this.languageService.provideInlayHints(fileName, span, preference)
);
}
/// Emit
getEmitOutput(fileName) {
return this.forwardJSONCall(
`getEmitOutput('${fileName}')`,
() => {
const { diagnostics, ...rest } = this.languageService.getEmitOutput(fileName);
return { ...rest, diagnostics: this.realizeDiagnostics(diagnostics) };
}
);
}
getEmitOutputObject(fileName) {
return forwardCall(
this.logger,
`getEmitOutput('${fileName}')`,
/*returnJson*/
false,
() => this.languageService.getEmitOutput(fileName),
this.logPerformance
);
}
toggleLineComment(fileName, textRange) {
return this.forwardJSONCall(
`toggleLineComment('${fileName}', '${JSON.stringify(textRange)}')`,
() => this.languageService.toggleLineComment(fileName, textRange)
);
}
toggleMultilineComment(fileName, textRange) {
return this.forwardJSONCall(
`toggleMultilineComment('${fileName}', '${JSON.stringify(textRange)}')`,
() => this.languageService.toggleMultilineComment(fileName, textRange)
);
}
commentSelection(fileName, textRange) {
return this.forwardJSONCall(
`commentSelection('${fileName}', '${JSON.stringify(textRange)}')`,
() => this.languageService.commentSelection(fileName, textRange)
);
}
uncommentSelection(fileName, textRange) {
return this.forwardJSONCall(
`uncommentSelection('${fileName}', '${JSON.stringify(textRange)}')`,
() => this.languageService.uncommentSelection(fileName, textRange)
);
}
};
function convertClassifications(classifications) {
return { spans: classifications.spans.join(","), endOfLineState: classifications.endOfLineState };
}
var ClassifierShimObject = class extends ShimBase {
constructor(factory2, logger) {
super(factory2);
this.logger = logger;
this.logPerformance = false;
this.classifier = createClassifier();
}
getEncodedLexicalClassifications(text, lexState, syntacticClassifierAbsent = false) {
return forwardJSONCall(
this.logger,
"getEncodedLexicalClassifications",
() => convertClassifications(this.classifier.getEncodedLexicalClassifications(text, lexState, syntacticClassifierAbsent)),
this.logPerformance
);
}
/// COLORIZATION
getClassificationsForLine(text, lexState, classifyKeywordsInGenerics = false) {
const classification = this.classifier.getClassificationsForLine(text, lexState, classifyKeywordsInGenerics);
let result = "";
for (const item of classification.entries) {
result += item.length + "\n";
result += item.classification + "\n";
}
result += classification.finalLexState;
return result;
}
};
var CoreServicesShimObject = class extends ShimBase {
constructor(factory2, logger, host) {
super(factory2);
this.logger = logger;
this.host = host;
this.logPerformance = false;
}
forwardJSONCall(actionDescription2, action) {
return forwardJSONCall(this.logger, actionDescription2, action, this.logPerformance);
}
resolveModuleName(fileName, moduleName, compilerOptionsJson) {
return this.forwardJSONCall(`resolveModuleName('${fileName}')`, () => {
const compilerOptions = JSON.parse(compilerOptionsJson);
const result = resolveModuleName(moduleName, normalizeSlashes(fileName), compilerOptions, this.host);
let resolvedFileName = result.resolvedModule ? result.resolvedModule.resolvedFileName : void 0;
if (result.resolvedModule && result.resolvedModule.extension !== ".ts" /* Ts */ && result.resolvedModule.extension !== ".tsx" /* Tsx */ && result.resolvedModule.extension !== ".d.ts" /* Dts */) {
resolvedFileName = void 0;
}
return {
resolvedFileName,
failedLookupLocations: result.failedLookupLocations,
affectingLocations: result.affectingLocations
};
});
}
resolveTypeReferenceDirective(fileName, typeReferenceDirective, compilerOptionsJson) {
return this.forwardJSONCall(`resolveTypeReferenceDirective(${fileName})`, () => {
const compilerOptions = JSON.parse(compilerOptionsJson);
const result = resolveTypeReferenceDirective(typeReferenceDirective, normalizeSlashes(fileName), compilerOptions, this.host);
return {
resolvedFileName: result.resolvedTypeReferenceDirective ? result.resolvedTypeReferenceDirective.resolvedFileName : void 0,
primary: result.resolvedTypeReferenceDirective ? result.resolvedTypeReferenceDirective.primary : true,
failedLookupLocations: result.failedLookupLocations
};
});
}
getPreProcessedFileInfo(fileName, sourceTextSnapshot) {
return this.forwardJSONCall(
`getPreProcessedFileInfo('${fileName}')`,
() => {
const result = preProcessFile(
getSnapshotText(sourceTextSnapshot),
/*readImportFiles*/
true,
/*detectJavaScriptImports*/
true
);
return {
referencedFiles: this.convertFileReferences(result.referencedFiles),
importedFiles: this.convertFileReferences(result.importedFiles),
ambientExternalModules: result.ambientExternalModules,
isLibFile: result.isLibFile,
typeReferenceDirectives: this.convertFileReferences(result.typeReferenceDirectives),
libReferenceDirectives: this.convertFileReferences(result.libReferenceDirectives)
};
}
);
}
getAutomaticTypeDirectiveNames(compilerOptionsJson) {
return this.forwardJSONCall(
`getAutomaticTypeDirectiveNames('${compilerOptionsJson}')`,
() => {
const compilerOptions = JSON.parse(compilerOptionsJson);
return getAutomaticTypeDirectiveNames(compilerOptions, this.host);
}
);
}
convertFileReferences(refs) {
if (!refs) {
return void 0;
}
const result = [];
for (const ref of refs) {
result.push({
path: normalizeSlashes(ref.fileName),
position: ref.pos,
length: ref.end - ref.pos
});
}
return result;
}
getTSConfigFileInfo(fileName, sourceTextSnapshot) {
return this.forwardJSONCall(
`getTSConfigFileInfo('${fileName}')`,
() => {
const result = parseJsonText(fileName, getSnapshotText(sourceTextSnapshot));
const normalizedFileName = normalizeSlashes(fileName);
const configFile = parseJsonSourceFileConfigFileContent(
result,
this.host,
getDirectoryPath(normalizedFileName),
/*existingOptions*/
{},
normalizedFileName
);
return {
options: configFile.options,
typeAcquisition: configFile.typeAcquisition,
files: configFile.fileNames,
raw: configFile.raw,
errors: realizeDiagnostics([...result.parseDiagnostics, ...configFile.errors], "\r\n")
};
}
);
}
getDefaultCompilationSettings() {
return this.forwardJSONCall(
"getDefaultCompilationSettings()",
() => getDefaultCompilerOptions2()
);
}
discoverTypings(discoverTypingsJson) {
const getCanonicalFileName = createGetCanonicalFileName(
/*useCaseSensitiveFileNames*/
false
);
return this.forwardJSONCall("discoverTypings()", () => {
const info = JSON.parse(discoverTypingsJson);
if (this.safeList === void 0) {
this.safeList = ts_JsTyping_exports.loadSafeList(this.host, toPath(info.safeListPath, info.safeListPath, getCanonicalFileName));
}
return ts_JsTyping_exports.discoverTypings(
this.host,
(msg) => this.logger.log(msg),
info.fileNames,
toPath(info.projectRootPath, info.projectRootPath, getCanonicalFileName),
this.safeList,
info.packageNameToTypingLocation,
info.typeAcquisition,
info.unresolvedImports,
info.typesRegistry,
emptyOptions
);
});
}
};
var TypeScriptServicesFactory = class {
constructor() {
this._shims = [];
}
/*
* Returns script API version.
*/
getServicesVersion() {
return servicesVersion;
}
createLanguageServiceShim(host) {
try {
if (this.documentRegistry === void 0) {
this.documentRegistry = createDocumentRegistry(host.useCaseSensitiveFileNames && host.useCaseSensitiveFileNames(), host.getCurrentDirectory());
}
const hostAdapter = new LanguageServiceShimHostAdapter(host);
const languageService = createLanguageService(
hostAdapter,
this.documentRegistry,
/*syntaxOnlyOrLanguageServiceMode*/
false
);
return new LanguageServiceShimObject(this, host, languageService);
} catch (err) {
logInternalError(host, err);
throw err;
}
}
createClassifierShim(logger) {
try {
return new ClassifierShimObject(this, logger);
} catch (err) {
logInternalError(logger, err);
throw err;
}
}
createCoreServicesShim(host) {
try {
const adapter = new CoreServicesShimHostAdapter(host);
return new CoreServicesShimObject(this, host, adapter);
} catch (err) {
logInternalError(host, err);
throw err;
}
}
close() {
clear(this._shims);
this.documentRegistry = void 0;
}
registerShim(shim) {
this._shims.push(shim);
}
unregisterShim(shim) {
for (let i = 0; i < this._shims.length; i++) {
if (this._shims[i] === shim) {
delete this._shims[i];
return;
}
}
throw new Error("Invalid operation");
}
};
// src/services/_namespaces/ts.BreakpointResolver.ts
var ts_BreakpointResolver_exports = {};
__export(ts_BreakpointResolver_exports, {
spanInSourceFileAtLocation: () => spanInSourceFileAtLocation
});
// src/services/breakpoints.ts
function spanInSourceFileAtLocation(sourceFile, position) {
if (sourceFile.isDeclarationFile) {
return void 0;
}
let tokenAtLocation = getTokenAtPosition(sourceFile, position);
const lineOfPosition = sourceFile.getLineAndCharacterOfPosition(position).line;
if (sourceFile.getLineAndCharacterOfPosition(tokenAtLocation.getStart(sourceFile)).line > lineOfPosition) {
const preceding = findPrecedingToken(tokenAtLocation.pos, sourceFile);
if (!preceding || sourceFile.getLineAndCharacterOfPosition(preceding.getEnd()).line !== lineOfPosition) {
return void 0;
}
tokenAtLocation = preceding;
}
if (tokenAtLocation.flags & 16777216 /* Ambient */) {
return void 0;
}
return spanInNode(tokenAtLocation);
function textSpan(startNode2, endNode2) {
const lastDecorator = canHaveDecorators(startNode2) ? findLast(startNode2.modifiers, isDecorator) : void 0;
const start2 = lastDecorator ? skipTrivia(sourceFile.text, lastDecorator.end) : startNode2.getStart(sourceFile);
return createTextSpanFromBounds(start2, (endNode2 || startNode2).getEnd());
}
function textSpanEndingAtNextToken(startNode2, previousTokenToFindNextEndToken) {
return textSpan(startNode2, findNextToken(previousTokenToFindNextEndToken, previousTokenToFindNextEndToken.parent, sourceFile));
}
function spanInNodeIfStartsOnSameLine(node, otherwiseOnNode) {
if (node && lineOfPosition === sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line) {
return spanInNode(node);
}
return spanInNode(otherwiseOnNode);
}
function spanInNodeArray(nodeArray, node, match) {
if (nodeArray) {
const index = nodeArray.indexOf(node);
if (index >= 0) {
let start2 = index;
let end = index + 1;
while (start2 > 0 && match(nodeArray[start2 - 1]))
start2--;
while (end < nodeArray.length && match(nodeArray[end]))
end++;
return createTextSpanFromBounds(skipTrivia(sourceFile.text, nodeArray[start2].pos), nodeArray[end - 1].end);
}
}
return textSpan(node);
}
function spanInPreviousNode(node) {
return spanInNode(findPrecedingToken(node.pos, sourceFile));
}
function spanInNextNode(node) {
return spanInNode(findNextToken(node, node.parent, sourceFile));
}
function spanInNode(node) {
if (node) {
const { parent: parent2 } = node;
switch (node.kind) {
case 242 /* VariableStatement */:
return spanInVariableDeclaration(node.declarationList.declarations[0]);
case 259 /* VariableDeclaration */:
case 171 /* PropertyDeclaration */:
case 170 /* PropertySignature */:
return spanInVariableDeclaration(node);
case 168 /* Parameter */:
return spanInParameterDeclaration(node);
case 261 /* FunctionDeclaration */:
case 173 /* MethodDeclaration */:
case 172 /* MethodSignature */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
case 175 /* Constructor */:
case 217 /* FunctionExpression */:
case 218 /* ArrowFunction */:
return spanInFunctionDeclaration(node);
case 240 /* Block */:
if (isFunctionBlock(node)) {
return spanInFunctionBlock(node);
}
case 267 /* ModuleBlock */:
return spanInBlock(node);
case 298 /* CatchClause */:
return spanInBlock(node.block);
case 243 /* ExpressionStatement */:
return textSpan(node.expression);
case 252 /* ReturnStatement */:
return textSpan(node.getChildAt(0), node.expression);
case 246 /* WhileStatement */:
return textSpanEndingAtNextToken(node, node.expression);
case 245 /* DoStatement */:
return spanInNode(node.statement);
case 258 /* DebuggerStatement */:
return textSpan(node.getChildAt(0));
case 244 /* IfStatement */:
return textSpanEndingAtNextToken(node, node.expression);
case 255 /* LabeledStatement */:
return spanInNode(node.statement);
case 251 /* BreakStatement */:
case 250 /* ContinueStatement */:
return textSpan(node.getChildAt(0), node.label);
case 247 /* ForStatement */:
return spanInForStatement(node);
case 248 /* ForInStatement */:
return textSpanEndingAtNextToken(node, node.expression);
case 249 /* ForOfStatement */:
return spanInInitializerOfForLike(node);
case 254 /* SwitchStatement */:
return textSpanEndingAtNextToken(node, node.expression);
case 295 /* CaseClause */:
case 296 /* DefaultClause */:
return spanInNode(node.statements[0]);
case 257 /* TryStatement */:
return spanInBlock(node.tryBlock);
case 256 /* ThrowStatement */:
return textSpan(node, node.expression);
case 276 /* ExportAssignment */:
return textSpan(node, node.expression);
case 270 /* ImportEqualsDeclaration */:
return textSpan(node, node.moduleReference);
case 271 /* ImportDeclaration */:
return textSpan(node, node.moduleSpecifier);
case 277 /* ExportDeclaration */:
return textSpan(node, node.moduleSpecifier);
case 266 /* ModuleDeclaration */:
if (getModuleInstanceState(node) !== 1 /* Instantiated */) {
return void 0;
}
case 262 /* ClassDeclaration */:
case 265 /* EnumDeclaration */:
case 305 /* EnumMember */:
case 207 /* BindingElement */:
return textSpan(node);
case 253 /* WithStatement */:
return spanInNode(node.statement);
case 169 /* Decorator */:
return spanInNodeArray(parent2.modifiers, node, isDecorator);
case 205 /* ObjectBindingPattern */:
case 206 /* ArrayBindingPattern */:
return spanInBindingPattern(node);
case 263 /* InterfaceDeclaration */:
case 264 /* TypeAliasDeclaration */:
return void 0;
case 27 /* SemicolonToken */:
case 1 /* EndOfFileToken */:
return spanInNodeIfStartsOnSameLine(findPrecedingToken(node.pos, sourceFile));
case 28 /* CommaToken */:
return spanInPreviousNode(node);
case 19 /* OpenBraceToken */:
return spanInOpenBraceToken(node);
case 20 /* CloseBraceToken */:
return spanInCloseBraceToken(node);
case 24 /* CloseBracketToken */:
return spanInCloseBracketToken(node);
case 21 /* OpenParenToken */:
return spanInOpenParenToken(node);
case 22 /* CloseParenToken */:
return spanInCloseParenToken(node);
case 59 /* ColonToken */:
return spanInColonToken(node);
case 32 /* GreaterThanToken */:
case 30 /* LessThanToken */:
return spanInGreaterThanOrLessThanToken(node);
case 117 /* WhileKeyword */:
return spanInWhileKeyword(node);
case 93 /* ElseKeyword */:
case 85 /* CatchKeyword */:
case 98 /* FinallyKeyword */:
return spanInNextNode(node);
case 164 /* OfKeyword */:
return spanInOfKeyword(node);
default:
if (isArrayLiteralOrObjectLiteralDestructuringPattern(node)) {
return spanInArrayLiteralOrObjectLiteralDestructuringPattern(node);
}
if ((node.kind === 80 /* Identifier */ || node.kind === 229 /* SpreadElement */ || node.kind === 302 /* PropertyAssignment */ || node.kind === 303 /* ShorthandPropertyAssignment */) && isArrayLiteralOrObjectLiteralDestructuringPattern(parent2)) {
return textSpan(node);
}
if (node.kind === 225 /* BinaryExpression */) {
const { left, operatorToken } = node;
if (isArrayLiteralOrObjectLiteralDestructuringPattern(left)) {
return spanInArrayLiteralOrObjectLiteralDestructuringPattern(
left
);
}
if (operatorToken.kind === 64 /* EqualsToken */ && isArrayLiteralOrObjectLiteralDestructuringPattern(node.parent)) {
return textSpan(node);
}
if (operatorToken.kind === 28 /* CommaToken */) {
return spanInNode(left);
}
}
if (isExpressionNode(node)) {
switch (parent2.kind) {
case 245 /* DoStatement */:
return spanInPreviousNode(node);
case 169 /* Decorator */:
return spanInNode(node.parent);
case 247 /* ForStatement */:
case 249 /* ForOfStatement */:
return textSpan(node);
case 225 /* BinaryExpression */:
if (node.parent.operatorToken.kind === 28 /* CommaToken */) {
return textSpan(node);
}
break;
case 218 /* ArrowFunction */:
if (node.parent.body === node) {
return textSpan(node);
}
break;
}
}
switch (node.parent.kind) {
case 302 /* PropertyAssignment */:
if (node.parent.name === node && !isArrayLiteralOrObjectLiteralDestructuringPattern(node.parent.parent)) {
return spanInNode(node.parent.initializer);
}
break;
case 215 /* TypeAssertionExpression */:
if (node.parent.type === node) {
return spanInNextNode(node.parent.type);
}
break;
case 259 /* VariableDeclaration */:
case 168 /* Parameter */: {
const { initializer, type } = node.parent;
if (initializer === node || type === node || isAssignmentOperator(node.kind)) {
return spanInPreviousNode(node);
}
break;
}
case 225 /* BinaryExpression */: {
const { left } = node.parent;
if (isArrayLiteralOrObjectLiteralDestructuringPattern(left) && node !== left) {
return spanInPreviousNode(node);
}
break;
}
default:
if (isFunctionLike(node.parent) && node.parent.type === node) {
return spanInPreviousNode(node);
}
}
return spanInNode(node.parent);
}
}
function textSpanFromVariableDeclaration(variableDeclaration) {
if (isVariableDeclarationList(variableDeclaration.parent) && variableDeclaration.parent.declarations[0] === variableDeclaration) {
return textSpan(findPrecedingToken(variableDeclaration.pos, sourceFile, variableDeclaration.parent), variableDeclaration);
} else {
return textSpan(variableDeclaration);
}
}
function spanInVariableDeclaration(variableDeclaration) {
if (variableDeclaration.parent.parent.kind === 248 /* ForInStatement */) {
return spanInNode(variableDeclaration.parent.parent);
}
const parent2 = variableDeclaration.parent;
if (isBindingPattern(variableDeclaration.name)) {
return spanInBindingPattern(variableDeclaration.name);
}
if (hasOnlyExpressionInitializer(variableDeclaration) && variableDeclaration.initializer || hasSyntacticModifier(variableDeclaration, 1 /* Export */) || parent2.parent.kind === 249 /* ForOfStatement */) {
return textSpanFromVariableDeclaration(variableDeclaration);
}
if (isVariableDeclarationList(variableDeclaration.parent) && variableDeclaration.parent.declarations[0] !== variableDeclaration) {
return spanInNode(findPrecedingToken(variableDeclaration.pos, sourceFile, variableDeclaration.parent));
}
}
function canHaveSpanInParameterDeclaration(parameter) {
return !!parameter.initializer || parameter.dotDotDotToken !== void 0 || hasSyntacticModifier(parameter, 4 /* Public */ | 8 /* Private */);
}
function spanInParameterDeclaration(parameter) {
if (isBindingPattern(parameter.name)) {
return spanInBindingPattern(parameter.name);
} else if (canHaveSpanInParameterDeclaration(parameter)) {
return textSpan(parameter);
} else {
const functionDeclaration = parameter.parent;
const indexOfParameter = functionDeclaration.parameters.indexOf(parameter);
Debug.assert(indexOfParameter !== -1);
if (indexOfParameter !== 0) {
return spanInParameterDeclaration(functionDeclaration.parameters[indexOfParameter - 1]);
} else {
return spanInNode(functionDeclaration.body);
}
}
}
function canFunctionHaveSpanInWholeDeclaration(functionDeclaration) {
return hasSyntacticModifier(functionDeclaration, 1 /* Export */) || functionDeclaration.parent.kind === 262 /* ClassDeclaration */ && functionDeclaration.kind !== 175 /* Constructor */;
}
function spanInFunctionDeclaration(functionDeclaration) {
if (!functionDeclaration.body) {
return void 0;
}
if (canFunctionHaveSpanInWholeDeclaration(functionDeclaration)) {
return textSpan(functionDeclaration);
}
return spanInNode(functionDeclaration.body);
}
function spanInFunctionBlock(block) {
const nodeForSpanInBlock = block.statements.length ? block.statements[0] : block.getLastToken();
if (canFunctionHaveSpanInWholeDeclaration(block.parent)) {
return spanInNodeIfStartsOnSameLine(block.parent, nodeForSpanInBlock);
}
return spanInNode(nodeForSpanInBlock);
}
function spanInBlock(block) {
switch (block.parent.kind) {
case 266 /* ModuleDeclaration */:
if (getModuleInstanceState(block.parent) !== 1 /* Instantiated */) {
return void 0;
}
case 246 /* WhileStatement */:
case 244 /* IfStatement */:
case 248 /* ForInStatement */:
return spanInNodeIfStartsOnSameLine(block.parent, block.statements[0]);
case 247 /* ForStatement */:
case 249 /* ForOfStatement */:
return spanInNodeIfStartsOnSameLine(findPrecedingToken(block.pos, sourceFile, block.parent), block.statements[0]);
}
return spanInNode(block.statements[0]);
}
function spanInInitializerOfForLike(forLikeStatement) {
if (forLikeStatement.initializer.kind === 260 /* VariableDeclarationList */) {
const variableDeclarationList = forLikeStatement.initializer;
if (variableDeclarationList.declarations.length > 0) {
return spanInNode(variableDeclarationList.declarations[0]);
}
} else {
return spanInNode(forLikeStatement.initializer);
}
}
function spanInForStatement(forStatement) {
if (forStatement.initializer) {
return spanInInitializerOfForLike(forStatement);
}
if (forStatement.condition) {
return textSpan(forStatement.condition);
}
if (forStatement.incrementor) {
return textSpan(forStatement.incrementor);
}
}
function spanInBindingPattern(bindingPattern) {
const firstBindingElement = forEach(
bindingPattern.elements,
(element) => element.kind !== 231 /* OmittedExpression */ ? element : void 0
);
if (firstBindingElement) {
return spanInNode(firstBindingElement);
}
if (bindingPattern.parent.kind === 207 /* BindingElement */) {
return textSpan(bindingPattern.parent);
}
return textSpanFromVariableDeclaration(bindingPattern.parent);
}
function spanInArrayLiteralOrObjectLiteralDestructuringPattern(node2) {
Debug.assert(node2.kind !== 206 /* ArrayBindingPattern */ && node2.kind !== 205 /* ObjectBindingPattern */);
const elements = node2.kind === 208 /* ArrayLiteralExpression */ ? node2.elements : node2.properties;
const firstBindingElement = forEach(
elements,
(element) => element.kind !== 231 /* OmittedExpression */ ? element : void 0
);
if (firstBindingElement) {
return spanInNode(firstBindingElement);
}
return textSpan(node2.parent.kind === 225 /* BinaryExpression */ ? node2.parent : node2);
}
function spanInOpenBraceToken(node2) {
switch (node2.parent.kind) {
case 265 /* EnumDeclaration */:
const enumDeclaration = node2.parent;
return spanInNodeIfStartsOnSameLine(findPrecedingToken(node2.pos, sourceFile, node2.parent), enumDeclaration.members.length ? enumDeclaration.members[0] : enumDeclaration.getLastToken(sourceFile));
case 262 /* ClassDeclaration */:
const classDeclaration = node2.parent;
return spanInNodeIfStartsOnSameLine(findPrecedingToken(node2.pos, sourceFile, node2.parent), classDeclaration.members.length ? classDeclaration.members[0] : classDeclaration.getLastToken(sourceFile));
case 268 /* CaseBlock */:
return spanInNodeIfStartsOnSameLine(node2.parent.parent, node2.parent.clauses[0]);
}
return spanInNode(node2.parent);
}
function spanInCloseBraceToken(node2) {
switch (node2.parent.kind) {
case 267 /* ModuleBlock */:
if (getModuleInstanceState(node2.parent.parent) !== 1 /* Instantiated */) {
return void 0;
}
case 265 /* EnumDeclaration */:
case 262 /* ClassDeclaration */:
return textSpan(node2);
case 240 /* Block */:
if (isFunctionBlock(node2.parent)) {
return textSpan(node2);
}
case 298 /* CatchClause */:
return spanInNode(lastOrUndefined(node2.parent.statements));
case 268 /* CaseBlock */:
const caseBlock = node2.parent;
const lastClause = lastOrUndefined(caseBlock.clauses);
if (lastClause) {
return spanInNode(lastOrUndefined(lastClause.statements));
}
return void 0;
case 205 /* ObjectBindingPattern */:
const bindingPattern = node2.parent;
return spanInNode(lastOrUndefined(bindingPattern.elements) || bindingPattern);
default:
if (isArrayLiteralOrObjectLiteralDestructuringPattern(node2.parent)) {
const objectLiteral = node2.parent;
return textSpan(lastOrUndefined(objectLiteral.properties) || objectLiteral);
}
return spanInNode(node2.parent);
}
}
function spanInCloseBracketToken(node2) {
switch (node2.parent.kind) {
case 206 /* ArrayBindingPattern */:
const bindingPattern = node2.parent;
return textSpan(lastOrUndefined(bindingPattern.elements) || bindingPattern);
default:
if (isArrayLiteralOrObjectLiteralDestructuringPattern(node2.parent)) {
const arrayLiteral = node2.parent;
return textSpan(lastOrUndefined(arrayLiteral.elements) || arrayLiteral);
}
return spanInNode(node2.parent);
}
}
function spanInOpenParenToken(node2) {
if (node2.parent.kind === 245 /* DoStatement */ || // Go to while keyword and do action instead
node2.parent.kind === 212 /* CallExpression */ || node2.parent.kind === 213 /* NewExpression */) {
return spanInPreviousNode(node2);
}
if (node2.parent.kind === 216 /* ParenthesizedExpression */) {
return spanInNextNode(node2);
}
return spanInNode(node2.parent);
}
function spanInCloseParenToken(node2) {
switch (node2.parent.kind) {
case 217 /* FunctionExpression */:
case 261 /* FunctionDeclaration */:
case 218 /* ArrowFunction */:
case 173 /* MethodDeclaration */:
case 172 /* MethodSignature */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
case 175 /* Constructor */:
case 246 /* WhileStatement */:
case 245 /* DoStatement */:
case 247 /* ForStatement */:
case 249 /* ForOfStatement */:
case 212 /* CallExpression */:
case 213 /* NewExpression */:
case 216 /* ParenthesizedExpression */:
return spanInPreviousNode(node2);
default:
return spanInNode(node2.parent);
}
}
function spanInColonToken(node2) {
if (isFunctionLike(node2.parent) || node2.parent.kind === 302 /* PropertyAssignment */ || node2.parent.kind === 168 /* Parameter */) {
return spanInPreviousNode(node2);
}
return spanInNode(node2.parent);
}
function spanInGreaterThanOrLessThanToken(node2) {
if (node2.parent.kind === 215 /* TypeAssertionExpression */) {
return spanInNextNode(node2);
}
return spanInNode(node2.parent);
}
function spanInWhileKeyword(node2) {
if (node2.parent.kind === 245 /* DoStatement */) {
return textSpanEndingAtNextToken(node2, node2.parent.expression);
}
return spanInNode(node2.parent);
}
function spanInOfKeyword(node2) {
if (node2.parent.kind === 249 /* ForOfStatement */) {
return spanInNextNode(node2);
}
return spanInNode(node2.parent);
}
}
}
// src/services/_namespaces/ts.CallHierarchy.ts
var ts_CallHierarchy_exports = {};
__export(ts_CallHierarchy_exports, {
createCallHierarchyItem: () => createCallHierarchyItem,
getIncomingCalls: () => getIncomingCalls,
getOutgoingCalls: () => getOutgoingCalls,
resolveCallHierarchyDeclaration: () => resolveCallHierarchyDeclaration
});
// src/services/callHierarchy.ts
function isNamedExpression(node) {
return (isFunctionExpression(node) || isClassExpression(node)) && isNamedDeclaration(node);
}
function isConstNamedExpression(node) {
return (isFunctionExpression(node) || isArrowFunction(node) || isClassExpression(node)) && isVariableDeclaration(node.parent) && node === node.parent.initializer && isIdentifier(node.parent.name) && !!(getCombinedNodeFlags(node.parent) & 2 /* Const */);
}
function isPossibleCallHierarchyDeclaration(node) {
return isSourceFile(node) || isModuleDeclaration(node) || isFunctionDeclaration(node) || isFunctionExpression(node) || isClassDeclaration(node) || isClassExpression(node) || isClassStaticBlockDeclaration(node) || isMethodDeclaration(node) || isMethodSignature(node) || isGetAccessorDeclaration(node) || isSetAccessorDeclaration(node);
}
function isValidCallHierarchyDeclaration(node) {
return isSourceFile(node) || isModuleDeclaration(node) && isIdentifier(node.name) || isFunctionDeclaration(node) || isClassDeclaration(node) || isClassStaticBlockDeclaration(node) || isMethodDeclaration(node) || isMethodSignature(node) || isGetAccessorDeclaration(node) || isSetAccessorDeclaration(node) || isNamedExpression(node) || isConstNamedExpression(node);
}
function getCallHierarchyDeclarationReferenceNode(node) {
if (isSourceFile(node))
return node;
if (isNamedDeclaration(node))
return node.name;
if (isConstNamedExpression(node))
return node.parent.name;
return Debug.checkDefined(node.modifiers && find(node.modifiers, isDefaultModifier3));
}
function isDefaultModifier3(node) {
return node.kind === 90 /* DefaultKeyword */;
}
function getSymbolOfCallHierarchyDeclaration(typeChecker, node) {
const location = getCallHierarchyDeclarationReferenceNode(node);
return location && typeChecker.getSymbolAtLocation(location);
}
function getCallHierarchyItemName(program, node) {
if (isSourceFile(node)) {
return { text: node.fileName, pos: 0, end: 0 };
}
if ((isFunctionDeclaration(node) || isClassDeclaration(node)) && !isNamedDeclaration(node)) {
const defaultModifier = node.modifiers && find(node.modifiers, isDefaultModifier3);
if (defaultModifier) {
return { text: "default", pos: defaultModifier.getStart(), end: defaultModifier.getEnd() };
}
}
if (isClassStaticBlockDeclaration(node)) {
const sourceFile = node.getSourceFile();
const pos = skipTrivia(sourceFile.text, moveRangePastModifiers(node).pos);
const end = pos + 6;
const typeChecker = program.getTypeChecker();
const symbol = typeChecker.getSymbolAtLocation(node.parent);
const prefix = symbol ? `${typeChecker.symbolToString(symbol, node.parent)} ` : "";
return { text: `${prefix}static {}`, pos, end };
}
const declName = isConstNamedExpression(node) ? node.parent.name : Debug.checkDefined(getNameOfDeclaration(node), "Expected call hierarchy item to have a name");
let text = isIdentifier(declName) ? idText(declName) : isStringOrNumericLiteralLike(declName) ? declName.text : isComputedPropertyName(declName) ? isStringOrNumericLiteralLike(declName.expression) ? declName.expression.text : void 0 : void 0;
if (text === void 0) {
const typeChecker = program.getTypeChecker();
const symbol = typeChecker.getSymbolAtLocation(declName);
if (symbol) {
text = typeChecker.symbolToString(symbol, node);
}
}
if (text === void 0) {
const printer = createPrinterWithRemoveCommentsOmitTrailingSemicolon();
text = usingSingleLineStringWriter((writer) => printer.writeNode(4 /* Unspecified */, node, node.getSourceFile(), writer));
}
return { text, pos: declName.getStart(), end: declName.getEnd() };
}
function getCallHierarchItemContainerName(node) {
var _a, _b;
if (isConstNamedExpression(node)) {
if (isModuleBlock(node.parent.parent.parent.parent) && isIdentifier(node.parent.parent.parent.parent.parent.name)) {
return node.parent.parent.parent.parent.parent.name.getText();
}
return;
}
switch (node.kind) {
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
case 173 /* MethodDeclaration */:
if (node.parent.kind === 209 /* ObjectLiteralExpression */) {
return (_a = getAssignedName(node.parent)) == null ? void 0 : _a.getText();
}
return (_b = getNameOfDeclaration(node.parent)) == null ? void 0 : _b.getText();
case 261 /* FunctionDeclaration */:
case 262 /* ClassDeclaration */:
case 266 /* ModuleDeclaration */:
if (isModuleBlock(node.parent) && isIdentifier(node.parent.parent.name)) {
return node.parent.parent.name.getText();
}
}
}
function findImplementation(typeChecker, node) {
if (node.body) {
return node;
}
if (isConstructorDeclaration(node)) {
return getFirstConstructorWithBody(node.parent);
}
if (isFunctionDeclaration(node) || isMethodDeclaration(node)) {
const symbol = getSymbolOfCallHierarchyDeclaration(typeChecker, node);
if (symbol && symbol.valueDeclaration && isFunctionLikeDeclaration(symbol.valueDeclaration) && symbol.valueDeclaration.body) {
return symbol.valueDeclaration;
}
return void 0;
}
return node;
}
function findAllInitialDeclarations(typeChecker, node) {
const symbol = getSymbolOfCallHierarchyDeclaration(typeChecker, node);
let declarations;
if (symbol && symbol.declarations) {
const indices = indicesOf(symbol.declarations);
const keys = map(symbol.declarations, (decl) => ({ file: decl.getSourceFile().fileName, pos: decl.pos }));
indices.sort((a, b) => compareStringsCaseSensitive(keys[a].file, keys[b].file) || keys[a].pos - keys[b].pos);
const sortedDeclarations = map(indices, (i) => symbol.declarations[i]);
let lastDecl;
for (const decl of sortedDeclarations) {
if (isValidCallHierarchyDeclaration(decl)) {
if (!lastDecl || lastDecl.parent !== decl.parent || lastDecl.end !== decl.pos) {
declarations = append(declarations, decl);
}
lastDecl = decl;
}
}
}
return declarations;
}
function findImplementationOrAllInitialDeclarations(typeChecker, node) {
if (isClassStaticBlockDeclaration(node)) {
return node;
}
if (isFunctionLikeDeclaration(node)) {
return findImplementation(typeChecker, node) ?? findAllInitialDeclarations(typeChecker, node) ?? node;
}
return findAllInitialDeclarations(typeChecker, node) ?? node;
}
function resolveCallHierarchyDeclaration(program, location) {
const typeChecker = program.getTypeChecker();
let followingSymbol = false;
while (true) {
if (isValidCallHierarchyDeclaration(location)) {
return findImplementationOrAllInitialDeclarations(typeChecker, location);
}
if (isPossibleCallHierarchyDeclaration(location)) {
const ancestor = findAncestor(location, isValidCallHierarchyDeclaration);
return ancestor && findImplementationOrAllInitialDeclarations(typeChecker, ancestor);
}
if (isDeclarationName(location)) {
if (isValidCallHierarchyDeclaration(location.parent)) {
return findImplementationOrAllInitialDeclarations(typeChecker, location.parent);
}
if (isPossibleCallHierarchyDeclaration(location.parent)) {
const ancestor = findAncestor(location.parent, isValidCallHierarchyDeclaration);
return ancestor && findImplementationOrAllInitialDeclarations(typeChecker, ancestor);
}
if (isVariableDeclaration(location.parent) && location.parent.initializer && isConstNamedExpression(location.parent.initializer)) {
return location.parent.initializer;
}
return void 0;
}
if (isConstructorDeclaration(location)) {
if (isValidCallHierarchyDeclaration(location.parent)) {
return location.parent;
}
return void 0;
}
if (location.kind === 126 /* StaticKeyword */ && isClassStaticBlockDeclaration(location.parent)) {
location = location.parent;
continue;
}
if (isVariableDeclaration(location) && location.initializer && isConstNamedExpression(location.initializer)) {
return location.initializer;
}
if (!followingSymbol) {
let symbol = typeChecker.getSymbolAtLocation(location);
if (symbol) {
if (symbol.flags & 2097152 /* Alias */) {
symbol = typeChecker.getAliasedSymbol(symbol);
}
if (symbol.valueDeclaration) {
followingSymbol = true;
location = symbol.valueDeclaration;
continue;
}
}
}
return void 0;
}
}
function createCallHierarchyItem(program, node) {
const sourceFile = node.getSourceFile();
const name = getCallHierarchyItemName(program, node);
const containerName = getCallHierarchItemContainerName(node);
const kind = getNodeKind(node);
const kindModifiers = getNodeModifiers(node);
const span = createTextSpanFromBounds(skipTrivia(
sourceFile.text,
node.getFullStart(),
/*stopAfterLineBreak*/
false,
/*stopAtComments*/
true
), node.getEnd());
const selectionSpan = createTextSpanFromBounds(name.pos, name.end);
return { file: sourceFile.fileName, kind, kindModifiers, name: name.text, containerName, span, selectionSpan };
}
function isDefined(x) {
return x !== void 0;
}
function convertEntryToCallSite(entry) {
if (entry.kind === ts_FindAllReferences_exports.EntryKind.Node) {
const { node } = entry;
if (isCallOrNewExpressionTarget(
node,
/*includeElementAccess*/
true,
/*skipPastOuterExpressions*/
true
) || isTaggedTemplateTag(
node,
/*includeElementAccess*/
true,
/*skipPastOuterExpressions*/
true
) || isDecoratorTarget(
node,
/*includeElementAccess*/
true,
/*skipPastOuterExpressions*/
true
) || isJsxOpeningLikeElementTagName(
node,
/*includeElementAccess*/
true,
/*skipPastOuterExpressions*/
true
) || isRightSideOfPropertyAccess(node) || isArgumentExpressionOfElementAccess(node)) {
const sourceFile = node.getSourceFile();
const ancestor = findAncestor(node, isValidCallHierarchyDeclaration) || sourceFile;
return { declaration: ancestor, range: createTextRangeFromNode(node, sourceFile) };
}
}
}
function getCallSiteGroupKey(entry) {
return getNodeId(entry.declaration);
}
function createCallHierarchyIncomingCall(from, fromSpans) {
return { from, fromSpans };
}
function convertCallSiteGroupToIncomingCall(program, entries) {
return createCallHierarchyIncomingCall(createCallHierarchyItem(program, entries[0].declaration), map(entries, (entry) => createTextSpanFromRange(entry.range)));
}
function getIncomingCalls(program, declaration, cancellationToken) {
if (isSourceFile(declaration) || isModuleDeclaration(declaration) || isClassStaticBlockDeclaration(declaration)) {
return [];
}
const location = getCallHierarchyDeclarationReferenceNode(declaration);
const calls = filter(ts_FindAllReferences_exports.findReferenceOrRenameEntries(
program,
cancellationToken,
program.getSourceFiles(),
location,
/*position*/
0,
{ use: ts_FindAllReferences_exports.FindReferencesUse.References },
convertEntryToCallSite
), isDefined);
return calls ? group(calls, getCallSiteGroupKey, (entries) => convertCallSiteGroupToIncomingCall(program, entries)) : [];
}
function createCallSiteCollector(program, callSites) {
function recordCallSite(node) {
const target = isTaggedTemplateExpression(node) ? node.tag : isJsxOpeningLikeElement(node) ? node.tagName : isAccessExpression(node) ? node : isClassStaticBlockDeclaration(node) ? node : node.expression;
const declaration = resolveCallHierarchyDeclaration(program, target);
if (declaration) {
const range = createTextRangeFromNode(target, node.getSourceFile());
if (isArray(declaration)) {
for (const decl of declaration) {
callSites.push({ declaration: decl, range });
}
} else {
callSites.push({ declaration, range });
}
}
}
function collect(node) {
if (!node)
return;
if (node.flags & 16777216 /* Ambient */) {
return;
}
if (isValidCallHierarchyDeclaration(node)) {
if (isClassLike(node)) {
for (const member of node.members) {
if (member.name && isComputedPropertyName(member.name)) {
collect(member.name.expression);
}
}
}
return;
}
switch (node.kind) {
case 80 /* Identifier */:
case 270 /* ImportEqualsDeclaration */:
case 271 /* ImportDeclaration */:
case 277 /* ExportDeclaration */:
case 263 /* InterfaceDeclaration */:
case 264 /* TypeAliasDeclaration */:
return;
case 174 /* ClassStaticBlockDeclaration */:
recordCallSite(node);
return;
case 215 /* TypeAssertionExpression */:
case 233 /* AsExpression */:
collect(node.expression);
return;
case 259 /* VariableDeclaration */:
case 168 /* Parameter */:
collect(node.name);
collect(node.initializer);
return;
case 212 /* CallExpression */:
recordCallSite(node);
collect(node.expression);
forEach(node.arguments, collect);
return;
case 213 /* NewExpression */:
recordCallSite(node);
collect(node.expression);
forEach(node.arguments, collect);
return;
case 214 /* TaggedTemplateExpression */:
recordCallSite(node);
collect(node.tag);
collect(node.template);
return;
case 285 /* JsxOpeningElement */:
case 284 /* JsxSelfClosingElement */:
recordCallSite(node);
collect(node.tagName);
collect(node.attributes);
return;
case 169 /* Decorator */:
recordCallSite(node);
collect(node.expression);
return;
case 210 /* PropertyAccessExpression */:
case 211 /* ElementAccessExpression */:
recordCallSite(node);
forEachChild(node, collect);
break;
case 237 /* SatisfiesExpression */:
collect(node.expression);
return;
}
if (isPartOfTypeNode(node)) {
return;
}
forEachChild(node, collect);
}
return collect;
}
function collectCallSitesOfSourceFile(node, collect) {
forEach(node.statements, collect);
}
function collectCallSitesOfModuleDeclaration(node, collect) {
if (!hasSyntacticModifier(node, 2 /* Ambient */) && node.body && isModuleBlock(node.body)) {
forEach(node.body.statements, collect);
}
}
function collectCallSitesOfFunctionLikeDeclaration(typeChecker, node, collect) {
const implementation = findImplementation(typeChecker, node);
if (implementation) {
forEach(implementation.parameters, collect);
collect(implementation.body);
}
}
function collectCallSitesOfClassStaticBlockDeclaration(node, collect) {
collect(node.body);
}
function collectCallSitesOfClassLikeDeclaration(node, collect) {
forEach(node.modifiers, collect);
const heritage = getClassExtendsHeritageElement(node);
if (heritage) {
collect(heritage.expression);
}
for (const member of node.members) {
if (canHaveModifiers(member)) {
forEach(member.modifiers, collect);
}
if (isPropertyDeclaration(member)) {
collect(member.initializer);
} else if (isConstructorDeclaration(member) && member.body) {
forEach(member.parameters, collect);
collect(member.body);
} else if (isClassStaticBlockDeclaration(member)) {
collect(member);
}
}
}
function collectCallSites(program, node) {
const callSites = [];
const collect = createCallSiteCollector(program, callSites);
switch (node.kind) {
case 311 /* SourceFile */:
collectCallSitesOfSourceFile(node, collect);
break;
case 266 /* ModuleDeclaration */:
collectCallSitesOfModuleDeclaration(node, collect);
break;
case 261 /* FunctionDeclaration */:
case 217 /* FunctionExpression */:
case 218 /* ArrowFunction */:
case 173 /* MethodDeclaration */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
collectCallSitesOfFunctionLikeDeclaration(program.getTypeChecker(), node, collect);
break;
case 262 /* ClassDeclaration */:
case 230 /* ClassExpression */:
collectCallSitesOfClassLikeDeclaration(node, collect);
break;
case 174 /* ClassStaticBlockDeclaration */:
collectCallSitesOfClassStaticBlockDeclaration(node, collect);
break;
default:
Debug.assertNever(node);
}
return callSites;
}
function createCallHierarchyOutgoingCall(to, fromSpans) {
return { to, fromSpans };
}
function convertCallSiteGroupToOutgoingCall(program, entries) {
return createCallHierarchyOutgoingCall(createCallHierarchyItem(program, entries[0].declaration), map(entries, (entry) => createTextSpanFromRange(entry.range)));
}
function getOutgoingCalls(program, declaration) {
if (declaration.flags & 16777216 /* Ambient */ || isMethodSignature(declaration)) {
return [];
}
return group(collectCallSites(program, declaration), getCallSiteGroupKey, (entries) => convertCallSiteGroupToOutgoingCall(program, entries));
}
// src/services/_namespaces/ts.classifier.ts
var ts_classifier_exports = {};
__export(ts_classifier_exports, {
v2020: () => ts_classifier_v2020_exports
});
// src/services/_namespaces/ts.classifier.v2020.ts
var ts_classifier_v2020_exports = {};
__export(ts_classifier_v2020_exports, {
TokenEncodingConsts: () => TokenEncodingConsts,
TokenModifier: () => TokenModifier,
TokenType: () => TokenType,
getEncodedSemanticClassifications: () => getEncodedSemanticClassifications2,
getSemanticClassifications: () => getSemanticClassifications2
});
// src/services/_namespaces/ts.codefix.ts
var ts_codefix_exports = {};
__export(ts_codefix_exports, {
PreserveOptionalFlags: () => PreserveOptionalFlags,
addNewNodeForMemberSymbol: () => addNewNodeForMemberSymbol,
codeFixAll: () => codeFixAll,
createCodeFixAction: () => createCodeFixAction,
createCodeFixActionMaybeFixAll: () => createCodeFixActionMaybeFixAll,
createCodeFixActionWithoutFixAll: () => createCodeFixActionWithoutFixAll,
createCombinedCodeActions: () => createCombinedCodeActions,
createFileTextChanges: () => createFileTextChanges,
createImportAdder: () => createImportAdder,
createImportSpecifierResolver: () => createImportSpecifierResolver,
createJsonPropertyAssignment: () => createJsonPropertyAssignment,
createMissingMemberNodes: () => createMissingMemberNodes,
createSignatureDeclarationFromCallExpression: () => createSignatureDeclarationFromCallExpression,
createSignatureDeclarationFromSignature: () => createSignatureDeclarationFromSignature,
createStubbedBody: () => createStubbedBody,
eachDiagnostic: () => eachDiagnostic,
findAncestorMatchingSpan: () => findAncestorMatchingSpan,
findJsonProperty: () => findJsonProperty,
generateAccessorFromProperty: () => generateAccessorFromProperty,
getAccessorConvertiblePropertyAtPosition: () => getAccessorConvertiblePropertyAtPosition,
getAllFixes: () => getAllFixes,
getAllSupers: () => getAllSupers,
getArgumentTypesAndTypeParameters: () => getArgumentTypesAndTypeParameters,
getFixes: () => getFixes,
getImportCompletionAction: () => getImportCompletionAction,
getImportKind: () => getImportKind,
getJSDocTypedefNode: () => getJSDocTypedefNode,
getNoopSymbolTrackerWithResolver: () => getNoopSymbolTrackerWithResolver,
getPromoteTypeOnlyCompletionAction: () => getPromoteTypeOnlyCompletionAction,
getSupportedErrorCodes: () => getSupportedErrorCodes,
importFixName: () => importFixName,
importSymbols: () => importSymbols,
moduleSpecifierToValidIdentifier: () => moduleSpecifierToValidIdentifier,
moduleSymbolToValidIdentifier: () => moduleSymbolToValidIdentifier,
parameterShouldGetTypeFromJSDoc: () => parameterShouldGetTypeFromJSDoc,
registerCodeFix: () => registerCodeFix,
setJsonCompilerOptionValue: () => setJsonCompilerOptionValue,
setJsonCompilerOptionValues: () => setJsonCompilerOptionValues,
tryGetAutoImportableReferenceFromTypeNode: () => tryGetAutoImportableReferenceFromTypeNode,
typeToAutoImportableTypeNode: () => typeToAutoImportableTypeNode
});
// src/services/codeFixProvider.ts
var errorCodeToFixes = createMultiMap();
var fixIdToRegistration = /* @__PURE__ */ new Map();
function createCodeFixActionWithoutFixAll(fixName8, changes, description3) {
return createCodeFixActionWorker(
fixName8,
diagnosticToString(description3),
changes,
/*fixId*/
void 0,
/*fixAllDescription*/
void 0
);
}
function createCodeFixAction(fixName8, changes, description3, fixId52, fixAllDescription, command) {
return createCodeFixActionWorker(fixName8, diagnosticToString(description3), changes, fixId52, diagnosticToString(fixAllDescription), command);
}
function createCodeFixActionMaybeFixAll(fixName8, changes, description3, fixId52, fixAllDescription, command) {
return createCodeFixActionWorker(fixName8, diagnosticToString(description3), changes, fixId52, fixAllDescription && diagnosticToString(fixAllDescription), command);
}
function createCodeFixActionWorker(fixName8, description3, changes, fixId52, fixAllDescription, command) {
return { fixName: fixName8, description: description3, changes, fixId: fixId52, fixAllDescription, commands: command ? [command] : void 0 };
}
function registerCodeFix(reg) {
for (const error of reg.errorCodes) {
errorCodeToFixesArray = void 0;
errorCodeToFixes.add(String(error), reg);
}
if (reg.fixIds) {
for (const fixId52 of reg.fixIds) {
Debug.assert(!fixIdToRegistration.has(fixId52));
fixIdToRegistration.set(fixId52, reg);
}
}
}
var errorCodeToFixesArray;
function getSupportedErrorCodes() {
return errorCodeToFixesArray ?? (errorCodeToFixesArray = arrayFrom(errorCodeToFixes.keys()));
}
function removeFixIdIfFixAllUnavailable(registration, diagnostics) {
const { errorCodes: errorCodes64 } = registration;
let maybeFixableDiagnostics = 0;
for (const diag2 of diagnostics) {
if (contains(errorCodes64, diag2.code))
maybeFixableDiagnostics++;
if (maybeFixableDiagnostics > 1)
break;
}
const fixAllUnavailable = maybeFixableDiagnostics < 2;
return ({ fixId: fixId52, fixAllDescription, ...action }) => {
return fixAllUnavailable ? action : { ...action, fixId: fixId52, fixAllDescription };
};
}
function getFixes(context) {
const diagnostics = getDiagnostics(context);
const registrations = errorCodeToFixes.get(String(context.errorCode));
return flatMap(registrations, (f) => map(f.getCodeActions(context), removeFixIdIfFixAllUnavailable(f, diagnostics)));
}
function getAllFixes(context) {
return fixIdToRegistration.get(cast(context.fixId, isString)).getAllCodeActions(context);
}
function createCombinedCodeActions(changes, commands) {
return { changes, commands };
}
function createFileTextChanges(fileName, textChanges2) {
return { fileName, textChanges: textChanges2 };
}
function codeFixAll(context, errorCodes64, use) {
const commands = [];
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => eachDiagnostic(context, errorCodes64, (diag2) => use(t, diag2, commands)));
return createCombinedCodeActions(changes, commands.length === 0 ? void 0 : commands);
}
function eachDiagnostic(context, errorCodes64, cb) {
for (const diag2 of getDiagnostics(context)) {
if (contains(errorCodes64, diag2.code)) {
cb(diag2);
}
}
}
function getDiagnostics({ program, sourceFile, cancellationToken }) {
return [
...program.getSemanticDiagnostics(sourceFile, cancellationToken),
...program.getSyntacticDiagnostics(sourceFile, cancellationToken),
...computeSuggestionDiagnostics(sourceFile, program, cancellationToken)
];
}
// src/services/codefixes/addConvertToUnknownForNonOverlappingTypes.ts
var fixId = "addConvertToUnknownForNonOverlappingTypes";
var errorCodes = [Diagnostics.Conversion_of_type_0_to_type_1_may_be_a_mistake_because_neither_type_sufficiently_overlaps_with_the_other_If_this_was_intentional_convert_the_expression_to_unknown_first.code];
registerCodeFix({
errorCodes,
getCodeActions: function getCodeActionsToAddConvertToUnknownForNonOverlappingTypes(context) {
const assertion = getAssertion(context.sourceFile, context.span.start);
if (assertion === void 0)
return void 0;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => makeChange(t, context.sourceFile, assertion));
return [createCodeFixAction(fixId, changes, Diagnostics.Add_unknown_conversion_for_non_overlapping_types, fixId, Diagnostics.Add_unknown_to_all_conversions_of_non_overlapping_types)];
},
fixIds: [fixId],
getAllCodeActions: (context) => codeFixAll(context, errorCodes, (changes, diag2) => {
const assertion = getAssertion(diag2.file, diag2.start);
if (assertion) {
makeChange(changes, diag2.file, assertion);
}
})
});
function makeChange(changeTracker, sourceFile, assertion) {
const replacement = isAsExpression(assertion) ? factory.createAsExpression(assertion.expression, factory.createKeywordTypeNode(159 /* UnknownKeyword */)) : factory.createTypeAssertion(factory.createKeywordTypeNode(159 /* UnknownKeyword */), assertion.expression);
changeTracker.replaceNode(sourceFile, assertion.expression, replacement);
}
function getAssertion(sourceFile, pos) {
if (isInJSFile(sourceFile))
return void 0;
return findAncestor(getTokenAtPosition(sourceFile, pos), (n) => isAsExpression(n) || isTypeAssertionExpression(n));
}
// src/services/codefixes/addEmptyExportDeclaration.ts
registerCodeFix({
errorCodes: [
Diagnostics.await_expressions_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.code,
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.code
],
getCodeActions: function getCodeActionsToAddEmptyExportDeclaration(context) {
const { sourceFile } = context;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (changes2) => {
const exportDeclaration = factory.createExportDeclaration(
/*modifiers*/
void 0,
/*isTypeOnly*/
false,
factory.createNamedExports([]),
/*moduleSpecifier*/
void 0
);
changes2.insertNodeAtEndOfScope(sourceFile, sourceFile, exportDeclaration);
});
return [createCodeFixActionWithoutFixAll("addEmptyExportDeclaration", changes, Diagnostics.Add_export_to_make_this_file_into_a_module)];
}
});
// src/services/codefixes/addMissingAsync.ts
var fixId2 = "addMissingAsync";
var errorCodes2 = [
Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1.code,
Diagnostics.Type_0_is_not_assignable_to_type_1.code,
Diagnostics.Type_0_is_not_comparable_to_type_1.code
];
registerCodeFix({
fixIds: [fixId2],
errorCodes: errorCodes2,
getCodeActions: function getCodeActionsToAddMissingAsync(context) {
const { sourceFile, errorCode, cancellationToken, program, span } = context;
const diagnostic = find(program.getTypeChecker().getDiagnostics(sourceFile, cancellationToken), getIsMatchingAsyncError(span, errorCode));
const directSpan = diagnostic && diagnostic.relatedInformation && find(diagnostic.relatedInformation, (r) => r.code === Diagnostics.Did_you_mean_to_mark_this_function_as_async.code);
const decl = getFixableErrorSpanDeclaration(sourceFile, directSpan);
if (!decl) {
return;
}
const trackChanges = (cb) => ts_textChanges_exports.ChangeTracker.with(context, cb);
return [getFix(context, decl, trackChanges)];
},
getAllCodeActions: (context) => {
const { sourceFile } = context;
const fixedDeclarations = /* @__PURE__ */ new Set();
return codeFixAll(context, errorCodes2, (t, diagnostic) => {
const span = diagnostic.relatedInformation && find(diagnostic.relatedInformation, (r) => r.code === Diagnostics.Did_you_mean_to_mark_this_function_as_async.code);
const decl = getFixableErrorSpanDeclaration(sourceFile, span);
if (!decl) {
return;
}
const trackChanges = (cb) => (cb(t), []);
return getFix(context, decl, trackChanges, fixedDeclarations);
});
}
});
function getFix(context, decl, trackChanges, fixedDeclarations) {
const changes = trackChanges((t) => makeChange2(t, context.sourceFile, decl, fixedDeclarations));
return createCodeFixAction(fixId2, changes, Diagnostics.Add_async_modifier_to_containing_function, fixId2, Diagnostics.Add_all_missing_async_modifiers);
}
function makeChange2(changeTracker, sourceFile, insertionSite, fixedDeclarations) {
if (fixedDeclarations) {
if (fixedDeclarations.has(getNodeId(insertionSite))) {
return;
}
}
fixedDeclarations == null ? void 0 : fixedDeclarations.add(getNodeId(insertionSite));
const cloneWithModifier = factory.updateModifiers(
getSynthesizedDeepClone(
insertionSite,
/*includeTrivia*/
true
),
factory.createNodeArray(factory.createModifiersFromModifierFlags(getSyntacticModifierFlags(insertionSite) | 512 /* Async */))
);
changeTracker.replaceNode(
sourceFile,
insertionSite,
cloneWithModifier
);
}
function getFixableErrorSpanDeclaration(sourceFile, span) {
if (!span)
return void 0;
const token = getTokenAtPosition(sourceFile, span.start);
const decl = findAncestor(token, (node) => {
if (node.getStart(sourceFile) < span.start || node.getEnd() > textSpanEnd(span)) {
return "quit";
}
return (isArrowFunction(node) || isMethodDeclaration(node) || isFunctionExpression(node) || isFunctionDeclaration(node)) && textSpansEqual(span, createTextSpanFromNode(node, sourceFile));
});
return decl;
}
function getIsMatchingAsyncError(span, errorCode) {
return ({ start: start2, length: length2, relatedInformation, code }) => isNumber(start2) && isNumber(length2) && textSpansEqual({ start: start2, length: length2 }, span) && code === errorCode && !!relatedInformation && some(relatedInformation, (related) => related.code === Diagnostics.Did_you_mean_to_mark_this_function_as_async.code);
}
// src/services/codefixes/addMissingAwait.ts
var fixId3 = "addMissingAwait";
var propertyAccessCode = Diagnostics.Property_0_does_not_exist_on_type_1.code;
var callableConstructableErrorCodes = [
Diagnostics.This_expression_is_not_callable.code,
Diagnostics.This_expression_is_not_constructable.code
];
var errorCodes3 = [
Diagnostics.An_arithmetic_operand_must_be_of_type_any_number_bigint_or_an_enum_type.code,
Diagnostics.The_left_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_bigint_or_an_enum_type.code,
Diagnostics.The_right_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_bigint_or_an_enum_type.code,
Diagnostics.Operator_0_cannot_be_applied_to_type_1.code,
Diagnostics.Operator_0_cannot_be_applied_to_types_1_and_2.code,
Diagnostics.This_comparison_appears_to_be_unintentional_because_the_types_0_and_1_have_no_overlap.code,
Diagnostics.This_condition_will_always_return_true_since_this_0_is_always_defined.code,
Diagnostics.Type_0_is_not_an_array_type.code,
Diagnostics.Type_0_is_not_an_array_type_or_a_string_type.code,
Diagnostics.Type_0_can_only_be_iterated_through_when_using_the_downlevelIteration_flag_or_with_a_target_of_es2015_or_higher.code,
Diagnostics.Type_0_is_not_an_array_type_or_a_string_type_or_does_not_have_a_Symbol_iterator_method_that_returns_an_iterator.code,
Diagnostics.Type_0_is_not_an_array_type_or_does_not_have_a_Symbol_iterator_method_that_returns_an_iterator.code,
Diagnostics.Type_0_must_have_a_Symbol_iterator_method_that_returns_an_iterator.code,
Diagnostics.Type_0_must_have_a_Symbol_asyncIterator_method_that_returns_an_async_iterator.code,
Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1.code,
propertyAccessCode,
...callableConstructableErrorCodes
];
registerCodeFix({
fixIds: [fixId3],
errorCodes: errorCodes3,
getCodeActions: function getCodeActionsToAddMissingAwait(context) {
const { sourceFile, errorCode, span, cancellationToken, program } = context;
const expression = getAwaitErrorSpanExpression(sourceFile, errorCode, span, cancellationToken, program);
if (!expression) {
return;
}
const checker = context.program.getTypeChecker();
const trackChanges = (cb) => ts_textChanges_exports.ChangeTracker.with(context, cb);
return compact([
getDeclarationSiteFix(context, expression, errorCode, checker, trackChanges),
getUseSiteFix(context, expression, errorCode, checker, trackChanges)
]);
},
getAllCodeActions: (context) => {
const { sourceFile, program, cancellationToken } = context;
const checker = context.program.getTypeChecker();
const fixedDeclarations = /* @__PURE__ */ new Set();
return codeFixAll(context, errorCodes3, (t, diagnostic) => {
const expression = getAwaitErrorSpanExpression(sourceFile, diagnostic.code, diagnostic, cancellationToken, program);
if (!expression) {
return;
}
const trackChanges = (cb) => (cb(t), []);
return getDeclarationSiteFix(context, expression, diagnostic.code, checker, trackChanges, fixedDeclarations) || getUseSiteFix(context, expression, diagnostic.code, checker, trackChanges, fixedDeclarations);
});
}
});
function getAwaitErrorSpanExpression(sourceFile, errorCode, span, cancellationToken, program) {
const expression = getFixableErrorSpanExpression(sourceFile, span);
return expression && isMissingAwaitError(sourceFile, errorCode, span, cancellationToken, program) && isInsideAwaitableBody(expression) ? expression : void 0;
}
function getDeclarationSiteFix(context, expression, errorCode, checker, trackChanges, fixedDeclarations) {
const { sourceFile, program, cancellationToken } = context;
const awaitableInitializers = findAwaitableInitializers(expression, sourceFile, cancellationToken, program, checker);
if (awaitableInitializers) {
const initializerChanges = trackChanges((t) => {
forEach(awaitableInitializers.initializers, ({ expression: expression2 }) => makeChange3(t, errorCode, sourceFile, checker, expression2, fixedDeclarations));
if (fixedDeclarations && awaitableInitializers.needsSecondPassForFixAll) {
makeChange3(t, errorCode, sourceFile, checker, expression, fixedDeclarations);
}
});
return createCodeFixActionWithoutFixAll(
"addMissingAwaitToInitializer",
initializerChanges,
awaitableInitializers.initializers.length === 1 ? [Diagnostics.Add_await_to_initializer_for_0, awaitableInitializers.initializers[0].declarationSymbol.name] : Diagnostics.Add_await_to_initializers
);
}
}
function getUseSiteFix(context, expression, errorCode, checker, trackChanges, fixedDeclarations) {
const changes = trackChanges((t) => makeChange3(t, errorCode, context.sourceFile, checker, expression, fixedDeclarations));
return createCodeFixAction(fixId3, changes, Diagnostics.Add_await, fixId3, Diagnostics.Fix_all_expressions_possibly_missing_await);
}
function isMissingAwaitError(sourceFile, errorCode, span, cancellationToken, program) {
const checker = program.getTypeChecker();
const diagnostics = checker.getDiagnostics(sourceFile, cancellationToken);
return some(diagnostics, ({ start: start2, length: length2, relatedInformation, code }) => isNumber(start2) && isNumber(length2) && textSpansEqual({ start: start2, length: length2 }, span) && code === errorCode && !!relatedInformation && some(relatedInformation, (related) => related.code === Diagnostics.Did_you_forget_to_use_await.code));
}
function findAwaitableInitializers(expression, sourceFile, cancellationToken, program, checker) {
const identifiers = getIdentifiersFromErrorSpanExpression(expression, checker);
if (!identifiers) {
return;
}
let isCompleteFix = identifiers.isCompleteFix;
let initializers;
for (const identifier of identifiers.identifiers) {
const symbol = checker.getSymbolAtLocation(identifier);
if (!symbol) {
continue;
}
const declaration = tryCast(symbol.valueDeclaration, isVariableDeclaration);
const variableName = declaration && tryCast(declaration.name, isIdentifier);
const variableStatement = getAncestor(declaration, 242 /* VariableStatement */);
if (!declaration || !variableStatement || declaration.type || !declaration.initializer || variableStatement.getSourceFile() !== sourceFile || hasSyntacticModifier(variableStatement, 1 /* Export */) || !variableName || !isInsideAwaitableBody(declaration.initializer)) {
isCompleteFix = false;
continue;
}
const diagnostics = program.getSemanticDiagnostics(sourceFile, cancellationToken);
const isUsedElsewhere = ts_FindAllReferences_exports.Core.eachSymbolReferenceInFile(variableName, checker, sourceFile, (reference) => {
return identifier !== reference && !symbolReferenceIsAlsoMissingAwait(reference, diagnostics, sourceFile, checker);
});
if (isUsedElsewhere) {
isCompleteFix = false;
continue;
}
(initializers || (initializers = [])).push({
expression: declaration.initializer,
declarationSymbol: symbol
});
}
return initializers && {
initializers,
needsSecondPassForFixAll: !isCompleteFix
};
}
function getIdentifiersFromErrorSpanExpression(expression, checker) {
if (isPropertyAccessExpression(expression.parent) && isIdentifier(expression.parent.expression)) {
return { identifiers: [expression.parent.expression], isCompleteFix: true };
}
if (isIdentifier(expression)) {
return { identifiers: [expression], isCompleteFix: true };
}
if (isBinaryExpression(expression)) {
let sides;
let isCompleteFix = true;
for (const side of [expression.left, expression.right]) {
const type = checker.getTypeAtLocation(side);
if (checker.getPromisedTypeOfPromise(type)) {
if (!isIdentifier(side)) {
isCompleteFix = false;
continue;
}
(sides || (sides = [])).push(side);
}
}
return sides && { identifiers: sides, isCompleteFix };
}
}
function symbolReferenceIsAlsoMissingAwait(reference, diagnostics, sourceFile, checker) {
const errorNode = isPropertyAccessExpression(reference.parent) ? reference.parent.name : isBinaryExpression(reference.parent) ? reference.parent : reference;
const diagnostic = find(diagnostics, (diagnostic2) => diagnostic2.start === errorNode.getStart(sourceFile) && diagnostic2.start + diagnostic2.length === errorNode.getEnd());
return diagnostic && contains(errorCodes3, diagnostic.code) || // A Promise is usually not correct in a binary expression (it's not valid
// in an arithmetic expression and an equality comparison seems unusual),
// but if the other side of the binary expression has an error, the side
// is typed `any` which will squash the error that would identify this
// Promise as an invalid operand. So if the whole binary expression is
// typed `any` as a result, there is a strong likelihood that this Promise
// is accidentally missing `await`.
checker.getTypeAtLocation(errorNode).flags & 1 /* Any */;
}
function isInsideAwaitableBody(node) {
return node.kind & 32768 /* AwaitContext */ || !!findAncestor(node, (ancestor) => ancestor.parent && isArrowFunction(ancestor.parent) && ancestor.parent.body === ancestor || isBlock(ancestor) && (ancestor.parent.kind === 261 /* FunctionDeclaration */ || ancestor.parent.kind === 217 /* FunctionExpression */ || ancestor.parent.kind === 218 /* ArrowFunction */ || ancestor.parent.kind === 173 /* MethodDeclaration */));
}
function makeChange3(changeTracker, errorCode, sourceFile, checker, insertionSite, fixedDeclarations) {
if (isForOfStatement(insertionSite.parent) && !insertionSite.parent.awaitModifier) {
const exprType = checker.getTypeAtLocation(insertionSite);
const asyncIter = checker.getAsyncIterableType();
if (asyncIter && checker.isTypeAssignableTo(exprType, asyncIter)) {
const forOf = insertionSite.parent;
changeTracker.replaceNode(sourceFile, forOf, factory.updateForOfStatement(forOf, factory.createToken(135 /* AwaitKeyword */), forOf.initializer, forOf.expression, forOf.statement));
return;
}
}
if (isBinaryExpression(insertionSite)) {
for (const side of [insertionSite.left, insertionSite.right]) {
if (fixedDeclarations && isIdentifier(side)) {
const symbol = checker.getSymbolAtLocation(side);
if (symbol && fixedDeclarations.has(getSymbolId(symbol))) {
continue;
}
}
const type = checker.getTypeAtLocation(side);
const newNode = checker.getPromisedTypeOfPromise(type) ? factory.createAwaitExpression(side) : side;
changeTracker.replaceNode(sourceFile, side, newNode);
}
} else if (errorCode === propertyAccessCode && isPropertyAccessExpression(insertionSite.parent)) {
if (fixedDeclarations && isIdentifier(insertionSite.parent.expression)) {
const symbol = checker.getSymbolAtLocation(insertionSite.parent.expression);
if (symbol && fixedDeclarations.has(getSymbolId(symbol))) {
return;
}
}
changeTracker.replaceNode(
sourceFile,
insertionSite.parent.expression,
factory.createParenthesizedExpression(factory.createAwaitExpression(insertionSite.parent.expression))
);
insertLeadingSemicolonIfNeeded(changeTracker, insertionSite.parent.expression, sourceFile);
} else if (contains(callableConstructableErrorCodes, errorCode) && isCallOrNewExpression(insertionSite.parent)) {
if (fixedDeclarations && isIdentifier(insertionSite)) {
const symbol = checker.getSymbolAtLocation(insertionSite);
if (symbol && fixedDeclarations.has(getSymbolId(symbol))) {
return;
}
}
changeTracker.replaceNode(sourceFile, insertionSite, factory.createParenthesizedExpression(factory.createAwaitExpression(insertionSite)));
insertLeadingSemicolonIfNeeded(changeTracker, insertionSite, sourceFile);
} else {
if (fixedDeclarations && isVariableDeclaration(insertionSite.parent) && isIdentifier(insertionSite.parent.name)) {
const symbol = checker.getSymbolAtLocation(insertionSite.parent.name);
if (symbol && !tryAddToSet(fixedDeclarations, getSymbolId(symbol))) {
return;
}
}
changeTracker.replaceNode(sourceFile, insertionSite, factory.createAwaitExpression(insertionSite));
}
}
function insertLeadingSemicolonIfNeeded(changeTracker, beforeNode, sourceFile) {
const precedingToken = findPrecedingToken(beforeNode.pos, sourceFile);
if (precedingToken && positionIsASICandidate(precedingToken.end, precedingToken.parent, sourceFile)) {
changeTracker.insertText(sourceFile, beforeNode.getStart(sourceFile), ";");
}
}
// src/services/codefixes/addMissingConst.ts
var fixId4 = "addMissingConst";
var errorCodes4 = [
Diagnostics.Cannot_find_name_0.code,
Diagnostics.No_value_exists_in_scope_for_the_shorthand_property_0_Either_declare_one_or_provide_an_initializer.code
];
registerCodeFix({
errorCodes: errorCodes4,
getCodeActions: function getCodeActionsToAddMissingConst(context) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => makeChange4(t, context.sourceFile, context.span.start, context.program));
if (changes.length > 0) {
return [createCodeFixAction(fixId4, changes, Diagnostics.Add_const_to_unresolved_variable, fixId4, Diagnostics.Add_const_to_all_unresolved_variables)];
}
},
fixIds: [fixId4],
getAllCodeActions: (context) => {
const fixedNodes = /* @__PURE__ */ new Set();
return codeFixAll(context, errorCodes4, (changes, diag2) => makeChange4(changes, diag2.file, diag2.start, context.program, fixedNodes));
}
});
function makeChange4(changeTracker, sourceFile, pos, program, fixedNodes) {
const token = getTokenAtPosition(sourceFile, pos);
const forInitializer = findAncestor(
token,
(node) => isForInOrOfStatement(node.parent) ? node.parent.initializer === node : isPossiblyPartOfDestructuring(node) ? false : "quit"
);
if (forInitializer)
return applyChange(changeTracker, forInitializer, sourceFile, fixedNodes);
const parent2 = token.parent;
if (isBinaryExpression(parent2) && parent2.operatorToken.kind === 64 /* EqualsToken */ && isExpressionStatement(parent2.parent)) {
return applyChange(changeTracker, token, sourceFile, fixedNodes);
}
if (isArrayLiteralExpression(parent2)) {
const checker = program.getTypeChecker();
if (!every(parent2.elements, (element) => arrayElementCouldBeVariableDeclaration(element, checker))) {
return;
}
return applyChange(changeTracker, parent2, sourceFile, fixedNodes);
}
const commaExpression = findAncestor(
token,
(node) => isExpressionStatement(node.parent) ? true : isPossiblyPartOfCommaSeperatedInitializer(node) ? false : "quit"
);
if (commaExpression) {
const checker = program.getTypeChecker();
if (!expressionCouldBeVariableDeclaration(commaExpression, checker)) {
return;
}
return applyChange(changeTracker, commaExpression, sourceFile, fixedNodes);
}
}
function applyChange(changeTracker, initializer, sourceFile, fixedNodes) {
if (!fixedNodes || tryAddToSet(fixedNodes, initializer)) {
changeTracker.insertModifierBefore(sourceFile, 87 /* ConstKeyword */, initializer);
}
}
function isPossiblyPartOfDestructuring(node) {
switch (node.kind) {
case 80 /* Identifier */:
case 208 /* ArrayLiteralExpression */:
case 209 /* ObjectLiteralExpression */:
case 302 /* PropertyAssignment */:
case 303 /* ShorthandPropertyAssignment */:
return true;
default:
return false;
}
}
function arrayElementCouldBeVariableDeclaration(expression, checker) {
const identifier = isIdentifier(expression) ? expression : isAssignmentExpression(
expression,
/*excludeCompoundAssignment*/
true
) && isIdentifier(expression.left) ? expression.left : void 0;
return !!identifier && !checker.getSymbolAtLocation(identifier);
}
function isPossiblyPartOfCommaSeperatedInitializer(node) {
switch (node.kind) {
case 80 /* Identifier */:
case 225 /* BinaryExpression */:
case 28 /* CommaToken */:
return true;
default:
return false;
}
}
function expressionCouldBeVariableDeclaration(expression, checker) {
if (!isBinaryExpression(expression)) {
return false;
}
if (expression.operatorToken.kind === 28 /* CommaToken */) {
return every([expression.left, expression.right], (expression2) => expressionCouldBeVariableDeclaration(expression2, checker));
}
return expression.operatorToken.kind === 64 /* EqualsToken */ && isIdentifier(expression.left) && !checker.getSymbolAtLocation(expression.left);
}
// src/services/codefixes/addMissingDeclareProperty.ts
var fixId5 = "addMissingDeclareProperty";
var errorCodes5 = [
Diagnostics.Property_0_will_overwrite_the_base_property_in_1_If_this_is_intentional_add_an_initializer_Otherwise_add_a_declare_modifier_or_remove_the_redundant_declaration.code
];
registerCodeFix({
errorCodes: errorCodes5,
getCodeActions: function getCodeActionsToAddMissingDeclareOnProperty(context) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => makeChange5(t, context.sourceFile, context.span.start));
if (changes.length > 0) {
return [createCodeFixAction(fixId5, changes, Diagnostics.Prefix_with_declare, fixId5, Diagnostics.Prefix_all_incorrect_property_declarations_with_declare)];
}
},
fixIds: [fixId5],
getAllCodeActions: (context) => {
const fixedNodes = /* @__PURE__ */ new Set();
return codeFixAll(context, errorCodes5, (changes, diag2) => makeChange5(changes, diag2.file, diag2.start, fixedNodes));
}
});
function makeChange5(changeTracker, sourceFile, pos, fixedNodes) {
const token = getTokenAtPosition(sourceFile, pos);
if (!isIdentifier(token)) {
return;
}
const declaration = token.parent;
if (declaration.kind === 171 /* PropertyDeclaration */ && (!fixedNodes || tryAddToSet(fixedNodes, declaration))) {
changeTracker.insertModifierBefore(sourceFile, 138 /* DeclareKeyword */, declaration);
}
}
// src/services/codefixes/addMissingInvocationForDecorator.ts
var fixId6 = "addMissingInvocationForDecorator";
var errorCodes6 = [Diagnostics._0_accepts_too_few_arguments_to_be_used_as_a_decorator_here_Did_you_mean_to_call_it_first_and_write_0.code];
registerCodeFix({
errorCodes: errorCodes6,
getCodeActions: function getCodeActionsToAddMissingInvocationForDecorator(context) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => makeChange6(t, context.sourceFile, context.span.start));
return [createCodeFixAction(fixId6, changes, Diagnostics.Call_decorator_expression, fixId6, Diagnostics.Add_to_all_uncalled_decorators)];
},
fixIds: [fixId6],
getAllCodeActions: (context) => codeFixAll(context, errorCodes6, (changes, diag2) => makeChange6(changes, diag2.file, diag2.start))
});
function makeChange6(changeTracker, sourceFile, pos) {
const token = getTokenAtPosition(sourceFile, pos);
const decorator = findAncestor(token, isDecorator);
Debug.assert(!!decorator, "Expected position to be owned by a decorator.");
const replacement = factory.createCallExpression(
decorator.expression,
/*typeArguments*/
void 0,
/*argumentsArray*/
void 0
);
changeTracker.replaceNode(sourceFile, decorator.expression, replacement);
}
// src/services/codefixes/addNameToNamelessParameter.ts
var fixId7 = "addNameToNamelessParameter";
var errorCodes7 = [Diagnostics.Parameter_has_a_name_but_no_type_Did_you_mean_0_Colon_1.code];
registerCodeFix({
errorCodes: errorCodes7,
getCodeActions: function getCodeActionsToAddNameToNamelessParameter(context) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => makeChange7(t, context.sourceFile, context.span.start));
return [createCodeFixAction(fixId7, changes, Diagnostics.Add_parameter_name, fixId7, Diagnostics.Add_names_to_all_parameters_without_names)];
},
fixIds: [fixId7],
getAllCodeActions: (context) => codeFixAll(context, errorCodes7, (changes, diag2) => makeChange7(changes, diag2.file, diag2.start))
});
function makeChange7(changeTracker, sourceFile, pos) {
const token = getTokenAtPosition(sourceFile, pos);
const param = token.parent;
if (!isParameter(param)) {
return Debug.fail("Tried to add a parameter name to a non-parameter: " + Debug.formatSyntaxKind(token.kind));
}
const i = param.parent.parameters.indexOf(param);
Debug.assert(!param.type, "Tried to add a parameter name to a parameter that already had one.");
Debug.assert(i > -1, "Parameter not found in parent parameter list.");
const typeNode = factory.createTypeReferenceNode(
param.name,
/*typeArguments*/
void 0
);
const replacement = factory.createParameterDeclaration(
param.modifiers,
param.dotDotDotToken,
"arg" + i,
param.questionToken,
param.dotDotDotToken ? factory.createArrayTypeNode(typeNode) : typeNode,
param.initializer
);
changeTracker.replaceNode(sourceFile, param, replacement);
}
// src/services/codefixes/addOptionalPropertyUndefined.ts
var addOptionalPropertyUndefined = "addOptionalPropertyUndefined";
var errorCodes8 = [
Diagnostics.Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_type_of_the_target.code,
Diagnostics.Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_types_of_the_target_s_properties.code,
Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_types_of_the_target_s_properties.code
];
registerCodeFix({
errorCodes: errorCodes8,
getCodeActions(context) {
const typeChecker = context.program.getTypeChecker();
const toAdd = getPropertiesToAdd(context.sourceFile, context.span, typeChecker);
if (!toAdd.length) {
return void 0;
}
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => addUndefinedToOptionalProperty(t, toAdd));
return [createCodeFixActionWithoutFixAll(addOptionalPropertyUndefined, changes, Diagnostics.Add_undefined_to_optional_property_type)];
},
fixIds: [addOptionalPropertyUndefined]
});
function getPropertiesToAdd(file, span, checker) {
var _a, _b;
const sourceTarget = getSourceTarget(getFixableErrorSpanExpression(file, span), checker);
if (!sourceTarget) {
return emptyArray;
}
const { source: sourceNode, target: targetNode } = sourceTarget;
const target = shouldUseParentTypeOfProperty(sourceNode, targetNode, checker) ? checker.getTypeAtLocation(targetNode.expression) : checker.getTypeAtLocation(targetNode);
if ((_b = (_a = target.symbol) == null ? void 0 : _a.declarations) == null ? void 0 : _b.some((d) => getSourceFileOfNode(d).fileName.match(/\.d\.ts$/))) {
return emptyArray;
}
return checker.getExactOptionalProperties(target);
}
function shouldUseParentTypeOfProperty(sourceNode, targetNode, checker) {
return isPropertyAccessExpression(targetNode) && !!checker.getExactOptionalProperties(checker.getTypeAtLocation(targetNode.expression)).length && checker.getTypeAtLocation(sourceNode) === checker.getUndefinedType();
}
function getSourceTarget(errorNode, checker) {
var _a;
if (!errorNode) {
return void 0;
} else if (isBinaryExpression(errorNode.parent) && errorNode.parent.operatorToken.kind === 64 /* EqualsToken */) {
return { source: errorNode.parent.right, target: errorNode.parent.left };
} else if (isVariableDeclaration(errorNode.parent) && errorNode.parent.initializer) {
return { source: errorNode.parent.initializer, target: errorNode.parent.name };
} else if (isCallExpression(errorNode.parent)) {
const n = checker.getSymbolAtLocation(errorNode.parent.expression);
if (!(n == null ? void 0 : n.valueDeclaration) || !isFunctionLikeKind(n.valueDeclaration.kind))
return void 0;
if (!isExpression(errorNode))
return void 0;
const i = errorNode.parent.arguments.indexOf(errorNode);
if (i === -1)
return void 0;
const name = n.valueDeclaration.parameters[i].name;
if (isIdentifier(name))
return { source: errorNode, target: name };
} else if (isPropertyAssignment(errorNode.parent) && isIdentifier(errorNode.parent.name) || isShorthandPropertyAssignment(errorNode.parent)) {
const parentTarget = getSourceTarget(errorNode.parent.parent, checker);
if (!parentTarget)
return void 0;
const prop = checker.getPropertyOfType(checker.getTypeAtLocation(parentTarget.target), errorNode.parent.name.text);
const declaration = (_a = prop == null ? void 0 : prop.declarations) == null ? void 0 : _a[0];
if (!declaration)
return void 0;
return {
source: isPropertyAssignment(errorNode.parent) ? errorNode.parent.initializer : errorNode.parent.name,
target: declaration
};
}
return void 0;
}
function addUndefinedToOptionalProperty(changes, toAdd) {
for (const add of toAdd) {
const d = add.valueDeclaration;
if (d && (isPropertySignature(d) || isPropertyDeclaration(d)) && d.type) {
const t = factory.createUnionTypeNode([
...d.type.kind === 191 /* UnionType */ ? d.type.types : [d.type],
factory.createTypeReferenceNode("undefined")
]);
changes.replaceNode(d.getSourceFile(), d.type, t);
}
}
}
// src/services/codefixes/annotateWithTypeFromJSDoc.ts
var fixId8 = "annotateWithTypeFromJSDoc";
var errorCodes9 = [Diagnostics.JSDoc_types_may_be_moved_to_TypeScript_types.code];
registerCodeFix({
errorCodes: errorCodes9,
getCodeActions(context) {
const decl = getDeclaration(context.sourceFile, context.span.start);
if (!decl)
return;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange8(t, context.sourceFile, decl));
return [createCodeFixAction(fixId8, changes, Diagnostics.Annotate_with_type_from_JSDoc, fixId8, Diagnostics.Annotate_everything_with_types_from_JSDoc)];
},
fixIds: [fixId8],
getAllCodeActions: (context) => codeFixAll(context, errorCodes9, (changes, diag2) => {
const decl = getDeclaration(diag2.file, diag2.start);
if (decl)
doChange8(changes, diag2.file, decl);
})
});
function getDeclaration(file, pos) {
const name = getTokenAtPosition(file, pos);
return tryCast(isParameter(name.parent) ? name.parent.parent : name.parent, parameterShouldGetTypeFromJSDoc);
}
function parameterShouldGetTypeFromJSDoc(node) {
return isDeclarationWithType(node) && hasUsableJSDoc(node);
}
function hasUsableJSDoc(decl) {
return isFunctionLikeDeclaration(decl) ? decl.parameters.some(hasUsableJSDoc) || !decl.type && !!getJSDocReturnType(decl) : !decl.type && !!getJSDocType(decl);
}
function doChange8(changes, sourceFile, decl) {
if (isFunctionLikeDeclaration(decl) && (getJSDocReturnType(decl) || decl.parameters.some((p) => !!getJSDocType(p)))) {
if (!decl.typeParameters) {
const typeParameters = getJSDocTypeParameterDeclarations(decl);
if (typeParameters.length)
changes.insertTypeParameters(sourceFile, decl, typeParameters);
}
const needParens = isArrowFunction(decl) && !findChildOfKind(decl, 21 /* OpenParenToken */, sourceFile);
if (needParens)
changes.insertNodeBefore(sourceFile, first(decl.parameters), factory.createToken(21 /* OpenParenToken */));
for (const param of decl.parameters) {
if (!param.type) {
const paramType = getJSDocType(param);
if (paramType)
changes.tryInsertTypeAnnotation(sourceFile, param, visitNode(paramType, transformJSDocType, isTypeNode));
}
}
if (needParens)
changes.insertNodeAfter(sourceFile, last(decl.parameters), factory.createToken(22 /* CloseParenToken */));
if (!decl.type) {
const returnType = getJSDocReturnType(decl);
if (returnType)
changes.tryInsertTypeAnnotation(sourceFile, decl, visitNode(returnType, transformJSDocType, isTypeNode));
}
} else {
const jsdocType = Debug.checkDefined(getJSDocType(decl), "A JSDocType for this declaration should exist");
Debug.assert(!decl.type, "The JSDocType decl should have a type");
changes.tryInsertTypeAnnotation(sourceFile, decl, visitNode(jsdocType, transformJSDocType, isTypeNode));
}
}
function isDeclarationWithType(node) {
return isFunctionLikeDeclaration(node) || node.kind === 259 /* VariableDeclaration */ || node.kind === 170 /* PropertySignature */ || node.kind === 171 /* PropertyDeclaration */;
}
function transformJSDocType(node) {
switch (node.kind) {
case 318 /* JSDocAllType */:
case 319 /* JSDocUnknownType */:
return factory.createTypeReferenceNode("any", emptyArray);
case 322 /* JSDocOptionalType */:
return transformJSDocOptionalType(node);
case 321 /* JSDocNonNullableType */:
return transformJSDocType(node.type);
case 320 /* JSDocNullableType */:
return transformJSDocNullableType(node);
case 324 /* JSDocVariadicType */:
return transformJSDocVariadicType(node);
case 323 /* JSDocFunctionType */:
return transformJSDocFunctionType(node);
case 182 /* TypeReference */:
return transformJSDocTypeReference(node);
case 328 /* JSDocTypeLiteral */:
return transformJSDocTypeLiteral(node);
default:
const visited = visitEachChild(node, transformJSDocType, nullTransformationContext);
setEmitFlags(visited, 1 /* SingleLine */);
return visited;
}
}
function transformJSDocTypeLiteral(node) {
const typeNode = factory.createTypeLiteralNode(map(node.jsDocPropertyTags, (tag) => factory.createPropertySignature(
/*modifiers*/
void 0,
isIdentifier(tag.name) ? tag.name : tag.name.right,
isOptionalJSDocPropertyLikeTag(tag) ? factory.createToken(58 /* QuestionToken */) : void 0,
tag.typeExpression && visitNode(tag.typeExpression.type, transformJSDocType, isTypeNode) || factory.createKeywordTypeNode(133 /* AnyKeyword */)
)));
setEmitFlags(typeNode, 1 /* SingleLine */);
return typeNode;
}
function transformJSDocOptionalType(node) {
return factory.createUnionTypeNode([visitNode(node.type, transformJSDocType, isTypeNode), factory.createTypeReferenceNode("undefined", emptyArray)]);
}
function transformJSDocNullableType(node) {
return factory.createUnionTypeNode([visitNode(node.type, transformJSDocType, isTypeNode), factory.createTypeReferenceNode("null", emptyArray)]);
}
function transformJSDocVariadicType(node) {
return factory.createArrayTypeNode(visitNode(node.type, transformJSDocType, isTypeNode));
}
function transformJSDocFunctionType(node) {
return factory.createFunctionTypeNode(emptyArray, node.parameters.map(transformJSDocParameter), node.type ?? factory.createKeywordTypeNode(133 /* AnyKeyword */));
}
function transformJSDocParameter(node) {
const index = node.parent.parameters.indexOf(node);
const isRest = node.type.kind === 324 /* JSDocVariadicType */ && index === node.parent.parameters.length - 1;
const name = node.name || (isRest ? "rest" : "arg" + index);
const dotdotdot = isRest ? factory.createToken(26 /* DotDotDotToken */) : node.dotDotDotToken;
return factory.createParameterDeclaration(node.modifiers, dotdotdot, name, node.questionToken, visitNode(node.type, transformJSDocType, isTypeNode), node.initializer);
}
function transformJSDocTypeReference(node) {
let name = node.typeName;
let args = node.typeArguments;
if (isIdentifier(node.typeName)) {
if (isJSDocIndexSignature(node)) {
return transformJSDocIndexSignature(node);
}
let text = node.typeName.text;
switch (node.typeName.text) {
case "String":
case "Boolean":
case "Object":
case "Number":
text = text.toLowerCase();
break;
case "array":
case "date":
case "promise":
text = text[0].toUpperCase() + text.slice(1);
break;
}
name = factory.createIdentifier(text);
if ((text === "Array" || text === "Promise") && !node.typeArguments) {
args = factory.createNodeArray([factory.createTypeReferenceNode("any", emptyArray)]);
} else {
args = visitNodes2(node.typeArguments, transformJSDocType, isTypeNode);
}
}
return factory.createTypeReferenceNode(name, args);
}
function transformJSDocIndexSignature(node) {
const index = factory.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
node.typeArguments[0].kind === 150 /* NumberKeyword */ ? "n" : "s",
/*questionToken*/
void 0,
factory.createTypeReferenceNode(node.typeArguments[0].kind === 150 /* NumberKeyword */ ? "number" : "string", []),
/*initializer*/
void 0
);
const indexSignature = factory.createTypeLiteralNode([factory.createIndexSignature(
/*modifiers*/
void 0,
[index],
node.typeArguments[1]
)]);
setEmitFlags(indexSignature, 1 /* SingleLine */);
return indexSignature;
}
// src/services/codefixes/convertFunctionToEs6Class.ts
var fixId9 = "convertFunctionToEs6Class";
var errorCodes10 = [Diagnostics.This_constructor_function_may_be_converted_to_a_class_declaration.code];
registerCodeFix({
errorCodes: errorCodes10,
getCodeActions(context) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange9(t, context.sourceFile, context.span.start, context.program.getTypeChecker(), context.preferences, context.program.getCompilerOptions()));
return [createCodeFixAction(fixId9, changes, Diagnostics.Convert_function_to_an_ES2015_class, fixId9, Diagnostics.Convert_all_constructor_functions_to_classes)];
},
fixIds: [fixId9],
getAllCodeActions: (context) => codeFixAll(context, errorCodes10, (changes, err) => doChange9(changes, err.file, err.start, context.program.getTypeChecker(), context.preferences, context.program.getCompilerOptions()))
});
function doChange9(changes, sourceFile, position, checker, preferences, compilerOptions) {
const ctorSymbol = checker.getSymbolAtLocation(getTokenAtPosition(sourceFile, position));
if (!ctorSymbol || !ctorSymbol.valueDeclaration || !(ctorSymbol.flags & (16 /* Function */ | 3 /* Variable */))) {
return void 0;
}
const ctorDeclaration = ctorSymbol.valueDeclaration;
if (isFunctionDeclaration(ctorDeclaration) || isFunctionExpression(ctorDeclaration)) {
changes.replaceNode(sourceFile, ctorDeclaration, createClassFromFunction(ctorDeclaration));
} else if (isVariableDeclaration(ctorDeclaration)) {
const classDeclaration = createClassFromVariableDeclaration(ctorDeclaration);
if (!classDeclaration) {
return void 0;
}
const ancestor = ctorDeclaration.parent.parent;
if (isVariableDeclarationList(ctorDeclaration.parent) && ctorDeclaration.parent.declarations.length > 1) {
changes.delete(sourceFile, ctorDeclaration);
changes.insertNodeAfter(sourceFile, ancestor, classDeclaration);
} else {
changes.replaceNode(sourceFile, ancestor, classDeclaration);
}
}
function createClassElementsFromSymbol(symbol) {
const memberElements = [];
if (symbol.exports) {
symbol.exports.forEach((member) => {
if (member.name === "prototype" && member.declarations) {
const firstDeclaration = member.declarations[0];
if (member.declarations.length === 1 && isPropertyAccessExpression(firstDeclaration) && isBinaryExpression(firstDeclaration.parent) && firstDeclaration.parent.operatorToken.kind === 64 /* EqualsToken */ && isObjectLiteralExpression(firstDeclaration.parent.right)) {
const prototypes = firstDeclaration.parent.right;
createClassElement(
prototypes.symbol,
/*modifiers*/
void 0,
memberElements
);
}
} else {
createClassElement(member, [factory.createToken(126 /* StaticKeyword */)], memberElements);
}
});
}
if (symbol.members) {
symbol.members.forEach((member, key) => {
var _a, _b, _c, _d;
if (key === "constructor" && member.valueDeclaration) {
const prototypeAssignment = (_d = (_c = (_b = (_a = symbol.exports) == null ? void 0 : _a.get("prototype")) == null ? void 0 : _b.declarations) == null ? void 0 : _c[0]) == null ? void 0 : _d.parent;
if (prototypeAssignment && isBinaryExpression(prototypeAssignment) && isObjectLiteralExpression(prototypeAssignment.right) && some(prototypeAssignment.right.properties, isConstructorAssignment)) {
} else {
changes.delete(sourceFile, member.valueDeclaration.parent);
}
return;
}
createClassElement(
member,
/*modifiers*/
void 0,
memberElements
);
});
}
return memberElements;
function shouldConvertDeclaration(_target, source) {
if (isAccessExpression(_target)) {
if (isPropertyAccessExpression(_target) && isConstructorAssignment(_target))
return true;
return isFunctionLike(source);
} else {
return every(_target.properties, (property) => {
if (isMethodDeclaration(property) || isGetOrSetAccessorDeclaration(property))
return true;
if (isPropertyAssignment(property) && isFunctionExpression(property.initializer) && !!property.name)
return true;
if (isConstructorAssignment(property))
return true;
return false;
});
}
}
function createClassElement(symbol2, modifiers, members) {
if (!(symbol2.flags & 8192 /* Method */) && !(symbol2.flags & 4096 /* ObjectLiteral */)) {
return;
}
const memberDeclaration = symbol2.valueDeclaration;
const assignmentBinaryExpression = memberDeclaration.parent;
const assignmentExpr = assignmentBinaryExpression.right;
if (!shouldConvertDeclaration(memberDeclaration, assignmentExpr)) {
return;
}
if (some(members, (m) => {
const name = getNameOfDeclaration(m);
if (name && isIdentifier(name) && idText(name) === symbolName(symbol2)) {
return true;
}
return false;
})) {
return;
}
const nodeToDelete = assignmentBinaryExpression.parent && assignmentBinaryExpression.parent.kind === 243 /* ExpressionStatement */ ? assignmentBinaryExpression.parent : assignmentBinaryExpression;
changes.delete(sourceFile, nodeToDelete);
if (!assignmentExpr) {
members.push(factory.createPropertyDeclaration(
modifiers,
symbol2.name,
/*questionOrExclamationToken*/
void 0,
/*type*/
void 0,
/*initializer*/
void 0
));
return;
}
if (isAccessExpression(memberDeclaration) && (isFunctionExpression(assignmentExpr) || isArrowFunction(assignmentExpr))) {
const quotePreference = getQuotePreference(sourceFile, preferences);
const name = tryGetPropertyName(memberDeclaration, compilerOptions, quotePreference);
if (name) {
createFunctionLikeExpressionMember(members, assignmentExpr, name);
}
return;
} else if (isObjectLiteralExpression(assignmentExpr)) {
forEach(
assignmentExpr.properties,
(property) => {
if (isMethodDeclaration(property) || isGetOrSetAccessorDeclaration(property)) {
members.push(property);
}
if (isPropertyAssignment(property) && isFunctionExpression(property.initializer)) {
createFunctionLikeExpressionMember(members, property.initializer, property.name);
}
if (isConstructorAssignment(property))
return;
return;
}
);
return;
} else {
if (isSourceFileJS(sourceFile))
return;
if (!isPropertyAccessExpression(memberDeclaration))
return;
const prop = factory.createPropertyDeclaration(
modifiers,
memberDeclaration.name,
/*questionOrExclamationToken*/
void 0,
/*type*/
void 0,
assignmentExpr
);
copyLeadingComments(assignmentBinaryExpression.parent, prop, sourceFile);
members.push(prop);
return;
}
function createFunctionLikeExpressionMember(members2, expression, name) {
if (isFunctionExpression(expression))
return createFunctionExpressionMember(members2, expression, name);
else
return createArrowFunctionExpressionMember(members2, expression, name);
}
function createFunctionExpressionMember(members2, functionExpression, name) {
const fullModifiers = concatenate(modifiers, getModifierKindFromSource(functionExpression, 134 /* AsyncKeyword */));
const method = factory.createMethodDeclaration(
fullModifiers,
/*asteriskToken*/
void 0,
name,
/*questionToken*/
void 0,
/*typeParameters*/
void 0,
functionExpression.parameters,
/*type*/
void 0,
functionExpression.body
);
copyLeadingComments(assignmentBinaryExpression, method, sourceFile);
members2.push(method);
return;
}
function createArrowFunctionExpressionMember(members2, arrowFunction, name) {
const arrowFunctionBody = arrowFunction.body;
let bodyBlock;
if (arrowFunctionBody.kind === 240 /* Block */) {
bodyBlock = arrowFunctionBody;
} else {
bodyBlock = factory.createBlock([factory.createReturnStatement(arrowFunctionBody)]);
}
const fullModifiers = concatenate(modifiers, getModifierKindFromSource(arrowFunction, 134 /* AsyncKeyword */));
const method = factory.createMethodDeclaration(
fullModifiers,
/*asteriskToken*/
void 0,
name,
/*questionToken*/
void 0,
/*typeParameters*/
void 0,
arrowFunction.parameters,
/*type*/
void 0,
bodyBlock
);
copyLeadingComments(assignmentBinaryExpression, method, sourceFile);
members2.push(method);
}
}
}
function createClassFromVariableDeclaration(node) {
const initializer = node.initializer;
if (!initializer || !isFunctionExpression(initializer) || !isIdentifier(node.name)) {
return void 0;
}
const memberElements = createClassElementsFromSymbol(node.symbol);
if (initializer.body) {
memberElements.unshift(factory.createConstructorDeclaration(
/*modifiers*/
void 0,
initializer.parameters,
initializer.body
));
}
const modifiers = getModifierKindFromSource(node.parent.parent, 95 /* ExportKeyword */);
const cls = factory.createClassDeclaration(
modifiers,
node.name,
/*typeParameters*/
void 0,
/*heritageClauses*/
void 0,
memberElements
);
return cls;
}
function createClassFromFunction(node) {
const memberElements = createClassElementsFromSymbol(ctorSymbol);
if (node.body) {
memberElements.unshift(factory.createConstructorDeclaration(
/*modifiers*/
void 0,
node.parameters,
node.body
));
}
const modifiers = getModifierKindFromSource(node, 95 /* ExportKeyword */);
const cls = factory.createClassDeclaration(
modifiers,
node.name,
/*typeParameters*/
void 0,
/*heritageClauses*/
void 0,
memberElements
);
return cls;
}
}
function getModifierKindFromSource(source, kind) {
return canHaveModifiers(source) ? filter(source.modifiers, (modifier) => modifier.kind === kind) : void 0;
}
function isConstructorAssignment(x) {
if (!x.name)
return false;
if (isIdentifier(x.name) && x.name.text === "constructor")
return true;
return false;
}
function tryGetPropertyName(node, compilerOptions, quotePreference) {
if (isPropertyAccessExpression(node)) {
return node.name;
}
const propName = node.argumentExpression;
if (isNumericLiteral(propName)) {
return propName;
}
if (isStringLiteralLike(propName)) {
return isIdentifierText(propName.text, getEmitScriptTarget(compilerOptions)) ? factory.createIdentifier(propName.text) : isNoSubstitutionTemplateLiteral(propName) ? factory.createStringLiteral(propName.text, quotePreference === 0 /* Single */) : propName;
}
return void 0;
}
// src/services/codefixes/convertToAsyncFunction.ts
var fixId10 = "convertToAsyncFunction";
var errorCodes11 = [Diagnostics.This_may_be_converted_to_an_async_function.code];
var codeActionSucceeded = true;
registerCodeFix({
errorCodes: errorCodes11,
getCodeActions(context) {
codeActionSucceeded = true;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => convertToAsyncFunction(t, context.sourceFile, context.span.start, context.program.getTypeChecker()));
return codeActionSucceeded ? [createCodeFixAction(fixId10, changes, Diagnostics.Convert_to_async_function, fixId10, Diagnostics.Convert_all_to_async_functions)] : [];
},
fixIds: [fixId10],
getAllCodeActions: (context) => codeFixAll(context, errorCodes11, (changes, err) => convertToAsyncFunction(changes, err.file, err.start, context.program.getTypeChecker()))
});
function convertToAsyncFunction(changes, sourceFile, position, checker) {
const tokenAtPosition = getTokenAtPosition(sourceFile, position);
let functionToConvert;
if (isIdentifier(tokenAtPosition) && isVariableDeclaration(tokenAtPosition.parent) && tokenAtPosition.parent.initializer && isFunctionLikeDeclaration(tokenAtPosition.parent.initializer)) {
functionToConvert = tokenAtPosition.parent.initializer;
} else {
functionToConvert = tryCast(getContainingFunction(getTokenAtPosition(sourceFile, position)), canBeConvertedToAsync);
}
if (!functionToConvert) {
return;
}
const synthNamesMap = /* @__PURE__ */ new Map();
const isInJavascript = isInJSFile(functionToConvert);
const setOfExpressionsToReturn = getAllPromiseExpressionsToReturn(functionToConvert, checker);
const functionToConvertRenamed = renameCollidingVarNames(functionToConvert, checker, synthNamesMap);
if (!returnsPromise(functionToConvertRenamed, checker)) {
return;
}
const returnStatements = functionToConvertRenamed.body && isBlock(functionToConvertRenamed.body) ? getReturnStatementsWithPromiseHandlers(functionToConvertRenamed.body, checker) : emptyArray;
const transformer = { checker, synthNamesMap, setOfExpressionsToReturn, isInJSFile: isInJavascript };
if (!returnStatements.length) {
return;
}
const pos = skipTrivia(sourceFile.text, moveRangePastModifiers(functionToConvert).pos);
changes.insertModifierAt(sourceFile, pos, 134 /* AsyncKeyword */, { suffix: " " });
for (const returnStatement of returnStatements) {
forEachChild(returnStatement, function visit(node) {
if (isCallExpression(node)) {
const newNodes = transformExpression(
node,
node,
transformer,
/*hasContinuation*/
false
);
if (hasFailed()) {
return true;
}
changes.replaceNodeWithNodes(sourceFile, returnStatement, newNodes);
} else if (!isFunctionLike(node)) {
forEachChild(node, visit);
if (hasFailed()) {
return true;
}
}
});
if (hasFailed()) {
return;
}
}
}
function getReturnStatementsWithPromiseHandlers(body, checker) {
const res = [];
forEachReturnStatement(body, (ret) => {
if (isReturnStatementWithFixablePromiseHandler(ret, checker))
res.push(ret);
});
return res;
}
function getAllPromiseExpressionsToReturn(func, checker) {
if (!func.body) {
return /* @__PURE__ */ new Set();
}
const setOfExpressionsToReturn = /* @__PURE__ */ new Set();
forEachChild(func.body, function visit(node) {
if (isPromiseReturningCallExpression(node, checker, "then")) {
setOfExpressionsToReturn.add(getNodeId(node));
forEach(node.arguments, visit);
} else if (isPromiseReturningCallExpression(node, checker, "catch") || isPromiseReturningCallExpression(node, checker, "finally")) {
setOfExpressionsToReturn.add(getNodeId(node));
forEachChild(node, visit);
} else if (isPromiseTypedExpression(node, checker)) {
setOfExpressionsToReturn.add(getNodeId(node));
} else {
forEachChild(node, visit);
}
});
return setOfExpressionsToReturn;
}
function isPromiseReturningCallExpression(node, checker, name) {
if (!isCallExpression(node))
return false;
const isExpressionOfName = hasPropertyAccessExpressionWithName(node, name);
const nodeType = isExpressionOfName && checker.getTypeAtLocation(node);
return !!(nodeType && checker.getPromisedTypeOfPromise(nodeType));
}
function isReferenceToType(type, target) {
return (getObjectFlags(type) & 4 /* Reference */) !== 0 && type.target === target;
}
function getExplicitPromisedTypeOfPromiseReturningCallExpression(node, callback, checker) {
if (node.expression.name.escapedText === "finally") {
return void 0;
}
const promiseType = checker.getTypeAtLocation(node.expression.expression);
if (isReferenceToType(promiseType, checker.getPromiseType()) || isReferenceToType(promiseType, checker.getPromiseLikeType())) {
if (node.expression.name.escapedText === "then") {
if (callback === elementAt(node.arguments, 0)) {
return elementAt(node.typeArguments, 0);
} else if (callback === elementAt(node.arguments, 1)) {
return elementAt(node.typeArguments, 1);
}
} else {
return elementAt(node.typeArguments, 0);
}
}
}
function isPromiseTypedExpression(node, checker) {
if (!isExpression(node))
return false;
return !!checker.getPromisedTypeOfPromise(checker.getTypeAtLocation(node));
}
function renameCollidingVarNames(nodeToRename, checker, synthNamesMap) {
const identsToRenameMap = /* @__PURE__ */ new Map();
const collidingSymbolMap = createMultiMap();
forEachChild(nodeToRename, function visit(node) {
if (!isIdentifier(node)) {
forEachChild(node, visit);
return;
}
const symbol = checker.getSymbolAtLocation(node);
if (symbol) {
const type = checker.getTypeAtLocation(node);
const lastCallSignature = getLastCallSignature(type, checker);
const symbolIdString = getSymbolId(symbol).toString();
if (lastCallSignature && !isParameter(node.parent) && !isFunctionLikeDeclaration(node.parent) && !synthNamesMap.has(symbolIdString)) {
const firstParameter = firstOrUndefined(lastCallSignature.parameters);
const ident = (firstParameter == null ? void 0 : firstParameter.valueDeclaration) && isParameter(firstParameter.valueDeclaration) && tryCast(firstParameter.valueDeclaration.name, isIdentifier) || factory.createUniqueName("result", 16 /* Optimistic */);
const synthName = getNewNameIfConflict(ident, collidingSymbolMap);
synthNamesMap.set(symbolIdString, synthName);
collidingSymbolMap.add(ident.text, symbol);
} else if (node.parent && (isParameter(node.parent) || isVariableDeclaration(node.parent) || isBindingElement(node.parent))) {
const originalName = node.text;
const collidingSymbols = collidingSymbolMap.get(originalName);
if (collidingSymbols && collidingSymbols.some((prevSymbol) => prevSymbol !== symbol)) {
const newName = getNewNameIfConflict(node, collidingSymbolMap);
identsToRenameMap.set(symbolIdString, newName.identifier);
synthNamesMap.set(symbolIdString, newName);
collidingSymbolMap.add(originalName, symbol);
} else {
const identifier = getSynthesizedDeepClone(node);
synthNamesMap.set(symbolIdString, createSynthIdentifier(identifier));
collidingSymbolMap.add(originalName, symbol);
}
}
}
});
return getSynthesizedDeepCloneWithReplacements(
nodeToRename,
/*includeTrivia*/
true,
(original) => {
if (isBindingElement(original) && isIdentifier(original.name) && isObjectBindingPattern(original.parent)) {
const symbol = checker.getSymbolAtLocation(original.name);
const renameInfo = symbol && identsToRenameMap.get(String(getSymbolId(symbol)));
if (renameInfo && renameInfo.text !== (original.name || original.propertyName).getText()) {
return factory.createBindingElement(
original.dotDotDotToken,
original.propertyName || original.name,
renameInfo,
original.initializer
);
}
} else if (isIdentifier(original)) {
const symbol = checker.getSymbolAtLocation(original);
const renameInfo = symbol && identsToRenameMap.get(String(getSymbolId(symbol)));
if (renameInfo) {
return factory.createIdentifier(renameInfo.text);
}
}
}
);
}
function getNewNameIfConflict(name, originalNames) {
const numVarsSameName = (originalNames.get(name.text) || emptyArray).length;
const identifier = numVarsSameName === 0 ? name : factory.createIdentifier(name.text + "_" + numVarsSameName);
return createSynthIdentifier(identifier);
}
function hasFailed() {
return !codeActionSucceeded;
}
function silentFail() {
codeActionSucceeded = false;
return emptyArray;
}
function transformExpression(returnContextNode, node, transformer, hasContinuation, continuationArgName) {
if (isPromiseReturningCallExpression(node, transformer.checker, "then")) {
return transformThen(node, elementAt(node.arguments, 0), elementAt(node.arguments, 1), transformer, hasContinuation, continuationArgName);
}
if (isPromiseReturningCallExpression(node, transformer.checker, "catch")) {
return transformCatch(node, elementAt(node.arguments, 0), transformer, hasContinuation, continuationArgName);
}
if (isPromiseReturningCallExpression(node, transformer.checker, "finally")) {
return transformFinally(node, elementAt(node.arguments, 0), transformer, hasContinuation, continuationArgName);
}
if (isPropertyAccessExpression(node)) {
return transformExpression(returnContextNode, node.expression, transformer, hasContinuation, continuationArgName);
}
const nodeType = transformer.checker.getTypeAtLocation(node);
if (nodeType && transformer.checker.getPromisedTypeOfPromise(nodeType)) {
Debug.assertNode(getOriginalNode(node).parent, isPropertyAccessExpression);
return transformPromiseExpressionOfPropertyAccess(returnContextNode, node, transformer, hasContinuation, continuationArgName);
}
return silentFail();
}
function isNullOrUndefined2({ checker }, node) {
if (node.kind === 106 /* NullKeyword */)
return true;
if (isIdentifier(node) && !isGeneratedIdentifier(node) && idText(node) === "undefined") {
const symbol = checker.getSymbolAtLocation(node);
return !symbol || checker.isUndefinedSymbol(symbol);
}
return false;
}
function createUniqueSynthName(prevArgName) {
const renamedPrevArg = factory.createUniqueName(prevArgName.identifier.text, 16 /* Optimistic */);
return createSynthIdentifier(renamedPrevArg);
}
function getPossibleNameForVarDecl(node, transformer, continuationArgName) {
let possibleNameForVarDecl;
if (continuationArgName && !shouldReturn(node, transformer)) {
if (isSynthIdentifier(continuationArgName)) {
possibleNameForVarDecl = continuationArgName;
transformer.synthNamesMap.forEach((val, key) => {
if (val.identifier.text === continuationArgName.identifier.text) {
const newSynthName = createUniqueSynthName(continuationArgName);
transformer.synthNamesMap.set(key, newSynthName);
}
});
} else {
possibleNameForVarDecl = createSynthIdentifier(factory.createUniqueName("result", 16 /* Optimistic */), continuationArgName.types);
}
declareSynthIdentifier(possibleNameForVarDecl);
}
return possibleNameForVarDecl;
}
function finishCatchOrFinallyTransform(node, transformer, tryStatement, possibleNameForVarDecl, continuationArgName) {
const statements = [];
let varDeclIdentifier;
if (possibleNameForVarDecl && !shouldReturn(node, transformer)) {
varDeclIdentifier = getSynthesizedDeepClone(declareSynthIdentifier(possibleNameForVarDecl));
const typeArray = possibleNameForVarDecl.types;
const unionType = transformer.checker.getUnionType(typeArray, 2 /* Subtype */);
const unionTypeNode = transformer.isInJSFile ? void 0 : transformer.checker.typeToTypeNode(
unionType,
/*enclosingDeclaration*/
void 0,
/*flags*/
void 0
);
const varDecl = [factory.createVariableDeclaration(
varDeclIdentifier,
/*exclamationToken*/
void 0,
unionTypeNode
)];
const varDeclList = factory.createVariableStatement(
/*modifiers*/
void 0,
factory.createVariableDeclarationList(varDecl, 1 /* Let */)
);
statements.push(varDeclList);
}
statements.push(tryStatement);
if (continuationArgName && varDeclIdentifier && isSynthBindingPattern(continuationArgName)) {
statements.push(factory.createVariableStatement(
/*modifiers*/
void 0,
factory.createVariableDeclarationList(
[
factory.createVariableDeclaration(
getSynthesizedDeepClone(declareSynthBindingPattern(continuationArgName)),
/*exclamationToken*/
void 0,
/*type*/
void 0,
varDeclIdentifier
)
],
2 /* Const */
)
));
}
return statements;
}
function transformFinally(node, onFinally, transformer, hasContinuation, continuationArgName) {
if (!onFinally || isNullOrUndefined2(transformer, onFinally)) {
return transformExpression(
/* returnContextNode */
node,
node.expression.expression,
transformer,
hasContinuation,
continuationArgName
);
}
const possibleNameForVarDecl = getPossibleNameForVarDecl(node, transformer, continuationArgName);
const inlinedLeftHandSide = transformExpression(
/*returnContextNode*/
node,
node.expression.expression,
transformer,
/*hasContinuation*/
true,
possibleNameForVarDecl
);
if (hasFailed())
return silentFail();
const inlinedCallback = transformCallbackArgument(
onFinally,
hasContinuation,
/*continuationArgName*/
void 0,
/*inputArgName*/
void 0,
node,
transformer
);
if (hasFailed())
return silentFail();
const tryBlock = factory.createBlock(inlinedLeftHandSide);
const finallyBlock = factory.createBlock(inlinedCallback);
const tryStatement = factory.createTryStatement(
tryBlock,
/*catchClause*/
void 0,
finallyBlock
);
return finishCatchOrFinallyTransform(node, transformer, tryStatement, possibleNameForVarDecl, continuationArgName);
}
function transformCatch(node, onRejected, transformer, hasContinuation, continuationArgName) {
if (!onRejected || isNullOrUndefined2(transformer, onRejected)) {
return transformExpression(
/* returnContextNode */
node,
node.expression.expression,
transformer,
hasContinuation,
continuationArgName
);
}
const inputArgName = getArgBindingName(onRejected, transformer);
const possibleNameForVarDecl = getPossibleNameForVarDecl(node, transformer, continuationArgName);
const inlinedLeftHandSide = transformExpression(
/*returnContextNode*/
node,
node.expression.expression,
transformer,
/*hasContinuation*/
true,
possibleNameForVarDecl
);
if (hasFailed())
return silentFail();
const inlinedCallback = transformCallbackArgument(onRejected, hasContinuation, possibleNameForVarDecl, inputArgName, node, transformer);
if (hasFailed())
return silentFail();
const tryBlock = factory.createBlock(inlinedLeftHandSide);
const catchClause = factory.createCatchClause(inputArgName && getSynthesizedDeepClone(declareSynthBindingName(inputArgName)), factory.createBlock(inlinedCallback));
const tryStatement = factory.createTryStatement(
tryBlock,
catchClause,
/*finallyBlock*/
void 0
);
return finishCatchOrFinallyTransform(node, transformer, tryStatement, possibleNameForVarDecl, continuationArgName);
}
function transformThen(node, onFulfilled, onRejected, transformer, hasContinuation, continuationArgName) {
if (!onFulfilled || isNullOrUndefined2(transformer, onFulfilled)) {
return transformCatch(node, onRejected, transformer, hasContinuation, continuationArgName);
}
if (onRejected && !isNullOrUndefined2(transformer, onRejected)) {
return silentFail();
}
const inputArgName = getArgBindingName(onFulfilled, transformer);
const inlinedLeftHandSide = transformExpression(
node.expression.expression,
node.expression.expression,
transformer,
/*hasContinuation*/
true,
inputArgName
);
if (hasFailed())
return silentFail();
const inlinedCallback = transformCallbackArgument(onFulfilled, hasContinuation, continuationArgName, inputArgName, node, transformer);
if (hasFailed())
return silentFail();
return concatenate(inlinedLeftHandSide, inlinedCallback);
}
function transformPromiseExpressionOfPropertyAccess(returnContextNode, node, transformer, hasContinuation, continuationArgName) {
if (shouldReturn(returnContextNode, transformer)) {
let returnValue = getSynthesizedDeepClone(node);
if (hasContinuation) {
returnValue = factory.createAwaitExpression(returnValue);
}
return [factory.createReturnStatement(returnValue)];
}
return createVariableOrAssignmentOrExpressionStatement(
continuationArgName,
factory.createAwaitExpression(node),
/*typeAnnotation*/
void 0
);
}
function createVariableOrAssignmentOrExpressionStatement(variableName, rightHandSide, typeAnnotation) {
if (!variableName || isEmptyBindingName(variableName)) {
return [factory.createExpressionStatement(rightHandSide)];
}
if (isSynthIdentifier(variableName) && variableName.hasBeenDeclared) {
return [factory.createExpressionStatement(factory.createAssignment(getSynthesizedDeepClone(referenceSynthIdentifier(variableName)), rightHandSide))];
}
return [
factory.createVariableStatement(
/*modifiers*/
void 0,
factory.createVariableDeclarationList(
[
factory.createVariableDeclaration(
getSynthesizedDeepClone(declareSynthBindingName(variableName)),
/*exclamationToken*/
void 0,
typeAnnotation,
rightHandSide
)
],
2 /* Const */
)
)
];
}
function maybeAnnotateAndReturn(expressionToReturn, typeAnnotation) {
if (typeAnnotation && expressionToReturn) {
const name = factory.createUniqueName("result", 16 /* Optimistic */);
return [
...createVariableOrAssignmentOrExpressionStatement(createSynthIdentifier(name), expressionToReturn, typeAnnotation),
factory.createReturnStatement(name)
];
}
return [factory.createReturnStatement(expressionToReturn)];
}
function transformCallbackArgument(func, hasContinuation, continuationArgName, inputArgName, parent2, transformer) {
var _a;
switch (func.kind) {
case 106 /* NullKeyword */:
break;
case 210 /* PropertyAccessExpression */:
case 80 /* Identifier */:
if (!inputArgName) {
break;
}
const synthCall = factory.createCallExpression(
getSynthesizedDeepClone(func),
/*typeArguments*/
void 0,
isSynthIdentifier(inputArgName) ? [referenceSynthIdentifier(inputArgName)] : []
);
if (shouldReturn(parent2, transformer)) {
return maybeAnnotateAndReturn(synthCall, getExplicitPromisedTypeOfPromiseReturningCallExpression(parent2, func, transformer.checker));
}
const type = transformer.checker.getTypeAtLocation(func);
const callSignatures = transformer.checker.getSignaturesOfType(type, 0 /* Call */);
if (!callSignatures.length) {
return silentFail();
}
const returnType = callSignatures[0].getReturnType();
const varDeclOrAssignment = createVariableOrAssignmentOrExpressionStatement(continuationArgName, factory.createAwaitExpression(synthCall), getExplicitPromisedTypeOfPromiseReturningCallExpression(parent2, func, transformer.checker));
if (continuationArgName) {
continuationArgName.types.push(transformer.checker.getAwaitedType(returnType) || returnType);
}
return varDeclOrAssignment;
case 217 /* FunctionExpression */:
case 218 /* ArrowFunction */: {
const funcBody = func.body;
const returnType2 = (_a = getLastCallSignature(transformer.checker.getTypeAtLocation(func), transformer.checker)) == null ? void 0 : _a.getReturnType();
if (isBlock(funcBody)) {
let refactoredStmts = [];
let seenReturnStatement = false;
for (const statement of funcBody.statements) {
if (isReturnStatement(statement)) {
seenReturnStatement = true;
if (isReturnStatementWithFixablePromiseHandler(statement, transformer.checker)) {
refactoredStmts = refactoredStmts.concat(transformReturnStatementWithFixablePromiseHandler(transformer, statement, hasContinuation, continuationArgName));
} else {
const possiblyAwaitedRightHandSide = returnType2 && statement.expression ? getPossiblyAwaitedRightHandSide(transformer.checker, returnType2, statement.expression) : statement.expression;
refactoredStmts.push(...maybeAnnotateAndReturn(possiblyAwaitedRightHandSide, getExplicitPromisedTypeOfPromiseReturningCallExpression(parent2, func, transformer.checker)));
}
} else if (hasContinuation && forEachReturnStatement(statement, returnTrue)) {
return silentFail();
} else {
refactoredStmts.push(statement);
}
}
return shouldReturn(parent2, transformer) ? refactoredStmts.map((s) => getSynthesizedDeepClone(s)) : removeReturns(
refactoredStmts,
continuationArgName,
transformer,
seenReturnStatement
);
} else {
const inlinedStatements = isFixablePromiseHandler(funcBody, transformer.checker) ? transformReturnStatementWithFixablePromiseHandler(transformer, factory.createReturnStatement(funcBody), hasContinuation, continuationArgName) : emptyArray;
if (inlinedStatements.length > 0) {
return inlinedStatements;
}
if (returnType2) {
const possiblyAwaitedRightHandSide = getPossiblyAwaitedRightHandSide(transformer.checker, returnType2, funcBody);
if (!shouldReturn(parent2, transformer)) {
const transformedStatement = createVariableOrAssignmentOrExpressionStatement(
continuationArgName,
possiblyAwaitedRightHandSide,
/*typeAnnotation*/
void 0
);
if (continuationArgName) {
continuationArgName.types.push(transformer.checker.getAwaitedType(returnType2) || returnType2);
}
return transformedStatement;
} else {
return maybeAnnotateAndReturn(possiblyAwaitedRightHandSide, getExplicitPromisedTypeOfPromiseReturningCallExpression(parent2, func, transformer.checker));
}
} else {
return silentFail();
}
}
}
default:
return silentFail();
}
return emptyArray;
}
function getPossiblyAwaitedRightHandSide(checker, type, expr) {
const rightHandSide = getSynthesizedDeepClone(expr);
return !!checker.getPromisedTypeOfPromise(type) ? factory.createAwaitExpression(rightHandSide) : rightHandSide;
}
function getLastCallSignature(type, checker) {
const callSignatures = checker.getSignaturesOfType(type, 0 /* Call */);
return lastOrUndefined(callSignatures);
}
function removeReturns(stmts, prevArgName, transformer, seenReturnStatement) {
const ret = [];
for (const stmt of stmts) {
if (isReturnStatement(stmt)) {
if (stmt.expression) {
const possiblyAwaitedExpression = isPromiseTypedExpression(stmt.expression, transformer.checker) ? factory.createAwaitExpression(stmt.expression) : stmt.expression;
if (prevArgName === void 0) {
ret.push(factory.createExpressionStatement(possiblyAwaitedExpression));
} else if (isSynthIdentifier(prevArgName) && prevArgName.hasBeenDeclared) {
ret.push(factory.createExpressionStatement(factory.createAssignment(referenceSynthIdentifier(prevArgName), possiblyAwaitedExpression)));
} else {
ret.push(factory.createVariableStatement(
/*modifiers*/
void 0,
factory.createVariableDeclarationList([factory.createVariableDeclaration(
declareSynthBindingName(prevArgName),
/*exclamationToken*/
void 0,
/*type*/
void 0,
possiblyAwaitedExpression
)], 2 /* Const */)
));
}
}
} else {
ret.push(getSynthesizedDeepClone(stmt));
}
}
if (!seenReturnStatement && prevArgName !== void 0) {
ret.push(factory.createVariableStatement(
/*modifiers*/
void 0,
factory.createVariableDeclarationList([factory.createVariableDeclaration(
declareSynthBindingName(prevArgName),
/*exclamationToken*/
void 0,
/*type*/
void 0,
factory.createIdentifier("undefined")
)], 2 /* Const */)
));
}
return ret;
}
function transformReturnStatementWithFixablePromiseHandler(transformer, innerRetStmt, hasContinuation, continuationArgName) {
let innerCbBody = [];
forEachChild(innerRetStmt, function visit(node) {
if (isCallExpression(node)) {
const temp = transformExpression(node, node, transformer, hasContinuation, continuationArgName);
innerCbBody = innerCbBody.concat(temp);
if (innerCbBody.length > 0) {
return;
}
} else if (!isFunctionLike(node)) {
forEachChild(node, visit);
}
});
return innerCbBody;
}
function getArgBindingName(funcNode, transformer) {
const types = [];
let name;
if (isFunctionLikeDeclaration(funcNode)) {
if (funcNode.parameters.length > 0) {
const param = funcNode.parameters[0].name;
name = getMappedBindingNameOrDefault(param);
}
} else if (isIdentifier(funcNode)) {
name = getMapEntryOrDefault(funcNode);
} else if (isPropertyAccessExpression(funcNode) && isIdentifier(funcNode.name)) {
name = getMapEntryOrDefault(funcNode.name);
}
if (!name || "identifier" in name && name.identifier.text === "undefined") {
return void 0;
}
return name;
function getMappedBindingNameOrDefault(bindingName) {
if (isIdentifier(bindingName))
return getMapEntryOrDefault(bindingName);
const elements = flatMap(bindingName.elements, (element) => {
if (isOmittedExpression(element))
return [];
return [getMappedBindingNameOrDefault(element.name)];
});
return createSynthBindingPattern(bindingName, elements);
}
function getMapEntryOrDefault(identifier) {
const originalNode = getOriginalNode2(identifier);
const symbol = getSymbol2(originalNode);
if (!symbol) {
return createSynthIdentifier(identifier, types);
}
const mapEntry = transformer.synthNamesMap.get(getSymbolId(symbol).toString());
return mapEntry || createSynthIdentifier(identifier, types);
}
function getSymbol2(node) {
var _a;
return ((_a = tryCast(node, canHaveSymbol)) == null ? void 0 : _a.symbol) ?? transformer.checker.getSymbolAtLocation(node);
}
function getOriginalNode2(node) {
return node.original ? node.original : node;
}
}
function isEmptyBindingName(bindingName) {
if (!bindingName) {
return true;
}
if (isSynthIdentifier(bindingName)) {
return !bindingName.identifier.text;
}
return every(bindingName.elements, isEmptyBindingName);
}
function createSynthIdentifier(identifier, types = []) {
return { kind: 0 /* Identifier */, identifier, types, hasBeenDeclared: false, hasBeenReferenced: false };
}
function createSynthBindingPattern(bindingPattern, elements = emptyArray, types = []) {
return { kind: 1 /* BindingPattern */, bindingPattern, elements, types };
}
function referenceSynthIdentifier(synthId) {
synthId.hasBeenReferenced = true;
return synthId.identifier;
}
function declareSynthBindingName(synthName) {
return isSynthIdentifier(synthName) ? declareSynthIdentifier(synthName) : declareSynthBindingPattern(synthName);
}
function declareSynthBindingPattern(synthPattern) {
for (const element of synthPattern.elements) {
declareSynthBindingName(element);
}
return synthPattern.bindingPattern;
}
function declareSynthIdentifier(synthId) {
synthId.hasBeenDeclared = true;
return synthId.identifier;
}
function isSynthIdentifier(bindingName) {
return bindingName.kind === 0 /* Identifier */;
}
function isSynthBindingPattern(bindingName) {
return bindingName.kind === 1 /* BindingPattern */;
}
function shouldReturn(expression, transformer) {
return !!expression.original && transformer.setOfExpressionsToReturn.has(getNodeId(expression.original));
}
// src/services/codefixes/convertToEsModule.ts
registerCodeFix({
errorCodes: [Diagnostics.File_is_a_CommonJS_module_it_may_be_converted_to_an_ES_module.code],
getCodeActions(context) {
const { sourceFile, program, preferences } = context;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (changes2) => {
const moduleExportsChangedToDefault = convertFileToEsModule(sourceFile, program.getTypeChecker(), changes2, getEmitScriptTarget(program.getCompilerOptions()), getQuotePreference(sourceFile, preferences));
if (moduleExportsChangedToDefault) {
for (const importingFile of program.getSourceFiles()) {
fixImportOfModuleExports(importingFile, sourceFile, changes2, getQuotePreference(importingFile, preferences));
}
}
});
return [createCodeFixActionWithoutFixAll("convertToEsModule", changes, Diagnostics.Convert_to_ES_module)];
}
});
function fixImportOfModuleExports(importingFile, exportingFile, changes, quotePreference) {
for (const moduleSpecifier of importingFile.imports) {
const imported = getResolvedModule(importingFile, moduleSpecifier.text, getModeForUsageLocation(importingFile, moduleSpecifier));
if (!imported || imported.resolvedFileName !== exportingFile.fileName) {
continue;
}
const importNode = importFromModuleSpecifier(moduleSpecifier);
switch (importNode.kind) {
case 270 /* ImportEqualsDeclaration */:
changes.replaceNode(importingFile, importNode, makeImport(
importNode.name,
/*namedImports*/
void 0,
moduleSpecifier,
quotePreference
));
break;
case 212 /* CallExpression */:
if (isRequireCall(
importNode,
/*requireStringLiteralLikeArgument*/
false
)) {
changes.replaceNode(importingFile, importNode, factory.createPropertyAccessExpression(getSynthesizedDeepClone(importNode), "default"));
}
break;
}
}
}
function convertFileToEsModule(sourceFile, checker, changes, target, quotePreference) {
const identifiers = { original: collectFreeIdentifiers(sourceFile), additional: /* @__PURE__ */ new Set() };
const exports = collectExportRenames(sourceFile, checker, identifiers);
convertExportsAccesses(sourceFile, exports, changes);
let moduleExportsChangedToDefault = false;
let useSitesToUnqualify;
for (const statement of filter(sourceFile.statements, isVariableStatement)) {
const newUseSites = convertVariableStatement(sourceFile, statement, changes, checker, identifiers, target, quotePreference);
if (newUseSites) {
copyEntries(newUseSites, useSitesToUnqualify ?? (useSitesToUnqualify = /* @__PURE__ */ new Map()));
}
}
for (const statement of filter(sourceFile.statements, (s) => !isVariableStatement(s))) {
const moduleExportsChanged = convertStatement(sourceFile, statement, checker, changes, identifiers, target, exports, useSitesToUnqualify, quotePreference);
moduleExportsChangedToDefault = moduleExportsChangedToDefault || moduleExportsChanged;
}
useSitesToUnqualify == null ? void 0 : useSitesToUnqualify.forEach((replacement, original) => {
changes.replaceNode(sourceFile, original, replacement);
});
return moduleExportsChangedToDefault;
}
function collectExportRenames(sourceFile, checker, identifiers) {
const res = /* @__PURE__ */ new Map();
forEachExportReference(sourceFile, (node) => {
const { text } = node.name;
if (!res.has(text) && (isIdentifierANonContextualKeyword(node.name) || checker.resolveName(
text,
node,
111551 /* Value */,
/*excludeGlobals*/
true
))) {
res.set(text, makeUniqueName(`_${text}`, identifiers));
}
});
return res;
}
function convertExportsAccesses(sourceFile, exports, changes) {
forEachExportReference(sourceFile, (node, isAssignmentLhs) => {
if (isAssignmentLhs) {
return;
}
const { text } = node.name;
changes.replaceNode(sourceFile, node, factory.createIdentifier(exports.get(text) || text));
});
}
function forEachExportReference(sourceFile, cb) {
sourceFile.forEachChild(function recur(node) {
if (isPropertyAccessExpression(node) && isExportsOrModuleExportsOrAlias(sourceFile, node.expression) && isIdentifier(node.name)) {
const { parent: parent2 } = node;
cb(node, isBinaryExpression(parent2) && parent2.left === node && parent2.operatorToken.kind === 64 /* EqualsToken */);
}
node.forEachChild(recur);
});
}
function convertStatement(sourceFile, statement, checker, changes, identifiers, target, exports, useSitesToUnqualify, quotePreference) {
switch (statement.kind) {
case 242 /* VariableStatement */:
convertVariableStatement(sourceFile, statement, changes, checker, identifiers, target, quotePreference);
return false;
case 243 /* ExpressionStatement */: {
const { expression } = statement;
switch (expression.kind) {
case 212 /* CallExpression */: {
if (isRequireCall(
expression,
/*requireStringLiteralLikeArgument*/
true
)) {
changes.replaceNode(sourceFile, statement, makeImport(
/*defaultImport*/
void 0,
/*namedImports*/
void 0,
expression.arguments[0],
quotePreference
));
}
return false;
}
case 225 /* BinaryExpression */: {
const { operatorToken } = expression;
return operatorToken.kind === 64 /* EqualsToken */ && convertAssignment(sourceFile, checker, expression, changes, exports, useSitesToUnqualify);
}
}
}
default:
return false;
}
}
function convertVariableStatement(sourceFile, statement, changes, checker, identifiers, target, quotePreference) {
const { declarationList } = statement;
let foundImport = false;
const converted = map(declarationList.declarations, (decl) => {
const { name, initializer } = decl;
if (initializer) {
if (isExportsOrModuleExportsOrAlias(sourceFile, initializer)) {
foundImport = true;
return convertedImports([]);
} else if (isRequireCall(
initializer,
/*requireStringLiteralLikeArgument*/
true
)) {
foundImport = true;
return convertSingleImport(name, initializer.arguments[0], checker, identifiers, target, quotePreference);
} else if (isPropertyAccessExpression(initializer) && isRequireCall(
initializer.expression,
/*requireStringLiteralLikeArgument*/
true
)) {
foundImport = true;
return convertPropertyAccessImport(name, initializer.name.text, initializer.expression.arguments[0], identifiers, quotePreference);
}
}
return convertedImports([factory.createVariableStatement(
/*modifiers*/
void 0,
factory.createVariableDeclarationList([decl], declarationList.flags)
)]);
});
if (foundImport) {
changes.replaceNodeWithNodes(sourceFile, statement, flatMap(converted, (c) => c.newImports));
let combinedUseSites;
forEach(converted, (c) => {
if (c.useSitesToUnqualify) {
copyEntries(c.useSitesToUnqualify, combinedUseSites ?? (combinedUseSites = /* @__PURE__ */ new Map()));
}
});
return combinedUseSites;
}
}
function convertPropertyAccessImport(name, propertyName, moduleSpecifier, identifiers, quotePreference) {
switch (name.kind) {
case 205 /* ObjectBindingPattern */:
case 206 /* ArrayBindingPattern */: {
const tmp = makeUniqueName(propertyName, identifiers);
return convertedImports([
makeSingleImport(tmp, propertyName, moduleSpecifier, quotePreference),
makeConst(
/*modifiers*/
void 0,
name,
factory.createIdentifier(tmp)
)
]);
}
case 80 /* Identifier */:
return convertedImports([makeSingleImport(name.text, propertyName, moduleSpecifier, quotePreference)]);
default:
return Debug.assertNever(name, `Convert to ES module got invalid syntax form ${name.kind}`);
}
}
function convertAssignment(sourceFile, checker, assignment, changes, exports, useSitesToUnqualify) {
const { left, right } = assignment;
if (!isPropertyAccessExpression(left)) {
return false;
}
if (isExportsOrModuleExportsOrAlias(sourceFile, left)) {
if (isExportsOrModuleExportsOrAlias(sourceFile, right)) {
changes.delete(sourceFile, assignment.parent);
} else {
const replacement = isObjectLiteralExpression(right) ? tryChangeModuleExportsObject(right, useSitesToUnqualify) : isRequireCall(
right,
/*requireStringLiteralLikeArgument*/
true
) ? convertReExportAll(right.arguments[0], checker) : void 0;
if (replacement) {
changes.replaceNodeWithNodes(sourceFile, assignment.parent, replacement[0]);
return replacement[1];
} else {
changes.replaceRangeWithText(sourceFile, createRange(left.getStart(sourceFile), right.pos), "export default");
return true;
}
}
} else if (isExportsOrModuleExportsOrAlias(sourceFile, left.expression)) {
convertNamedExport(sourceFile, assignment, changes, exports);
}
return false;
}
function tryChangeModuleExportsObject(object, useSitesToUnqualify) {
const statements = mapAllOrFail(object.properties, (prop) => {
switch (prop.kind) {
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
case 303 /* ShorthandPropertyAssignment */:
case 304 /* SpreadAssignment */:
return void 0;
case 302 /* PropertyAssignment */:
return !isIdentifier(prop.name) ? void 0 : convertExportsDotXEquals_replaceNode(prop.name.text, prop.initializer, useSitesToUnqualify);
case 173 /* MethodDeclaration */:
return !isIdentifier(prop.name) ? void 0 : functionExpressionToDeclaration(prop.name.text, [factory.createToken(95 /* ExportKeyword */)], prop, useSitesToUnqualify);
default:
Debug.assertNever(prop, `Convert to ES6 got invalid prop kind ${prop.kind}`);
}
});
return statements && [statements, false];
}
function convertNamedExport(sourceFile, assignment, changes, exports) {
const { text } = assignment.left.name;
const rename = exports.get(text);
if (rename !== void 0) {
const newNodes = [
makeConst(
/*modifiers*/
void 0,
rename,
assignment.right
),
makeExportDeclaration([factory.createExportSpecifier(
/*isTypeOnly*/
false,
rename,
text
)])
];
changes.replaceNodeWithNodes(sourceFile, assignment.parent, newNodes);
} else {
convertExportsPropertyAssignment(assignment, sourceFile, changes);
}
}
function convertReExportAll(reExported, checker) {
const moduleSpecifier = reExported.text;
const moduleSymbol = checker.getSymbolAtLocation(reExported);
const exports = moduleSymbol ? moduleSymbol.exports : emptyMap;
return exports.has("export=" /* ExportEquals */) ? [[reExportDefault(moduleSpecifier)], true] : !exports.has("default" /* Default */) ? [[reExportStar(moduleSpecifier)], false] : (
// If there's some non-default export, must include both `export *` and `export default`.
exports.size > 1 ? [[reExportStar(moduleSpecifier), reExportDefault(moduleSpecifier)], true] : [[reExportDefault(moduleSpecifier)], true]
);
}
function reExportStar(moduleSpecifier) {
return makeExportDeclaration(
/*exportSpecifiers*/
void 0,
moduleSpecifier
);
}
function reExportDefault(moduleSpecifier) {
return makeExportDeclaration([factory.createExportSpecifier(
/*isTypeOnly*/
false,
/*propertyName*/
void 0,
"default"
)], moduleSpecifier);
}
function convertExportsPropertyAssignment({ left, right, parent: parent2 }, sourceFile, changes) {
const name = left.name.text;
if ((isFunctionExpression(right) || isArrowFunction(right) || isClassExpression(right)) && (!right.name || right.name.text === name)) {
changes.replaceRange(sourceFile, { pos: left.getStart(sourceFile), end: right.getStart(sourceFile) }, factory.createToken(95 /* ExportKeyword */), { suffix: " " });
if (!right.name)
changes.insertName(sourceFile, right, name);
const semi = findChildOfKind(parent2, 27 /* SemicolonToken */, sourceFile);
if (semi)
changes.delete(sourceFile, semi);
} else {
changes.replaceNodeRangeWithNodes(
sourceFile,
left.expression,
findChildOfKind(left, 25 /* DotToken */, sourceFile),
[factory.createToken(95 /* ExportKeyword */), factory.createToken(87 /* ConstKeyword */)],
{ joiner: " ", suffix: " " }
);
}
}
function convertExportsDotXEquals_replaceNode(name, exported, useSitesToUnqualify) {
const modifiers = [factory.createToken(95 /* ExportKeyword */)];
switch (exported.kind) {
case 217 /* FunctionExpression */: {
const { name: expressionName } = exported;
if (expressionName && expressionName.text !== name) {
return exportConst();
}
}
case 218 /* ArrowFunction */:
return functionExpressionToDeclaration(name, modifiers, exported, useSitesToUnqualify);
case 230 /* ClassExpression */:
return classExpressionToDeclaration(name, modifiers, exported, useSitesToUnqualify);
default:
return exportConst();
}
function exportConst() {
return makeConst(modifiers, factory.createIdentifier(name), replaceImportUseSites(exported, useSitesToUnqualify));
}
}
function replaceImportUseSites(nodeOrNodes, useSitesToUnqualify) {
if (!useSitesToUnqualify || !some(arrayFrom(useSitesToUnqualify.keys()), (original) => rangeContainsRange(nodeOrNodes, original))) {
return nodeOrNodes;
}
return isArray(nodeOrNodes) ? getSynthesizedDeepClonesWithReplacements(
nodeOrNodes,
/*includeTrivia*/
true,
replaceNode
) : getSynthesizedDeepCloneWithReplacements(
nodeOrNodes,
/*includeTrivia*/
true,
replaceNode
);
function replaceNode(original) {
if (original.kind === 210 /* PropertyAccessExpression */) {
const replacement = useSitesToUnqualify.get(original);
useSitesToUnqualify.delete(original);
return replacement;
}
}
}
function convertSingleImport(name, moduleSpecifier, checker, identifiers, target, quotePreference) {
switch (name.kind) {
case 205 /* ObjectBindingPattern */: {
const importSpecifiers = mapAllOrFail(name.elements, (e) => e.dotDotDotToken || e.initializer || e.propertyName && !isIdentifier(e.propertyName) || !isIdentifier(e.name) ? void 0 : makeImportSpecifier2(e.propertyName && e.propertyName.text, e.name.text));
if (importSpecifiers) {
return convertedImports([makeImport(
/*defaultImport*/
void 0,
importSpecifiers,
moduleSpecifier,
quotePreference
)]);
}
}
case 206 /* ArrayBindingPattern */: {
const tmp = makeUniqueName(moduleSpecifierToValidIdentifier(moduleSpecifier.text, target), identifiers);
return convertedImports([
makeImport(
factory.createIdentifier(tmp),
/*namedImports*/
void 0,
moduleSpecifier,
quotePreference
),
makeConst(
/*modifiers*/
void 0,
getSynthesizedDeepClone(name),
factory.createIdentifier(tmp)
)
]);
}
case 80 /* Identifier */:
return convertSingleIdentifierImport(name, moduleSpecifier, checker, identifiers, quotePreference);
default:
return Debug.assertNever(name, `Convert to ES module got invalid name kind ${name.kind}`);
}
}
function convertSingleIdentifierImport(name, moduleSpecifier, checker, identifiers, quotePreference) {
const nameSymbol = checker.getSymbolAtLocation(name);
const namedBindingsNames = /* @__PURE__ */ new Map();
let needDefaultImport = false;
let useSitesToUnqualify;
for (const use of identifiers.original.get(name.text)) {
if (checker.getSymbolAtLocation(use) !== nameSymbol || use === name) {
continue;
}
const { parent: parent2 } = use;
if (isPropertyAccessExpression(parent2)) {
const { name: { text: propertyName } } = parent2;
if (propertyName === "default") {
needDefaultImport = true;
const importDefaultName = use.getText();
(useSitesToUnqualify ?? (useSitesToUnqualify = /* @__PURE__ */ new Map())).set(parent2, factory.createIdentifier(importDefaultName));
} else {
Debug.assert(parent2.expression === use, "Didn't expect expression === use");
let idName = namedBindingsNames.get(propertyName);
if (idName === void 0) {
idName = makeUniqueName(propertyName, identifiers);
namedBindingsNames.set(propertyName, idName);
}
(useSitesToUnqualify ?? (useSitesToUnqualify = /* @__PURE__ */ new Map())).set(parent2, factory.createIdentifier(idName));
}
} else {
needDefaultImport = true;
}
}
const namedBindings = namedBindingsNames.size === 0 ? void 0 : arrayFrom(mapIterator(namedBindingsNames.entries(), ([propertyName, idName]) => factory.createImportSpecifier(
/*isTypeOnly*/
false,
propertyName === idName ? void 0 : factory.createIdentifier(propertyName),
factory.createIdentifier(idName)
)));
if (!namedBindings) {
needDefaultImport = true;
}
return convertedImports(
[makeImport(needDefaultImport ? getSynthesizedDeepClone(name) : void 0, namedBindings, moduleSpecifier, quotePreference)],
useSitesToUnqualify
);
}
function makeUniqueName(name, identifiers) {
while (identifiers.original.has(name) || identifiers.additional.has(name)) {
name = `_${name}`;
}
identifiers.additional.add(name);
return name;
}
function collectFreeIdentifiers(file) {
const map2 = createMultiMap();
forEachFreeIdentifier(file, (id) => map2.add(id.text, id));
return map2;
}
function forEachFreeIdentifier(node, cb) {
if (isIdentifier(node) && isFreeIdentifier(node))
cb(node);
node.forEachChild((child) => forEachFreeIdentifier(child, cb));
}
function isFreeIdentifier(node) {
const { parent: parent2 } = node;
switch (parent2.kind) {
case 210 /* PropertyAccessExpression */:
return parent2.name !== node;
case 207 /* BindingElement */:
return parent2.propertyName !== node;
case 275 /* ImportSpecifier */:
return parent2.propertyName !== node;
default:
return true;
}
}
function functionExpressionToDeclaration(name, additionalModifiers, fn, useSitesToUnqualify) {
return factory.createFunctionDeclaration(
concatenate(additionalModifiers, getSynthesizedDeepClones(fn.modifiers)),
getSynthesizedDeepClone(fn.asteriskToken),
name,
getSynthesizedDeepClones(fn.typeParameters),
getSynthesizedDeepClones(fn.parameters),
getSynthesizedDeepClone(fn.type),
factory.converters.convertToFunctionBlock(replaceImportUseSites(fn.body, useSitesToUnqualify))
);
}
function classExpressionToDeclaration(name, additionalModifiers, cls, useSitesToUnqualify) {
return factory.createClassDeclaration(
concatenate(additionalModifiers, getSynthesizedDeepClones(cls.modifiers)),
name,
getSynthesizedDeepClones(cls.typeParameters),
getSynthesizedDeepClones(cls.heritageClauses),
replaceImportUseSites(cls.members, useSitesToUnqualify)
);
}
function makeSingleImport(localName, propertyName, moduleSpecifier, quotePreference) {
return propertyName === "default" ? makeImport(
factory.createIdentifier(localName),
/*namedImports*/
void 0,
moduleSpecifier,
quotePreference
) : makeImport(
/*defaultImport*/
void 0,
[makeImportSpecifier2(propertyName, localName)],
moduleSpecifier,
quotePreference
);
}
function makeImportSpecifier2(propertyName, name) {
return factory.createImportSpecifier(
/*isTypeOnly*/
false,
propertyName !== void 0 && propertyName !== name ? factory.createIdentifier(propertyName) : void 0,
factory.createIdentifier(name)
);
}
function makeConst(modifiers, name, init) {
return factory.createVariableStatement(
modifiers,
factory.createVariableDeclarationList(
[factory.createVariableDeclaration(
name,
/*exclamationToken*/
void 0,
/*type*/
void 0,
init
)],
2 /* Const */
)
);
}
function makeExportDeclaration(exportSpecifiers, moduleSpecifier) {
return factory.createExportDeclaration(
/*modifiers*/
void 0,
/*isTypeOnly*/
false,
exportSpecifiers && factory.createNamedExports(exportSpecifiers),
moduleSpecifier === void 0 ? void 0 : factory.createStringLiteral(moduleSpecifier)
);
}
function convertedImports(newImports, useSitesToUnqualify) {
return {
newImports,
useSitesToUnqualify
};
}
// src/services/codefixes/correctQualifiedNameToIndexedAccessType.ts
var fixId11 = "correctQualifiedNameToIndexedAccessType";
var errorCodes12 = [Diagnostics.Cannot_access_0_1_because_0_is_a_type_but_not_a_namespace_Did_you_mean_to_retrieve_the_type_of_the_property_1_in_0_with_0_1.code];
registerCodeFix({
errorCodes: errorCodes12,
getCodeActions(context) {
const qualifiedName = getQualifiedName(context.sourceFile, context.span.start);
if (!qualifiedName)
return void 0;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange10(t, context.sourceFile, qualifiedName));
const newText = `${qualifiedName.left.text}["${qualifiedName.right.text}"]`;
return [createCodeFixAction(fixId11, changes, [Diagnostics.Rewrite_as_the_indexed_access_type_0, newText], fixId11, Diagnostics.Rewrite_all_as_indexed_access_types)];
},
fixIds: [fixId11],
getAllCodeActions: (context) => codeFixAll(context, errorCodes12, (changes, diag2) => {
const q = getQualifiedName(diag2.file, diag2.start);
if (q) {
doChange10(changes, diag2.file, q);
}
})
});
function getQualifiedName(sourceFile, pos) {
const qualifiedName = findAncestor(getTokenAtPosition(sourceFile, pos), isQualifiedName);
Debug.assert(!!qualifiedName, "Expected position to be owned by a qualified name.");
return isIdentifier(qualifiedName.left) ? qualifiedName : void 0;
}
function doChange10(changeTracker, sourceFile, qualifiedName) {
const rightText = qualifiedName.right.text;
const replacement = factory.createIndexedAccessTypeNode(
factory.createTypeReferenceNode(
qualifiedName.left,
/*typeArguments*/
void 0
),
factory.createLiteralTypeNode(factory.createStringLiteral(rightText))
);
changeTracker.replaceNode(sourceFile, qualifiedName, replacement);
}
// src/services/codefixes/convertToTypeOnlyExport.ts
var errorCodes13 = [Diagnostics.Re_exporting_a_type_when_0_is_enabled_requires_using_export_type.code];
var fixId12 = "convertToTypeOnlyExport";
registerCodeFix({
errorCodes: errorCodes13,
getCodeActions: function getCodeActionsToConvertToTypeOnlyExport(context) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => fixSingleExportDeclaration(t, getExportSpecifierForDiagnosticSpan(context.span, context.sourceFile), context));
if (changes.length) {
return [createCodeFixAction(fixId12, changes, Diagnostics.Convert_to_type_only_export, fixId12, Diagnostics.Convert_all_re_exported_types_to_type_only_exports)];
}
},
fixIds: [fixId12],
getAllCodeActions: function getAllCodeActionsToConvertToTypeOnlyExport(context) {
const fixedExportDeclarations = /* @__PURE__ */ new Map();
return codeFixAll(context, errorCodes13, (changes, diag2) => {
const exportSpecifier = getExportSpecifierForDiagnosticSpan(diag2, context.sourceFile);
if (exportSpecifier && addToSeen(fixedExportDeclarations, getNodeId(exportSpecifier.parent.parent))) {
fixSingleExportDeclaration(changes, exportSpecifier, context);
}
});
}
});
function getExportSpecifierForDiagnosticSpan(span, sourceFile) {
return tryCast(getTokenAtPosition(sourceFile, span.start).parent, isExportSpecifier);
}
function fixSingleExportDeclaration(changes, exportSpecifier, context) {
if (!exportSpecifier) {
return;
}
const exportClause = exportSpecifier.parent;
const exportDeclaration = exportClause.parent;
const typeExportSpecifiers = getTypeExportSpecifiers(exportSpecifier, context);
if (typeExportSpecifiers.length === exportClause.elements.length) {
changes.insertModifierBefore(context.sourceFile, 156 /* TypeKeyword */, exportClause);
} else {
const valueExportDeclaration = factory.updateExportDeclaration(
exportDeclaration,
exportDeclaration.modifiers,
/*isTypeOnly*/
false,
factory.updateNamedExports(exportClause, filter(exportClause.elements, (e) => !contains(typeExportSpecifiers, e))),
exportDeclaration.moduleSpecifier,
/*assertClause*/
void 0
);
const typeExportDeclaration = factory.createExportDeclaration(
/*modifiers*/
void 0,
/*isTypeOnly*/
true,
factory.createNamedExports(typeExportSpecifiers),
exportDeclaration.moduleSpecifier,
/*assertClause*/
void 0
);
changes.replaceNode(context.sourceFile, exportDeclaration, valueExportDeclaration, {
leadingTriviaOption: ts_textChanges_exports.LeadingTriviaOption.IncludeAll,
trailingTriviaOption: ts_textChanges_exports.TrailingTriviaOption.Exclude
});
changes.insertNodeAfter(context.sourceFile, exportDeclaration, typeExportDeclaration);
}
}
function getTypeExportSpecifiers(originExportSpecifier, context) {
const exportClause = originExportSpecifier.parent;
if (exportClause.elements.length === 1) {
return exportClause.elements;
}
const diagnostics = getDiagnosticsWithinSpan(
createTextSpanFromNode(exportClause),
context.program.getSemanticDiagnostics(context.sourceFile, context.cancellationToken)
);
return filter(exportClause.elements, (element) => {
var _a;
return element === originExportSpecifier || ((_a = findDiagnosticForNode(element, diagnostics)) == null ? void 0 : _a.code) === errorCodes13[0];
});
}
// src/services/codefixes/convertToTypeOnlyImport.ts
var errorCodes14 = [
Diagnostics.This_import_is_never_used_as_a_value_and_must_use_import_type_because_importsNotUsedAsValues_is_set_to_error.code,
Diagnostics._0_is_a_type_and_must_be_imported_using_a_type_only_import_when_verbatimModuleSyntax_is_enabled.code
];
var fixId13 = "convertToTypeOnlyImport";
registerCodeFix({
errorCodes: errorCodes14,
getCodeActions: function getCodeActionsToConvertToTypeOnlyImport(context) {
const declaration = getDeclaration2(context.sourceFile, context.span.start);
if (declaration) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange11(t, context.sourceFile, declaration));
return [createCodeFixAction(fixId13, changes, Diagnostics.Convert_to_type_only_import, fixId13, Diagnostics.Convert_all_imports_not_used_as_a_value_to_type_only_imports)];
}
return void 0;
},
fixIds: [fixId13],
getAllCodeActions: function getAllCodeActionsToConvertToTypeOnlyImport(context) {
return codeFixAll(context, errorCodes14, (changes, diag2) => {
const declaration = getDeclaration2(diag2.file, diag2.start);
if (declaration) {
doChange11(changes, diag2.file, declaration);
}
});
}
});
function getDeclaration2(sourceFile, pos) {
const { parent: parent2 } = getTokenAtPosition(sourceFile, pos);
return isImportSpecifier(parent2) || isImportDeclaration(parent2) && parent2.importClause ? parent2 : void 0;
}
function doChange11(changes, sourceFile, declaration) {
if (isImportSpecifier(declaration)) {
changes.replaceNode(sourceFile, declaration, factory.updateImportSpecifier(
declaration,
/*isTypeOnly*/
true,
declaration.propertyName,
declaration.name
));
} else {
const importClause = declaration.importClause;
if (importClause.name && importClause.namedBindings) {
changes.replaceNodeWithNodes(sourceFile, declaration, [
factory.createImportDeclaration(
getSynthesizedDeepClones(
declaration.modifiers,
/*includeTrivia*/
true
),
factory.createImportClause(
/*isTypeOnly*/
true,
getSynthesizedDeepClone(
importClause.name,
/*includeTrivia*/
true
),
/*namedBindings*/
void 0
),
getSynthesizedDeepClone(
declaration.moduleSpecifier,
/*includeTrivia*/
true
),
getSynthesizedDeepClone(
declaration.assertClause,
/*includeTrivia*/
true
)
),
factory.createImportDeclaration(
getSynthesizedDeepClones(
declaration.modifiers,
/*includeTrivia*/
true
),
factory.createImportClause(
/*isTypeOnly*/
true,
/*name*/
void 0,
getSynthesizedDeepClone(
importClause.namedBindings,
/*includeTrivia*/
true
)
),
getSynthesizedDeepClone(
declaration.moduleSpecifier,
/*includeTrivia*/
true
),
getSynthesizedDeepClone(
declaration.assertClause,
/*includeTrivia*/
true
)
)
]);
} else {
const importDeclaration = factory.updateImportDeclaration(
declaration,
declaration.modifiers,
factory.updateImportClause(
importClause,
/*isTypeOnly*/
true,
importClause.name,
importClause.namedBindings
),
declaration.moduleSpecifier,
declaration.assertClause
);
changes.replaceNode(sourceFile, declaration, importDeclaration);
}
}
}
// src/services/codefixes/convertTypedefToType.ts
var fixId14 = "convertTypedefToType";
var errorCodes15 = [Diagnostics.JSDoc_typedef_may_be_converted_to_TypeScript_type.code];
registerCodeFix({
fixIds: [fixId14],
errorCodes: errorCodes15,
getCodeActions(context) {
const node = getTokenAtPosition(
context.sourceFile,
context.span.start
);
if (!node)
return;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange12(t, node, context.sourceFile));
if (changes.length > 0) {
return [
createCodeFixAction(
fixId14,
changes,
Diagnostics.Convert_typedef_to_TypeScript_type,
fixId14,
Diagnostics.Convert_all_typedef_to_TypeScript_types
)
];
}
},
getAllCodeActions: (context) => codeFixAll(context, errorCodes15, (changes, diag2) => {
const node = getTokenAtPosition(diag2.file, diag2.start);
if (node)
doChange12(changes, node, diag2.file);
})
});
function doChange12(changes, node, sourceFile) {
if (isJSDocTypedefTag(node)) {
fixSingleTypeDef(changes, node, sourceFile);
}
}
function fixSingleTypeDef(changes, typeDefNode, sourceFile) {
if (!typeDefNode)
return;
const declaration = createDeclaration(typeDefNode);
if (!declaration)
return;
const comment = typeDefNode.parent;
changes.replaceNode(
sourceFile,
comment,
declaration
);
}
function createDeclaration(tag) {
var _a;
const { typeExpression } = tag;
if (!typeExpression)
return;
const typeName = (_a = tag.name) == null ? void 0 : _a.getText();
if (!typeName)
return;
if (typeExpression.kind === 328 /* JSDocTypeLiteral */) {
return createInterfaceForTypeLiteral(typeName, typeExpression);
}
if (typeExpression.kind === 315 /* JSDocTypeExpression */) {
return createTypeAliasForTypeExpression(typeName, typeExpression);
}
}
function createInterfaceForTypeLiteral(typeName, typeLiteral) {
const propertySignatures = createSignatureFromTypeLiteral(typeLiteral);
if (!some(propertySignatures))
return;
const interfaceDeclaration = factory.createInterfaceDeclaration(
/*modifiers*/
void 0,
typeName,
/*typeParameters*/
void 0,
/*heritageClauses*/
void 0,
propertySignatures
);
return interfaceDeclaration;
}
function createTypeAliasForTypeExpression(typeName, typeExpression) {
const typeReference = getSynthesizedDeepClone(typeExpression.type);
if (!typeReference)
return;
const declaration = factory.createTypeAliasDeclaration(
/*modifiers*/
void 0,
factory.createIdentifier(typeName),
/*typeParameters*/
void 0,
typeReference
);
return declaration;
}
function createSignatureFromTypeLiteral(typeLiteral) {
const propertyTags = typeLiteral.jsDocPropertyTags;
if (!some(propertyTags))
return;
const getSignature = (tag) => {
var _a;
const name = getPropertyName(tag);
const type = (_a = tag.typeExpression) == null ? void 0 : _a.type;
const isOptional = tag.isBracketed;
let typeReference;
if (type && isJSDocTypeLiteral(type)) {
const signatures = createSignatureFromTypeLiteral(type);
typeReference = factory.createTypeLiteralNode(signatures);
} else if (type) {
typeReference = getSynthesizedDeepClone(type);
}
if (typeReference && name) {
const questionToken = isOptional ? factory.createToken(58 /* QuestionToken */) : void 0;
const prop = factory.createPropertySignature(
/*modifiers*/
void 0,
name,
questionToken,
typeReference
);
return prop;
}
};
const props = mapDefined(propertyTags, getSignature);
return props;
}
function getPropertyName(tag) {
return tag.name.kind === 80 /* Identifier */ ? tag.name.text : tag.name.right.text;
}
function getJSDocTypedefNode(node) {
if (hasJSDocNodes(node)) {
return forEach(node.jsDoc, (node2) => {
var _a;
return (_a = node2.tags) == null ? void 0 : _a.find(isJSDocTypedefTag);
});
}
return void 0;
}
// src/services/codefixes/convertLiteralTypeToMappedType.ts
var fixId15 = "convertLiteralTypeToMappedType";
var errorCodes16 = [Diagnostics._0_only_refers_to_a_type_but_is_being_used_as_a_value_here_Did_you_mean_to_use_1_in_0.code];
registerCodeFix({
errorCodes: errorCodes16,
getCodeActions: function getCodeActionsToConvertLiteralTypeToMappedType(context) {
const { sourceFile, span } = context;
const info = getInfo5(sourceFile, span.start);
if (!info) {
return void 0;
}
const { name, constraint } = info;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange13(t, sourceFile, info));
return [createCodeFixAction(fixId15, changes, [Diagnostics.Convert_0_to_1_in_0, constraint, name], fixId15, Diagnostics.Convert_all_type_literals_to_mapped_type)];
},
fixIds: [fixId15],
getAllCodeActions: (context) => codeFixAll(context, errorCodes16, (changes, diag2) => {
const info = getInfo5(diag2.file, diag2.start);
if (info) {
doChange13(changes, diag2.file, info);
}
})
});
function getInfo5(sourceFile, pos) {
const token = getTokenAtPosition(sourceFile, pos);
if (isIdentifier(token)) {
const propertySignature = cast(token.parent.parent, isPropertySignature);
const propertyName = token.getText(sourceFile);
return {
container: cast(propertySignature.parent, isTypeLiteralNode),
typeNode: propertySignature.type,
constraint: propertyName,
name: propertyName === "K" ? "P" : "K"
};
}
return void 0;
}
function doChange13(changes, sourceFile, { container, typeNode, constraint, name }) {
changes.replaceNode(sourceFile, container, factory.createMappedTypeNode(
/*readonlyToken*/
void 0,
factory.createTypeParameterDeclaration(
/*modifiers*/
void 0,
name,
factory.createTypeReferenceNode(constraint)
),
/*nameType*/
void 0,
/*questionToken*/
void 0,
typeNode,
/*members*/
void 0
));
}
// src/services/codefixes/fixClassIncorrectlyImplementsInterface.ts
var errorCodes17 = [
Diagnostics.Class_0_incorrectly_implements_interface_1.code,
Diagnostics.Class_0_incorrectly_implements_class_1_Did_you_mean_to_extend_1_and_inherit_its_members_as_a_subclass.code
];
var fixId16 = "fixClassIncorrectlyImplementsInterface";
registerCodeFix({
errorCodes: errorCodes17,
getCodeActions(context) {
const { sourceFile, span } = context;
const classDeclaration = getClass(sourceFile, span.start);
return mapDefined(getEffectiveImplementsTypeNodes(classDeclaration), (implementedTypeNode) => {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => addMissingDeclarations(context, implementedTypeNode, sourceFile, classDeclaration, t, context.preferences));
return changes.length === 0 ? void 0 : createCodeFixAction(fixId16, changes, [Diagnostics.Implement_interface_0, implementedTypeNode.getText(sourceFile)], fixId16, Diagnostics.Implement_all_unimplemented_interfaces);
});
},
fixIds: [fixId16],
getAllCodeActions(context) {
const seenClassDeclarations = /* @__PURE__ */ new Map();
return codeFixAll(context, errorCodes17, (changes, diag2) => {
const classDeclaration = getClass(diag2.file, diag2.start);
if (addToSeen(seenClassDeclarations, getNodeId(classDeclaration))) {
for (const implementedTypeNode of getEffectiveImplementsTypeNodes(classDeclaration)) {
addMissingDeclarations(context, implementedTypeNode, diag2.file, classDeclaration, changes, context.preferences);
}
}
});
}
});
function getClass(sourceFile, pos) {
return Debug.checkDefined(getContainingClass(getTokenAtPosition(sourceFile, pos)), "There should be a containing class");
}
function symbolPointsToNonPrivateMember(symbol) {
return !symbol.valueDeclaration || !(getEffectiveModifierFlags(symbol.valueDeclaration) & 8 /* Private */);
}
function addMissingDeclarations(context, implementedTypeNode, sourceFile, classDeclaration, changeTracker, preferences) {
const checker = context.program.getTypeChecker();
const maybeHeritageClauseSymbol = getHeritageClauseSymbolTable(classDeclaration, checker);
const implementedType = checker.getTypeAtLocation(implementedTypeNode);
const implementedTypeSymbols = checker.getPropertiesOfType(implementedType);
const nonPrivateAndNotExistedInHeritageClauseMembers = implementedTypeSymbols.filter(and(symbolPointsToNonPrivateMember, (symbol) => !maybeHeritageClauseSymbol.has(symbol.escapedName)));
const classType = checker.getTypeAtLocation(classDeclaration);
const constructor = find(classDeclaration.members, (m) => isConstructorDeclaration(m));
if (!classType.getNumberIndexType()) {
createMissingIndexSignatureDeclaration(implementedType, 1 /* Number */);
}
if (!classType.getStringIndexType()) {
createMissingIndexSignatureDeclaration(implementedType, 0 /* String */);
}
const importAdder = createImportAdder(sourceFile, context.program, preferences, context.host);
createMissingMemberNodes(classDeclaration, nonPrivateAndNotExistedInHeritageClauseMembers, sourceFile, context, preferences, importAdder, (member) => insertInterfaceMemberNode(sourceFile, classDeclaration, member));
importAdder.writeFixes(changeTracker);
function createMissingIndexSignatureDeclaration(type, kind) {
const indexInfoOfKind = checker.getIndexInfoOfType(type, kind);
if (indexInfoOfKind) {
insertInterfaceMemberNode(sourceFile, classDeclaration, checker.indexInfoToIndexSignatureDeclaration(
indexInfoOfKind,
classDeclaration,
/*flags*/
void 0,
getNoopSymbolTrackerWithResolver(context)
));
}
}
function insertInterfaceMemberNode(sourceFile2, cls, newElement) {
if (constructor) {
changeTracker.insertNodeAfter(sourceFile2, constructor, newElement);
} else {
changeTracker.insertMemberAtStart(sourceFile2, cls, newElement);
}
}
}
function getHeritageClauseSymbolTable(classDeclaration, checker) {
const heritageClauseNode = getEffectiveBaseTypeNode(classDeclaration);
if (!heritageClauseNode)
return createSymbolTable();
const heritageClauseType = checker.getTypeAtLocation(heritageClauseNode);
const heritageClauseTypeSymbols = checker.getPropertiesOfType(heritageClauseType);
return createSymbolTable(heritageClauseTypeSymbols.filter(symbolPointsToNonPrivateMember));
}
// src/services/codefixes/importFixes.ts
var importFixName = "import";
var importFixId = "fixMissingImport";
var errorCodes18 = [
Diagnostics.Cannot_find_name_0.code,
Diagnostics.Cannot_find_name_0_Did_you_mean_1.code,
Diagnostics.Cannot_find_name_0_Did_you_mean_the_instance_member_this_0.code,
Diagnostics.Cannot_find_name_0_Did_you_mean_the_static_member_1_0.code,
Diagnostics.Cannot_find_namespace_0.code,
Diagnostics._0_refers_to_a_UMD_global_but_the_current_file_is_a_module_Consider_adding_an_import_instead.code,
Diagnostics._0_only_refers_to_a_type_but_is_being_used_as_a_value_here.code,
Diagnostics.No_value_exists_in_scope_for_the_shorthand_property_0_Either_declare_one_or_provide_an_initializer.code,
Diagnostics._0_cannot_be_used_as_a_value_because_it_was_imported_using_import_type.code
];
registerCodeFix({
errorCodes: errorCodes18,
getCodeActions(context) {
const { errorCode, preferences, sourceFile, span, program } = context;
const info = getFixInfos(
context,
errorCode,
span.start,
/*useAutoImportProvider*/
true
);
if (!info)
return void 0;
return info.map(({ fix, symbolName: symbolName2, errorIdentifierText }) => codeActionForFix(
context,
sourceFile,
symbolName2,
fix,
/*includeSymbolNameInDescription*/
symbolName2 !== errorIdentifierText,
program.getCompilerOptions(),
preferences
));
},
fixIds: [importFixId],
getAllCodeActions: (context) => {
const { sourceFile, program, preferences, host, cancellationToken } = context;
const importAdder = createImportAdderWorker(
sourceFile,
program,
/*useAutoImportProvider*/
true,
preferences,
host,
cancellationToken
);
eachDiagnostic(context, errorCodes18, (diag2) => importAdder.addImportFromDiagnostic(diag2, context));
return createCombinedCodeActions(ts_textChanges_exports.ChangeTracker.with(context, importAdder.writeFixes));
}
});
function createImportAdder(sourceFile, program, preferences, host, cancellationToken) {
return createImportAdderWorker(
sourceFile,
program,
/*useAutoImportProvider*/
false,
preferences,
host,
cancellationToken
);
}
function createImportAdderWorker(sourceFile, program, useAutoImportProvider, preferences, host, cancellationToken) {
const compilerOptions = program.getCompilerOptions();
const addToNamespace = [];
const importType = [];
const addToExisting = /* @__PURE__ */ new Map();
const newImports = /* @__PURE__ */ new Map();
return { addImportFromDiagnostic, addImportFromExportedSymbol, writeFixes, hasFixes };
function addImportFromDiagnostic(diagnostic, context) {
const info = getFixInfos(context, diagnostic.code, diagnostic.start, useAutoImportProvider);
if (!info || !info.length)
return;
addImport(first(info));
}
function addImportFromExportedSymbol(exportedSymbol, isValidTypeOnlyUseSite) {
const moduleSymbol = Debug.checkDefined(exportedSymbol.parent);
const symbolName2 = getNameForExportedSymbol(exportedSymbol, getEmitScriptTarget(compilerOptions));
const checker = program.getTypeChecker();
const symbol = checker.getMergedSymbol(skipAlias(exportedSymbol, checker));
const exportInfo = getAllExportInfoForSymbol(
sourceFile,
symbol,
symbolName2,
moduleSymbol,
/*preferCapitalized*/
false,
program,
host,
preferences,
cancellationToken
);
const useRequire = shouldUseRequire(sourceFile, program);
const fix = getImportFixForSymbol(
sourceFile,
Debug.checkDefined(exportInfo),
program,
/*position*/
void 0,
!!isValidTypeOnlyUseSite,
useRequire,
host,
preferences
);
if (fix) {
addImport({ fix, symbolName: symbolName2, errorIdentifierText: void 0 });
}
}
function addImport(info) {
var _a, _b;
const { fix, symbolName: symbolName2 } = info;
switch (fix.kind) {
case 0 /* UseNamespace */:
addToNamespace.push(fix);
break;
case 1 /* JsdocTypeImport */:
importType.push(fix);
break;
case 2 /* AddToExisting */: {
const { importClauseOrBindingPattern, importKind, addAsTypeOnly } = fix;
const key = String(getNodeId(importClauseOrBindingPattern));
let entry = addToExisting.get(key);
if (!entry) {
addToExisting.set(key, entry = { importClauseOrBindingPattern, defaultImport: void 0, namedImports: /* @__PURE__ */ new Map() });
}
if (importKind === 0 /* Named */) {
const prevValue = entry == null ? void 0 : entry.namedImports.get(symbolName2);
entry.namedImports.set(symbolName2, reduceAddAsTypeOnlyValues(prevValue, addAsTypeOnly));
} else {
Debug.assert(entry.defaultImport === void 0 || entry.defaultImport.name === symbolName2, "(Add to Existing) Default import should be missing or match symbolName");
entry.defaultImport = {
name: symbolName2,
addAsTypeOnly: reduceAddAsTypeOnlyValues((_a = entry.defaultImport) == null ? void 0 : _a.addAsTypeOnly, addAsTypeOnly)
};
}
break;
}
case 3 /* AddNew */: {
const { moduleSpecifier, importKind, useRequire, addAsTypeOnly } = fix;
const entry = getNewImportEntry(moduleSpecifier, importKind, useRequire, addAsTypeOnly);
Debug.assert(entry.useRequire === useRequire, "(Add new) Tried to add an `import` and a `require` for the same module");
switch (importKind) {
case 1 /* Default */:
Debug.assert(entry.defaultImport === void 0 || entry.defaultImport.name === symbolName2, "(Add new) Default import should be missing or match symbolName");
entry.defaultImport = { name: symbolName2, addAsTypeOnly: reduceAddAsTypeOnlyValues((_b = entry.defaultImport) == null ? void 0 : _b.addAsTypeOnly, addAsTypeOnly) };
break;
case 0 /* Named */:
const prevValue = (entry.namedImports || (entry.namedImports = /* @__PURE__ */ new Map())).get(symbolName2);
entry.namedImports.set(symbolName2, reduceAddAsTypeOnlyValues(prevValue, addAsTypeOnly));
break;
case 3 /* CommonJS */:
case 2 /* Namespace */:
Debug.assert(entry.namespaceLikeImport === void 0 || entry.namespaceLikeImport.name === symbolName2, "Namespacelike import shoudl be missing or match symbolName");
entry.namespaceLikeImport = { importKind, name: symbolName2, addAsTypeOnly };
break;
}
break;
}
case 4 /* PromoteTypeOnly */:
break;
default:
Debug.assertNever(fix, `fix wasn't never - got kind ${fix.kind}`);
}
function reduceAddAsTypeOnlyValues(prevValue, newValue) {
return Math.max(prevValue ?? 0, newValue);
}
function getNewImportEntry(moduleSpecifier, importKind, useRequire, addAsTypeOnly) {
const typeOnlyKey = newImportsKey(
moduleSpecifier,
/*topLevelTypeOnly*/
true
);
const nonTypeOnlyKey = newImportsKey(
moduleSpecifier,
/*topLevelTypeOnly*/
false
);
const typeOnlyEntry = newImports.get(typeOnlyKey);
const nonTypeOnlyEntry = newImports.get(nonTypeOnlyKey);
const newEntry = {
defaultImport: void 0,
namedImports: void 0,
namespaceLikeImport: void 0,
useRequire
};
if (importKind === 1 /* Default */ && addAsTypeOnly === 2 /* Required */) {
if (typeOnlyEntry)
return typeOnlyEntry;
newImports.set(typeOnlyKey, newEntry);
return newEntry;
}
if (addAsTypeOnly === 1 /* Allowed */ && (typeOnlyEntry || nonTypeOnlyEntry)) {
return typeOnlyEntry || nonTypeOnlyEntry;
}
if (nonTypeOnlyEntry) {
return nonTypeOnlyEntry;
}
newImports.set(nonTypeOnlyKey, newEntry);
return newEntry;
}
function newImportsKey(moduleSpecifier, topLevelTypeOnly) {
return `${topLevelTypeOnly ? 1 : 0}|${moduleSpecifier}`;
}
}
function writeFixes(changeTracker) {
const quotePreference = getQuotePreference(sourceFile, preferences);
for (const fix of addToNamespace) {
addNamespaceQualifier(changeTracker, sourceFile, fix);
}
for (const fix of importType) {
addImportType(changeTracker, sourceFile, fix, quotePreference);
}
addToExisting.forEach(({ importClauseOrBindingPattern, defaultImport, namedImports }) => {
doAddExistingFix(
changeTracker,
sourceFile,
importClauseOrBindingPattern,
defaultImport,
arrayFrom(namedImports.entries(), ([name, addAsTypeOnly]) => ({ addAsTypeOnly, name })),
preferences
);
});
let newDeclarations;
newImports.forEach(({ useRequire, defaultImport, namedImports, namespaceLikeImport }, key) => {
const moduleSpecifier = key.slice(2);
const getDeclarations = useRequire ? getNewRequires : getNewImports;
const declarations = getDeclarations(
moduleSpecifier,
quotePreference,
defaultImport,
namedImports && arrayFrom(namedImports.entries(), ([name, addAsTypeOnly]) => ({ addAsTypeOnly, name })),
namespaceLikeImport,
compilerOptions
);
newDeclarations = combine(newDeclarations, declarations);
});
if (newDeclarations) {
insertImports(
changeTracker,
sourceFile,
newDeclarations,
/*blankLineBetween*/
true,
preferences
);
}
}
function hasFixes() {
return addToNamespace.length > 0 || importType.length > 0 || addToExisting.size > 0 || newImports.size > 0;
}
}
function createImportSpecifierResolver(importingFile, program, host, preferences) {
const packageJsonImportFilter = createPackageJsonImportFilter(importingFile, preferences, host);
const importMap = createExistingImportMap(program.getTypeChecker(), importingFile, program.getCompilerOptions());
return { getModuleSpecifierForBestExportInfo };
function getModuleSpecifierForBestExportInfo(exportInfo, position, isValidTypeOnlyUseSite, fromCacheOnly) {
const { fixes, computedWithoutCacheCount } = getImportFixes(
exportInfo,
position,
isValidTypeOnlyUseSite,
/*useRequire*/
false,
program,
importingFile,
host,
preferences,
importMap,
fromCacheOnly
);
const result = getBestFix(fixes, importingFile, program, packageJsonImportFilter, host);
return result && { ...result, computedWithoutCacheCount };
}
}
function getImportCompletionAction(targetSymbol, moduleSymbol, exportMapKey, sourceFile, symbolName2, isJsxTagName, host, program, formatContext, position, preferences, cancellationToken) {
const compilerOptions = program.getCompilerOptions();
let exportInfos;
if (exportMapKey) {
exportInfos = getExportInfoMap(sourceFile, host, program, preferences, cancellationToken).get(sourceFile.path, exportMapKey);
Debug.assertIsDefined(exportInfos, "Some exportInfo should match the specified exportMapKey");
} else {
exportInfos = pathIsBareSpecifier(stripQuotes(moduleSymbol.name)) ? [getSingleExportInfoForSymbol(targetSymbol, symbolName2, moduleSymbol, program, host)] : getAllExportInfoForSymbol(sourceFile, targetSymbol, symbolName2, moduleSymbol, isJsxTagName, program, host, preferences, cancellationToken);
Debug.assertIsDefined(exportInfos, "Some exportInfo should match the specified symbol / moduleSymbol");
}
const useRequire = shouldUseRequire(sourceFile, program);
const isValidTypeOnlyUseSite = isValidTypeOnlyAliasUseSite(getTokenAtPosition(sourceFile, position));
const fix = Debug.checkDefined(getImportFixForSymbol(sourceFile, exportInfos, program, position, isValidTypeOnlyUseSite, useRequire, host, preferences));
return {
moduleSpecifier: fix.moduleSpecifier,
codeAction: codeFixActionToCodeAction(codeActionForFix(
{ host, formatContext, preferences },
sourceFile,
symbolName2,
fix,
/*includeSymbolNameInDescription*/
false,
compilerOptions,
preferences
))
};
}
function getPromoteTypeOnlyCompletionAction(sourceFile, symbolToken, program, host, formatContext, preferences) {
const compilerOptions = program.getCompilerOptions();
const symbolName2 = single(getSymbolNamesToImport(sourceFile, program.getTypeChecker(), symbolToken, compilerOptions));
const fix = getTypeOnlyPromotionFix(sourceFile, symbolToken, symbolName2, program);
const includeSymbolNameInDescription = symbolName2 !== symbolToken.text;
return fix && codeFixActionToCodeAction(codeActionForFix({ host, formatContext, preferences }, sourceFile, symbolName2, fix, includeSymbolNameInDescription, compilerOptions, preferences));
}
function getImportFixForSymbol(sourceFile, exportInfos, program, position, isValidTypeOnlyUseSite, useRequire, host, preferences) {
const packageJsonImportFilter = createPackageJsonImportFilter(sourceFile, preferences, host);
return getBestFix(getImportFixes(exportInfos, position, isValidTypeOnlyUseSite, useRequire, program, sourceFile, host, preferences).fixes, sourceFile, program, packageJsonImportFilter, host);
}
function codeFixActionToCodeAction({ description: description3, changes, commands }) {
return { description: description3, changes, commands };
}
function getAllExportInfoForSymbol(importingFile, symbol, symbolName2, moduleSymbol, preferCapitalized, program, host, preferences, cancellationToken) {
const getChecker = createGetChecker(program, host);
return getExportInfoMap(importingFile, host, program, preferences, cancellationToken).search(importingFile.path, preferCapitalized, (name) => name === symbolName2, (info) => {
if (skipAlias(info[0].symbol, getChecker(info[0].isFromPackageJson)) === symbol && info.some((i) => i.moduleSymbol === moduleSymbol || i.symbol.parent === moduleSymbol)) {
return info;
}
});
}
function getSingleExportInfoForSymbol(symbol, symbolName2, moduleSymbol, program, host) {
var _a, _b;
const compilerOptions = program.getCompilerOptions();
const mainProgramInfo = getInfoWithChecker(
program.getTypeChecker(),
/*isFromPackageJson*/
false
);
if (mainProgramInfo) {
return mainProgramInfo;
}
const autoImportProvider = (_b = (_a = host.getPackageJsonAutoImportProvider) == null ? void 0 : _a.call(host)) == null ? void 0 : _b.getTypeChecker();
return Debug.checkDefined(autoImportProvider && getInfoWithChecker(
autoImportProvider,
/*isFromPackageJson*/
true
), `Could not find symbol in specified module for code actions`);
function getInfoWithChecker(checker, isFromPackageJson) {
const defaultInfo = getDefaultLikeExportInfo(moduleSymbol, checker, compilerOptions);
if (defaultInfo && skipAlias(defaultInfo.symbol, checker) === symbol) {
return { symbol: defaultInfo.symbol, moduleSymbol, moduleFileName: void 0, exportKind: defaultInfo.exportKind, targetFlags: skipAlias(symbol, checker).flags, isFromPackageJson };
}
const named = checker.tryGetMemberInModuleExportsAndProperties(symbolName2, moduleSymbol);
if (named && skipAlias(named, checker) === symbol) {
return { symbol: named, moduleSymbol, moduleFileName: void 0, exportKind: 0 /* Named */, targetFlags: skipAlias(symbol, checker).flags, isFromPackageJson };
}
}
}
function getImportFixes(exportInfos, usagePosition, isValidTypeOnlyUseSite, useRequire, program, sourceFile, host, preferences, importMap = createExistingImportMap(program.getTypeChecker(), sourceFile, program.getCompilerOptions()), fromCacheOnly) {
const checker = program.getTypeChecker();
const existingImports = flatMap(exportInfos, importMap.getImportsForExportInfo);
const useNamespace = usagePosition !== void 0 && tryUseExistingNamespaceImport(existingImports, usagePosition);
const addToExisting = tryAddToExistingImport(existingImports, isValidTypeOnlyUseSite, checker, program.getCompilerOptions());
if (addToExisting) {
return {
computedWithoutCacheCount: 0,
fixes: [...useNamespace ? [useNamespace] : emptyArray, addToExisting]
};
}
const { fixes, computedWithoutCacheCount = 0 } = getFixesForAddImport(
exportInfos,
existingImports,
program,
sourceFile,
usagePosition,
isValidTypeOnlyUseSite,
useRequire,
host,
preferences,
fromCacheOnly
);
return {
computedWithoutCacheCount,
fixes: [...useNamespace ? [useNamespace] : emptyArray, ...fixes]
};
}
function tryUseExistingNamespaceImport(existingImports, position) {
return firstDefined(existingImports, ({ declaration, importKind }) => {
var _a;
if (importKind !== 0 /* Named */)
return void 0;
const namespacePrefix = getNamespaceLikeImportText(declaration);
const moduleSpecifier = namespacePrefix && ((_a = tryGetModuleSpecifierFromDeclaration(declaration)) == null ? void 0 : _a.text);
if (moduleSpecifier) {
return { kind: 0 /* UseNamespace */, namespacePrefix, usagePosition: position, moduleSpecifier };
}
});
}
function getNamespaceLikeImportText(declaration) {
var _a, _b, _c;
switch (declaration.kind) {
case 259 /* VariableDeclaration */:
return (_a = tryCast(declaration.name, isIdentifier)) == null ? void 0 : _a.text;
case 270 /* ImportEqualsDeclaration */:
return declaration.name.text;
case 271 /* ImportDeclaration */:
return (_c = tryCast((_b = declaration.importClause) == null ? void 0 : _b.namedBindings, isNamespaceImport)) == null ? void 0 : _c.name.text;
default:
return Debug.assertNever(declaration);
}
}
function getAddAsTypeOnly(isValidTypeOnlyUseSite, isForNewImportDeclaration, symbol, targetFlags, checker, compilerOptions) {
if (!isValidTypeOnlyUseSite) {
return 4 /* NotAllowed */;
}
if (isForNewImportDeclaration && compilerOptions.importsNotUsedAsValues === 2 /* Error */) {
return 2 /* Required */;
}
if (importNameElisionDisabled(compilerOptions) && (!(targetFlags & 111551 /* Value */) || !!checker.getTypeOnlyAliasDeclaration(symbol))) {
return 2 /* Required */;
}
return 1 /* Allowed */;
}
function tryAddToExistingImport(existingImports, isValidTypeOnlyUseSite, checker, compilerOptions) {
let best;
for (const existingImport of existingImports) {
const fix = getAddToExistingImportFix(existingImport);
if (!fix)
continue;
const isTypeOnly = isTypeOnlyImportDeclaration(fix.importClauseOrBindingPattern);
if (fix.addAsTypeOnly !== 4 /* NotAllowed */ && isTypeOnly || fix.addAsTypeOnly === 4 /* NotAllowed */ && !isTypeOnly) {
return fix;
}
best ?? (best = fix);
}
return best;
function getAddToExistingImportFix({ declaration, importKind, symbol, targetFlags }) {
if (importKind === 3 /* CommonJS */ || importKind === 2 /* Namespace */ || declaration.kind === 270 /* ImportEqualsDeclaration */) {
return void 0;
}
if (declaration.kind === 259 /* VariableDeclaration */) {
return (importKind === 0 /* Named */ || importKind === 1 /* Default */) && declaration.name.kind === 205 /* ObjectBindingPattern */ ? { kind: 2 /* AddToExisting */, importClauseOrBindingPattern: declaration.name, importKind, moduleSpecifier: declaration.initializer.arguments[0].text, addAsTypeOnly: 4 /* NotAllowed */ } : void 0;
}
const { importClause } = declaration;
if (!importClause || !isStringLiteralLike(declaration.moduleSpecifier)) {
return void 0;
}
const { name, namedBindings } = importClause;
if (importClause.isTypeOnly && !(importKind === 0 /* Named */ && namedBindings)) {
return void 0;
}
const addAsTypeOnly = getAddAsTypeOnly(
isValidTypeOnlyUseSite,
/*isForNewImportDeclaration*/
false,
symbol,
targetFlags,
checker,
compilerOptions
);
if (importKind === 1 /* Default */ && (name || // Cannot add a default import to a declaration that already has one
addAsTypeOnly === 2 /* Required */ && namedBindings)) {
return void 0;
}
if (importKind === 0 /* Named */ && (namedBindings == null ? void 0 : namedBindings.kind) === 273 /* NamespaceImport */) {
return void 0;
}
return {
kind: 2 /* AddToExisting */,
importClauseOrBindingPattern: importClause,
importKind,
moduleSpecifier: declaration.moduleSpecifier.text,
addAsTypeOnly
};
}
}
function createExistingImportMap(checker, importingFile, compilerOptions) {
let importMap;
for (const moduleSpecifier of importingFile.imports) {
const i = importFromModuleSpecifier(moduleSpecifier);
if (isVariableDeclarationInitializedToRequire(i.parent)) {
const moduleSymbol = checker.resolveExternalModuleName(moduleSpecifier);
if (moduleSymbol) {
(importMap || (importMap = createMultiMap())).add(getSymbolId(moduleSymbol), i.parent);
}
} else if (i.kind === 271 /* ImportDeclaration */ || i.kind === 270 /* ImportEqualsDeclaration */) {
const moduleSymbol = checker.getSymbolAtLocation(moduleSpecifier);
if (moduleSymbol) {
(importMap || (importMap = createMultiMap())).add(getSymbolId(moduleSymbol), i);
}
}
}
return {
getImportsForExportInfo: ({ moduleSymbol, exportKind, targetFlags, symbol }) => {
if (!(targetFlags & 111551 /* Value */) && isSourceFileJS(importingFile))
return emptyArray;
const matchingDeclarations = importMap == null ? void 0 : importMap.get(getSymbolId(moduleSymbol));
if (!matchingDeclarations)
return emptyArray;
const importKind = getImportKind(importingFile, exportKind, compilerOptions);
return matchingDeclarations.map((declaration) => ({ declaration, importKind, symbol, targetFlags }));
}
};
}
function shouldUseRequire(sourceFile, program) {
if (!isSourceFileJS(sourceFile)) {
return false;
}
if (sourceFile.commonJsModuleIndicator && !sourceFile.externalModuleIndicator)
return true;
if (sourceFile.externalModuleIndicator && !sourceFile.commonJsModuleIndicator)
return false;
const compilerOptions = program.getCompilerOptions();
if (compilerOptions.configFile) {
return getEmitModuleKind(compilerOptions) < 5 /* ES2015 */;
}
for (const otherFile of program.getSourceFiles()) {
if (otherFile === sourceFile || !isSourceFileJS(otherFile) || program.isSourceFileFromExternalLibrary(otherFile))
continue;
if (otherFile.commonJsModuleIndicator && !otherFile.externalModuleIndicator)
return true;
if (otherFile.externalModuleIndicator && !otherFile.commonJsModuleIndicator)
return false;
}
return true;
}
function createGetChecker(program, host) {
return memoizeOne((isFromPackageJson) => isFromPackageJson ? host.getPackageJsonAutoImportProvider().getTypeChecker() : program.getTypeChecker());
}
function getNewImportFixes(program, sourceFile, usagePosition, isValidTypeOnlyUseSite, useRequire, exportInfo, host, preferences, fromCacheOnly) {
const isJs = isSourceFileJS(sourceFile);
const compilerOptions = program.getCompilerOptions();
const moduleSpecifierResolutionHost = createModuleSpecifierResolutionHost(program, host);
const getChecker = createGetChecker(program, host);
const moduleResolution = getEmitModuleResolutionKind(compilerOptions);
const rejectNodeModulesRelativePaths = moduleResolutionUsesNodeModules(moduleResolution);
const getModuleSpecifiers2 = fromCacheOnly ? (moduleSymbol) => ({ moduleSpecifiers: ts_moduleSpecifiers_exports.tryGetModuleSpecifiersFromCache(moduleSymbol, sourceFile, moduleSpecifierResolutionHost, preferences), computedWithoutCache: false }) : (moduleSymbol, checker) => ts_moduleSpecifiers_exports.getModuleSpecifiersWithCacheInfo(moduleSymbol, checker, compilerOptions, sourceFile, moduleSpecifierResolutionHost, preferences);
let computedWithoutCacheCount = 0;
const fixes = flatMap(exportInfo, (exportInfo2, i) => {
const checker = getChecker(exportInfo2.isFromPackageJson);
const { computedWithoutCache, moduleSpecifiers } = getModuleSpecifiers2(exportInfo2.moduleSymbol, checker);
const importedSymbolHasValueMeaning = !!(exportInfo2.targetFlags & 111551 /* Value */);
const addAsTypeOnly = getAddAsTypeOnly(
isValidTypeOnlyUseSite,
/*isForNewImportDeclaration*/
true,
exportInfo2.symbol,
exportInfo2.targetFlags,
checker,
compilerOptions
);
computedWithoutCacheCount += computedWithoutCache ? 1 : 0;
return mapDefined(moduleSpecifiers, (moduleSpecifier) => {
var _a;
if (rejectNodeModulesRelativePaths && pathContainsNodeModules(moduleSpecifier)) {
return void 0;
}
if (!importedSymbolHasValueMeaning && isJs && usagePosition !== void 0) {
return { kind: 1 /* JsdocTypeImport */, moduleSpecifier, usagePosition, exportInfo: exportInfo2, isReExport: i > 0 };
}
const importKind = getImportKind(sourceFile, exportInfo2.exportKind, compilerOptions);
let qualification;
if (usagePosition !== void 0 && importKind === 3 /* CommonJS */ && exportInfo2.exportKind === 0 /* Named */) {
const exportEquals = checker.resolveExternalModuleSymbol(exportInfo2.moduleSymbol);
let namespacePrefix;
if (exportEquals !== exportInfo2.moduleSymbol) {
namespacePrefix = (_a = getDefaultExportInfoWorker(exportEquals, checker, compilerOptions)) == null ? void 0 : _a.name;
}
namespacePrefix || (namespacePrefix = moduleSymbolToValidIdentifier(
exportInfo2.moduleSymbol,
getEmitScriptTarget(compilerOptions),
/*forceCapitalize*/
false
));
qualification = { namespacePrefix, usagePosition };
}
return {
kind: 3 /* AddNew */,
moduleSpecifier,
importKind,
useRequire,
addAsTypeOnly,
exportInfo: exportInfo2,
isReExport: i > 0,
qualification
};
});
});
return { computedWithoutCacheCount, fixes };
}
function getFixesForAddImport(exportInfos, existingImports, program, sourceFile, usagePosition, isValidTypeOnlyUseSite, useRequire, host, preferences, fromCacheOnly) {
const existingDeclaration = firstDefined(existingImports, (info) => newImportInfoFromExistingSpecifier(info, isValidTypeOnlyUseSite, useRequire, program.getTypeChecker(), program.getCompilerOptions()));
return existingDeclaration ? { fixes: [existingDeclaration] } : getNewImportFixes(program, sourceFile, usagePosition, isValidTypeOnlyUseSite, useRequire, exportInfos, host, preferences, fromCacheOnly);
}
function newImportInfoFromExistingSpecifier({ declaration, importKind, symbol, targetFlags }, isValidTypeOnlyUseSite, useRequire, checker, compilerOptions) {
var _a;
const moduleSpecifier = (_a = tryGetModuleSpecifierFromDeclaration(declaration)) == null ? void 0 : _a.text;
if (moduleSpecifier) {
const addAsTypeOnly = useRequire ? 4 /* NotAllowed */ : getAddAsTypeOnly(
isValidTypeOnlyUseSite,
/*isForNewImportDeclaration*/
true,
symbol,
targetFlags,
checker,
compilerOptions
);
return { kind: 3 /* AddNew */, moduleSpecifier, importKind, addAsTypeOnly, useRequire };
}
}
function getFixInfos(context, errorCode, pos, useAutoImportProvider) {
const symbolToken = getTokenAtPosition(context.sourceFile, pos);
let info;
if (errorCode === Diagnostics._0_refers_to_a_UMD_global_but_the_current_file_is_a_module_Consider_adding_an_import_instead.code) {
info = getFixesInfoForUMDImport(context, symbolToken);
} else if (!isIdentifier(symbolToken)) {
return void 0;
} else if (errorCode === Diagnostics._0_cannot_be_used_as_a_value_because_it_was_imported_using_import_type.code) {
const symbolName2 = single(getSymbolNamesToImport(context.sourceFile, context.program.getTypeChecker(), symbolToken, context.program.getCompilerOptions()));
const fix = getTypeOnlyPromotionFix(context.sourceFile, symbolToken, symbolName2, context.program);
return fix && [{ fix, symbolName: symbolName2, errorIdentifierText: symbolToken.text }];
} else {
info = getFixesInfoForNonUMDImport(context, symbolToken, useAutoImportProvider);
}
const packageJsonImportFilter = createPackageJsonImportFilter(context.sourceFile, context.preferences, context.host);
return info && sortFixInfo(info, context.sourceFile, context.program, packageJsonImportFilter, context.host);
}
function sortFixInfo(fixes, sourceFile, program, packageJsonImportFilter, host) {
const _toPath = (fileName) => toPath(fileName, host.getCurrentDirectory(), hostGetCanonicalFileName(host));
return sort(fixes, (a, b) => compareBooleans(!!a.isJsxNamespaceFix, !!b.isJsxNamespaceFix) || compareValues(a.fix.kind, b.fix.kind) || compareModuleSpecifiers(a.fix, b.fix, sourceFile, program, packageJsonImportFilter.allowsImportingSpecifier, _toPath));
}
function getBestFix(fixes, sourceFile, program, packageJsonImportFilter, host) {
if (!some(fixes))
return;
if (fixes[0].kind === 0 /* UseNamespace */ || fixes[0].kind === 2 /* AddToExisting */) {
return fixes[0];
}
return fixes.reduce(
(best, fix) => (
// Takes true branch of conditional if `fix` is better than `best`
compareModuleSpecifiers(
fix,
best,
sourceFile,
program,
packageJsonImportFilter.allowsImportingSpecifier,
(fileName) => toPath(fileName, host.getCurrentDirectory(), hostGetCanonicalFileName(host))
) === -1 /* LessThan */ ? fix : best
)
);
}
function compareModuleSpecifiers(a, b, importingFile, program, allowsImportingSpecifier, toPath3) {
if (a.kind !== 0 /* UseNamespace */ && b.kind !== 0 /* UseNamespace */) {
return compareBooleans(allowsImportingSpecifier(b.moduleSpecifier), allowsImportingSpecifier(a.moduleSpecifier)) || compareNodeCoreModuleSpecifiers(a.moduleSpecifier, b.moduleSpecifier, importingFile, program) || compareBooleans(
isFixPossiblyReExportingImportingFile(a, importingFile, program.getCompilerOptions(), toPath3),
isFixPossiblyReExportingImportingFile(b, importingFile, program.getCompilerOptions(), toPath3)
) || compareNumberOfDirectorySeparators(a.moduleSpecifier, b.moduleSpecifier);
}
return 0 /* EqualTo */;
}
function isFixPossiblyReExportingImportingFile(fix, importingFile, compilerOptions, toPath3) {
var _a;
if (fix.isReExport && ((_a = fix.exportInfo) == null ? void 0 : _a.moduleFileName) && getEmitModuleResolutionKind(compilerOptions) === 2 /* Node10 */ && isIndexFileName(fix.exportInfo.moduleFileName)) {
const reExportDir = toPath3(getDirectoryPath(fix.exportInfo.moduleFileName));
return startsWith(importingFile.path, reExportDir);
}
return false;
}
function isIndexFileName(fileName) {
return getBaseFileName(
fileName,
[".js", ".jsx", ".d.ts", ".ts", ".tsx"],
/*ignoreCase*/
true
) === "index";
}
function compareNodeCoreModuleSpecifiers(a, b, importingFile, program) {
if (startsWith(a, "node:") && !startsWith(b, "node:"))
return shouldUseUriStyleNodeCoreModules(importingFile, program) ? -1 /* LessThan */ : 1 /* GreaterThan */;
if (startsWith(b, "node:") && !startsWith(a, "node:"))
return shouldUseUriStyleNodeCoreModules(importingFile, program) ? 1 /* GreaterThan */ : -1 /* LessThan */;
return 0 /* EqualTo */;
}
function getFixesInfoForUMDImport({ sourceFile, program, host, preferences }, token) {
const checker = program.getTypeChecker();
const umdSymbol = getUmdSymbol(token, checker);
if (!umdSymbol)
return void 0;
const symbol = checker.getAliasedSymbol(umdSymbol);
const symbolName2 = umdSymbol.name;
const exportInfo = [{ symbol: umdSymbol, moduleSymbol: symbol, moduleFileName: void 0, exportKind: 3 /* UMD */, targetFlags: symbol.flags, isFromPackageJson: false }];
const useRequire = shouldUseRequire(sourceFile, program);
const fixes = getImportFixes(
exportInfo,
/*usagePosition*/
void 0,
/*isValidTypeOnlyUseSite*/
false,
useRequire,
program,
sourceFile,
host,
preferences
).fixes;
return fixes.map((fix) => {
var _a;
return { fix, symbolName: symbolName2, errorIdentifierText: (_a = tryCast(token, isIdentifier)) == null ? void 0 : _a.text };
});
}
function getUmdSymbol(token, checker) {
const umdSymbol = isIdentifier(token) ? checker.getSymbolAtLocation(token) : void 0;
if (isUMDExportSymbol(umdSymbol))
return umdSymbol;
const { parent: parent2 } = token;
if (isJsxOpeningLikeElement(parent2) && parent2.tagName === token || isJsxOpeningFragment(parent2)) {
const parentSymbol = checker.resolveName(
checker.getJsxNamespace(parent2),
isJsxOpeningLikeElement(parent2) ? token : parent2,
111551 /* Value */,
/*excludeGlobals*/
false
);
if (isUMDExportSymbol(parentSymbol)) {
return parentSymbol;
}
}
return void 0;
}
function getImportKind(importingFile, exportKind, compilerOptions, forceImportKeyword) {
if (compilerOptions.verbatimModuleSyntax && (getEmitModuleKind(compilerOptions) === 1 /* CommonJS */ || importingFile.impliedNodeFormat === 1 /* CommonJS */)) {
return 3 /* CommonJS */;
}
switch (exportKind) {
case 0 /* Named */:
return 0 /* Named */;
case 1 /* Default */:
return 1 /* Default */;
case 2 /* ExportEquals */:
return getExportEqualsImportKind(importingFile, compilerOptions, !!forceImportKeyword);
case 3 /* UMD */:
return getUmdImportKind(importingFile, compilerOptions, !!forceImportKeyword);
default:
return Debug.assertNever(exportKind);
}
}
function getUmdImportKind(importingFile, compilerOptions, forceImportKeyword) {
if (getAllowSyntheticDefaultImports(compilerOptions)) {
return 1 /* Default */;
}
const moduleKind = getEmitModuleKind(compilerOptions);
switch (moduleKind) {
case 2 /* AMD */:
case 1 /* CommonJS */:
case 3 /* UMD */:
if (isInJSFile(importingFile)) {
return isExternalModule(importingFile) || forceImportKeyword ? 2 /* Namespace */ : 3 /* CommonJS */;
}
return 3 /* CommonJS */;
case 4 /* System */:
case 5 /* ES2015 */:
case 6 /* ES2020 */:
case 7 /* ES2022 */:
case 99 /* ESNext */:
case 0 /* None */:
return 2 /* Namespace */;
case 100 /* Node16 */:
case 199 /* NodeNext */:
return importingFile.impliedNodeFormat === 99 /* ESNext */ ? 2 /* Namespace */ : 3 /* CommonJS */;
default:
return Debug.assertNever(moduleKind, `Unexpected moduleKind ${moduleKind}`);
}
}
function getFixesInfoForNonUMDImport({ sourceFile, program, cancellationToken, host, preferences }, symbolToken, useAutoImportProvider) {
const checker = program.getTypeChecker();
const compilerOptions = program.getCompilerOptions();
return flatMap(getSymbolNamesToImport(sourceFile, checker, symbolToken, compilerOptions), (symbolName2) => {
if (symbolName2 === "default" /* Default */) {
return void 0;
}
const isValidTypeOnlyUseSite = isValidTypeOnlyAliasUseSite(symbolToken);
const useRequire = shouldUseRequire(sourceFile, program);
const exportInfo = getExportInfos(symbolName2, isJSXTagName(symbolToken), getMeaningFromLocation(symbolToken), cancellationToken, sourceFile, program, useAutoImportProvider, host, preferences);
return arrayFrom(
flatMapIterator(exportInfo.values(), (exportInfos) => getImportFixes(exportInfos, symbolToken.getStart(sourceFile), isValidTypeOnlyUseSite, useRequire, program, sourceFile, host, preferences).fixes),
(fix) => ({ fix, symbolName: symbolName2, errorIdentifierText: symbolToken.text, isJsxNamespaceFix: symbolName2 !== symbolToken.text })
);
});
}
function getTypeOnlyPromotionFix(sourceFile, symbolToken, symbolName2, program) {
const checker = program.getTypeChecker();
const symbol = checker.resolveName(
symbolName2,
symbolToken,
111551 /* Value */,
/*excludeGlobals*/
true
);
if (!symbol)
return void 0;
const typeOnlyAliasDeclaration = checker.getTypeOnlyAliasDeclaration(symbol);
if (!typeOnlyAliasDeclaration || getSourceFileOfNode(typeOnlyAliasDeclaration) !== sourceFile)
return void 0;
return { kind: 4 /* PromoteTypeOnly */, typeOnlyAliasDeclaration };
}
function getSymbolNamesToImport(sourceFile, checker, symbolToken, compilerOptions) {
const parent2 = symbolToken.parent;
if ((isJsxOpeningLikeElement(parent2) || isJsxClosingElement(parent2)) && parent2.tagName === symbolToken && jsxModeNeedsExplicitImport(compilerOptions.jsx)) {
const jsxNamespace = checker.getJsxNamespace(sourceFile);
if (needsJsxNamespaceFix(jsxNamespace, symbolToken, checker)) {
const needsComponentNameFix = !isIntrinsicJsxName(symbolToken.text) && !checker.resolveName(
symbolToken.text,
symbolToken,
111551 /* Value */,
/*excludeGlobals*/
false
);
return needsComponentNameFix ? [symbolToken.text, jsxNamespace] : [jsxNamespace];
}
}
return [symbolToken.text];
}
function needsJsxNamespaceFix(jsxNamespace, symbolToken, checker) {
if (isIntrinsicJsxName(symbolToken.text))
return true;
const namespaceSymbol = checker.resolveName(
jsxNamespace,
symbolToken,
111551 /* Value */,
/*excludeGlobals*/
true
);
return !namespaceSymbol || some(namespaceSymbol.declarations, isTypeOnlyImportOrExportDeclaration) && !(namespaceSymbol.flags & 111551 /* Value */);
}
function getExportInfos(symbolName2, isJsxTagName, currentTokenMeaning, cancellationToken, fromFile, program, useAutoImportProvider, host, preferences) {
var _a;
const originalSymbolToExportInfos = createMultiMap();
const packageJsonFilter = createPackageJsonImportFilter(fromFile, preferences, host);
const moduleSpecifierCache = (_a = host.getModuleSpecifierCache) == null ? void 0 : _a.call(host);
const getModuleSpecifierResolutionHost = memoizeOne((isFromPackageJson) => {
return createModuleSpecifierResolutionHost(isFromPackageJson ? host.getPackageJsonAutoImportProvider() : program, host);
});
function addSymbol(moduleSymbol, toFile, exportedSymbol, exportKind, program2, isFromPackageJson) {
const moduleSpecifierResolutionHost = getModuleSpecifierResolutionHost(isFromPackageJson);
if (toFile && isImportableFile(program2, fromFile, toFile, preferences, packageJsonFilter, moduleSpecifierResolutionHost, moduleSpecifierCache) || !toFile && packageJsonFilter.allowsImportingAmbientModule(moduleSymbol, moduleSpecifierResolutionHost)) {
const checker = program2.getTypeChecker();
originalSymbolToExportInfos.add(getUniqueSymbolId(exportedSymbol, checker).toString(), { symbol: exportedSymbol, moduleSymbol, moduleFileName: toFile == null ? void 0 : toFile.fileName, exportKind, targetFlags: skipAlias(exportedSymbol, checker).flags, isFromPackageJson });
}
}
forEachExternalModuleToImportFrom(program, host, preferences, useAutoImportProvider, (moduleSymbol, sourceFile, program2, isFromPackageJson) => {
const checker = program2.getTypeChecker();
cancellationToken.throwIfCancellationRequested();
const compilerOptions = program2.getCompilerOptions();
const defaultInfo = getDefaultLikeExportInfo(moduleSymbol, checker, compilerOptions);
if (defaultInfo && (defaultInfo.name === symbolName2 || moduleSymbolToValidIdentifier(moduleSymbol, getEmitScriptTarget(compilerOptions), isJsxTagName) === symbolName2) && symbolHasMeaning(defaultInfo.resolvedSymbol, currentTokenMeaning)) {
addSymbol(moduleSymbol, sourceFile, defaultInfo.symbol, defaultInfo.exportKind, program2, isFromPackageJson);
}
const exportSymbolWithIdenticalName = checker.tryGetMemberInModuleExportsAndProperties(symbolName2, moduleSymbol);
if (exportSymbolWithIdenticalName && symbolHasMeaning(exportSymbolWithIdenticalName, currentTokenMeaning)) {
addSymbol(moduleSymbol, sourceFile, exportSymbolWithIdenticalName, 0 /* Named */, program2, isFromPackageJson);
}
});
return originalSymbolToExportInfos;
}
function getExportEqualsImportKind(importingFile, compilerOptions, forceImportKeyword) {
const allowSyntheticDefaults = getAllowSyntheticDefaultImports(compilerOptions);
const isJS = isInJSFile(importingFile);
if (!isJS && getEmitModuleKind(compilerOptions) >= 5 /* ES2015 */) {
return allowSyntheticDefaults ? 1 /* Default */ : 2 /* Namespace */;
}
if (isJS) {
return isExternalModule(importingFile) || forceImportKeyword ? allowSyntheticDefaults ? 1 /* Default */ : 2 /* Namespace */ : 3 /* CommonJS */;
}
for (const statement of importingFile.statements) {
if (isImportEqualsDeclaration(statement) && !nodeIsMissing(statement.moduleReference)) {
return 3 /* CommonJS */;
}
}
return allowSyntheticDefaults ? 1 /* Default */ : 3 /* CommonJS */;
}
function codeActionForFix(context, sourceFile, symbolName2, fix, includeSymbolNameInDescription, compilerOptions, preferences) {
let diag2;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (tracker) => {
diag2 = codeActionForFixWorker(tracker, sourceFile, symbolName2, fix, includeSymbolNameInDescription, compilerOptions, preferences);
});
return createCodeFixAction(importFixName, changes, diag2, importFixId, Diagnostics.Add_all_missing_imports);
}
function codeActionForFixWorker(changes, sourceFile, symbolName2, fix, includeSymbolNameInDescription, compilerOptions, preferences) {
const quotePreference = getQuotePreference(sourceFile, preferences);
switch (fix.kind) {
case 0 /* UseNamespace */:
addNamespaceQualifier(changes, sourceFile, fix);
return [Diagnostics.Change_0_to_1, symbolName2, `${fix.namespacePrefix}.${symbolName2}`];
case 1 /* JsdocTypeImport */:
addImportType(changes, sourceFile, fix, quotePreference);
return [Diagnostics.Change_0_to_1, symbolName2, getImportTypePrefix(fix.moduleSpecifier, quotePreference) + symbolName2];
case 2 /* AddToExisting */: {
const { importClauseOrBindingPattern, importKind, addAsTypeOnly, moduleSpecifier } = fix;
doAddExistingFix(
changes,
sourceFile,
importClauseOrBindingPattern,
importKind === 1 /* Default */ ? { name: symbolName2, addAsTypeOnly } : void 0,
importKind === 0 /* Named */ ? [{ name: symbolName2, addAsTypeOnly }] : emptyArray,
preferences
);
const moduleSpecifierWithoutQuotes = stripQuotes(moduleSpecifier);
return includeSymbolNameInDescription ? [Diagnostics.Import_0_from_1, symbolName2, moduleSpecifierWithoutQuotes] : [Diagnostics.Update_import_from_0, moduleSpecifierWithoutQuotes];
}
case 3 /* AddNew */: {
const { importKind, moduleSpecifier, addAsTypeOnly, useRequire, qualification } = fix;
const getDeclarations = useRequire ? getNewRequires : getNewImports;
const defaultImport = importKind === 1 /* Default */ ? { name: symbolName2, addAsTypeOnly } : void 0;
const namedImports = importKind === 0 /* Named */ ? [{ name: symbolName2, addAsTypeOnly }] : void 0;
const namespaceLikeImport = importKind === 2 /* Namespace */ || importKind === 3 /* CommonJS */ ? { importKind, name: (qualification == null ? void 0 : qualification.namespacePrefix) || symbolName2, addAsTypeOnly } : void 0;
insertImports(
changes,
sourceFile,
getDeclarations(
moduleSpecifier,
quotePreference,
defaultImport,
namedImports,
namespaceLikeImport,
compilerOptions
),
/*blankLineBetween*/
true,
preferences
);
if (qualification) {
addNamespaceQualifier(changes, sourceFile, qualification);
}
return includeSymbolNameInDescription ? [Diagnostics.Import_0_from_1, symbolName2, moduleSpecifier] : [Diagnostics.Add_import_from_0, moduleSpecifier];
}
case 4 /* PromoteTypeOnly */: {
const { typeOnlyAliasDeclaration } = fix;
const promotedDeclaration = promoteFromTypeOnly(changes, typeOnlyAliasDeclaration, compilerOptions, sourceFile, preferences);
return promotedDeclaration.kind === 275 /* ImportSpecifier */ ? [Diagnostics.Remove_type_from_import_of_0_from_1, symbolName2, getModuleSpecifierText(promotedDeclaration.parent.parent)] : [Diagnostics.Remove_type_from_import_declaration_from_0, getModuleSpecifierText(promotedDeclaration)];
}
default:
return Debug.assertNever(fix, `Unexpected fix kind ${fix.kind}`);
}
}
function getModuleSpecifierText(promotedDeclaration) {
var _a, _b;
return promotedDeclaration.kind === 270 /* ImportEqualsDeclaration */ ? ((_b = tryCast((_a = tryCast(promotedDeclaration.moduleReference, isExternalModuleReference)) == null ? void 0 : _a.expression, isStringLiteralLike)) == null ? void 0 : _b.text) || promotedDeclaration.moduleReference.getText() : cast(promotedDeclaration.parent.moduleSpecifier, isStringLiteral).text;
}
function promoteFromTypeOnly(changes, aliasDeclaration, compilerOptions, sourceFile, preferences) {
const convertExistingToTypeOnly = importNameElisionDisabled(compilerOptions);
switch (aliasDeclaration.kind) {
case 275 /* ImportSpecifier */:
if (aliasDeclaration.isTypeOnly) {
const sortKind = ts_OrganizeImports_exports.detectImportSpecifierSorting(aliasDeclaration.parent.elements, preferences);
if (aliasDeclaration.parent.elements.length > 1 && sortKind) {
changes.delete(sourceFile, aliasDeclaration);
const newSpecifier = factory.updateImportSpecifier(
aliasDeclaration,
/*isTypeOnly*/
false,
aliasDeclaration.propertyName,
aliasDeclaration.name
);
const comparer = ts_OrganizeImports_exports.getOrganizeImportsComparer(preferences, sortKind === 2 /* CaseInsensitive */);
const insertionIndex = ts_OrganizeImports_exports.getImportSpecifierInsertionIndex(aliasDeclaration.parent.elements, newSpecifier, comparer);
changes.insertImportSpecifierAtIndex(sourceFile, newSpecifier, aliasDeclaration.parent, insertionIndex);
} else {
changes.deleteRange(sourceFile, aliasDeclaration.getFirstToken());
}
return aliasDeclaration;
} else {
Debug.assert(aliasDeclaration.parent.parent.isTypeOnly);
promoteImportClause(aliasDeclaration.parent.parent);
return aliasDeclaration.parent.parent;
}
case 272 /* ImportClause */:
promoteImportClause(aliasDeclaration);
return aliasDeclaration;
case 273 /* NamespaceImport */:
promoteImportClause(aliasDeclaration.parent);
return aliasDeclaration.parent;
case 270 /* ImportEqualsDeclaration */:
changes.deleteRange(sourceFile, aliasDeclaration.getChildAt(1));
return aliasDeclaration;
default:
Debug.failBadSyntaxKind(aliasDeclaration);
}
function promoteImportClause(importClause) {
changes.delete(sourceFile, getTypeKeywordOfTypeOnlyImport(importClause, sourceFile));
if (convertExistingToTypeOnly) {
const namedImports = tryCast(importClause.namedBindings, isNamedImports);
if (namedImports && namedImports.elements.length > 1) {
if (ts_OrganizeImports_exports.detectImportSpecifierSorting(namedImports.elements, preferences) && aliasDeclaration.kind === 275 /* ImportSpecifier */ && namedImports.elements.indexOf(aliasDeclaration) !== 0) {
changes.delete(sourceFile, aliasDeclaration);
changes.insertImportSpecifierAtIndex(sourceFile, aliasDeclaration, namedImports, 0);
}
for (const element of namedImports.elements) {
if (element !== aliasDeclaration && !element.isTypeOnly) {
changes.insertModifierBefore(sourceFile, 156 /* TypeKeyword */, element);
}
}
}
}
}
}
function doAddExistingFix(changes, sourceFile, clause, defaultImport, namedImports, preferences) {
var _a;
if (clause.kind === 205 /* ObjectBindingPattern */) {
if (defaultImport) {
addElementToBindingPattern(clause, defaultImport.name, "default");
}
for (const specifier of namedImports) {
addElementToBindingPattern(
clause,
specifier.name,
/*propertyName*/
void 0
);
}
return;
}
const promoteFromTypeOnly2 = clause.isTypeOnly && some([defaultImport, ...namedImports], (i) => (i == null ? void 0 : i.addAsTypeOnly) === 4 /* NotAllowed */);
const existingSpecifiers = clause.namedBindings && ((_a = tryCast(clause.namedBindings, isNamedImports)) == null ? void 0 : _a.elements);
if (defaultImport) {
Debug.assert(!clause.name, "Cannot add a default import to an import clause that already has one");
changes.insertNodeAt(sourceFile, clause.getStart(sourceFile), factory.createIdentifier(defaultImport.name), { suffix: ", " });
}
if (namedImports.length) {
let ignoreCaseForSorting;
if (typeof preferences.organizeImportsIgnoreCase === "boolean") {
ignoreCaseForSorting = preferences.organizeImportsIgnoreCase;
} else if (existingSpecifiers) {
const targetImportSorting = ts_OrganizeImports_exports.detectImportSpecifierSorting(existingSpecifiers, preferences);
if (targetImportSorting !== 3 /* Both */) {
ignoreCaseForSorting = targetImportSorting === 2 /* CaseInsensitive */;
}
}
if (ignoreCaseForSorting === void 0) {
ignoreCaseForSorting = ts_OrganizeImports_exports.detectSorting(sourceFile, preferences) === 2 /* CaseInsensitive */;
}
const comparer = ts_OrganizeImports_exports.getOrganizeImportsComparer(preferences, ignoreCaseForSorting);
const newSpecifiers = stableSort(
namedImports.map((namedImport) => factory.createImportSpecifier(
(!clause.isTypeOnly || promoteFromTypeOnly2) && needsTypeOnly(namedImport),
/*propertyName*/
void 0,
factory.createIdentifier(namedImport.name)
)),
(s1, s2) => ts_OrganizeImports_exports.compareImportOrExportSpecifiers(s1, s2, comparer)
);
const specifierSort = (existingSpecifiers == null ? void 0 : existingSpecifiers.length) && ts_OrganizeImports_exports.detectImportSpecifierSorting(existingSpecifiers, preferences);
if (specifierSort && !(ignoreCaseForSorting && specifierSort === 1 /* CaseSensitive */)) {
for (const spec of newSpecifiers) {
const insertionIndex = promoteFromTypeOnly2 && !spec.isTypeOnly ? 0 : ts_OrganizeImports_exports.getImportSpecifierInsertionIndex(existingSpecifiers, spec, comparer);
changes.insertImportSpecifierAtIndex(sourceFile, spec, clause.namedBindings, insertionIndex);
}
} else if (existingSpecifiers == null ? void 0 : existingSpecifiers.length) {
for (const spec of newSpecifiers) {
changes.insertNodeInListAfter(sourceFile, last(existingSpecifiers), spec, existingSpecifiers);
}
} else {
if (newSpecifiers.length) {
const namedImports2 = factory.createNamedImports(newSpecifiers);
if (clause.namedBindings) {
changes.replaceNode(sourceFile, clause.namedBindings, namedImports2);
} else {
changes.insertNodeAfter(sourceFile, Debug.checkDefined(clause.name, "Import clause must have either named imports or a default import"), namedImports2);
}
}
}
}
if (promoteFromTypeOnly2) {
changes.delete(sourceFile, getTypeKeywordOfTypeOnlyImport(clause, sourceFile));
if (existingSpecifiers) {
for (const specifier of existingSpecifiers) {
changes.insertModifierBefore(sourceFile, 156 /* TypeKeyword */, specifier);
}
}
}
function addElementToBindingPattern(bindingPattern, name, propertyName) {
const element = factory.createBindingElement(
/*dotDotDotToken*/
void 0,
propertyName,
name
);
if (bindingPattern.elements.length) {
changes.insertNodeInListAfter(sourceFile, last(bindingPattern.elements), element);
} else {
changes.replaceNode(sourceFile, bindingPattern, factory.createObjectBindingPattern([element]));
}
}
}
function addNamespaceQualifier(changes, sourceFile, { namespacePrefix, usagePosition }) {
changes.insertText(sourceFile, usagePosition, namespacePrefix + ".");
}
function addImportType(changes, sourceFile, { moduleSpecifier, usagePosition: position }, quotePreference) {
changes.insertText(sourceFile, position, getImportTypePrefix(moduleSpecifier, quotePreference));
}
function getImportTypePrefix(moduleSpecifier, quotePreference) {
const quote2 = getQuoteFromPreference(quotePreference);
return `import(${quote2}${moduleSpecifier}${quote2}).`;
}
function needsTypeOnly({ addAsTypeOnly }) {
return addAsTypeOnly === 2 /* Required */;
}
function getNewImports(moduleSpecifier, quotePreference, defaultImport, namedImports, namespaceLikeImport, compilerOptions) {
const quotedModuleSpecifier = makeStringLiteral(moduleSpecifier, quotePreference);
let statements;
if (defaultImport !== void 0 || (namedImports == null ? void 0 : namedImports.length)) {
const topLevelTypeOnly = (!defaultImport || needsTypeOnly(defaultImport)) && every(namedImports, needsTypeOnly) || compilerOptions.verbatimModuleSyntax && (defaultImport == null ? void 0 : defaultImport.addAsTypeOnly) !== 4 /* NotAllowed */ && !some(namedImports, (i) => i.addAsTypeOnly === 4 /* NotAllowed */);
statements = combine(statements, makeImport(
defaultImport && factory.createIdentifier(defaultImport.name),
namedImports == null ? void 0 : namedImports.map(({ addAsTypeOnly, name }) => factory.createImportSpecifier(
!topLevelTypeOnly && addAsTypeOnly === 2 /* Required */,
/*propertyName*/
void 0,
factory.createIdentifier(name)
)),
moduleSpecifier,
quotePreference,
topLevelTypeOnly
));
}
if (namespaceLikeImport) {
const declaration = namespaceLikeImport.importKind === 3 /* CommonJS */ ? factory.createImportEqualsDeclaration(
/*modifiers*/
void 0,
needsTypeOnly(namespaceLikeImport),
factory.createIdentifier(namespaceLikeImport.name),
factory.createExternalModuleReference(quotedModuleSpecifier)
) : factory.createImportDeclaration(
/*modifiers*/
void 0,
factory.createImportClause(
needsTypeOnly(namespaceLikeImport),
/*name*/
void 0,
factory.createNamespaceImport(factory.createIdentifier(namespaceLikeImport.name))
),
quotedModuleSpecifier,
/*assertClause*/
void 0
);
statements = combine(statements, declaration);
}
return Debug.checkDefined(statements);
}
function getNewRequires(moduleSpecifier, quotePreference, defaultImport, namedImports, namespaceLikeImport) {
const quotedModuleSpecifier = makeStringLiteral(moduleSpecifier, quotePreference);
let statements;
if (defaultImport || (namedImports == null ? void 0 : namedImports.length)) {
const bindingElements = (namedImports == null ? void 0 : namedImports.map(({ name }) => factory.createBindingElement(
/*dotDotDotToken*/
void 0,
/*propertyName*/
void 0,
name
))) || [];
if (defaultImport) {
bindingElements.unshift(factory.createBindingElement(
/*dotDotDotToken*/
void 0,
"default",
defaultImport.name
));
}
const declaration = createConstEqualsRequireDeclaration(factory.createObjectBindingPattern(bindingElements), quotedModuleSpecifier);
statements = combine(statements, declaration);
}
if (namespaceLikeImport) {
const declaration = createConstEqualsRequireDeclaration(namespaceLikeImport.name, quotedModuleSpecifier);
statements = combine(statements, declaration);
}
return Debug.checkDefined(statements);
}
function createConstEqualsRequireDeclaration(name, quotedModuleSpecifier) {
return factory.createVariableStatement(
/*modifiers*/
void 0,
factory.createVariableDeclarationList(
[
factory.createVariableDeclaration(
typeof name === "string" ? factory.createIdentifier(name) : name,
/*exclamationToken*/
void 0,
/*type*/
void 0,
factory.createCallExpression(
factory.createIdentifier("require"),
/*typeArguments*/
void 0,
[quotedModuleSpecifier]
)
)
],
2 /* Const */
)
);
}
function symbolHasMeaning({ declarations }, meaning) {
return some(declarations, (decl) => !!(getMeaningFromDeclaration(decl) & meaning));
}
function moduleSymbolToValidIdentifier(moduleSymbol, target, forceCapitalize) {
return moduleSpecifierToValidIdentifier(removeFileExtension(stripQuotes(moduleSymbol.name)), target, forceCapitalize);
}
function moduleSpecifierToValidIdentifier(moduleSpecifier, target, forceCapitalize) {
const baseName = getBaseFileName(removeSuffix(moduleSpecifier, "/index"));
let res = "";
let lastCharWasValid = true;
const firstCharCode = baseName.charCodeAt(0);
if (isIdentifierStart(firstCharCode, target)) {
res += String.fromCharCode(firstCharCode);
if (forceCapitalize) {
res = res.toUpperCase();
}
} else {
lastCharWasValid = false;
}
for (let i = 1; i < baseName.length; i++) {
const ch = baseName.charCodeAt(i);
const isValid = isIdentifierPart(ch, target);
if (isValid) {
let char = String.fromCharCode(ch);
if (!lastCharWasValid) {
char = char.toUpperCase();
}
res += char;
}
lastCharWasValid = isValid;
}
return !isStringANonContextualKeyword(res) ? res || "_" : `_${res}`;
}
// src/services/codefixes/fixAddMissingConstraint.ts
var fixId17 = "addMissingConstraint";
var errorCodes19 = [
// We want errors this could be attached to:
// Diagnostics.This_type_parameter_probably_needs_an_extends_0_constraint
Diagnostics.Type_0_is_not_comparable_to_type_1.code,
Diagnostics.Type_0_is_not_assignable_to_type_1_Two_different_types_with_this_name_exist_but_they_are_unrelated.code,
Diagnostics.Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_types_of_the_target_s_properties.code,
Diagnostics.Type_0_is_not_assignable_to_type_1.code,
Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_types_of_the_target_s_properties.code,
Diagnostics.Property_0_is_incompatible_with_index_signature.code,
Diagnostics.Property_0_in_type_1_is_not_assignable_to_type_2.code,
Diagnostics.Type_0_does_not_satisfy_the_constraint_1.code
];
registerCodeFix({
errorCodes: errorCodes19,
getCodeActions(context) {
const { sourceFile, span, program, preferences, host } = context;
const info = getInfo6(program, sourceFile, span);
if (info === void 0)
return;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => addMissingConstraint(t, program, preferences, host, sourceFile, info));
return [createCodeFixAction(fixId17, changes, Diagnostics.Add_extends_constraint, fixId17, Diagnostics.Add_extends_constraint_to_all_type_parameters)];
},
fixIds: [fixId17],
getAllCodeActions: (context) => {
const { program, preferences, host } = context;
const seen = /* @__PURE__ */ new Map();
return createCombinedCodeActions(ts_textChanges_exports.ChangeTracker.with(context, (changes) => {
eachDiagnostic(context, errorCodes19, (diag2) => {
const info = getInfo6(program, diag2.file, createTextSpan(diag2.start, diag2.length));
if (info) {
if (addToSeen(seen, getNodeId(info.declaration))) {
return addMissingConstraint(changes, program, preferences, host, diag2.file, info);
}
}
return void 0;
});
}));
}
});
function getInfo6(program, sourceFile, span) {
const diag2 = find(program.getSemanticDiagnostics(sourceFile), (diag3) => diag3.start === span.start && diag3.length === span.length);
if (diag2 === void 0 || diag2.relatedInformation === void 0)
return;
const related = find(diag2.relatedInformation, (related2) => related2.code === Diagnostics.This_type_parameter_might_need_an_extends_0_constraint.code);
if (related === void 0 || related.file === void 0 || related.start === void 0 || related.length === void 0)
return;
let declaration = findAncestorMatchingSpan(related.file, createTextSpan(related.start, related.length));
if (declaration === void 0)
return;
if (isIdentifier(declaration) && isTypeParameterDeclaration(declaration.parent)) {
declaration = declaration.parent;
}
if (isTypeParameterDeclaration(declaration)) {
if (isMappedTypeNode(declaration.parent))
return;
const token = getTokenAtPosition(sourceFile, span.start);
const checker = program.getTypeChecker();
const constraint = tryGetConstraintType(checker, token) || tryGetConstraintFromDiagnosticMessage(related.messageText);
return { constraint, declaration, token };
}
return void 0;
}
function addMissingConstraint(changes, program, preferences, host, sourceFile, info) {
const { declaration, constraint } = info;
const checker = program.getTypeChecker();
if (isString(constraint)) {
changes.insertText(sourceFile, declaration.name.end, ` extends ${constraint}`);
} else {
const scriptTarget = getEmitScriptTarget(program.getCompilerOptions());
const tracker = getNoopSymbolTrackerWithResolver({ program, host });
const importAdder = createImportAdder(sourceFile, program, preferences, host);
const typeNode = typeToAutoImportableTypeNode(
checker,
importAdder,
constraint,
/*contextNode*/
void 0,
scriptTarget,
/*flags*/
void 0,
tracker
);
if (typeNode) {
changes.replaceNode(sourceFile, declaration, factory.updateTypeParameterDeclaration(
declaration,
/*modifiers*/
void 0,
declaration.name,
typeNode,
declaration.default
));
importAdder.writeFixes(changes);
}
}
}
function tryGetConstraintFromDiagnosticMessage(messageText) {
const [_, constraint] = flattenDiagnosticMessageText(messageText, "\n", 0).match(/`extends (.*)`/) || [];
return constraint;
}
function tryGetConstraintType(checker, node) {
if (isTypeNode(node.parent)) {
return checker.getTypeArgumentConstraint(node.parent);
}
const contextualType = isExpression(node) ? checker.getContextualType(node) : void 0;
return contextualType || checker.getTypeAtLocation(node);
}
// src/services/codefixes/fixOverrideModifier.ts
var fixName = "fixOverrideModifier";
var fixAddOverrideId = "fixAddOverrideModifier";
var fixRemoveOverrideId = "fixRemoveOverrideModifier";
var errorCodes20 = [
Diagnostics.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0.code,
Diagnostics.This_member_cannot_have_an_override_modifier_because_its_containing_class_0_does_not_extend_another_class.code,
Diagnostics.This_member_must_have_an_override_modifier_because_it_overrides_an_abstract_method_that_is_declared_in_the_base_class_0.code,
Diagnostics.This_member_must_have_an_override_modifier_because_it_overrides_a_member_in_the_base_class_0.code,
Diagnostics.This_parameter_property_must_have_an_override_modifier_because_it_overrides_a_member_in_base_class_0.code,
Diagnostics.This_member_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_class_0.code,
Diagnostics.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_its_containing_class_0_does_not_extend_another_class.code,
Diagnostics.This_parameter_property_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_class_0.code,
Diagnostics.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base_class_0.code
];
var errorCodeFixIdMap = {
// case #1:
[Diagnostics.This_member_must_have_an_override_modifier_because_it_overrides_a_member_in_the_base_class_0.code]: {
descriptions: Diagnostics.Add_override_modifier,
fixId: fixAddOverrideId,
fixAllDescriptions: Diagnostics.Add_all_missing_override_modifiers
},
[Diagnostics.This_member_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_class_0.code]: {
descriptions: Diagnostics.Add_override_modifier,
fixId: fixAddOverrideId,
fixAllDescriptions: Diagnostics.Add_all_missing_override_modifiers
},
// case #2:
[Diagnostics.This_member_cannot_have_an_override_modifier_because_its_containing_class_0_does_not_extend_another_class.code]: {
descriptions: Diagnostics.Remove_override_modifier,
fixId: fixRemoveOverrideId,
fixAllDescriptions: Diagnostics.Remove_all_unnecessary_override_modifiers
},
[Diagnostics.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_its_containing_class_0_does_not_extend_another_class.code]: {
descriptions: Diagnostics.Remove_override_modifier,
fixId: fixRemoveOverrideId,
fixAllDescriptions: Diagnostics.Remove_override_modifier
},
// case #3:
[Diagnostics.This_parameter_property_must_have_an_override_modifier_because_it_overrides_a_member_in_base_class_0.code]: {
descriptions: Diagnostics.Add_override_modifier,
fixId: fixAddOverrideId,
fixAllDescriptions: Diagnostics.Add_all_missing_override_modifiers
},
[Diagnostics.This_parameter_property_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_class_0.code]: {
descriptions: Diagnostics.Add_override_modifier,
fixId: fixAddOverrideId,
fixAllDescriptions: Diagnostics.Add_all_missing_override_modifiers
},
// case #4:
[Diagnostics.This_member_must_have_an_override_modifier_because_it_overrides_an_abstract_method_that_is_declared_in_the_base_class_0.code]: {
descriptions: Diagnostics.Add_override_modifier,
fixId: fixAddOverrideId,
fixAllDescriptions: Diagnostics.Remove_all_unnecessary_override_modifiers
},
// case #5:
[Diagnostics.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0.code]: {
descriptions: Diagnostics.Remove_override_modifier,
fixId: fixRemoveOverrideId,
fixAllDescriptions: Diagnostics.Remove_all_unnecessary_override_modifiers
},
[Diagnostics.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base_class_0.code]: {
descriptions: Diagnostics.Remove_override_modifier,
fixId: fixRemoveOverrideId,
fixAllDescriptions: Diagnostics.Remove_all_unnecessary_override_modifiers
}
};
registerCodeFix({
errorCodes: errorCodes20,
getCodeActions: function getCodeActionsToFixOverrideModifierIssues(context) {
const { errorCode, span } = context;
const info = errorCodeFixIdMap[errorCode];
if (!info)
return emptyArray;
const { descriptions, fixId: fixId52, fixAllDescriptions } = info;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (changes2) => dispatchChanges(changes2, context, errorCode, span.start));
return [
createCodeFixActionMaybeFixAll(fixName, changes, descriptions, fixId52, fixAllDescriptions)
];
},
fixIds: [fixName, fixAddOverrideId, fixRemoveOverrideId],
getAllCodeActions: (context) => codeFixAll(context, errorCodes20, (changes, diag2) => {
const { code, start: start2 } = diag2;
const info = errorCodeFixIdMap[code];
if (!info || info.fixId !== context.fixId) {
return;
}
dispatchChanges(changes, context, code, start2);
})
});
function dispatchChanges(changeTracker, context, errorCode, pos) {
switch (errorCode) {
case Diagnostics.This_member_must_have_an_override_modifier_because_it_overrides_a_member_in_the_base_class_0.code:
case Diagnostics.This_member_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_class_0.code:
case Diagnostics.This_member_must_have_an_override_modifier_because_it_overrides_an_abstract_method_that_is_declared_in_the_base_class_0.code:
case Diagnostics.This_parameter_property_must_have_an_override_modifier_because_it_overrides_a_member_in_base_class_0.code:
case Diagnostics.This_parameter_property_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_class_0.code:
return doAddOverrideModifierChange(changeTracker, context.sourceFile, pos);
case Diagnostics.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0.code:
case Diagnostics.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base_class_0.code:
case Diagnostics.This_member_cannot_have_an_override_modifier_because_its_containing_class_0_does_not_extend_another_class.code:
case Diagnostics.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_its_containing_class_0_does_not_extend_another_class.code:
return doRemoveOverrideModifierChange(changeTracker, context.sourceFile, pos);
default:
Debug.fail("Unexpected error code: " + errorCode);
}
}
function doAddOverrideModifierChange(changeTracker, sourceFile, pos) {
const classElement = findContainerClassElementLike(sourceFile, pos);
if (isSourceFileJS(sourceFile)) {
changeTracker.addJSDocTags(sourceFile, classElement, [factory.createJSDocOverrideTag(factory.createIdentifier("override"))]);
return;
}
const modifiers = classElement.modifiers || emptyArray;
const staticModifier = find(modifiers, isStaticModifier);
const abstractModifier = find(modifiers, isAbstractModifier);
const accessibilityModifier = find(modifiers, (m) => isAccessibilityModifier(m.kind));
const lastDecorator = findLast(modifiers, isDecorator);
const modifierPos = abstractModifier ? abstractModifier.end : staticModifier ? staticModifier.end : accessibilityModifier ? accessibilityModifier.end : lastDecorator ? skipTrivia(sourceFile.text, lastDecorator.end) : classElement.getStart(sourceFile);
const options = accessibilityModifier || staticModifier || abstractModifier ? { prefix: " " } : { suffix: " " };
changeTracker.insertModifierAt(sourceFile, modifierPos, 163 /* OverrideKeyword */, options);
}
function doRemoveOverrideModifierChange(changeTracker, sourceFile, pos) {
const classElement = findContainerClassElementLike(sourceFile, pos);
if (isSourceFileJS(sourceFile)) {
changeTracker.filterJSDocTags(sourceFile, classElement, not(isJSDocOverrideTag));
return;
}
const overrideModifier = find(classElement.modifiers, isOverrideModifier);
Debug.assertIsDefined(overrideModifier);
changeTracker.deleteModifier(sourceFile, overrideModifier);
}
function isClassElementLikeHasJSDoc(node) {
switch (node.kind) {
case 175 /* Constructor */:
case 171 /* PropertyDeclaration */:
case 173 /* MethodDeclaration */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
return true;
case 168 /* Parameter */:
return isParameterPropertyDeclaration(node, node.parent);
default:
return false;
}
}
function findContainerClassElementLike(sourceFile, pos) {
const token = getTokenAtPosition(sourceFile, pos);
const classElement = findAncestor(token, (node) => {
if (isClassLike(node))
return "quit";
return isClassElementLikeHasJSDoc(node);
});
Debug.assert(classElement && isClassElementLikeHasJSDoc(classElement));
return classElement;
}
// src/services/codefixes/fixNoPropertyAccessFromIndexSignature.ts
var fixId18 = "fixNoPropertyAccessFromIndexSignature";
var errorCodes21 = [
Diagnostics.Property_0_comes_from_an_index_signature_so_it_must_be_accessed_with_0.code
];
registerCodeFix({
errorCodes: errorCodes21,
fixIds: [fixId18],
getCodeActions(context) {
const { sourceFile, span, preferences } = context;
const property = getPropertyAccessExpression(sourceFile, span.start);
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange14(t, context.sourceFile, property, preferences));
return [createCodeFixAction(fixId18, changes, [Diagnostics.Use_element_access_for_0, property.name.text], fixId18, Diagnostics.Use_element_access_for_all_undeclared_properties)];
},
getAllCodeActions: (context) => codeFixAll(context, errorCodes21, (changes, diag2) => doChange14(changes, diag2.file, getPropertyAccessExpression(diag2.file, diag2.start), context.preferences))
});
function doChange14(changes, sourceFile, node, preferences) {
const quotePreference = getQuotePreference(sourceFile, preferences);
const argumentsExpression = factory.createStringLiteral(node.name.text, quotePreference === 0 /* Single */);
changes.replaceNode(
sourceFile,
node,
isPropertyAccessChain(node) ? factory.createElementAccessChain(node.expression, node.questionDotToken, argumentsExpression) : factory.createElementAccessExpression(node.expression, argumentsExpression)
);
}
function getPropertyAccessExpression(sourceFile, pos) {
return cast(getTokenAtPosition(sourceFile, pos).parent, isPropertyAccessExpression);
}
// src/services/codefixes/fixImplicitThis.ts
var fixId19 = "fixImplicitThis";
var errorCodes22 = [Diagnostics.this_implicitly_has_type_any_because_it_does_not_have_a_type_annotation.code];
registerCodeFix({
errorCodes: errorCodes22,
getCodeActions: function getCodeActionsToFixImplicitThis(context) {
const { sourceFile, program, span } = context;
let diagnostic;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => {
diagnostic = doChange15(t, sourceFile, span.start, program.getTypeChecker());
});
return diagnostic ? [createCodeFixAction(fixId19, changes, diagnostic, fixId19, Diagnostics.Fix_all_implicit_this_errors)] : emptyArray;
},
fixIds: [fixId19],
getAllCodeActions: (context) => codeFixAll(context, errorCodes22, (changes, diag2) => {
doChange15(changes, diag2.file, diag2.start, context.program.getTypeChecker());
})
});
function doChange15(changes, sourceFile, pos, checker) {
const token = getTokenAtPosition(sourceFile, pos);
if (!isThis(token))
return void 0;
const fn = getThisContainer(
token,
/*includeArrowFunctions*/
false,
/*includeClassComputedPropertyName*/
false
);
if (!isFunctionDeclaration(fn) && !isFunctionExpression(fn))
return void 0;
if (!isSourceFile(getThisContainer(
fn,
/*includeArrowFunctions*/
false,
/*includeClassComputedPropertyName*/
false
))) {
const fnKeyword = Debug.checkDefined(findChildOfKind(fn, 100 /* FunctionKeyword */, sourceFile));
const { name } = fn;
const body = Debug.checkDefined(fn.body);
if (isFunctionExpression(fn)) {
if (name && ts_FindAllReferences_exports.Core.isSymbolReferencedInFile(name, checker, sourceFile, body)) {
return void 0;
}
changes.delete(sourceFile, fnKeyword);
if (name) {
changes.delete(sourceFile, name);
}
changes.insertText(sourceFile, body.pos, " =>");
return [Diagnostics.Convert_function_expression_0_to_arrow_function, name ? name.text : ANONYMOUS];
} else {
changes.replaceNode(sourceFile, fnKeyword, factory.createToken(87 /* ConstKeyword */));
changes.insertText(sourceFile, name.end, " = ");
changes.insertText(sourceFile, body.pos, " =>");
return [Diagnostics.Convert_function_declaration_0_to_arrow_function, name.text];
}
}
}
// src/services/codefixes/fixImportNonExportedMember.ts
var fixId20 = "fixImportNonExportedMember";
var errorCodes23 = [
Diagnostics.Module_0_declares_1_locally_but_it_is_not_exported.code
];
registerCodeFix({
errorCodes: errorCodes23,
fixIds: [fixId20],
getCodeActions(context) {
const { sourceFile, span, program } = context;
const info = getInfo7(sourceFile, span.start, program);
if (info === void 0)
return void 0;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange16(t, program, info));
return [createCodeFixAction(fixId20, changes, [Diagnostics.Export_0_from_module_1, info.exportName.node.text, info.moduleSpecifier], fixId20, Diagnostics.Export_all_referenced_locals)];
},
getAllCodeActions(context) {
const { program } = context;
return createCombinedCodeActions(ts_textChanges_exports.ChangeTracker.with(context, (changes) => {
const exports = /* @__PURE__ */ new Map();
eachDiagnostic(context, errorCodes23, (diag2) => {
const info = getInfo7(diag2.file, diag2.start, program);
if (info === void 0)
return void 0;
const { exportName, node, moduleSourceFile } = info;
if (tryGetExportDeclaration(moduleSourceFile, exportName.isTypeOnly) === void 0 && canHaveExportModifier(node)) {
changes.insertExportModifier(moduleSourceFile, node);
} else {
const moduleExports = exports.get(moduleSourceFile) || { typeOnlyExports: [], exports: [] };
if (exportName.isTypeOnly) {
moduleExports.typeOnlyExports.push(exportName);
} else {
moduleExports.exports.push(exportName);
}
exports.set(moduleSourceFile, moduleExports);
}
});
exports.forEach((moduleExports, moduleSourceFile) => {
const exportDeclaration = tryGetExportDeclaration(
moduleSourceFile,
/*isTypeOnly*/
true
);
if (exportDeclaration && exportDeclaration.isTypeOnly) {
doChanges(changes, program, moduleSourceFile, moduleExports.typeOnlyExports, exportDeclaration);
doChanges(changes, program, moduleSourceFile, moduleExports.exports, tryGetExportDeclaration(
moduleSourceFile,
/*isTypeOnly*/
false
));
} else {
doChanges(changes, program, moduleSourceFile, [...moduleExports.exports, ...moduleExports.typeOnlyExports], exportDeclaration);
}
});
}));
}
});
function getInfo7(sourceFile, pos, program) {
var _a;
const token = getTokenAtPosition(sourceFile, pos);
if (isIdentifier(token)) {
const importDeclaration = findAncestor(token, isImportDeclaration);
if (importDeclaration === void 0)
return void 0;
const moduleSpecifier = isStringLiteral(importDeclaration.moduleSpecifier) ? importDeclaration.moduleSpecifier.text : void 0;
if (moduleSpecifier === void 0)
return void 0;
const resolvedModule = getResolvedModule(
sourceFile,
moduleSpecifier,
/*mode*/
void 0
);
if (resolvedModule === void 0)
return void 0;
const moduleSourceFile = program.getSourceFile(resolvedModule.resolvedFileName);
if (moduleSourceFile === void 0 || isSourceFileFromLibrary(program, moduleSourceFile))
return void 0;
const moduleSymbol = moduleSourceFile.symbol;
const locals = (_a = tryCast(moduleSymbol.valueDeclaration, canHaveLocals)) == null ? void 0 : _a.locals;
if (locals === void 0)
return void 0;
const localSymbol = locals.get(token.escapedText);
if (localSymbol === void 0)
return void 0;
const node = getNodeOfSymbol(localSymbol);
if (node === void 0)
return void 0;
const exportName = { node: token, isTypeOnly: isTypeDeclaration(node) };
return { exportName, node, moduleSourceFile, moduleSpecifier };
}
return void 0;
}
function doChange16(changes, program, { exportName, node, moduleSourceFile }) {
const exportDeclaration = tryGetExportDeclaration(moduleSourceFile, exportName.isTypeOnly);
if (exportDeclaration) {
updateExport(changes, program, moduleSourceFile, exportDeclaration, [exportName]);
} else if (canHaveExportModifier(node)) {
changes.insertExportModifier(moduleSourceFile, node);
} else {
createExport(changes, program, moduleSourceFile, [exportName]);
}
}
function doChanges(changes, program, sourceFile, moduleExports, node) {
if (length(moduleExports)) {
if (node) {
updateExport(changes, program, sourceFile, node, moduleExports);
} else {
createExport(changes, program, sourceFile, moduleExports);
}
}
}
function tryGetExportDeclaration(sourceFile, isTypeOnly) {
const predicate = (node) => isExportDeclaration(node) && (isTypeOnly && node.isTypeOnly || !node.isTypeOnly);
return findLast(sourceFile.statements, predicate);
}
function updateExport(changes, program, sourceFile, node, names) {
const namedExports = node.exportClause && isNamedExports(node.exportClause) ? node.exportClause.elements : factory.createNodeArray([]);
const allowTypeModifier = !node.isTypeOnly && !!(getIsolatedModules(program.getCompilerOptions()) || find(namedExports, (e) => e.isTypeOnly));
changes.replaceNode(
sourceFile,
node,
factory.updateExportDeclaration(
node,
node.modifiers,
node.isTypeOnly,
factory.createNamedExports(
factory.createNodeArray(
[...namedExports, ...createExportSpecifiers(names, allowTypeModifier)],
/*hasTrailingComma*/
namedExports.hasTrailingComma
)
),
node.moduleSpecifier,
node.assertClause
)
);
}
function createExport(changes, program, sourceFile, names) {
changes.insertNodeAtEndOfScope(
sourceFile,
sourceFile,
factory.createExportDeclaration(
/*modifiers*/
void 0,
/*isTypeOnly*/
false,
factory.createNamedExports(createExportSpecifiers(
names,
/*allowTypeModifier*/
getIsolatedModules(program.getCompilerOptions())
)),
/*moduleSpecifier*/
void 0,
/*assertClause*/
void 0
)
);
}
function createExportSpecifiers(names, allowTypeModifier) {
return factory.createNodeArray(map(names, (n) => factory.createExportSpecifier(
allowTypeModifier && n.isTypeOnly,
/*propertyName*/
void 0,
n.node
)));
}
function getNodeOfSymbol(symbol) {
if (symbol.valueDeclaration === void 0) {
return firstOrUndefined(symbol.declarations);
}
const declaration = symbol.valueDeclaration;
const variableStatement = isVariableDeclaration(declaration) ? tryCast(declaration.parent.parent, isVariableStatement) : void 0;
return variableStatement && length(variableStatement.declarationList.declarations) === 1 ? variableStatement : declaration;
}
// src/services/codefixes/fixIncorrectNamedTupleSyntax.ts
var fixId21 = "fixIncorrectNamedTupleSyntax";
var errorCodes24 = [
Diagnostics.A_labeled_tuple_element_is_declared_as_optional_with_a_question_mark_after_the_name_and_before_the_colon_rather_than_after_the_type.code,
Diagnostics.A_labeled_tuple_element_is_declared_as_rest_with_a_before_the_name_rather_than_before_the_type.code
];
registerCodeFix({
errorCodes: errorCodes24,
getCodeActions: function getCodeActionsToFixIncorrectNamedTupleSyntax(context) {
const { sourceFile, span } = context;
const namedTupleMember = getNamedTupleMember(sourceFile, span.start);
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange17(t, sourceFile, namedTupleMember));
return [createCodeFixAction(fixId21, changes, Diagnostics.Move_labeled_tuple_element_modifiers_to_labels, fixId21, Diagnostics.Move_labeled_tuple_element_modifiers_to_labels)];
},
fixIds: [fixId21]
});
function getNamedTupleMember(sourceFile, pos) {
const token = getTokenAtPosition(sourceFile, pos);
return findAncestor(token, (t) => t.kind === 201 /* NamedTupleMember */);
}
function doChange17(changes, sourceFile, namedTupleMember) {
if (!namedTupleMember) {
return;
}
let unwrappedType = namedTupleMember.type;
let sawOptional = false;
let sawRest = false;
while (unwrappedType.kind === 189 /* OptionalType */ || unwrappedType.kind === 190 /* RestType */ || unwrappedType.kind === 195 /* ParenthesizedType */) {
if (unwrappedType.kind === 189 /* OptionalType */) {
sawOptional = true;
} else if (unwrappedType.kind === 190 /* RestType */) {
sawRest = true;
}
unwrappedType = unwrappedType.type;
}
const updated = factory.updateNamedTupleMember(
namedTupleMember,
namedTupleMember.dotDotDotToken || (sawRest ? factory.createToken(26 /* DotDotDotToken */) : void 0),
namedTupleMember.name,
namedTupleMember.questionToken || (sawOptional ? factory.createToken(58 /* QuestionToken */) : void 0),
unwrappedType
);
if (updated === namedTupleMember) {
return;
}
changes.replaceNode(sourceFile, namedTupleMember, updated);
}
// src/services/codefixes/fixSpelling.ts
var fixId22 = "fixSpelling";
var errorCodes25 = [
Diagnostics.Property_0_does_not_exist_on_type_1_Did_you_mean_2.code,
Diagnostics.Property_0_may_not_exist_on_type_1_Did_you_mean_2.code,
Diagnostics.Cannot_find_name_0_Did_you_mean_1.code,
Diagnostics.Could_not_find_name_0_Did_you_mean_1.code,
Diagnostics.Cannot_find_namespace_0_Did_you_mean_1.code,
Diagnostics.Cannot_find_name_0_Did_you_mean_the_instance_member_this_0.code,
Diagnostics.Cannot_find_name_0_Did_you_mean_the_static_member_1_0.code,
Diagnostics._0_has_no_exported_member_named_1_Did_you_mean_2.code,
Diagnostics.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0_Did_you_mean_1.code,
Diagnostics.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base_class_0_Did_you_mean_1.code,
// for JSX class components
Diagnostics.No_overload_matches_this_call.code,
// for JSX FC
Diagnostics.Type_0_is_not_assignable_to_type_1.code
];
registerCodeFix({
errorCodes: errorCodes25,
getCodeActions(context) {
const { sourceFile, errorCode } = context;
const info = getInfo8(sourceFile, context.span.start, context, errorCode);
if (!info)
return void 0;
const { node, suggestedSymbol } = info;
const target = getEmitScriptTarget(context.host.getCompilationSettings());
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange18(t, sourceFile, node, suggestedSymbol, target));
return [createCodeFixAction("spelling", changes, [Diagnostics.Change_spelling_to_0, symbolName(suggestedSymbol)], fixId22, Diagnostics.Fix_all_detected_spelling_errors)];
},
fixIds: [fixId22],
getAllCodeActions: (context) => codeFixAll(context, errorCodes25, (changes, diag2) => {
const info = getInfo8(diag2.file, diag2.start, context, diag2.code);
const target = getEmitScriptTarget(context.host.getCompilationSettings());
if (info)
doChange18(changes, context.sourceFile, info.node, info.suggestedSymbol, target);
})
});
function getInfo8(sourceFile, pos, context, errorCode) {
const node = getTokenAtPosition(sourceFile, pos);
const parent2 = node.parent;
if ((errorCode === Diagnostics.No_overload_matches_this_call.code || errorCode === Diagnostics.Type_0_is_not_assignable_to_type_1.code) && !isJsxAttribute(parent2))
return void 0;
const checker = context.program.getTypeChecker();
let suggestedSymbol;
if (isPropertyAccessExpression(parent2) && parent2.name === node) {
Debug.assert(isMemberName(node), "Expected an identifier for spelling (property access)");
let containingType = checker.getTypeAtLocation(parent2.expression);
if (parent2.flags & 32 /* OptionalChain */) {
containingType = checker.getNonNullableType(containingType);
}
suggestedSymbol = checker.getSuggestedSymbolForNonexistentProperty(node, containingType);
} else if (isBinaryExpression(parent2) && parent2.operatorToken.kind === 103 /* InKeyword */ && parent2.left === node && isPrivateIdentifier(node)) {
const receiverType = checker.getTypeAtLocation(parent2.right);
suggestedSymbol = checker.getSuggestedSymbolForNonexistentProperty(node, receiverType);
} else if (isQualifiedName(parent2) && parent2.right === node) {
const symbol = checker.getSymbolAtLocation(parent2.left);
if (symbol && symbol.flags & 1536 /* Module */) {
suggestedSymbol = checker.getSuggestedSymbolForNonexistentModule(parent2.right, symbol);
}
} else if (isImportSpecifier(parent2) && parent2.name === node) {
Debug.assertNode(node, isIdentifier, "Expected an identifier for spelling (import)");
const importDeclaration = findAncestor(node, isImportDeclaration);
const resolvedSourceFile = getResolvedSourceFileFromImportDeclaration(sourceFile, context, importDeclaration);
if (resolvedSourceFile && resolvedSourceFile.symbol) {
suggestedSymbol = checker.getSuggestedSymbolForNonexistentModule(node, resolvedSourceFile.symbol);
}
} else if (isJsxAttribute(parent2) && parent2.name === node) {
Debug.assertNode(node, isIdentifier, "Expected an identifier for JSX attribute");
const tag = findAncestor(node, isJsxOpeningLikeElement);
const props = checker.getContextualTypeForArgumentAtIndex(tag, 0);
suggestedSymbol = checker.getSuggestedSymbolForNonexistentJSXAttribute(node, props);
} else if (hasSyntacticModifier(parent2, 16384 /* Override */) && isClassElement(parent2) && parent2.name === node) {
const baseDeclaration = findAncestor(node, isClassLike);
const baseTypeNode = baseDeclaration ? getEffectiveBaseTypeNode(baseDeclaration) : void 0;
const baseType = baseTypeNode ? checker.getTypeAtLocation(baseTypeNode) : void 0;
if (baseType) {
suggestedSymbol = checker.getSuggestedSymbolForNonexistentClassMember(getTextOfNode(node), baseType);
}
} else {
const meaning = getMeaningFromLocation(node);
const name = getTextOfNode(node);
Debug.assert(name !== void 0, "name should be defined");
suggestedSymbol = checker.getSuggestedSymbolForNonexistentSymbol(node, name, convertSemanticMeaningToSymbolFlags(meaning));
}
return suggestedSymbol === void 0 ? void 0 : { node, suggestedSymbol };
}
function doChange18(changes, sourceFile, node, suggestedSymbol, target) {
const suggestion = symbolName(suggestedSymbol);
if (!isIdentifierText(suggestion, target) && isPropertyAccessExpression(node.parent)) {
const valDecl = suggestedSymbol.valueDeclaration;
if (valDecl && isNamedDeclaration(valDecl) && isPrivateIdentifier(valDecl.name)) {
changes.replaceNode(sourceFile, node, factory.createIdentifier(suggestion));
} else {
changes.replaceNode(sourceFile, node.parent, factory.createElementAccessExpression(node.parent.expression, factory.createStringLiteral(suggestion)));
}
} else {
changes.replaceNode(sourceFile, node, factory.createIdentifier(suggestion));
}
}
function convertSemanticMeaningToSymbolFlags(meaning) {
let flags = 0;
if (meaning & 4 /* Namespace */) {
flags |= 1920 /* Namespace */;
}
if (meaning & 2 /* Type */) {
flags |= 788968 /* Type */;
}
if (meaning & 1 /* Value */) {
flags |= 111551 /* Value */;
}
return flags;
}
function getResolvedSourceFileFromImportDeclaration(sourceFile, context, importDeclaration) {
if (!importDeclaration || !isStringLiteralLike(importDeclaration.moduleSpecifier))
return void 0;
const resolvedModule = getResolvedModule(sourceFile, importDeclaration.moduleSpecifier.text, getModeForUsageLocation(sourceFile, importDeclaration.moduleSpecifier));
if (!resolvedModule)
return void 0;
return context.program.getSourceFile(resolvedModule.resolvedFileName);
}
// src/services/codefixes/returnValueCorrect.ts
var fixId23 = "returnValueCorrect";
var fixIdAddReturnStatement = "fixAddReturnStatement";
var fixRemoveBracesFromArrowFunctionBody = "fixRemoveBracesFromArrowFunctionBody";
var fixIdWrapTheBlockWithParen = "fixWrapTheBlockWithParen";
var errorCodes26 = [
Diagnostics.A_function_whose_declared_type_is_neither_undefined_void_nor_any_must_return_a_value.code,
Diagnostics.Type_0_is_not_assignable_to_type_1.code,
Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1.code
];
registerCodeFix({
errorCodes: errorCodes26,
fixIds: [fixIdAddReturnStatement, fixRemoveBracesFromArrowFunctionBody, fixIdWrapTheBlockWithParen],
getCodeActions: function getCodeActionsToCorrectReturnValue(context) {
const { program, sourceFile, span: { start: start2 }, errorCode } = context;
const info = getInfo9(program.getTypeChecker(), sourceFile, start2, errorCode);
if (!info)
return void 0;
if (info.kind === 0 /* MissingReturnStatement */) {
return append(
[getActionForfixAddReturnStatement(context, info.expression, info.statement)],
isArrowFunction(info.declaration) ? getActionForFixRemoveBracesFromArrowFunctionBody(context, info.declaration, info.expression, info.commentSource) : void 0
);
} else {
return [getActionForfixWrapTheBlockWithParen(context, info.declaration, info.expression)];
}
},
getAllCodeActions: (context) => codeFixAll(context, errorCodes26, (changes, diag2) => {
const info = getInfo9(context.program.getTypeChecker(), diag2.file, diag2.start, diag2.code);
if (!info)
return void 0;
switch (context.fixId) {
case fixIdAddReturnStatement:
addReturnStatement(changes, diag2.file, info.expression, info.statement);
break;
case fixRemoveBracesFromArrowFunctionBody:
if (!isArrowFunction(info.declaration))
return void 0;
removeBlockBodyBrace(
changes,
diag2.file,
info.declaration,
info.expression,
info.commentSource,
/*withParen*/
false
);
break;
case fixIdWrapTheBlockWithParen:
if (!isArrowFunction(info.declaration))
return void 0;
wrapBlockWithParen(changes, diag2.file, info.declaration, info.expression);
break;
default:
Debug.fail(JSON.stringify(context.fixId));
}
})
});
function createObjectTypeFromLabeledExpression(checker, label, expression) {
const member = checker.createSymbol(4 /* Property */, label.escapedText);
member.links.type = checker.getTypeAtLocation(expression);
const members = createSymbolTable([member]);
return checker.createAnonymousType(
/*symbol*/
void 0,
members,
[],
[],
[]
);
}
function getFixInfo(checker, declaration, expectType, isFunctionType) {
if (!declaration.body || !isBlock(declaration.body) || length(declaration.body.statements) !== 1)
return void 0;
const firstStatement = first(declaration.body.statements);
if (isExpressionStatement(firstStatement) && checkFixedAssignableTo(checker, declaration, checker.getTypeAtLocation(firstStatement.expression), expectType, isFunctionType)) {
return {
declaration,
kind: 0 /* MissingReturnStatement */,
expression: firstStatement.expression,
statement: firstStatement,
commentSource: firstStatement.expression
};
} else if (isLabeledStatement(firstStatement) && isExpressionStatement(firstStatement.statement)) {
const node = factory.createObjectLiteralExpression([factory.createPropertyAssignment(firstStatement.label, firstStatement.statement.expression)]);
const nodeType = createObjectTypeFromLabeledExpression(checker, firstStatement.label, firstStatement.statement.expression);
if (checkFixedAssignableTo(checker, declaration, nodeType, expectType, isFunctionType)) {
return isArrowFunction(declaration) ? {
declaration,
kind: 1 /* MissingParentheses */,
expression: node,
statement: firstStatement,
commentSource: firstStatement.statement.expression
} : {
declaration,
kind: 0 /* MissingReturnStatement */,
expression: node,
statement: firstStatement,
commentSource: firstStatement.statement.expression
};
}
} else if (isBlock(firstStatement) && length(firstStatement.statements) === 1) {
const firstBlockStatement = first(firstStatement.statements);
if (isLabeledStatement(firstBlockStatement) && isExpressionStatement(firstBlockStatement.statement)) {
const node = factory.createObjectLiteralExpression([factory.createPropertyAssignment(firstBlockStatement.label, firstBlockStatement.statement.expression)]);
const nodeType = createObjectTypeFromLabeledExpression(checker, firstBlockStatement.label, firstBlockStatement.statement.expression);
if (checkFixedAssignableTo(checker, declaration, nodeType, expectType, isFunctionType)) {
return {
declaration,
kind: 0 /* MissingReturnStatement */,
expression: node,
statement: firstStatement,
commentSource: firstBlockStatement
};
}
}
}
return void 0;
}
function checkFixedAssignableTo(checker, declaration, exprType, type, isFunctionType) {
if (isFunctionType) {
const sig = checker.getSignatureFromDeclaration(declaration);
if (sig) {
if (hasSyntacticModifier(declaration, 512 /* Async */)) {
exprType = checker.createPromiseType(exprType);
}
const newSig = checker.createSignature(
declaration,
sig.typeParameters,
sig.thisParameter,
sig.parameters,
exprType,
/*typePredicate*/
void 0,
sig.minArgumentCount,
sig.flags
);
exprType = checker.createAnonymousType(
/*symbol*/
void 0,
createSymbolTable(),
[newSig],
[],
[]
);
} else {
exprType = checker.getAnyType();
}
}
return checker.isTypeAssignableTo(exprType, type);
}
function getInfo9(checker, sourceFile, position, errorCode) {
const node = getTokenAtPosition(sourceFile, position);
if (!node.parent)
return void 0;
const declaration = findAncestor(node.parent, isFunctionLikeDeclaration);
switch (errorCode) {
case Diagnostics.A_function_whose_declared_type_is_neither_undefined_void_nor_any_must_return_a_value.code:
if (!declaration || !declaration.body || !declaration.type || !rangeContainsRange(declaration.type, node))
return void 0;
return getFixInfo(
checker,
declaration,
checker.getTypeFromTypeNode(declaration.type),
/*isFunctionType*/
false
);
case Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1.code:
if (!declaration || !isCallExpression(declaration.parent) || !declaration.body)
return void 0;
const pos = declaration.parent.arguments.indexOf(declaration);
const type = checker.getContextualTypeForArgumentAtIndex(declaration.parent, pos);
if (!type)
return void 0;
return getFixInfo(
checker,
declaration,
type,
/*isFunctionType*/
true
);
case Diagnostics.Type_0_is_not_assignable_to_type_1.code:
if (!isDeclarationName(node) || !isVariableLike(node.parent) && !isJsxAttribute(node.parent))
return void 0;
const initializer = getVariableLikeInitializer(node.parent);
if (!initializer || !isFunctionLikeDeclaration(initializer) || !initializer.body)
return void 0;
return getFixInfo(
checker,
initializer,
checker.getTypeAtLocation(node.parent),
/*isFunctionType*/
true
);
}
return void 0;
}
function getVariableLikeInitializer(declaration) {
switch (declaration.kind) {
case 259 /* VariableDeclaration */:
case 168 /* Parameter */:
case 207 /* BindingElement */:
case 171 /* PropertyDeclaration */:
case 302 /* PropertyAssignment */:
return declaration.initializer;
case 290 /* JsxAttribute */:
return declaration.initializer && (isJsxExpression(declaration.initializer) ? declaration.initializer.expression : void 0);
case 303 /* ShorthandPropertyAssignment */:
case 170 /* PropertySignature */:
case 305 /* EnumMember */:
case 354 /* JSDocPropertyTag */:
case 347 /* JSDocParameterTag */:
return void 0;
}
}
function addReturnStatement(changes, sourceFile, expression, statement) {
suppressLeadingAndTrailingTrivia(expression);
const probablyNeedSemi = probablyUsesSemicolons(sourceFile);
changes.replaceNode(sourceFile, statement, factory.createReturnStatement(expression), {
leadingTriviaOption: ts_textChanges_exports.LeadingTriviaOption.Exclude,
trailingTriviaOption: ts_textChanges_exports.TrailingTriviaOption.Exclude,
suffix: probablyNeedSemi ? ";" : void 0
});
}
function removeBlockBodyBrace(changes, sourceFile, declaration, expression, commentSource, withParen) {
const newBody = withParen || needsParentheses(expression) ? factory.createParenthesizedExpression(expression) : expression;
suppressLeadingAndTrailingTrivia(commentSource);
copyComments(commentSource, newBody);
changes.replaceNode(sourceFile, declaration.body, newBody);
}
function wrapBlockWithParen(changes, sourceFile, declaration, expression) {
changes.replaceNode(sourceFile, declaration.body, factory.createParenthesizedExpression(expression));
}
function getActionForfixAddReturnStatement(context, expression, statement) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => addReturnStatement(t, context.sourceFile, expression, statement));
return createCodeFixAction(fixId23, changes, Diagnostics.Add_a_return_statement, fixIdAddReturnStatement, Diagnostics.Add_all_missing_return_statement);
}
function getActionForFixRemoveBracesFromArrowFunctionBody(context, declaration, expression, commentSource) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => removeBlockBodyBrace(
t,
context.sourceFile,
declaration,
expression,
commentSource,
/*withParen*/
false
));
return createCodeFixAction(fixId23, changes, Diagnostics.Remove_braces_from_arrow_function_body, fixRemoveBracesFromArrowFunctionBody, Diagnostics.Remove_braces_from_all_arrow_function_bodies_with_relevant_issues);
}
function getActionForfixWrapTheBlockWithParen(context, declaration, expression) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => wrapBlockWithParen(t, context.sourceFile, declaration, expression));
return createCodeFixAction(fixId23, changes, Diagnostics.Wrap_the_following_body_with_parentheses_which_should_be_an_object_literal, fixIdWrapTheBlockWithParen, Diagnostics.Wrap_all_object_literal_with_parentheses);
}
// src/services/codefixes/fixAddMissingMember.ts
var fixMissingMember = "fixMissingMember";
var fixMissingProperties = "fixMissingProperties";
var fixMissingAttributes = "fixMissingAttributes";
var fixMissingFunctionDeclaration = "fixMissingFunctionDeclaration";
var errorCodes27 = [
Diagnostics.Property_0_does_not_exist_on_type_1.code,
Diagnostics.Property_0_does_not_exist_on_type_1_Did_you_mean_2.code,
Diagnostics.Property_0_is_missing_in_type_1_but_required_in_type_2.code,
Diagnostics.Type_0_is_missing_the_following_properties_from_type_1_Colon_2.code,
Diagnostics.Type_0_is_missing_the_following_properties_from_type_1_Colon_2_and_3_more.code,
Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1.code,
Diagnostics.Cannot_find_name_0.code
];
registerCodeFix({
errorCodes: errorCodes27,
getCodeActions(context) {
const typeChecker = context.program.getTypeChecker();
const info = getInfo10(context.sourceFile, context.span.start, context.errorCode, typeChecker, context.program);
if (!info) {
return void 0;
}
if (info.kind === 3 /* ObjectLiteral */) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => addObjectLiteralProperties(t, context, info));
return [createCodeFixAction(fixMissingProperties, changes, Diagnostics.Add_missing_properties, fixMissingProperties, Diagnostics.Add_all_missing_properties)];
}
if (info.kind === 4 /* JsxAttributes */) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => addJsxAttributes(t, context, info));
return [createCodeFixAction(fixMissingAttributes, changes, Diagnostics.Add_missing_attributes, fixMissingAttributes, Diagnostics.Add_all_missing_attributes)];
}
if (info.kind === 2 /* Function */ || info.kind === 5 /* Signature */) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => addFunctionDeclaration(t, context, info));
return [createCodeFixAction(fixMissingFunctionDeclaration, changes, [Diagnostics.Add_missing_function_declaration_0, info.token.text], fixMissingFunctionDeclaration, Diagnostics.Add_all_missing_function_declarations)];
}
if (info.kind === 1 /* Enum */) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => addEnumMemberDeclaration(t, context.program.getTypeChecker(), info));
return [createCodeFixAction(fixMissingMember, changes, [Diagnostics.Add_missing_enum_member_0, info.token.text], fixMissingMember, Diagnostics.Add_all_missing_members)];
}
return concatenate(getActionsForMissingMethodDeclaration(context, info), getActionsForMissingMemberDeclaration(context, info));
},
fixIds: [fixMissingMember, fixMissingFunctionDeclaration, fixMissingProperties, fixMissingAttributes],
getAllCodeActions: (context) => {
const { program, fixId: fixId52 } = context;
const checker = program.getTypeChecker();
const seen = /* @__PURE__ */ new Map();
const typeDeclToMembers = /* @__PURE__ */ new Map();
return createCombinedCodeActions(ts_textChanges_exports.ChangeTracker.with(context, (changes) => {
eachDiagnostic(context, errorCodes27, (diag2) => {
const info = getInfo10(diag2.file, diag2.start, diag2.code, checker, context.program);
if (!info || !addToSeen(seen, getNodeId(info.parentDeclaration) + "#" + info.token.text)) {
return;
}
if (fixId52 === fixMissingFunctionDeclaration && (info.kind === 2 /* Function */ || info.kind === 5 /* Signature */)) {
addFunctionDeclaration(changes, context, info);
} else if (fixId52 === fixMissingProperties && info.kind === 3 /* ObjectLiteral */) {
addObjectLiteralProperties(changes, context, info);
} else if (fixId52 === fixMissingAttributes && info.kind === 4 /* JsxAttributes */) {
addJsxAttributes(changes, context, info);
} else {
if (info.kind === 1 /* Enum */) {
addEnumMemberDeclaration(changes, checker, info);
}
if (info.kind === 0 /* TypeLikeDeclaration */) {
const { parentDeclaration, token } = info;
const infos = getOrUpdate(typeDeclToMembers, parentDeclaration, () => []);
if (!infos.some((i) => i.token.text === token.text)) {
infos.push(info);
}
}
}
});
typeDeclToMembers.forEach((infos, declaration) => {
const supers = isTypeLiteralNode(declaration) ? void 0 : getAllSupers(declaration, checker);
for (const info of infos) {
if (supers == null ? void 0 : supers.some((superClassOrInterface) => {
const superInfos = typeDeclToMembers.get(superClassOrInterface);
return !!superInfos && superInfos.some(({ token: token2 }) => token2.text === info.token.text);
}))
continue;
const { parentDeclaration, declSourceFile, modifierFlags, token, call, isJSFile } = info;
if (call && !isPrivateIdentifier(token)) {
addMethodDeclaration(context, changes, call, token, modifierFlags & 32 /* Static */, parentDeclaration, declSourceFile);
} else {
if (isJSFile && !isInterfaceDeclaration(parentDeclaration) && !isTypeLiteralNode(parentDeclaration)) {
addMissingMemberInJs(changes, declSourceFile, parentDeclaration, token, !!(modifierFlags & 32 /* Static */));
} else {
const typeNode = getTypeNode2(checker, parentDeclaration, token);
addPropertyDeclaration(changes, declSourceFile, parentDeclaration, token.text, typeNode, modifierFlags & 32 /* Static */);
}
}
}
});
}));
}
});
function getInfo10(sourceFile, tokenPos, errorCode, checker, program) {
var _a;
const token = getTokenAtPosition(sourceFile, tokenPos);
const parent2 = token.parent;
if (errorCode === Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1.code) {
if (!(token.kind === 19 /* OpenBraceToken */ && isObjectLiteralExpression(parent2) && isCallExpression(parent2.parent)))
return void 0;
const argIndex = findIndex(parent2.parent.arguments, (arg) => arg === parent2);
if (argIndex < 0)
return void 0;
const signature = checker.getResolvedSignature(parent2.parent);
if (!(signature && signature.declaration && signature.parameters[argIndex]))
return void 0;
const param = signature.parameters[argIndex].valueDeclaration;
if (!(param && isParameter(param) && isIdentifier(param.name)))
return void 0;
const properties = arrayFrom(checker.getUnmatchedProperties(
checker.getTypeAtLocation(parent2),
checker.getParameterType(signature, argIndex),
/*requireOptionalProperties*/
false,
/*matchDiscriminantProperties*/
false
));
if (!length(properties))
return void 0;
return { kind: 3 /* ObjectLiteral */, token: param.name, properties, parentDeclaration: parent2 };
}
if (!isMemberName(token))
return void 0;
if (isIdentifier(token) && hasInitializer(parent2) && parent2.initializer && isObjectLiteralExpression(parent2.initializer)) {
const targetType = checker.getContextualType(token) || checker.getTypeAtLocation(token);
const properties = arrayFrom(checker.getUnmatchedProperties(
checker.getTypeAtLocation(parent2.initializer),
targetType,
/*requireOptionalProperties*/
false,
/*matchDiscriminantProperties*/
false
));
if (!length(properties))
return void 0;
return { kind: 3 /* ObjectLiteral */, token, properties, parentDeclaration: parent2.initializer };
}
if (isIdentifier(token) && isJsxOpeningLikeElement(token.parent)) {
const target = getEmitScriptTarget(program.getCompilerOptions());
const attributes = getUnmatchedAttributes(checker, target, token.parent);
if (!length(attributes))
return void 0;
return { kind: 4 /* JsxAttributes */, token, attributes, parentDeclaration: token.parent };
}
if (isIdentifier(token)) {
const type = (_a = checker.getContextualType(token)) == null ? void 0 : _a.getNonNullableType();
if (type && getObjectFlags(type) & 16 /* Anonymous */) {
const signature = firstOrUndefined(checker.getSignaturesOfType(type, 0 /* Call */));
if (signature === void 0)
return void 0;
return { kind: 5 /* Signature */, token, signature, sourceFile, parentDeclaration: findScope(token) };
}
if (isCallExpression(parent2) && parent2.expression === token) {
return { kind: 2 /* Function */, token, call: parent2, sourceFile, modifierFlags: 0 /* None */, parentDeclaration: findScope(token) };
}
}
if (!isPropertyAccessExpression(parent2))
return void 0;
const leftExpressionType = skipConstraint(checker.getTypeAtLocation(parent2.expression));
const symbol = leftExpressionType.symbol;
if (!symbol || !symbol.declarations)
return void 0;
if (isIdentifier(token) && isCallExpression(parent2.parent)) {
const moduleDeclaration = find(symbol.declarations, isModuleDeclaration);
const moduleDeclarationSourceFile = moduleDeclaration == null ? void 0 : moduleDeclaration.getSourceFile();
if (moduleDeclaration && moduleDeclarationSourceFile && !isSourceFileFromLibrary(program, moduleDeclarationSourceFile)) {
return { kind: 2 /* Function */, token, call: parent2.parent, sourceFile, modifierFlags: 1 /* Export */, parentDeclaration: moduleDeclaration };
}
const moduleSourceFile = find(symbol.declarations, isSourceFile);
if (sourceFile.commonJsModuleIndicator)
return void 0;
if (moduleSourceFile && !isSourceFileFromLibrary(program, moduleSourceFile)) {
return { kind: 2 /* Function */, token, call: parent2.parent, sourceFile: moduleSourceFile, modifierFlags: 1 /* Export */, parentDeclaration: moduleSourceFile };
}
}
const classDeclaration = find(symbol.declarations, isClassLike);
if (!classDeclaration && isPrivateIdentifier(token))
return void 0;
const declaration = classDeclaration || find(symbol.declarations, (d) => isInterfaceDeclaration(d) || isTypeLiteralNode(d));
if (declaration && !isSourceFileFromLibrary(program, declaration.getSourceFile())) {
const makeStatic = !isTypeLiteralNode(declaration) && (leftExpressionType.target || leftExpressionType) !== checker.getDeclaredTypeOfSymbol(symbol);
if (makeStatic && (isPrivateIdentifier(token) || isInterfaceDeclaration(declaration)))
return void 0;
const declSourceFile = declaration.getSourceFile();
const modifierFlags = isTypeLiteralNode(declaration) ? 0 /* None */ : (makeStatic ? 32 /* Static */ : 0 /* None */) | (startsWithUnderscore(token.text) ? 8 /* Private */ : 0 /* None */);
const isJSFile = isSourceFileJS(declSourceFile);
const call = tryCast(parent2.parent, isCallExpression);
return { kind: 0 /* TypeLikeDeclaration */, token, call, modifierFlags, parentDeclaration: declaration, declSourceFile, isJSFile };
}
const enumDeclaration = find(symbol.declarations, isEnumDeclaration);
if (enumDeclaration && !(leftExpressionType.flags & 1056 /* EnumLike */) && !isPrivateIdentifier(token) && !isSourceFileFromLibrary(program, enumDeclaration.getSourceFile())) {
return { kind: 1 /* Enum */, token, parentDeclaration: enumDeclaration };
}
return void 0;
}
function getActionsForMissingMemberDeclaration(context, info) {
return info.isJSFile ? singleElementArray(createActionForAddMissingMemberInJavascriptFile(context, info)) : createActionsForAddMissingMemberInTypeScriptFile(context, info);
}
function createActionForAddMissingMemberInJavascriptFile(context, { parentDeclaration, declSourceFile, modifierFlags, token }) {
if (isInterfaceDeclaration(parentDeclaration) || isTypeLiteralNode(parentDeclaration)) {
return void 0;
}
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => addMissingMemberInJs(t, declSourceFile, parentDeclaration, token, !!(modifierFlags & 32 /* Static */)));
if (changes.length === 0) {
return void 0;
}
const diagnostic = modifierFlags & 32 /* Static */ ? Diagnostics.Initialize_static_property_0 : isPrivateIdentifier(token) ? Diagnostics.Declare_a_private_field_named_0 : Diagnostics.Initialize_property_0_in_the_constructor;
return createCodeFixAction(fixMissingMember, changes, [diagnostic, token.text], fixMissingMember, Diagnostics.Add_all_missing_members);
}
function addMissingMemberInJs(changeTracker, sourceFile, classDeclaration, token, makeStatic) {
const tokenName = token.text;
if (makeStatic) {
if (classDeclaration.kind === 230 /* ClassExpression */) {
return;
}
const className = classDeclaration.name.getText();
const staticInitialization = initializePropertyToUndefined(factory.createIdentifier(className), tokenName);
changeTracker.insertNodeAfter(sourceFile, classDeclaration, staticInitialization);
} else if (isPrivateIdentifier(token)) {
const property = factory.createPropertyDeclaration(
/*modifiers*/
void 0,
tokenName,
/*questionOrExclamationToken*/
void 0,
/*type*/
void 0,
/*initializer*/
void 0
);
const lastProp = getNodeToInsertPropertyAfter(classDeclaration);
if (lastProp) {
changeTracker.insertNodeAfter(sourceFile, lastProp, property);
} else {
changeTracker.insertMemberAtStart(sourceFile, classDeclaration, property);
}
} else {
const classConstructor = getFirstConstructorWithBody(classDeclaration);
if (!classConstructor) {
return;
}
const propertyInitialization = initializePropertyToUndefined(factory.createThis(), tokenName);
changeTracker.insertNodeAtConstructorEnd(sourceFile, classConstructor, propertyInitialization);
}
}
function initializePropertyToUndefined(obj, propertyName) {
return factory.createExpressionStatement(factory.createAssignment(factory.createPropertyAccessExpression(obj, propertyName), createUndefined()));
}
function createActionsForAddMissingMemberInTypeScriptFile(context, { parentDeclaration, declSourceFile, modifierFlags, token }) {
const memberName = token.text;
const isStatic2 = modifierFlags & 32 /* Static */;
const typeNode = getTypeNode2(context.program.getTypeChecker(), parentDeclaration, token);
const addPropertyDeclarationChanges = (modifierFlags2) => ts_textChanges_exports.ChangeTracker.with(context, (t) => addPropertyDeclaration(t, declSourceFile, parentDeclaration, memberName, typeNode, modifierFlags2));
const actions2 = [createCodeFixAction(fixMissingMember, addPropertyDeclarationChanges(modifierFlags & 32 /* Static */), [isStatic2 ? Diagnostics.Declare_static_property_0 : Diagnostics.Declare_property_0, memberName], fixMissingMember, Diagnostics.Add_all_missing_members)];
if (isStatic2 || isPrivateIdentifier(token)) {
return actions2;
}
if (modifierFlags & 8 /* Private */) {
actions2.unshift(createCodeFixActionWithoutFixAll(fixMissingMember, addPropertyDeclarationChanges(8 /* Private */), [Diagnostics.Declare_private_property_0, memberName]));
}
actions2.push(createAddIndexSignatureAction(context, declSourceFile, parentDeclaration, token.text, typeNode));
return actions2;
}
function getTypeNode2(checker, node, token) {
let typeNode;
if (token.parent.parent.kind === 225 /* BinaryExpression */) {
const binaryExpression = token.parent.parent;
const otherExpression = token.parent === binaryExpression.left ? binaryExpression.right : binaryExpression.left;
const widenedType = checker.getWidenedType(checker.getBaseTypeOfLiteralType(checker.getTypeAtLocation(otherExpression)));
typeNode = checker.typeToTypeNode(widenedType, node, 1 /* NoTruncation */);
} else {
const contextualType = checker.getContextualType(token.parent);
typeNode = contextualType ? checker.typeToTypeNode(
contextualType,
/*enclosingDeclaration*/
void 0,
1 /* NoTruncation */
) : void 0;
}
return typeNode || factory.createKeywordTypeNode(133 /* AnyKeyword */);
}
function addPropertyDeclaration(changeTracker, sourceFile, node, tokenName, typeNode, modifierFlags) {
const modifiers = modifierFlags ? factory.createNodeArray(factory.createModifiersFromModifierFlags(modifierFlags)) : void 0;
const property = isClassLike(node) ? factory.createPropertyDeclaration(
modifiers,
tokenName,
/*questionOrExclamationToken*/
void 0,
typeNode,
/*initializer*/
void 0
) : factory.createPropertySignature(
/*modifiers*/
void 0,
tokenName,
/*questionToken*/
void 0,
typeNode
);
const lastProp = getNodeToInsertPropertyAfter(node);
if (lastProp) {
changeTracker.insertNodeAfter(sourceFile, lastProp, property);
} else {
changeTracker.insertMemberAtStart(sourceFile, node, property);
}
}
function getNodeToInsertPropertyAfter(node) {
let res;
for (const member of node.members) {
if (!isPropertyDeclaration(member))
break;
res = member;
}
return res;
}
function createAddIndexSignatureAction(context, sourceFile, node, tokenName, typeNode) {
const stringTypeNode = factory.createKeywordTypeNode(154 /* StringKeyword */);
const indexingParameter = factory.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
"x",
/*questionToken*/
void 0,
stringTypeNode,
/*initializer*/
void 0
);
const indexSignature = factory.createIndexSignature(
/*modifiers*/
void 0,
[indexingParameter],
typeNode
);
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => t.insertMemberAtStart(sourceFile, node, indexSignature));
return createCodeFixActionWithoutFixAll(fixMissingMember, changes, [Diagnostics.Add_index_signature_for_property_0, tokenName]);
}
function getActionsForMissingMethodDeclaration(context, info) {
const { parentDeclaration, declSourceFile, modifierFlags, token, call } = info;
if (call === void 0) {
return void 0;
}
if (isPrivateIdentifier(token)) {
return void 0;
}
const methodName = token.text;
const addMethodDeclarationChanges = (modifierFlags2) => ts_textChanges_exports.ChangeTracker.with(context, (t) => addMethodDeclaration(context, t, call, token, modifierFlags2, parentDeclaration, declSourceFile));
const actions2 = [createCodeFixAction(fixMissingMember, addMethodDeclarationChanges(modifierFlags & 32 /* Static */), [modifierFlags & 32 /* Static */ ? Diagnostics.Declare_static_method_0 : Diagnostics.Declare_method_0, methodName], fixMissingMember, Diagnostics.Add_all_missing_members)];
if (modifierFlags & 8 /* Private */) {
actions2.unshift(createCodeFixActionWithoutFixAll(fixMissingMember, addMethodDeclarationChanges(8 /* Private */), [Diagnostics.Declare_private_method_0, methodName]));
}
return actions2;
}
function addMethodDeclaration(context, changes, callExpression, name, modifierFlags, parentDeclaration, sourceFile) {
const importAdder = createImportAdder(sourceFile, context.program, context.preferences, context.host);
const kind = isClassLike(parentDeclaration) ? 173 /* MethodDeclaration */ : 172 /* MethodSignature */;
const signatureDeclaration = createSignatureDeclarationFromCallExpression(kind, context, importAdder, callExpression, name, modifierFlags, parentDeclaration);
const containingMethodDeclaration = tryGetContainingMethodDeclaration(parentDeclaration, callExpression);
if (containingMethodDeclaration) {
changes.insertNodeAfter(sourceFile, containingMethodDeclaration, signatureDeclaration);
} else {
changes.insertMemberAtStart(sourceFile, parentDeclaration, signatureDeclaration);
}
importAdder.writeFixes(changes);
}
function addEnumMemberDeclaration(changes, checker, { token, parentDeclaration }) {
const hasStringInitializer = some(parentDeclaration.members, (member) => {
const type = checker.getTypeAtLocation(member);
return !!(type && type.flags & 402653316 /* StringLike */);
});
const enumMember = factory.createEnumMember(token, hasStringInitializer ? factory.createStringLiteral(token.text) : void 0);
changes.replaceNode(parentDeclaration.getSourceFile(), parentDeclaration, factory.updateEnumDeclaration(
parentDeclaration,
parentDeclaration.modifiers,
parentDeclaration.name,
concatenate(parentDeclaration.members, singleElementArray(enumMember))
), {
leadingTriviaOption: ts_textChanges_exports.LeadingTriviaOption.IncludeAll,
trailingTriviaOption: ts_textChanges_exports.TrailingTriviaOption.Exclude
});
}
function addFunctionDeclaration(changes, context, info) {
const quotePreference = getQuotePreference(context.sourceFile, context.preferences);
const importAdder = createImportAdder(context.sourceFile, context.program, context.preferences, context.host);
const functionDeclaration = info.kind === 2 /* Function */ ? createSignatureDeclarationFromCallExpression(261 /* FunctionDeclaration */, context, importAdder, info.call, idText(info.token), info.modifierFlags, info.parentDeclaration) : createSignatureDeclarationFromSignature(
261 /* FunctionDeclaration */,
context,
quotePreference,
info.signature,
createStubbedBody(Diagnostics.Function_not_implemented.message, quotePreference),
info.token,
/*modifiers*/
void 0,
/*optional*/
void 0,
/*enclosingDeclaration*/
void 0,
importAdder
);
if (functionDeclaration === void 0) {
Debug.fail("fixMissingFunctionDeclaration codefix got unexpected error.");
}
isReturnStatement(info.parentDeclaration) ? changes.insertNodeBefore(
info.sourceFile,
info.parentDeclaration,
functionDeclaration,
/*blankLineBetween*/
true
) : changes.insertNodeAtEndOfScope(info.sourceFile, info.parentDeclaration, functionDeclaration);
importAdder.writeFixes(changes);
}
function addJsxAttributes(changes, context, info) {
const importAdder = createImportAdder(context.sourceFile, context.program, context.preferences, context.host);
const quotePreference = getQuotePreference(context.sourceFile, context.preferences);
const checker = context.program.getTypeChecker();
const jsxAttributesNode = info.parentDeclaration.attributes;
const hasSpreadAttribute = some(jsxAttributesNode.properties, isJsxSpreadAttribute);
const attrs = map(info.attributes, (attr) => {
const value = tryGetValueFromType(context, checker, importAdder, quotePreference, checker.getTypeOfSymbol(attr), info.parentDeclaration);
const name = factory.createIdentifier(attr.name);
const jsxAttribute = factory.createJsxAttribute(name, factory.createJsxExpression(
/*dotDotDotToken*/
void 0,
value
));
setParent(name, jsxAttribute);
return jsxAttribute;
});
const jsxAttributes = factory.createJsxAttributes(hasSpreadAttribute ? [...attrs, ...jsxAttributesNode.properties] : [...jsxAttributesNode.properties, ...attrs]);
const options = { prefix: jsxAttributesNode.pos === jsxAttributesNode.end ? " " : void 0 };
changes.replaceNode(context.sourceFile, jsxAttributesNode, jsxAttributes, options);
importAdder.writeFixes(changes);
}
function addObjectLiteralProperties(changes, context, info) {
const importAdder = createImportAdder(context.sourceFile, context.program, context.preferences, context.host);
const quotePreference = getQuotePreference(context.sourceFile, context.preferences);
const target = getEmitScriptTarget(context.program.getCompilerOptions());
const checker = context.program.getTypeChecker();
const props = map(info.properties, (prop) => {
const initializer = tryGetValueFromType(context, checker, importAdder, quotePreference, checker.getTypeOfSymbol(prop), info.parentDeclaration);
return factory.createPropertyAssignment(createPropertyNameFromSymbol(prop, target, quotePreference, checker), initializer);
});
const options = {
leadingTriviaOption: ts_textChanges_exports.LeadingTriviaOption.Exclude,
trailingTriviaOption: ts_textChanges_exports.TrailingTriviaOption.Exclude,
indentation: info.indentation
};
changes.replaceNode(context.sourceFile, info.parentDeclaration, factory.createObjectLiteralExpression(
[...info.parentDeclaration.properties, ...props],
/*multiLine*/
true
), options);
importAdder.writeFixes(changes);
}
function tryGetValueFromType(context, checker, importAdder, quotePreference, type, enclosingDeclaration) {
if (type.flags & 3 /* AnyOrUnknown */) {
return createUndefined();
}
if (type.flags & (4 /* String */ | 134217728 /* TemplateLiteral */)) {
return factory.createStringLiteral(
"",
/* isSingleQuote */
quotePreference === 0 /* Single */
);
}
if (type.flags & 8 /* Number */) {
return factory.createNumericLiteral(0);
}
if (type.flags & 64 /* BigInt */) {
return factory.createBigIntLiteral("0n");
}
if (type.flags & 16 /* Boolean */) {
return factory.createFalse();
}
if (type.flags & 1056 /* EnumLike */) {
const enumMember = type.symbol.exports ? firstOrUndefinedIterator(type.symbol.exports.values()) : type.symbol;
const name = checker.symbolToExpression(
type.symbol.parent ? type.symbol.parent : type.symbol,
111551 /* Value */,
/*enclosingDeclaration*/
void 0,
/*flags*/
void 0
);
return enumMember === void 0 || name === void 0 ? factory.createNumericLiteral(0) : factory.createPropertyAccessExpression(name, checker.symbolToString(enumMember));
}
if (type.flags & 256 /* NumberLiteral */) {
return factory.createNumericLiteral(type.value);
}
if (type.flags & 2048 /* BigIntLiteral */) {
return factory.createBigIntLiteral(type.value);
}
if (type.flags & 128 /* StringLiteral */) {
return factory.createStringLiteral(
type.value,
/* isSingleQuote */
quotePreference === 0 /* Single */
);
}
if (type.flags & 512 /* BooleanLiteral */) {
return type === checker.getFalseType() || type === checker.getFalseType(
/*fresh*/
true
) ? factory.createFalse() : factory.createTrue();
}
if (type.flags & 65536 /* Null */) {
return factory.createNull();
}
if (type.flags & 1048576 /* Union */) {
const expression = firstDefined(type.types, (t) => tryGetValueFromType(context, checker, importAdder, quotePreference, t, enclosingDeclaration));
return expression ?? createUndefined();
}
if (checker.isArrayLikeType(type)) {
return factory.createArrayLiteralExpression();
}
if (isObjectLiteralType(type)) {
const props = map(checker.getPropertiesOfType(type), (prop) => {
const initializer = tryGetValueFromType(context, checker, importAdder, quotePreference, checker.getTypeOfSymbol(prop), enclosingDeclaration);
return factory.createPropertyAssignment(prop.name, initializer);
});
return factory.createObjectLiteralExpression(
props,
/*multiLine*/
true
);
}
if (getObjectFlags(type) & 16 /* Anonymous */) {
const decl = find(type.symbol.declarations || emptyArray, or(isFunctionTypeNode, isMethodSignature, isMethodDeclaration));
if (decl === void 0)
return createUndefined();
const signature = checker.getSignaturesOfType(type, 0 /* Call */);
if (signature === void 0)
return createUndefined();
const func = createSignatureDeclarationFromSignature(
217 /* FunctionExpression */,
context,
quotePreference,
signature[0],
createStubbedBody(Diagnostics.Function_not_implemented.message, quotePreference),
/*name*/
void 0,
/*modifiers*/
void 0,
/*optional*/
void 0,
/*enclosingDeclaration*/
enclosingDeclaration,
importAdder
);
return func ?? createUndefined();
}
if (getObjectFlags(type) & 1 /* Class */) {
const classDeclaration = getClassLikeDeclarationOfSymbol(type.symbol);
if (classDeclaration === void 0 || hasAbstractModifier(classDeclaration))
return createUndefined();
const constructorDeclaration = getFirstConstructorWithBody(classDeclaration);
if (constructorDeclaration && length(constructorDeclaration.parameters))
return createUndefined();
return factory.createNewExpression(
factory.createIdentifier(type.symbol.name),
/*typeArguments*/
void 0,
/*argumentsArray*/
void 0
);
}
return createUndefined();
}
function createUndefined() {
return factory.createIdentifier("undefined");
}
function isObjectLiteralType(type) {
return type.flags & 524288 /* Object */ && (getObjectFlags(type) & 128 /* ObjectLiteral */ || type.symbol && tryCast(singleOrUndefined(type.symbol.declarations), isTypeLiteralNode));
}
function getUnmatchedAttributes(checker, target, source) {
const attrsType = checker.getContextualType(source.attributes);
if (attrsType === void 0)
return emptyArray;
const targetProps = attrsType.getProperties();
if (!length(targetProps))
return emptyArray;
const seenNames = /* @__PURE__ */ new Set();
for (const sourceProp of source.attributes.properties) {
if (isJsxAttribute(sourceProp)) {
seenNames.add(getEscapedTextOfJsxAttributeName(sourceProp.name));
}
if (isJsxSpreadAttribute(sourceProp)) {
const type = checker.getTypeAtLocation(sourceProp.expression);
for (const prop of type.getProperties()) {
seenNames.add(prop.escapedName);
}
}
}
return filter(targetProps, (targetProp) => isIdentifierText(targetProp.name, target, 1 /* JSX */) && !(targetProp.flags & 16777216 /* Optional */ || getCheckFlags(targetProp) & 48 /* Partial */ || seenNames.has(targetProp.escapedName)));
}
function tryGetContainingMethodDeclaration(node, callExpression) {
if (isTypeLiteralNode(node)) {
return void 0;
}
const declaration = findAncestor(callExpression, (n) => isMethodDeclaration(n) || isConstructorDeclaration(n));
return declaration && declaration.parent === node ? declaration : void 0;
}
function createPropertyNameFromSymbol(symbol, target, quotePreference, checker) {
if (isTransientSymbol(symbol)) {
const prop = checker.symbolToNode(
symbol,
111551 /* Value */,
/*enclosingDeclaration*/
void 0,
1073741824 /* WriteComputedProps */
);
if (prop && isComputedPropertyName(prop))
return prop;
}
return createPropertyNameNodeForIdentifierOrLiteral(symbol.name, target, quotePreference === 0 /* Single */);
}
function findScope(node) {
if (findAncestor(node, isJsxExpression)) {
const returnStatement = findAncestor(node.parent, isReturnStatement);
if (returnStatement)
return returnStatement;
}
return getSourceFileOfNode(node);
}
// src/services/codefixes/fixAddMissingNewOperator.ts
var fixId24 = "addMissingNewOperator";
var errorCodes28 = [Diagnostics.Value_of_type_0_is_not_callable_Did_you_mean_to_include_new.code];
registerCodeFix({
errorCodes: errorCodes28,
getCodeActions(context) {
const { sourceFile, span } = context;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => addMissingNewOperator(t, sourceFile, span));
return [createCodeFixAction(fixId24, changes, Diagnostics.Add_missing_new_operator_to_call, fixId24, Diagnostics.Add_missing_new_operator_to_all_calls)];
},
fixIds: [fixId24],
getAllCodeActions: (context) => codeFixAll(context, errorCodes28, (changes, diag2) => addMissingNewOperator(changes, context.sourceFile, diag2))
});
function addMissingNewOperator(changes, sourceFile, span) {
const call = cast(findAncestorMatchingSpan2(sourceFile, span), isCallExpression);
const newExpression = factory.createNewExpression(call.expression, call.typeArguments, call.arguments);
changes.replaceNode(sourceFile, call, newExpression);
}
function findAncestorMatchingSpan2(sourceFile, span) {
let token = getTokenAtPosition(sourceFile, span.start);
const end = textSpanEnd(span);
while (token.end < end) {
token = token.parent;
}
return token;
}
// src/services/codefixes/fixCannotFindModule.ts
var fixName2 = "fixCannotFindModule";
var fixIdInstallTypesPackage = "installTypesPackage";
var errorCodeCannotFindModule = Diagnostics.Cannot_find_module_0_or_its_corresponding_type_declarations.code;
var errorCodes29 = [
errorCodeCannotFindModule,
Diagnostics.Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type.code
];
registerCodeFix({
errorCodes: errorCodes29,
getCodeActions: function getCodeActionsToFixNotFoundModule(context) {
const { host, sourceFile, span: { start: start2 } } = context;
const packageName = tryGetImportedPackageName(sourceFile, start2);
if (packageName === void 0)
return void 0;
const typesPackageName = getTypesPackageNameToInstall(packageName, host, context.errorCode);
return typesPackageName === void 0 ? [] : [createCodeFixAction(
fixName2,
/*changes*/
[],
[Diagnostics.Install_0, typesPackageName],
fixIdInstallTypesPackage,
Diagnostics.Install_all_missing_types_packages,
getInstallCommand(sourceFile.fileName, typesPackageName)
)];
},
fixIds: [fixIdInstallTypesPackage],
getAllCodeActions: (context) => {
return codeFixAll(context, errorCodes29, (_changes, diag2, commands) => {
const packageName = tryGetImportedPackageName(diag2.file, diag2.start);
if (packageName === void 0)
return void 0;
switch (context.fixId) {
case fixIdInstallTypesPackage: {
const pkg = getTypesPackageNameToInstall(packageName, context.host, diag2.code);
if (pkg) {
commands.push(getInstallCommand(diag2.file.fileName, pkg));
}
break;
}
default:
Debug.fail(`Bad fixId: ${context.fixId}`);
}
});
}
});
function getInstallCommand(fileName, packageName) {
return { type: "install package", file: fileName, packageName };
}
function tryGetImportedPackageName(sourceFile, pos) {
const moduleSpecifierText = tryCast(getTokenAtPosition(sourceFile, pos), isStringLiteral);
if (!moduleSpecifierText)
return void 0;
const moduleName = moduleSpecifierText.text;
const { packageName } = parsePackageName(moduleName);
return isExternalModuleNameRelative(packageName) ? void 0 : packageName;
}
function getTypesPackageNameToInstall(packageName, host, diagCode) {
var _a;
return diagCode === errorCodeCannotFindModule ? ts_JsTyping_exports.nodeCoreModules.has(packageName) ? "@types/node" : void 0 : ((_a = host.isKnownTypesPackageName) == null ? void 0 : _a.call(host, packageName)) ? getTypesPackageName(packageName) : void 0;
}
// src/services/codefixes/fixClassDoesntImplementInheritedAbstractMember.ts
var errorCodes30 = [
Diagnostics.Non_abstract_class_0_does_not_implement_all_abstract_members_of_1.code
];
var fixId25 = "fixClassDoesntImplementInheritedAbstractMember";
registerCodeFix({
errorCodes: errorCodes30,
getCodeActions: function getCodeActionsToFixClassNotImplementingInheritedMembers(context) {
const { sourceFile, span } = context;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => addMissingMembers(getClass2(sourceFile, span.start), sourceFile, context, t, context.preferences));
return changes.length === 0 ? void 0 : [createCodeFixAction(fixId25, changes, Diagnostics.Implement_inherited_abstract_class, fixId25, Diagnostics.Implement_all_inherited_abstract_classes)];
},
fixIds: [fixId25],
getAllCodeActions: function getAllCodeActionsToFixClassDoesntImplementInheritedAbstractMember(context) {
const seenClassDeclarations = /* @__PURE__ */ new Map();
return codeFixAll(context, errorCodes30, (changes, diag2) => {
const classDeclaration = getClass2(diag2.file, diag2.start);
if (addToSeen(seenClassDeclarations, getNodeId(classDeclaration))) {
addMissingMembers(classDeclaration, context.sourceFile, context, changes, context.preferences);
}
});
}
});
function getClass2(sourceFile, pos) {
const token = getTokenAtPosition(sourceFile, pos);
return cast(token.parent, isClassLike);
}
function addMissingMembers(classDeclaration, sourceFile, context, changeTracker, preferences) {
const extendsNode = getEffectiveBaseTypeNode(classDeclaration);
const checker = context.program.getTypeChecker();
const instantiatedExtendsType = checker.getTypeAtLocation(extendsNode);
const abstractAndNonPrivateExtendsSymbols = checker.getPropertiesOfType(instantiatedExtendsType).filter(symbolPointsToNonPrivateAndAbstractMember);
const importAdder = createImportAdder(sourceFile, context.program, preferences, context.host);
createMissingMemberNodes(classDeclaration, abstractAndNonPrivateExtendsSymbols, sourceFile, context, preferences, importAdder, (member) => changeTracker.insertMemberAtStart(sourceFile, classDeclaration, member));
importAdder.writeFixes(changeTracker);
}
function symbolPointsToNonPrivateAndAbstractMember(symbol) {
const flags = getSyntacticModifierFlags(first(symbol.getDeclarations()));
return !(flags & 8 /* Private */) && !!(flags & 256 /* Abstract */);
}
// src/services/codefixes/fixClassSuperMustPrecedeThisAccess.ts
var fixId26 = "classSuperMustPrecedeThisAccess";
var errorCodes31 = [Diagnostics.super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class.code];
registerCodeFix({
errorCodes: errorCodes31,
getCodeActions(context) {
const { sourceFile, span } = context;
const nodes = getNodes(sourceFile, span.start);
if (!nodes)
return void 0;
const { constructor, superCall } = nodes;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange19(t, sourceFile, constructor, superCall));
return [createCodeFixAction(fixId26, changes, Diagnostics.Make_super_call_the_first_statement_in_the_constructor, fixId26, Diagnostics.Make_all_super_calls_the_first_statement_in_their_constructor)];
},
fixIds: [fixId26],
getAllCodeActions(context) {
const { sourceFile } = context;
const seenClasses = /* @__PURE__ */ new Map();
return codeFixAll(context, errorCodes31, (changes, diag2) => {
const nodes = getNodes(diag2.file, diag2.start);
if (!nodes)
return;
const { constructor, superCall } = nodes;
if (addToSeen(seenClasses, getNodeId(constructor.parent))) {
doChange19(changes, sourceFile, constructor, superCall);
}
});
}
});
function doChange19(changes, sourceFile, constructor, superCall) {
changes.insertNodeAtConstructorStart(sourceFile, constructor, superCall);
changes.delete(sourceFile, superCall);
}
function getNodes(sourceFile, pos) {
const token = getTokenAtPosition(sourceFile, pos);
if (token.kind !== 110 /* ThisKeyword */)
return void 0;
const constructor = getContainingFunction(token);
const superCall = findSuperCall(constructor.body);
return superCall && !superCall.expression.arguments.some((arg) => isPropertyAccessExpression(arg) && arg.expression === token) ? { constructor, superCall } : void 0;
}
function findSuperCall(n) {
return isExpressionStatement(n) && isSuperCall(n.expression) ? n : isFunctionLike(n) ? void 0 : forEachChild(n, findSuperCall);
}
// src/services/codefixes/fixConstructorForDerivedNeedSuperCall.ts
var fixId27 = "constructorForDerivedNeedSuperCall";
var errorCodes32 = [Diagnostics.Constructors_for_derived_classes_must_contain_a_super_call.code];
registerCodeFix({
errorCodes: errorCodes32,
getCodeActions(context) {
const { sourceFile, span } = context;
const ctr = getNode(sourceFile, span.start);
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange20(t, sourceFile, ctr));
return [createCodeFixAction(fixId27, changes, Diagnostics.Add_missing_super_call, fixId27, Diagnostics.Add_all_missing_super_calls)];
},
fixIds: [fixId27],
getAllCodeActions: (context) => codeFixAll(context, errorCodes32, (changes, diag2) => doChange20(changes, context.sourceFile, getNode(diag2.file, diag2.start)))
});
function getNode(sourceFile, pos) {
const token = getTokenAtPosition(sourceFile, pos);
Debug.assert(isConstructorDeclaration(token.parent), "token should be at the constructor declaration");
return token.parent;
}
function doChange20(changes, sourceFile, ctr) {
const superCall = factory.createExpressionStatement(factory.createCallExpression(
factory.createSuper(),
/*typeArguments*/
void 0,
/*argumentsArray*/
emptyArray
));
changes.insertNodeAtConstructorStart(sourceFile, ctr, superCall);
}
// src/services/codefixes/fixEnableJsxFlag.ts
var fixID = "fixEnableJsxFlag";
var errorCodes33 = [Diagnostics.Cannot_use_JSX_unless_the_jsx_flag_is_provided.code];
registerCodeFix({
errorCodes: errorCodes33,
getCodeActions: function getCodeActionsToFixEnableJsxFlag(context) {
const { configFile } = context.program.getCompilerOptions();
if (configFile === void 0) {
return void 0;
}
const changes = ts_textChanges_exports.ChangeTracker.with(
context,
(changeTracker) => doChange21(changeTracker, configFile)
);
return [
createCodeFixActionWithoutFixAll(fixID, changes, Diagnostics.Enable_the_jsx_flag_in_your_configuration_file)
];
},
fixIds: [fixID],
getAllCodeActions: (context) => codeFixAll(context, errorCodes33, (changes) => {
const { configFile } = context.program.getCompilerOptions();
if (configFile === void 0) {
return void 0;
}
doChange21(changes, configFile);
})
});
function doChange21(changeTracker, configFile) {
setJsonCompilerOptionValue(changeTracker, configFile, "jsx", factory.createStringLiteral("react"));
}
// src/services/codefixes/fixNaNEquality.ts
var fixId28 = "fixNaNEquality";
var errorCodes34 = [
Diagnostics.This_condition_will_always_return_0.code
];
registerCodeFix({
errorCodes: errorCodes34,
getCodeActions(context) {
const { sourceFile, span, program } = context;
const info = getInfo11(program, sourceFile, span);
if (info === void 0)
return;
const { suggestion, expression, arg } = info;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange22(t, sourceFile, arg, expression));
return [createCodeFixAction(fixId28, changes, [Diagnostics.Use_0, suggestion], fixId28, Diagnostics.Use_Number_isNaN_in_all_conditions)];
},
fixIds: [fixId28],
getAllCodeActions: (context) => {
return codeFixAll(context, errorCodes34, (changes, diag2) => {
const info = getInfo11(context.program, diag2.file, createTextSpan(diag2.start, diag2.length));
if (info) {
doChange22(changes, diag2.file, info.arg, info.expression);
}
});
}
});
function getInfo11(program, sourceFile, span) {
const diag2 = find(program.getSemanticDiagnostics(sourceFile), (diag3) => diag3.start === span.start && diag3.length === span.length);
if (diag2 === void 0 || diag2.relatedInformation === void 0)
return;
const related = find(diag2.relatedInformation, (related2) => related2.code === Diagnostics.Did_you_mean_0.code);
if (related === void 0 || related.file === void 0 || related.start === void 0 || related.length === void 0)
return;
const token = findAncestorMatchingSpan(related.file, createTextSpan(related.start, related.length));
if (token === void 0)
return;
if (isExpression(token) && isBinaryExpression(token.parent)) {
return { suggestion: getSuggestion(related.messageText), expression: token.parent, arg: token };
}
return void 0;
}
function doChange22(changes, sourceFile, arg, expression) {
const callExpression = factory.createCallExpression(
factory.createPropertyAccessExpression(factory.createIdentifier("Number"), factory.createIdentifier("isNaN")),
/*typeArguments*/
void 0,
[arg]
);
const operator = expression.operatorToken.kind;
changes.replaceNode(
sourceFile,
expression,
operator === 38 /* ExclamationEqualsEqualsToken */ || operator === 36 /* ExclamationEqualsToken */ ? factory.createPrefixUnaryExpression(54 /* ExclamationToken */, callExpression) : callExpression
);
}
function getSuggestion(messageText) {
const [_, suggestion] = flattenDiagnosticMessageText(messageText, "\n", 0).match(/\'(.*)\'/) || [];
return suggestion;
}
// src/services/codefixes/fixModuleAndTargetOptions.ts
registerCodeFix({
errorCodes: [
Diagnostics.Top_level_await_expressions_are_only_allowed_when_the_module_option_is_set_to_es2022_esnext_system_node16_or_nodenext_and_the_target_option_is_set_to_es2017_or_higher.code,
Diagnostics.Top_level_for_await_loops_are_only_allowed_when_the_module_option_is_set_to_es2022_esnext_system_node16_or_nodenext_and_the_target_option_is_set_to_es2017_or_higher.code
],
getCodeActions: function getCodeActionsToFixModuleAndTarget(context) {
const compilerOptions = context.program.getCompilerOptions();
const { configFile } = compilerOptions;
if (configFile === void 0) {
return void 0;
}
const codeFixes = [];
const moduleKind = getEmitModuleKind(compilerOptions);
const moduleOutOfRange = moduleKind >= 5 /* ES2015 */ && moduleKind < 99 /* ESNext */;
if (moduleOutOfRange) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (changes2) => {
setJsonCompilerOptionValue(changes2, configFile, "module", factory.createStringLiteral("esnext"));
});
codeFixes.push(createCodeFixActionWithoutFixAll("fixModuleOption", changes, [Diagnostics.Set_the_module_option_in_your_configuration_file_to_0, "esnext"]));
}
const target = getEmitScriptTarget(compilerOptions);
const targetOutOfRange = target < 4 /* ES2017 */ || target > 99 /* ESNext */;
if (targetOutOfRange) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (tracker) => {
const configObject = getTsConfigObjectLiteralExpression(configFile);
if (!configObject)
return;
const options = [["target", factory.createStringLiteral("es2017")]];
if (moduleKind === 1 /* CommonJS */) {
options.push(["module", factory.createStringLiteral("commonjs")]);
}
setJsonCompilerOptionValues(tracker, configFile, options);
});
codeFixes.push(createCodeFixActionWithoutFixAll("fixTargetOption", changes, [Diagnostics.Set_the_target_option_in_your_configuration_file_to_0, "es2017"]));
}
return codeFixes.length ? codeFixes : void 0;
}
});
// src/services/codefixes/fixPropertyAssignment.ts
var fixId29 = "fixPropertyAssignment";
var errorCodes35 = [
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
];
registerCodeFix({
errorCodes: errorCodes35,
fixIds: [fixId29],
getCodeActions(context) {
const { sourceFile, span } = context;
const property = getProperty2(sourceFile, span.start);
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange23(t, context.sourceFile, property));
return [createCodeFixAction(fixId29, changes, [Diagnostics.Change_0_to_1, "=", ":"], fixId29, [Diagnostics.Switch_each_misused_0_to_1, "=", ":"])];
},
getAllCodeActions: (context) => codeFixAll(context, errorCodes35, (changes, diag2) => doChange23(changes, diag2.file, getProperty2(diag2.file, diag2.start)))
});
function doChange23(changes, sourceFile, node) {
changes.replaceNode(sourceFile, node, factory.createPropertyAssignment(node.name, node.objectAssignmentInitializer));
}
function getProperty2(sourceFile, pos) {
return cast(getTokenAtPosition(sourceFile, pos).parent, isShorthandPropertyAssignment);
}
// src/services/codefixes/fixExtendsInterfaceBecomesImplements.ts
var fixId30 = "extendsInterfaceBecomesImplements";
var errorCodes36 = [Diagnostics.Cannot_extend_an_interface_0_Did_you_mean_implements.code];
registerCodeFix({
errorCodes: errorCodes36,
getCodeActions(context) {
const { sourceFile } = context;
const nodes = getNodes2(sourceFile, context.span.start);
if (!nodes)
return void 0;
const { extendsToken, heritageClauses } = nodes;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChanges2(t, sourceFile, extendsToken, heritageClauses));
return [createCodeFixAction(fixId30, changes, Diagnostics.Change_extends_to_implements, fixId30, Diagnostics.Change_all_extended_interfaces_to_implements)];
},
fixIds: [fixId30],
getAllCodeActions: (context) => codeFixAll(context, errorCodes36, (changes, diag2) => {
const nodes = getNodes2(diag2.file, diag2.start);
if (nodes)
doChanges2(changes, diag2.file, nodes.extendsToken, nodes.heritageClauses);
})
});
function getNodes2(sourceFile, pos) {
const token = getTokenAtPosition(sourceFile, pos);
const heritageClauses = getContainingClass(token).heritageClauses;
const extendsToken = heritageClauses[0].getFirstToken();
return extendsToken.kind === 96 /* ExtendsKeyword */ ? { extendsToken, heritageClauses } : void 0;
}
function doChanges2(changes, sourceFile, extendsToken, heritageClauses) {
changes.replaceNode(sourceFile, extendsToken, factory.createToken(119 /* ImplementsKeyword */));
if (heritageClauses.length === 2 && heritageClauses[0].token === 96 /* ExtendsKeyword */ && heritageClauses[1].token === 119 /* ImplementsKeyword */) {
const implementsToken = heritageClauses[1].getFirstToken();
const implementsFullStart = implementsToken.getFullStart();
changes.replaceRange(sourceFile, { pos: implementsFullStart, end: implementsFullStart }, factory.createToken(28 /* CommaToken */));
const text = sourceFile.text;
let end = implementsToken.end;
while (end < text.length && isWhiteSpaceSingleLine(text.charCodeAt(end))) {
end++;
}
changes.deleteRange(sourceFile, { pos: implementsToken.getStart(), end });
}
}
// src/services/codefixes/fixForgottenThisPropertyAccess.ts
var fixId31 = "forgottenThisPropertyAccess";
var didYouMeanStaticMemberCode = Diagnostics.Cannot_find_name_0_Did_you_mean_the_static_member_1_0.code;
var errorCodes37 = [
Diagnostics.Cannot_find_name_0_Did_you_mean_the_instance_member_this_0.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,
didYouMeanStaticMemberCode
];
registerCodeFix({
errorCodes: errorCodes37,
getCodeActions(context) {
const { sourceFile } = context;
const info = getInfo12(sourceFile, context.span.start, context.errorCode);
if (!info) {
return void 0;
}
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange24(t, sourceFile, info));
return [createCodeFixAction(fixId31, changes, [Diagnostics.Add_0_to_unresolved_variable, info.className || "this"], fixId31, Diagnostics.Add_qualifier_to_all_unresolved_variables_matching_a_member_name)];
},
fixIds: [fixId31],
getAllCodeActions: (context) => codeFixAll(context, errorCodes37, (changes, diag2) => {
const info = getInfo12(diag2.file, diag2.start, diag2.code);
if (info)
doChange24(changes, context.sourceFile, info);
})
});
function getInfo12(sourceFile, pos, diagCode) {
const node = getTokenAtPosition(sourceFile, pos);
if (isIdentifier(node) || isPrivateIdentifier(node)) {
return { node, className: diagCode === didYouMeanStaticMemberCode ? getContainingClass(node).name.text : void 0 };
}
}
function doChange24(changes, sourceFile, { node, className }) {
suppressLeadingAndTrailingTrivia(node);
changes.replaceNode(sourceFile, node, factory.createPropertyAccessExpression(className ? factory.createIdentifier(className) : factory.createThis(), node));
}
// src/services/codefixes/fixInvalidJsxCharacters.ts
var fixIdExpression = "fixInvalidJsxCharacters_expression";
var fixIdHtmlEntity = "fixInvalidJsxCharacters_htmlEntity";
var errorCodes38 = [
Diagnostics.Unexpected_token_Did_you_mean_or_gt.code,
Diagnostics.Unexpected_token_Did_you_mean_or_rbrace.code
];
registerCodeFix({
errorCodes: errorCodes38,
fixIds: [fixIdExpression, fixIdHtmlEntity],
getCodeActions(context) {
const { sourceFile, preferences, span } = context;
const changeToExpression = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange25(
t,
preferences,
sourceFile,
span.start,
/*useHtmlEntity*/
false
));
const changeToHtmlEntity = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange25(
t,
preferences,
sourceFile,
span.start,
/*useHtmlEntity*/
true
));
return [
createCodeFixAction(fixIdExpression, changeToExpression, Diagnostics.Wrap_invalid_character_in_an_expression_container, fixIdExpression, Diagnostics.Wrap_all_invalid_characters_in_an_expression_container),
createCodeFixAction(fixIdHtmlEntity, changeToHtmlEntity, Diagnostics.Convert_invalid_character_to_its_html_entity_code, fixIdHtmlEntity, Diagnostics.Convert_all_invalid_characters_to_HTML_entity_code)
];
},
getAllCodeActions(context) {
return codeFixAll(context, errorCodes38, (changes, diagnostic) => doChange25(changes, context.preferences, diagnostic.file, diagnostic.start, context.fixId === fixIdHtmlEntity));
}
});
var htmlEntity = {
">": ">",
"}": "}"
};
function isValidCharacter(character) {
return hasProperty(htmlEntity, character);
}
function doChange25(changes, preferences, sourceFile, start2, useHtmlEntity) {
const character = sourceFile.getText()[start2];
if (!isValidCharacter(character)) {
return;
}
const replacement = useHtmlEntity ? htmlEntity[character] : `{${quote(sourceFile, preferences, character)}}`;
changes.replaceRangeWithText(sourceFile, { pos: start2, end: start2 + 1 }, replacement);
}
// src/services/codefixes/fixUnmatchedParameter.ts
var deleteUnmatchedParameter = "deleteUnmatchedParameter";
var renameUnmatchedParameter = "renameUnmatchedParameter";
var errorCodes39 = [
Diagnostics.JSDoc_param_tag_has_name_0_but_there_is_no_parameter_with_that_name.code
];
registerCodeFix({
fixIds: [deleteUnmatchedParameter, renameUnmatchedParameter],
errorCodes: errorCodes39,
getCodeActions: function getCodeActionsToFixUnmatchedParameter(context) {
const { sourceFile, span } = context;
const actions2 = [];
const info = getInfo13(sourceFile, span.start);
if (info) {
append(actions2, getDeleteAction(context, info));
append(actions2, getRenameAction(context, info));
return actions2;
}
return void 0;
},
getAllCodeActions: function getAllCodeActionsToFixUnmatchedParameter(context) {
const tagsToSignature = /* @__PURE__ */ new Map();
return createCombinedCodeActions(ts_textChanges_exports.ChangeTracker.with(context, (changes) => {
eachDiagnostic(context, errorCodes39, ({ file, start: start2 }) => {
const info = getInfo13(file, start2);
if (info) {
tagsToSignature.set(info.signature, append(tagsToSignature.get(info.signature), info.jsDocParameterTag));
}
});
tagsToSignature.forEach((tags, signature) => {
if (context.fixId === deleteUnmatchedParameter) {
const tagsSet = new Set(tags);
changes.filterJSDocTags(signature.getSourceFile(), signature, (t) => !tagsSet.has(t));
}
});
}));
}
});
function getDeleteAction(context, { name, jsDocHost, jsDocParameterTag }) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (changeTracker) => changeTracker.filterJSDocTags(context.sourceFile, jsDocHost, (t) => t !== jsDocParameterTag));
return createCodeFixAction(
deleteUnmatchedParameter,
changes,
[Diagnostics.Delete_unused_param_tag_0, name.getText(context.sourceFile)],
deleteUnmatchedParameter,
Diagnostics.Delete_all_unused_param_tags
);
}
function getRenameAction(context, { name, jsDocHost, signature, jsDocParameterTag }) {
if (!length(signature.parameters))
return void 0;
const sourceFile = context.sourceFile;
const tags = getJSDocTags(signature);
const names = /* @__PURE__ */ new Set();
for (const tag of tags) {
if (isJSDocParameterTag(tag) && isIdentifier(tag.name)) {
names.add(tag.name.escapedText);
}
}
const parameterName = firstDefined(signature.parameters, (p) => isIdentifier(p.name) && !names.has(p.name.escapedText) ? p.name.getText(sourceFile) : void 0);
if (parameterName === void 0)
return void 0;
const newJSDocParameterTag = factory.updateJSDocParameterTag(
jsDocParameterTag,
jsDocParameterTag.tagName,
factory.createIdentifier(parameterName),
jsDocParameterTag.isBracketed,
jsDocParameterTag.typeExpression,
jsDocParameterTag.isNameFirst,
jsDocParameterTag.comment
);
const changes = ts_textChanges_exports.ChangeTracker.with(context, (changeTracker) => changeTracker.replaceJSDocComment(sourceFile, jsDocHost, map(tags, (t) => t === jsDocParameterTag ? newJSDocParameterTag : t)));
return createCodeFixActionWithoutFixAll(renameUnmatchedParameter, changes, [Diagnostics.Rename_param_tag_name_0_to_1, name.getText(sourceFile), parameterName]);
}
function getInfo13(sourceFile, pos) {
const token = getTokenAtPosition(sourceFile, pos);
if (token.parent && isJSDocParameterTag(token.parent) && isIdentifier(token.parent.name)) {
const jsDocParameterTag = token.parent;
const jsDocHost = getJSDocHost(jsDocParameterTag);
const signature = getHostSignatureFromJSDoc(jsDocParameterTag);
if (jsDocHost && signature) {
return { jsDocHost, signature, name: token.parent.name, jsDocParameterTag };
}
}
return void 0;
}
// src/services/codefixes/fixUnreferenceableDecoratorMetadata.ts
var fixId32 = "fixUnreferenceableDecoratorMetadata";
var errorCodes40 = [Diagnostics.A_type_referenced_in_a_decorated_signature_must_be_imported_with_import_type_or_a_namespace_import_when_isolatedModules_and_emitDecoratorMetadata_are_enabled.code];
registerCodeFix({
errorCodes: errorCodes40,
getCodeActions: (context) => {
const importDeclaration = getImportDeclaration(context.sourceFile, context.program, context.span.start);
if (!importDeclaration)
return;
const namespaceChanges = ts_textChanges_exports.ChangeTracker.with(context, (t) => importDeclaration.kind === 275 /* ImportSpecifier */ && doNamespaceImportChange(t, context.sourceFile, importDeclaration, context.program));
const typeOnlyChanges = ts_textChanges_exports.ChangeTracker.with(context, (t) => doTypeOnlyImportChange(t, context.sourceFile, importDeclaration, context.program));
let actions2;
if (namespaceChanges.length) {
actions2 = append(actions2, createCodeFixActionWithoutFixAll(fixId32, namespaceChanges, Diagnostics.Convert_named_imports_to_namespace_import));
}
if (typeOnlyChanges.length) {
actions2 = append(actions2, createCodeFixActionWithoutFixAll(fixId32, typeOnlyChanges, Diagnostics.Convert_to_type_only_import));
}
return actions2;
},
fixIds: [fixId32]
});
function getImportDeclaration(sourceFile, program, start2) {
const identifier = tryCast(getTokenAtPosition(sourceFile, start2), isIdentifier);
if (!identifier || identifier.parent.kind !== 182 /* TypeReference */)
return;
const checker = program.getTypeChecker();
const symbol = checker.getSymbolAtLocation(identifier);
return find((symbol == null ? void 0 : symbol.declarations) || emptyArray, or(isImportClause, isImportSpecifier, isImportEqualsDeclaration));
}
function doTypeOnlyImportChange(changes, sourceFile, importDeclaration, program) {
if (importDeclaration.kind === 270 /* ImportEqualsDeclaration */) {
changes.insertModifierBefore(sourceFile, 156 /* TypeKeyword */, importDeclaration.name);
return;
}
const importClause = importDeclaration.kind === 272 /* ImportClause */ ? importDeclaration : importDeclaration.parent.parent;
if (importClause.name && importClause.namedBindings) {
return;
}
const checker = program.getTypeChecker();
const importsValue = !!forEachImportClauseDeclaration(importClause, (decl) => {
if (skipAlias(decl.symbol, checker).flags & 111551 /* Value */)
return true;
});
if (importsValue) {
return;
}
changes.insertModifierBefore(sourceFile, 156 /* TypeKeyword */, importClause);
}
function doNamespaceImportChange(changes, sourceFile, importDeclaration, program) {
ts_refactor_exports.doChangeNamedToNamespaceOrDefault(sourceFile, program, changes, importDeclaration.parent);
}
// src/services/codefixes/fixUnusedIdentifier.ts
var fixName3 = "unusedIdentifier";
var fixIdPrefix = "unusedIdentifier_prefix";
var fixIdDelete = "unusedIdentifier_delete";
var fixIdDeleteImports = "unusedIdentifier_deleteImports";
var fixIdInfer = "unusedIdentifier_infer";
var errorCodes41 = [
Diagnostics._0_is_declared_but_its_value_is_never_read.code,
Diagnostics._0_is_declared_but_never_used.code,
Diagnostics.Property_0_is_declared_but_its_value_is_never_read.code,
Diagnostics.All_imports_in_import_declaration_are_unused.code,
Diagnostics.All_destructured_elements_are_unused.code,
Diagnostics.All_variables_are_unused.code,
Diagnostics.All_type_parameters_are_unused.code
];
registerCodeFix({
errorCodes: errorCodes41,
getCodeActions(context) {
const { errorCode, sourceFile, program, cancellationToken } = context;
const checker = program.getTypeChecker();
const sourceFiles = program.getSourceFiles();
const token = getTokenAtPosition(sourceFile, context.span.start);
if (isJSDocTemplateTag(token)) {
return [createDeleteFix(ts_textChanges_exports.ChangeTracker.with(context, (t) => t.delete(sourceFile, token)), Diagnostics.Remove_template_tag)];
}
if (token.kind === 30 /* LessThanToken */) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => deleteTypeParameters(t, sourceFile, token));
return [createDeleteFix(changes, Diagnostics.Remove_type_parameters)];
}
const importDecl = tryGetFullImport(token);
if (importDecl) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => t.delete(sourceFile, importDecl));
return [createCodeFixAction(fixName3, changes, [Diagnostics.Remove_import_from_0, showModuleSpecifier(importDecl)], fixIdDeleteImports, Diagnostics.Delete_all_unused_imports)];
} else if (isImport(token)) {
const deletion = ts_textChanges_exports.ChangeTracker.with(context, (t) => tryDeleteDeclaration(
sourceFile,
token,
t,
checker,
sourceFiles,
program,
cancellationToken,
/*isFixAll*/
false
));
if (deletion.length) {
return [createCodeFixAction(fixName3, deletion, [Diagnostics.Remove_unused_declaration_for_Colon_0, token.getText(sourceFile)], fixIdDeleteImports, Diagnostics.Delete_all_unused_imports)];
}
}
if (isObjectBindingPattern(token.parent) || isArrayBindingPattern(token.parent)) {
if (isParameter(token.parent.parent)) {
const elements = token.parent.elements;
const diagnostic = [
elements.length > 1 ? Diagnostics.Remove_unused_declarations_for_Colon_0 : Diagnostics.Remove_unused_declaration_for_Colon_0,
map(elements, (e) => e.getText(sourceFile)).join(", ")
];
return [
createDeleteFix(ts_textChanges_exports.ChangeTracker.with(context, (t) => deleteDestructuringElements(t, sourceFile, token.parent)), diagnostic)
];
}
return [
createDeleteFix(ts_textChanges_exports.ChangeTracker.with(context, (t) => deleteDestructuring(context, t, sourceFile, token.parent)), Diagnostics.Remove_unused_destructuring_declaration)
];
}
if (canDeleteEntireVariableStatement(sourceFile, token)) {
return [
createDeleteFix(ts_textChanges_exports.ChangeTracker.with(context, (t) => deleteEntireVariableStatement(t, sourceFile, token.parent)), Diagnostics.Remove_variable_statement)
];
}
const result = [];
if (token.kind === 140 /* InferKeyword */) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => changeInferToUnknown(t, sourceFile, token));
const name = cast(token.parent, isInferTypeNode).typeParameter.name.text;
result.push(createCodeFixAction(fixName3, changes, [Diagnostics.Replace_infer_0_with_unknown, name], fixIdInfer, Diagnostics.Replace_all_unused_infer_with_unknown));
} else {
const deletion = ts_textChanges_exports.ChangeTracker.with(context, (t) => tryDeleteDeclaration(
sourceFile,
token,
t,
checker,
sourceFiles,
program,
cancellationToken,
/*isFixAll*/
false
));
if (deletion.length) {
const name = isComputedPropertyName(token.parent) ? token.parent : token;
result.push(createDeleteFix(deletion, [Diagnostics.Remove_unused_declaration_for_Colon_0, name.getText(sourceFile)]));
}
}
const prefix = ts_textChanges_exports.ChangeTracker.with(context, (t) => tryPrefixDeclaration(t, errorCode, sourceFile, token));
if (prefix.length) {
result.push(createCodeFixAction(fixName3, prefix, [Diagnostics.Prefix_0_with_an_underscore, token.getText(sourceFile)], fixIdPrefix, Diagnostics.Prefix_all_unused_declarations_with_where_possible));
}
return result;
},
fixIds: [fixIdPrefix, fixIdDelete, fixIdDeleteImports, fixIdInfer],
getAllCodeActions: (context) => {
const { sourceFile, program, cancellationToken } = context;
const checker = program.getTypeChecker();
const sourceFiles = program.getSourceFiles();
return codeFixAll(context, errorCodes41, (changes, diag2) => {
const token = getTokenAtPosition(sourceFile, diag2.start);
switch (context.fixId) {
case fixIdPrefix:
tryPrefixDeclaration(changes, diag2.code, sourceFile, token);
break;
case fixIdDeleteImports: {
const importDecl = tryGetFullImport(token);
if (importDecl) {
changes.delete(sourceFile, importDecl);
} else if (isImport(token)) {
tryDeleteDeclaration(
sourceFile,
token,
changes,
checker,
sourceFiles,
program,
cancellationToken,
/*isFixAll*/
true
);
}
break;
}
case fixIdDelete: {
if (token.kind === 140 /* InferKeyword */ || isImport(token)) {
break;
} else if (isJSDocTemplateTag(token)) {
changes.delete(sourceFile, token);
} else if (token.kind === 30 /* LessThanToken */) {
deleteTypeParameters(changes, sourceFile, token);
} else if (isObjectBindingPattern(token.parent)) {
if (token.parent.parent.initializer) {
break;
} else if (!isParameter(token.parent.parent) || isNotProvidedArguments(token.parent.parent, checker, sourceFiles)) {
changes.delete(sourceFile, token.parent.parent);
}
} else if (isArrayBindingPattern(token.parent.parent) && token.parent.parent.parent.initializer) {
break;
} else if (canDeleteEntireVariableStatement(sourceFile, token)) {
deleteEntireVariableStatement(changes, sourceFile, token.parent);
} else {
tryDeleteDeclaration(
sourceFile,
token,
changes,
checker,
sourceFiles,
program,
cancellationToken,
/*isFixAll*/
true
);
}
break;
}
case fixIdInfer:
if (token.kind === 140 /* InferKeyword */) {
changeInferToUnknown(changes, sourceFile, token);
}
break;
default:
Debug.fail(JSON.stringify(context.fixId));
}
});
}
});
function changeInferToUnknown(changes, sourceFile, token) {
changes.replaceNode(sourceFile, token.parent, factory.createKeywordTypeNode(159 /* UnknownKeyword */));
}
function createDeleteFix(changes, diag2) {
return createCodeFixAction(fixName3, changes, diag2, fixIdDelete, Diagnostics.Delete_all_unused_declarations);
}
function deleteTypeParameters(changes, sourceFile, token) {
changes.delete(sourceFile, Debug.checkDefined(cast(token.parent, isDeclarationWithTypeParameterChildren).typeParameters, "The type parameter to delete should exist"));
}
function isImport(token) {
return token.kind === 102 /* ImportKeyword */ || token.kind === 80 /* Identifier */ && (token.parent.kind === 275 /* ImportSpecifier */ || token.parent.kind === 272 /* ImportClause */);
}
function tryGetFullImport(token) {
return token.kind === 102 /* ImportKeyword */ ? tryCast(token.parent, isImportDeclaration) : void 0;
}
function canDeleteEntireVariableStatement(sourceFile, token) {
return isVariableDeclarationList(token.parent) && first(token.parent.getChildren(sourceFile)) === token;
}
function deleteEntireVariableStatement(changes, sourceFile, node) {
changes.delete(sourceFile, node.parent.kind === 242 /* VariableStatement */ ? node.parent : node);
}
function deleteDestructuringElements(changes, sourceFile, node) {
forEach(node.elements, (n) => changes.delete(sourceFile, n));
}
function deleteDestructuring(context, changes, sourceFile, { parent: parent2 }) {
if (isVariableDeclaration(parent2) && parent2.initializer && isCallLikeExpression(parent2.initializer)) {
if (isVariableDeclarationList(parent2.parent) && length(parent2.parent.declarations) > 1) {
const varStatement = parent2.parent.parent;
const pos = varStatement.getStart(sourceFile);
const end = varStatement.end;
changes.delete(sourceFile, parent2);
changes.insertNodeAt(sourceFile, end, parent2.initializer, {
prefix: getNewLineOrDefaultFromHost(context.host, context.formatContext.options) + sourceFile.text.slice(getPrecedingNonSpaceCharacterPosition(sourceFile.text, pos - 1), pos),
suffix: probablyUsesSemicolons(sourceFile) ? ";" : ""
});
} else {
changes.replaceNode(sourceFile, parent2.parent, parent2.initializer);
}
} else {
changes.delete(sourceFile, parent2);
}
}
function tryPrefixDeclaration(changes, errorCode, sourceFile, token) {
if (errorCode === Diagnostics.Property_0_is_declared_but_its_value_is_never_read.code)
return;
if (token.kind === 140 /* InferKeyword */) {
token = cast(token.parent, isInferTypeNode).typeParameter.name;
}
if (isIdentifier(token) && canPrefix(token)) {
changes.replaceNode(sourceFile, token, factory.createIdentifier(`_${token.text}`));
if (isParameter(token.parent)) {
getJSDocParameterTags(token.parent).forEach((tag) => {
if (isIdentifier(tag.name)) {
changes.replaceNode(sourceFile, tag.name, factory.createIdentifier(`_${tag.name.text}`));
}
});
}
}
}
function canPrefix(token) {
switch (token.parent.kind) {
case 168 /* Parameter */:
case 167 /* TypeParameter */:
return true;
case 259 /* VariableDeclaration */: {
const varDecl = token.parent;
switch (varDecl.parent.parent.kind) {
case 249 /* ForOfStatement */:
case 248 /* ForInStatement */:
return true;
}
}
}
return false;
}
function tryDeleteDeclaration(sourceFile, token, changes, checker, sourceFiles, program, cancellationToken, isFixAll) {
tryDeleteDeclarationWorker(token, changes, sourceFile, checker, sourceFiles, program, cancellationToken, isFixAll);
if (isIdentifier(token)) {
ts_FindAllReferences_exports.Core.eachSymbolReferenceInFile(token, checker, sourceFile, (ref) => {
if (isPropertyAccessExpression(ref.parent) && ref.parent.name === ref)
ref = ref.parent;
if (!isFixAll && mayDeleteExpression(ref)) {
changes.delete(sourceFile, ref.parent.parent);
}
});
}
}
function tryDeleteDeclarationWorker(token, changes, sourceFile, checker, sourceFiles, program, cancellationToken, isFixAll) {
const { parent: parent2 } = token;
if (isParameter(parent2)) {
tryDeleteParameter(changes, sourceFile, parent2, checker, sourceFiles, program, cancellationToken, isFixAll);
} else if (!(isFixAll && isIdentifier(token) && ts_FindAllReferences_exports.Core.isSymbolReferencedInFile(token, checker, sourceFile))) {
const node = isImportClause(parent2) ? token : isComputedPropertyName(parent2) ? parent2.parent : parent2;
Debug.assert(node !== sourceFile, "should not delete whole source file");
changes.delete(sourceFile, node);
}
}
function tryDeleteParameter(changes, sourceFile, parameter, checker, sourceFiles, program, cancellationToken, isFixAll = false) {
if (mayDeleteParameter(checker, sourceFile, parameter, sourceFiles, program, cancellationToken, isFixAll)) {
if (parameter.modifiers && parameter.modifiers.length > 0 && (!isIdentifier(parameter.name) || ts_FindAllReferences_exports.Core.isSymbolReferencedInFile(parameter.name, checker, sourceFile))) {
for (const modifier of parameter.modifiers) {
if (isModifier(modifier)) {
changes.deleteModifier(sourceFile, modifier);
}
}
} else if (!parameter.initializer && isNotProvidedArguments(parameter, checker, sourceFiles)) {
changes.delete(sourceFile, parameter);
}
}
}
function isNotProvidedArguments(parameter, checker, sourceFiles) {
const index = parameter.parent.parameters.indexOf(parameter);
return !ts_FindAllReferences_exports.Core.someSignatureUsage(parameter.parent, sourceFiles, checker, (_, call) => !call || call.arguments.length > index);
}
function mayDeleteParameter(checker, sourceFile, parameter, sourceFiles, program, cancellationToken, isFixAll) {
const { parent: parent2 } = parameter;
switch (parent2.kind) {
case 173 /* MethodDeclaration */:
case 175 /* Constructor */:
const index = parent2.parameters.indexOf(parameter);
const referent = isMethodDeclaration(parent2) ? parent2.name : parent2;
const entries = ts_FindAllReferences_exports.Core.getReferencedSymbolsForNode(parent2.pos, referent, program, sourceFiles, cancellationToken);
if (entries) {
for (const entry of entries) {
for (const reference of entry.references) {
if (reference.kind === ts_FindAllReferences_exports.EntryKind.Node) {
const isSuperCall2 = isSuperKeyword(reference.node) && isCallExpression(reference.node.parent) && reference.node.parent.arguments.length > index;
const isSuperMethodCall = isPropertyAccessExpression(reference.node.parent) && isSuperKeyword(reference.node.parent.expression) && isCallExpression(reference.node.parent.parent) && reference.node.parent.parent.arguments.length > index;
const isOverriddenMethod = (isMethodDeclaration(reference.node.parent) || isMethodSignature(reference.node.parent)) && reference.node.parent !== parameter.parent && reference.node.parent.parameters.length > index;
if (isSuperCall2 || isSuperMethodCall || isOverriddenMethod)
return false;
}
}
}
}
return true;
case 261 /* FunctionDeclaration */: {
if (parent2.name && isCallbackLike(checker, sourceFile, parent2.name)) {
return isLastParameter(parent2, parameter, isFixAll);
}
return true;
}
case 217 /* FunctionExpression */:
case 218 /* ArrowFunction */:
return isLastParameter(parent2, parameter, isFixAll);
case 177 /* SetAccessor */:
return false;
case 176 /* GetAccessor */:
return true;
default:
return Debug.failBadSyntaxKind(parent2);
}
}
function isCallbackLike(checker, sourceFile, name) {
return !!ts_FindAllReferences_exports.Core.eachSymbolReferenceInFile(name, checker, sourceFile, (reference) => isIdentifier(reference) && isCallExpression(reference.parent) && reference.parent.arguments.indexOf(reference) >= 0);
}
function isLastParameter(func, parameter, isFixAll) {
const parameters = func.parameters;
const index = parameters.indexOf(parameter);
Debug.assert(index !== -1, "The parameter should already be in the list");
return isFixAll ? parameters.slice(index + 1).every((p) => isIdentifier(p.name) && !p.symbol.isReferenced) : index === parameters.length - 1;
}
function mayDeleteExpression(node) {
return (isBinaryExpression(node.parent) && node.parent.left === node || (isPostfixUnaryExpression(node.parent) || isPrefixUnaryExpression(node.parent)) && node.parent.operand === node) && isExpressionStatement(node.parent.parent);
}
// src/services/codefixes/fixUnreachableCode.ts
var fixId33 = "fixUnreachableCode";
var errorCodes42 = [Diagnostics.Unreachable_code_detected.code];
registerCodeFix({
errorCodes: errorCodes42,
getCodeActions(context) {
const syntacticDiagnostics = context.program.getSyntacticDiagnostics(context.sourceFile, context.cancellationToken);
if (syntacticDiagnostics.length)
return;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange26(t, context.sourceFile, context.span.start, context.span.length, context.errorCode));
return [createCodeFixAction(fixId33, changes, Diagnostics.Remove_unreachable_code, fixId33, Diagnostics.Remove_all_unreachable_code)];
},
fixIds: [fixId33],
getAllCodeActions: (context) => codeFixAll(context, errorCodes42, (changes, diag2) => doChange26(changes, diag2.file, diag2.start, diag2.length, diag2.code))
});
function doChange26(changes, sourceFile, start2, length2, errorCode) {
const token = getTokenAtPosition(sourceFile, start2);
const statement = findAncestor(token, isStatement);
if (statement.getStart(sourceFile) !== token.getStart(sourceFile)) {
const logData = JSON.stringify({
statementKind: Debug.formatSyntaxKind(statement.kind),
tokenKind: Debug.formatSyntaxKind(token.kind),
errorCode,
start: start2,
length: length2
});
Debug.fail("Token and statement should start at the same point. " + logData);
}
const container = (isBlock(statement.parent) ? statement.parent : statement).parent;
if (!isBlock(statement.parent) || statement === first(statement.parent.statements)) {
switch (container.kind) {
case 244 /* IfStatement */:
if (container.elseStatement) {
if (isBlock(statement.parent)) {
break;
} else {
changes.replaceNode(sourceFile, statement, factory.createBlock(emptyArray));
}
return;
}
case 246 /* WhileStatement */:
case 247 /* ForStatement */:
changes.delete(sourceFile, container);
return;
}
}
if (isBlock(statement.parent)) {
const end = start2 + length2;
const lastStatement = Debug.checkDefined(lastWhere(sliceAfter(statement.parent.statements, statement), (s) => s.pos < end), "Some statement should be last");
changes.deleteNodeRange(sourceFile, statement, lastStatement);
} else {
changes.delete(sourceFile, statement);
}
}
function lastWhere(a, pred) {
let last2;
for (const value of a) {
if (!pred(value))
break;
last2 = value;
}
return last2;
}
// src/services/codefixes/fixUnusedLabel.ts
var fixId34 = "fixUnusedLabel";
var errorCodes43 = [Diagnostics.Unused_label.code];
registerCodeFix({
errorCodes: errorCodes43,
getCodeActions(context) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange27(t, context.sourceFile, context.span.start));
return [createCodeFixAction(fixId34, changes, Diagnostics.Remove_unused_label, fixId34, Diagnostics.Remove_all_unused_labels)];
},
fixIds: [fixId34],
getAllCodeActions: (context) => codeFixAll(context, errorCodes43, (changes, diag2) => doChange27(changes, diag2.file, diag2.start))
});
function doChange27(changes, sourceFile, start2) {
const token = getTokenAtPosition(sourceFile, start2);
const labeledStatement = cast(token.parent, isLabeledStatement);
const pos = token.getStart(sourceFile);
const statementPos = labeledStatement.statement.getStart(sourceFile);
const end = positionsAreOnSameLine(pos, statementPos, sourceFile) ? statementPos : skipTrivia(
sourceFile.text,
findChildOfKind(labeledStatement, 59 /* ColonToken */, sourceFile).end,
/*stopAfterLineBreak*/
true
);
changes.deleteRange(sourceFile, { pos, end });
}
// src/services/codefixes/fixJSDocTypes.ts
var fixIdPlain = "fixJSDocTypes_plain";
var fixIdNullable = "fixJSDocTypes_nullable";
var errorCodes44 = [
Diagnostics.JSDoc_types_can_only_be_used_inside_documentation_comments.code,
Diagnostics._0_at_the_end_of_a_type_is_not_valid_TypeScript_syntax_Did_you_mean_to_write_1.code,
Diagnostics._0_at_the_start_of_a_type_is_not_valid_TypeScript_syntax_Did_you_mean_to_write_1.code
];
registerCodeFix({
errorCodes: errorCodes44,
getCodeActions(context) {
const { sourceFile } = context;
const checker = context.program.getTypeChecker();
const info = getInfo14(sourceFile, context.span.start, checker);
if (!info)
return void 0;
const { typeNode, type } = info;
const original = typeNode.getText(sourceFile);
const actions2 = [fix(type, fixIdPlain, Diagnostics.Change_all_jsdoc_style_types_to_TypeScript)];
if (typeNode.kind === 320 /* JSDocNullableType */) {
actions2.push(fix(type, fixIdNullable, Diagnostics.Change_all_jsdoc_style_types_to_TypeScript_and_add_undefined_to_nullable_types));
}
return actions2;
function fix(type2, fixId52, fixAllDescription) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange28(t, sourceFile, typeNode, type2, checker));
return createCodeFixAction("jdocTypes", changes, [Diagnostics.Change_0_to_1, original, checker.typeToString(type2)], fixId52, fixAllDescription);
}
},
fixIds: [fixIdPlain, fixIdNullable],
getAllCodeActions(context) {
const { fixId: fixId52, program, sourceFile } = context;
const checker = program.getTypeChecker();
return codeFixAll(context, errorCodes44, (changes, err) => {
const info = getInfo14(err.file, err.start, checker);
if (!info)
return;
const { typeNode, type } = info;
const fixedType = typeNode.kind === 320 /* JSDocNullableType */ && fixId52 === fixIdNullable ? checker.getNullableType(type, 32768 /* Undefined */) : type;
doChange28(changes, sourceFile, typeNode, fixedType, checker);
});
}
});
function doChange28(changes, sourceFile, oldTypeNode, newType, checker) {
changes.replaceNode(sourceFile, oldTypeNode, checker.typeToTypeNode(
newType,
/*enclosingDeclaration*/
oldTypeNode,
/*flags*/
void 0
));
}
function getInfo14(sourceFile, pos, checker) {
const decl = findAncestor(getTokenAtPosition(sourceFile, pos), isTypeContainer);
const typeNode = decl && decl.type;
return typeNode && { typeNode, type: getType(checker, typeNode) };
}
function isTypeContainer(node) {
switch (node.kind) {
case 233 /* AsExpression */:
case 178 /* CallSignature */:
case 179 /* ConstructSignature */:
case 261 /* FunctionDeclaration */:
case 176 /* GetAccessor */:
case 180 /* IndexSignature */:
case 199 /* MappedType */:
case 173 /* MethodDeclaration */:
case 172 /* MethodSignature */:
case 168 /* Parameter */:
case 171 /* PropertyDeclaration */:
case 170 /* PropertySignature */:
case 177 /* SetAccessor */:
case 264 /* TypeAliasDeclaration */:
case 215 /* TypeAssertionExpression */:
case 259 /* VariableDeclaration */:
return true;
default:
return false;
}
}
function getType(checker, node) {
if (isJSDocNullableType(node)) {
const type = checker.getTypeFromTypeNode(node.type);
if (type === checker.getNeverType() || type === checker.getVoidType()) {
return type;
}
return checker.getUnionType(
append([type, checker.getUndefinedType()], node.postfix ? void 0 : checker.getNullType())
);
}
return checker.getTypeFromTypeNode(node);
}
// src/services/codefixes/fixMissingCallParentheses.ts
var fixId35 = "fixMissingCallParentheses";
var errorCodes45 = [
Diagnostics.This_condition_will_always_return_true_since_this_function_is_always_defined_Did_you_mean_to_call_it_instead.code
];
registerCodeFix({
errorCodes: errorCodes45,
fixIds: [fixId35],
getCodeActions(context) {
const { sourceFile, span } = context;
const callName = getCallName(sourceFile, span.start);
if (!callName)
return;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange29(t, context.sourceFile, callName));
return [createCodeFixAction(fixId35, changes, Diagnostics.Add_missing_call_parentheses, fixId35, Diagnostics.Add_all_missing_call_parentheses)];
},
getAllCodeActions: (context) => codeFixAll(context, errorCodes45, (changes, diag2) => {
const callName = getCallName(diag2.file, diag2.start);
if (callName)
doChange29(changes, diag2.file, callName);
})
});
function doChange29(changes, sourceFile, name) {
changes.replaceNodeWithText(sourceFile, name, `${name.text}()`);
}
function getCallName(sourceFile, start2) {
const token = getTokenAtPosition(sourceFile, start2);
if (isPropertyAccessExpression(token.parent)) {
let current = token.parent;
while (isPropertyAccessExpression(current.parent)) {
current = current.parent;
}
return current.name;
}
if (isIdentifier(token)) {
return token;
}
return void 0;
}
// src/services/codefixes/fixAwaitInSyncFunction.ts
var fixId36 = "fixAwaitInSyncFunction";
var errorCodes46 = [
Diagnostics.await_expressions_are_only_allowed_within_async_functions_and_at_the_top_levels_of_modules.code,
Diagnostics.for_await_loops_are_only_allowed_within_async_functions_and_at_the_top_levels_of_modules.code,
Diagnostics.Cannot_find_name_0_Did_you_mean_to_write_this_in_an_async_function.code
];
registerCodeFix({
errorCodes: errorCodes46,
getCodeActions(context) {
const { sourceFile, span } = context;
const nodes = getNodes3(sourceFile, span.start);
if (!nodes)
return void 0;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange30(t, sourceFile, nodes));
return [createCodeFixAction(fixId36, changes, Diagnostics.Add_async_modifier_to_containing_function, fixId36, Diagnostics.Add_all_missing_async_modifiers)];
},
fixIds: [fixId36],
getAllCodeActions: function getAllCodeActionsToFixAwaitInSyncFunction(context) {
const seen = /* @__PURE__ */ new Map();
return codeFixAll(context, errorCodes46, (changes, diag2) => {
const nodes = getNodes3(diag2.file, diag2.start);
if (!nodes || !addToSeen(seen, getNodeId(nodes.insertBefore)))
return;
doChange30(changes, context.sourceFile, nodes);
});
}
});
function getReturnType(expr) {
if (expr.type) {
return expr.type;
}
if (isVariableDeclaration(expr.parent) && expr.parent.type && isFunctionTypeNode(expr.parent.type)) {
return expr.parent.type.type;
}
}
function getNodes3(sourceFile, start2) {
const token = getTokenAtPosition(sourceFile, start2);
const containingFunction = getContainingFunction(token);
if (!containingFunction) {
return;
}
let insertBefore;
switch (containingFunction.kind) {
case 173 /* MethodDeclaration */:
insertBefore = containingFunction.name;
break;
case 261 /* FunctionDeclaration */:
case 217 /* FunctionExpression */:
insertBefore = findChildOfKind(containingFunction, 100 /* FunctionKeyword */, sourceFile);
break;
case 218 /* ArrowFunction */:
const kind = containingFunction.typeParameters ? 30 /* LessThanToken */ : 21 /* OpenParenToken */;
insertBefore = findChildOfKind(containingFunction, kind, sourceFile) || first(containingFunction.parameters);
break;
default:
return;
}
return insertBefore && {
insertBefore,
returnType: getReturnType(containingFunction)
};
}
function doChange30(changes, sourceFile, { insertBefore, returnType }) {
if (returnType) {
const entityName = getEntityNameFromTypeNode(returnType);
if (!entityName || entityName.kind !== 80 /* Identifier */ || entityName.text !== "Promise") {
changes.replaceNode(sourceFile, returnType, factory.createTypeReferenceNode("Promise", factory.createNodeArray([returnType])));
}
}
changes.insertModifierBefore(sourceFile, 134 /* AsyncKeyword */, insertBefore);
}
// src/services/codefixes/fixPropertyOverrideAccessor.ts
var errorCodes47 = [
Diagnostics._0_is_defined_as_an_accessor_in_class_1_but_is_overridden_here_in_2_as_an_instance_property.code,
Diagnostics._0_is_defined_as_a_property_in_class_1_but_is_overridden_here_in_2_as_an_accessor.code
];
var fixId37 = "fixPropertyOverrideAccessor";
registerCodeFix({
errorCodes: errorCodes47,
getCodeActions(context) {
const edits = doChange31(context.sourceFile, context.span.start, context.span.length, context.errorCode, context);
if (edits) {
return [createCodeFixAction(fixId37, edits, Diagnostics.Generate_get_and_set_accessors, fixId37, Diagnostics.Generate_get_and_set_accessors_for_all_overriding_properties)];
}
},
fixIds: [fixId37],
getAllCodeActions: (context) => codeFixAll(context, errorCodes47, (changes, diag2) => {
const edits = doChange31(diag2.file, diag2.start, diag2.length, diag2.code, context);
if (edits) {
for (const edit of edits) {
changes.pushRaw(context.sourceFile, edit);
}
}
})
});
function doChange31(file, start2, length2, code, context) {
let startPosition;
let endPosition;
if (code === Diagnostics._0_is_defined_as_an_accessor_in_class_1_but_is_overridden_here_in_2_as_an_instance_property.code) {
startPosition = start2;
endPosition = start2 + length2;
} else if (code === Diagnostics._0_is_defined_as_a_property_in_class_1_but_is_overridden_here_in_2_as_an_accessor.code) {
const checker = context.program.getTypeChecker();
const node = getTokenAtPosition(file, start2).parent;
Debug.assert(isAccessor(node), "error span of fixPropertyOverrideAccessor should only be on an accessor");
const containingClass = node.parent;
Debug.assert(isClassLike(containingClass), "erroneous accessors should only be inside classes");
const base = singleOrUndefined(getAllSupers(containingClass, checker));
if (!base)
return [];
const name = unescapeLeadingUnderscores(getTextOfPropertyName(node.name));
const baseProp = checker.getPropertyOfType(checker.getTypeAtLocation(base), name);
if (!baseProp || !baseProp.valueDeclaration)
return [];
startPosition = baseProp.valueDeclaration.pos;
endPosition = baseProp.valueDeclaration.end;
file = getSourceFileOfNode(baseProp.valueDeclaration);
} else {
Debug.fail("fixPropertyOverrideAccessor codefix got unexpected error code " + code);
}
return generateAccessorFromProperty(file, context.program, startPosition, endPosition, context, Diagnostics.Generate_get_and_set_accessors.message);
}
// src/services/codefixes/inferFromUsage.ts
var fixId38 = "inferFromUsage";
var errorCodes48 = [
// Variable declarations
Diagnostics.Variable_0_implicitly_has_type_1_in_some_locations_where_its_type_cannot_be_determined.code,
// Variable uses
Diagnostics.Variable_0_implicitly_has_an_1_type.code,
// Parameter declarations
Diagnostics.Parameter_0_implicitly_has_an_1_type.code,
Diagnostics.Rest_parameter_0_implicitly_has_an_any_type.code,
// Get Accessor declarations
Diagnostics.Property_0_implicitly_has_type_any_because_its_get_accessor_lacks_a_return_type_annotation.code,
Diagnostics._0_which_lacks_return_type_annotation_implicitly_has_an_1_return_type.code,
// Set Accessor declarations
Diagnostics.Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_parameter_type_annotation.code,
// Property declarations
Diagnostics.Member_0_implicitly_has_an_1_type.code,
//// Suggestions
// Variable declarations
Diagnostics.Variable_0_implicitly_has_type_1_in_some_locations_but_a_better_type_may_be_inferred_from_usage.code,
// Variable uses
Diagnostics.Variable_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage.code,
// Parameter declarations
Diagnostics.Parameter_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage.code,
Diagnostics.Rest_parameter_0_implicitly_has_an_any_type_but_a_better_type_may_be_inferred_from_usage.code,
// Get Accessor declarations
Diagnostics.Property_0_implicitly_has_type_any_but_a_better_type_for_its_get_accessor_may_be_inferred_from_usage.code,
Diagnostics._0_implicitly_has_an_1_return_type_but_a_better_type_may_be_inferred_from_usage.code,
// Set Accessor declarations
Diagnostics.Property_0_implicitly_has_type_any_but_a_better_type_for_its_set_accessor_may_be_inferred_from_usage.code,
// Property declarations
Diagnostics.Member_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage.code,
// Function expressions and declarations
Diagnostics.this_implicitly_has_type_any_because_it_does_not_have_a_type_annotation.code
];
registerCodeFix({
errorCodes: errorCodes48,
getCodeActions(context) {
const { sourceFile, program, span: { start: start2 }, errorCode, cancellationToken, host, preferences } = context;
const token = getTokenAtPosition(sourceFile, start2);
let declaration;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (changes2) => {
declaration = doChange32(
changes2,
sourceFile,
token,
errorCode,
program,
cancellationToken,
/*markSeen*/
returnTrue,
host,
preferences
);
});
const name = declaration && getNameOfDeclaration(declaration);
return !name || changes.length === 0 ? void 0 : [createCodeFixAction(fixId38, changes, [getDiagnostic(errorCode, token), getTextOfNode(name)], fixId38, Diagnostics.Infer_all_types_from_usage)];
},
fixIds: [fixId38],
getAllCodeActions(context) {
const { sourceFile, program, cancellationToken, host, preferences } = context;
const markSeen = nodeSeenTracker();
return codeFixAll(context, errorCodes48, (changes, err) => {
doChange32(changes, sourceFile, getTokenAtPosition(err.file, err.start), err.code, program, cancellationToken, markSeen, host, preferences);
});
}
});
function getDiagnostic(errorCode, token) {
switch (errorCode) {
case Diagnostics.Parameter_0_implicitly_has_an_1_type.code:
case Diagnostics.Parameter_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage.code:
return isSetAccessorDeclaration(getContainingFunction(token)) ? Diagnostics.Infer_type_of_0_from_usage : Diagnostics.Infer_parameter_types_from_usage;
case Diagnostics.Rest_parameter_0_implicitly_has_an_any_type.code:
case Diagnostics.Rest_parameter_0_implicitly_has_an_any_type_but_a_better_type_may_be_inferred_from_usage.code:
return Diagnostics.Infer_parameter_types_from_usage;
case Diagnostics.this_implicitly_has_type_any_because_it_does_not_have_a_type_annotation.code:
return Diagnostics.Infer_this_type_of_0_from_usage;
default:
return Diagnostics.Infer_type_of_0_from_usage;
}
}
function mapSuggestionDiagnostic(errorCode) {
switch (errorCode) {
case Diagnostics.Variable_0_implicitly_has_type_1_in_some_locations_but_a_better_type_may_be_inferred_from_usage.code:
return Diagnostics.Variable_0_implicitly_has_type_1_in_some_locations_where_its_type_cannot_be_determined.code;
case Diagnostics.Variable_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage.code:
return Diagnostics.Variable_0_implicitly_has_an_1_type.code;
case Diagnostics.Parameter_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage.code:
return Diagnostics.Parameter_0_implicitly_has_an_1_type.code;
case Diagnostics.Rest_parameter_0_implicitly_has_an_any_type_but_a_better_type_may_be_inferred_from_usage.code:
return Diagnostics.Rest_parameter_0_implicitly_has_an_any_type.code;
case Diagnostics.Property_0_implicitly_has_type_any_but_a_better_type_for_its_get_accessor_may_be_inferred_from_usage.code:
return Diagnostics.Property_0_implicitly_has_type_any_because_its_get_accessor_lacks_a_return_type_annotation.code;
case Diagnostics._0_implicitly_has_an_1_return_type_but_a_better_type_may_be_inferred_from_usage.code:
return Diagnostics._0_which_lacks_return_type_annotation_implicitly_has_an_1_return_type.code;
case Diagnostics.Property_0_implicitly_has_type_any_but_a_better_type_for_its_set_accessor_may_be_inferred_from_usage.code:
return Diagnostics.Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_parameter_type_annotation.code;
case Diagnostics.Member_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage.code:
return Diagnostics.Member_0_implicitly_has_an_1_type.code;
}
return errorCode;
}
function doChange32(changes, sourceFile, token, errorCode, program, cancellationToken, markSeen, host, preferences) {
if (!isParameterPropertyModifier(token.kind) && token.kind !== 80 /* Identifier */ && token.kind !== 26 /* DotDotDotToken */ && token.kind !== 110 /* ThisKeyword */) {
return void 0;
}
const { parent: parent2 } = token;
const importAdder = createImportAdder(sourceFile, program, preferences, host);
errorCode = mapSuggestionDiagnostic(errorCode);
switch (errorCode) {
case Diagnostics.Member_0_implicitly_has_an_1_type.code:
case Diagnostics.Variable_0_implicitly_has_type_1_in_some_locations_where_its_type_cannot_be_determined.code:
if (isVariableDeclaration(parent2) && markSeen(parent2) || isPropertyDeclaration(parent2) || isPropertySignature(parent2)) {
annotateVariableDeclaration(changes, importAdder, sourceFile, parent2, program, host, cancellationToken);
importAdder.writeFixes(changes);
return parent2;
}
if (isPropertyAccessExpression(parent2)) {
const type = inferTypeForVariableFromUsage(parent2.name, program, cancellationToken);
const typeNode = getTypeNodeIfAccessible(type, parent2, program, host);
if (typeNode) {
const typeTag = factory.createJSDocTypeTag(
/*tagName*/
void 0,
factory.createJSDocTypeExpression(typeNode),
/*comment*/
void 0
);
changes.addJSDocTags(sourceFile, cast(parent2.parent.parent, isExpressionStatement), [typeTag]);
}
importAdder.writeFixes(changes);
return parent2;
}
return void 0;
case Diagnostics.Variable_0_implicitly_has_an_1_type.code: {
const symbol = program.getTypeChecker().getSymbolAtLocation(token);
if (symbol && symbol.valueDeclaration && isVariableDeclaration(symbol.valueDeclaration) && markSeen(symbol.valueDeclaration)) {
annotateVariableDeclaration(changes, importAdder, getSourceFileOfNode(symbol.valueDeclaration), symbol.valueDeclaration, program, host, cancellationToken);
importAdder.writeFixes(changes);
return symbol.valueDeclaration;
}
return void 0;
}
}
const containingFunction = getContainingFunction(token);
if (containingFunction === void 0) {
return void 0;
}
let declaration;
switch (errorCode) {
case Diagnostics.Parameter_0_implicitly_has_an_1_type.code:
if (isSetAccessorDeclaration(containingFunction)) {
annotateSetAccessor(changes, importAdder, sourceFile, containingFunction, program, host, cancellationToken);
declaration = containingFunction;
break;
}
case Diagnostics.Rest_parameter_0_implicitly_has_an_any_type.code:
if (markSeen(containingFunction)) {
const param = cast(parent2, isParameter);
annotateParameters(changes, importAdder, sourceFile, param, containingFunction, program, host, cancellationToken);
declaration = param;
}
break;
case Diagnostics.Property_0_implicitly_has_type_any_because_its_get_accessor_lacks_a_return_type_annotation.code:
case Diagnostics._0_which_lacks_return_type_annotation_implicitly_has_an_1_return_type.code:
if (isGetAccessorDeclaration(containingFunction) && isIdentifier(containingFunction.name)) {
annotate(changes, importAdder, sourceFile, containingFunction, inferTypeForVariableFromUsage(containingFunction.name, program, cancellationToken), program, host);
declaration = containingFunction;
}
break;
case Diagnostics.Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_parameter_type_annotation.code:
if (isSetAccessorDeclaration(containingFunction)) {
annotateSetAccessor(changes, importAdder, sourceFile, containingFunction, program, host, cancellationToken);
declaration = containingFunction;
}
break;
case Diagnostics.this_implicitly_has_type_any_because_it_does_not_have_a_type_annotation.code:
if (ts_textChanges_exports.isThisTypeAnnotatable(containingFunction) && markSeen(containingFunction)) {
annotateThis(changes, sourceFile, containingFunction, program, host, cancellationToken);
declaration = containingFunction;
}
break;
default:
return Debug.fail(String(errorCode));
}
importAdder.writeFixes(changes);
return declaration;
}
function annotateVariableDeclaration(changes, importAdder, sourceFile, declaration, program, host, cancellationToken) {
if (isIdentifier(declaration.name)) {
annotate(changes, importAdder, sourceFile, declaration, inferTypeForVariableFromUsage(declaration.name, program, cancellationToken), program, host);
}
}
function annotateParameters(changes, importAdder, sourceFile, parameterDeclaration, containingFunction, program, host, cancellationToken) {
if (!isIdentifier(parameterDeclaration.name)) {
return;
}
const parameterInferences = inferTypeForParametersFromUsage(containingFunction, sourceFile, program, cancellationToken);
Debug.assert(containingFunction.parameters.length === parameterInferences.length, "Parameter count and inference count should match");
if (isInJSFile(containingFunction)) {
annotateJSDocParameters(changes, sourceFile, parameterInferences, program, host);
} else {
const needParens = isArrowFunction(containingFunction) && !findChildOfKind(containingFunction, 21 /* OpenParenToken */, sourceFile);
if (needParens)
changes.insertNodeBefore(sourceFile, first(containingFunction.parameters), factory.createToken(21 /* OpenParenToken */));
for (const { declaration, type } of parameterInferences) {
if (declaration && !declaration.type && !declaration.initializer) {
annotate(changes, importAdder, sourceFile, declaration, type, program, host);
}
}
if (needParens)
changes.insertNodeAfter(sourceFile, last(containingFunction.parameters), factory.createToken(22 /* CloseParenToken */));
}
}
function annotateThis(changes, sourceFile, containingFunction, program, host, cancellationToken) {
const references = getFunctionReferences(containingFunction, sourceFile, program, cancellationToken);
if (!references || !references.length) {
return;
}
const thisInference = inferTypeFromReferences(program, references, cancellationToken).thisParameter();
const typeNode = getTypeNodeIfAccessible(thisInference, containingFunction, program, host);
if (!typeNode) {
return;
}
if (isInJSFile(containingFunction)) {
annotateJSDocThis(changes, sourceFile, containingFunction, typeNode);
} else {
changes.tryInsertThisTypeAnnotation(sourceFile, containingFunction, typeNode);
}
}
function annotateJSDocThis(changes, sourceFile, containingFunction, typeNode) {
changes.addJSDocTags(sourceFile, containingFunction, [
factory.createJSDocThisTag(
/*tagName*/
void 0,
factory.createJSDocTypeExpression(typeNode)
)
]);
}
function annotateSetAccessor(changes, importAdder, sourceFile, setAccessorDeclaration, program, host, cancellationToken) {
const param = firstOrUndefined(setAccessorDeclaration.parameters);
if (param && isIdentifier(setAccessorDeclaration.name) && isIdentifier(param.name)) {
let type = inferTypeForVariableFromUsage(setAccessorDeclaration.name, program, cancellationToken);
if (type === program.getTypeChecker().getAnyType()) {
type = inferTypeForVariableFromUsage(param.name, program, cancellationToken);
}
if (isInJSFile(setAccessorDeclaration)) {
annotateJSDocParameters(changes, sourceFile, [{ declaration: param, type }], program, host);
} else {
annotate(changes, importAdder, sourceFile, param, type, program, host);
}
}
}
function annotate(changes, importAdder, sourceFile, declaration, type, program, host) {
const typeNode = getTypeNodeIfAccessible(type, declaration, program, host);
if (typeNode) {
if (isInJSFile(sourceFile) && declaration.kind !== 170 /* PropertySignature */) {
const parent2 = isVariableDeclaration(declaration) ? tryCast(declaration.parent.parent, isVariableStatement) : declaration;
if (!parent2) {
return;
}
const typeExpression = factory.createJSDocTypeExpression(typeNode);
const typeTag = isGetAccessorDeclaration(declaration) ? factory.createJSDocReturnTag(
/*tagName*/
void 0,
typeExpression,
/*comment*/
void 0
) : factory.createJSDocTypeTag(
/*tagName*/
void 0,
typeExpression,
/*comment*/
void 0
);
changes.addJSDocTags(sourceFile, parent2, [typeTag]);
} else if (!tryReplaceImportTypeNodeWithAutoImport(typeNode, declaration, sourceFile, changes, importAdder, getEmitScriptTarget(program.getCompilerOptions()))) {
changes.tryInsertTypeAnnotation(sourceFile, declaration, typeNode);
}
}
}
function tryReplaceImportTypeNodeWithAutoImport(typeNode, declaration, sourceFile, changes, importAdder, scriptTarget) {
const importableReference = tryGetAutoImportableReferenceFromTypeNode(typeNode, scriptTarget);
if (importableReference && changes.tryInsertTypeAnnotation(sourceFile, declaration, importableReference.typeNode)) {
forEach(importableReference.symbols, (s) => importAdder.addImportFromExportedSymbol(
s,
/*isValidTypeOnlyUseSite*/
true
));
return true;
}
return false;
}
function annotateJSDocParameters(changes, sourceFile, parameterInferences, program, host) {
const signature = parameterInferences.length && parameterInferences[0].declaration.parent;
if (!signature) {
return;
}
const inferences = mapDefined(parameterInferences, (inference) => {
const param = inference.declaration;
if (param.initializer || getJSDocType(param) || !isIdentifier(param.name)) {
return;
}
const typeNode = inference.type && getTypeNodeIfAccessible(inference.type, param, program, host);
if (typeNode) {
const name = factory.cloneNode(param.name);
setEmitFlags(name, 3072 /* NoComments */ | 4096 /* NoNestedComments */);
return { name: factory.cloneNode(param.name), param, isOptional: !!inference.isOptional, typeNode };
}
});
if (!inferences.length) {
return;
}
if (isArrowFunction(signature) || isFunctionExpression(signature)) {
const needParens = isArrowFunction(signature) && !findChildOfKind(signature, 21 /* OpenParenToken */, sourceFile);
if (needParens) {
changes.insertNodeBefore(sourceFile, first(signature.parameters), factory.createToken(21 /* OpenParenToken */));
}
forEach(inferences, ({ typeNode, param }) => {
const typeTag = factory.createJSDocTypeTag(
/*tagName*/
void 0,
factory.createJSDocTypeExpression(typeNode)
);
const jsDoc = factory.createJSDocComment(
/*comment*/
void 0,
[typeTag]
);
changes.insertNodeAt(sourceFile, param.getStart(sourceFile), jsDoc, { suffix: " " });
});
if (needParens) {
changes.insertNodeAfter(sourceFile, last(signature.parameters), factory.createToken(22 /* CloseParenToken */));
}
} else {
const paramTags = map(inferences, ({ name, typeNode, isOptional }) => factory.createJSDocParameterTag(
/*tagName*/
void 0,
name,
/*isBracketed*/
!!isOptional,
factory.createJSDocTypeExpression(typeNode),
/*isNameFirst*/
false,
/*comment*/
void 0
));
changes.addJSDocTags(sourceFile, signature, paramTags);
}
}
function getReferences(token, program, cancellationToken) {
return mapDefined(ts_FindAllReferences_exports.getReferenceEntriesForNode(-1, token, program, program.getSourceFiles(), cancellationToken), (entry) => entry.kind !== ts_FindAllReferences_exports.EntryKind.Span ? tryCast(entry.node, isIdentifier) : void 0);
}
function inferTypeForVariableFromUsage(token, program, cancellationToken) {
const references = getReferences(token, program, cancellationToken);
return inferTypeFromReferences(program, references, cancellationToken).single();
}
function inferTypeForParametersFromUsage(func, sourceFile, program, cancellationToken) {
const references = getFunctionReferences(func, sourceFile, program, cancellationToken);
return references && inferTypeFromReferences(program, references, cancellationToken).parameters(func) || func.parameters.map((p) => ({
declaration: p,
type: isIdentifier(p.name) ? inferTypeForVariableFromUsage(p.name, program, cancellationToken) : program.getTypeChecker().getAnyType()
}));
}
function getFunctionReferences(containingFunction, sourceFile, program, cancellationToken) {
let searchToken;
switch (containingFunction.kind) {
case 175 /* Constructor */:
searchToken = findChildOfKind(containingFunction, 137 /* ConstructorKeyword */, sourceFile);
break;
case 218 /* ArrowFunction */:
case 217 /* FunctionExpression */:
const parent2 = containingFunction.parent;
searchToken = (isVariableDeclaration(parent2) || isPropertyDeclaration(parent2)) && isIdentifier(parent2.name) ? parent2.name : containingFunction.name;
break;
case 261 /* FunctionDeclaration */:
case 173 /* MethodDeclaration */:
case 172 /* MethodSignature */:
searchToken = containingFunction.name;
break;
}
if (!searchToken) {
return void 0;
}
return getReferences(searchToken, program, cancellationToken);
}
function inferTypeFromReferences(program, references, cancellationToken) {
const checker = program.getTypeChecker();
const builtinConstructors = {
string: () => checker.getStringType(),
number: () => checker.getNumberType(),
Array: (t) => checker.createArrayType(t),
Promise: (t) => checker.createPromiseType(t)
};
const builtins = [
checker.getStringType(),
checker.getNumberType(),
checker.createArrayType(checker.getAnyType()),
checker.createPromiseType(checker.getAnyType())
];
return {
single: single2,
parameters,
thisParameter
};
function createEmptyUsage() {
return {
isNumber: void 0,
isString: void 0,
isNumberOrString: void 0,
candidateTypes: void 0,
properties: void 0,
calls: void 0,
constructs: void 0,
numberIndex: void 0,
stringIndex: void 0,
candidateThisTypes: void 0,
inferredTypes: void 0
};
}
function combineUsages(usages) {
const combinedProperties = /* @__PURE__ */ new Map();
for (const u of usages) {
if (u.properties) {
u.properties.forEach((p, name) => {
if (!combinedProperties.has(name)) {
combinedProperties.set(name, []);
}
combinedProperties.get(name).push(p);
});
}
}
const properties = /* @__PURE__ */ new Map();
combinedProperties.forEach((ps, name) => {
properties.set(name, combineUsages(ps));
});
return {
isNumber: usages.some((u) => u.isNumber),
isString: usages.some((u) => u.isString),
isNumberOrString: usages.some((u) => u.isNumberOrString),
candidateTypes: flatMap(usages, (u) => u.candidateTypes),
properties,
calls: flatMap(usages, (u) => u.calls),
constructs: flatMap(usages, (u) => u.constructs),
numberIndex: forEach(usages, (u) => u.numberIndex),
stringIndex: forEach(usages, (u) => u.stringIndex),
candidateThisTypes: flatMap(usages, (u) => u.candidateThisTypes),
inferredTypes: void 0
// clear type cache
};
}
function single2() {
return combineTypes(inferTypesFromReferencesSingle(references));
}
function parameters(declaration) {
if (references.length === 0 || !declaration.parameters) {
return void 0;
}
const usage = createEmptyUsage();
for (const reference of references) {
cancellationToken.throwIfCancellationRequested();
calculateUsageOfNode(reference, usage);
}
const calls = [...usage.constructs || [], ...usage.calls || []];
return declaration.parameters.map((parameter, parameterIndex) => {
const types = [];
const isRest = isRestParameter(parameter);
let isOptional = false;
for (const call of calls) {
if (call.argumentTypes.length <= parameterIndex) {
isOptional = isInJSFile(declaration);
types.push(checker.getUndefinedType());
} else if (isRest) {
for (let i = parameterIndex; i < call.argumentTypes.length; i++) {
types.push(checker.getBaseTypeOfLiteralType(call.argumentTypes[i]));
}
} else {
types.push(checker.getBaseTypeOfLiteralType(call.argumentTypes[parameterIndex]));
}
}
if (isIdentifier(parameter.name)) {
const inferred = inferTypesFromReferencesSingle(getReferences(parameter.name, program, cancellationToken));
types.push(...isRest ? mapDefined(inferred, checker.getElementTypeOfArrayType) : inferred);
}
const type = combineTypes(types);
return {
type: isRest ? checker.createArrayType(type) : type,
isOptional: isOptional && !isRest,
declaration: parameter
};
});
}
function thisParameter() {
const usage = createEmptyUsage();
for (const reference of references) {
cancellationToken.throwIfCancellationRequested();
calculateUsageOfNode(reference, usage);
}
return combineTypes(usage.candidateThisTypes || emptyArray);
}
function inferTypesFromReferencesSingle(references2) {
const usage = createEmptyUsage();
for (const reference of references2) {
cancellationToken.throwIfCancellationRequested();
calculateUsageOfNode(reference, usage);
}
return inferTypes(usage);
}
function calculateUsageOfNode(node, usage) {
while (isRightSideOfQualifiedNameOrPropertyAccess(node)) {
node = node.parent;
}
switch (node.parent.kind) {
case 243 /* ExpressionStatement */:
inferTypeFromExpressionStatement(node, usage);
break;
case 224 /* PostfixUnaryExpression */:
usage.isNumber = true;
break;
case 223 /* PrefixUnaryExpression */:
inferTypeFromPrefixUnaryExpression(node.parent, usage);
break;
case 225 /* BinaryExpression */:
inferTypeFromBinaryExpression(node, node.parent, usage);
break;
case 295 /* CaseClause */:
case 296 /* DefaultClause */:
inferTypeFromSwitchStatementLabel(node.parent, usage);
break;
case 212 /* CallExpression */:
case 213 /* NewExpression */:
if (node.parent.expression === node) {
inferTypeFromCallExpression(node.parent, usage);
} else {
inferTypeFromContextualType(node, usage);
}
break;
case 210 /* PropertyAccessExpression */:
inferTypeFromPropertyAccessExpression(node.parent, usage);
break;
case 211 /* ElementAccessExpression */:
inferTypeFromPropertyElementExpression(node.parent, node, usage);
break;
case 302 /* PropertyAssignment */:
case 303 /* ShorthandPropertyAssignment */:
inferTypeFromPropertyAssignment(node.parent, usage);
break;
case 171 /* PropertyDeclaration */:
inferTypeFromPropertyDeclaration(node.parent, usage);
break;
case 259 /* VariableDeclaration */: {
const { name, initializer } = node.parent;
if (node === name) {
if (initializer) {
addCandidateType(usage, checker.getTypeAtLocation(initializer));
}
break;
}
}
default:
return inferTypeFromContextualType(node, usage);
}
}
function inferTypeFromContextualType(node, usage) {
if (isExpressionNode(node)) {
addCandidateType(usage, checker.getContextualType(node));
}
}
function inferTypeFromExpressionStatement(node, usage) {
addCandidateType(usage, isCallExpression(node) ? checker.getVoidType() : checker.getAnyType());
}
function inferTypeFromPrefixUnaryExpression(node, usage) {
switch (node.operator) {
case 46 /* PlusPlusToken */:
case 47 /* MinusMinusToken */:
case 41 /* MinusToken */:
case 55 /* TildeToken */:
usage.isNumber = true;
break;
case 40 /* PlusToken */:
usage.isNumberOrString = true;
break;
}
}
function inferTypeFromBinaryExpression(node, parent2, usage) {
switch (parent2.operatorToken.kind) {
case 43 /* AsteriskAsteriskToken */:
case 42 /* AsteriskToken */:
case 44 /* SlashToken */:
case 45 /* PercentToken */:
case 48 /* LessThanLessThanToken */:
case 49 /* GreaterThanGreaterThanToken */:
case 50 /* GreaterThanGreaterThanGreaterThanToken */:
case 51 /* AmpersandToken */:
case 52 /* BarToken */:
case 53 /* CaretToken */:
case 66 /* MinusEqualsToken */:
case 68 /* AsteriskAsteriskEqualsToken */:
case 67 /* AsteriskEqualsToken */:
case 69 /* SlashEqualsToken */:
case 70 /* PercentEqualsToken */:
case 74 /* AmpersandEqualsToken */:
case 75 /* BarEqualsToken */:
case 79 /* CaretEqualsToken */:
case 71 /* LessThanLessThanEqualsToken */:
case 73 /* GreaterThanGreaterThanGreaterThanEqualsToken */:
case 72 /* GreaterThanGreaterThanEqualsToken */:
case 41 /* MinusToken */:
case 30 /* LessThanToken */:
case 33 /* LessThanEqualsToken */:
case 32 /* GreaterThanToken */:
case 34 /* GreaterThanEqualsToken */:
const operandType = checker.getTypeAtLocation(parent2.left === node ? parent2.right : parent2.left);
if (operandType.flags & 1056 /* EnumLike */) {
addCandidateType(usage, operandType);
} else {
usage.isNumber = true;
}
break;
case 65 /* PlusEqualsToken */:
case 40 /* PlusToken */:
const otherOperandType = checker.getTypeAtLocation(parent2.left === node ? parent2.right : parent2.left);
if (otherOperandType.flags & 1056 /* EnumLike */) {
addCandidateType(usage, otherOperandType);
} else if (otherOperandType.flags & 296 /* NumberLike */) {
usage.isNumber = true;
} else if (otherOperandType.flags & 402653316 /* StringLike */) {
usage.isString = true;
} else if (otherOperandType.flags & 1 /* Any */) {
} else {
usage.isNumberOrString = true;
}
break;
case 64 /* EqualsToken */:
case 35 /* EqualsEqualsToken */:
case 37 /* EqualsEqualsEqualsToken */:
case 38 /* ExclamationEqualsEqualsToken */:
case 36 /* ExclamationEqualsToken */:
case 77 /* AmpersandAmpersandEqualsToken */:
case 78 /* QuestionQuestionEqualsToken */:
case 76 /* BarBarEqualsToken */:
addCandidateType(usage, checker.getTypeAtLocation(parent2.left === node ? parent2.right : parent2.left));
break;
case 103 /* InKeyword */:
if (node === parent2.left) {
usage.isString = true;
}
break;
case 57 /* BarBarToken */:
case 61 /* QuestionQuestionToken */:
if (node === parent2.left && (node.parent.parent.kind === 259 /* VariableDeclaration */ || isAssignmentExpression(
node.parent.parent,
/*excludeCompoundAssignment*/
true
))) {
addCandidateType(usage, checker.getTypeAtLocation(parent2.right));
}
break;
case 56 /* AmpersandAmpersandToken */:
case 28 /* CommaToken */:
case 104 /* InstanceOfKeyword */:
break;
}
}
function inferTypeFromSwitchStatementLabel(parent2, usage) {
addCandidateType(usage, checker.getTypeAtLocation(parent2.parent.parent.expression));
}
function inferTypeFromCallExpression(parent2, usage) {
const call = {
argumentTypes: [],
return_: createEmptyUsage()
};
if (parent2.arguments) {
for (const argument of parent2.arguments) {
call.argumentTypes.push(checker.getTypeAtLocation(argument));
}
}
calculateUsageOfNode(parent2, call.return_);
if (parent2.kind === 212 /* CallExpression */) {
(usage.calls || (usage.calls = [])).push(call);
} else {
(usage.constructs || (usage.constructs = [])).push(call);
}
}
function inferTypeFromPropertyAccessExpression(parent2, usage) {
const name = escapeLeadingUnderscores(parent2.name.text);
if (!usage.properties) {
usage.properties = /* @__PURE__ */ new Map();
}
const propertyUsage = usage.properties.get(name) || createEmptyUsage();
calculateUsageOfNode(parent2, propertyUsage);
usage.properties.set(name, propertyUsage);
}
function inferTypeFromPropertyElementExpression(parent2, node, usage) {
if (node === parent2.argumentExpression) {
usage.isNumberOrString = true;
return;
} else {
const indexType = checker.getTypeAtLocation(parent2.argumentExpression);
const indexUsage = createEmptyUsage();
calculateUsageOfNode(parent2, indexUsage);
if (indexType.flags & 296 /* NumberLike */) {
usage.numberIndex = indexUsage;
} else {
usage.stringIndex = indexUsage;
}
}
}
function inferTypeFromPropertyAssignment(assignment, usage) {
const nodeWithRealType = isVariableDeclaration(assignment.parent.parent) ? assignment.parent.parent : assignment.parent;
addCandidateThisType(usage, checker.getTypeAtLocation(nodeWithRealType));
}
function inferTypeFromPropertyDeclaration(declaration, usage) {
addCandidateThisType(usage, checker.getTypeAtLocation(declaration.parent));
}
function removeLowPriorityInferences(inferences, priorities) {
const toRemove = [];
for (const i of inferences) {
for (const { high, low } of priorities) {
if (high(i)) {
Debug.assert(!low(i), "Priority can't have both low and high");
toRemove.push(low);
}
}
}
return inferences.filter((i) => toRemove.every((f) => !f(i)));
}
function combineFromUsage(usage) {
return combineTypes(inferTypes(usage));
}
function combineTypes(inferences) {
if (!inferences.length)
return checker.getAnyType();
const stringNumber = checker.getUnionType([checker.getStringType(), checker.getNumberType()]);
const priorities = [
{
high: (t) => t === checker.getStringType() || t === checker.getNumberType(),
low: (t) => t === stringNumber
},
{
high: (t) => !(t.flags & (1 /* Any */ | 16384 /* Void */)),
low: (t) => !!(t.flags & (1 /* Any */ | 16384 /* Void */))
},
{
high: (t) => !(t.flags & (98304 /* Nullable */ | 1 /* Any */ | 16384 /* Void */)) && !(getObjectFlags(t) & 16 /* Anonymous */),
low: (t) => !!(getObjectFlags(t) & 16 /* Anonymous */)
}
];
let good = removeLowPriorityInferences(inferences, priorities);
const anons = good.filter((i) => getObjectFlags(i) & 16 /* Anonymous */);
if (anons.length) {
good = good.filter((i) => !(getObjectFlags(i) & 16 /* Anonymous */));
good.push(combineAnonymousTypes(anons));
}
return checker.getWidenedType(checker.getUnionType(good.map(checker.getBaseTypeOfLiteralType), 2 /* Subtype */));
}
function combineAnonymousTypes(anons) {
if (anons.length === 1) {
return anons[0];
}
const calls = [];
const constructs = [];
const stringIndices = [];
const numberIndices = [];
let stringIndexReadonly = false;
let numberIndexReadonly = false;
const props = createMultiMap();
for (const anon2 of anons) {
for (const p of checker.getPropertiesOfType(anon2)) {
props.add(p.escapedName, p.valueDeclaration ? checker.getTypeOfSymbolAtLocation(p, p.valueDeclaration) : checker.getAnyType());
}
calls.push(...checker.getSignaturesOfType(anon2, 0 /* Call */));
constructs.push(...checker.getSignaturesOfType(anon2, 1 /* Construct */));
const stringIndexInfo = checker.getIndexInfoOfType(anon2, 0 /* String */);
if (stringIndexInfo) {
stringIndices.push(stringIndexInfo.type);
stringIndexReadonly = stringIndexReadonly || stringIndexInfo.isReadonly;
}
const numberIndexInfo = checker.getIndexInfoOfType(anon2, 1 /* Number */);
if (numberIndexInfo) {
numberIndices.push(numberIndexInfo.type);
numberIndexReadonly = numberIndexReadonly || numberIndexInfo.isReadonly;
}
}
const members = mapEntries(props, (name, types) => {
const isOptional = types.length < anons.length ? 16777216 /* Optional */ : 0;
const s = checker.createSymbol(4 /* Property */ | isOptional, name);
s.links.type = checker.getUnionType(types);
return [name, s];
});
const indexInfos = [];
if (stringIndices.length)
indexInfos.push(checker.createIndexInfo(checker.getStringType(), checker.getUnionType(stringIndices), stringIndexReadonly));
if (numberIndices.length)
indexInfos.push(checker.createIndexInfo(checker.getNumberType(), checker.getUnionType(numberIndices), numberIndexReadonly));
return checker.createAnonymousType(
anons[0].symbol,
members,
calls,
constructs,
indexInfos
);
}
function inferTypes(usage) {
var _a, _b, _c;
const types = [];
if (usage.isNumber) {
types.push(checker.getNumberType());
}
if (usage.isString) {
types.push(checker.getStringType());
}
if (usage.isNumberOrString) {
types.push(checker.getUnionType([checker.getStringType(), checker.getNumberType()]));
}
if (usage.numberIndex) {
types.push(checker.createArrayType(combineFromUsage(usage.numberIndex)));
}
if (((_a = usage.properties) == null ? void 0 : _a.size) || ((_b = usage.constructs) == null ? void 0 : _b.length) || usage.stringIndex) {
types.push(inferStructuralType(usage));
}
const candidateTypes = (usage.candidateTypes || []).map((t) => checker.getBaseTypeOfLiteralType(t));
const callsType = ((_c = usage.calls) == null ? void 0 : _c.length) ? inferStructuralType(usage) : void 0;
if (callsType && candidateTypes) {
types.push(checker.getUnionType([callsType, ...candidateTypes], 2 /* Subtype */));
} else {
if (callsType) {
types.push(callsType);
}
if (length(candidateTypes)) {
types.push(...candidateTypes);
}
}
types.push(...inferNamedTypesFromProperties(usage));
return types;
}
function inferStructuralType(usage) {
const members = /* @__PURE__ */ new Map();
if (usage.properties) {
usage.properties.forEach((u, name) => {
const symbol = checker.createSymbol(4 /* Property */, name);
symbol.links.type = combineFromUsage(u);
members.set(name, symbol);
});
}
const callSignatures = usage.calls ? [getSignatureFromCalls(usage.calls)] : [];
const constructSignatures = usage.constructs ? [getSignatureFromCalls(usage.constructs)] : [];
const indexInfos = usage.stringIndex ? [checker.createIndexInfo(
checker.getStringType(),
combineFromUsage(usage.stringIndex),
/*isReadonly*/
false
)] : [];
return checker.createAnonymousType(
/*symbol*/
void 0,
members,
callSignatures,
constructSignatures,
indexInfos
);
}
function inferNamedTypesFromProperties(usage) {
if (!usage.properties || !usage.properties.size)
return [];
const types = builtins.filter((t) => allPropertiesAreAssignableToUsage(t, usage));
if (0 < types.length && types.length < 3) {
return types.map((t) => inferInstantiationFromUsage(t, usage));
}
return [];
}
function allPropertiesAreAssignableToUsage(type, usage) {
if (!usage.properties)
return false;
return !forEachEntry(usage.properties, (propUsage, name) => {
const source = checker.getTypeOfPropertyOfType(type, name);
if (!source) {
return true;
}
if (propUsage.calls) {
const sigs = checker.getSignaturesOfType(source, 0 /* Call */);
return !sigs.length || !checker.isTypeAssignableTo(source, getFunctionFromCalls(propUsage.calls));
} else {
return !checker.isTypeAssignableTo(source, combineFromUsage(propUsage));
}
});
}
function inferInstantiationFromUsage(type, usage) {
if (!(getObjectFlags(type) & 4 /* Reference */) || !usage.properties) {
return type;
}
const generic = type.target;
const singleTypeParameter = singleOrUndefined(generic.typeParameters);
if (!singleTypeParameter)
return type;
const types = [];
usage.properties.forEach((propUsage, name) => {
const genericPropertyType = checker.getTypeOfPropertyOfType(generic, name);
Debug.assert(!!genericPropertyType, "generic should have all the properties of its reference.");
types.push(...inferTypeParameters(genericPropertyType, combineFromUsage(propUsage), singleTypeParameter));
});
return builtinConstructors[type.symbol.escapedName](combineTypes(types));
}
function inferTypeParameters(genericType, usageType, typeParameter) {
if (genericType === typeParameter) {
return [usageType];
} else if (genericType.flags & 3145728 /* UnionOrIntersection */) {
return flatMap(genericType.types, (t) => inferTypeParameters(t, usageType, typeParameter));
} else if (getObjectFlags(genericType) & 4 /* Reference */ && getObjectFlags(usageType) & 4 /* Reference */) {
const genericArgs = checker.getTypeArguments(genericType);
const usageArgs = checker.getTypeArguments(usageType);
const types = [];
if (genericArgs && usageArgs) {
for (let i = 0; i < genericArgs.length; i++) {
if (usageArgs[i]) {
types.push(...inferTypeParameters(genericArgs[i], usageArgs[i], typeParameter));
}
}
}
return types;
}
const genericSigs = checker.getSignaturesOfType(genericType, 0 /* Call */);
const usageSigs = checker.getSignaturesOfType(usageType, 0 /* Call */);
if (genericSigs.length === 1 && usageSigs.length === 1) {
return inferFromSignatures(genericSigs[0], usageSigs[0], typeParameter);
}
return [];
}
function inferFromSignatures(genericSig, usageSig, typeParameter) {
var _a;
const types = [];
for (let i = 0; i < genericSig.parameters.length; i++) {
const genericParam = genericSig.parameters[i];
const usageParam = usageSig.parameters[i];
const isRest = genericSig.declaration && isRestParameter(genericSig.declaration.parameters[i]);
if (!usageParam) {
break;
}
let genericParamType = genericParam.valueDeclaration ? checker.getTypeOfSymbolAtLocation(genericParam, genericParam.valueDeclaration) : checker.getAnyType();
const elementType = isRest && checker.getElementTypeOfArrayType(genericParamType);
if (elementType) {
genericParamType = elementType;
}
const targetType = ((_a = tryCast(usageParam, isTransientSymbol)) == null ? void 0 : _a.links.type) || (usageParam.valueDeclaration ? checker.getTypeOfSymbolAtLocation(usageParam, usageParam.valueDeclaration) : checker.getAnyType());
types.push(...inferTypeParameters(genericParamType, targetType, typeParameter));
}
const genericReturn = checker.getReturnTypeOfSignature(genericSig);
const usageReturn = checker.getReturnTypeOfSignature(usageSig);
types.push(...inferTypeParameters(genericReturn, usageReturn, typeParameter));
return types;
}
function getFunctionFromCalls(calls) {
return checker.createAnonymousType(
/*symbol*/
void 0,
createSymbolTable(),
[getSignatureFromCalls(calls)],
emptyArray,
emptyArray
);
}
function getSignatureFromCalls(calls) {
const parameters2 = [];
const length2 = Math.max(...calls.map((c) => c.argumentTypes.length));
for (let i = 0; i < length2; i++) {
const symbol = checker.createSymbol(1 /* FunctionScopedVariable */, escapeLeadingUnderscores(`arg${i}`));
symbol.links.type = combineTypes(calls.map((call) => call.argumentTypes[i] || checker.getUndefinedType()));
if (calls.some((call) => call.argumentTypes[i] === void 0)) {
symbol.flags |= 16777216 /* Optional */;
}
parameters2.push(symbol);
}
const returnType = combineFromUsage(combineUsages(calls.map((call) => call.return_)));
return checker.createSignature(
/*declaration*/
void 0,
/*typeParameters*/
void 0,
/*thisParameter*/
void 0,
parameters2,
returnType,
/*typePredicate*/
void 0,
length2,
0 /* None */
);
}
function addCandidateType(usage, type) {
if (type && !(type.flags & 1 /* Any */) && !(type.flags & 131072 /* Never */)) {
(usage.candidateTypes || (usage.candidateTypes = [])).push(type);
}
}
function addCandidateThisType(usage, type) {
if (type && !(type.flags & 1 /* Any */) && !(type.flags & 131072 /* Never */)) {
(usage.candidateThisTypes || (usage.candidateThisTypes = [])).push(type);
}
}
}
// src/services/codefixes/fixReturnTypeInAsyncFunction.ts
var fixId39 = "fixReturnTypeInAsyncFunction";
var errorCodes49 = [
Diagnostics.The_return_type_of_an_async_function_or_method_must_be_the_global_Promise_T_type_Did_you_mean_to_write_Promise_0.code
];
registerCodeFix({
errorCodes: errorCodes49,
fixIds: [fixId39],
getCodeActions: function getCodeActionsToFixReturnTypeInAsyncFunction(context) {
const { sourceFile, program, span } = context;
const checker = program.getTypeChecker();
const info = getInfo15(sourceFile, program.getTypeChecker(), span.start);
if (!info) {
return void 0;
}
const { returnTypeNode, returnType, promisedTypeNode, promisedType } = info;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange33(t, sourceFile, returnTypeNode, promisedTypeNode));
return [createCodeFixAction(
fixId39,
changes,
[
Diagnostics.Replace_0_with_Promise_1,
checker.typeToString(returnType),
checker.typeToString(promisedType)
],
fixId39,
Diagnostics.Fix_all_incorrect_return_type_of_an_async_functions
)];
},
getAllCodeActions: (context) => codeFixAll(context, errorCodes49, (changes, diag2) => {
const info = getInfo15(diag2.file, context.program.getTypeChecker(), diag2.start);
if (info) {
doChange33(changes, diag2.file, info.returnTypeNode, info.promisedTypeNode);
}
})
});
function getInfo15(sourceFile, checker, pos) {
if (isInJSFile(sourceFile)) {
return void 0;
}
const token = getTokenAtPosition(sourceFile, pos);
const func = findAncestor(token, isFunctionLikeDeclaration);
const returnTypeNode = func == null ? void 0 : func.type;
if (!returnTypeNode) {
return void 0;
}
const returnType = checker.getTypeFromTypeNode(returnTypeNode);
const promisedType = checker.getAwaitedType(returnType) || checker.getVoidType();
const promisedTypeNode = checker.typeToTypeNode(
promisedType,
/*enclosingDeclaration*/
returnTypeNode,
/*flags*/
void 0
);
if (promisedTypeNode) {
return { returnTypeNode, returnType, promisedTypeNode, promisedType };
}
}
function doChange33(changes, sourceFile, returnTypeNode, promisedTypeNode) {
changes.replaceNode(sourceFile, returnTypeNode, factory.createTypeReferenceNode("Promise", [promisedTypeNode]));
}
// src/services/codefixes/disableJsDiagnostics.ts
var fixName4 = "disableJsDiagnostics";
var fixId40 = "disableJsDiagnostics";
var errorCodes50 = mapDefined(Object.keys(Diagnostics), (key) => {
const diag2 = Diagnostics[key];
return diag2.category === 1 /* Error */ ? diag2.code : void 0;
});
registerCodeFix({
errorCodes: errorCodes50,
getCodeActions: function getCodeActionsToDisableJsDiagnostics(context) {
const { sourceFile, program, span, host, formatContext } = context;
if (!isInJSFile(sourceFile) || !isCheckJsEnabledForFile(sourceFile, program.getCompilerOptions())) {
return void 0;
}
const newLineCharacter = sourceFile.checkJsDirective ? "" : getNewLineOrDefaultFromHost(host, formatContext.options);
const fixes = [
// fixId unnecessary because adding `// @ts-nocheck` even once will ignore every error in the file.
createCodeFixActionWithoutFixAll(
fixName4,
[createFileTextChanges(sourceFile.fileName, [
createTextChange(sourceFile.checkJsDirective ? createTextSpanFromBounds(sourceFile.checkJsDirective.pos, sourceFile.checkJsDirective.end) : createTextSpan(0, 0), `// @ts-nocheck${newLineCharacter}`)
])],
Diagnostics.Disable_checking_for_this_file
)
];
if (ts_textChanges_exports.isValidLocationToAddComment(sourceFile, span.start)) {
fixes.unshift(createCodeFixAction(fixName4, ts_textChanges_exports.ChangeTracker.with(context, (t) => makeChange8(t, sourceFile, span.start)), Diagnostics.Ignore_this_error_message, fixId40, Diagnostics.Add_ts_ignore_to_all_error_messages));
}
return fixes;
},
fixIds: [fixId40],
getAllCodeActions: (context) => {
const seenLines = /* @__PURE__ */ new Set();
return codeFixAll(context, errorCodes50, (changes, diag2) => {
if (ts_textChanges_exports.isValidLocationToAddComment(diag2.file, diag2.start)) {
makeChange8(changes, diag2.file, diag2.start, seenLines);
}
});
}
});
function makeChange8(changes, sourceFile, position, seenLines) {
const { line: lineNumber } = getLineAndCharacterOfPosition(sourceFile, position);
if (!seenLines || tryAddToSet(seenLines, lineNumber)) {
changes.insertCommentBeforeLine(sourceFile, lineNumber, position, " @ts-ignore");
}
}
// src/services/codefixes/helpers.ts
function createMissingMemberNodes(classDeclaration, possiblyMissingSymbols, sourceFile, context, preferences, importAdder, addClassElement) {
const classMembers = classDeclaration.symbol.members;
for (const symbol of possiblyMissingSymbols) {
if (!classMembers.has(symbol.escapedName)) {
addNewNodeForMemberSymbol(
symbol,
classDeclaration,
sourceFile,
context,
preferences,
importAdder,
addClassElement,
/*body*/
void 0
);
}
}
}
function getNoopSymbolTrackerWithResolver(context) {
return {
trackSymbol: () => false,
moduleResolverHost: getModuleSpecifierResolverHost(context.program, context.host)
};
}
var PreserveOptionalFlags = /* @__PURE__ */ ((PreserveOptionalFlags2) => {
PreserveOptionalFlags2[PreserveOptionalFlags2["Method"] = 1] = "Method";
PreserveOptionalFlags2[PreserveOptionalFlags2["Property"] = 2] = "Property";
PreserveOptionalFlags2[PreserveOptionalFlags2["All"] = 3] = "All";
return PreserveOptionalFlags2;
})(PreserveOptionalFlags || {});
function addNewNodeForMemberSymbol(symbol, enclosingDeclaration, sourceFile, context, preferences, importAdder, addClassElement, body, preserveOptional = 3 /* All */, isAmbient = false) {
const declarations = symbol.getDeclarations();
const declaration = declarations == null ? void 0 : declarations[0];
const checker = context.program.getTypeChecker();
const scriptTarget = getEmitScriptTarget(context.program.getCompilerOptions());
const kind = (declaration == null ? void 0 : declaration.kind) ?? 170 /* PropertySignature */;
const declarationName = getSynthesizedDeepClone(
getNameOfDeclaration(declaration),
/*includeTrivia*/
false
);
const effectiveModifierFlags = declaration ? getEffectiveModifierFlags(declaration) : 0 /* None */;
let modifierFlags = effectiveModifierFlags & 4 /* Public */ ? 4 /* Public */ : effectiveModifierFlags & 16 /* Protected */ ? 16 /* Protected */ : 0 /* None */;
if (declaration && isAutoAccessorPropertyDeclaration(declaration)) {
modifierFlags |= 128 /* Accessor */;
}
const modifiers = createModifiers();
const type = checker.getWidenedType(checker.getTypeOfSymbolAtLocation(symbol, enclosingDeclaration));
const optional = !!(symbol.flags & 16777216 /* Optional */);
const ambient = !!(enclosingDeclaration.flags & 16777216 /* Ambient */) || isAmbient;
const quotePreference = getQuotePreference(sourceFile, preferences);
switch (kind) {
case 170 /* PropertySignature */:
case 171 /* PropertyDeclaration */:
const flags = quotePreference === 0 /* Single */ ? 268435456 /* UseSingleQuotesForStringLiteralType */ : void 0;
let typeNode = checker.typeToTypeNode(type, enclosingDeclaration, flags, getNoopSymbolTrackerWithResolver(context));
if (importAdder) {
const importableReference = tryGetAutoImportableReferenceFromTypeNode(typeNode, scriptTarget);
if (importableReference) {
typeNode = importableReference.typeNode;
importSymbols(importAdder, importableReference.symbols);
}
}
addClassElement(factory.createPropertyDeclaration(
modifiers,
declaration ? createName(declarationName) : symbol.getName(),
optional && preserveOptional & 2 /* Property */ ? factory.createToken(58 /* QuestionToken */) : void 0,
typeNode,
/*initializer*/
void 0
));
break;
case 176 /* GetAccessor */:
case 177 /* SetAccessor */: {
Debug.assertIsDefined(declarations);
let typeNode2 = checker.typeToTypeNode(
type,
enclosingDeclaration,
/*flags*/
void 0,
getNoopSymbolTrackerWithResolver(context)
);
const allAccessors = getAllAccessorDeclarations(declarations, declaration);
const orderedAccessors = allAccessors.secondAccessor ? [allAccessors.firstAccessor, allAccessors.secondAccessor] : [allAccessors.firstAccessor];
if (importAdder) {
const importableReference = tryGetAutoImportableReferenceFromTypeNode(typeNode2, scriptTarget);
if (importableReference) {
typeNode2 = importableReference.typeNode;
importSymbols(importAdder, importableReference.symbols);
}
}
for (const accessor of orderedAccessors) {
if (isGetAccessorDeclaration(accessor)) {
addClassElement(factory.createGetAccessorDeclaration(
modifiers,
createName(declarationName),
emptyArray,
createTypeNode(typeNode2),
createBody(body, quotePreference, ambient)
));
} else {
Debug.assertNode(accessor, isSetAccessorDeclaration, "The counterpart to a getter should be a setter");
const parameter = getSetAccessorValueParameter(accessor);
const parameterName = parameter && isIdentifier(parameter.name) ? idText(parameter.name) : void 0;
addClassElement(factory.createSetAccessorDeclaration(
modifiers,
createName(declarationName),
createDummyParameters(
1,
[parameterName],
[createTypeNode(typeNode2)],
1,
/*inJs*/
false
),
createBody(body, quotePreference, ambient)
));
}
}
break;
}
case 172 /* MethodSignature */:
case 173 /* MethodDeclaration */:
Debug.assertIsDefined(declarations);
const signatures = type.isUnion() ? flatMap(type.types, (t) => t.getCallSignatures()) : type.getCallSignatures();
if (!some(signatures)) {
break;
}
if (declarations.length === 1) {
Debug.assert(signatures.length === 1, "One declaration implies one signature");
const signature = signatures[0];
outputMethod(quotePreference, signature, modifiers, createName(declarationName), createBody(body, quotePreference, ambient));
break;
}
for (const signature of signatures) {
outputMethod(quotePreference, signature, modifiers, createName(declarationName));
}
if (!ambient) {
if (declarations.length > signatures.length) {
const signature = checker.getSignatureFromDeclaration(declarations[declarations.length - 1]);
outputMethod(quotePreference, signature, modifiers, createName(declarationName), createBody(body, quotePreference));
} else {
Debug.assert(declarations.length === signatures.length, "Declarations and signatures should match count");
addClassElement(createMethodImplementingSignatures(checker, context, enclosingDeclaration, signatures, createName(declarationName), optional && !!(preserveOptional & 1 /* Method */), modifiers, quotePreference, body));
}
}
break;
}
function outputMethod(quotePreference2, signature, modifiers2, name, body2) {
const method = createSignatureDeclarationFromSignature(173 /* MethodDeclaration */, context, quotePreference2, signature, body2, name, modifiers2, optional && !!(preserveOptional & 1 /* Method */), enclosingDeclaration, importAdder);
if (method)
addClassElement(method);
}
function createModifiers() {
let modifiers2;
if (modifierFlags) {
modifiers2 = combine(modifiers2, factory.createModifiersFromModifierFlags(modifierFlags));
}
if (shouldAddOverrideKeyword()) {
modifiers2 = append(modifiers2, factory.createToken(163 /* OverrideKeyword */));
}
return modifiers2 && factory.createNodeArray(modifiers2);
}
function shouldAddOverrideKeyword() {
return !!(context.program.getCompilerOptions().noImplicitOverride && declaration && hasAbstractModifier(declaration));
}
function createName(node) {
if (isIdentifier(node) && node.escapedText === "constructor") {
return factory.createComputedPropertyName(factory.createStringLiteral(idText(node), quotePreference === 0 /* Single */));
}
return getSynthesizedDeepClone(
node,
/*includeTrivia*/
false
);
}
function createBody(block, quotePreference2, ambient2) {
return ambient2 ? void 0 : getSynthesizedDeepClone(
block,
/*includeTrivia*/
false
) || createStubbedMethodBody(quotePreference2);
}
function createTypeNode(typeNode) {
return getSynthesizedDeepClone(
typeNode,
/*includeTrivia*/
false
);
}
}
function createSignatureDeclarationFromSignature(kind, context, quotePreference, signature, body, name, modifiers, optional, enclosingDeclaration, importAdder) {
const program = context.program;
const checker = program.getTypeChecker();
const scriptTarget = getEmitScriptTarget(program.getCompilerOptions());
const isJs = isInJSFile(enclosingDeclaration);
const flags = 1 /* NoTruncation */ | 256 /* SuppressAnyReturnType */ | 524288 /* AllowEmptyTuple */ | (quotePreference === 0 /* Single */ ? 268435456 /* UseSingleQuotesForStringLiteralType */ : 0 /* None */);
const signatureDeclaration = checker.signatureToSignatureDeclaration(signature, kind, enclosingDeclaration, flags, getNoopSymbolTrackerWithResolver(context));
if (!signatureDeclaration) {
return void 0;
}
let typeParameters = isJs ? void 0 : signatureDeclaration.typeParameters;
let parameters = signatureDeclaration.parameters;
let type = isJs ? void 0 : signatureDeclaration.type;
if (importAdder) {
if (typeParameters) {
const newTypeParameters = sameMap(typeParameters, (typeParameterDecl) => {
let constraint = typeParameterDecl.constraint;
let defaultType = typeParameterDecl.default;
if (constraint) {
const importableReference = tryGetAutoImportableReferenceFromTypeNode(constraint, scriptTarget);
if (importableReference) {
constraint = importableReference.typeNode;
importSymbols(importAdder, importableReference.symbols);
}
}
if (defaultType) {
const importableReference = tryGetAutoImportableReferenceFromTypeNode(defaultType, scriptTarget);
if (importableReference) {
defaultType = importableReference.typeNode;
importSymbols(importAdder, importableReference.symbols);
}
}
return factory.updateTypeParameterDeclaration(
typeParameterDecl,
typeParameterDecl.modifiers,
typeParameterDecl.name,
constraint,
defaultType
);
});
if (typeParameters !== newTypeParameters) {
typeParameters = setTextRange(factory.createNodeArray(newTypeParameters, typeParameters.hasTrailingComma), typeParameters);
}
}
const newParameters = sameMap(parameters, (parameterDecl) => {
let type2 = isJs ? void 0 : parameterDecl.type;
if (type2) {
const importableReference = tryGetAutoImportableReferenceFromTypeNode(type2, scriptTarget);
if (importableReference) {
type2 = importableReference.typeNode;
importSymbols(importAdder, importableReference.symbols);
}
}
return factory.updateParameterDeclaration(
parameterDecl,
parameterDecl.modifiers,
parameterDecl.dotDotDotToken,
parameterDecl.name,
isJs ? void 0 : parameterDecl.questionToken,
type2,
parameterDecl.initializer
);
});
if (parameters !== newParameters) {
parameters = setTextRange(factory.createNodeArray(newParameters, parameters.hasTrailingComma), parameters);
}
if (type) {
const importableReference = tryGetAutoImportableReferenceFromTypeNode(type, scriptTarget);
if (importableReference) {
type = importableReference.typeNode;
importSymbols(importAdder, importableReference.symbols);
}
}
}
const questionToken = optional ? factory.createToken(58 /* QuestionToken */) : void 0;
const asteriskToken = signatureDeclaration.asteriskToken;
if (isFunctionExpression(signatureDeclaration)) {
return factory.updateFunctionExpression(signatureDeclaration, modifiers, signatureDeclaration.asteriskToken, tryCast(name, isIdentifier), typeParameters, parameters, type, body ?? signatureDeclaration.body);
}
if (isArrowFunction(signatureDeclaration)) {
return factory.updateArrowFunction(signatureDeclaration, modifiers, typeParameters, parameters, type, signatureDeclaration.equalsGreaterThanToken, body ?? signatureDeclaration.body);
}
if (isMethodDeclaration(signatureDeclaration)) {
return factory.updateMethodDeclaration(signatureDeclaration, modifiers, asteriskToken, name ?? factory.createIdentifier(""), questionToken, typeParameters, parameters, type, body);
}
if (isFunctionDeclaration(signatureDeclaration)) {
return factory.updateFunctionDeclaration(signatureDeclaration, modifiers, signatureDeclaration.asteriskToken, tryCast(name, isIdentifier), typeParameters, parameters, type, body ?? signatureDeclaration.body);
}
return void 0;
}
function createSignatureDeclarationFromCallExpression(kind, context, importAdder, call, name, modifierFlags, contextNode) {
const quotePreference = getQuotePreference(context.sourceFile, context.preferences);
const scriptTarget = getEmitScriptTarget(context.program.getCompilerOptions());
const tracker = getNoopSymbolTrackerWithResolver(context);
const checker = context.program.getTypeChecker();
const isJs = isInJSFile(contextNode);
const { typeArguments, arguments: args, parent: parent2 } = call;
const contextualType = isJs ? void 0 : checker.getContextualType(call);
const names = map(args, (arg) => isIdentifier(arg) ? arg.text : isPropertyAccessExpression(arg) && isIdentifier(arg.name) ? arg.name.text : void 0);
const instanceTypes = isJs ? [] : map(args, (arg) => checker.getTypeAtLocation(arg));
const { argumentTypeNodes, argumentTypeParameters } = getArgumentTypesAndTypeParameters(
checker,
importAdder,
instanceTypes,
contextNode,
scriptTarget,
/*flags*/
void 0,
tracker
);
const modifiers = modifierFlags ? factory.createNodeArray(factory.createModifiersFromModifierFlags(modifierFlags)) : void 0;
const asteriskToken = isYieldExpression(parent2) ? factory.createToken(42 /* AsteriskToken */) : void 0;
const typeParameters = isJs ? void 0 : createTypeParametersForArguments(checker, argumentTypeParameters, typeArguments);
const parameters = createDummyParameters(
args.length,
names,
argumentTypeNodes,
/*minArgumentCount*/
void 0,
isJs
);
const type = isJs || contextualType === void 0 ? void 0 : checker.typeToTypeNode(
contextualType,
contextNode,
/*flags*/
void 0,
tracker
);
switch (kind) {
case 173 /* MethodDeclaration */:
return factory.createMethodDeclaration(
modifiers,
asteriskToken,
name,
/*questionToken*/
void 0,
typeParameters,
parameters,
type,
createStubbedMethodBody(quotePreference)
);
case 172 /* MethodSignature */:
return factory.createMethodSignature(
modifiers,
name,
/*questionToken*/
void 0,
typeParameters,
parameters,
type === void 0 ? factory.createKeywordTypeNode(159 /* UnknownKeyword */) : type
);
case 261 /* FunctionDeclaration */:
return factory.createFunctionDeclaration(
modifiers,
asteriskToken,
name,
typeParameters,
parameters,
type,
createStubbedBody(Diagnostics.Function_not_implemented.message, quotePreference)
);
default:
Debug.fail("Unexpected kind");
}
}
function createTypeParametersForArguments(checker, argumentTypeParameters, typeArguments) {
const usedNames = new Set(argumentTypeParameters.map((pair) => pair[0]));
const constraintsByName = new Map(argumentTypeParameters);
if (typeArguments) {
const typeArgumentsWithNewTypes = typeArguments.filter((typeArgument) => !argumentTypeParameters.some((pair) => {
var _a;
return checker.getTypeAtLocation(typeArgument) === ((_a = pair[1]) == null ? void 0 : _a.argumentType);
}));
const targetSize = usedNames.size + typeArgumentsWithNewTypes.length;
for (let i = 0; usedNames.size < targetSize; i += 1) {
usedNames.add(createTypeParameterName(i));
}
}
return arrayFrom(
usedNames.values(),
(usedName) => {
var _a;
return factory.createTypeParameterDeclaration(
/*modifiers*/
void 0,
usedName,
(_a = constraintsByName.get(usedName)) == null ? void 0 : _a.constraint
);
}
);
}
function createTypeParameterName(index) {
return 84 /* T */ + index <= 90 /* Z */ ? String.fromCharCode(84 /* T */ + index) : `T${index}`;
}
function typeToAutoImportableTypeNode(checker, importAdder, type, contextNode, scriptTarget, flags, tracker) {
let typeNode = checker.typeToTypeNode(type, contextNode, flags, tracker);
if (typeNode && isImportTypeNode(typeNode)) {
const importableReference = tryGetAutoImportableReferenceFromTypeNode(typeNode, scriptTarget);
if (importableReference) {
importSymbols(importAdder, importableReference.symbols);
typeNode = importableReference.typeNode;
}
}
return getSynthesizedDeepClone(typeNode);
}
function typeContainsTypeParameter(type) {
if (type.isUnionOrIntersection()) {
return type.types.some(typeContainsTypeParameter);
}
return type.flags & 262144 /* TypeParameter */;
}
function getArgumentTypesAndTypeParameters(checker, importAdder, instanceTypes, contextNode, scriptTarget, flags, tracker) {
const argumentTypeNodes = [];
const argumentTypeParameters = /* @__PURE__ */ new Map();
for (let i = 0; i < instanceTypes.length; i += 1) {
const instanceType = instanceTypes[i];
if (instanceType.isUnionOrIntersection() && instanceType.types.some(typeContainsTypeParameter)) {
const synthesizedTypeParameterName = createTypeParameterName(i);
argumentTypeNodes.push(factory.createTypeReferenceNode(synthesizedTypeParameterName));
argumentTypeParameters.set(synthesizedTypeParameterName, void 0);
continue;
}
const widenedInstanceType = checker.getBaseTypeOfLiteralType(instanceType);
const argumentTypeNode = typeToAutoImportableTypeNode(checker, importAdder, widenedInstanceType, contextNode, scriptTarget, flags, tracker);
if (!argumentTypeNode) {
continue;
}
argumentTypeNodes.push(argumentTypeNode);
const argumentTypeParameter = getFirstTypeParameterName(instanceType);
const instanceTypeConstraint = instanceType.isTypeParameter() && instanceType.constraint && !isAnonymousObjectConstraintType(instanceType.constraint) ? typeToAutoImportableTypeNode(checker, importAdder, instanceType.constraint, contextNode, scriptTarget, flags, tracker) : void 0;
if (argumentTypeParameter) {
argumentTypeParameters.set(argumentTypeParameter, { argumentType: instanceType, constraint: instanceTypeConstraint });
}
}
return { argumentTypeNodes, argumentTypeParameters: arrayFrom(argumentTypeParameters.entries()) };
}
function isAnonymousObjectConstraintType(type) {
return type.flags & 524288 /* Object */ && type.objectFlags === 16 /* Anonymous */;
}
function getFirstTypeParameterName(type) {
var _a;
if (type.flags & (1048576 /* Union */ | 2097152 /* Intersection */)) {
for (const subType of type.types) {
const subTypeName = getFirstTypeParameterName(subType);
if (subTypeName) {
return subTypeName;
}
}
}
return type.flags & 262144 /* TypeParameter */ ? (_a = type.getSymbol()) == null ? void 0 : _a.getName() : void 0;
}
function createDummyParameters(argCount, names, types, minArgumentCount, inJs) {
const parameters = [];
const parameterNameCounts = /* @__PURE__ */ new Map();
for (let i = 0; i < argCount; i++) {
const parameterName = (names == null ? void 0 : names[i]) || `arg${i}`;
const parameterNameCount = parameterNameCounts.get(parameterName);
parameterNameCounts.set(parameterName, (parameterNameCount || 0) + 1);
const newParameter = factory.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
/*name*/
parameterName + (parameterNameCount || ""),
/*questionToken*/
minArgumentCount !== void 0 && i >= minArgumentCount ? factory.createToken(58 /* QuestionToken */) : void 0,
/*type*/
inJs ? void 0 : (types == null ? void 0 : types[i]) || factory.createKeywordTypeNode(159 /* UnknownKeyword */),
/*initializer*/
void 0
);
parameters.push(newParameter);
}
return parameters;
}
function createMethodImplementingSignatures(checker, context, enclosingDeclaration, signatures, name, optional, modifiers, quotePreference, body) {
let maxArgsSignature = signatures[0];
let minArgumentCount = signatures[0].minArgumentCount;
let someSigHasRestParameter = false;
for (const sig of signatures) {
minArgumentCount = Math.min(sig.minArgumentCount, minArgumentCount);
if (signatureHasRestParameter(sig)) {
someSigHasRestParameter = true;
}
if (sig.parameters.length >= maxArgsSignature.parameters.length && (!signatureHasRestParameter(sig) || signatureHasRestParameter(maxArgsSignature))) {
maxArgsSignature = sig;
}
}
const maxNonRestArgs = maxArgsSignature.parameters.length - (signatureHasRestParameter(maxArgsSignature) ? 1 : 0);
const maxArgsParameterSymbolNames = maxArgsSignature.parameters.map((symbol) => symbol.name);
const parameters = createDummyParameters(
maxNonRestArgs,
maxArgsParameterSymbolNames,
/*types*/
void 0,
minArgumentCount,
/*inJs*/
false
);
if (someSigHasRestParameter) {
const restParameter = factory.createParameterDeclaration(
/*modifiers*/
void 0,
factory.createToken(26 /* DotDotDotToken */),
maxArgsParameterSymbolNames[maxNonRestArgs] || "rest",
/*questionToken*/
maxNonRestArgs >= minArgumentCount ? factory.createToken(58 /* QuestionToken */) : void 0,
factory.createArrayTypeNode(factory.createKeywordTypeNode(159 /* UnknownKeyword */)),
/*initializer*/
void 0
);
parameters.push(restParameter);
}
return createStubbedMethod(
modifiers,
name,
optional,
/*typeParameters*/
void 0,
parameters,
getReturnTypeFromSignatures(signatures, checker, context, enclosingDeclaration),
quotePreference,
body
);
}
function getReturnTypeFromSignatures(signatures, checker, context, enclosingDeclaration) {
if (length(signatures)) {
const type = checker.getUnionType(map(signatures, checker.getReturnTypeOfSignature));
return checker.typeToTypeNode(type, enclosingDeclaration, 1 /* NoTruncation */, getNoopSymbolTrackerWithResolver(context));
}
}
function createStubbedMethod(modifiers, name, optional, typeParameters, parameters, returnType, quotePreference, body) {
return factory.createMethodDeclaration(
modifiers,
/*asteriskToken*/
void 0,
name,
optional ? factory.createToken(58 /* QuestionToken */) : void 0,
typeParameters,
parameters,
returnType,
body || createStubbedMethodBody(quotePreference)
);
}
function createStubbedMethodBody(quotePreference) {
return createStubbedBody(Diagnostics.Method_not_implemented.message, quotePreference);
}
function createStubbedBody(text, quotePreference) {
return factory.createBlock(
[factory.createThrowStatement(
factory.createNewExpression(
factory.createIdentifier("Error"),
/*typeArguments*/
void 0,
// TODO Handle auto quote preference.
[factory.createStringLiteral(
text,
/*isSingleQuote*/
quotePreference === 0 /* Single */
)]
)
)],
/*multiLine*/
true
);
}
function setJsonCompilerOptionValues(changeTracker, configFile, options) {
const tsconfigObjectLiteral = getTsConfigObjectLiteralExpression(configFile);
if (!tsconfigObjectLiteral)
return void 0;
const compilerOptionsProperty = findJsonProperty(tsconfigObjectLiteral, "compilerOptions");
if (compilerOptionsProperty === void 0) {
changeTracker.insertNodeAtObjectStart(configFile, tsconfigObjectLiteral, createJsonPropertyAssignment(
"compilerOptions",
factory.createObjectLiteralExpression(
options.map(([optionName, optionValue]) => createJsonPropertyAssignment(optionName, optionValue)),
/*multiLine*/
true
)
));
return;
}
const compilerOptions = compilerOptionsProperty.initializer;
if (!isObjectLiteralExpression(compilerOptions)) {
return;
}
for (const [optionName, optionValue] of options) {
const optionProperty = findJsonProperty(compilerOptions, optionName);
if (optionProperty === void 0) {
changeTracker.insertNodeAtObjectStart(configFile, compilerOptions, createJsonPropertyAssignment(optionName, optionValue));
} else {
changeTracker.replaceNode(configFile, optionProperty.initializer, optionValue);
}
}
}
function setJsonCompilerOptionValue(changeTracker, configFile, optionName, optionValue) {
setJsonCompilerOptionValues(changeTracker, configFile, [[optionName, optionValue]]);
}
function createJsonPropertyAssignment(name, initializer) {
return factory.createPropertyAssignment(factory.createStringLiteral(name), initializer);
}
function findJsonProperty(obj, name) {
return find(obj.properties, (p) => isPropertyAssignment(p) && !!p.name && isStringLiteral(p.name) && p.name.text === name);
}
function tryGetAutoImportableReferenceFromTypeNode(importTypeNode, scriptTarget) {
let symbols;
const typeNode = visitNode(importTypeNode, visit, isTypeNode);
if (symbols && typeNode) {
return { typeNode, symbols };
}
function visit(node) {
if (isLiteralImportTypeNode(node) && node.qualifier) {
const firstIdentifier = getFirstIdentifier(node.qualifier);
const name = getNameForExportedSymbol(firstIdentifier.symbol, scriptTarget);
const qualifier = name !== firstIdentifier.text ? replaceFirstIdentifierOfEntityName(node.qualifier, factory.createIdentifier(name)) : node.qualifier;
symbols = append(symbols, firstIdentifier.symbol);
const typeArguments = visitNodes2(node.typeArguments, visit, isTypeNode);
return factory.createTypeReferenceNode(qualifier, typeArguments);
}
return visitEachChild(node, visit, nullTransformationContext);
}
}
function replaceFirstIdentifierOfEntityName(name, newIdentifier) {
if (name.kind === 80 /* Identifier */) {
return newIdentifier;
}
return factory.createQualifiedName(replaceFirstIdentifierOfEntityName(name.left, newIdentifier), name.right);
}
function importSymbols(importAdder, symbols) {
symbols.forEach((s) => importAdder.addImportFromExportedSymbol(
s,
/*isValidTypeOnlyUseSite*/
true
));
}
function findAncestorMatchingSpan(sourceFile, span) {
const end = textSpanEnd(span);
let token = getTokenAtPosition(sourceFile, span.start);
while (token.end < end) {
token = token.parent;
}
return token;
}
// src/services/codefixes/generateAccessors.ts
function generateAccessorFromProperty(file, program, start2, end, context, _actionName) {
const fieldInfo = getAccessorConvertiblePropertyAtPosition(file, program, start2, end);
if (!fieldInfo || ts_refactor_exports.isRefactorErrorInfo(fieldInfo))
return void 0;
const changeTracker = ts_textChanges_exports.ChangeTracker.fromContext(context);
const { isStatic: isStatic2, isReadonly, fieldName, accessorName, originalName, type, container, declaration } = fieldInfo;
suppressLeadingAndTrailingTrivia(fieldName);
suppressLeadingAndTrailingTrivia(accessorName);
suppressLeadingAndTrailingTrivia(declaration);
suppressLeadingAndTrailingTrivia(container);
let accessorModifiers;
let fieldModifiers;
if (isClassLike(container)) {
const modifierFlags = getEffectiveModifierFlags(declaration);
if (isSourceFileJS(file)) {
const modifiers = factory.createModifiersFromModifierFlags(modifierFlags);
accessorModifiers = modifiers;
fieldModifiers = modifiers;
} else {
accessorModifiers = factory.createModifiersFromModifierFlags(prepareModifierFlagsForAccessor(modifierFlags));
fieldModifiers = factory.createModifiersFromModifierFlags(prepareModifierFlagsForField(modifierFlags));
}
if (canHaveDecorators(declaration)) {
fieldModifiers = concatenate(getDecorators(declaration), fieldModifiers);
}
}
updateFieldDeclaration(changeTracker, file, declaration, type, fieldName, fieldModifiers);
const getAccessor = generateGetAccessor(fieldName, accessorName, type, accessorModifiers, isStatic2, container);
suppressLeadingAndTrailingTrivia(getAccessor);
insertAccessor(changeTracker, file, getAccessor, declaration, container);
if (isReadonly) {
const constructor = getFirstConstructorWithBody(container);
if (constructor) {
updateReadonlyPropertyInitializerStatementConstructor(changeTracker, file, constructor, fieldName.text, originalName);
}
} else {
const setAccessor = generateSetAccessor(fieldName, accessorName, type, accessorModifiers, isStatic2, container);
suppressLeadingAndTrailingTrivia(setAccessor);
insertAccessor(changeTracker, file, setAccessor, declaration, container);
}
return changeTracker.getChanges();
}
function isConvertibleName(name) {
return isIdentifier(name) || isStringLiteral(name);
}
function isAcceptedDeclaration(node) {
return isParameterPropertyDeclaration(node, node.parent) || isPropertyDeclaration(node) || isPropertyAssignment(node);
}
function createPropertyName(name, originalName) {
return isIdentifier(originalName) ? factory.createIdentifier(name) : factory.createStringLiteral(name);
}
function createAccessorAccessExpression(fieldName, isStatic2, container) {
const leftHead = isStatic2 ? container.name : factory.createThis();
return isIdentifier(fieldName) ? factory.createPropertyAccessExpression(leftHead, fieldName) : factory.createElementAccessExpression(leftHead, factory.createStringLiteralFromNode(fieldName));
}
function prepareModifierFlagsForAccessor(modifierFlags) {
modifierFlags &= ~64 /* Readonly */;
modifierFlags &= ~8 /* Private */;
if (!(modifierFlags & 16 /* Protected */)) {
modifierFlags |= 4 /* Public */;
}
return modifierFlags;
}
function prepareModifierFlagsForField(modifierFlags) {
modifierFlags &= ~4 /* Public */;
modifierFlags &= ~16 /* Protected */;
modifierFlags |= 8 /* Private */;
return modifierFlags;
}
function getAccessorConvertiblePropertyAtPosition(file, program, start2, end, considerEmptySpans = true) {
const node = getTokenAtPosition(file, start2);
const cursorRequest = start2 === end && considerEmptySpans;
const declaration = findAncestor(node.parent, isAcceptedDeclaration);
const meaning = 28 /* AccessibilityModifier */ | 32 /* Static */ | 64 /* Readonly */;
if (!declaration || !(nodeOverlapsWithStartEnd(declaration.name, file, start2, end) || cursorRequest)) {
return {
error: getLocaleSpecificMessage(Diagnostics.Could_not_find_property_for_which_to_generate_accessor)
};
}
if (!isConvertibleName(declaration.name)) {
return {
error: getLocaleSpecificMessage(Diagnostics.Name_is_not_valid)
};
}
if ((getEffectiveModifierFlags(declaration) & 126975 /* Modifier */ | meaning) !== meaning) {
return {
error: getLocaleSpecificMessage(Diagnostics.Can_only_convert_property_with_modifier)
};
}
const name = declaration.name.text;
const startWithUnderscore = startsWithUnderscore(name);
const fieldName = createPropertyName(startWithUnderscore ? name : getUniqueName(`_${name}`, file), declaration.name);
const accessorName = createPropertyName(startWithUnderscore ? getUniqueName(name.substring(1), file) : name, declaration.name);
return {
isStatic: hasStaticModifier(declaration),
isReadonly: hasEffectiveReadonlyModifier(declaration),
type: getDeclarationType(declaration, program),
container: declaration.kind === 168 /* Parameter */ ? declaration.parent.parent : declaration.parent,
originalName: declaration.name.text,
declaration,
fieldName,
accessorName,
renameAccessor: startWithUnderscore
};
}
function generateGetAccessor(fieldName, accessorName, type, modifiers, isStatic2, container) {
return factory.createGetAccessorDeclaration(
modifiers,
accessorName,
[],
type,
factory.createBlock(
[
factory.createReturnStatement(
createAccessorAccessExpression(fieldName, isStatic2, container)
)
],
/*multiLine*/
true
)
);
}
function generateSetAccessor(fieldName, accessorName, type, modifiers, isStatic2, container) {
return factory.createSetAccessorDeclaration(
modifiers,
accessorName,
[factory.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
factory.createIdentifier("value"),
/*questionToken*/
void 0,
type
)],
factory.createBlock(
[
factory.createExpressionStatement(
factory.createAssignment(
createAccessorAccessExpression(fieldName, isStatic2, container),
factory.createIdentifier("value")
)
)
],
/*multiLine*/
true
)
);
}
function updatePropertyDeclaration(changeTracker, file, declaration, type, fieldName, modifiers) {
const property = factory.updatePropertyDeclaration(
declaration,
modifiers,
fieldName,
declaration.questionToken || declaration.exclamationToken,
type,
declaration.initializer
);
changeTracker.replaceNode(file, declaration, property);
}
function updatePropertyAssignmentDeclaration(changeTracker, file, declaration, fieldName) {
let assignment = factory.updatePropertyAssignment(declaration, fieldName, declaration.initializer);
if (assignment.modifiers || assignment.questionToken || assignment.exclamationToken) {
if (assignment === declaration)
assignment = factory.cloneNode(assignment);
assignment.modifiers = void 0;
assignment.questionToken = void 0;
assignment.exclamationToken = void 0;
}
changeTracker.replacePropertyAssignment(file, declaration, assignment);
}
function updateFieldDeclaration(changeTracker, file, declaration, type, fieldName, modifiers) {
if (isPropertyDeclaration(declaration)) {
updatePropertyDeclaration(changeTracker, file, declaration, type, fieldName, modifiers);
} else if (isPropertyAssignment(declaration)) {
updatePropertyAssignmentDeclaration(changeTracker, file, declaration, fieldName);
} else {
changeTracker.replaceNode(
file,
declaration,
factory.updateParameterDeclaration(declaration, modifiers, declaration.dotDotDotToken, cast(fieldName, isIdentifier), declaration.questionToken, declaration.type, declaration.initializer)
);
}
}
function insertAccessor(changeTracker, file, accessor, declaration, container) {
isParameterPropertyDeclaration(declaration, declaration.parent) ? changeTracker.insertMemberAtStart(file, container, accessor) : isPropertyAssignment(declaration) ? changeTracker.insertNodeAfterComma(file, declaration, accessor) : changeTracker.insertNodeAfter(file, declaration, accessor);
}
function updateReadonlyPropertyInitializerStatementConstructor(changeTracker, file, constructor, fieldName, originalName) {
if (!constructor.body)
return;
constructor.body.forEachChild(function recur(node) {
if (isElementAccessExpression(node) && node.expression.kind === 110 /* ThisKeyword */ && isStringLiteral(node.argumentExpression) && node.argumentExpression.text === originalName && isWriteAccess(node)) {
changeTracker.replaceNode(file, node.argumentExpression, factory.createStringLiteral(fieldName));
}
if (isPropertyAccessExpression(node) && node.expression.kind === 110 /* ThisKeyword */ && node.name.text === originalName && isWriteAccess(node)) {
changeTracker.replaceNode(file, node.name, factory.createIdentifier(fieldName));
}
if (!isFunctionLike(node) && !isClassLike(node)) {
node.forEachChild(recur);
}
});
}
function getDeclarationType(declaration, program) {
const typeNode = getTypeAnnotationNode(declaration);
if (isPropertyDeclaration(declaration) && typeNode && declaration.questionToken) {
const typeChecker = program.getTypeChecker();
const type = typeChecker.getTypeFromTypeNode(typeNode);
if (!typeChecker.isTypeAssignableTo(typeChecker.getUndefinedType(), type)) {
const types = isUnionTypeNode(typeNode) ? typeNode.types : [typeNode];
return factory.createUnionTypeNode([...types, factory.createKeywordTypeNode(157 /* UndefinedKeyword */)]);
}
}
return typeNode;
}
function getAllSupers(decl, checker) {
const res = [];
while (decl) {
const superElement = getClassExtendsHeritageElement(decl);
const superSymbol = superElement && checker.getSymbolAtLocation(superElement.expression);
if (!superSymbol)
break;
const symbol = superSymbol.flags & 2097152 /* Alias */ ? checker.getAliasedSymbol(superSymbol) : superSymbol;
const superDecl = symbol.declarations && find(symbol.declarations, isClassLike);
if (!superDecl)
break;
res.push(superDecl);
decl = superDecl;
}
return res;
}
// src/services/codefixes/fixInvalidImportSyntax.ts
var fixName5 = "invalidImportSyntax";
function getCodeFixesForImportDeclaration(context, node) {
const sourceFile = getSourceFileOfNode(node);
const namespace = getNamespaceDeclarationNode(node);
const opts = context.program.getCompilerOptions();
const variations = [];
variations.push(createAction(context, sourceFile, node, makeImport(
namespace.name,
/*namedImports*/
void 0,
node.moduleSpecifier,
getQuotePreference(sourceFile, context.preferences)
)));
if (getEmitModuleKind(opts) === 1 /* CommonJS */) {
variations.push(createAction(context, sourceFile, node, factory.createImportEqualsDeclaration(
/*modifiers*/
void 0,
/*isTypeOnly*/
false,
namespace.name,
factory.createExternalModuleReference(node.moduleSpecifier)
)));
}
return variations;
}
function createAction(context, sourceFile, node, replacement) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => t.replaceNode(sourceFile, node, replacement));
return createCodeFixActionWithoutFixAll(fixName5, changes, [Diagnostics.Replace_import_with_0, changes[0].textChanges[0].newText]);
}
registerCodeFix({
errorCodes: [
Diagnostics.This_expression_is_not_callable.code,
Diagnostics.This_expression_is_not_constructable.code
],
getCodeActions: getActionsForUsageOfInvalidImport
});
function getActionsForUsageOfInvalidImport(context) {
const sourceFile = context.sourceFile;
const targetKind = Diagnostics.This_expression_is_not_callable.code === context.errorCode ? 212 /* CallExpression */ : 213 /* NewExpression */;
const node = findAncestor(getTokenAtPosition(sourceFile, context.span.start), (a) => a.kind === targetKind);
if (!node) {
return [];
}
const expr = node.expression;
return getImportCodeFixesForExpression(context, expr);
}
registerCodeFix({
errorCodes: [
// The following error codes cover pretty much all assignability errors that could involve an expression
Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1.code,
Diagnostics.Type_0_does_not_satisfy_the_constraint_1.code,
Diagnostics.Type_0_is_not_assignable_to_type_1.code,
Diagnostics.Type_0_is_not_assignable_to_type_1_Two_different_types_with_this_name_exist_but_they_are_unrelated.code,
Diagnostics.Type_predicate_0_is_not_assignable_to_1.code,
Diagnostics.Property_0_of_type_1_is_not_assignable_to_2_index_type_3.code,
Diagnostics._0_index_type_1_is_not_assignable_to_2_index_type_3.code,
Diagnostics.Property_0_in_type_1_is_not_assignable_to_the_same_property_in_base_type_2.code,
Diagnostics.Property_0_in_type_1_is_not_assignable_to_type_2.code,
Diagnostics.Property_0_of_JSX_spread_attribute_is_not_assignable_to_target_property.code,
Diagnostics.The_this_context_of_type_0_is_not_assignable_to_method_s_this_of_type_1.code
],
getCodeActions: getActionsForInvalidImportLocation
});
function getActionsForInvalidImportLocation(context) {
const sourceFile = context.sourceFile;
const node = findAncestor(getTokenAtPosition(sourceFile, context.span.start), (a) => a.getStart() === context.span.start && a.getEnd() === context.span.start + context.span.length);
if (!node) {
return [];
}
return getImportCodeFixesForExpression(context, node);
}
function getImportCodeFixesForExpression(context, expr) {
const type = context.program.getTypeChecker().getTypeAtLocation(expr);
if (!(type.symbol && isTransientSymbol(type.symbol) && type.symbol.links.originatingImport)) {
return [];
}
const fixes = [];
const relatedImport = type.symbol.links.originatingImport;
if (!isImportCall(relatedImport)) {
addRange(fixes, getCodeFixesForImportDeclaration(context, relatedImport));
}
if (isExpression(expr) && !(isNamedDeclaration(expr.parent) && expr.parent.name === expr)) {
const sourceFile = context.sourceFile;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => t.replaceNode(sourceFile, expr, factory.createPropertyAccessExpression(expr, "default"), {}));
fixes.push(createCodeFixActionWithoutFixAll(fixName5, changes, Diagnostics.Use_synthetic_default_member));
}
return fixes;
}
// src/services/codefixes/fixStrictClassInitialization.ts
var fixName6 = "strictClassInitialization";
var fixIdAddDefiniteAssignmentAssertions = "addMissingPropertyDefiniteAssignmentAssertions";
var fixIdAddUndefinedType = "addMissingPropertyUndefinedType";
var fixIdAddInitializer = "addMissingPropertyInitializer";
var errorCodes51 = [Diagnostics.Property_0_has_no_initializer_and_is_not_definitely_assigned_in_the_constructor.code];
registerCodeFix({
errorCodes: errorCodes51,
getCodeActions: function getCodeActionsForStrictClassInitializationErrors(context) {
const info = getInfo16(context.sourceFile, context.span.start);
if (!info)
return;
const result = [];
append(result, getActionForAddMissingUndefinedType(context, info));
append(result, getActionForAddMissingDefiniteAssignmentAssertion(context, info));
append(result, getActionForAddMissingInitializer(context, info));
return result;
},
fixIds: [fixIdAddDefiniteAssignmentAssertions, fixIdAddUndefinedType, fixIdAddInitializer],
getAllCodeActions: (context) => {
return codeFixAll(context, errorCodes51, (changes, diag2) => {
const info = getInfo16(diag2.file, diag2.start);
if (!info)
return;
switch (context.fixId) {
case fixIdAddDefiniteAssignmentAssertions:
addDefiniteAssignmentAssertion(changes, diag2.file, info.prop);
break;
case fixIdAddUndefinedType:
addUndefinedType(changes, diag2.file, info);
break;
case fixIdAddInitializer:
const checker = context.program.getTypeChecker();
const initializer = getInitializer(checker, info.prop);
if (!initializer)
return;
addInitializer(changes, diag2.file, info.prop, initializer);
break;
default:
Debug.fail(JSON.stringify(context.fixId));
}
});
}
});
function getInfo16(sourceFile, pos) {
const token = getTokenAtPosition(sourceFile, pos);
if (isIdentifier(token) && isPropertyDeclaration(token.parent)) {
const type = getEffectiveTypeAnnotationNode(token.parent);
if (type) {
return { type, prop: token.parent, isJs: isInJSFile(token.parent) };
}
}
return void 0;
}
function getActionForAddMissingDefiniteAssignmentAssertion(context, info) {
if (info.isJs)
return void 0;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => addDefiniteAssignmentAssertion(t, context.sourceFile, info.prop));
return createCodeFixAction(fixName6, changes, [Diagnostics.Add_definite_assignment_assertion_to_property_0, info.prop.getText()], fixIdAddDefiniteAssignmentAssertions, Diagnostics.Add_definite_assignment_assertions_to_all_uninitialized_properties);
}
function addDefiniteAssignmentAssertion(changeTracker, propertyDeclarationSourceFile, propertyDeclaration) {
suppressLeadingAndTrailingTrivia(propertyDeclaration);
const property = factory.updatePropertyDeclaration(
propertyDeclaration,
propertyDeclaration.modifiers,
propertyDeclaration.name,
factory.createToken(54 /* ExclamationToken */),
propertyDeclaration.type,
propertyDeclaration.initializer
);
changeTracker.replaceNode(propertyDeclarationSourceFile, propertyDeclaration, property);
}
function getActionForAddMissingUndefinedType(context, info) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => addUndefinedType(t, context.sourceFile, info));
return createCodeFixAction(fixName6, changes, [Diagnostics.Add_undefined_type_to_property_0, info.prop.name.getText()], fixIdAddUndefinedType, Diagnostics.Add_undefined_type_to_all_uninitialized_properties);
}
function addUndefinedType(changeTracker, sourceFile, info) {
const undefinedTypeNode = factory.createKeywordTypeNode(157 /* UndefinedKeyword */);
const types = isUnionTypeNode(info.type) ? info.type.types.concat(undefinedTypeNode) : [info.type, undefinedTypeNode];
const unionTypeNode = factory.createUnionTypeNode(types);
if (info.isJs) {
changeTracker.addJSDocTags(sourceFile, info.prop, [factory.createJSDocTypeTag(
/*tagName*/
void 0,
factory.createJSDocTypeExpression(unionTypeNode)
)]);
} else {
changeTracker.replaceNode(sourceFile, info.type, unionTypeNode);
}
}
function getActionForAddMissingInitializer(context, info) {
if (info.isJs)
return void 0;
const checker = context.program.getTypeChecker();
const initializer = getInitializer(checker, info.prop);
if (!initializer)
return void 0;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => addInitializer(t, context.sourceFile, info.prop, initializer));
return createCodeFixAction(fixName6, changes, [Diagnostics.Add_initializer_to_property_0, info.prop.name.getText()], fixIdAddInitializer, Diagnostics.Add_initializers_to_all_uninitialized_properties);
}
function addInitializer(changeTracker, propertyDeclarationSourceFile, propertyDeclaration, initializer) {
suppressLeadingAndTrailingTrivia(propertyDeclaration);
const property = factory.updatePropertyDeclaration(
propertyDeclaration,
propertyDeclaration.modifiers,
propertyDeclaration.name,
propertyDeclaration.questionToken,
propertyDeclaration.type,
initializer
);
changeTracker.replaceNode(propertyDeclarationSourceFile, propertyDeclaration, property);
}
function getInitializer(checker, propertyDeclaration) {
return getDefaultValueFromType(checker, checker.getTypeFromTypeNode(propertyDeclaration.type));
}
function getDefaultValueFromType(checker, type) {
if (type.flags & 512 /* BooleanLiteral */) {
return type === checker.getFalseType() || type === checker.getFalseType(
/*fresh*/
true
) ? factory.createFalse() : factory.createTrue();
} else if (type.isStringLiteral()) {
return factory.createStringLiteral(type.value);
} else if (type.isNumberLiteral()) {
return factory.createNumericLiteral(type.value);
} else if (type.flags & 2048 /* BigIntLiteral */) {
return factory.createBigIntLiteral(type.value);
} else if (type.isUnion()) {
return firstDefined(type.types, (t) => getDefaultValueFromType(checker, t));
} else if (type.isClass()) {
const classDeclaration = getClassLikeDeclarationOfSymbol(type.symbol);
if (!classDeclaration || hasSyntacticModifier(classDeclaration, 256 /* Abstract */))
return void 0;
const constructorDeclaration = getFirstConstructorWithBody(classDeclaration);
if (constructorDeclaration && constructorDeclaration.parameters.length)
return void 0;
return factory.createNewExpression(
factory.createIdentifier(type.symbol.name),
/*typeArguments*/
void 0,
/*argumentsArray*/
void 0
);
} else if (checker.isArrayLikeType(type)) {
return factory.createArrayLiteralExpression();
}
return void 0;
}
// src/services/codefixes/requireInTs.ts
var fixId41 = "requireInTs";
var errorCodes52 = [Diagnostics.require_call_may_be_converted_to_an_import.code];
registerCodeFix({
errorCodes: errorCodes52,
getCodeActions(context) {
const info = getInfo17(context.sourceFile, context.program, context.span.start);
if (!info) {
return void 0;
}
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange34(t, context.sourceFile, info));
return [createCodeFixAction(fixId41, changes, Diagnostics.Convert_require_to_import, fixId41, Diagnostics.Convert_all_require_to_import)];
},
fixIds: [fixId41],
getAllCodeActions: (context) => codeFixAll(context, errorCodes52, (changes, diag2) => {
const info = getInfo17(diag2.file, context.program, diag2.start);
if (info) {
doChange34(changes, context.sourceFile, info);
}
})
});
function doChange34(changes, sourceFile, info) {
const { allowSyntheticDefaults, defaultImportName, namedImports, statement, required } = info;
changes.replaceNode(sourceFile, statement, defaultImportName && !allowSyntheticDefaults ? factory.createImportEqualsDeclaration(
/*modifiers*/
void 0,
/*isTypeOnly*/
false,
defaultImportName,
factory.createExternalModuleReference(required)
) : factory.createImportDeclaration(
/*modifiers*/
void 0,
factory.createImportClause(
/*isTypeOnly*/
false,
defaultImportName,
namedImports
),
required,
/*assertClause*/
void 0
));
}
function getInfo17(sourceFile, program, pos) {
const { parent: parent2 } = getTokenAtPosition(sourceFile, pos);
if (!isRequireCall(
parent2,
/*requireStringLiteralLikeArgument*/
true
)) {
Debug.failBadSyntaxKind(parent2);
}
const decl = cast(parent2.parent, isVariableDeclaration);
const defaultImportName = tryCast(decl.name, isIdentifier);
const namedImports = isObjectBindingPattern(decl.name) ? tryCreateNamedImportsFromObjectBindingPattern(decl.name) : void 0;
if (defaultImportName || namedImports) {
return {
allowSyntheticDefaults: getAllowSyntheticDefaultImports(program.getCompilerOptions()),
defaultImportName,
namedImports,
statement: cast(decl.parent.parent, isVariableStatement),
required: first(parent2.arguments)
};
}
}
function tryCreateNamedImportsFromObjectBindingPattern(node) {
const importSpecifiers = [];
for (const element of node.elements) {
if (!isIdentifier(element.name) || element.initializer) {
return void 0;
}
importSpecifiers.push(factory.createImportSpecifier(
/*isTypeOnly*/
false,
tryCast(element.propertyName, isIdentifier),
element.name
));
}
if (importSpecifiers.length) {
return factory.createNamedImports(importSpecifiers);
}
}
// src/services/codefixes/useDefaultImport.ts
var fixId42 = "useDefaultImport";
var errorCodes53 = [Diagnostics.Import_may_be_converted_to_a_default_import.code];
registerCodeFix({
errorCodes: errorCodes53,
getCodeActions(context) {
const { sourceFile, span: { start: start2 } } = context;
const info = getInfo18(sourceFile, start2);
if (!info)
return void 0;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange35(t, sourceFile, info, context.preferences));
return [createCodeFixAction(fixId42, changes, Diagnostics.Convert_to_default_import, fixId42, Diagnostics.Convert_all_to_default_imports)];
},
fixIds: [fixId42],
getAllCodeActions: (context) => codeFixAll(context, errorCodes53, (changes, diag2) => {
const info = getInfo18(diag2.file, diag2.start);
if (info)
doChange35(changes, diag2.file, info, context.preferences);
})
});
function getInfo18(sourceFile, pos) {
const name = getTokenAtPosition(sourceFile, pos);
if (!isIdentifier(name))
return void 0;
const { parent: parent2 } = name;
if (isImportEqualsDeclaration(parent2) && isExternalModuleReference(parent2.moduleReference)) {
return { importNode: parent2, name, moduleSpecifier: parent2.moduleReference.expression };
} else if (isNamespaceImport(parent2)) {
const importNode = parent2.parent.parent;
return { importNode, name, moduleSpecifier: importNode.moduleSpecifier };
}
}
function doChange35(changes, sourceFile, info, preferences) {
changes.replaceNode(sourceFile, info.importNode, makeImport(
info.name,
/*namedImports*/
void 0,
info.moduleSpecifier,
getQuotePreference(sourceFile, preferences)
));
}
// src/services/codefixes/useBigintLiteral.ts
var fixId43 = "useBigintLiteral";
var errorCodes54 = [
Diagnostics.Numeric_literals_with_absolute_values_equal_to_2_53_or_greater_are_too_large_to_be_represented_accurately_as_integers.code
];
registerCodeFix({
errorCodes: errorCodes54,
getCodeActions: function getCodeActionsToUseBigintLiteral(context) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => makeChange9(t, context.sourceFile, context.span));
if (changes.length > 0) {
return [createCodeFixAction(fixId43, changes, Diagnostics.Convert_to_a_bigint_numeric_literal, fixId43, Diagnostics.Convert_all_to_bigint_numeric_literals)];
}
},
fixIds: [fixId43],
getAllCodeActions: (context) => {
return codeFixAll(context, errorCodes54, (changes, diag2) => makeChange9(changes, diag2.file, diag2));
}
});
function makeChange9(changeTracker, sourceFile, span) {
const numericLiteral = tryCast(getTokenAtPosition(sourceFile, span.start), isNumericLiteral);
if (!numericLiteral) {
return;
}
const newText = numericLiteral.getText(sourceFile) + "n";
changeTracker.replaceNode(sourceFile, numericLiteral, factory.createBigIntLiteral(newText));
}
// src/services/codefixes/fixAddModuleReferTypeMissingTypeof.ts
var fixIdAddMissingTypeof = "fixAddModuleReferTypeMissingTypeof";
var fixId44 = fixIdAddMissingTypeof;
var errorCodes55 = [Diagnostics.Module_0_does_not_refer_to_a_type_but_is_used_as_a_type_here_Did_you_mean_typeof_import_0.code];
registerCodeFix({
errorCodes: errorCodes55,
getCodeActions: function getCodeActionsToAddMissingTypeof(context) {
const { sourceFile, span } = context;
const importType = getImportTypeNode(sourceFile, span.start);
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange36(t, sourceFile, importType));
return [createCodeFixAction(fixId44, changes, Diagnostics.Add_missing_typeof, fixId44, Diagnostics.Add_missing_typeof)];
},
fixIds: [fixId44],
getAllCodeActions: (context) => codeFixAll(context, errorCodes55, (changes, diag2) => doChange36(changes, context.sourceFile, getImportTypeNode(diag2.file, diag2.start)))
});
function getImportTypeNode(sourceFile, pos) {
const token = getTokenAtPosition(sourceFile, pos);
Debug.assert(token.kind === 102 /* ImportKeyword */, "This token should be an ImportKeyword");
Debug.assert(token.parent.kind === 204 /* ImportType */, "Token parent should be an ImportType");
return token.parent;
}
function doChange36(changes, sourceFile, importType) {
const newTypeNode = factory.updateImportTypeNode(
importType,
importType.argument,
importType.assertions,
importType.qualifier,
importType.typeArguments,
/*isTypeOf*/
true
);
changes.replaceNode(sourceFile, importType, newTypeNode);
}
// src/services/codefixes/wrapJsxInFragment.ts
var fixID2 = "wrapJsxInFragment";
var errorCodes56 = [Diagnostics.JSX_expressions_must_have_one_parent_element.code];
registerCodeFix({
errorCodes: errorCodes56,
getCodeActions: function getCodeActionsToWrapJsxInFragment(context) {
const { sourceFile, span } = context;
const node = findNodeToFix(sourceFile, span.start);
if (!node)
return void 0;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange37(t, sourceFile, node));
return [createCodeFixAction(fixID2, changes, Diagnostics.Wrap_in_JSX_fragment, fixID2, Diagnostics.Wrap_all_unparented_JSX_in_JSX_fragment)];
},
fixIds: [fixID2],
getAllCodeActions: (context) => codeFixAll(context, errorCodes56, (changes, diag2) => {
const node = findNodeToFix(context.sourceFile, diag2.start);
if (!node)
return void 0;
doChange37(changes, context.sourceFile, node);
})
});
function findNodeToFix(sourceFile, pos) {
const lessThanToken = getTokenAtPosition(sourceFile, pos);
const firstJsxElementOrOpenElement = lessThanToken.parent;
let binaryExpr = firstJsxElementOrOpenElement.parent;
if (!isBinaryExpression(binaryExpr)) {
binaryExpr = binaryExpr.parent;
if (!isBinaryExpression(binaryExpr))
return void 0;
}
if (!nodeIsMissing(binaryExpr.operatorToken))
return void 0;
return binaryExpr;
}
function doChange37(changeTracker, sf, node) {
const jsx = flattenInvalidBinaryExpr(node);
if (jsx)
changeTracker.replaceNode(sf, node, factory.createJsxFragment(factory.createJsxOpeningFragment(), jsx, factory.createJsxJsxClosingFragment()));
}
function flattenInvalidBinaryExpr(node) {
const children = [];
let current = node;
while (true) {
if (isBinaryExpression(current) && nodeIsMissing(current.operatorToken) && current.operatorToken.kind === 28 /* CommaToken */) {
children.push(current.left);
if (isJsxChild(current.right)) {
children.push(current.right);
return children;
} else if (isBinaryExpression(current.right)) {
current = current.right;
continue;
} else
return void 0;
} else
return void 0;
}
}
// src/services/codefixes/convertToMappedObjectType.ts
var fixId45 = "fixConvertToMappedObjectType";
var errorCodes57 = [Diagnostics.An_index_signature_parameter_type_cannot_be_a_literal_type_or_generic_type_Consider_using_a_mapped_object_type_instead.code];
registerCodeFix({
errorCodes: errorCodes57,
getCodeActions: function getCodeActionsToConvertToMappedTypeObject(context) {
const { sourceFile, span } = context;
const info = getInfo19(sourceFile, span.start);
if (!info)
return void 0;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange38(t, sourceFile, info));
const name = idText(info.container.name);
return [createCodeFixAction(fixId45, changes, [Diagnostics.Convert_0_to_mapped_object_type, name], fixId45, [Diagnostics.Convert_0_to_mapped_object_type, name])];
},
fixIds: [fixId45],
getAllCodeActions: (context) => codeFixAll(context, errorCodes57, (changes, diag2) => {
const info = getInfo19(diag2.file, diag2.start);
if (info)
doChange38(changes, diag2.file, info);
})
});
function getInfo19(sourceFile, pos) {
const token = getTokenAtPosition(sourceFile, pos);
const indexSignature = tryCast(token.parent.parent, isIndexSignatureDeclaration);
if (!indexSignature)
return void 0;
const container = isInterfaceDeclaration(indexSignature.parent) ? indexSignature.parent : tryCast(indexSignature.parent.parent, isTypeAliasDeclaration);
if (!container)
return void 0;
return { indexSignature, container };
}
function createTypeAliasFromInterface(declaration, type) {
return factory.createTypeAliasDeclaration(declaration.modifiers, declaration.name, declaration.typeParameters, type);
}
function doChange38(changes, sourceFile, { indexSignature, container }) {
const members = isInterfaceDeclaration(container) ? container.members : container.type.members;
const otherMembers = members.filter((member) => !isIndexSignatureDeclaration(member));
const parameter = first(indexSignature.parameters);
const mappedTypeParameter = factory.createTypeParameterDeclaration(
/*modifiers*/
void 0,
cast(parameter.name, isIdentifier),
parameter.type
);
const mappedIntersectionType = factory.createMappedTypeNode(
hasEffectiveReadonlyModifier(indexSignature) ? factory.createModifier(148 /* ReadonlyKeyword */) : void 0,
mappedTypeParameter,
/*nameType*/
void 0,
indexSignature.questionToken,
indexSignature.type,
/*members*/
void 0
);
const intersectionType = factory.createIntersectionTypeNode([
...getAllSuperTypeNodes(container),
mappedIntersectionType,
...otherMembers.length ? [factory.createTypeLiteralNode(otherMembers)] : emptyArray
]);
changes.replaceNode(sourceFile, container, createTypeAliasFromInterface(container, intersectionType));
}
// src/services/codefixes/removeAccidentalCallParentheses.ts
var fixId46 = "removeAccidentalCallParentheses";
var errorCodes58 = [
Diagnostics.This_expression_is_not_callable_because_it_is_a_get_accessor_Did_you_mean_to_use_it_without.code
];
registerCodeFix({
errorCodes: errorCodes58,
getCodeActions(context) {
const callExpression = findAncestor(getTokenAtPosition(context.sourceFile, context.span.start), isCallExpression);
if (!callExpression) {
return void 0;
}
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => {
t.deleteRange(context.sourceFile, { pos: callExpression.expression.end, end: callExpression.end });
});
return [createCodeFixActionWithoutFixAll(fixId46, changes, Diagnostics.Remove_parentheses)];
},
fixIds: [fixId46]
});
// src/services/codefixes/removeUnnecessaryAwait.ts
var fixId47 = "removeUnnecessaryAwait";
var errorCodes59 = [
Diagnostics.await_has_no_effect_on_the_type_of_this_expression.code
];
registerCodeFix({
errorCodes: errorCodes59,
getCodeActions: function getCodeActionsToRemoveUnnecessaryAwait(context) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => makeChange10(t, context.sourceFile, context.span));
if (changes.length > 0) {
return [createCodeFixAction(fixId47, changes, Diagnostics.Remove_unnecessary_await, fixId47, Diagnostics.Remove_all_unnecessary_uses_of_await)];
}
},
fixIds: [fixId47],
getAllCodeActions: (context) => {
return codeFixAll(context, errorCodes59, (changes, diag2) => makeChange10(changes, diag2.file, diag2));
}
});
function makeChange10(changeTracker, sourceFile, span) {
const awaitKeyword = tryCast(getTokenAtPosition(sourceFile, span.start), (node) => node.kind === 135 /* AwaitKeyword */);
const awaitExpression = awaitKeyword && tryCast(awaitKeyword.parent, isAwaitExpression);
if (!awaitExpression) {
return;
}
let expressionToReplace = awaitExpression;
const hasSurroundingParens = isParenthesizedExpression(awaitExpression.parent);
if (hasSurroundingParens) {
const leftMostExpression = getLeftmostExpression(
awaitExpression.expression,
/*stopAtCallExpressions*/
false
);
if (isIdentifier(leftMostExpression)) {
const precedingToken = findPrecedingToken(awaitExpression.parent.pos, sourceFile);
if (precedingToken && precedingToken.kind !== 105 /* NewKeyword */) {
expressionToReplace = awaitExpression.parent;
}
}
}
changeTracker.replaceNode(sourceFile, expressionToReplace, awaitExpression.expression);
}
// src/services/codefixes/splitTypeOnlyImport.ts
var errorCodes60 = [Diagnostics.A_type_only_import_can_specify_a_default_import_or_named_bindings_but_not_both.code];
var fixId48 = "splitTypeOnlyImport";
registerCodeFix({
errorCodes: errorCodes60,
fixIds: [fixId48],
getCodeActions: function getCodeActionsToSplitTypeOnlyImport(context) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => {
return splitTypeOnlyImport(t, getImportDeclaration2(context.sourceFile, context.span), context);
});
if (changes.length) {
return [createCodeFixAction(fixId48, changes, Diagnostics.Split_into_two_separate_import_declarations, fixId48, Diagnostics.Split_all_invalid_type_only_imports)];
}
},
getAllCodeActions: (context) => codeFixAll(context, errorCodes60, (changes, error) => {
splitTypeOnlyImport(changes, getImportDeclaration2(context.sourceFile, error), context);
})
});
function getImportDeclaration2(sourceFile, span) {
return findAncestor(getTokenAtPosition(sourceFile, span.start), isImportDeclaration);
}
function splitTypeOnlyImport(changes, importDeclaration, context) {
if (!importDeclaration) {
return;
}
const importClause = Debug.checkDefined(importDeclaration.importClause);
changes.replaceNode(context.sourceFile, importDeclaration, factory.updateImportDeclaration(
importDeclaration,
importDeclaration.modifiers,
factory.updateImportClause(
importClause,
importClause.isTypeOnly,
importClause.name,
/*namedBindings*/
void 0
),
importDeclaration.moduleSpecifier,
importDeclaration.assertClause
));
changes.insertNodeAfter(context.sourceFile, importDeclaration, factory.createImportDeclaration(
/*modifiers*/
void 0,
factory.updateImportClause(
importClause,
importClause.isTypeOnly,
/*name*/
void 0,
importClause.namedBindings
),
importDeclaration.moduleSpecifier,
importDeclaration.assertClause
));
}
// src/services/codefixes/convertConstToLet.ts
var fixId49 = "fixConvertConstToLet";
var errorCodes61 = [Diagnostics.Cannot_assign_to_0_because_it_is_a_constant.code];
registerCodeFix({
errorCodes: errorCodes61,
getCodeActions: function getCodeActionsToConvertConstToLet(context) {
const { sourceFile, span, program } = context;
const info = getInfo20(sourceFile, span.start, program);
if (info === void 0)
return;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange39(t, sourceFile, info.token));
return [createCodeFixActionMaybeFixAll(fixId49, changes, Diagnostics.Convert_const_to_let, fixId49, Diagnostics.Convert_all_const_to_let)];
},
getAllCodeActions: (context) => {
const { program } = context;
const seen = /* @__PURE__ */ new Map();
return createCombinedCodeActions(ts_textChanges_exports.ChangeTracker.with(context, (changes) => {
eachDiagnostic(context, errorCodes61, (diag2) => {
const info = getInfo20(diag2.file, diag2.start, program);
if (info) {
if (addToSeen(seen, getSymbolId(info.symbol))) {
return doChange39(changes, diag2.file, info.token);
}
}
return void 0;
});
}));
},
fixIds: [fixId49]
});
function getInfo20(sourceFile, pos, program) {
var _a;
const checker = program.getTypeChecker();
const symbol = checker.getSymbolAtLocation(getTokenAtPosition(sourceFile, pos));
if (symbol === void 0)
return;
const declaration = tryCast((_a = symbol == null ? void 0 : symbol.valueDeclaration) == null ? void 0 : _a.parent, isVariableDeclarationList);
if (declaration === void 0)
return;
const constToken = findChildOfKind(declaration, 87 /* ConstKeyword */, sourceFile);
if (constToken === void 0)
return;
return { symbol, token: constToken };
}
function doChange39(changes, sourceFile, token) {
changes.replaceNode(sourceFile, token, factory.createToken(121 /* LetKeyword */));
}
// src/services/codefixes/fixExpectedComma.ts
var fixId50 = "fixExpectedComma";
var expectedErrorCode = Diagnostics._0_expected.code;
var errorCodes62 = [expectedErrorCode];
registerCodeFix({
errorCodes: errorCodes62,
getCodeActions(context) {
const { sourceFile } = context;
const info = getInfo21(sourceFile, context.span.start, context.errorCode);
if (!info)
return void 0;
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange40(t, sourceFile, info));
return [createCodeFixAction(
fixId50,
changes,
[Diagnostics.Change_0_to_1, ";", ","],
fixId50,
[Diagnostics.Change_0_to_1, ";", ","]
)];
},
fixIds: [fixId50],
getAllCodeActions: (context) => codeFixAll(context, errorCodes62, (changes, diag2) => {
const info = getInfo21(diag2.file, diag2.start, diag2.code);
if (info)
doChange40(changes, context.sourceFile, info);
})
});
function getInfo21(sourceFile, pos, _) {
const node = getTokenAtPosition(sourceFile, pos);
return node.kind === 27 /* SemicolonToken */ && node.parent && (isObjectLiteralExpression(node.parent) || isArrayLiteralExpression(node.parent)) ? { node } : void 0;
}
function doChange40(changes, sourceFile, { node }) {
const newNode = factory.createToken(28 /* CommaToken */);
changes.replaceNode(sourceFile, node, newNode);
}
// src/services/codefixes/fixAddVoidToPromise.ts
var fixName7 = "addVoidToPromise";
var fixId51 = "addVoidToPromise";
var errorCodes63 = [
Diagnostics.Expected_1_argument_but_got_0_new_Promise_needs_a_JSDoc_hint_to_produce_a_resolve_that_can_be_called_without_arguments.code,
Diagnostics.Expected_0_arguments_but_got_1_Did_you_forget_to_include_void_in_your_type_argument_to_Promise.code
];
registerCodeFix({
errorCodes: errorCodes63,
fixIds: [fixId51],
getCodeActions(context) {
const changes = ts_textChanges_exports.ChangeTracker.with(context, (t) => makeChange11(t, context.sourceFile, context.span, context.program));
if (changes.length > 0) {
return [createCodeFixAction(fixName7, changes, Diagnostics.Add_void_to_Promise_resolved_without_a_value, fixId51, Diagnostics.Add_void_to_all_Promises_resolved_without_a_value)];
}
},
getAllCodeActions(context) {
return codeFixAll(context, errorCodes63, (changes, diag2) => makeChange11(changes, diag2.file, diag2, context.program, /* @__PURE__ */ new Set()));
}
});
function makeChange11(changes, sourceFile, span, program, seen) {
const node = getTokenAtPosition(sourceFile, span.start);
if (!isIdentifier(node) || !isCallExpression(node.parent) || node.parent.expression !== node || node.parent.arguments.length !== 0)
return;
const checker = program.getTypeChecker();
const symbol = checker.getSymbolAtLocation(node);
const decl = symbol == null ? void 0 : symbol.valueDeclaration;
if (!decl || !isParameter(decl) || !isNewExpression(decl.parent.parent))
return;
if (seen == null ? void 0 : seen.has(decl))
return;
seen == null ? void 0 : seen.add(decl);
const typeArguments = getEffectiveTypeArguments(decl.parent.parent);
if (some(typeArguments)) {
const typeArgument = typeArguments[0];
const needsParens = !isUnionTypeNode(typeArgument) && !isParenthesizedTypeNode(typeArgument) && isParenthesizedTypeNode(factory.createUnionTypeNode([typeArgument, factory.createKeywordTypeNode(116 /* VoidKeyword */)]).types[0]);
if (needsParens) {
changes.insertText(sourceFile, typeArgument.pos, "(");
}
changes.insertText(sourceFile, typeArgument.end, needsParens ? ") | void" : " | void");
} else {
const signature = checker.getResolvedSignature(node.parent);
const parameter = signature == null ? void 0 : signature.parameters[0];
const parameterType = parameter && checker.getTypeOfSymbolAtLocation(parameter, decl.parent.parent);
if (isInJSFile(decl)) {
if (!parameterType || parameterType.flags & 3 /* AnyOrUnknown */) {
changes.insertText(sourceFile, decl.parent.parent.end, `)`);
changes.insertText(sourceFile, skipTrivia(sourceFile.text, decl.parent.parent.pos), `/** @type {Promise} */(`);
}
} else {
if (!parameterType || parameterType.flags & 2 /* Unknown */) {
changes.insertText(sourceFile, decl.parent.parent.expression.end, "");
}
}
}
}
function getEffectiveTypeArguments(node) {
var _a;
if (isInJSFile(node)) {
if (isParenthesizedExpression(node.parent)) {
const jsDocType = (_a = getJSDocTypeTag(node.parent)) == null ? void 0 : _a.typeExpression.type;
if (jsDocType && isTypeReferenceNode(jsDocType) && isIdentifier(jsDocType.typeName) && idText(jsDocType.typeName) === "Promise") {
return jsDocType.typeArguments;
}
}
} else {
return node.typeArguments;
}
}
// src/services/_namespaces/ts.Completions.ts
var ts_Completions_exports = {};
__export(ts_Completions_exports, {
CompletionKind: () => CompletionKind,
CompletionSource: () => CompletionSource,
SortText: () => SortText,
StringCompletions: () => ts_Completions_StringCompletions_exports,
SymbolOriginInfoKind: () => SymbolOriginInfoKind,
createCompletionDetails: () => createCompletionDetails,
createCompletionDetailsForSymbol: () => createCompletionDetailsForSymbol,
getCompletionEntriesFromSymbols: () => getCompletionEntriesFromSymbols,
getCompletionEntryDetails: () => getCompletionEntryDetails,
getCompletionEntrySymbol: () => getCompletionEntrySymbol,
getCompletionsAtPosition: () => getCompletionsAtPosition,
getPropertiesForObjectExpression: () => getPropertiesForObjectExpression,
moduleSpecifierResolutionCacheAttemptLimit: () => moduleSpecifierResolutionCacheAttemptLimit,
moduleSpecifierResolutionLimit: () => moduleSpecifierResolutionLimit
});
// src/services/completions.ts
var moduleSpecifierResolutionLimit = 100;
var moduleSpecifierResolutionCacheAttemptLimit = 1e3;
var SortText = {
// Presets
LocalDeclarationPriority: "10",
LocationPriority: "11",
OptionalMember: "12",
MemberDeclaredBySpreadAssignment: "13",
SuggestedClassMembers: "14",
GlobalsOrKeywords: "15",
AutoImportSuggestions: "16",
ClassMemberSnippets: "17",
JavascriptIdentifiers: "18",
// Transformations
Deprecated(sortText) {
return "z" + sortText;
},
ObjectLiteralProperty(presetSortText, symbolDisplayName) {
return `${presetSortText}\0${symbolDisplayName}\0`;
},
SortBelow(sortText) {
return sortText + "1";
}
};
var CompletionSource = /* @__PURE__ */ ((CompletionSource2) => {
CompletionSource2["ThisProperty"] = "ThisProperty/";
CompletionSource2["ClassMemberSnippet"] = "ClassMemberSnippet/";
CompletionSource2["TypeOnlyAlias"] = "TypeOnlyAlias/";
CompletionSource2["ObjectLiteralMethodSnippet"] = "ObjectLiteralMethodSnippet/";
CompletionSource2["SwitchCases"] = "SwitchCases/";
return CompletionSource2;
})(CompletionSource || {});
var SymbolOriginInfoKind = /* @__PURE__ */ ((SymbolOriginInfoKind2) => {
SymbolOriginInfoKind2[SymbolOriginInfoKind2["ThisType"] = 1] = "ThisType";
SymbolOriginInfoKind2[SymbolOriginInfoKind2["SymbolMember"] = 2] = "SymbolMember";
SymbolOriginInfoKind2[SymbolOriginInfoKind2["Export"] = 4] = "Export";
SymbolOriginInfoKind2[SymbolOriginInfoKind2["Promise"] = 8] = "Promise";
SymbolOriginInfoKind2[SymbolOriginInfoKind2["Nullable"] = 16] = "Nullable";
SymbolOriginInfoKind2[SymbolOriginInfoKind2["ResolvedExport"] = 32] = "ResolvedExport";
SymbolOriginInfoKind2[SymbolOriginInfoKind2["TypeOnlyAlias"] = 64] = "TypeOnlyAlias";
SymbolOriginInfoKind2[SymbolOriginInfoKind2["ObjectLiteralMethod"] = 128] = "ObjectLiteralMethod";
SymbolOriginInfoKind2[SymbolOriginInfoKind2["Ignore"] = 256] = "Ignore";
SymbolOriginInfoKind2[SymbolOriginInfoKind2["ComputedPropertyName"] = 512] = "ComputedPropertyName";
SymbolOriginInfoKind2[SymbolOriginInfoKind2["SymbolMemberNoExport"] = 2 /* SymbolMember */] = "SymbolMemberNoExport";
SymbolOriginInfoKind2[SymbolOriginInfoKind2["SymbolMemberExport"] = 6] = "SymbolMemberExport";
return SymbolOriginInfoKind2;
})(SymbolOriginInfoKind || {});
function originIsThisType(origin) {
return !!(origin.kind & 1 /* ThisType */);
}
function originIsSymbolMember(origin) {
return !!(origin.kind & 2 /* SymbolMember */);
}
function originIsExport(origin) {
return !!(origin && origin.kind & 4 /* Export */);
}
function originIsResolvedExport(origin) {
return !!(origin && origin.kind === 32 /* ResolvedExport */);
}
function originIncludesSymbolName(origin) {
return originIsExport(origin) || originIsResolvedExport(origin) || originIsComputedPropertyName(origin);
}
function originIsPackageJsonImport(origin) {
return (originIsExport(origin) || originIsResolvedExport(origin)) && !!origin.isFromPackageJson;
}
function originIsPromise(origin) {
return !!(origin.kind & 8 /* Promise */);
}
function originIsNullableMember(origin) {
return !!(origin.kind & 16 /* Nullable */);
}
function originIsTypeOnlyAlias(origin) {
return !!(origin && origin.kind & 64 /* TypeOnlyAlias */);
}
function originIsObjectLiteralMethod(origin) {
return !!(origin && origin.kind & 128 /* ObjectLiteralMethod */);
}
function originIsIgnore(origin) {
return !!(origin && origin.kind & 256 /* Ignore */);
}
function originIsComputedPropertyName(origin) {
return !!(origin && origin.kind & 512 /* ComputedPropertyName */);
}
function resolvingModuleSpecifiers(logPrefix, host, resolver, program, position, preferences, isForImportStatementCompletion, isValidTypeOnlyUseSite, cb) {
var _a, _b, _c;
const start2 = timestamp();
const needsFullResolution = isForImportStatementCompletion || moduleResolutionSupportsPackageJsonExportsAndImports(getEmitModuleResolutionKind(program.getCompilerOptions()));
let skippedAny = false;
let ambientCount = 0;
let resolvedCount = 0;
let resolvedFromCacheCount = 0;
let cacheAttemptCount = 0;
const result = cb({
tryResolve,
skippedAny: () => skippedAny,
resolvedAny: () => resolvedCount > 0,
resolvedBeyondLimit: () => resolvedCount > moduleSpecifierResolutionLimit
});
const hitRateMessage = cacheAttemptCount ? ` (${(resolvedFromCacheCount / cacheAttemptCount * 100).toFixed(1)}% hit rate)` : "";
(_a = host.log) == null ? void 0 : _a.call(host, `${logPrefix}: resolved ${resolvedCount} module specifiers, plus ${ambientCount} ambient and ${resolvedFromCacheCount} from cache${hitRateMessage}`);
(_b = host.log) == null ? void 0 : _b.call(host, `${logPrefix}: response is ${skippedAny ? "incomplete" : "complete"}`);
(_c = host.log) == null ? void 0 : _c.call(host, `${logPrefix}: ${timestamp() - start2}`);
return result;
function tryResolve(exportInfo, isFromAmbientModule) {
if (isFromAmbientModule) {
const result3 = resolver.getModuleSpecifierForBestExportInfo(exportInfo, position, isValidTypeOnlyUseSite);
if (result3) {
ambientCount++;
}
return result3 || "failed";
}
const shouldResolveModuleSpecifier = needsFullResolution || preferences.allowIncompleteCompletions && resolvedCount < moduleSpecifierResolutionLimit;
const shouldGetModuleSpecifierFromCache = !shouldResolveModuleSpecifier && preferences.allowIncompleteCompletions && cacheAttemptCount < moduleSpecifierResolutionCacheAttemptLimit;
const result2 = shouldResolveModuleSpecifier || shouldGetModuleSpecifierFromCache ? resolver.getModuleSpecifierForBestExportInfo(exportInfo, position, isValidTypeOnlyUseSite, shouldGetModuleSpecifierFromCache) : void 0;
if (!shouldResolveModuleSpecifier && !shouldGetModuleSpecifierFromCache || shouldGetModuleSpecifierFromCache && !result2) {
skippedAny = true;
}
resolvedCount += (result2 == null ? void 0 : result2.computedWithoutCacheCount) || 0;
resolvedFromCacheCount += exportInfo.length - ((result2 == null ? void 0 : result2.computedWithoutCacheCount) || 0);
if (shouldGetModuleSpecifierFromCache) {
cacheAttemptCount++;
}
return result2 || (needsFullResolution ? "failed" : "skipped");
}
}
function getCompletionsAtPosition(host, program, log, sourceFile, position, preferences, triggerCharacter, completionKind, cancellationToken, formatContext, includeSymbol = false) {
var _a;
const { previousToken } = getRelevantTokens(position, sourceFile);
if (triggerCharacter && !isInString(sourceFile, position, previousToken) && !isValidTrigger(sourceFile, triggerCharacter, previousToken, position)) {
return void 0;
}
if (triggerCharacter === " ") {
if (preferences.includeCompletionsForImportStatements && preferences.includeCompletionsWithInsertText) {
return { isGlobalCompletion: true, isMemberCompletion: false, isNewIdentifierLocation: true, isIncomplete: true, entries: [] };
}
return void 0;
}
const compilerOptions = program.getCompilerOptions();
const checker = program.getTypeChecker();
const incompleteCompletionsCache = preferences.allowIncompleteCompletions ? (_a = host.getIncompleteCompletionsCache) == null ? void 0 : _a.call(host) : void 0;
if (incompleteCompletionsCache && completionKind === 3 /* TriggerForIncompleteCompletions */ && previousToken && isIdentifier(previousToken)) {
const incompleteContinuation = continuePreviousIncompleteResponse(incompleteCompletionsCache, sourceFile, previousToken, program, host, preferences, cancellationToken, position);
if (incompleteContinuation) {
return incompleteContinuation;
}
} else {
incompleteCompletionsCache == null ? void 0 : incompleteCompletionsCache.clear();
}
const stringCompletions = ts_Completions_StringCompletions_exports.getStringLiteralCompletions(sourceFile, position, previousToken, compilerOptions, host, program, log, preferences, includeSymbol);
if (stringCompletions) {
return stringCompletions;
}
if (previousToken && isBreakOrContinueStatement(previousToken.parent) && (previousToken.kind === 83 /* BreakKeyword */ || previousToken.kind === 88 /* ContinueKeyword */ || previousToken.kind === 80 /* Identifier */)) {
return getLabelCompletionAtPosition(previousToken.parent);
}
const completionData = getCompletionData(
program,
log,
sourceFile,
compilerOptions,
position,
preferences,
/*detailsEntryId*/
void 0,
host,
formatContext,
cancellationToken
);
if (!completionData) {
return void 0;
}
switch (completionData.kind) {
case 0 /* Data */:
const response = completionInfoFromData(sourceFile, host, program, compilerOptions, log, completionData, preferences, formatContext, position, includeSymbol);
if (response == null ? void 0 : response.isIncomplete) {
incompleteCompletionsCache == null ? void 0 : incompleteCompletionsCache.set(response);
}
return response;
case 1 /* JsDocTagName */:
return jsdocCompletionInfo([
...ts_JsDoc_exports.getJSDocTagNameCompletions(),
...getJSDocParameterCompletions(
sourceFile,
position,
checker,
compilerOptions,
preferences,
/*tagNameOnly*/
true
)
]);
case 2 /* JsDocTag */:
return jsdocCompletionInfo([
...ts_JsDoc_exports.getJSDocTagCompletions(),
...getJSDocParameterCompletions(
sourceFile,
position,
checker,
compilerOptions,
preferences,
/*tagNameOnly*/
false
)
]);
case 3 /* JsDocParameterName */:
return jsdocCompletionInfo(ts_JsDoc_exports.getJSDocParameterNameCompletions(completionData.tag));
case 4 /* Keywords */:
return specificKeywordCompletionInfo(completionData.keywordCompletions, completionData.isNewIdentifierLocation);
default:
return Debug.assertNever(completionData);
}
}
function compareCompletionEntries(entryInArray, entryToInsert) {
var _a, _b;
let result = compareStringsCaseSensitiveUI(entryInArray.sortText, entryToInsert.sortText);
if (result === 0 /* EqualTo */) {
result = compareStringsCaseSensitiveUI(entryInArray.name, entryToInsert.name);
}
if (result === 0 /* EqualTo */ && ((_a = entryInArray.data) == null ? void 0 : _a.moduleSpecifier) && ((_b = entryToInsert.data) == null ? void 0 : _b.moduleSpecifier)) {
result = compareNumberOfDirectorySeparators(
entryInArray.data.moduleSpecifier,
entryToInsert.data.moduleSpecifier
);
}
if (result === 0 /* EqualTo */) {
return -1 /* LessThan */;
}
return result;
}
function completionEntryDataIsResolved(data) {
return !!(data == null ? void 0 : data.moduleSpecifier);
}
function continuePreviousIncompleteResponse(cache, file, location, program, host, preferences, cancellationToken, position) {
const previousResponse = cache.get();
if (!previousResponse)
return void 0;
const touchNode = getTouchingPropertyName(file, position);
const lowerCaseTokenText = location.text.toLowerCase();
const exportMap = getExportInfoMap(file, host, program, preferences, cancellationToken);
const newEntries = resolvingModuleSpecifiers(
"continuePreviousIncompleteResponse",
host,
ts_codefix_exports.createImportSpecifierResolver(file, program, host, preferences),
program,
location.getStart(),
preferences,
/*isForImportStatementCompletion*/
false,
isValidTypeOnlyAliasUseSite(location),
(context) => {
const entries = mapDefined(previousResponse.entries, (entry) => {
var _a;
if (!entry.hasAction || !entry.source || !entry.data || completionEntryDataIsResolved(entry.data)) {
return entry;
}
if (!charactersFuzzyMatchInString(entry.name, lowerCaseTokenText)) {
return void 0;
}
const { origin } = Debug.checkDefined(getAutoImportSymbolFromCompletionEntryData(entry.name, entry.data, program, host));
const info = exportMap.get(file.path, entry.data.exportMapKey);
const result = info && context.tryResolve(info, !isExternalModuleNameRelative(stripQuotes(origin.moduleSymbol.name)));
if (result === "skipped")
return entry;
if (!result || result === "failed") {
(_a = host.log) == null ? void 0 : _a.call(host, `Unexpected failure resolving auto import for '${entry.name}' from '${entry.source}'`);
return void 0;
}
const newOrigin = {
...origin,
kind: 32 /* ResolvedExport */,
moduleSpecifier: result.moduleSpecifier
};
entry.data = originToCompletionEntryData(newOrigin);
entry.source = getSourceFromOrigin(newOrigin);
entry.sourceDisplay = [textPart(newOrigin.moduleSpecifier)];
return entry;
});
if (!context.skippedAny()) {
previousResponse.isIncomplete = void 0;
}
return entries;
}
);
previousResponse.entries = newEntries;
previousResponse.flags = (previousResponse.flags || 0) | 4 /* IsContinuation */;
previousResponse.optionalReplacementSpan = getOptionalReplacementSpan(touchNode);
return previousResponse;
}
function jsdocCompletionInfo(entries) {
return { isGlobalCompletion: false, isMemberCompletion: false, isNewIdentifierLocation: false, entries };
}
function getJSDocParameterCompletions(sourceFile, position, checker, options, preferences, tagNameOnly) {
const currentToken = getTokenAtPosition(sourceFile, position);
if (!isJSDocTag(currentToken) && !isJSDoc(currentToken)) {
return [];
}
const jsDoc = isJSDoc(currentToken) ? currentToken : currentToken.parent;
if (!isJSDoc(jsDoc)) {
return [];
}
const func = jsDoc.parent;
if (!isFunctionLike(func)) {
return [];
}
const isJs = isSourceFileJS(sourceFile);
const isSnippet = preferences.includeCompletionsWithSnippetText || void 0;
const paramTagCount = countWhere(jsDoc.tags, (tag) => isJSDocParameterTag(tag) && tag.getEnd() <= position);
return mapDefined(func.parameters, (param) => {
if (getJSDocParameterTags(param).length) {
return void 0;
}
if (isIdentifier(param.name)) {
const tabstopCounter = { tabstop: 1 };
const paramName = param.name.text;
let displayText = getJSDocParamAnnotation(
paramName,
param.initializer,
param.dotDotDotToken,
isJs,
/*isObject*/
false,
/*isSnippet*/
false,
checker,
options,
preferences
);
let snippetText = isSnippet ? getJSDocParamAnnotation(
paramName,
param.initializer,
param.dotDotDotToken,
isJs,
/*isObject*/
false,
/*isSnippet*/
true,
checker,
options,
preferences,
tabstopCounter
) : void 0;
if (tagNameOnly) {
displayText = displayText.slice(1);
if (snippetText)
snippetText = snippetText.slice(1);
}
return {
name: displayText,
kind: "parameter" /* parameterElement */,
sortText: SortText.LocationPriority,
insertText: isSnippet ? snippetText : void 0,
isSnippet
};
} else if (param.parent.parameters.indexOf(param) === paramTagCount) {
const paramPath = `param${paramTagCount}`;
const displayTextResult = generateJSDocParamTagsForDestructuring(
paramPath,
param.name,
param.initializer,
param.dotDotDotToken,
isJs,
/*isSnippet*/
false,
checker,
options,
preferences
);
const snippetTextResult = isSnippet ? generateJSDocParamTagsForDestructuring(
paramPath,
param.name,
param.initializer,
param.dotDotDotToken,
isJs,
/*isSnippet*/
true,
checker,
options,
preferences
) : void 0;
let displayText = displayTextResult.join(getNewLineCharacter(options) + "* ");
let snippetText = snippetTextResult == null ? void 0 : snippetTextResult.join(getNewLineCharacter(options) + "* ");
if (tagNameOnly) {
displayText = displayText.slice(1);
if (snippetText)
snippetText = snippetText.slice(1);
}
return {
name: displayText,
kind: "parameter" /* parameterElement */,
sortText: SortText.LocationPriority,
insertText: isSnippet ? snippetText : void 0,
isSnippet
};
}
});
}
function generateJSDocParamTagsForDestructuring(path, pattern, initializer, dotDotDotToken, isJs, isSnippet, checker, options, preferences) {
if (!isJs) {
return [
getJSDocParamAnnotation(
path,
initializer,
dotDotDotToken,
isJs,
/*isObject*/
false,
isSnippet,
checker,
options,
preferences,
{ tabstop: 1 }
)
];
}
return patternWorker(path, pattern, initializer, dotDotDotToken, { tabstop: 1 });
function patternWorker(path2, pattern2, initializer2, dotDotDotToken2, counter) {
if (isObjectBindingPattern(pattern2) && !dotDotDotToken2) {
const oldTabstop = counter.tabstop;
const childCounter = { tabstop: oldTabstop };
const rootParam = getJSDocParamAnnotation(
path2,
initializer2,
dotDotDotToken2,
isJs,
/*isObject*/
true,
isSnippet,
checker,
options,
preferences,
childCounter
);
let childTags = [];
for (const element of pattern2.elements) {
const elementTags = elementWorker(path2, element, childCounter);
if (!elementTags) {
childTags = void 0;
break;
} else {
childTags.push(...elementTags);
}
}
if (childTags) {
counter.tabstop = childCounter.tabstop;
return [rootParam, ...childTags];
}
}
return [
getJSDocParamAnnotation(
path2,
initializer2,
dotDotDotToken2,
isJs,
/*isObject*/
false,
isSnippet,
checker,
options,
preferences,
counter
)
];
}
function elementWorker(path2, element, counter) {
if (!element.propertyName && isIdentifier(element.name) || isIdentifier(element.name)) {
const propertyName = element.propertyName ? tryGetTextOfPropertyName(element.propertyName) : element.name.text;
if (!propertyName) {
return void 0;
}
const paramName = `${path2}.${propertyName}`;
return [
getJSDocParamAnnotation(
paramName,
element.initializer,
element.dotDotDotToken,
isJs,
/*isObject*/
false,
isSnippet,
checker,
options,
preferences,
counter
)
];
} else if (element.propertyName) {
const propertyName = tryGetTextOfPropertyName(element.propertyName);
return propertyName && patternWorker(`${path2}.${propertyName}`, element.name, element.initializer, element.dotDotDotToken, counter);
}
return void 0;
}
}
function getJSDocParamAnnotation(paramName, initializer, dotDotDotToken, isJs, isObject, isSnippet, checker, options, preferences, tabstopCounter) {
if (isSnippet) {
Debug.assertIsDefined(tabstopCounter);
}
if (initializer) {
paramName = getJSDocParamNameWithInitializer(paramName, initializer);
}
if (isSnippet) {
paramName = escapeSnippetText(paramName);
}
if (isJs) {
let type = "*";
if (isObject) {
Debug.assert(!dotDotDotToken, `Cannot annotate a rest parameter with type 'Object'.`);
type = "Object";
} else {
if (initializer) {
const inferredType = checker.getTypeAtLocation(initializer.parent);
if (!(inferredType.flags & (1 /* Any */ | 16384 /* Void */))) {
const sourceFile = initializer.getSourceFile();
const quotePreference = getQuotePreference(sourceFile, preferences);
const builderFlags = quotePreference === 0 /* Single */ ? 268435456 /* UseSingleQuotesForStringLiteralType */ : 0 /* None */;
const typeNode = checker.typeToTypeNode(inferredType, findAncestor(initializer, isFunctionLike), builderFlags);
if (typeNode) {
const printer = isSnippet ? createSnippetPrinter({
removeComments: true,
module: options.module,
target: options.target
}) : createPrinter({
removeComments: true,
module: options.module,
target: options.target
});
setEmitFlags(typeNode, 1 /* SingleLine */);
type = printer.printNode(4 /* Unspecified */, typeNode, sourceFile);
}
}
}
if (isSnippet && type === "*") {
type = `\${${tabstopCounter.tabstop++}:${type}}`;
}
}
const dotDotDot = !isObject && dotDotDotToken ? "..." : "";
const description3 = isSnippet ? `\${${tabstopCounter.tabstop++}}` : "";
return `@param {${dotDotDot}${type}} ${paramName} ${description3}`;
} else {
const description3 = isSnippet ? `\${${tabstopCounter.tabstop++}}` : "";
return `@param ${paramName} ${description3}`;
}
}
function getJSDocParamNameWithInitializer(paramName, initializer) {
const initializerText = initializer.getText().trim();
if (initializerText.includes("\n") || initializerText.length > 80) {
return `[${paramName}]`;
}
return `[${paramName}=${initializerText}]`;
}
function keywordToCompletionEntry(keyword) {
return {
name: tokenToString(keyword),
kind: "keyword" /* keyword */,
kindModifiers: "" /* none */,
sortText: SortText.GlobalsOrKeywords
};
}
function specificKeywordCompletionInfo(entries, isNewIdentifierLocation) {
return {
isGlobalCompletion: false,
isMemberCompletion: false,
isNewIdentifierLocation,
entries: entries.slice()
};
}
function keywordCompletionData(keywordFilters, filterOutTsOnlyKeywords, isNewIdentifierLocation) {
return {
kind: 4 /* Keywords */,
keywordCompletions: getKeywordCompletions(keywordFilters, filterOutTsOnlyKeywords),
isNewIdentifierLocation
};
}
function keywordFiltersFromSyntaxKind(keywordCompletion) {
switch (keywordCompletion) {
case 156 /* TypeKeyword */:
return 8 /* TypeKeyword */;
default:
Debug.fail("Unknown mapping from SyntaxKind to KeywordCompletionFilters");
}
}
function getOptionalReplacementSpan(location) {
return (location == null ? void 0 : location.kind) === 80 /* Identifier */ ? createTextSpanFromNode(location) : void 0;
}
function completionInfoFromData(sourceFile, host, program, compilerOptions, log, completionData, preferences, formatContext, position, includeSymbol) {
const {
symbols,
contextToken,
completionKind,
isInSnippetScope,
isNewIdentifierLocation,
location,
propertyAccessToConvert,
keywordFilters,
symbolToOriginInfoMap,
recommendedCompletion,
isJsxInitializer,
isTypeOnlyLocation,
isJsxIdentifierExpected,
isRightOfOpenTag,
isRightOfDotOrQuestionDot,
importStatementCompletion,
insideJsDocTagTypeExpression,
symbolToSortTextMap,
hasUnresolvedAutoImports
} = completionData;
let literals = completionData.literals;
const checker = program.getTypeChecker();
if (getLanguageVariant(sourceFile.scriptKind) === 1 /* JSX */) {
const completionInfo = getJsxClosingTagCompletion(location, sourceFile);
if (completionInfo) {
return completionInfo;
}
}
const caseClause = findAncestor(contextToken, isCaseClause);
if (caseClause && (isCaseKeyword(contextToken) || isNodeDescendantOf(contextToken, caseClause.expression))) {
const tracker = newCaseClauseTracker(checker, caseClause.parent.clauses);
literals = literals.filter((literal) => !tracker.hasValue(literal));
symbols.forEach((symbol, i) => {
if (symbol.valueDeclaration && isEnumMember(symbol.valueDeclaration)) {
const value = checker.getConstantValue(symbol.valueDeclaration);
if (value !== void 0 && tracker.hasValue(value)) {
symbolToOriginInfoMap[i] = { kind: 256 /* Ignore */ };
}
}
});
}
const entries = createSortedArray();
const isChecked = isCheckedFile(sourceFile, compilerOptions);
if (isChecked && !isNewIdentifierLocation && (!symbols || symbols.length === 0) && keywordFilters === 0 /* None */) {
return void 0;
}
const uniqueNames = getCompletionEntriesFromSymbols(
symbols,
entries,
/*replacementToken*/
void 0,
contextToken,
location,
position,
sourceFile,
host,
program,
getEmitScriptTarget(compilerOptions),
log,
completionKind,
preferences,
compilerOptions,
formatContext,
isTypeOnlyLocation,
propertyAccessToConvert,
isJsxIdentifierExpected,
isJsxInitializer,
importStatementCompletion,
recommendedCompletion,
symbolToOriginInfoMap,
symbolToSortTextMap,
isJsxIdentifierExpected,
isRightOfOpenTag,
includeSymbol
);
if (keywordFilters !== 0 /* None */) {
for (const keywordEntry of getKeywordCompletions(keywordFilters, !insideJsDocTagTypeExpression && isSourceFileJS(sourceFile))) {
if (isTypeOnlyLocation && isTypeKeyword(stringToToken(keywordEntry.name)) || !uniqueNames.has(keywordEntry.name)) {
uniqueNames.add(keywordEntry.name);
insertSorted(
entries,
keywordEntry,
compareCompletionEntries,
/*allowDuplicates*/
true
);
}
}
}
for (const keywordEntry of getContextualKeywords(contextToken, position)) {
if (!uniqueNames.has(keywordEntry.name)) {
uniqueNames.add(keywordEntry.name);
insertSorted(
entries,
keywordEntry,
compareCompletionEntries,
/*allowDuplicates*/
true
);
}
}
for (const literal of literals) {
const literalEntry = createCompletionEntryForLiteral(sourceFile, preferences, literal);
uniqueNames.add(literalEntry.name);
insertSorted(
entries,
literalEntry,
compareCompletionEntries,
/*allowDuplicates*/
true
);
}
if (!isChecked) {
getJSCompletionEntries(sourceFile, location.pos, uniqueNames, getEmitScriptTarget(compilerOptions), entries);
}
let caseBlock;
if (preferences.includeCompletionsWithInsertText && contextToken && !isRightOfOpenTag && !isRightOfDotOrQuestionDot && (caseBlock = findAncestor(contextToken, isCaseBlock))) {
const cases = getExhaustiveCaseSnippets(caseBlock, sourceFile, preferences, compilerOptions, host, program, formatContext);
if (cases) {
entries.push(cases.entry);
}
}
return {
flags: completionData.flags,
isGlobalCompletion: isInSnippetScope,
isIncomplete: preferences.allowIncompleteCompletions && hasUnresolvedAutoImports ? true : void 0,
isMemberCompletion: isMemberCompletionKind(completionKind),
isNewIdentifierLocation,
optionalReplacementSpan: getOptionalReplacementSpan(location),
entries
};
}
function isCheckedFile(sourceFile, compilerOptions) {
return !isSourceFileJS(sourceFile) || !!isCheckJsEnabledForFile(sourceFile, compilerOptions);
}
function getExhaustiveCaseSnippets(caseBlock, sourceFile, preferences, options, host, program, formatContext) {
const clauses = caseBlock.clauses;
const checker = program.getTypeChecker();
const switchType = checker.getTypeAtLocation(caseBlock.parent.expression);
if (switchType && switchType.isUnion() && every(switchType.types, (type) => type.isLiteral())) {
const tracker = newCaseClauseTracker(checker, clauses);
const target = getEmitScriptTarget(options);
const quotePreference = getQuotePreference(sourceFile, preferences);
const importAdder = ts_codefix_exports.createImportAdder(sourceFile, program, preferences, host);
const elements = [];
for (const type of switchType.types) {
if (type.flags & 1024 /* EnumLiteral */) {
Debug.assert(type.symbol, "An enum member type should have a symbol");
Debug.assert(type.symbol.parent, "An enum member type should have a parent symbol (the enum symbol)");
const enumValue = type.symbol.valueDeclaration && checker.getConstantValue(type.symbol.valueDeclaration);
if (enumValue !== void 0) {
if (tracker.hasValue(enumValue)) {
continue;
}
tracker.addValue(enumValue);
}
const typeNode = ts_codefix_exports.typeToAutoImportableTypeNode(checker, importAdder, type, caseBlock, target);
if (!typeNode) {
return void 0;
}
const expr = typeNodeToExpression(typeNode, target, quotePreference);
if (!expr) {
return void 0;
}
elements.push(expr);
} else if (!tracker.hasValue(type.value)) {
switch (typeof type.value) {
case "object":
elements.push(type.value.negative ? factory.createPrefixUnaryExpression(41 /* MinusToken */, factory.createBigIntLiteral({ negative: false, base10Value: type.value.base10Value })) : factory.createBigIntLiteral(type.value));
break;
case "number":
elements.push(type.value < 0 ? factory.createPrefixUnaryExpression(41 /* MinusToken */, factory.createNumericLiteral(-type.value)) : factory.createNumericLiteral(type.value));
break;
case "string":
elements.push(factory.createStringLiteral(type.value, quotePreference === 0 /* Single */));
break;
}
}
}
if (elements.length === 0) {
return void 0;
}
const newClauses = map(elements, (element) => factory.createCaseClause(element, []));
const newLineChar = getNewLineOrDefaultFromHost(host, formatContext == null ? void 0 : formatContext.options);
const printer = createSnippetPrinter({
removeComments: true,
module: options.module,
target: options.target,
newLine: getNewLineKind(newLineChar)
});
const printNode = formatContext ? (node) => printer.printAndFormatNode(4 /* Unspecified */, node, sourceFile, formatContext) : (node) => printer.printNode(4 /* Unspecified */, node, sourceFile);
const insertText = map(newClauses, (clause, i) => {
if (preferences.includeCompletionsWithSnippetText) {
return `${printNode(clause)}$${i + 1}`;
}
return `${printNode(clause)}`;
}).join(newLineChar);
const firstClause = printer.printNode(4 /* Unspecified */, newClauses[0], sourceFile);
return {
entry: {
name: `${firstClause} ...`,
kind: "" /* unknown */,
sortText: SortText.GlobalsOrKeywords,
insertText,
hasAction: importAdder.hasFixes() || void 0,
source: "SwitchCases/" /* SwitchCases */,
isSnippet: preferences.includeCompletionsWithSnippetText ? true : void 0
},
importAdder
};
}
return void 0;
}
function typeNodeToExpression(typeNode, languageVersion, quotePreference) {
switch (typeNode.kind) {
case 182 /* TypeReference */:
const typeName = typeNode.typeName;
return entityNameToExpression(typeName, languageVersion, quotePreference);
case 198 /* IndexedAccessType */:
const objectExpression = typeNodeToExpression(typeNode.objectType, languageVersion, quotePreference);
const indexExpression = typeNodeToExpression(typeNode.indexType, languageVersion, quotePreference);
return objectExpression && indexExpression && factory.createElementAccessExpression(objectExpression, indexExpression);
case 200 /* LiteralType */:
const literal = typeNode.literal;
switch (literal.kind) {
case 11 /* StringLiteral */:
return factory.createStringLiteral(literal.text, quotePreference === 0 /* Single */);
case 9 /* NumericLiteral */:
return factory.createNumericLiteral(literal.text, literal.numericLiteralFlags);
}
return void 0;
case 195 /* ParenthesizedType */:
const exp = typeNodeToExpression(typeNode.type, languageVersion, quotePreference);
return exp && (isIdentifier(exp) ? exp : factory.createParenthesizedExpression(exp));
case 185 /* TypeQuery */:
return entityNameToExpression(typeNode.exprName, languageVersion, quotePreference);
case 204 /* ImportType */:
Debug.fail(`We should not get an import type after calling 'codefix.typeToAutoImportableTypeNode'.`);
}
return void 0;
}
function entityNameToExpression(entityName, languageVersion, quotePreference) {
if (isIdentifier(entityName)) {
return entityName;
}
const unescapedName = unescapeLeadingUnderscores(entityName.right.escapedText);
if (canUsePropertyAccess(unescapedName, languageVersion)) {
return factory.createPropertyAccessExpression(
entityNameToExpression(entityName.left, languageVersion, quotePreference),
unescapedName
);
} else {
return factory.createElementAccessExpression(
entityNameToExpression(entityName.left, languageVersion, quotePreference),
factory.createStringLiteral(unescapedName, quotePreference === 0 /* Single */)
);
}
}
function isMemberCompletionKind(kind) {
switch (kind) {
case 0 /* ObjectPropertyDeclaration */:
case 3 /* MemberLike */:
case 2 /* PropertyAccess */:
return true;
default:
return false;
}
}
function getJsxClosingTagCompletion(location, sourceFile) {
const jsxClosingElement = findAncestor(location, (node) => {
switch (node.kind) {
case 286 /* JsxClosingElement */:
return true;
case 44 /* SlashToken */:
case 32 /* GreaterThanToken */:
case 80 /* Identifier */:
case 210 /* PropertyAccessExpression */:
return false;
default:
return "quit";
}
});
if (jsxClosingElement) {
const hasClosingAngleBracket = !!findChildOfKind(jsxClosingElement, 32 /* GreaterThanToken */, sourceFile);
const tagName = jsxClosingElement.parent.openingElement.tagName;
const closingTag = tagName.getText(sourceFile);
const fullClosingTag = closingTag + (hasClosingAngleBracket ? "" : ">");
const replacementSpan = createTextSpanFromNode(jsxClosingElement.tagName);
const entry = {
name: fullClosingTag,
kind: "class" /* classElement */,
kindModifiers: void 0,
sortText: SortText.LocationPriority
};
return { isGlobalCompletion: false, isMemberCompletion: true, isNewIdentifierLocation: false, optionalReplacementSpan: replacementSpan, entries: [entry] };
}
return;
}
function getJSCompletionEntries(sourceFile, position, uniqueNames, target, entries) {
getNameTable(sourceFile).forEach((pos, name) => {
if (pos === position) {
return;
}
const realName = unescapeLeadingUnderscores(name);
if (!uniqueNames.has(realName) && isIdentifierText(realName, target)) {
uniqueNames.add(realName);
insertSorted(entries, {
name: realName,
kind: "warning" /* warning */,
kindModifiers: "",
sortText: SortText.JavascriptIdentifiers,
isFromUncheckedFile: true
}, compareCompletionEntries);
}
});
}
function completionNameForLiteral(sourceFile, preferences, literal) {
return typeof literal === "object" ? pseudoBigIntToString(literal) + "n" : isString(literal) ? quote(sourceFile, preferences, literal) : JSON.stringify(literal);
}
function createCompletionEntryForLiteral(sourceFile, preferences, literal) {
return { name: completionNameForLiteral(sourceFile, preferences, literal), kind: "string" /* string */, kindModifiers: "" /* none */, sortText: SortText.LocationPriority };
}
function createCompletionEntry(symbol, sortText, replacementToken, contextToken, location, position, sourceFile, host, program, name, needsConvertPropertyAccess, origin, recommendedCompletion, propertyAccessToConvert, isJsxInitializer, importStatementCompletion, useSemicolons, options, preferences, completionKind, formatContext, isJsxIdentifierExpected, isRightOfOpenTag, includeSymbol) {
let insertText;
let replacementSpan = getReplacementSpanForContextToken(replacementToken);
let data;
let isSnippet;
let source = getSourceFromOrigin(origin);
let sourceDisplay;
let hasAction;
let labelDetails;
const typeChecker = program.getTypeChecker();
const insertQuestionDot = origin && originIsNullableMember(origin);
const useBraces = origin && originIsSymbolMember(origin) || needsConvertPropertyAccess;
if (origin && originIsThisType(origin)) {
insertText = needsConvertPropertyAccess ? `this${insertQuestionDot ? "?." : ""}[${quotePropertyName(sourceFile, preferences, name)}]` : `this${insertQuestionDot ? "?." : "."}${name}`;
} else if ((useBraces || insertQuestionDot) && propertyAccessToConvert) {
insertText = useBraces ? needsConvertPropertyAccess ? `[${quotePropertyName(sourceFile, preferences, name)}]` : `[${name}]` : name;
if (insertQuestionDot || propertyAccessToConvert.questionDotToken) {
insertText = `?.${insertText}`;
}
const dot = findChildOfKind(propertyAccessToConvert, 25 /* DotToken */, sourceFile) || findChildOfKind(propertyAccessToConvert, 29 /* QuestionDotToken */, sourceFile);
if (!dot) {
return void 0;
}
const end = startsWith(name, propertyAccessToConvert.name.text) ? propertyAccessToConvert.name.end : dot.end;
replacementSpan = createTextSpanFromBounds(dot.getStart(sourceFile), end);
}
if (isJsxInitializer) {
if (insertText === void 0)
insertText = name;
insertText = `{${insertText}}`;
if (typeof isJsxInitializer !== "boolean") {
replacementSpan = createTextSpanFromNode(isJsxInitializer, sourceFile);
}
}
if (origin && originIsPromise(origin) && propertyAccessToConvert) {
if (insertText === void 0)
insertText = name;
const precedingToken = findPrecedingToken(propertyAccessToConvert.pos, sourceFile);
let awaitText = "";
if (precedingToken && positionIsASICandidate(precedingToken.end, precedingToken.parent, sourceFile)) {
awaitText = ";";
}
awaitText += `(await ${propertyAccessToConvert.expression.getText()})`;
insertText = needsConvertPropertyAccess ? `${awaitText}${insertText}` : `${awaitText}${insertQuestionDot ? "?." : "."}${insertText}`;
const isInAwaitExpression = tryCast(propertyAccessToConvert.parent, isAwaitExpression);
const wrapNode = isInAwaitExpression ? propertyAccessToConvert.parent : propertyAccessToConvert.expression;
replacementSpan = createTextSpanFromBounds(wrapNode.getStart(sourceFile), propertyAccessToConvert.end);
}
if (originIsResolvedExport(origin)) {
sourceDisplay = [textPart(origin.moduleSpecifier)];
if (importStatementCompletion) {
({ insertText, replacementSpan } = getInsertTextAndReplacementSpanForImportCompletion(name, importStatementCompletion, origin, useSemicolons, sourceFile, options, preferences));
isSnippet = preferences.includeCompletionsWithSnippetText ? true : void 0;
}
}
if ((origin == null ? void 0 : origin.kind) === 64 /* TypeOnlyAlias */) {
hasAction = true;
}
if (preferences.includeCompletionsWithClassMemberSnippets && preferences.includeCompletionsWithInsertText && completionKind === 3 /* MemberLike */ && isClassLikeMemberCompletion(symbol, location, sourceFile)) {
let importAdder;
({ insertText, isSnippet, importAdder, replacementSpan } = getEntryForMemberCompletion(host, program, options, preferences, name, symbol, location, position, contextToken, formatContext));
sortText = SortText.ClassMemberSnippets;
if (importAdder == null ? void 0 : importAdder.hasFixes()) {
hasAction = true;
source = "ClassMemberSnippet/" /* ClassMemberSnippet */;
}
}
if (origin && originIsObjectLiteralMethod(origin)) {
({ insertText, isSnippet, labelDetails } = origin);
if (!preferences.useLabelDetailsInCompletionEntries) {
name = name + labelDetails.detail;
labelDetails = void 0;
}
source = "ObjectLiteralMethodSnippet/" /* ObjectLiteralMethodSnippet */;
sortText = SortText.SortBelow(sortText);
}
if (isJsxIdentifierExpected && !isRightOfOpenTag && preferences.includeCompletionsWithSnippetText && preferences.jsxAttributeCompletionStyle && preferences.jsxAttributeCompletionStyle !== "none" && !(isJsxAttribute(location.parent) && location.parent.initializer)) {
let useBraces2 = preferences.jsxAttributeCompletionStyle === "braces";
const type = typeChecker.getTypeOfSymbolAtLocation(symbol, location);
if (preferences.jsxAttributeCompletionStyle === "auto" && !(type.flags & 528 /* BooleanLike */) && !(type.flags & 1048576 /* Union */ && find(type.types, (type2) => !!(type2.flags & 528 /* BooleanLike */)))) {
if (type.flags & 402653316 /* StringLike */ || type.flags & 1048576 /* Union */ && every(type.types, (type2) => !!(type2.flags & (402653316 /* StringLike */ | 32768 /* Undefined */) || isStringAndEmptyAnonymousObjectIntersection(type2)))) {
insertText = `${escapeSnippetText(name)}=${quote(sourceFile, preferences, "$1")}`;
isSnippet = true;
} else {
useBraces2 = true;
}
}
if (useBraces2) {
insertText = `${escapeSnippetText(name)}={$1}`;
isSnippet = true;
}
}
if (insertText !== void 0 && !preferences.includeCompletionsWithInsertText) {
return void 0;
}
if (originIsExport(origin) || originIsResolvedExport(origin)) {
data = originToCompletionEntryData(origin);
hasAction = !importStatementCompletion;
}
return {
name,
kind: ts_SymbolDisplay_exports.getSymbolKind(typeChecker, symbol, location),
kindModifiers: ts_SymbolDisplay_exports.getSymbolModifiers(typeChecker, symbol),
sortText,
source,
hasAction: hasAction ? true : void 0,
isRecommended: isRecommendedCompletionMatch(symbol, recommendedCompletion, typeChecker) || void 0,
insertText,
replacementSpan,
sourceDisplay,
labelDetails,
isSnippet,
isPackageJsonImport: originIsPackageJsonImport(origin) || void 0,
isImportStatementCompletion: !!importStatementCompletion || void 0,
data,
...includeSymbol ? { symbol } : void 0
};
}
function isClassLikeMemberCompletion(symbol, location, sourceFile) {
if (isInJSFile(location)) {
return false;
}
const memberFlags = 106500 /* ClassMember */ & 900095 /* EnumMemberExcludes */;
return !!(symbol.flags & memberFlags) && (isClassLike(location) || location.parent && location.parent.parent && isClassElement(location.parent) && location === location.parent.name && location.parent.getLastToken(sourceFile) === location.parent.name && isClassLike(location.parent.parent) || location.parent && isSyntaxList(location) && isClassLike(location.parent));
}
function getEntryForMemberCompletion(host, program, options, preferences, name, symbol, location, position, contextToken, formatContext) {
const classLikeDeclaration = findAncestor(location, isClassLike);
if (!classLikeDeclaration) {
return { insertText: name };
}
let isSnippet;
let replacementSpan;
let insertText = name;
const checker = program.getTypeChecker();
const sourceFile = location.getSourceFile();
const printer = createSnippetPrinter({
removeComments: true,
module: options.module,
target: options.target,
omitTrailingSemicolon: false,
newLine: getNewLineKind(getNewLineOrDefaultFromHost(host, formatContext == null ? void 0 : formatContext.options))
});
const importAdder = ts_codefix_exports.createImportAdder(sourceFile, program, preferences, host);
let body;
if (preferences.includeCompletionsWithSnippetText) {
isSnippet = true;
const emptyStmt = factory.createEmptyStatement();
body = factory.createBlock(
[emptyStmt],
/*multiLine*/
true
);
setSnippetElement(emptyStmt, { kind: 0 /* TabStop */, order: 0 });
} else {
body = factory.createBlock(
[],
/*multiLine*/
true
);
}
let modifiers = 0 /* None */;
const { modifiers: presentModifiers, span: modifiersSpan } = getPresentModifiers(contextToken, sourceFile, position);
const isAbstract = !!(presentModifiers & 256 /* Abstract */);
const completionNodes = [];
ts_codefix_exports.addNewNodeForMemberSymbol(
symbol,
classLikeDeclaration,
sourceFile,
{ program, host },
preferences,
importAdder,
// `addNewNodeForMemberSymbol` calls this callback function for each new member node
// it adds for the given member symbol.
// We store these member nodes in the `completionNodes` array.
// Note: there might be:
// - No nodes if `addNewNodeForMemberSymbol` cannot figure out a node for the member;
// - One node;
// - More than one node if the member is overloaded (e.g. a method with overload signatures).
(node) => {
let requiredModifiers = 0 /* None */;
if (isAbstract) {
requiredModifiers |= 256 /* Abstract */;
}
if (isClassElement(node) && checker.getMemberOverrideModifierStatus(classLikeDeclaration, node, symbol) === 1 /* NeedsOverride */) {
requiredModifiers |= 16384 /* Override */;
}
if (!completionNodes.length) {
modifiers = node.modifierFlagsCache | requiredModifiers | presentModifiers;
}
node = factory.updateModifiers(node, modifiers);
completionNodes.push(node);
},
body,
ts_codefix_exports.PreserveOptionalFlags.Property,
isAbstract
);
if (completionNodes.length) {
const format = 1 /* MultiLine */ | 131072 /* NoTrailingNewLine */;
replacementSpan = modifiersSpan;
if (formatContext) {
insertText = printer.printAndFormatSnippetList(
format,
factory.createNodeArray(completionNodes),
sourceFile,
formatContext
);
} else {
insertText = printer.printSnippetList(
format,
factory.createNodeArray(completionNodes),
sourceFile
);
}
}
return { insertText, isSnippet, importAdder, replacementSpan };
}
function getPresentModifiers(contextToken, sourceFile, position) {
if (!contextToken || getLineAndCharacterOfPosition(sourceFile, position).line > getLineAndCharacterOfPosition(sourceFile, contextToken.getEnd()).line) {
return { modifiers: 0 /* None */ };
}
let modifiers = 0 /* None */;
let span;
let contextMod;
if (contextMod = isModifierLike2(contextToken)) {
modifiers |= modifierToFlag(contextMod);
span = createTextSpanFromNode(contextToken);
}
if (isPropertyDeclaration(contextToken.parent)) {
modifiers |= modifiersToFlags(contextToken.parent.modifiers) & 126975 /* Modifier */;
span = createTextSpanFromNode(contextToken.parent);
}
return { modifiers, span };
}
function isModifierLike2(node) {
if (isModifier(node)) {
return node.kind;
}
if (isIdentifier(node)) {
const originalKeywordKind = identifierToKeywordKind(node);
if (originalKeywordKind && isModifierKind(originalKeywordKind)) {
return originalKeywordKind;
}
}
return void 0;
}
function getEntryForObjectLiteralMethodCompletion(symbol, name, enclosingDeclaration, program, host, options, preferences, formatContext) {
const isSnippet = preferences.includeCompletionsWithSnippetText || void 0;
let insertText = name;
const sourceFile = enclosingDeclaration.getSourceFile();
const method = createObjectLiteralMethod(symbol, enclosingDeclaration, sourceFile, program, host, preferences);
if (!method) {
return void 0;
}
const printer = createSnippetPrinter({
removeComments: true,
module: options.module,
target: options.target,
omitTrailingSemicolon: false,
newLine: getNewLineKind(getNewLineOrDefaultFromHost(host, formatContext == null ? void 0 : formatContext.options))
});
if (formatContext) {
insertText = printer.printAndFormatSnippetList(16 /* CommaDelimited */ | 64 /* AllowTrailingComma */, factory.createNodeArray(
[method],
/*hasTrailingComma*/
true
), sourceFile, formatContext);
} else {
insertText = printer.printSnippetList(16 /* CommaDelimited */ | 64 /* AllowTrailingComma */, factory.createNodeArray(
[method],
/*hasTrailingComma*/
true
), sourceFile);
}
const signaturePrinter = createPrinter({
removeComments: true,
module: options.module,
target: options.target,
omitTrailingSemicolon: true
});
const methodSignature = factory.createMethodSignature(
/*modifiers*/
void 0,
/*name*/
"",
method.questionToken,
method.typeParameters,
method.parameters,
method.type
);
const labelDetails = { detail: signaturePrinter.printNode(4 /* Unspecified */, methodSignature, sourceFile) };
return { isSnippet, insertText, labelDetails };
}
function createObjectLiteralMethod(symbol, enclosingDeclaration, sourceFile, program, host, preferences) {
const declarations = symbol.getDeclarations();
if (!(declarations && declarations.length)) {
return void 0;
}
const checker = program.getTypeChecker();
const declaration = declarations[0];
const name = getSynthesizedDeepClone(
getNameOfDeclaration(declaration),
/*includeTrivia*/
false
);
const type = checker.getWidenedType(checker.getTypeOfSymbolAtLocation(symbol, enclosingDeclaration));
const quotePreference = getQuotePreference(sourceFile, preferences);
const builderFlags = 33554432 /* OmitThisParameter */ | (quotePreference === 0 /* Single */ ? 268435456 /* UseSingleQuotesForStringLiteralType */ : 0 /* None */);
switch (declaration.kind) {
case 170 /* PropertySignature */:
case 171 /* PropertyDeclaration */:
case 172 /* MethodSignature */:
case 173 /* MethodDeclaration */: {
let effectiveType = type.flags & 1048576 /* Union */ && type.types.length < 10 ? checker.getUnionType(type.types, 2 /* Subtype */) : type;
if (effectiveType.flags & 1048576 /* Union */) {
const functionTypes = filter(effectiveType.types, (type2) => checker.getSignaturesOfType(type2, 0 /* Call */).length > 0);
if (functionTypes.length === 1) {
effectiveType = functionTypes[0];
} else {
return void 0;
}
}
const signatures = checker.getSignaturesOfType(effectiveType, 0 /* Call */);
if (signatures.length !== 1) {
return void 0;
}
const typeNode = checker.typeToTypeNode(effectiveType, enclosingDeclaration, builderFlags, ts_codefix_exports.getNoopSymbolTrackerWithResolver({ program, host }));
if (!typeNode || !isFunctionTypeNode(typeNode)) {
return void 0;
}
let body;
if (preferences.includeCompletionsWithSnippetText) {
const emptyStmt = factory.createEmptyStatement();
body = factory.createBlock(
[emptyStmt],
/*multiLine*/
true
);
setSnippetElement(emptyStmt, { kind: 0 /* TabStop */, order: 0 });
} else {
body = factory.createBlock(
[],
/*multiLine*/
true
);
}
const parameters = typeNode.parameters.map((typedParam) => factory.createParameterDeclaration(
/*modifiers*/
void 0,
typedParam.dotDotDotToken,
typedParam.name,
/*questionToken*/
void 0,
/*type*/
void 0,
typedParam.initializer
));
return factory.createMethodDeclaration(
/*modifiers*/
void 0,
/*asteriskToken*/
void 0,
name,
/*questionToken*/
void 0,
/*typeParameters*/
void 0,
parameters,
/*type*/
void 0,
body
);
}
default:
return void 0;
}
}
function createSnippetPrinter(printerOptions) {
let escapes;
const baseWriter = ts_textChanges_exports.createWriter(getNewLineCharacter(printerOptions));
const printer = createPrinter(printerOptions, baseWriter);
const writer = {
...baseWriter,
write: (s) => escapingWrite(s, () => baseWriter.write(s)),
nonEscapingWrite: baseWriter.write,
writeLiteral: (s) => escapingWrite(s, () => baseWriter.writeLiteral(s)),
writeStringLiteral: (s) => escapingWrite(s, () => baseWriter.writeStringLiteral(s)),
writeSymbol: (s, symbol) => escapingWrite(s, () => baseWriter.writeSymbol(s, symbol)),
writeParameter: (s) => escapingWrite(s, () => baseWriter.writeParameter(s)),
writeComment: (s) => escapingWrite(s, () => baseWriter.writeComment(s)),
writeProperty: (s) => escapingWrite(s, () => baseWriter.writeProperty(s))
};
return {
printSnippetList,
printAndFormatSnippetList,
printNode,
printAndFormatNode
};
function escapingWrite(s, write) {
const escaped = escapeSnippetText(s);
if (escaped !== s) {
const start2 = baseWriter.getTextPos();
write();
const end = baseWriter.getTextPos();
escapes = append(escapes || (escapes = []), { newText: escaped, span: { start: start2, length: end - start2 } });
} else {
write();
}
}
function printSnippetList(format, list, sourceFile) {
const unescaped = printUnescapedSnippetList(format, list, sourceFile);
return escapes ? ts_textChanges_exports.applyChanges(unescaped, escapes) : unescaped;
}
function printUnescapedSnippetList(format, list, sourceFile) {
escapes = void 0;
writer.clear();
printer.writeList(format, list, sourceFile, writer);
return writer.getText();
}
function printAndFormatSnippetList(format, list, sourceFile, formatContext) {
const syntheticFile = {
text: printUnescapedSnippetList(
format,
list,
sourceFile
),
getLineAndCharacterOfPosition(pos) {
return getLineAndCharacterOfPosition(this, pos);
}
};
const formatOptions = getFormatCodeSettingsForWriting(formatContext, sourceFile);
const changes = flatMap(list, (node) => {
const nodeWithPos = ts_textChanges_exports.assignPositionsToNode(node);
return ts_formatting_exports.formatNodeGivenIndentation(
nodeWithPos,
syntheticFile,
sourceFile.languageVariant,
/* indentation */
0,
/* delta */
0,
{ ...formatContext, options: formatOptions }
);
});
const allChanges = escapes ? stableSort(concatenate(changes, escapes), (a, b) => compareTextSpans(a.span, b.span)) : changes;
return ts_textChanges_exports.applyChanges(syntheticFile.text, allChanges);
}
function printNode(hint, node, sourceFile) {
const unescaped = printUnescapedNode(hint, node, sourceFile);
return escapes ? ts_textChanges_exports.applyChanges(unescaped, escapes) : unescaped;
}
function printUnescapedNode(hint, node, sourceFile) {
escapes = void 0;
writer.clear();
printer.writeNode(hint, node, sourceFile, writer);
return writer.getText();
}
function printAndFormatNode(hint, node, sourceFile, formatContext) {
const syntheticFile = {
text: printUnescapedNode(
hint,
node,
sourceFile
),
getLineAndCharacterOfPosition(pos) {
return getLineAndCharacterOfPosition(this, pos);
}
};
const formatOptions = getFormatCodeSettingsForWriting(formatContext, sourceFile);
const nodeWithPos = ts_textChanges_exports.assignPositionsToNode(node);
const changes = ts_formatting_exports.formatNodeGivenIndentation(
nodeWithPos,
syntheticFile,
sourceFile.languageVariant,
/* indentation */
0,
/* delta */
0,
{ ...formatContext, options: formatOptions }
);
const allChanges = escapes ? stableSort(concatenate(changes, escapes), (a, b) => compareTextSpans(a.span, b.span)) : changes;
return ts_textChanges_exports.applyChanges(syntheticFile.text, allChanges);
}
}
function originToCompletionEntryData(origin) {
const ambientModuleName = origin.fileName ? void 0 : stripQuotes(origin.moduleSymbol.name);
const isPackageJsonImport = origin.isFromPackageJson ? true : void 0;
if (originIsResolvedExport(origin)) {
const resolvedData = {
exportName: origin.exportName,
exportMapKey: origin.exportMapKey,
moduleSpecifier: origin.moduleSpecifier,
ambientModuleName,
fileName: origin.fileName,
isPackageJsonImport
};
return resolvedData;
}
const unresolvedData = {
exportName: origin.exportName,
exportMapKey: origin.exportMapKey,
fileName: origin.fileName,
ambientModuleName: origin.fileName ? void 0 : stripQuotes(origin.moduleSymbol.name),
isPackageJsonImport: origin.isFromPackageJson ? true : void 0
};
return unresolvedData;
}
function completionEntryDataToSymbolOriginInfo(data, completionName, moduleSymbol) {
const isDefaultExport = data.exportName === "default" /* Default */;
const isFromPackageJson = !!data.isPackageJsonImport;
if (completionEntryDataIsResolved(data)) {
const resolvedOrigin = {
kind: 32 /* ResolvedExport */,
exportName: data.exportName,
exportMapKey: data.exportMapKey,
moduleSpecifier: data.moduleSpecifier,
symbolName: completionName,
fileName: data.fileName,
moduleSymbol,
isDefaultExport,
isFromPackageJson
};
return resolvedOrigin;
}
const unresolvedOrigin = {
kind: 4 /* Export */,
exportName: data.exportName,
exportMapKey: data.exportMapKey,
symbolName: completionName,
fileName: data.fileName,
moduleSymbol,
isDefaultExport,
isFromPackageJson
};
return unresolvedOrigin;
}
function getInsertTextAndReplacementSpanForImportCompletion(name, importStatementCompletion, origin, useSemicolons, sourceFile, options, preferences) {
const replacementSpan = importStatementCompletion.replacementSpan;
const quotedModuleSpecifier = escapeSnippetText(quote(sourceFile, preferences, origin.moduleSpecifier));
const exportKind = origin.isDefaultExport ? 1 /* Default */ : origin.exportName === "export=" /* ExportEquals */ ? 2 /* ExportEquals */ : 0 /* Named */;
const tabStop = preferences.includeCompletionsWithSnippetText ? "$1" : "";
const importKind = ts_codefix_exports.getImportKind(
sourceFile,
exportKind,
options,
/*forceImportKeyword*/
true
);
const isImportSpecifierTypeOnly = importStatementCompletion.couldBeTypeOnlyImportSpecifier;
const topLevelTypeOnlyText = importStatementCompletion.isTopLevelTypeOnly ? ` ${tokenToString(156 /* TypeKeyword */)} ` : " ";
const importSpecifierTypeOnlyText = isImportSpecifierTypeOnly ? `${tokenToString(156 /* TypeKeyword */)} ` : "";
const suffix = useSemicolons ? ";" : "";
switch (importKind) {
case 3 /* CommonJS */:
return { replacementSpan, insertText: `import${topLevelTypeOnlyText}${escapeSnippetText(name)}${tabStop} = require(${quotedModuleSpecifier})${suffix}` };
case 1 /* Default */:
return { replacementSpan, insertText: `import${topLevelTypeOnlyText}${escapeSnippetText(name)}${tabStop} from ${quotedModuleSpecifier}${suffix}` };
case 2 /* Namespace */:
return { replacementSpan, insertText: `import${topLevelTypeOnlyText}* as ${escapeSnippetText(name)} from ${quotedModuleSpecifier}${suffix}` };
case 0 /* Named */:
return { replacementSpan, insertText: `import${topLevelTypeOnlyText}{ ${importSpecifierTypeOnlyText}${escapeSnippetText(name)}${tabStop} } from ${quotedModuleSpecifier}${suffix}` };
}
}
function quotePropertyName(sourceFile, preferences, name) {
if (/^\d+$/.test(name)) {
return name;
}
return quote(sourceFile, preferences, name);
}
function isRecommendedCompletionMatch(localSymbol, recommendedCompletion, checker) {
return localSymbol === recommendedCompletion || !!(localSymbol.flags & 1048576 /* ExportValue */) && checker.getExportSymbolOfSymbol(localSymbol) === recommendedCompletion;
}
function getSourceFromOrigin(origin) {
if (originIsExport(origin)) {
return stripQuotes(origin.moduleSymbol.name);
}
if (originIsResolvedExport(origin)) {
return origin.moduleSpecifier;
}
if ((origin == null ? void 0 : origin.kind) === 1 /* ThisType */) {
return "ThisProperty/" /* ThisProperty */;
}
if ((origin == null ? void 0 : origin.kind) === 64 /* TypeOnlyAlias */) {
return "TypeOnlyAlias/" /* TypeOnlyAlias */;
}
}
function getCompletionEntriesFromSymbols(symbols, entries, replacementToken, contextToken, location, position, sourceFile, host, program, target, log, kind, preferences, compilerOptions, formatContext, isTypeOnlyLocation, propertyAccessToConvert, jsxIdentifierExpected, isJsxInitializer, importStatementCompletion, recommendedCompletion, symbolToOriginInfoMap, symbolToSortTextMap, isJsxIdentifierExpected, isRightOfOpenTag, includeSymbol = false) {
const start2 = timestamp();
const variableOrParameterDeclaration = getVariableOrParameterDeclaration(contextToken, location);
const useSemicolons = probablyUsesSemicolons(sourceFile);
const typeChecker = program.getTypeChecker();
const uniques = /* @__PURE__ */ new Map();
for (let i = 0; i < symbols.length; i++) {
const symbol = symbols[i];
const origin = symbolToOriginInfoMap == null ? void 0 : symbolToOriginInfoMap[i];
const info = getCompletionEntryDisplayNameForSymbol(symbol, target, origin, kind, !!jsxIdentifierExpected);
if (!info || uniques.get(info.name) && (!origin || !originIsObjectLiteralMethod(origin)) || kind === 1 /* Global */ && symbolToSortTextMap && !shouldIncludeSymbol(symbol, symbolToSortTextMap)) {
continue;
}
const { name, needsConvertPropertyAccess } = info;
const originalSortText = (symbolToSortTextMap == null ? void 0 : symbolToSortTextMap[getSymbolId(symbol)]) ?? SortText.LocationPriority;
const sortText = isDeprecated(symbol, typeChecker) ? SortText.Deprecated(originalSortText) : originalSortText;
const entry = createCompletionEntry(
symbol,
sortText,
replacementToken,
contextToken,
location,
position,
sourceFile,
host,
program,
name,
needsConvertPropertyAccess,
origin,
recommendedCompletion,
propertyAccessToConvert,
isJsxInitializer,
importStatementCompletion,
useSemicolons,
compilerOptions,
preferences,
kind,
formatContext,
isJsxIdentifierExpected,
isRightOfOpenTag,
includeSymbol
);
if (!entry) {
continue;
}
const shouldShadowLaterSymbols = (!origin || originIsTypeOnlyAlias(origin)) && !(symbol.parent === void 0 && !some(symbol.declarations, (d) => d.getSourceFile() === location.getSourceFile()));
uniques.set(name, shouldShadowLaterSymbols);
insertSorted(
entries,
entry,
compareCompletionEntries,
/*allowDuplicates*/
true
);
}
log("getCompletionsAtPosition: getCompletionEntriesFromSymbols: " + (timestamp() - start2));
return {
has: (name) => uniques.has(name),
add: (name) => uniques.set(name, true)
};
function shouldIncludeSymbol(symbol, symbolToSortTextMap2) {
var _a;
let allFlags = symbol.flags;
if (!isSourceFile(location)) {
if (isExportAssignment(location.parent)) {
return true;
}
if (tryCast(variableOrParameterDeclaration, isVariableDeclaration) && symbol.valueDeclaration === variableOrParameterDeclaration) {
return false;
}
const symbolDeclaration = symbol.valueDeclaration ?? ((_a = symbol.declarations) == null ? void 0 : _a[0]);
if (variableOrParameterDeclaration && symbolDeclaration && (isTypeParameterDeclaration(variableOrParameterDeclaration) && isTypeParameterDeclaration(symbolDeclaration) || isParameter(variableOrParameterDeclaration) && isParameter(symbolDeclaration))) {
const symbolDeclarationPos = symbolDeclaration.pos;
const parameters = isParameter(variableOrParameterDeclaration) ? variableOrParameterDeclaration.parent.parameters : isInferTypeNode(variableOrParameterDeclaration.parent) ? void 0 : variableOrParameterDeclaration.parent.typeParameters;
if (symbolDeclarationPos >= variableOrParameterDeclaration.pos && parameters && symbolDeclarationPos < parameters.end) {
return false;
}
}
const symbolOrigin = skipAlias(symbol, typeChecker);
if (!!sourceFile.externalModuleIndicator && !compilerOptions.allowUmdGlobalAccess && symbolToSortTextMap2[getSymbolId(symbol)] === SortText.GlobalsOrKeywords && (symbolToSortTextMap2[getSymbolId(symbolOrigin)] === SortText.AutoImportSuggestions || symbolToSortTextMap2[getSymbolId(symbolOrigin)] === SortText.LocationPriority)) {
return false;
}
allFlags |= getCombinedLocalAndExportSymbolFlags(symbolOrigin);
if (isInRightSideOfInternalImportEqualsDeclaration(location)) {
return !!(allFlags & 1920 /* Namespace */);
}
if (isTypeOnlyLocation) {
return symbolCanBeReferencedAtTypeLocation(symbol, typeChecker);
}
}
return !!(allFlags & 111551 /* Value */);
}
}
function getLabelCompletionAtPosition(node) {
const entries = getLabelStatementCompletions(node);
if (entries.length) {
return { isGlobalCompletion: false, isMemberCompletion: false, isNewIdentifierLocation: false, entries };
}
}
function getLabelStatementCompletions(node) {
const entries = [];
const uniques = /* @__PURE__ */ new Map();
let current = node;
while (current) {
if (isFunctionLike(current)) {
break;
}
if (isLabeledStatement(current)) {
const name = current.label.text;
if (!uniques.has(name)) {
uniques.set(name, true);
entries.push({
name,
kindModifiers: "" /* none */,
kind: "label" /* label */,
sortText: SortText.LocationPriority
});
}
}
current = current.parent;
}
return entries;
}
function getSymbolCompletionFromEntryId(program, log, sourceFile, position, entryId, host, preferences) {
if (entryId.source === "SwitchCases/" /* SwitchCases */) {
return { type: "cases" };
}
if (entryId.data) {
const autoImport = getAutoImportSymbolFromCompletionEntryData(entryId.name, entryId.data, program, host);
if (autoImport) {
const { contextToken: contextToken2, previousToken: previousToken2 } = getRelevantTokens(position, sourceFile);
return {
type: "symbol",
symbol: autoImport.symbol,
location: getTouchingPropertyName(sourceFile, position),
previousToken: previousToken2,
contextToken: contextToken2,
isJsxInitializer: false,
isTypeOnlyLocation: false,
origin: autoImport.origin
};
}
}
const compilerOptions = program.getCompilerOptions();
const completionData = getCompletionData(
program,
log,
sourceFile,
compilerOptions,
position,
{ includeCompletionsForModuleExports: true, includeCompletionsWithInsertText: true },
entryId,
host,
/*formatContext*/
void 0
);
if (!completionData) {
return { type: "none" };
}
if (completionData.kind !== 0 /* Data */) {
return { type: "request", request: completionData };
}
const { symbols, literals, location, completionKind, symbolToOriginInfoMap, contextToken, previousToken, isJsxInitializer, isTypeOnlyLocation } = completionData;
const literal = find(literals, (l) => completionNameForLiteral(sourceFile, preferences, l) === entryId.name);
if (literal !== void 0)
return { type: "literal", literal };
return firstDefined(symbols, (symbol, index) => {
const origin = symbolToOriginInfoMap[index];
const info = getCompletionEntryDisplayNameForSymbol(symbol, getEmitScriptTarget(compilerOptions), origin, completionKind, completionData.isJsxIdentifierExpected);
return info && info.name === entryId.name && (entryId.source === "ClassMemberSnippet/" /* ClassMemberSnippet */ && symbol.flags & 106500 /* ClassMember */ || entryId.source === "ObjectLiteralMethodSnippet/" /* ObjectLiteralMethodSnippet */ && symbol.flags & (4 /* Property */ | 8192 /* Method */) || getSourceFromOrigin(origin) === entryId.source) ? { type: "symbol", symbol, location, origin, contextToken, previousToken, isJsxInitializer, isTypeOnlyLocation } : void 0;
}) || { type: "none" };
}
function getCompletionEntryDetails(program, log, sourceFile, position, entryId, host, formatContext, preferences, cancellationToken) {
const typeChecker = program.getTypeChecker();
const compilerOptions = program.getCompilerOptions();
const { name, source, data } = entryId;
const { previousToken, contextToken } = getRelevantTokens(position, sourceFile);
if (isInString(sourceFile, position, previousToken)) {
return ts_Completions_StringCompletions_exports.getStringLiteralCompletionDetails(name, sourceFile, position, previousToken, typeChecker, compilerOptions, host, cancellationToken, preferences);
}
const symbolCompletion = getSymbolCompletionFromEntryId(program, log, sourceFile, position, entryId, host, preferences);
switch (symbolCompletion.type) {
case "request": {
const { request } = symbolCompletion;
switch (request.kind) {
case 1 /* JsDocTagName */:
return ts_JsDoc_exports.getJSDocTagNameCompletionDetails(name);
case 2 /* JsDocTag */:
return ts_JsDoc_exports.getJSDocTagCompletionDetails(name);
case 3 /* JsDocParameterName */:
return ts_JsDoc_exports.getJSDocParameterNameCompletionDetails(name);
case 4 /* Keywords */:
return some(request.keywordCompletions, (c) => c.name === name) ? createSimpleDetails(name, "keyword" /* keyword */, 5 /* keyword */) : void 0;
default:
return Debug.assertNever(request);
}
}
case "symbol": {
const { symbol, location, contextToken: contextToken2, origin, previousToken: previousToken2 } = symbolCompletion;
const { codeActions, sourceDisplay } = getCompletionEntryCodeActionsAndSourceDisplay(name, location, contextToken2, origin, symbol, program, host, compilerOptions, sourceFile, position, previousToken2, formatContext, preferences, data, source, cancellationToken);
const symbolName2 = originIsComputedPropertyName(origin) ? origin.symbolName : symbol.name;
return createCompletionDetailsForSymbol(symbol, symbolName2, typeChecker, sourceFile, location, cancellationToken, codeActions, sourceDisplay);
}
case "literal": {
const { literal } = symbolCompletion;
return createSimpleDetails(completionNameForLiteral(sourceFile, preferences, literal), "string" /* string */, typeof literal === "string" ? 8 /* stringLiteral */ : 7 /* numericLiteral */);
}
case "cases": {
const { entry, importAdder } = getExhaustiveCaseSnippets(
contextToken.parent,
sourceFile,
preferences,
program.getCompilerOptions(),
host,
program,
/*formatContext*/
void 0
);
if (importAdder.hasFixes()) {
const changes = ts_textChanges_exports.ChangeTracker.with(
{ host, formatContext, preferences },
importAdder.writeFixes
);
return {
name: entry.name,
kind: "" /* unknown */,
kindModifiers: "",
displayParts: [],
sourceDisplay: void 0,
codeActions: [{
changes,
description: diagnosticToString([Diagnostics.Includes_imports_of_types_referenced_by_0, name])
}]
};
}
return {
name: entry.name,
kind: "" /* unknown */,
kindModifiers: "",
displayParts: [],
sourceDisplay: void 0
};
}
case "none":
return allKeywordsCompletions().some((c) => c.name === name) ? createSimpleDetails(name, "keyword" /* keyword */, 5 /* keyword */) : void 0;
default:
Debug.assertNever(symbolCompletion);
}
}
function createSimpleDetails(name, kind, kind2) {
return createCompletionDetails(name, "" /* none */, kind, [displayPart(name, kind2)]);
}
function createCompletionDetailsForSymbol(symbol, name, checker, sourceFile, location, cancellationToken, codeActions, sourceDisplay) {
const { displayParts, documentation, symbolKind, tags } = checker.runWithCancellationToken(
cancellationToken,
(checker2) => ts_SymbolDisplay_exports.getSymbolDisplayPartsDocumentationAndSymbolKind(checker2, symbol, sourceFile, location, location, 7 /* All */)
);
return createCompletionDetails(name, ts_SymbolDisplay_exports.getSymbolModifiers(checker, symbol), symbolKind, displayParts, documentation, tags, codeActions, sourceDisplay);
}
function createCompletionDetails(name, kindModifiers, kind, displayParts, documentation, tags, codeActions, source) {
return { name, kindModifiers, kind, displayParts, documentation, tags, codeActions, source, sourceDisplay: source };
}
function getCompletionEntryCodeActionsAndSourceDisplay(name, location, contextToken, origin, symbol, program, host, compilerOptions, sourceFile, position, previousToken, formatContext, preferences, data, source, cancellationToken) {
if (data == null ? void 0 : data.moduleSpecifier) {
if (previousToken && getImportStatementCompletionInfo(contextToken || previousToken).replacementSpan) {
return { codeActions: void 0, sourceDisplay: [textPart(data.moduleSpecifier)] };
}
}
if (source === "ClassMemberSnippet/" /* ClassMemberSnippet */) {
const { importAdder } = getEntryForMemberCompletion(
host,
program,
compilerOptions,
preferences,
name,
symbol,
location,
position,
contextToken,
formatContext
);
if (importAdder) {
const changes = ts_textChanges_exports.ChangeTracker.with(
{ host, formatContext, preferences },
importAdder.writeFixes
);
return {
sourceDisplay: void 0,
codeActions: [{
changes,
description: diagnosticToString([Diagnostics.Includes_imports_of_types_referenced_by_0, name])
}]
};
}
}
if (originIsTypeOnlyAlias(origin)) {
const codeAction2 = ts_codefix_exports.getPromoteTypeOnlyCompletionAction(
sourceFile,
origin.declaration.name,
program,
host,
formatContext,
preferences
);
Debug.assertIsDefined(codeAction2, "Expected to have a code action for promoting type-only alias");
return { codeActions: [codeAction2], sourceDisplay: void 0 };
}
if (!origin || !(originIsExport(origin) || originIsResolvedExport(origin))) {
return { codeActions: void 0, sourceDisplay: void 0 };
}
const checker = origin.isFromPackageJson ? host.getPackageJsonAutoImportProvider().getTypeChecker() : program.getTypeChecker();
const { moduleSymbol } = origin;
const targetSymbol = checker.getMergedSymbol(skipAlias(symbol.exportSymbol || symbol, checker));
const isJsxOpeningTagName = (contextToken == null ? void 0 : contextToken.kind) === 30 /* LessThanToken */ && isJsxOpeningLikeElement(contextToken.parent);
const { moduleSpecifier, codeAction } = ts_codefix_exports.getImportCompletionAction(
targetSymbol,
moduleSymbol,
data == null ? void 0 : data.exportMapKey,
sourceFile,
name,
isJsxOpeningTagName,
host,
program,
formatContext,
previousToken && isIdentifier(previousToken) ? previousToken.getStart(sourceFile) : position,
preferences,
cancellationToken
);
Debug.assert(!(data == null ? void 0 : data.moduleSpecifier) || moduleSpecifier === data.moduleSpecifier);
return { sourceDisplay: [textPart(moduleSpecifier)], codeActions: [codeAction] };
}
function getCompletionEntrySymbol(program, log, sourceFile, position, entryId, host, preferences) {
const completion = getSymbolCompletionFromEntryId(program, log, sourceFile, position, entryId, host, preferences);
return completion.type === "symbol" ? completion.symbol : void 0;
}
var CompletionKind = /* @__PURE__ */ ((CompletionKind2) => {
CompletionKind2[CompletionKind2["ObjectPropertyDeclaration"] = 0] = "ObjectPropertyDeclaration";
CompletionKind2[CompletionKind2["Global"] = 1] = "Global";
CompletionKind2[CompletionKind2["PropertyAccess"] = 2] = "PropertyAccess";
CompletionKind2[CompletionKind2["MemberLike"] = 3] = "MemberLike";
CompletionKind2[CompletionKind2["String"] = 4] = "String";
CompletionKind2[CompletionKind2["None"] = 5] = "None";
return CompletionKind2;
})(CompletionKind || {});
function getRecommendedCompletion(previousToken, contextualType, checker) {
return firstDefined(contextualType && (contextualType.isUnion() ? contextualType.types : [contextualType]), (type) => {
const symbol = type && type.symbol;
return symbol && (symbol.flags & (8 /* EnumMember */ | 384 /* Enum */ | 32 /* Class */) && !isAbstractConstructorSymbol(symbol)) ? getFirstSymbolInChain(symbol, previousToken, checker) : void 0;
});
}
function getContextualType(previousToken, position, sourceFile, checker) {
const { parent: parent2 } = previousToken;
switch (previousToken.kind) {
case 80 /* Identifier */:
return getContextualTypeFromParent(previousToken, checker);
case 64 /* EqualsToken */:
switch (parent2.kind) {
case 259 /* VariableDeclaration */:
return checker.getContextualType(parent2.initializer);
case 225 /* BinaryExpression */:
return checker.getTypeAtLocation(parent2.left);
case 290 /* JsxAttribute */:
return checker.getContextualTypeForJsxAttribute(parent2);
default:
return void 0;
}
case 105 /* NewKeyword */:
return checker.getContextualType(parent2);
case 84 /* CaseKeyword */:
const caseClause = tryCast(parent2, isCaseClause);
return caseClause ? getSwitchedType(caseClause, checker) : void 0;
case 19 /* OpenBraceToken */:
return isJsxExpression(parent2) && !isJsxElement(parent2.parent) && !isJsxFragment(parent2.parent) ? checker.getContextualTypeForJsxAttribute(parent2.parent) : void 0;
default:
const argInfo = ts_SignatureHelp_exports.getArgumentInfoForCompletions(previousToken, position, sourceFile);
return argInfo ? (
// At `,`, treat this as the next argument after the comma.
checker.getContextualTypeForArgumentAtIndex(argInfo.invocation, argInfo.argumentIndex + (previousToken.kind === 28 /* CommaToken */ ? 1 : 0))
) : isEqualityOperatorKind(previousToken.kind) && isBinaryExpression(parent2) && isEqualityOperatorKind(parent2.operatorToken.kind) ? (
// completion at `x ===/**/` should be for the right side
checker.getTypeAtLocation(parent2.left)
) : checker.getContextualType(previousToken, 4 /* Completions */) || checker.getContextualType(previousToken);
}
}
function getFirstSymbolInChain(symbol, enclosingDeclaration, checker) {
const chain = checker.getAccessibleSymbolChain(
symbol,
enclosingDeclaration,
/*meaning*/
67108863 /* All */,
/*useOnlyExternalAliasing*/
false
);
if (chain)
return first(chain);
return symbol.parent && (isModuleSymbol(symbol.parent) ? symbol : getFirstSymbolInChain(symbol.parent, enclosingDeclaration, checker));
}
function isModuleSymbol(symbol) {
var _a;
return !!((_a = symbol.declarations) == null ? void 0 : _a.some((d) => d.kind === 311 /* SourceFile */));
}
function getCompletionData(program, log, sourceFile, compilerOptions, position, preferences, detailsEntryId, host, formatContext, cancellationToken) {
const typeChecker = program.getTypeChecker();
const inCheckedFile = isCheckedFile(sourceFile, compilerOptions);
let start2 = timestamp();
let currentToken = getTokenAtPosition(sourceFile, position);
log("getCompletionData: Get current token: " + (timestamp() - start2));
start2 = timestamp();
const insideComment = isInComment(sourceFile, position, currentToken);
log("getCompletionData: Is inside comment: " + (timestamp() - start2));
let insideJsDocTagTypeExpression = false;
let isInSnippetScope = false;
if (insideComment) {
if (hasDocComment(sourceFile, position)) {
if (sourceFile.text.charCodeAt(position - 1) === 64 /* at */) {
return { kind: 1 /* JsDocTagName */ };
} else {
const lineStart = getLineStartPositionForPosition(position, sourceFile);
if (!/[^\*|\s(/)]/.test(sourceFile.text.substring(lineStart, position))) {
return { kind: 2 /* JsDocTag */ };
}
}
}
const tag = getJsDocTagAtPosition(currentToken, position);
if (tag) {
if (tag.tagName.pos <= position && position <= tag.tagName.end) {
return { kind: 1 /* JsDocTagName */ };
}
const typeExpression = tryGetTypeExpressionFromTag(tag);
if (typeExpression) {
currentToken = getTokenAtPosition(sourceFile, position);
if (!currentToken || !isDeclarationName(currentToken) && (currentToken.parent.kind !== 354 /* JSDocPropertyTag */ || currentToken.parent.name !== currentToken)) {
insideJsDocTagTypeExpression = isCurrentlyEditingNode(typeExpression);
}
}
if (!insideJsDocTagTypeExpression && isJSDocParameterTag(tag) && (nodeIsMissing(tag.name) || tag.name.pos <= position && position <= tag.name.end)) {
return { kind: 3 /* JsDocParameterName */, tag };
}
}
if (!insideJsDocTagTypeExpression) {
log("Returning an empty list because completion was inside a regular comment or plain text part of a JsDoc comment.");
return void 0;
}
}
start2 = timestamp();
const isJsOnlyLocation = !insideJsDocTagTypeExpression && isSourceFileJS(sourceFile);
const tokens = getRelevantTokens(position, sourceFile);
const previousToken = tokens.previousToken;
let contextToken = tokens.contextToken;
log("getCompletionData: Get previous token: " + (timestamp() - start2));
let node = currentToken;
let propertyAccessToConvert;
let isRightOfDot = false;
let isRightOfQuestionDot = false;
let isRightOfOpenTag = false;
let isStartingCloseTag = false;
let isJsxInitializer = false;
let isJsxIdentifierExpected = false;
let importStatementCompletion;
let location = getTouchingPropertyName(sourceFile, position);
let keywordFilters = 0 /* None */;
let isNewIdentifierLocation = false;
let flags = 0 /* None */;
if (contextToken) {
const importStatementCompletionInfo = getImportStatementCompletionInfo(contextToken);
if (importStatementCompletionInfo.keywordCompletion) {
if (importStatementCompletionInfo.isKeywordOnlyCompletion) {
return {
kind: 4 /* Keywords */,
keywordCompletions: [keywordToCompletionEntry(importStatementCompletionInfo.keywordCompletion)],
isNewIdentifierLocation: importStatementCompletionInfo.isNewIdentifierLocation
};
}
keywordFilters = keywordFiltersFromSyntaxKind(importStatementCompletionInfo.keywordCompletion);
}
if (importStatementCompletionInfo.replacementSpan && preferences.includeCompletionsForImportStatements && preferences.includeCompletionsWithInsertText) {
flags |= 2 /* IsImportStatementCompletion */;
importStatementCompletion = importStatementCompletionInfo;
isNewIdentifierLocation = importStatementCompletionInfo.isNewIdentifierLocation;
}
if (!importStatementCompletionInfo.replacementSpan && isCompletionListBlocker(contextToken)) {
log("Returning an empty list because completion was requested in an invalid position.");
return keywordFilters ? keywordCompletionData(keywordFilters, isJsOnlyLocation, isNewIdentifierDefinitionLocation()) : void 0;
}
let parent2 = contextToken.parent;
if (contextToken.kind === 25 /* DotToken */ || contextToken.kind === 29 /* QuestionDotToken */) {
isRightOfDot = contextToken.kind === 25 /* DotToken */;
isRightOfQuestionDot = contextToken.kind === 29 /* QuestionDotToken */;
switch (parent2.kind) {
case 210 /* PropertyAccessExpression */:
propertyAccessToConvert = parent2;
node = propertyAccessToConvert.expression;
const leftmostAccessExpression = getLeftmostAccessExpression(propertyAccessToConvert);
if (nodeIsMissing(leftmostAccessExpression) || (isCallExpression(node) || isFunctionLike(node)) && node.end === contextToken.pos && node.getChildCount(sourceFile) && last(node.getChildren(sourceFile)).kind !== 22 /* CloseParenToken */) {
return void 0;
}
break;
case 165 /* QualifiedName */:
node = parent2.left;
break;
case 266 /* ModuleDeclaration */:
node = parent2.name;
break;
case 204 /* ImportType */:
node = parent2;
break;
case 235 /* MetaProperty */:
node = parent2.getFirstToken(sourceFile);
Debug.assert(node.kind === 102 /* ImportKeyword */ || node.kind === 105 /* NewKeyword */);
break;
default:
return void 0;
}
} else if (!importStatementCompletion) {
if (parent2 && parent2.kind === 210 /* PropertyAccessExpression */) {
contextToken = parent2;
parent2 = parent2.parent;
}
if (currentToken.parent === location) {
switch (currentToken.kind) {
case 32 /* GreaterThanToken */:
if (currentToken.parent.kind === 283 /* JsxElement */ || currentToken.parent.kind === 285 /* JsxOpeningElement */) {
location = currentToken;
}
break;
case 44 /* SlashToken */:
if (currentToken.parent.kind === 284 /* JsxSelfClosingElement */) {
location = currentToken;
}
break;
}
}
switch (parent2.kind) {
case 286 /* JsxClosingElement */:
if (contextToken.kind === 44 /* SlashToken */) {
isStartingCloseTag = true;
location = contextToken;
}
break;
case 225 /* BinaryExpression */:
if (!binaryExpressionMayBeOpenTag(parent2)) {
break;
}
case 284 /* JsxSelfClosingElement */:
case 283 /* JsxElement */:
case 285 /* JsxOpeningElement */:
isJsxIdentifierExpected = true;
if (contextToken.kind === 30 /* LessThanToken */) {
isRightOfOpenTag = true;
location = contextToken;
}
break;
case 293 /* JsxExpression */:
case 292 /* JsxSpreadAttribute */:
if (previousToken.kind === 20 /* CloseBraceToken */ || previousToken.kind === 80 /* Identifier */ && previousToken.parent.kind === 290 /* JsxAttribute */) {
isJsxIdentifierExpected = true;
}
break;
case 290 /* JsxAttribute */:
if (parent2.initializer === previousToken && previousToken.end < position) {
isJsxIdentifierExpected = true;
break;
}
switch (previousToken.kind) {
case 64 /* EqualsToken */:
isJsxInitializer = true;
break;
case 80 /* Identifier */:
isJsxIdentifierExpected = true;
if (parent2 !== previousToken.parent && !parent2.initializer && findChildOfKind(parent2, 64 /* EqualsToken */, sourceFile)) {
isJsxInitializer = previousToken;
}
}
break;
}
}
}
const semanticStart = timestamp();
let completionKind = 5 /* None */;
let isNonContextualObjectLiteral = false;
let hasUnresolvedAutoImports = false;
let symbols = [];
let importSpecifierResolver;
const symbolToOriginInfoMap = [];
const symbolToSortTextMap = [];
const seenPropertySymbols = /* @__PURE__ */ new Map();
const isTypeOnlyLocation = isTypeOnlyCompletion();
const getModuleSpecifierResolutionHost = memoizeOne((isFromPackageJson) => {
return createModuleSpecifierResolutionHost(isFromPackageJson ? host.getPackageJsonAutoImportProvider() : program, host);
});
if (isRightOfDot || isRightOfQuestionDot) {
getTypeScriptMemberSymbols();
} else if (isRightOfOpenTag) {
symbols = typeChecker.getJsxIntrinsicTagNamesAt(location);
Debug.assertEachIsDefined(symbols, "getJsxIntrinsicTagNames() should all be defined");
tryGetGlobalSymbols();
completionKind = 1 /* Global */;
keywordFilters = 0 /* None */;
} else if (isStartingCloseTag) {
const tagName = contextToken.parent.parent.openingElement.tagName;
const tagSymbol = typeChecker.getSymbolAtLocation(tagName);
if (tagSymbol) {
symbols = [tagSymbol];
}
completionKind = 1 /* Global */;
keywordFilters = 0 /* None */;
} else {
if (!tryGetGlobalSymbols()) {
return keywordFilters ? keywordCompletionData(keywordFilters, isJsOnlyLocation, isNewIdentifierLocation) : void 0;
}
}
log("getCompletionData: Semantic work: " + (timestamp() - semanticStart));
const contextualType = previousToken && getContextualType(previousToken, position, sourceFile, typeChecker);
const isLiteralExpected = !tryCast(previousToken, isStringLiteralLike) && !isJsxIdentifierExpected;
const literals = !isLiteralExpected ? [] : mapDefined(
contextualType && (contextualType.isUnion() ? contextualType.types : [contextualType]),
(t) => t.isLiteral() && !(t.flags & 1024 /* EnumLiteral */) ? t.value : void 0
);
const recommendedCompletion = previousToken && contextualType && getRecommendedCompletion(previousToken, contextualType, typeChecker);
return {
kind: 0 /* Data */,
symbols,
completionKind,
isInSnippetScope,
propertyAccessToConvert,
isNewIdentifierLocation,
location,
keywordFilters,
literals,
symbolToOriginInfoMap,
recommendedCompletion,
previousToken,
contextToken,
isJsxInitializer,
insideJsDocTagTypeExpression,
symbolToSortTextMap,
isTypeOnlyLocation,
isJsxIdentifierExpected,
isRightOfOpenTag,
isRightOfDotOrQuestionDot: isRightOfDot || isRightOfQuestionDot,
importStatementCompletion,
hasUnresolvedAutoImports,
flags
};
function isTagWithTypeExpression(tag) {
switch (tag.kind) {
case 347 /* JSDocParameterTag */:
case 354 /* JSDocPropertyTag */:
case 348 /* JSDocReturnTag */:
case 350 /* JSDocTypeTag */:
case 352 /* JSDocTypedefTag */:
case 355 /* JSDocThrowsTag */:
case 356 /* JSDocSatisfiesTag */:
return true;
case 351 /* JSDocTemplateTag */:
return !!tag.constraint;
default:
return false;
}
}
function tryGetTypeExpressionFromTag(tag) {
if (isTagWithTypeExpression(tag)) {
const typeExpression = isJSDocTemplateTag(tag) ? tag.constraint : tag.typeExpression;
return typeExpression && typeExpression.kind === 315 /* JSDocTypeExpression */ ? typeExpression : void 0;
}
if (isJSDocAugmentsTag(tag) || isJSDocImplementsTag(tag)) {
return tag.class;
}
return void 0;
}
function getTypeScriptMemberSymbols() {
completionKind = 2 /* PropertyAccess */;
const isImportType = isLiteralImportTypeNode(node);
const isTypeLocation = isImportType && !node.isTypeOf || isPartOfTypeNode(node.parent) || isPossiblyTypeArgumentPosition(contextToken, sourceFile, typeChecker);
const isRhsOfImportDeclaration = isInRightSideOfInternalImportEqualsDeclaration(node);
if (isEntityName(node) || isImportType || isPropertyAccessExpression(node)) {
const isNamespaceName = isModuleDeclaration(node.parent);
if (isNamespaceName)
isNewIdentifierLocation = true;
let symbol = typeChecker.getSymbolAtLocation(node);
if (symbol) {
symbol = skipAlias(symbol, typeChecker);
if (symbol.flags & (1536 /* Module */ | 384 /* Enum */)) {
const exportedSymbols = typeChecker.getExportsOfModule(symbol);
Debug.assertEachIsDefined(exportedSymbols, "getExportsOfModule() should all be defined");
const isValidValueAccess = (symbol2) => typeChecker.isValidPropertyAccess(isImportType ? node : node.parent, symbol2.name);
const isValidTypeAccess = (symbol2) => symbolCanBeReferencedAtTypeLocation(symbol2, typeChecker);
const isValidAccess = isNamespaceName ? (symbol2) => {
var _a;
return !!(symbol2.flags & 1920 /* Namespace */) && !((_a = symbol2.declarations) == null ? void 0 : _a.every((d) => d.parent === node.parent));
} : isRhsOfImportDeclaration ? (
// Any kind is allowed when dotting off namespace in internal import equals declaration
(symbol2) => isValidTypeAccess(symbol2) || isValidValueAccess(symbol2)
) : isTypeLocation || insideJsDocTagTypeExpression ? isValidTypeAccess : isValidValueAccess;
for (const exportedSymbol of exportedSymbols) {
if (isValidAccess(exportedSymbol)) {
symbols.push(exportedSymbol);
}
}
if (!isTypeLocation && !insideJsDocTagTypeExpression && symbol.declarations && symbol.declarations.some((d) => d.kind !== 311 /* SourceFile */ && d.kind !== 266 /* ModuleDeclaration */ && d.kind !== 265 /* EnumDeclaration */)) {
let type = typeChecker.getTypeOfSymbolAtLocation(symbol, node).getNonOptionalType();
let insertQuestionDot = false;
if (type.isNullableType()) {
const canCorrectToQuestionDot = isRightOfDot && !isRightOfQuestionDot && preferences.includeAutomaticOptionalChainCompletions !== false;
if (canCorrectToQuestionDot || isRightOfQuestionDot) {
type = type.getNonNullableType();
if (canCorrectToQuestionDot) {
insertQuestionDot = true;
}
}
}
addTypeProperties(type, !!(node.flags & 32768 /* AwaitContext */), insertQuestionDot);
}
return;
}
}
}
if (!isTypeLocation) {
typeChecker.tryGetThisTypeAt(
node,
/*includeGlobalThis*/
false
);
let type = typeChecker.getTypeAtLocation(node).getNonOptionalType();
let insertQuestionDot = false;
if (type.isNullableType()) {
const canCorrectToQuestionDot = isRightOfDot && !isRightOfQuestionDot && preferences.includeAutomaticOptionalChainCompletions !== false;
if (canCorrectToQuestionDot || isRightOfQuestionDot) {
type = type.getNonNullableType();
if (canCorrectToQuestionDot) {
insertQuestionDot = true;
}
}
}
addTypeProperties(type, !!(node.flags & 32768 /* AwaitContext */), insertQuestionDot);
}
}
function addTypeProperties(type, insertAwait, insertQuestionDot) {
isNewIdentifierLocation = !!type.getStringIndexType();
if (isRightOfQuestionDot && some(type.getCallSignatures())) {
isNewIdentifierLocation = true;
}
const propertyAccess = node.kind === 204 /* ImportType */ ? node : node.parent;
if (inCheckedFile) {
for (const symbol of type.getApparentProperties()) {
if (typeChecker.isValidPropertyAccessForCompletions(propertyAccess, type, symbol)) {
addPropertySymbol(
symbol,
/*insertAwait*/
false,
insertQuestionDot
);
}
}
} else {
symbols.push(...filter(getPropertiesForCompletion(type, typeChecker), (s) => typeChecker.isValidPropertyAccessForCompletions(propertyAccess, type, s)));
}
if (insertAwait && preferences.includeCompletionsWithInsertText) {
const promiseType = typeChecker.getPromisedTypeOfPromise(type);
if (promiseType) {
for (const symbol of promiseType.getApparentProperties()) {
if (typeChecker.isValidPropertyAccessForCompletions(propertyAccess, promiseType, symbol)) {
addPropertySymbol(
symbol,
/*insertAwait*/
true,
insertQuestionDot
);
}
}
}
}
}
function addPropertySymbol(symbol, insertAwait, insertQuestionDot) {
var _a;
const computedPropertyName = firstDefined(symbol.declarations, (decl) => tryCast(getNameOfDeclaration(decl), isComputedPropertyName));
if (computedPropertyName) {
const leftMostName = getLeftMostName(computedPropertyName.expression);
const nameSymbol = leftMostName && typeChecker.getSymbolAtLocation(leftMostName);
const firstAccessibleSymbol = nameSymbol && getFirstSymbolInChain(nameSymbol, contextToken, typeChecker);
if (firstAccessibleSymbol && addToSeen(seenPropertySymbols, getSymbolId(firstAccessibleSymbol))) {
const index = symbols.length;
symbols.push(firstAccessibleSymbol);
const moduleSymbol = firstAccessibleSymbol.parent;
if (!moduleSymbol || !isExternalModuleSymbol(moduleSymbol) || typeChecker.tryGetMemberInModuleExportsAndProperties(firstAccessibleSymbol.name, moduleSymbol) !== firstAccessibleSymbol) {
symbolToOriginInfoMap[index] = { kind: getNullableSymbolOriginInfoKind(2 /* SymbolMemberNoExport */) };
} else {
const fileName = isExternalModuleNameRelative(stripQuotes(moduleSymbol.name)) ? (_a = getSourceFileOfModule(moduleSymbol)) == null ? void 0 : _a.fileName : void 0;
const { moduleSpecifier } = (importSpecifierResolver || (importSpecifierResolver = ts_codefix_exports.createImportSpecifierResolver(sourceFile, program, host, preferences))).getModuleSpecifierForBestExportInfo([{
exportKind: 0 /* Named */,
moduleFileName: fileName,
isFromPackageJson: false,
moduleSymbol,
symbol: firstAccessibleSymbol,
targetFlags: skipAlias(firstAccessibleSymbol, typeChecker).flags
}], position, isValidTypeOnlyAliasUseSite(location)) || {};
if (moduleSpecifier) {
const origin = {
kind: getNullableSymbolOriginInfoKind(6 /* SymbolMemberExport */),
moduleSymbol,
isDefaultExport: false,
symbolName: firstAccessibleSymbol.name,
exportName: firstAccessibleSymbol.name,
fileName,
moduleSpecifier
};
symbolToOriginInfoMap[index] = origin;
}
}
} else if (preferences.includeCompletionsWithInsertText) {
addSymbolOriginInfo(symbol);
addSymbolSortInfo(symbol);
symbols.push(symbol);
}
} else {
addSymbolOriginInfo(symbol);
addSymbolSortInfo(symbol);
symbols.push(symbol);
}
function addSymbolSortInfo(symbol2) {
if (isStaticProperty(symbol2)) {
symbolToSortTextMap[getSymbolId(symbol2)] = SortText.LocalDeclarationPriority;
}
}
function addSymbolOriginInfo(symbol2) {
if (preferences.includeCompletionsWithInsertText) {
if (insertAwait && addToSeen(seenPropertySymbols, getSymbolId(symbol2))) {
symbolToOriginInfoMap[symbols.length] = { kind: getNullableSymbolOriginInfoKind(8 /* Promise */) };
} else if (insertQuestionDot) {
symbolToOriginInfoMap[symbols.length] = { kind: 16 /* Nullable */ };
}
}
}
function getNullableSymbolOriginInfoKind(kind) {
return insertQuestionDot ? kind | 16 /* Nullable */ : kind;
}
}
function getLeftMostName(e) {
return isIdentifier(e) ? e : isPropertyAccessExpression(e) ? getLeftMostName(e.expression) : void 0;
}
function tryGetGlobalSymbols() {
const result = tryGetObjectTypeLiteralInTypeArgumentCompletionSymbols() || tryGetObjectLikeCompletionSymbols() || tryGetImportCompletionSymbols() || tryGetImportOrExportClauseCompletionSymbols() || tryGetLocalNamedExportCompletionSymbols() || tryGetConstructorCompletion() || tryGetClassLikeCompletionSymbols() || tryGetJsxCompletionSymbols() || (getGlobalCompletions(), 1 /* Success */);
return result === 1 /* Success */;
}
function tryGetConstructorCompletion() {
if (!tryGetConstructorLikeCompletionContainer(contextToken))
return 0 /* Continue */;
completionKind = 5 /* None */;
isNewIdentifierLocation = true;
keywordFilters = 4 /* ConstructorParameterKeywords */;
return 1 /* Success */;
}
function tryGetJsxCompletionSymbols() {
const jsxContainer = tryGetContainingJsxElement(contextToken);
const attrsType = jsxContainer && typeChecker.getContextualType(jsxContainer.attributes);
if (!attrsType)
return 0 /* Continue */;
const completionsType = jsxContainer && typeChecker.getContextualType(jsxContainer.attributes, 4 /* Completions */);
symbols = concatenate(symbols, filterJsxAttributes(getPropertiesForObjectExpression(attrsType, completionsType, jsxContainer.attributes, typeChecker), jsxContainer.attributes.properties));
setSortTextToOptionalMember();
completionKind = 3 /* MemberLike */;
isNewIdentifierLocation = false;
return 1 /* Success */;
}
function tryGetImportCompletionSymbols() {
if (!importStatementCompletion)
return 0 /* Continue */;
isNewIdentifierLocation = true;
collectAutoImports();
return 1 /* Success */;
}
function getGlobalCompletions() {
keywordFilters = tryGetFunctionLikeBodyCompletionContainer(contextToken) ? 5 /* FunctionLikeBodyKeywords */ : 1 /* All */;
completionKind = 1 /* Global */;
isNewIdentifierLocation = isNewIdentifierDefinitionLocation();
if (previousToken !== contextToken) {
Debug.assert(!!previousToken, "Expected 'contextToken' to be defined when different from 'previousToken'.");
}
const adjustedPosition = previousToken !== contextToken ? previousToken.getStart() : position;
const scopeNode = getScopeNode(contextToken, adjustedPosition, sourceFile) || sourceFile;
isInSnippetScope = isSnippetScope(scopeNode);
const symbolMeanings = (isTypeOnlyLocation ? 0 /* None */ : 111551 /* Value */) | 788968 /* Type */ | 1920 /* Namespace */ | 2097152 /* Alias */;
const typeOnlyAliasNeedsPromotion = previousToken && !isValidTypeOnlyAliasUseSite(previousToken);
symbols = concatenate(symbols, typeChecker.getSymbolsInScope(scopeNode, symbolMeanings));
Debug.assertEachIsDefined(symbols, "getSymbolsInScope() should all be defined");
for (let i = 0; i < symbols.length; i++) {
const symbol = symbols[i];
if (!typeChecker.isArgumentsSymbol(symbol) && !some(symbol.declarations, (d) => d.getSourceFile() === sourceFile)) {
symbolToSortTextMap[getSymbolId(symbol)] = SortText.GlobalsOrKeywords;
}
if (typeOnlyAliasNeedsPromotion && !(symbol.flags & 111551 /* Value */)) {
const typeOnlyAliasDeclaration = symbol.declarations && find(symbol.declarations, isTypeOnlyImportDeclaration);
if (typeOnlyAliasDeclaration) {
const origin = { kind: 64 /* TypeOnlyAlias */, declaration: typeOnlyAliasDeclaration };
symbolToOriginInfoMap[i] = origin;
}
}
}
if (preferences.includeCompletionsWithInsertText && scopeNode.kind !== 311 /* SourceFile */) {
const thisType = typeChecker.tryGetThisTypeAt(
scopeNode,
/*includeGlobalThis*/
false,
isClassLike(scopeNode.parent) ? scopeNode : void 0
);
if (thisType && !isProbablyGlobalType(thisType, sourceFile, typeChecker)) {
for (const symbol of getPropertiesForCompletion(thisType, typeChecker)) {
symbolToOriginInfoMap[symbols.length] = { kind: 1 /* ThisType */ };
symbols.push(symbol);
symbolToSortTextMap[getSymbolId(symbol)] = SortText.SuggestedClassMembers;
}
}
}
collectAutoImports();
if (isTypeOnlyLocation) {
keywordFilters = contextToken && isAssertionExpression(contextToken.parent) ? 6 /* TypeAssertionKeywords */ : 7 /* TypeKeywords */;
}
}
function shouldOfferImportCompletions() {
if (importStatementCompletion)
return true;
if (isNonContextualObjectLiteral)
return false;
if (!preferences.includeCompletionsForModuleExports)
return false;
if (sourceFile.externalModuleIndicator || sourceFile.commonJsModuleIndicator)
return true;
if (compilerOptionsIndicateEsModules(program.getCompilerOptions()))
return true;
return programContainsModules(program);
}
function isSnippetScope(scopeNode) {
switch (scopeNode.kind) {
case 311 /* SourceFile */:
case 227 /* TemplateExpression */:
case 293 /* JsxExpression */:
case 240 /* Block */:
return true;
default:
return isStatement(scopeNode);
}
}
function isTypeOnlyCompletion() {
return insideJsDocTagTypeExpression || !!importStatementCompletion && isTypeOnlyImportOrExportDeclaration(location.parent) || !isContextTokenValueLocation(contextToken) && (isPossiblyTypeArgumentPosition(contextToken, sourceFile, typeChecker) || isPartOfTypeNode(location) || isContextTokenTypeLocation(contextToken));
}
function isContextTokenValueLocation(contextToken2) {
return contextToken2 && (contextToken2.kind === 114 /* TypeOfKeyword */ && (contextToken2.parent.kind === 185 /* TypeQuery */ || isTypeOfExpression(contextToken2.parent)) || contextToken2.kind === 131 /* AssertsKeyword */ && contextToken2.parent.kind === 181 /* TypePredicate */);
}
function isContextTokenTypeLocation(contextToken2) {
if (contextToken2) {
const parentKind = contextToken2.parent.kind;
switch (contextToken2.kind) {
case 59 /* ColonToken */:
return parentKind === 171 /* PropertyDeclaration */ || parentKind === 170 /* PropertySignature */ || parentKind === 168 /* Parameter */ || parentKind === 259 /* VariableDeclaration */ || isFunctionLikeKind(parentKind);
case 64 /* EqualsToken */:
return parentKind === 264 /* TypeAliasDeclaration */;
case 130 /* AsKeyword */:
return parentKind === 233 /* AsExpression */;
case 30 /* LessThanToken */:
return parentKind === 182 /* TypeReference */ || parentKind === 215 /* TypeAssertionExpression */;
case 96 /* ExtendsKeyword */:
return parentKind === 167 /* TypeParameter */;
case 152 /* SatisfiesKeyword */:
return parentKind === 237 /* SatisfiesExpression */;
}
}
return false;
}
function collectAutoImports() {
var _a, _b;
if (!shouldOfferImportCompletions())
return;
Debug.assert(!(detailsEntryId == null ? void 0 : detailsEntryId.data), "Should not run 'collectAutoImports' when faster path is available via `data`");
if (detailsEntryId && !detailsEntryId.source) {
return;
}
flags |= 1 /* MayIncludeAutoImports */;
const isAfterTypeOnlyImportSpecifierModifier = previousToken === contextToken && importStatementCompletion;
const lowerCaseTokenText = isAfterTypeOnlyImportSpecifierModifier ? "" : previousToken && isIdentifier(previousToken) ? previousToken.text.toLowerCase() : "";
const moduleSpecifierCache = (_a = host.getModuleSpecifierCache) == null ? void 0 : _a.call(host);
const exportInfo = getExportInfoMap(sourceFile, host, program, preferences, cancellationToken);
const packageJsonAutoImportProvider = (_b = host.getPackageJsonAutoImportProvider) == null ? void 0 : _b.call(host);
const packageJsonFilter = detailsEntryId ? void 0 : createPackageJsonImportFilter(sourceFile, preferences, host);
resolvingModuleSpecifiers(
"collectAutoImports",
host,
importSpecifierResolver || (importSpecifierResolver = ts_codefix_exports.createImportSpecifierResolver(sourceFile, program, host, preferences)),
program,
position,
preferences,
!!importStatementCompletion,
isValidTypeOnlyAliasUseSite(location),
(context) => {
exportInfo.search(
sourceFile.path,
/*preferCapitalized*/
isRightOfOpenTag,
(symbolName2, targetFlags) => {
if (!isIdentifierText(symbolName2, getEmitScriptTarget(host.getCompilationSettings())))
return false;
if (!detailsEntryId && isStringANonContextualKeyword(symbolName2))
return false;
if (!isTypeOnlyLocation && !importStatementCompletion && !(targetFlags & 111551 /* Value */))
return false;
if (isTypeOnlyLocation && !(targetFlags & (1536 /* Module */ | 788968 /* Type */)))
return false;
const firstChar = symbolName2.charCodeAt(0);
if (isRightOfOpenTag && (firstChar < 65 /* A */ || firstChar > 90 /* Z */))
return false;
if (detailsEntryId)
return true;
return charactersFuzzyMatchInString(symbolName2, lowerCaseTokenText);
},
(info, symbolName2, isFromAmbientModule, exportMapKey) => {
if (detailsEntryId && !some(info, (i) => detailsEntryId.source === stripQuotes(i.moduleSymbol.name))) {
return;
}
info = filter(info, isImportableExportInfo);
if (!info.length) {
return;
}
const result = context.tryResolve(info, isFromAmbientModule) || {};
if (result === "failed")
return;
let exportInfo2 = info[0], moduleSpecifier;
if (result !== "skipped") {
({ exportInfo: exportInfo2 = info[0], moduleSpecifier } = result);
}
const isDefaultExport = exportInfo2.exportKind === 1 /* Default */;
const symbol = isDefaultExport && getLocalSymbolForExportDefault(exportInfo2.symbol) || exportInfo2.symbol;
pushAutoImportSymbol(symbol, {
kind: moduleSpecifier ? 32 /* ResolvedExport */ : 4 /* Export */,
moduleSpecifier,
symbolName: symbolName2,
exportMapKey,
exportName: exportInfo2.exportKind === 2 /* ExportEquals */ ? "export=" /* ExportEquals */ : exportInfo2.symbol.name,
fileName: exportInfo2.moduleFileName,
isDefaultExport,
moduleSymbol: exportInfo2.moduleSymbol,
isFromPackageJson: exportInfo2.isFromPackageJson
});
}
);
hasUnresolvedAutoImports = context.skippedAny();
flags |= context.resolvedAny() ? 8 /* ResolvedModuleSpecifiers */ : 0;
flags |= context.resolvedBeyondLimit() ? 16 /* ResolvedModuleSpecifiersBeyondLimit */ : 0;
}
);
function isImportableExportInfo(info) {
const moduleFile = tryCast(info.moduleSymbol.valueDeclaration, isSourceFile);
if (!moduleFile) {
const moduleName = stripQuotes(info.moduleSymbol.name);
if (ts_JsTyping_exports.nodeCoreModules.has(moduleName) && startsWith(moduleName, "node:") !== shouldUseUriStyleNodeCoreModules(sourceFile, program)) {
return false;
}
return packageJsonFilter ? packageJsonFilter.allowsImportingAmbientModule(info.moduleSymbol, getModuleSpecifierResolutionHost(info.isFromPackageJson)) : true;
}
return isImportableFile(
info.isFromPackageJson ? packageJsonAutoImportProvider : program,
sourceFile,
moduleFile,
preferences,
packageJsonFilter,
getModuleSpecifierResolutionHost(info.isFromPackageJson),
moduleSpecifierCache
);
}
}
function pushAutoImportSymbol(symbol, origin) {
const symbolId = getSymbolId(symbol);
if (symbolToSortTextMap[symbolId] === SortText.GlobalsOrKeywords) {
return;
}
symbolToOriginInfoMap[symbols.length] = origin;
symbolToSortTextMap[symbolId] = importStatementCompletion ? SortText.LocationPriority : SortText.AutoImportSuggestions;
symbols.push(symbol);
}
function collectObjectLiteralMethodSymbols(members, enclosingDeclaration) {
if (isInJSFile(location)) {
return;
}
members.forEach((member) => {
if (!isObjectLiteralMethodSymbol(member)) {
return;
}
const displayName = getCompletionEntryDisplayNameForSymbol(
member,
getEmitScriptTarget(compilerOptions),
/*origin*/
void 0,
0 /* ObjectPropertyDeclaration */,
/*jsxIdentifierExpected*/
false
);
if (!displayName) {
return;
}
const { name } = displayName;
const entryProps = getEntryForObjectLiteralMethodCompletion(
member,
name,
enclosingDeclaration,
program,
host,
compilerOptions,
preferences,
formatContext
);
if (!entryProps) {
return;
}
const origin = { kind: 128 /* ObjectLiteralMethod */, ...entryProps };
flags |= 32 /* MayIncludeMethodSnippets */;
symbolToOriginInfoMap[symbols.length] = origin;
symbols.push(member);
});
}
function isObjectLiteralMethodSymbol(symbol) {
if (!(symbol.flags & (4 /* Property */ | 8192 /* Method */))) {
return false;
}
return true;
}
function getScopeNode(initialToken, position2, sourceFile2) {
let scope = initialToken;
while (scope && !positionBelongsToNode(scope, position2, sourceFile2)) {
scope = scope.parent;
}
return scope;
}
function isCompletionListBlocker(contextToken2) {
const start3 = timestamp();
const result = isInStringOrRegularExpressionOrTemplateLiteral(contextToken2) || isSolelyIdentifierDefinitionLocation(contextToken2) || isDotOfNumericLiteral(contextToken2) || isInJsxText(contextToken2) || isBigIntLiteral(contextToken2);
log("getCompletionsAtPosition: isCompletionListBlocker: " + (timestamp() - start3));
return result;
}
function isInJsxText(contextToken2) {
if (contextToken2.kind === 12 /* JsxText */) {
return true;
}
if (contextToken2.kind === 32 /* GreaterThanToken */ && contextToken2.parent) {
if (location === contextToken2.parent && (location.kind === 285 /* JsxOpeningElement */ || location.kind === 284 /* JsxSelfClosingElement */)) {
return false;
}
if (contextToken2.parent.kind === 285 /* JsxOpeningElement */) {
return location.parent.kind !== 285 /* JsxOpeningElement */;
}
if (contextToken2.parent.kind === 286 /* JsxClosingElement */ || contextToken2.parent.kind === 284 /* JsxSelfClosingElement */) {
return !!contextToken2.parent.parent && contextToken2.parent.parent.kind === 283 /* JsxElement */;
}
}
return false;
}
function isNewIdentifierDefinitionLocation() {
if (contextToken) {
const containingNodeKind = contextToken.parent.kind;
const tokenKind = keywordForNode(contextToken);
switch (tokenKind) {
case 28 /* CommaToken */:
return containingNodeKind === 212 /* CallExpression */ || containingNodeKind === 175 /* Constructor */ || containingNodeKind === 213 /* NewExpression */ || containingNodeKind === 208 /* ArrayLiteralExpression */ || containingNodeKind === 225 /* BinaryExpression */ || containingNodeKind === 183 /* FunctionType */ || containingNodeKind === 209 /* ObjectLiteralExpression */;
case 21 /* OpenParenToken */:
return containingNodeKind === 212 /* CallExpression */ || containingNodeKind === 175 /* Constructor */ || containingNodeKind === 213 /* NewExpression */ || containingNodeKind === 216 /* ParenthesizedExpression */ || containingNodeKind === 195 /* ParenthesizedType */;
case 23 /* OpenBracketToken */:
return containingNodeKind === 208 /* ArrayLiteralExpression */ || containingNodeKind === 180 /* IndexSignature */ || containingNodeKind === 166 /* ComputedPropertyName */;
case 144 /* ModuleKeyword */:
case 145 /* NamespaceKeyword */:
case 102 /* ImportKeyword */:
return true;
case 25 /* DotToken */:
return containingNodeKind === 266 /* ModuleDeclaration */;
case 19 /* OpenBraceToken */:
return containingNodeKind === 262 /* ClassDeclaration */ || containingNodeKind === 209 /* ObjectLiteralExpression */;
case 64 /* EqualsToken */:
return containingNodeKind === 259 /* VariableDeclaration */ || containingNodeKind === 225 /* BinaryExpression */;
case 16 /* TemplateHead */:
return containingNodeKind === 227 /* TemplateExpression */;
case 17 /* TemplateMiddle */:
return containingNodeKind === 238 /* TemplateSpan */;
case 134 /* AsyncKeyword */:
return containingNodeKind === 173 /* MethodDeclaration */ || containingNodeKind === 303 /* ShorthandPropertyAssignment */;
case 42 /* AsteriskToken */:
return containingNodeKind === 173 /* MethodDeclaration */;
}
if (isClassMemberCompletionKeyword(tokenKind)) {
return true;
}
}
return false;
}
function isInStringOrRegularExpressionOrTemplateLiteral(contextToken2) {
return (isRegularExpressionLiteral(contextToken2) || isStringTextContainingNode(contextToken2)) && (rangeContainsPositionExclusive(contextToken2, position) || position === contextToken2.end && (!!contextToken2.isUnterminated || isRegularExpressionLiteral(contextToken2)));
}
function tryGetObjectTypeLiteralInTypeArgumentCompletionSymbols() {
const typeLiteralNode = tryGetTypeLiteralNode(contextToken);
if (!typeLiteralNode)
return 0 /* Continue */;
const intersectionTypeNode = isIntersectionTypeNode(typeLiteralNode.parent) ? typeLiteralNode.parent : void 0;
const containerTypeNode = intersectionTypeNode || typeLiteralNode;
const containerExpectedType = getConstraintOfTypeArgumentProperty(containerTypeNode, typeChecker);
if (!containerExpectedType)
return 0 /* Continue */;
const containerActualType = typeChecker.getTypeFromTypeNode(containerTypeNode);
const members = getPropertiesForCompletion(containerExpectedType, typeChecker);
const existingMembers = getPropertiesForCompletion(containerActualType, typeChecker);
const existingMemberEscapedNames = /* @__PURE__ */ new Set();
existingMembers.forEach((s) => existingMemberEscapedNames.add(s.escapedName));
symbols = concatenate(symbols, filter(members, (s) => !existingMemberEscapedNames.has(s.escapedName)));
completionKind = 0 /* ObjectPropertyDeclaration */;
isNewIdentifierLocation = true;
return 1 /* Success */;
}
function tryGetObjectLikeCompletionSymbols() {
const symbolsStartIndex = symbols.length;
const objectLikeContainer = tryGetObjectLikeCompletionContainer(contextToken);
if (!objectLikeContainer)
return 0 /* Continue */;
completionKind = 0 /* ObjectPropertyDeclaration */;
let typeMembers;
let existingMembers;
if (objectLikeContainer.kind === 209 /* ObjectLiteralExpression */) {
const instantiatedType = tryGetObjectLiteralContextualType(objectLikeContainer, typeChecker);
if (instantiatedType === void 0) {
if (objectLikeContainer.flags & 33554432 /* InWithStatement */) {
return 2 /* Fail */;
}
isNonContextualObjectLiteral = true;
return 0 /* Continue */;
}
const completionsType = typeChecker.getContextualType(objectLikeContainer, 4 /* Completions */);
const hasStringIndexType = (completionsType || instantiatedType).getStringIndexType();
const hasNumberIndextype = (completionsType || instantiatedType).getNumberIndexType();
isNewIdentifierLocation = !!hasStringIndexType || !!hasNumberIndextype;
typeMembers = getPropertiesForObjectExpression(instantiatedType, completionsType, objectLikeContainer, typeChecker);
existingMembers = objectLikeContainer.properties;
if (typeMembers.length === 0) {
if (!hasNumberIndextype) {
isNonContextualObjectLiteral = true;
return 0 /* Continue */;
}
}
} else {
Debug.assert(objectLikeContainer.kind === 205 /* ObjectBindingPattern */);
isNewIdentifierLocation = false;
const rootDeclaration = getRootDeclaration(objectLikeContainer.parent);
if (!isVariableLike(rootDeclaration))
return Debug.fail("Root declaration is not variable-like.");
let canGetType = hasInitializer(rootDeclaration) || !!getEffectiveTypeAnnotationNode(rootDeclaration) || rootDeclaration.parent.parent.kind === 249 /* ForOfStatement */;
if (!canGetType && rootDeclaration.kind === 168 /* Parameter */) {
if (isExpression(rootDeclaration.parent)) {
canGetType = !!typeChecker.getContextualType(rootDeclaration.parent);
} else if (rootDeclaration.parent.kind === 173 /* MethodDeclaration */ || rootDeclaration.parent.kind === 177 /* SetAccessor */) {
canGetType = isExpression(rootDeclaration.parent.parent) && !!typeChecker.getContextualType(rootDeclaration.parent.parent);
}
}
if (canGetType) {
const typeForObject = typeChecker.getTypeAtLocation(objectLikeContainer);
if (!typeForObject)
return 2 /* Fail */;
typeMembers = typeChecker.getPropertiesOfType(typeForObject).filter((propertySymbol) => {
return typeChecker.isPropertyAccessible(
objectLikeContainer,
/*isSuper*/
false,
/*isWrite*/
false,
typeForObject,
propertySymbol
);
});
existingMembers = objectLikeContainer.elements;
}
}
if (typeMembers && typeMembers.length > 0) {
const filteredMembers = filterObjectMembersList(typeMembers, Debug.checkDefined(existingMembers));
symbols = concatenate(symbols, filteredMembers);
setSortTextToOptionalMember();
if (objectLikeContainer.kind === 209 /* ObjectLiteralExpression */ && preferences.includeCompletionsWithObjectLiteralMethodSnippets && preferences.includeCompletionsWithInsertText) {
transformObjectLiteralMembersSortText(symbolsStartIndex);
collectObjectLiteralMethodSymbols(filteredMembers, objectLikeContainer);
}
}
return 1 /* Success */;
}
function tryGetImportOrExportClauseCompletionSymbols() {
if (!contextToken)
return 0 /* Continue */;
const namedImportsOrExports = contextToken.kind === 19 /* OpenBraceToken */ || contextToken.kind === 28 /* CommaToken */ ? tryCast(contextToken.parent, isNamedImportsOrExports) : isTypeKeywordTokenOrIdentifier(contextToken) ? tryCast(contextToken.parent.parent, isNamedImportsOrExports) : void 0;
if (!namedImportsOrExports)
return 0 /* Continue */;
if (!isTypeKeywordTokenOrIdentifier(contextToken)) {
keywordFilters = 8 /* TypeKeyword */;
}
const { moduleSpecifier } = namedImportsOrExports.kind === 274 /* NamedImports */ ? namedImportsOrExports.parent.parent : namedImportsOrExports.parent;
if (!moduleSpecifier) {
isNewIdentifierLocation = true;
return namedImportsOrExports.kind === 274 /* NamedImports */ ? 2 /* Fail */ : 0 /* Continue */;
}
const moduleSpecifierSymbol = typeChecker.getSymbolAtLocation(moduleSpecifier);
if (!moduleSpecifierSymbol) {
isNewIdentifierLocation = true;
return 2 /* Fail */;
}
completionKind = 3 /* MemberLike */;
isNewIdentifierLocation = false;
const exports = typeChecker.getExportsAndPropertiesOfModule(moduleSpecifierSymbol);
const existing = new Set(namedImportsOrExports.elements.filter((n) => !isCurrentlyEditingNode(n)).map((n) => (n.propertyName || n.name).escapedText));
const uniques = exports.filter((e) => e.escapedName !== "default" /* Default */ && !existing.has(e.escapedName));
symbols = concatenate(symbols, uniques);
if (!uniques.length) {
keywordFilters = 0 /* None */;
}
return 1 /* Success */;
}
function tryGetLocalNamedExportCompletionSymbols() {
var _a;
const namedExports = contextToken && (contextToken.kind === 19 /* OpenBraceToken */ || contextToken.kind === 28 /* CommaToken */) ? tryCast(contextToken.parent, isNamedExports) : void 0;
if (!namedExports) {
return 0 /* Continue */;
}
const localsContainer = findAncestor(namedExports, or(isSourceFile, isModuleDeclaration));
completionKind = 5 /* None */;
isNewIdentifierLocation = false;
(_a = localsContainer.locals) == null ? void 0 : _a.forEach((symbol, name) => {
var _a2, _b;
symbols.push(symbol);
if ((_b = (_a2 = localsContainer.symbol) == null ? void 0 : _a2.exports) == null ? void 0 : _b.has(name)) {
symbolToSortTextMap[getSymbolId(symbol)] = SortText.OptionalMember;
}
});
return 1 /* Success */;
}
function tryGetClassLikeCompletionSymbols() {
const decl = tryGetObjectTypeDeclarationCompletionContainer(sourceFile, contextToken, location, position);
if (!decl)
return 0 /* Continue */;
completionKind = 3 /* MemberLike */;
isNewIdentifierLocation = true;
keywordFilters = contextToken.kind === 42 /* AsteriskToken */ ? 0 /* None */ : isClassLike(decl) ? 2 /* ClassElementKeywords */ : 3 /* InterfaceElementKeywords */;
if (!isClassLike(decl))
return 1 /* Success */;
const classElement = contextToken.kind === 27 /* SemicolonToken */ ? contextToken.parent.parent : contextToken.parent;
let classElementModifierFlags = isClassElement(classElement) ? getEffectiveModifierFlags(classElement) : 0 /* None */;
if (contextToken.kind === 80 /* Identifier */ && !isCurrentlyEditingNode(contextToken)) {
switch (contextToken.getText()) {
case "private":
classElementModifierFlags = classElementModifierFlags | 8 /* Private */;
break;
case "static":
classElementModifierFlags = classElementModifierFlags | 32 /* Static */;
break;
case "override":
classElementModifierFlags = classElementModifierFlags | 16384 /* Override */;
break;
}
}
if (isClassStaticBlockDeclaration(classElement)) {
classElementModifierFlags |= 32 /* Static */;
}
if (!(classElementModifierFlags & 8 /* Private */)) {
const baseTypeNodes = isClassLike(decl) && classElementModifierFlags & 16384 /* Override */ ? singleElementArray(getEffectiveBaseTypeNode(decl)) : getAllSuperTypeNodes(decl);
const baseSymbols = flatMap(baseTypeNodes, (baseTypeNode) => {
const type = typeChecker.getTypeAtLocation(baseTypeNode);
return classElementModifierFlags & 32 /* Static */ ? (type == null ? void 0 : type.symbol) && typeChecker.getPropertiesOfType(typeChecker.getTypeOfSymbolAtLocation(type.symbol, decl)) : type && typeChecker.getPropertiesOfType(type);
});
symbols = concatenate(symbols, filterClassMembersList(baseSymbols, decl.members, classElementModifierFlags));
forEach(symbols, (symbol, index) => {
const declaration = symbol == null ? void 0 : symbol.valueDeclaration;
if (declaration && isClassElement(declaration) && declaration.name && isComputedPropertyName(declaration.name)) {
const origin = {
kind: 512 /* ComputedPropertyName */,
symbolName: typeChecker.symbolToString(symbol)
};
symbolToOriginInfoMap[index] = origin;
}
});
}
return 1 /* Success */;
}
function isConstructorParameterCompletion(node2) {
return !!node2.parent && isParameter(node2.parent) && isConstructorDeclaration(node2.parent.parent) && (isParameterPropertyModifier(node2.kind) || isDeclarationName(node2));
}
function tryGetConstructorLikeCompletionContainer(contextToken2) {
if (contextToken2) {
const parent2 = contextToken2.parent;
switch (contextToken2.kind) {
case 21 /* OpenParenToken */:
case 28 /* CommaToken */:
return isConstructorDeclaration(contextToken2.parent) ? contextToken2.parent : void 0;
default:
if (isConstructorParameterCompletion(contextToken2)) {
return parent2.parent;
}
}
}
return void 0;
}
function tryGetFunctionLikeBodyCompletionContainer(contextToken2) {
if (contextToken2) {
let prev;
const container = findAncestor(contextToken2.parent, (node2) => {
if (isClassLike(node2)) {
return "quit";
}
if (isFunctionLikeDeclaration(node2) && prev === node2.body) {
return true;
}
prev = node2;
return false;
});
return container && container;
}
}
function tryGetContainingJsxElement(contextToken2) {
if (contextToken2) {
const parent2 = contextToken2.parent;
switch (contextToken2.kind) {
case 32 /* GreaterThanToken */:
case 31 /* LessThanSlashToken */:
case 44 /* SlashToken */:
case 80 /* Identifier */:
case 210 /* PropertyAccessExpression */:
case 291 /* JsxAttributes */:
case 290 /* JsxAttribute */:
case 292 /* JsxSpreadAttribute */:
if (parent2 && (parent2.kind === 284 /* JsxSelfClosingElement */ || parent2.kind === 285 /* JsxOpeningElement */)) {
if (contextToken2.kind === 32 /* GreaterThanToken */) {
const precedingToken = findPrecedingToken(
contextToken2.pos,
sourceFile,
/*startNode*/
void 0
);
if (!parent2.typeArguments || precedingToken && precedingToken.kind === 44 /* SlashToken */)
break;
}
return parent2;
} else if (parent2.kind === 290 /* JsxAttribute */) {
return parent2.parent.parent;
}
break;
case 11 /* StringLiteral */:
if (parent2 && (parent2.kind === 290 /* JsxAttribute */ || parent2.kind === 292 /* JsxSpreadAttribute */)) {
return parent2.parent.parent;
}
break;
case 20 /* CloseBraceToken */:
if (parent2 && parent2.kind === 293 /* JsxExpression */ && parent2.parent && parent2.parent.kind === 290 /* JsxAttribute */) {
return parent2.parent.parent.parent;
}
if (parent2 && parent2.kind === 292 /* JsxSpreadAttribute */) {
return parent2.parent.parent;
}
break;
}
}
return void 0;
}
function isSolelyIdentifierDefinitionLocation(contextToken2) {
const parent2 = contextToken2.parent;
const containingNodeKind = parent2.kind;
switch (contextToken2.kind) {
case 28 /* CommaToken */:
return containingNodeKind === 259 /* VariableDeclaration */ || isVariableDeclarationListButNotTypeArgument(contextToken2) || containingNodeKind === 242 /* VariableStatement */ || containingNodeKind === 265 /* EnumDeclaration */ || // enum a { foo, |
isFunctionLikeButNotConstructor(containingNodeKind) || containingNodeKind === 263 /* InterfaceDeclaration */ || // interface A= contextToken2.pos;
case 25 /* DotToken */:
return containingNodeKind === 206 /* ArrayBindingPattern */;
case 59 /* ColonToken */:
return containingNodeKind === 207 /* BindingElement */;
case 23 /* OpenBracketToken */:
return containingNodeKind === 206 /* ArrayBindingPattern */;
case 21 /* OpenParenToken */:
return containingNodeKind === 298 /* CatchClause */ || isFunctionLikeButNotConstructor(containingNodeKind);
case 19 /* OpenBraceToken */:
return containingNodeKind === 265 /* EnumDeclaration */;
case 30 /* LessThanToken */:
return containingNodeKind === 262 /* ClassDeclaration */ || // class A< |
containingNodeKind === 230 /* ClassExpression */ || // var C = class D< |
containingNodeKind === 263 /* InterfaceDeclaration */ || // interface A< |
containingNodeKind === 264 /* TypeAliasDeclaration */ || // type List< |
isFunctionLikeKind(containingNodeKind);
case 126 /* StaticKeyword */:
return containingNodeKind === 171 /* PropertyDeclaration */ && !isClassLike(parent2.parent);
case 26 /* DotDotDotToken */:
return containingNodeKind === 168 /* Parameter */ || !!parent2.parent && parent2.parent.kind === 206 /* ArrayBindingPattern */;
case 125 /* PublicKeyword */:
case 123 /* PrivateKeyword */:
case 124 /* ProtectedKeyword */:
return containingNodeKind === 168 /* Parameter */ && !isConstructorDeclaration(parent2.parent);
case 130 /* AsKeyword */:
return containingNodeKind === 275 /* ImportSpecifier */ || containingNodeKind === 280 /* ExportSpecifier */ || containingNodeKind === 273 /* NamespaceImport */;
case 139 /* GetKeyword */:
case 153 /* SetKeyword */:
return !isFromObjectTypeDeclaration(contextToken2);
case 80 /* Identifier */:
if (containingNodeKind === 275 /* ImportSpecifier */ && contextToken2 === parent2.name && contextToken2.text === "type") {
return false;
}
break;
case 86 /* ClassKeyword */:
case 94 /* EnumKeyword */:
case 120 /* InterfaceKeyword */:
case 100 /* FunctionKeyword */:
case 115 /* VarKeyword */:
case 102 /* ImportKeyword */:
case 121 /* LetKeyword */:
case 87 /* ConstKeyword */:
case 140 /* InferKeyword */:
return true;
case 156 /* TypeKeyword */:
return containingNodeKind !== 275 /* ImportSpecifier */;
case 42 /* AsteriskToken */:
return isFunctionLike(contextToken2.parent) && !isMethodDeclaration(contextToken2.parent);
}
if (isClassMemberCompletionKeyword(keywordForNode(contextToken2)) && isFromObjectTypeDeclaration(contextToken2)) {
return false;
}
if (isConstructorParameterCompletion(contextToken2)) {
if (!isIdentifier(contextToken2) || isParameterPropertyModifier(keywordForNode(contextToken2)) || isCurrentlyEditingNode(contextToken2)) {
return false;
}
}
switch (keywordForNode(contextToken2)) {
case 128 /* AbstractKeyword */:
case 86 /* ClassKeyword */:
case 87 /* ConstKeyword */:
case 138 /* DeclareKeyword */:
case 94 /* EnumKeyword */:
case 100 /* FunctionKeyword */:
case 120 /* InterfaceKeyword */:
case 121 /* LetKeyword */:
case 123 /* PrivateKeyword */:
case 124 /* ProtectedKeyword */:
case 125 /* PublicKeyword */:
case 126 /* StaticKeyword */:
case 115 /* VarKeyword */:
return true;
case 134 /* AsyncKeyword */:
return isPropertyDeclaration(contextToken2.parent);
}
const ancestorClassLike = findAncestor(contextToken2.parent, isClassLike);
if (ancestorClassLike && contextToken2 === previousToken && isPreviousPropertyDeclarationTerminated(contextToken2, position)) {
return false;
}
const ancestorPropertyDeclaraion = getAncestor(contextToken2.parent, 171 /* PropertyDeclaration */);
if (ancestorPropertyDeclaraion && contextToken2 !== previousToken && isClassLike(previousToken.parent.parent) && position <= previousToken.end) {
if (isPreviousPropertyDeclarationTerminated(contextToken2, previousToken.end)) {
return false;
} else if (contextToken2.kind !== 64 /* EqualsToken */ && (isInitializedProperty(ancestorPropertyDeclaraion) || hasType(ancestorPropertyDeclaraion))) {
return true;
}
}
return isDeclarationName(contextToken2) && !isShorthandPropertyAssignment(contextToken2.parent) && !isJsxAttribute(contextToken2.parent) && !((isClassLike(contextToken2.parent) || isInterfaceDeclaration(contextToken2.parent) || isTypeParameterDeclaration(contextToken2.parent)) && (contextToken2 !== previousToken || position > previousToken.end));
}
function isPreviousPropertyDeclarationTerminated(contextToken2, position2) {
return contextToken2.kind !== 64 /* EqualsToken */ && (contextToken2.kind === 27 /* SemicolonToken */ || !positionsAreOnSameLine(contextToken2.end, position2, sourceFile));
}
function isFunctionLikeButNotConstructor(kind) {
return isFunctionLikeKind(kind) && kind !== 175 /* Constructor */;
}
function isDotOfNumericLiteral(contextToken2) {
if (contextToken2.kind === 9 /* NumericLiteral */) {
const text = contextToken2.getFullText();
return text.charAt(text.length - 1) === ".";
}
return false;
}
function isVariableDeclarationListButNotTypeArgument(node2) {
return node2.parent.kind === 260 /* VariableDeclarationList */ && !isPossiblyTypeArgumentPosition(node2, sourceFile, typeChecker);
}
function filterObjectMembersList(contextualMemberSymbols, existingMembers) {
if (existingMembers.length === 0) {
return contextualMemberSymbols;
}
const membersDeclaredBySpreadAssignment = /* @__PURE__ */ new Set();
const existingMemberNames = /* @__PURE__ */ new Set();
for (const m of existingMembers) {
if (m.kind !== 302 /* PropertyAssignment */ && m.kind !== 303 /* ShorthandPropertyAssignment */ && m.kind !== 207 /* BindingElement */ && m.kind !== 173 /* MethodDeclaration */ && m.kind !== 176 /* GetAccessor */ && m.kind !== 177 /* SetAccessor */ && m.kind !== 304 /* SpreadAssignment */) {
continue;
}
if (isCurrentlyEditingNode(m)) {
continue;
}
let existingName;
if (isSpreadAssignment(m)) {
setMembersDeclaredBySpreadAssignment(m, membersDeclaredBySpreadAssignment);
} else if (isBindingElement(m) && m.propertyName) {
if (m.propertyName.kind === 80 /* Identifier */) {
existingName = m.propertyName.escapedText;
}
} else {
const name = getNameOfDeclaration(m);
existingName = name && isPropertyNameLiteral(name) ? getEscapedTextOfIdentifierOrLiteral(name) : void 0;
}
if (existingName !== void 0) {
existingMemberNames.add(existingName);
}
}
const filteredSymbols = contextualMemberSymbols.filter((m) => !existingMemberNames.has(m.escapedName));
setSortTextToMemberDeclaredBySpreadAssignment(membersDeclaredBySpreadAssignment, filteredSymbols);
return filteredSymbols;
}
function setMembersDeclaredBySpreadAssignment(declaration, membersDeclaredBySpreadAssignment) {
const expression = declaration.expression;
const symbol = typeChecker.getSymbolAtLocation(expression);
const type = symbol && typeChecker.getTypeOfSymbolAtLocation(symbol, expression);
const properties = type && type.properties;
if (properties) {
properties.forEach((property) => {
membersDeclaredBySpreadAssignment.add(property.name);
});
}
}
function setSortTextToOptionalMember() {
symbols.forEach((m) => {
if (m.flags & 16777216 /* Optional */) {
const symbolId = getSymbolId(m);
symbolToSortTextMap[symbolId] = symbolToSortTextMap[symbolId] ?? SortText.OptionalMember;
}
});
}
function setSortTextToMemberDeclaredBySpreadAssignment(membersDeclaredBySpreadAssignment, contextualMemberSymbols) {
if (membersDeclaredBySpreadAssignment.size === 0) {
return;
}
for (const contextualMemberSymbol of contextualMemberSymbols) {
if (membersDeclaredBySpreadAssignment.has(contextualMemberSymbol.name)) {
symbolToSortTextMap[getSymbolId(contextualMemberSymbol)] = SortText.MemberDeclaredBySpreadAssignment;
}
}
}
function transformObjectLiteralMembersSortText(start3) {
for (let i = start3; i < symbols.length; i++) {
const symbol = symbols[i];
const symbolId = getSymbolId(symbol);
const origin = symbolToOriginInfoMap == null ? void 0 : symbolToOriginInfoMap[i];
const target = getEmitScriptTarget(compilerOptions);
const displayName = getCompletionEntryDisplayNameForSymbol(
symbol,
target,
origin,
0 /* ObjectPropertyDeclaration */,
/*jsxIdentifierExpected*/
false
);
if (displayName) {
const originalSortText = symbolToSortTextMap[symbolId] ?? SortText.LocationPriority;
const { name } = displayName;
symbolToSortTextMap[symbolId] = SortText.ObjectLiteralProperty(originalSortText, name);
}
}
}
function filterClassMembersList(baseSymbols, existingMembers, currentClassElementModifierFlags) {
const existingMemberNames = /* @__PURE__ */ new Set();
for (const m of existingMembers) {
if (m.kind !== 171 /* PropertyDeclaration */ && m.kind !== 173 /* MethodDeclaration */ && m.kind !== 176 /* GetAccessor */ && m.kind !== 177 /* SetAccessor */) {
continue;
}
if (isCurrentlyEditingNode(m)) {
continue;
}
if (hasEffectiveModifier(m, 8 /* Private */)) {
continue;
}
if (isStatic(m) !== !!(currentClassElementModifierFlags & 32 /* Static */)) {
continue;
}
const existingName = getPropertyNameForPropertyNameNode(m.name);
if (existingName) {
existingMemberNames.add(existingName);
}
}
return baseSymbols.filter((propertySymbol) => !existingMemberNames.has(propertySymbol.escapedName) && !!propertySymbol.declarations && !(getDeclarationModifierFlagsFromSymbol(propertySymbol) & 8 /* Private */) && !(propertySymbol.valueDeclaration && isPrivateIdentifierClassElementDeclaration(propertySymbol.valueDeclaration)));
}
function filterJsxAttributes(symbols2, attributes) {
const seenNames = /* @__PURE__ */ new Set();
const membersDeclaredBySpreadAssignment = /* @__PURE__ */ new Set();
for (const attr of attributes) {
if (isCurrentlyEditingNode(attr)) {
continue;
}
if (attr.kind === 290 /* JsxAttribute */) {
seenNames.add(getEscapedTextOfJsxAttributeName(attr.name));
} else if (isJsxSpreadAttribute(attr)) {
setMembersDeclaredBySpreadAssignment(attr, membersDeclaredBySpreadAssignment);
}
}
const filteredSymbols = symbols2.filter((a) => !seenNames.has(a.escapedName));
setSortTextToMemberDeclaredBySpreadAssignment(membersDeclaredBySpreadAssignment, filteredSymbols);
return filteredSymbols;
}
function isCurrentlyEditingNode(node2) {
return node2.getStart(sourceFile) <= position && position <= node2.getEnd();
}
}
function tryGetObjectLikeCompletionContainer(contextToken) {
if (contextToken) {
const { parent: parent2 } = contextToken;
switch (contextToken.kind) {
case 19 /* OpenBraceToken */:
case 28 /* CommaToken */:
if (isObjectLiteralExpression(parent2) || isObjectBindingPattern(parent2)) {
return parent2;
}
break;
case 42 /* AsteriskToken */:
return isMethodDeclaration(parent2) ? tryCast(parent2.parent, isObjectLiteralExpression) : void 0;
case 134 /* AsyncKeyword */:
return tryCast(parent2.parent, isObjectLiteralExpression);
case 80 /* Identifier */:
return contextToken.text === "async" && isShorthandPropertyAssignment(contextToken.parent) ? contextToken.parent.parent : void 0;
}
}
return void 0;
}
function getRelevantTokens(position, sourceFile) {
const previousToken = findPrecedingToken(position, sourceFile);
if (previousToken && position <= previousToken.end && (isMemberName(previousToken) || isKeyword(previousToken.kind))) {
const contextToken = findPrecedingToken(
previousToken.getFullStart(),
sourceFile,
/*startNode*/
void 0
);
return { contextToken, previousToken };
}
return { contextToken: previousToken, previousToken };
}
function getAutoImportSymbolFromCompletionEntryData(name, data, program, host) {
const containingProgram = data.isPackageJsonImport ? host.getPackageJsonAutoImportProvider() : program;
const checker = containingProgram.getTypeChecker();
const moduleSymbol = data.ambientModuleName ? checker.tryFindAmbientModule(data.ambientModuleName) : data.fileName ? checker.getMergedSymbol(Debug.checkDefined(containingProgram.getSourceFile(data.fileName)).symbol) : void 0;
if (!moduleSymbol)
return void 0;
let symbol = data.exportName === "export=" /* ExportEquals */ ? checker.resolveExternalModuleSymbol(moduleSymbol) : checker.tryGetMemberInModuleExportsAndProperties(data.exportName, moduleSymbol);
if (!symbol)
return void 0;
const isDefaultExport = data.exportName === "default" /* Default */;
symbol = isDefaultExport && getLocalSymbolForExportDefault(symbol) || symbol;
return { symbol, origin: completionEntryDataToSymbolOriginInfo(data, name, moduleSymbol) };
}
function getCompletionEntryDisplayNameForSymbol(symbol, target, origin, kind, jsxIdentifierExpected) {
if (originIsIgnore(origin)) {
return void 0;
}
const name = originIncludesSymbolName(origin) ? origin.symbolName : symbol.name;
if (name === void 0 || symbol.flags & 1536 /* Module */ && isSingleOrDoubleQuote(name.charCodeAt(0)) || isKnownSymbol(symbol)) {
return void 0;
}
const validNameResult = { name, needsConvertPropertyAccess: false };
if (isIdentifierText(name, target, jsxIdentifierExpected ? 1 /* JSX */ : 0 /* Standard */) || symbol.valueDeclaration && isPrivateIdentifierClassElementDeclaration(symbol.valueDeclaration)) {
return validNameResult;
}
switch (kind) {
case 3 /* MemberLike */:
return originIsComputedPropertyName(origin) ? { name: origin.symbolName, needsConvertPropertyAccess: false } : void 0;
case 0 /* ObjectPropertyDeclaration */:
return { name: JSON.stringify(name), needsConvertPropertyAccess: false };
case 2 /* PropertyAccess */:
case 1 /* Global */:
return name.charCodeAt(0) === 32 /* space */ ? void 0 : { name, needsConvertPropertyAccess: true };
case 5 /* None */:
case 4 /* String */:
return validNameResult;
default:
Debug.assertNever(kind);
}
}
var _keywordCompletions = [];
var allKeywordsCompletions = memoize(() => {
const res = [];
for (let i = 83 /* FirstKeyword */; i <= 164 /* LastKeyword */; i++) {
res.push({
name: tokenToString(i),
kind: "keyword" /* keyword */,
kindModifiers: "" /* none */,
sortText: SortText.GlobalsOrKeywords
});
}
return res;
});
function getKeywordCompletions(keywordFilter, filterOutTsOnlyKeywords) {
if (!filterOutTsOnlyKeywords)
return getTypescriptKeywordCompletions(keywordFilter);
const index = keywordFilter + 8 /* Last */ + 1;
return _keywordCompletions[index] || (_keywordCompletions[index] = getTypescriptKeywordCompletions(keywordFilter).filter((entry) => !isTypeScriptOnlyKeyword(stringToToken(entry.name))));
}
function getTypescriptKeywordCompletions(keywordFilter) {
return _keywordCompletions[keywordFilter] || (_keywordCompletions[keywordFilter] = allKeywordsCompletions().filter((entry) => {
const kind = stringToToken(entry.name);
switch (keywordFilter) {
case 0 /* None */:
return false;
case 1 /* All */:
return isFunctionLikeBodyKeyword(kind) || kind === 138 /* DeclareKeyword */ || kind === 144 /* ModuleKeyword */ || kind === 156 /* TypeKeyword */ || kind === 145 /* NamespaceKeyword */ || kind === 128 /* AbstractKeyword */ || isTypeKeyword(kind) && kind !== 157 /* UndefinedKeyword */;
case 5 /* FunctionLikeBodyKeywords */:
return isFunctionLikeBodyKeyword(kind);
case 2 /* ClassElementKeywords */:
return isClassMemberCompletionKeyword(kind);
case 3 /* InterfaceElementKeywords */:
return isInterfaceOrTypeLiteralCompletionKeyword(kind);
case 4 /* ConstructorParameterKeywords */:
return isParameterPropertyModifier(kind);
case 6 /* TypeAssertionKeywords */:
return isTypeKeyword(kind) || kind === 87 /* ConstKeyword */;
case 7 /* TypeKeywords */:
return isTypeKeyword(kind);
case 8 /* TypeKeyword */:
return kind === 156 /* TypeKeyword */;
default:
return Debug.assertNever(keywordFilter);
}
}));
}
function isTypeScriptOnlyKeyword(kind) {
switch (kind) {
case 128 /* AbstractKeyword */:
case 133 /* AnyKeyword */:
case 162 /* BigIntKeyword */:
case 136 /* BooleanKeyword */:
case 138 /* DeclareKeyword */:
case 94 /* EnumKeyword */:
case 161 /* GlobalKeyword */:
case 119 /* ImplementsKeyword */:
case 140 /* InferKeyword */:
case 120 /* InterfaceKeyword */:
case 142 /* IsKeyword */:
case 143 /* KeyOfKeyword */:
case 144 /* ModuleKeyword */:
case 145 /* NamespaceKeyword */:
case 146 /* NeverKeyword */:
case 150 /* NumberKeyword */:
case 151 /* ObjectKeyword */:
case 163 /* OverrideKeyword */:
case 123 /* PrivateKeyword */:
case 124 /* ProtectedKeyword */:
case 125 /* PublicKeyword */:
case 148 /* ReadonlyKeyword */:
case 154 /* StringKeyword */:
case 155 /* SymbolKeyword */:
case 156 /* TypeKeyword */:
case 158 /* UniqueKeyword */:
case 159 /* UnknownKeyword */:
return true;
default:
return false;
}
}
function isInterfaceOrTypeLiteralCompletionKeyword(kind) {
return kind === 148 /* ReadonlyKeyword */;
}
function isClassMemberCompletionKeyword(kind) {
switch (kind) {
case 128 /* AbstractKeyword */:
case 129 /* AccessorKeyword */:
case 137 /* ConstructorKeyword */:
case 139 /* GetKeyword */:
case 153 /* SetKeyword */:
case 134 /* AsyncKeyword */:
case 138 /* DeclareKeyword */:
case 163 /* OverrideKeyword */:
return true;
default:
return isClassMemberModifier(kind);
}
}
function isFunctionLikeBodyKeyword(kind) {
return kind === 134 /* AsyncKeyword */ || kind === 135 /* AwaitKeyword */ || kind === 130 /* AsKeyword */ || kind === 152 /* SatisfiesKeyword */ || kind === 156 /* TypeKeyword */ || !isContextualKeyword(kind) && !isClassMemberCompletionKeyword(kind);
}
function keywordForNode(node) {
return isIdentifier(node) ? identifierToKeywordKind(node) ?? 0 /* Unknown */ : node.kind;
}
function getContextualKeywords(contextToken, position) {
const entries = [];
if (contextToken) {
const file = contextToken.getSourceFile();
const parent2 = contextToken.parent;
const tokenLine = file.getLineAndCharacterOfPosition(contextToken.end).line;
const currentLine = file.getLineAndCharacterOfPosition(position).line;
if ((isImportDeclaration(parent2) || isExportDeclaration(parent2) && parent2.moduleSpecifier) && contextToken === parent2.moduleSpecifier && tokenLine === currentLine) {
entries.push({
name: tokenToString(132 /* AssertKeyword */),
kind: "keyword" /* keyword */,
kindModifiers: "" /* none */,
sortText: SortText.GlobalsOrKeywords
});
}
}
return entries;
}
function getJsDocTagAtPosition(node, position) {
return findAncestor(node, (n) => isJSDocTag(n) && rangeContainsPosition(n, position) ? true : isJSDoc(n) ? "quit" : false);
}
function getPropertiesForObjectExpression(contextualType, completionsType, obj, checker) {
const hasCompletionsType = completionsType && completionsType !== contextualType;
const type = hasCompletionsType && !(completionsType.flags & 3 /* AnyOrUnknown */) ? checker.getUnionType([contextualType, completionsType]) : contextualType;
const properties = getApparentProperties(type, obj, checker);
return type.isClass() && containsNonPublicProperties(properties) ? [] : hasCompletionsType ? filter(properties, hasDeclarationOtherThanSelf) : properties;
function hasDeclarationOtherThanSelf(member) {
if (!length(member.declarations))
return true;
return some(member.declarations, (decl) => decl.parent !== obj);
}
}
function getApparentProperties(type, node, checker) {
if (!type.isUnion())
return type.getApparentProperties();
return checker.getAllPossiblePropertiesOfTypes(filter(type.types, (memberType) => !(memberType.flags & 402784252 /* Primitive */ || checker.isArrayLikeType(memberType) || checker.isTypeInvalidDueToUnionDiscriminant(memberType, node) || checker.typeHasCallOrConstructSignatures(memberType) || memberType.isClass() && containsNonPublicProperties(memberType.getApparentProperties()))));
}
function containsNonPublicProperties(props) {
return some(props, (p) => !!(getDeclarationModifierFlagsFromSymbol(p) & 24 /* NonPublicAccessibilityModifier */));
}
function getPropertiesForCompletion(type, checker) {
return type.isUnion() ? Debug.checkEachDefined(checker.getAllPossiblePropertiesOfTypes(type.types), "getAllPossiblePropertiesOfTypes() should all be defined") : Debug.checkEachDefined(type.getApparentProperties(), "getApparentProperties() should all be defined");
}
function tryGetObjectTypeDeclarationCompletionContainer(sourceFile, contextToken, location, position) {
switch (location.kind) {
case 357 /* SyntaxList */:
return tryCast(location.parent, isObjectTypeDeclaration);
case 1 /* EndOfFileToken */:
const cls = tryCast(lastOrUndefined(cast(location.parent, isSourceFile).statements), isObjectTypeDeclaration);
if (cls && !findChildOfKind(cls, 20 /* CloseBraceToken */, sourceFile)) {
return cls;
}
break;
case 80 /* Identifier */: {
const originalKeywordKind = identifierToKeywordKind(location);
if (originalKeywordKind) {
return void 0;
}
if (isPropertyDeclaration(location.parent) && location.parent.initializer === location) {
return void 0;
}
if (isFromObjectTypeDeclaration(location)) {
return findAncestor(location, isObjectTypeDeclaration);
}
}
}
if (!contextToken)
return void 0;
if (location.kind === 137 /* ConstructorKeyword */ || isIdentifier(contextToken) && isPropertyDeclaration(contextToken.parent) && isClassLike(location)) {
return findAncestor(contextToken, isClassLike);
}
switch (contextToken.kind) {
case 64 /* EqualsToken */:
return void 0;
case 27 /* SemicolonToken */:
case 20 /* CloseBraceToken */:
return isFromObjectTypeDeclaration(location) && location.parent.name === location ? location.parent.parent : tryCast(location, isObjectTypeDeclaration);
case 19 /* OpenBraceToken */:
case 28 /* CommaToken */:
return tryCast(contextToken.parent, isObjectTypeDeclaration);
default:
if (isObjectTypeDeclaration(location)) {
if (getLineAndCharacterOfPosition(sourceFile, contextToken.getEnd()).line !== getLineAndCharacterOfPosition(sourceFile, position).line) {
return location;
}
const isValidKeyword = isClassLike(contextToken.parent.parent) ? isClassMemberCompletionKeyword : isInterfaceOrTypeLiteralCompletionKeyword;
return isValidKeyword(contextToken.kind) || contextToken.kind === 42 /* AsteriskToken */ || isIdentifier(contextToken) && isValidKeyword(identifierToKeywordKind(contextToken) ?? 0 /* Unknown */) ? contextToken.parent.parent : void 0;
}
return void 0;
}
}
function tryGetTypeLiteralNode(node) {
if (!node)
return void 0;
const parent2 = node.parent;
switch (node.kind) {
case 19 /* OpenBraceToken */:
if (isTypeLiteralNode(parent2)) {
return parent2;
}
break;
case 27 /* SemicolonToken */:
case 28 /* CommaToken */:
case 80 /* Identifier */:
if (parent2.kind === 170 /* PropertySignature */ && isTypeLiteralNode(parent2.parent)) {
return parent2.parent;
}
break;
}
return void 0;
}
function getConstraintOfTypeArgumentProperty(node, checker) {
if (!node)
return void 0;
if (isTypeNode(node) && isTypeReferenceType(node.parent)) {
return checker.getTypeArgumentConstraint(node);
}
const t = getConstraintOfTypeArgumentProperty(node.parent, checker);
if (!t)
return void 0;
switch (node.kind) {
case 170 /* PropertySignature */:
return checker.getTypeOfPropertyOfContextualType(t, node.symbol.escapedName);
case 192 /* IntersectionType */:
case 186 /* TypeLiteral */:
case 191 /* UnionType */:
return t;
}
}
function isFromObjectTypeDeclaration(node) {
return node.parent && isClassOrTypeElement(node.parent) && isObjectTypeDeclaration(node.parent.parent);
}
function isValidTrigger(sourceFile, triggerCharacter, contextToken, position) {
switch (triggerCharacter) {
case ".":
case "@":
return true;
case '"':
case "'":
case "`":
return !!contextToken && isStringLiteralOrTemplate(contextToken) && position === contextToken.getStart(sourceFile) + 1;
case "#":
return !!contextToken && isPrivateIdentifier(contextToken) && !!getContainingClass(contextToken);
case "<":
return !!contextToken && contextToken.kind === 30 /* LessThanToken */ && (!isBinaryExpression(contextToken.parent) || binaryExpressionMayBeOpenTag(contextToken.parent));
case "/":
return !!contextToken && (isStringLiteralLike(contextToken) ? !!tryGetImportFromModuleSpecifier(contextToken) : contextToken.kind === 44 /* SlashToken */ && isJsxClosingElement(contextToken.parent));
case " ":
return !!contextToken && isImportKeyword(contextToken) && contextToken.parent.kind === 311 /* SourceFile */;
default:
return Debug.assertNever(triggerCharacter);
}
}
function binaryExpressionMayBeOpenTag({ left }) {
return nodeIsMissing(left);
}
function isProbablyGlobalType(type, sourceFile, checker) {
const selfSymbol = checker.resolveName(
"self",
/*location*/
void 0,
111551 /* Value */,
/*excludeGlobals*/
false
);
if (selfSymbol && checker.getTypeOfSymbolAtLocation(selfSymbol, sourceFile) === type) {
return true;
}
const globalSymbol = checker.resolveName(
"global",
/*location*/
void 0,
111551 /* Value */,
/*excludeGlobals*/
false
);
if (globalSymbol && checker.getTypeOfSymbolAtLocation(globalSymbol, sourceFile) === type) {
return true;
}
const globalThisSymbol = checker.resolveName(
"globalThis",
/*location*/
void 0,
111551 /* Value */,
/*excludeGlobals*/
false
);
if (globalThisSymbol && checker.getTypeOfSymbolAtLocation(globalThisSymbol, sourceFile) === type) {
return true;
}
return false;
}
function isStaticProperty(symbol) {
return !!(symbol.valueDeclaration && getEffectiveModifierFlags(symbol.valueDeclaration) & 32 /* Static */ && isClassLike(symbol.valueDeclaration.parent));
}
function tryGetObjectLiteralContextualType(node, typeChecker) {
const type = typeChecker.getContextualType(node);
if (type) {
return type;
}
const parent2 = walkUpParenthesizedExpressions(node.parent);
if (isBinaryExpression(parent2) && parent2.operatorToken.kind === 64 /* EqualsToken */ && node === parent2.left) {
return typeChecker.getTypeAtLocation(parent2);
}
if (isExpression(parent2)) {
return typeChecker.getContextualType(parent2);
}
return void 0;
}
function getImportStatementCompletionInfo(contextToken) {
var _a, _b, _c;
let keywordCompletion;
let isKeywordOnlyCompletion = false;
const candidate = getCandidate();
return {
isKeywordOnlyCompletion,
keywordCompletion,
isNewIdentifierLocation: !!(candidate || keywordCompletion === 156 /* TypeKeyword */),
isTopLevelTypeOnly: !!((_b = (_a = tryCast(candidate, isImportDeclaration)) == null ? void 0 : _a.importClause) == null ? void 0 : _b.isTypeOnly) || !!((_c = tryCast(candidate, isImportEqualsDeclaration)) == null ? void 0 : _c.isTypeOnly),
couldBeTypeOnlyImportSpecifier: !!candidate && couldBeTypeOnlyImportSpecifier(candidate, contextToken),
replacementSpan: getSingleLineReplacementSpanForImportCompletionNode(candidate)
};
function getCandidate() {
const parent2 = contextToken.parent;
if (isImportEqualsDeclaration(parent2)) {
keywordCompletion = contextToken.kind === 156 /* TypeKeyword */ ? void 0 : 156 /* TypeKeyword */;
return isModuleSpecifierMissingOrEmpty(parent2.moduleReference) ? parent2 : void 0;
}
if (couldBeTypeOnlyImportSpecifier(parent2, contextToken) && canCompleteFromNamedBindings(parent2.parent)) {
return parent2;
}
if (isNamedImports(parent2) || isNamespaceImport(parent2)) {
if (!parent2.parent.isTypeOnly && (contextToken.kind === 19 /* OpenBraceToken */ || contextToken.kind === 102 /* ImportKeyword */ || contextToken.kind === 28 /* CommaToken */)) {
keywordCompletion = 156 /* TypeKeyword */;
}
if (canCompleteFromNamedBindings(parent2)) {
if (contextToken.kind === 20 /* CloseBraceToken */ || contextToken.kind === 80 /* Identifier */) {
isKeywordOnlyCompletion = true;
keywordCompletion = 160 /* FromKeyword */;
} else {
return parent2.parent.parent;
}
}
return void 0;
}
if (isImportKeyword(contextToken) && isSourceFile(parent2)) {
keywordCompletion = 156 /* TypeKeyword */;
return contextToken;
}
if (isImportKeyword(contextToken) && isImportDeclaration(parent2)) {
keywordCompletion = 156 /* TypeKeyword */;
return isModuleSpecifierMissingOrEmpty(parent2.moduleSpecifier) ? parent2 : void 0;
}
return void 0;
}
}
function getSingleLineReplacementSpanForImportCompletionNode(node) {
var _a;
if (!node)
return void 0;
const top = findAncestor(node, or(isImportDeclaration, isImportEqualsDeclaration)) ?? node;
const sourceFile = top.getSourceFile();
if (rangeIsOnSingleLine(top, sourceFile)) {
return createTextSpanFromNode(top, sourceFile);
}
Debug.assert(top.kind !== 102 /* ImportKeyword */ && top.kind !== 275 /* ImportSpecifier */);
const potentialSplitPoint = top.kind === 271 /* ImportDeclaration */ ? getPotentiallyInvalidImportSpecifier((_a = top.importClause) == null ? void 0 : _a.namedBindings) ?? top.moduleSpecifier : top.moduleReference;
const withoutModuleSpecifier = {
pos: top.getFirstToken().getStart(),
end: potentialSplitPoint.pos
};
if (rangeIsOnSingleLine(withoutModuleSpecifier, sourceFile)) {
return createTextSpanFromRange(withoutModuleSpecifier);
}
}
function getPotentiallyInvalidImportSpecifier(namedBindings) {
var _a;
return find(
(_a = tryCast(namedBindings, isNamedImports)) == null ? void 0 : _a.elements,
(e) => {
var _a2;
return !e.propertyName && isStringANonContextualKeyword(e.name.text) && ((_a2 = findPrecedingToken(e.name.pos, namedBindings.getSourceFile(), namedBindings)) == null ? void 0 : _a2.kind) !== 28 /* CommaToken */;
}
);
}
function couldBeTypeOnlyImportSpecifier(importSpecifier, contextToken) {
return isImportSpecifier(importSpecifier) && (importSpecifier.isTypeOnly || contextToken === importSpecifier.name && isTypeKeywordTokenOrIdentifier(contextToken));
}
function canCompleteFromNamedBindings(namedBindings) {
if (!isModuleSpecifierMissingOrEmpty(namedBindings.parent.parent.moduleSpecifier) || namedBindings.parent.name) {
return false;
}
if (isNamedImports(namedBindings)) {
const invalidNamedImport = getPotentiallyInvalidImportSpecifier(namedBindings);
const validImports = invalidNamedImport ? namedBindings.elements.indexOf(invalidNamedImport) : namedBindings.elements.length;
return validImports < 2;
}
return true;
}
function isModuleSpecifierMissingOrEmpty(specifier) {
var _a;
if (nodeIsMissing(specifier))
return true;
return !((_a = tryCast(isExternalModuleReference(specifier) ? specifier.expression : specifier, isStringLiteralLike)) == null ? void 0 : _a.text);
}
function getVariableOrParameterDeclaration(contextToken, location) {
if (!contextToken)
return;
const possiblyParameterDeclaration = findAncestor(contextToken, (node) => isFunctionBlock(node) || isArrowFunctionBody(node) || isBindingPattern(node) ? "quit" : (isParameter(node) || isTypeParameterDeclaration(node)) && !isIndexSignatureDeclaration(node.parent));
const possiblyVariableDeclaration = findAncestor(location, (node) => isFunctionBlock(node) || isArrowFunctionBody(node) || isBindingPattern(node) ? "quit" : isVariableDeclaration(node));
return possiblyParameterDeclaration || possiblyVariableDeclaration;
}
function isArrowFunctionBody(node) {
return node.parent && isArrowFunction(node.parent) && (node.parent.body === node || // const a = () => /**/;
node.kind === 39 /* EqualsGreaterThanToken */);
}
function symbolCanBeReferencedAtTypeLocation(symbol, checker, seenModules = /* @__PURE__ */ new Map()) {
return nonAliasCanBeReferencedAtTypeLocation(symbol) || nonAliasCanBeReferencedAtTypeLocation(skipAlias(symbol.exportSymbol || symbol, checker));
function nonAliasCanBeReferencedAtTypeLocation(symbol2) {
return !!(symbol2.flags & 788968 /* Type */) || checker.isUnknownSymbol(symbol2) || !!(symbol2.flags & 1536 /* Module */) && addToSeen(seenModules, getSymbolId(symbol2)) && checker.getExportsOfModule(symbol2).some((e) => symbolCanBeReferencedAtTypeLocation(e, checker, seenModules));
}
}
function isDeprecated(symbol, checker) {
const declarations = skipAlias(symbol, checker).declarations;
return !!length(declarations) && every(declarations, isDeprecatedDeclaration);
}
function charactersFuzzyMatchInString(identifierString, lowercaseCharacters) {
if (lowercaseCharacters.length === 0) {
return true;
}
let matchedFirstCharacter = false;
let prevChar;
let characterIndex = 0;
const len = identifierString.length;
for (let strIndex = 0; strIndex < len; strIndex++) {
const strChar = identifierString.charCodeAt(strIndex);
const testChar = lowercaseCharacters.charCodeAt(characterIndex);
if (strChar === testChar || strChar === toUpperCharCode(testChar)) {
matchedFirstCharacter || (matchedFirstCharacter = prevChar === void 0 || // Beginning of word
97 /* a */ <= prevChar && prevChar <= 122 /* z */ && 65 /* A */ <= strChar && strChar <= 90 /* Z */ || // camelCase transition
prevChar === 95 /* _ */ && strChar !== 95 /* _ */);
if (matchedFirstCharacter) {
characterIndex++;
}
if (characterIndex === lowercaseCharacters.length) {
return true;
}
}
prevChar = strChar;
}
return false;
}
function toUpperCharCode(charCode) {
if (97 /* a */ <= charCode && charCode <= 122 /* z */) {
return charCode - 32;
}
return charCode;
}
// src/services/_namespaces/ts.Completions.StringCompletions.ts
var ts_Completions_StringCompletions_exports = {};
__export(ts_Completions_StringCompletions_exports, {
getStringLiteralCompletionDetails: () => getStringLiteralCompletionDetails,
getStringLiteralCompletions: () => getStringLiteralCompletions
});
// src/services/stringCompletions.ts
var kindPrecedence = {
["directory" /* directory */]: 0,
["script" /* scriptElement */]: 1,
["external module name" /* externalModuleName */]: 2
};
function createNameAndKindSet() {
const map2 = /* @__PURE__ */ new Map();
function add(value) {
const existing = map2.get(value.name);
if (!existing || kindPrecedence[existing.kind] < kindPrecedence[value.kind]) {
map2.set(value.name, value);
}
}
return {
add,
has: map2.has.bind(map2),
values: map2.values.bind(map2)
};
}
function getStringLiteralCompletions(sourceFile, position, contextToken, options, host, program, log, preferences, includeSymbol) {
if (isInReferenceComment(sourceFile, position)) {
const entries = getTripleSlashReferenceCompletion(sourceFile, position, options, host);
return entries && convertPathCompletions(entries);
}
if (isInString(sourceFile, position, contextToken)) {
if (!contextToken || !isStringLiteralLike(contextToken))
return void 0;
const entries = getStringLiteralCompletionEntries(sourceFile, contextToken, position, program.getTypeChecker(), options, host, preferences);
return convertStringLiteralCompletions(entries, contextToken, sourceFile, host, program, log, options, preferences, position, includeSymbol);
}
}
function convertStringLiteralCompletions(completion, contextToken, sourceFile, host, program, log, options, preferences, position, includeSymbol) {
if (completion === void 0) {
return void 0;
}
const optionalReplacementSpan = createTextSpanFromStringLiteralLikeContent(contextToken);
switch (completion.kind) {
case 0 /* Paths */:
return convertPathCompletions(completion.paths);
case 1 /* Properties */: {
const entries = createSortedArray();
getCompletionEntriesFromSymbols(
completion.symbols,
entries,
contextToken,
contextToken,
sourceFile,
position,
sourceFile,
host,
program,
99 /* ESNext */,
log,
4 /* String */,
preferences,
options,
/*formatContext*/
void 0,
/*isTypeOnlyLocation*/
void 0,
/*propertyAccessToConvert*/
void 0,
/*jsxIdentifierExpected*/
void 0,
/*isJsxInitializer*/
void 0,
/*importStatementCompletion*/
void 0,
/*recommendedCompletion*/
void 0,
/*symbolToOriginInfoMap*/
void 0,
/*symbolToSortTextMap*/
void 0,
/*isJsxIdentifierExpected*/
void 0,
/*isRightOfOpenTag*/
void 0,
includeSymbol
);
return { isGlobalCompletion: false, isMemberCompletion: true, isNewIdentifierLocation: completion.hasIndexSignature, optionalReplacementSpan, entries };
}
case 2 /* Types */: {
const entries = completion.types.map((type) => ({
name: type.value,
kindModifiers: "" /* none */,
kind: "string" /* string */,
sortText: SortText.LocationPriority,
replacementSpan: getReplacementSpanForContextToken(contextToken)
}));
return { isGlobalCompletion: false, isMemberCompletion: false, isNewIdentifierLocation: completion.isNewIdentifier, optionalReplacementSpan, entries };
}
default:
return Debug.assertNever(completion);
}
}
function getStringLiteralCompletionDetails(name, sourceFile, position, contextToken, checker, options, host, cancellationToken, preferences) {
if (!contextToken || !isStringLiteralLike(contextToken))
return void 0;
const completions = getStringLiteralCompletionEntries(sourceFile, contextToken, position, checker, options, host, preferences);
return completions && stringLiteralCompletionDetails(name, contextToken, completions, sourceFile, checker, cancellationToken);
}
function stringLiteralCompletionDetails(name, location, completion, sourceFile, checker, cancellationToken) {
switch (completion.kind) {
case 0 /* Paths */: {
const match = find(completion.paths, (p) => p.name === name);
return match && createCompletionDetails(name, kindModifiersFromExtension(match.extension), match.kind, [textPart(name)]);
}
case 1 /* Properties */: {
const match = find(completion.symbols, (s) => s.name === name);
return match && createCompletionDetailsForSymbol(match, match.name, checker, sourceFile, location, cancellationToken);
}
case 2 /* Types */:
return find(completion.types, (t) => t.value === name) ? createCompletionDetails(name, "" /* none */, "string" /* string */, [textPart(name)]) : void 0;
default:
return Debug.assertNever(completion);
}
}
function convertPathCompletions(pathCompletions) {
const isGlobalCompletion = false;
const isNewIdentifierLocation = true;
const entries = pathCompletions.map(({ name, kind, span, extension }) => ({ name, kind, kindModifiers: kindModifiersFromExtension(extension), sortText: SortText.LocationPriority, replacementSpan: span }));
return { isGlobalCompletion, isMemberCompletion: false, isNewIdentifierLocation, entries };
}
function kindModifiersFromExtension(extension) {
switch (extension) {
case ".d.ts" /* Dts */:
return ".d.ts" /* dtsModifier */;
case ".js" /* Js */:
return ".js" /* jsModifier */;
case ".json" /* Json */:
return ".json" /* jsonModifier */;
case ".jsx" /* Jsx */:
return ".jsx" /* jsxModifier */;
case ".ts" /* Ts */:
return ".ts" /* tsModifier */;
case ".tsx" /* Tsx */:
return ".tsx" /* tsxModifier */;
case ".d.mts" /* Dmts */:
return ".d.mts" /* dmtsModifier */;
case ".mjs" /* Mjs */:
return ".mjs" /* mjsModifier */;
case ".mts" /* Mts */:
return ".mts" /* mtsModifier */;
case ".d.cts" /* Dcts */:
return ".d.cts" /* dctsModifier */;
case ".cjs" /* Cjs */:
return ".cjs" /* cjsModifier */;
case ".cts" /* Cts */:
return ".cts" /* ctsModifier */;
case ".tsbuildinfo" /* TsBuildInfo */:
return Debug.fail(`Extension ${".tsbuildinfo" /* TsBuildInfo */} is unsupported.`);
case void 0:
return "" /* none */;
default:
return Debug.assertNever(extension);
}
}
function getStringLiteralCompletionEntries(sourceFile, node, position, typeChecker, compilerOptions, host, preferences) {
const parent2 = walkUpParentheses(node.parent);
switch (parent2.kind) {
case 200 /* LiteralType */: {
const grandParent = walkUpParentheses(parent2.parent);
if (grandParent.kind === 204 /* ImportType */) {
return { kind: 0 /* Paths */, paths: getStringLiteralCompletionsFromModuleNames(sourceFile, node, compilerOptions, host, typeChecker, preferences) };
}
return fromUnionableLiteralType(grandParent);
}
case 302 /* PropertyAssignment */:
if (isObjectLiteralExpression(parent2.parent) && parent2.name === node) {
return stringLiteralCompletionsForObjectLiteral(typeChecker, parent2.parent);
}
return fromContextualType() || fromContextualType(0 /* None */);
case 211 /* ElementAccessExpression */: {
const { expression, argumentExpression } = parent2;
if (node === skipParentheses(argumentExpression)) {
return stringLiteralCompletionsFromProperties(typeChecker.getTypeAtLocation(expression));
}
return void 0;
}
case 212 /* CallExpression */:
case 213 /* NewExpression */:
case 290 /* JsxAttribute */:
if (!isRequireCallArgument(node) && !isImportCall(parent2)) {
const argumentInfo = ts_SignatureHelp_exports.getArgumentInfoForCompletions(parent2.kind === 290 /* JsxAttribute */ ? parent2.parent : node, position, sourceFile);
return argumentInfo && getStringLiteralCompletionsFromSignature(argumentInfo.invocation, node, argumentInfo, typeChecker) || fromContextualType(0 /* None */);
}
case 271 /* ImportDeclaration */:
case 277 /* ExportDeclaration */:
case 282 /* ExternalModuleReference */:
return { kind: 0 /* Paths */, paths: getStringLiteralCompletionsFromModuleNames(sourceFile, node, compilerOptions, host, typeChecker, preferences) };
case 295 /* CaseClause */:
const tracker = newCaseClauseTracker(typeChecker, parent2.parent.clauses);
const contextualTypes = fromContextualType();
if (!contextualTypes) {
return;
}
const literals = contextualTypes.types.filter((literal) => !tracker.hasValue(literal.value));
return { kind: 2 /* Types */, types: literals, isNewIdentifier: false };
default:
return fromContextualType() || fromContextualType(0 /* None */);
}
function fromUnionableLiteralType(grandParent) {
switch (grandParent.kind) {
case 232 /* ExpressionWithTypeArguments */:
case 182 /* TypeReference */: {
const typeArgument = findAncestor(parent2, (n) => n.parent === grandParent);
if (typeArgument) {
return { kind: 2 /* Types */, types: getStringLiteralTypes(typeChecker.getTypeArgumentConstraint(typeArgument)), isNewIdentifier: false };
}
return void 0;
}
case 198 /* IndexedAccessType */:
const { indexType, objectType } = grandParent;
if (!rangeContainsPosition(indexType, position)) {
return void 0;
}
return stringLiteralCompletionsFromProperties(typeChecker.getTypeFromTypeNode(objectType));
case 191 /* UnionType */: {
const result = fromUnionableLiteralType(walkUpParentheses(grandParent.parent));
if (!result) {
return void 0;
}
const alreadyUsedTypes = getAlreadyUsedTypesInStringLiteralUnion(grandParent, parent2);
if (result.kind === 1 /* Properties */) {
return { kind: 1 /* Properties */, symbols: result.symbols.filter((sym) => !contains(alreadyUsedTypes, sym.name)), hasIndexSignature: result.hasIndexSignature };
}
return { kind: 2 /* Types */, types: result.types.filter((t) => !contains(alreadyUsedTypes, t.value)), isNewIdentifier: false };
}
default:
return void 0;
}
}
function fromContextualType(contextFlags = 4 /* Completions */) {
const types = getStringLiteralTypes(getContextualTypeFromParent(node, typeChecker, contextFlags));
if (!types.length) {
return;
}
return { kind: 2 /* Types */, types, isNewIdentifier: false };
}
}
function walkUpParentheses(node) {
switch (node.kind) {
case 195 /* ParenthesizedType */:
return walkUpParenthesizedTypes(node);
case 216 /* ParenthesizedExpression */:
return walkUpParenthesizedExpressions(node);
default:
return node;
}
}
function getAlreadyUsedTypesInStringLiteralUnion(union, current) {
return mapDefined(union.types, (type) => type !== current && isLiteralTypeNode(type) && isStringLiteral(type.literal) ? type.literal.text : void 0);
}
function getStringLiteralCompletionsFromSignature(call, arg, argumentInfo, checker) {
let isNewIdentifier = false;
const uniques = /* @__PURE__ */ new Map();
const candidates = [];
const editingArgument = isJsxOpeningLikeElement(call) ? Debug.checkDefined(findAncestor(arg.parent, isJsxAttribute)) : arg;
checker.getResolvedSignatureForStringLiteralCompletions(call, editingArgument, candidates);
const types = flatMap(candidates, (candidate) => {
if (!signatureHasRestParameter(candidate) && argumentInfo.argumentCount > candidate.parameters.length)
return;
let type = candidate.getTypeParameterAtPosition(argumentInfo.argumentIndex);
if (isJsxOpeningLikeElement(call)) {
const propType = checker.getTypeOfPropertyOfType(type, getTextOfJsxAttributeName(editingArgument.name));
if (propType) {
type = propType;
}
}
isNewIdentifier = isNewIdentifier || !!(type.flags & 4 /* String */);
return getStringLiteralTypes(type, uniques);
});
return length(types) ? { kind: 2 /* Types */, types, isNewIdentifier } : void 0;
}
function stringLiteralCompletionsFromProperties(type) {
return type && {
kind: 1 /* Properties */,
symbols: filter(type.getApparentProperties(), (prop) => !(prop.valueDeclaration && isPrivateIdentifierClassElementDeclaration(prop.valueDeclaration))),
hasIndexSignature: hasIndexSignature(type)
};
}
function stringLiteralCompletionsForObjectLiteral(checker, objectLiteralExpression) {
const contextualType = checker.getContextualType(objectLiteralExpression);
if (!contextualType)
return void 0;
const completionsType = checker.getContextualType(objectLiteralExpression, 4 /* Completions */);
const symbols = getPropertiesForObjectExpression(
contextualType,
completionsType,
objectLiteralExpression,
checker
);
return {
kind: 1 /* Properties */,
symbols,
hasIndexSignature: hasIndexSignature(contextualType)
};
}
function getStringLiteralTypes(type, uniques = /* @__PURE__ */ new Map()) {
if (!type)
return emptyArray;
type = skipConstraint(type);
return type.isUnion() ? flatMap(type.types, (t) => getStringLiteralTypes(t, uniques)) : type.isStringLiteral() && !(type.flags & 1024 /* EnumLiteral */) && addToSeen(uniques, type.value) ? [type] : emptyArray;
}
function nameAndKind(name, kind, extension) {
return { name, kind, extension };
}
function directoryResult(name) {
return nameAndKind(
name,
"directory" /* directory */,
/*extension*/
void 0
);
}
function addReplacementSpans(text, textStart, names) {
const span = getDirectoryFragmentTextSpan(text, textStart);
const wholeSpan = text.length === 0 ? void 0 : createTextSpan(textStart, text.length);
return names.map(({ name, kind, extension }) => Math.max(name.indexOf(directorySeparator), name.indexOf(altDirectorySeparator)) !== -1 ? { name, kind, extension, span: wholeSpan } : { name, kind, extension, span });
}
function getStringLiteralCompletionsFromModuleNames(sourceFile, node, compilerOptions, host, typeChecker, preferences) {
return addReplacementSpans(node.text, node.getStart(sourceFile) + 1, getStringLiteralCompletionsFromModuleNamesWorker(sourceFile, node, compilerOptions, host, typeChecker, preferences));
}
function getStringLiteralCompletionsFromModuleNamesWorker(sourceFile, node, compilerOptions, host, typeChecker, preferences) {
const literalValue = normalizeSlashes(node.text);
const mode = isStringLiteralLike(node) ? getModeForUsageLocation(sourceFile, node) : void 0;
const scriptPath = sourceFile.path;
const scriptDirectory = getDirectoryPath(scriptPath);
const extensionOptions = getExtensionOptions(compilerOptions, 1 /* ModuleSpecifier */, sourceFile, typeChecker, preferences, mode);
return isPathRelativeToScript(literalValue) || !compilerOptions.baseUrl && !compilerOptions.paths && (isRootedDiskPath(literalValue) || isUrl(literalValue)) ? getCompletionEntriesForRelativeModules(literalValue, scriptDirectory, compilerOptions, host, scriptPath, extensionOptions) : getCompletionEntriesForNonRelativeModules(literalValue, scriptDirectory, mode, compilerOptions, host, extensionOptions, typeChecker);
}
function getExtensionOptions(compilerOptions, referenceKind, importingSourceFile, typeChecker, preferences, resolutionMode) {
return {
extensionsToSearch: flatten(getSupportedExtensionsForModuleResolution(compilerOptions, typeChecker)),
referenceKind,
importingSourceFile,
endingPreference: preferences == null ? void 0 : preferences.importModuleSpecifierEnding,
resolutionMode
};
}
function getCompletionEntriesForRelativeModules(literalValue, scriptDirectory, compilerOptions, host, scriptPath, extensionOptions) {
if (compilerOptions.rootDirs) {
return getCompletionEntriesForDirectoryFragmentWithRootDirs(
compilerOptions.rootDirs,
literalValue,
scriptDirectory,
extensionOptions,
compilerOptions,
host,
scriptPath
);
} else {
return arrayFrom(getCompletionEntriesForDirectoryFragment(
literalValue,
scriptDirectory,
extensionOptions,
host,
/*moduleSpecifierIsRelative*/
false,
scriptPath
).values());
}
}
function getSupportedExtensionsForModuleResolution(compilerOptions, typeChecker) {
const ambientModulesExtensions = !typeChecker ? [] : mapDefined(
typeChecker.getAmbientModules(),
(module2) => {
const name = module2.name.slice(1, -1);
if (!name.startsWith("*.") || name.includes("/"))
return;
return name.slice(1);
}
);
const extensions = [...getSupportedExtensions(compilerOptions), ambientModulesExtensions];
const moduleResolution = getEmitModuleResolutionKind(compilerOptions);
return moduleResolutionUsesNodeModules(moduleResolution) ? getSupportedExtensionsWithJsonIfResolveJsonModule(compilerOptions, extensions) : extensions;
}
function getBaseDirectoriesFromRootDirs(rootDirs, basePath, scriptDirectory, ignoreCase) {
rootDirs = rootDirs.map((rootDirectory) => normalizePath(isRootedDiskPath(rootDirectory) ? rootDirectory : combinePaths(basePath, rootDirectory)));
const relativeDirectory = firstDefined(rootDirs, (rootDirectory) => containsPath(rootDirectory, scriptDirectory, basePath, ignoreCase) ? scriptDirectory.substr(rootDirectory.length) : void 0);
return deduplicate(
[...rootDirs.map((rootDirectory) => combinePaths(rootDirectory, relativeDirectory)), scriptDirectory],
equateStringsCaseSensitive,
compareStringsCaseSensitive
);
}
function getCompletionEntriesForDirectoryFragmentWithRootDirs(rootDirs, fragment, scriptDirectory, extensionOptions, compilerOptions, host, exclude) {
const basePath = compilerOptions.project || host.getCurrentDirectory();
const ignoreCase = !(host.useCaseSensitiveFileNames && host.useCaseSensitiveFileNames());
const baseDirectories = getBaseDirectoriesFromRootDirs(rootDirs, basePath, scriptDirectory, ignoreCase);
return flatMap(baseDirectories, (baseDirectory) => arrayFrom(getCompletionEntriesForDirectoryFragment(
fragment,
baseDirectory,
extensionOptions,
host,
/*moduleSpecifierIsRelative*/
true,
exclude
).values()));
}
function getCompletionEntriesForDirectoryFragment(fragment, scriptDirectory, extensionOptions, host, moduleSpecifierIsRelative, exclude, result = createNameAndKindSet()) {
var _a;
if (fragment === void 0) {
fragment = "";
}
fragment = normalizeSlashes(fragment);
if (!hasTrailingDirectorySeparator(fragment)) {
fragment = getDirectoryPath(fragment);
}
if (fragment === "") {
fragment = "." + directorySeparator;
}
fragment = ensureTrailingDirectorySeparator(fragment);
const absolutePath = resolvePath(scriptDirectory, fragment);
const baseDirectory = hasTrailingDirectorySeparator(absolutePath) ? absolutePath : getDirectoryPath(absolutePath);
if (!moduleSpecifierIsRelative) {
const packageJsonPath = findPackageJson(baseDirectory, host);
if (packageJsonPath) {
const packageJson = readJson(packageJsonPath, host);
const typesVersions = packageJson.typesVersions;
if (typeof typesVersions === "object") {
const versionPaths = (_a = getPackageJsonTypesVersionsPaths(typesVersions)) == null ? void 0 : _a.paths;
if (versionPaths) {
const packageDirectory = getDirectoryPath(packageJsonPath);
const pathInPackage = absolutePath.slice(ensureTrailingDirectorySeparator(packageDirectory).length);
if (addCompletionEntriesFromPaths(result, pathInPackage, packageDirectory, extensionOptions, host, versionPaths)) {
return result;
}
}
}
}
}
const ignoreCase = !(host.useCaseSensitiveFileNames && host.useCaseSensitiveFileNames());
if (!tryDirectoryExists(host, baseDirectory))
return result;
const files = tryReadDirectory(
host,
baseDirectory,
extensionOptions.extensionsToSearch,
/*exclude*/
void 0,
/*include*/
["./*"]
);
if (files) {
for (let filePath of files) {
filePath = normalizePath(filePath);
if (exclude && comparePaths(filePath, exclude, scriptDirectory, ignoreCase) === 0 /* EqualTo */) {
continue;
}
const { name, extension } = getFilenameWithExtensionOption(getBaseFileName(filePath), host.getCompilationSettings(), extensionOptions);
result.add(nameAndKind(name, "script" /* scriptElement */, extension));
}
}
const directories = tryGetDirectories(host, baseDirectory);
if (directories) {
for (const directory of directories) {
const directoryName = getBaseFileName(normalizePath(directory));
if (directoryName !== "@types") {
result.add(directoryResult(directoryName));
}
}
}
return result;
}
function getFilenameWithExtensionOption(name, compilerOptions, extensionOptions) {
const nonJsResult = ts_moduleSpecifiers_exports.tryGetRealFileNameForNonJsDeclarationFileName(name);
if (nonJsResult) {
return { name: nonJsResult, extension: tryGetExtensionFromPath2(nonJsResult) };
}
if (extensionOptions.referenceKind === 0 /* Filename */) {
return { name, extension: tryGetExtensionFromPath2(name) };
}
const endingPreference = getModuleSpecifierEndingPreference(extensionOptions.endingPreference, extensionOptions.resolutionMode, compilerOptions, extensionOptions.importingSourceFile);
if (endingPreference === 3 /* TsExtension */) {
if (fileExtensionIsOneOf(name, supportedTSImplementationExtensions)) {
return { name, extension: tryGetExtensionFromPath2(name) };
}
const outputExtension2 = ts_moduleSpecifiers_exports.tryGetJSExtensionForFile(name, compilerOptions);
return outputExtension2 ? { name: changeExtension(name, outputExtension2), extension: outputExtension2 } : { name, extension: tryGetExtensionFromPath2(name) };
}
if ((endingPreference === 0 /* Minimal */ || endingPreference === 1 /* Index */) && fileExtensionIsOneOf(name, [".js" /* Js */, ".jsx" /* Jsx */, ".ts" /* Ts */, ".tsx" /* Tsx */, ".d.ts" /* Dts */])) {
return { name: removeFileExtension(name), extension: tryGetExtensionFromPath2(name) };
}
const outputExtension = ts_moduleSpecifiers_exports.tryGetJSExtensionForFile(name, compilerOptions);
return outputExtension ? { name: changeExtension(name, outputExtension), extension: outputExtension } : { name, extension: tryGetExtensionFromPath2(name) };
}
function addCompletionEntriesFromPaths(result, fragment, baseDirectory, extensionOptions, host, paths) {
const getPatternsForKey = (key) => paths[key];
const comparePaths2 = (a, b) => {
const patternA = tryParsePattern(a);
const patternB = tryParsePattern(b);
const lengthA = typeof patternA === "object" ? patternA.prefix.length : a.length;
const lengthB = typeof patternB === "object" ? patternB.prefix.length : b.length;
return compareValues(lengthB, lengthA);
};
return addCompletionEntriesFromPathsOrExports(result, fragment, baseDirectory, extensionOptions, host, getOwnKeys(paths), getPatternsForKey, comparePaths2);
}
function addCompletionEntriesFromPathsOrExports(result, fragment, baseDirectory, extensionOptions, host, keys, getPatternsForKey, comparePaths2) {
let pathResults = [];
let matchedPath;
for (const key of keys) {
if (key === ".")
continue;
const keyWithoutLeadingDotSlash = key.replace(/^\.\//, "");
const patterns = getPatternsForKey(key);
if (patterns) {
const pathPattern = tryParsePattern(keyWithoutLeadingDotSlash);
if (!pathPattern)
continue;
const isMatch = typeof pathPattern === "object" && isPatternMatch(pathPattern, fragment);
const isLongestMatch = isMatch && (matchedPath === void 0 || comparePaths2(key, matchedPath) === -1 /* LessThan */);
if (isLongestMatch) {
matchedPath = key;
pathResults = pathResults.filter((r) => !r.matchedPattern);
}
if (typeof pathPattern === "string" || matchedPath === void 0 || comparePaths2(key, matchedPath) !== 1 /* GreaterThan */) {
pathResults.push({
matchedPattern: isMatch,
results: getCompletionsForPathMapping(keyWithoutLeadingDotSlash, patterns, fragment, baseDirectory, extensionOptions, host).map(({ name, kind, extension }) => nameAndKind(name, kind, extension))
});
}
}
}
pathResults.forEach((pathResult) => pathResult.results.forEach((r) => result.add(r)));
return matchedPath !== void 0;
}
function getCompletionEntriesForNonRelativeModules(fragment, scriptPath, mode, compilerOptions, host, extensionOptions, typeChecker) {
const { baseUrl, paths } = compilerOptions;
const result = createNameAndKindSet();
const moduleResolution = getEmitModuleResolutionKind(compilerOptions);
if (baseUrl) {
const absolute = normalizePath(combinePaths(host.getCurrentDirectory(), baseUrl));
getCompletionEntriesForDirectoryFragment(
fragment,
absolute,
extensionOptions,
host,
/*moduleSpecifierIsRelative*/
false,
/*exclude*/
void 0,
result
);
}
if (paths) {
const absolute = getPathsBasePath(compilerOptions, host);
addCompletionEntriesFromPaths(result, fragment, absolute, extensionOptions, host, paths);
}
const fragmentDirectory = getFragmentDirectory(fragment);
for (const ambientName of getAmbientModuleCompletions(fragment, fragmentDirectory, typeChecker)) {
result.add(nameAndKind(
ambientName,
"external module name" /* externalModuleName */,
/*extension*/
void 0
));
}
getCompletionEntriesFromTypings(host, compilerOptions, scriptPath, fragmentDirectory, extensionOptions, result);
if (moduleResolutionUsesNodeModules(moduleResolution)) {
let foundGlobal = false;
if (fragmentDirectory === void 0) {
for (const moduleName of enumerateNodeModulesVisibleToScript(host, scriptPath)) {
const moduleResult = nameAndKind(
moduleName,
"external module name" /* externalModuleName */,
/*extension*/
void 0
);
if (!result.has(moduleResult.name)) {
foundGlobal = true;
result.add(moduleResult);
}
}
}
if (!foundGlobal) {
let ancestorLookup = (ancestor) => {
const nodeModules = combinePaths(ancestor, "node_modules");
if (tryDirectoryExists(host, nodeModules)) {
getCompletionEntriesForDirectoryFragment(
fragment,
nodeModules,
extensionOptions,
host,
/*moduleSpecifierIsRelative*/
false,
/*exclude*/
void 0,
result
);
}
};
if (fragmentDirectory && getResolvePackageJsonExports(compilerOptions)) {
const nodeModulesDirectoryLookup = ancestorLookup;
ancestorLookup = (ancestor) => {
const components = getPathComponents(fragment);
components.shift();
let packagePath = components.shift();
if (!packagePath) {
return nodeModulesDirectoryLookup(ancestor);
}
if (startsWith(packagePath, "@")) {
const subName = components.shift();
if (!subName) {
return nodeModulesDirectoryLookup(ancestor);
}
packagePath = combinePaths(packagePath, subName);
}
const packageDirectory = combinePaths(ancestor, "node_modules", packagePath);
const packageFile = combinePaths(packageDirectory, "package.json");
if (tryFileExists(host, packageFile)) {
const packageJson = readJson(packageFile, host);
const exports = packageJson.exports;
if (exports) {
if (typeof exports !== "object" || exports === null) {
return;
}
const keys = getOwnKeys(exports);
const fragmentSubpath = components.join("/") + (components.length && hasTrailingDirectorySeparator(fragment) ? "/" : "");
const conditions = mode === 99 /* ESNext */ ? ["node", "import", "types"] : ["node", "require", "types"];
addCompletionEntriesFromPathsOrExports(
result,
fragmentSubpath,
packageDirectory,
extensionOptions,
host,
keys,
(key) => singleElementArray(getPatternFromFirstMatchingCondition(exports[key], conditions)),
comparePatternKeys
);
return;
}
}
return nodeModulesDirectoryLookup(ancestor);
};
}
forEachAncestorDirectory(scriptPath, ancestorLookup);
}
}
return arrayFrom(result.values());
}
function getPatternFromFirstMatchingCondition(target, conditions) {
if (typeof target === "string") {
return target;
}
if (target && typeof target === "object" && !isArray(target)) {
for (const condition in target) {
if (condition === "default" || conditions.indexOf(condition) > -1 || isApplicableVersionedTypesKey(conditions, condition)) {
const pattern = target[condition];
return getPatternFromFirstMatchingCondition(pattern, conditions);
}
}
}
}
function getFragmentDirectory(fragment) {
return containsSlash(fragment) ? hasTrailingDirectorySeparator(fragment) ? fragment : getDirectoryPath(fragment) : void 0;
}
function getCompletionsForPathMapping(path, patterns, fragment, packageDirectory, extensionOptions, host) {
if (!endsWith(path, "*")) {
return !stringContains(path, "*") ? justPathMappingName(path, "script" /* scriptElement */) : emptyArray;
}
const pathPrefix = path.slice(0, path.length - 1);
const remainingFragment = tryRemovePrefix(fragment, pathPrefix);
if (remainingFragment === void 0) {
const starIsFullPathComponent = path[path.length - 2] === "/";
return starIsFullPathComponent ? justPathMappingName(pathPrefix, "directory" /* directory */) : flatMap(patterns, (pattern) => {
var _a;
return (_a = getModulesForPathsPattern("", packageDirectory, pattern, extensionOptions, host)) == null ? void 0 : _a.map(({ name, ...rest }) => ({ name: pathPrefix + name, ...rest }));
});
}
return flatMap(patterns, (pattern) => getModulesForPathsPattern(remainingFragment, packageDirectory, pattern, extensionOptions, host));
function justPathMappingName(name, kind) {
return startsWith(name, fragment) ? [{ name: removeTrailingDirectorySeparator(name), kind, extension: void 0 }] : emptyArray;
}
}
function getModulesForPathsPattern(fragment, packageDirectory, pattern, extensionOptions, host) {
if (!host.readDirectory) {
return void 0;
}
const parsed = tryParsePattern(pattern);
if (parsed === void 0 || isString(parsed)) {
return void 0;
}
const normalizedPrefix = resolvePath(parsed.prefix);
const normalizedPrefixDirectory = hasTrailingDirectorySeparator(parsed.prefix) ? normalizedPrefix : getDirectoryPath(normalizedPrefix);
const normalizedPrefixBase = hasTrailingDirectorySeparator(parsed.prefix) ? "" : getBaseFileName(normalizedPrefix);
const fragmentHasPath = containsSlash(fragment);
const fragmentDirectory = fragmentHasPath ? hasTrailingDirectorySeparator(fragment) ? fragment : getDirectoryPath(fragment) : void 0;
const expandedPrefixDirectory = fragmentHasPath ? combinePaths(normalizedPrefixDirectory, normalizedPrefixBase + fragmentDirectory) : normalizedPrefixDirectory;
const normalizedSuffix = normalizePath(parsed.suffix);
const baseDirectory = normalizePath(combinePaths(packageDirectory, expandedPrefixDirectory));
const completePrefix = fragmentHasPath ? baseDirectory : ensureTrailingDirectorySeparator(baseDirectory) + normalizedPrefixBase;
const includeGlob = normalizedSuffix ? "**/*" + normalizedSuffix : "./*";
const matches = mapDefined(tryReadDirectory(
host,
baseDirectory,
extensionOptions.extensionsToSearch,
/*exclude*/
void 0,
[includeGlob]
), (match) => {
const trimmedWithPattern = trimPrefixAndSuffix(match);
if (trimmedWithPattern) {
if (containsSlash(trimmedWithPattern)) {
return directoryResult(getPathComponents(removeLeadingDirectorySeparator(trimmedWithPattern))[1]);
}
const { name, extension } = getFilenameWithExtensionOption(trimmedWithPattern, host.getCompilationSettings(), extensionOptions);
return nameAndKind(name, "script" /* scriptElement */, extension);
}
});
const directories = normalizedSuffix ? emptyArray : mapDefined(tryGetDirectories(host, baseDirectory), (dir) => dir === "node_modules" ? void 0 : directoryResult(dir));
return [...matches, ...directories];
function trimPrefixAndSuffix(path) {
const inner = withoutStartAndEnd(normalizePath(path), completePrefix, normalizedSuffix);
return inner === void 0 ? void 0 : removeLeadingDirectorySeparator(inner);
}
}
function withoutStartAndEnd(s, start2, end) {
return startsWith(s, start2) && endsWith(s, end) ? s.slice(start2.length, s.length - end.length) : void 0;
}
function removeLeadingDirectorySeparator(path) {
return path[0] === directorySeparator ? path.slice(1) : path;
}
function getAmbientModuleCompletions(fragment, fragmentDirectory, checker) {
const ambientModules = checker.getAmbientModules().map((sym) => stripQuotes(sym.name));
const nonRelativeModuleNames = ambientModules.filter((moduleName) => startsWith(moduleName, fragment) && moduleName.indexOf("*") < 0);
if (fragmentDirectory !== void 0) {
const moduleNameWithSeparator = ensureTrailingDirectorySeparator(fragmentDirectory);
return nonRelativeModuleNames.map((nonRelativeModuleName) => removePrefix(nonRelativeModuleName, moduleNameWithSeparator));
}
return nonRelativeModuleNames;
}
function getTripleSlashReferenceCompletion(sourceFile, position, compilerOptions, host) {
const token = getTokenAtPosition(sourceFile, position);
const commentRanges = getLeadingCommentRanges(sourceFile.text, token.pos);
const range = commentRanges && find(commentRanges, (commentRange) => position >= commentRange.pos && position <= commentRange.end);
if (!range) {
return void 0;
}
const text = sourceFile.text.slice(range.pos, position);
const match = tripleSlashDirectiveFragmentRegex.exec(text);
if (!match) {
return void 0;
}
const [, prefix, kind, toComplete] = match;
const scriptPath = getDirectoryPath(sourceFile.path);
const names = kind === "path" ? getCompletionEntriesForDirectoryFragment(
toComplete,
scriptPath,
getExtensionOptions(compilerOptions, 0 /* Filename */, sourceFile),
host,
/*moduleSpecifierIsRelative*/
true,
sourceFile.path
) : kind === "types" ? getCompletionEntriesFromTypings(host, compilerOptions, scriptPath, getFragmentDirectory(toComplete), getExtensionOptions(compilerOptions, 1 /* ModuleSpecifier */, sourceFile)) : Debug.fail();
return addReplacementSpans(toComplete, range.pos + prefix.length, arrayFrom(names.values()));
}
function getCompletionEntriesFromTypings(host, options, scriptPath, fragmentDirectory, extensionOptions, result = createNameAndKindSet()) {
const seen = /* @__PURE__ */ new Map();
const typeRoots = tryAndIgnoreErrors(() => getEffectiveTypeRoots(options, host)) || emptyArray;
for (const root of typeRoots) {
getCompletionEntriesFromDirectories(root);
}
for (const packageJson of findPackageJsons(scriptPath, host)) {
const typesDir = combinePaths(getDirectoryPath(packageJson), "node_modules/@types");
getCompletionEntriesFromDirectories(typesDir);
}
return result;
function getCompletionEntriesFromDirectories(directory) {
if (!tryDirectoryExists(host, directory))
return;
for (const typeDirectoryName of tryGetDirectories(host, directory)) {
const packageName = unmangleScopedPackageName(typeDirectoryName);
if (options.types && !contains(options.types, packageName))
continue;
if (fragmentDirectory === void 0) {
if (!seen.has(packageName)) {
result.add(nameAndKind(
packageName,
"external module name" /* externalModuleName */,
/*extension*/
void 0
));
seen.set(packageName, true);
}
} else {
const baseDirectory = combinePaths(directory, typeDirectoryName);
const remainingFragment = tryRemoveDirectoryPrefix(fragmentDirectory, packageName, hostGetCanonicalFileName(host));
if (remainingFragment !== void 0) {
getCompletionEntriesForDirectoryFragment(
remainingFragment,
baseDirectory,
extensionOptions,
host,
/*moduleSpecifierIsRelative*/
false,
/*exclude*/
void 0,
result
);
}
}
}
}
}
function enumerateNodeModulesVisibleToScript(host, scriptPath) {
if (!host.readFile || !host.fileExists)
return emptyArray;
const result = [];
for (const packageJson of findPackageJsons(scriptPath, host)) {
const contents = readJson(packageJson, host);
for (const key of nodeModulesDependencyKeys) {
const dependencies = contents[key];
if (!dependencies)
continue;
for (const dep in dependencies) {
if (hasProperty(dependencies, dep) && !startsWith(dep, "@types/")) {
result.push(dep);
}
}
}
}
return result;
}
function getDirectoryFragmentTextSpan(text, textStart) {
const index = Math.max(text.lastIndexOf(directorySeparator), text.lastIndexOf(altDirectorySeparator));
const offset = index !== -1 ? index + 1 : 0;
const length2 = text.length - offset;
return length2 === 0 || isIdentifierText(text.substr(offset, length2), 99 /* ESNext */) ? void 0 : createTextSpan(textStart + offset, length2);
}
function isPathRelativeToScript(path) {
if (path && path.length >= 2 && path.charCodeAt(0) === 46 /* dot */) {
const slashIndex = path.length >= 3 && path.charCodeAt(1) === 46 /* dot */ ? 2 : 1;
const slashCharCode = path.charCodeAt(slashIndex);
return slashCharCode === 47 /* slash */ || slashCharCode === 92 /* backslash */;
}
return false;
}
var tripleSlashDirectiveFragmentRegex = /^(\/\/\/\s* Core,
DefinitionKind: () => DefinitionKind,
EntryKind: () => EntryKind,
ExportKind: () => ExportKind2,
FindReferencesUse: () => FindReferencesUse,
ImportExport: () => ImportExport,
createImportTracker: () => createImportTracker,
findModuleReferences: () => findModuleReferences,
findReferenceOrRenameEntries: () => findReferenceOrRenameEntries,
findReferencedSymbols: () => findReferencedSymbols,
getContextNode: () => getContextNode,
getExportInfo: () => getExportInfo,
getImplementationsAtPosition: () => getImplementationsAtPosition,
getImportOrExportSymbol: () => getImportOrExportSymbol,
getReferenceEntriesForNode: () => getReferenceEntriesForNode,
getTextSpanOfEntry: () => getTextSpanOfEntry,
isContextWithStartAndEndNode: () => isContextWithStartAndEndNode,
isDeclarationOfSymbol: () => isDeclarationOfSymbol,
nodeEntry: () => nodeEntry,
toContextSpan: () => toContextSpan,
toHighlightSpan: () => toHighlightSpan,
toReferenceEntry: () => toReferenceEntry,
toRenameLocation: () => toRenameLocation
});
// src/services/importTracker.ts
function createImportTracker(sourceFiles, sourceFilesSet, checker, cancellationToken) {
const allDirectImports = getDirectImportsMap(sourceFiles, checker, cancellationToken);
return (exportSymbol, exportInfo, isForRename) => {
const { directImports, indirectUsers } = getImportersForExport(sourceFiles, sourceFilesSet, allDirectImports, exportInfo, checker, cancellationToken);
return { indirectUsers, ...getSearchesFromDirectImports(directImports, exportSymbol, exportInfo.exportKind, checker, isForRename) };
};
}
var ExportKind2 = /* @__PURE__ */ ((ExportKind3) => {
ExportKind3[ExportKind3["Named"] = 0] = "Named";
ExportKind3[ExportKind3["Default"] = 1] = "Default";
ExportKind3[ExportKind3["ExportEquals"] = 2] = "ExportEquals";
return ExportKind3;
})(ExportKind2 || {});
var ImportExport = /* @__PURE__ */ ((ImportExport2) => {
ImportExport2[ImportExport2["Import"] = 0] = "Import";
ImportExport2[ImportExport2["Export"] = 1] = "Export";
return ImportExport2;
})(ImportExport || {});
function getImportersForExport(sourceFiles, sourceFilesSet, allDirectImports, { exportingModuleSymbol, exportKind }, checker, cancellationToken) {
const markSeenDirectImport = nodeSeenTracker();
const markSeenIndirectUser = nodeSeenTracker();
const directImports = [];
const isAvailableThroughGlobal = !!exportingModuleSymbol.globalExports;
const indirectUserDeclarations = isAvailableThroughGlobal ? void 0 : [];
handleDirectImports(exportingModuleSymbol);
return { directImports, indirectUsers: getIndirectUsers() };
function getIndirectUsers() {
if (isAvailableThroughGlobal) {
return sourceFiles;
}
if (exportingModuleSymbol.declarations) {
for (const decl of exportingModuleSymbol.declarations) {
if (isExternalModuleAugmentation(decl) && sourceFilesSet.has(decl.getSourceFile().fileName)) {
addIndirectUser(decl);
}
}
}
return indirectUserDeclarations.map(getSourceFileOfNode);
}
function handleDirectImports(exportingModuleSymbol2) {
const theseDirectImports = getDirectImports(exportingModuleSymbol2);
if (theseDirectImports) {
for (const direct of theseDirectImports) {
if (!markSeenDirectImport(direct)) {
continue;
}
if (cancellationToken)
cancellationToken.throwIfCancellationRequested();
switch (direct.kind) {
case 212 /* CallExpression */:
if (isImportCall(direct)) {
handleImportCall(direct);
break;
}
if (!isAvailableThroughGlobal) {
const parent2 = direct.parent;
if (exportKind === 2 /* ExportEquals */ && parent2.kind === 259 /* VariableDeclaration */) {
const { name } = parent2;
if (name.kind === 80 /* Identifier */) {
directImports.push(name);
break;
}
}
}
break;
case 80 /* Identifier */:
break;
case 270 /* ImportEqualsDeclaration */:
handleNamespaceImport(
direct,
direct.name,
hasSyntacticModifier(direct, 1 /* Export */),
/*alreadyAddedDirect*/
false
);
break;
case 271 /* ImportDeclaration */:
directImports.push(direct);
const namedBindings = direct.importClause && direct.importClause.namedBindings;
if (namedBindings && namedBindings.kind === 273 /* NamespaceImport */) {
handleNamespaceImport(
direct,
namedBindings.name,
/*isReExport*/
false,
/*alreadyAddedDirect*/
true
);
} else if (!isAvailableThroughGlobal && isDefaultImport(direct)) {
addIndirectUser(getSourceFileLikeForImportDeclaration(direct));
}
break;
case 277 /* ExportDeclaration */:
if (!direct.exportClause) {
handleDirectImports(getContainingModuleSymbol(direct, checker));
} else if (direct.exportClause.kind === 279 /* NamespaceExport */) {
addIndirectUser(
getSourceFileLikeForImportDeclaration(direct),
/*addTransitiveDependencies*/
true
);
} else {
directImports.push(direct);
}
break;
case 204 /* ImportType */:
if (!isAvailableThroughGlobal && direct.isTypeOf && !direct.qualifier && isExported2(direct)) {
addIndirectUser(
direct.getSourceFile(),
/*addTransitiveDependencies*/
true
);
}
directImports.push(direct);
break;
default:
Debug.failBadSyntaxKind(direct, "Unexpected import kind.");
}
}
}
}
function handleImportCall(importCall) {
const top = findAncestor(importCall, isAmbientModuleDeclaration) || importCall.getSourceFile();
addIndirectUser(
top,
/** addTransitiveDependencies */
!!isExported2(
importCall,
/*stopAtAmbientModule*/
true
)
);
}
function isExported2(node, stopAtAmbientModule = false) {
return findAncestor(node, (node2) => {
if (stopAtAmbientModule && isAmbientModuleDeclaration(node2))
return "quit";
return canHaveModifiers(node2) && some(node2.modifiers, isExportModifier);
});
}
function handleNamespaceImport(importDeclaration, name, isReExport, alreadyAddedDirect) {
if (exportKind === 2 /* ExportEquals */) {
if (!alreadyAddedDirect)
directImports.push(importDeclaration);
} else if (!isAvailableThroughGlobal) {
const sourceFileLike = getSourceFileLikeForImportDeclaration(importDeclaration);
Debug.assert(sourceFileLike.kind === 311 /* SourceFile */ || sourceFileLike.kind === 266 /* ModuleDeclaration */);
if (isReExport || findNamespaceReExports(sourceFileLike, name, checker)) {
addIndirectUser(
sourceFileLike,
/*addTransitiveDependencies*/
true
);
} else {
addIndirectUser(sourceFileLike);
}
}
}
function addIndirectUser(sourceFileLike, addTransitiveDependencies = false) {
Debug.assert(!isAvailableThroughGlobal);
const isNew = markSeenIndirectUser(sourceFileLike);
if (!isNew)
return;
indirectUserDeclarations.push(sourceFileLike);
if (!addTransitiveDependencies)
return;
const moduleSymbol = checker.getMergedSymbol(sourceFileLike.symbol);
if (!moduleSymbol)
return;
Debug.assert(!!(moduleSymbol.flags & 1536 /* Module */));
const directImports2 = getDirectImports(moduleSymbol);
if (directImports2) {
for (const directImport of directImports2) {
if (!isImportTypeNode(directImport)) {
addIndirectUser(
getSourceFileLikeForImportDeclaration(directImport),
/*addTransitiveDependencies*/
true
);
}
}
}
}
function getDirectImports(moduleSymbol) {
return allDirectImports.get(getSymbolId(moduleSymbol).toString());
}
}
function getSearchesFromDirectImports(directImports, exportSymbol, exportKind, checker, isForRename) {
const importSearches = [];
const singleReferences = [];
function addSearch(location, symbol) {
importSearches.push([location, symbol]);
}
if (directImports) {
for (const decl of directImports) {
handleImport(decl);
}
}
return { importSearches, singleReferences };
function handleImport(decl) {
if (decl.kind === 270 /* ImportEqualsDeclaration */) {
if (isExternalModuleImportEquals(decl)) {
handleNamespaceImportLike(decl.name);
}
return;
}
if (decl.kind === 80 /* Identifier */) {
handleNamespaceImportLike(decl);
return;
}
if (decl.kind === 204 /* ImportType */) {
if (decl.qualifier) {
const firstIdentifier = getFirstIdentifier(decl.qualifier);
if (firstIdentifier.escapedText === symbolName(exportSymbol)) {
singleReferences.push(firstIdentifier);
}
} else if (exportKind === 2 /* ExportEquals */) {
singleReferences.push(decl.argument.literal);
}
return;
}
if (decl.moduleSpecifier.kind !== 11 /* StringLiteral */) {
return;
}
if (decl.kind === 277 /* ExportDeclaration */) {
if (decl.exportClause && isNamedExports(decl.exportClause)) {
searchForNamedImport(decl.exportClause);
}
return;
}
const { name, namedBindings } = decl.importClause || { name: void 0, namedBindings: void 0 };
if (namedBindings) {
switch (namedBindings.kind) {
case 273 /* NamespaceImport */:
handleNamespaceImportLike(namedBindings.name);
break;
case 274 /* NamedImports */:
if (exportKind === 0 /* Named */ || exportKind === 1 /* Default */) {
searchForNamedImport(namedBindings);
}
break;
default:
Debug.assertNever(namedBindings);
}
}
if (name && (exportKind === 1 /* Default */ || exportKind === 2 /* ExportEquals */) && (!isForRename || name.escapedText === symbolEscapedNameNoDefault(exportSymbol))) {
const defaultImportAlias = checker.getSymbolAtLocation(name);
addSearch(name, defaultImportAlias);
}
}
function handleNamespaceImportLike(importName) {
if (exportKind === 2 /* ExportEquals */ && (!isForRename || isNameMatch(importName.escapedText))) {
addSearch(importName, checker.getSymbolAtLocation(importName));
}
}
function searchForNamedImport(namedBindings) {
if (!namedBindings) {
return;
}
for (const element of namedBindings.elements) {
const { name, propertyName } = element;
if (!isNameMatch((propertyName || name).escapedText)) {
continue;
}
if (propertyName) {
singleReferences.push(propertyName);
if (!isForRename || name.escapedText === exportSymbol.escapedName) {
addSearch(name, checker.getSymbolAtLocation(name));
}
} else {
const localSymbol = element.kind === 280 /* ExportSpecifier */ && element.propertyName ? checker.getExportSpecifierLocalTargetSymbol(element) : checker.getSymbolAtLocation(name);
addSearch(name, localSymbol);
}
}
}
function isNameMatch(name) {
return name === exportSymbol.escapedName || exportKind !== 0 /* Named */ && name === "default" /* Default */;
}
}
function findNamespaceReExports(sourceFileLike, name, checker) {
const namespaceImportSymbol = checker.getSymbolAtLocation(name);
return !!forEachPossibleImportOrExportStatement(sourceFileLike, (statement) => {
if (!isExportDeclaration(statement))
return;
const { exportClause, moduleSpecifier } = statement;
return !moduleSpecifier && exportClause && isNamedExports(exportClause) && exportClause.elements.some((element) => checker.getExportSpecifierLocalTargetSymbol(element) === namespaceImportSymbol);
});
}
function findModuleReferences(program, sourceFiles, searchModuleSymbol) {
var _a;
const refs = [];
const checker = program.getTypeChecker();
for (const referencingFile of sourceFiles) {
const searchSourceFile = searchModuleSymbol.valueDeclaration;
if ((searchSourceFile == null ? void 0 : searchSourceFile.kind) === 311 /* SourceFile */) {
for (const ref of referencingFile.referencedFiles) {
if (program.getSourceFileFromReference(referencingFile, ref) === searchSourceFile) {
refs.push({ kind: "reference", referencingFile, ref });
}
}
for (const ref of referencingFile.typeReferenceDirectives) {
const referenced = (_a = program.getResolvedTypeReferenceDirectives().get(ref.fileName, ref.resolutionMode || referencingFile.impliedNodeFormat)) == null ? void 0 : _a.resolvedTypeReferenceDirective;
if (referenced !== void 0 && referenced.resolvedFileName === searchSourceFile.fileName) {
refs.push({ kind: "reference", referencingFile, ref });
}
}
}
forEachImport(referencingFile, (importDecl, moduleSpecifier) => {
const moduleSymbol = checker.getSymbolAtLocation(moduleSpecifier);
if (moduleSymbol === searchModuleSymbol) {
refs.push(nodeIsSynthesized(importDecl) ? { kind: "implicit", literal: moduleSpecifier, referencingFile } : { kind: "import", literal: moduleSpecifier });
}
});
}
return refs;
}
function getDirectImportsMap(sourceFiles, checker, cancellationToken) {
const map2 = /* @__PURE__ */ new Map();
for (const sourceFile of sourceFiles) {
if (cancellationToken)
cancellationToken.throwIfCancellationRequested();
forEachImport(sourceFile, (importDecl, moduleSpecifier) => {
const moduleSymbol = checker.getSymbolAtLocation(moduleSpecifier);
if (moduleSymbol) {
const id = getSymbolId(moduleSymbol).toString();
let imports = map2.get(id);
if (!imports) {
map2.set(id, imports = []);
}
imports.push(importDecl);
}
});
}
return map2;
}
function forEachPossibleImportOrExportStatement(sourceFileLike, action) {
return forEach(sourceFileLike.kind === 311 /* SourceFile */ ? sourceFileLike.statements : sourceFileLike.body.statements, (statement) => (
// TODO: GH#18217
action(statement) || isAmbientModuleDeclaration(statement) && forEach(statement.body && statement.body.statements, action)
));
}
function forEachImport(sourceFile, action) {
if (sourceFile.externalModuleIndicator || sourceFile.imports !== void 0) {
for (const i of sourceFile.imports) {
action(importFromModuleSpecifier(i), i);
}
} else {
forEachPossibleImportOrExportStatement(sourceFile, (statement) => {
switch (statement.kind) {
case 277 /* ExportDeclaration */:
case 271 /* ImportDeclaration */: {
const decl = statement;
if (decl.moduleSpecifier && isStringLiteral(decl.moduleSpecifier)) {
action(decl, decl.moduleSpecifier);
}
break;
}
case 270 /* ImportEqualsDeclaration */: {
const decl = statement;
if (isExternalModuleImportEquals(decl)) {
action(decl, decl.moduleReference.expression);
}
break;
}
}
});
}
}
function getImportOrExportSymbol(node, symbol, checker, comingFromExport) {
return comingFromExport ? getExport() : getExport() || getImport();
function getExport() {
var _a;
const { parent: parent2 } = node;
const grandparent = parent2.parent;
if (symbol.exportSymbol) {
if (parent2.kind === 210 /* PropertyAccessExpression */) {
return ((_a = symbol.declarations) == null ? void 0 : _a.some((d) => d === parent2)) && isBinaryExpression(grandparent) ? getSpecialPropertyExport(
grandparent,
/*useLhsSymbol*/
false
) : void 0;
} else {
return exportInfo(symbol.exportSymbol, getExportKindForDeclaration(parent2));
}
} else {
const exportNode = getExportNode(parent2, node);
if (exportNode && hasSyntacticModifier(exportNode, 1 /* Export */)) {
if (isImportEqualsDeclaration(exportNode) && exportNode.moduleReference === node) {
if (comingFromExport) {
return void 0;
}
const lhsSymbol = checker.getSymbolAtLocation(exportNode.name);
return { kind: 0 /* Import */, symbol: lhsSymbol };
} else {
return exportInfo(symbol, getExportKindForDeclaration(exportNode));
}
} else if (isNamespaceExport(parent2)) {
return exportInfo(symbol, 0 /* Named */);
} else if (isExportAssignment(parent2)) {
return getExportAssignmentExport(parent2);
} else if (isExportAssignment(grandparent)) {
return getExportAssignmentExport(grandparent);
} else if (isBinaryExpression(parent2)) {
return getSpecialPropertyExport(
parent2,
/*useLhsSymbol*/
true
);
} else if (isBinaryExpression(grandparent)) {
return getSpecialPropertyExport(
grandparent,
/*useLhsSymbol*/
true
);
} else if (isJSDocTypedefTag(parent2) || isJSDocCallbackTag(parent2)) {
return exportInfo(symbol, 0 /* Named */);
}
}
function getExportAssignmentExport(ex) {
if (!ex.symbol.parent)
return void 0;
const exportKind = ex.isExportEquals ? 2 /* ExportEquals */ : 1 /* Default */;
return { kind: 1 /* Export */, symbol, exportInfo: { exportingModuleSymbol: ex.symbol.parent, exportKind } };
}
function getSpecialPropertyExport(node2, useLhsSymbol) {
let kind;
switch (getAssignmentDeclarationKind(node2)) {
case 1 /* ExportsProperty */:
kind = 0 /* Named */;
break;
case 2 /* ModuleExports */:
kind = 2 /* ExportEquals */;
break;
default:
return void 0;
}
const sym = useLhsSymbol ? checker.getSymbolAtLocation(getNameOfAccessExpression(cast(node2.left, isAccessExpression))) : symbol;
return sym && exportInfo(sym, kind);
}
}
function getImport() {
const isImport3 = isNodeImport(node);
if (!isImport3)
return void 0;
let importedSymbol = checker.getImmediateAliasedSymbol(symbol);
if (!importedSymbol)
return void 0;
importedSymbol = skipExportSpecifierSymbol(importedSymbol, checker);
if (importedSymbol.escapedName === "export=") {
importedSymbol = getExportEqualsLocalSymbol(importedSymbol, checker);
if (importedSymbol === void 0)
return void 0;
}
const importedName = symbolEscapedNameNoDefault(importedSymbol);
if (importedName === void 0 || importedName === "default" /* Default */ || importedName === symbol.escapedName) {
return { kind: 0 /* Import */, symbol: importedSymbol };
}
}
function exportInfo(symbol2, kind) {
const exportInfo2 = getExportInfo(symbol2, kind, checker);
return exportInfo2 && { kind: 1 /* Export */, symbol: symbol2, exportInfo: exportInfo2 };
}
function getExportKindForDeclaration(node2) {
return hasSyntacticModifier(node2, 1024 /* Default */) ? 1 /* Default */ : 0 /* Named */;
}
}
function getExportEqualsLocalSymbol(importedSymbol, checker) {
var _a, _b;
if (importedSymbol.flags & 2097152 /* Alias */) {
return checker.getImmediateAliasedSymbol(importedSymbol);
}
const decl = Debug.checkDefined(importedSymbol.valueDeclaration);
if (isExportAssignment(decl)) {
return (_a = tryCast(decl.expression, canHaveSymbol)) == null ? void 0 : _a.symbol;
} else if (isBinaryExpression(decl)) {
return (_b = tryCast(decl.right, canHaveSymbol)) == null ? void 0 : _b.symbol;
} else if (isSourceFile(decl)) {
return decl.symbol;
}
return void 0;
}
function getExportNode(parent2, node) {
const declaration = isVariableDeclaration(parent2) ? parent2 : isBindingElement(parent2) ? walkUpBindingElementsAndPatterns(parent2) : void 0;
if (declaration) {
return parent2.name !== node ? void 0 : isCatchClause(declaration.parent) ? void 0 : isVariableStatement(declaration.parent.parent) ? declaration.parent.parent : void 0;
} else {
return parent2;
}
}
function isNodeImport(node) {
const { parent: parent2 } = node;
switch (parent2.kind) {
case 270 /* ImportEqualsDeclaration */:
return parent2.name === node && isExternalModuleImportEquals(parent2);
case 275 /* ImportSpecifier */:
return !parent2.propertyName;
case 272 /* ImportClause */:
case 273 /* NamespaceImport */:
Debug.assert(parent2.name === node);
return true;
case 207 /* BindingElement */:
return isInJSFile(node) && isVariableDeclarationInitializedToBareOrAccessedRequire(parent2.parent.parent);
default:
return false;
}
}
function getExportInfo(exportSymbol, exportKind, checker) {
const moduleSymbol = exportSymbol.parent;
if (!moduleSymbol)
return void 0;
const exportingModuleSymbol = checker.getMergedSymbol(moduleSymbol);
return isExternalModuleSymbol(exportingModuleSymbol) ? { exportingModuleSymbol, exportKind } : void 0;
}
function skipExportSpecifierSymbol(symbol, checker) {
if (symbol.declarations) {
for (const declaration of symbol.declarations) {
if (isExportSpecifier(declaration) && !declaration.propertyName && !declaration.parent.parent.moduleSpecifier) {
return checker.getExportSpecifierLocalTargetSymbol(declaration) || symbol;
} else if (isPropertyAccessExpression(declaration) && isModuleExportsAccessExpression(declaration.expression) && !isPrivateIdentifier(declaration.name)) {
return checker.getSymbolAtLocation(declaration);
} else if (isShorthandPropertyAssignment(declaration) && isBinaryExpression(declaration.parent.parent) && getAssignmentDeclarationKind(declaration.parent.parent) === 2 /* ModuleExports */) {
return checker.getExportSpecifierLocalTargetSymbol(declaration.name);
}
}
}
return symbol;
}
function getContainingModuleSymbol(importer, checker) {
return checker.getMergedSymbol(getSourceFileLikeForImportDeclaration(importer).symbol);
}
function getSourceFileLikeForImportDeclaration(node) {
if (node.kind === 212 /* CallExpression */) {
return node.getSourceFile();
}
const { parent: parent2 } = node;
if (parent2.kind === 311 /* SourceFile */) {
return parent2;
}
Debug.assert(parent2.kind === 267 /* ModuleBlock */);
return cast(parent2.parent, isAmbientModuleDeclaration);
}
function isAmbientModuleDeclaration(node) {
return node.kind === 266 /* ModuleDeclaration */ && node.name.kind === 11 /* StringLiteral */;
}
function isExternalModuleImportEquals(eq) {
return eq.moduleReference.kind === 282 /* ExternalModuleReference */ && eq.moduleReference.expression.kind === 11 /* StringLiteral */;
}
// src/services/findAllReferences.ts
var DefinitionKind = /* @__PURE__ */ ((DefinitionKind2) => {
DefinitionKind2[DefinitionKind2["Symbol"] = 0] = "Symbol";
DefinitionKind2[DefinitionKind2["Label"] = 1] = "Label";
DefinitionKind2[DefinitionKind2["Keyword"] = 2] = "Keyword";
DefinitionKind2[DefinitionKind2["This"] = 3] = "This";
DefinitionKind2[DefinitionKind2["String"] = 4] = "String";
DefinitionKind2[DefinitionKind2["TripleSlashReference"] = 5] = "TripleSlashReference";
return DefinitionKind2;
})(DefinitionKind || {});
var EntryKind = /* @__PURE__ */ ((EntryKind2) => {
EntryKind2[EntryKind2["Span"] = 0] = "Span";
EntryKind2[EntryKind2["Node"] = 1] = "Node";
EntryKind2[EntryKind2["StringLiteral"] = 2] = "StringLiteral";
EntryKind2[EntryKind2["SearchedLocalFoundProperty"] = 3] = "SearchedLocalFoundProperty";
EntryKind2[EntryKind2["SearchedPropertyFoundLocal"] = 4] = "SearchedPropertyFoundLocal";
return EntryKind2;
})(EntryKind || {});
function nodeEntry(node, kind = 1 /* Node */) {
return {
kind,
node: node.name || node,
context: getContextNodeForNodeEntry(node)
};
}
function isContextWithStartAndEndNode(node) {
return node && node.kind === void 0;
}
function getContextNodeForNodeEntry(node) {
if (isDeclaration(node)) {
return getContextNode(node);
}
if (!node.parent)
return void 0;
if (!isDeclaration(node.parent) && !isExportAssignment(node.parent)) {
if (isInJSFile(node)) {
const binaryExpression = isBinaryExpression(node.parent) ? node.parent : isAccessExpression(node.parent) && isBinaryExpression(node.parent.parent) && node.parent.parent.left === node.parent ? node.parent.parent : void 0;
if (binaryExpression && getAssignmentDeclarationKind(binaryExpression) !== 0 /* None */) {
return getContextNode(binaryExpression);
}
}
if (isJsxOpeningElement(node.parent) || isJsxClosingElement(node.parent)) {
return node.parent.parent;
} else if (isJsxSelfClosingElement(node.parent) || isLabeledStatement(node.parent) || isBreakOrContinueStatement(node.parent)) {
return node.parent;
} else if (isStringLiteralLike(node)) {
const validImport = tryGetImportFromModuleSpecifier(node);
if (validImport) {
const declOrStatement = findAncestor(
validImport,
(node2) => isDeclaration(node2) || isStatement(node2) || isJSDocTag(node2)
);
return isDeclaration(declOrStatement) ? getContextNode(declOrStatement) : declOrStatement;
}
}
const propertyName = findAncestor(node, isComputedPropertyName);
return propertyName ? getContextNode(propertyName.parent) : void 0;
}
if (node.parent.name === node || // node is name of declaration, use parent
isConstructorDeclaration(node.parent) || isExportAssignment(node.parent) || // Property name of the import export specifier or binding pattern, use parent
(isImportOrExportSpecifier(node.parent) || isBindingElement(node.parent)) && node.parent.propertyName === node || // Is default export
node.kind === 90 /* DefaultKeyword */ && hasSyntacticModifier(node.parent, 1025 /* ExportDefault */)) {
return getContextNode(node.parent);
}
return void 0;
}
function getContextNode(node) {
if (!node)
return void 0;
switch (node.kind) {
case 259 /* VariableDeclaration */:
return !isVariableDeclarationList(node.parent) || node.parent.declarations.length !== 1 ? node : isVariableStatement(node.parent.parent) ? node.parent.parent : isForInOrOfStatement(node.parent.parent) ? getContextNode(node.parent.parent) : node.parent;
case 207 /* BindingElement */:
return getContextNode(node.parent.parent);
case 275 /* ImportSpecifier */:
return node.parent.parent.parent;
case 280 /* ExportSpecifier */:
case 273 /* NamespaceImport */:
return node.parent.parent;
case 272 /* ImportClause */:
case 279 /* NamespaceExport */:
return node.parent;
case 225 /* BinaryExpression */:
return isExpressionStatement(node.parent) ? node.parent : node;
case 249 /* ForOfStatement */:
case 248 /* ForInStatement */:
return {
start: node.initializer,
end: node.expression
};
case 302 /* PropertyAssignment */:
case 303 /* ShorthandPropertyAssignment */:
return isArrayLiteralOrObjectLiteralDestructuringPattern(node.parent) ? getContextNode(
findAncestor(
node.parent,
(node2) => isBinaryExpression(node2) || isForInOrOfStatement(node2)
)
) : node;
default:
return node;
}
}
function toContextSpan(textSpan, sourceFile, context) {
if (!context)
return void 0;
const contextSpan = isContextWithStartAndEndNode(context) ? getTextSpan(context.start, sourceFile, context.end) : getTextSpan(context, sourceFile);
return contextSpan.start !== textSpan.start || contextSpan.length !== textSpan.length ? { contextSpan } : void 0;
}
var FindReferencesUse = /* @__PURE__ */ ((FindReferencesUse2) => {
FindReferencesUse2[FindReferencesUse2["Other"] = 0] = "Other";
FindReferencesUse2[FindReferencesUse2["References"] = 1] = "References";
FindReferencesUse2[FindReferencesUse2["Rename"] = 2] = "Rename";
return FindReferencesUse2;
})(FindReferencesUse || {});
function findReferencedSymbols(program, cancellationToken, sourceFiles, sourceFile, position) {
const node = getTouchingPropertyName(sourceFile, position);
const options = { use: 1 /* References */ };
const referencedSymbols = Core.getReferencedSymbolsForNode(position, node, program, sourceFiles, cancellationToken, options);
const checker = program.getTypeChecker();
const adjustedNode = Core.getAdjustedNode(node, options);
const symbol = isDefinitionForReference(adjustedNode) ? checker.getSymbolAtLocation(adjustedNode) : void 0;
return !referencedSymbols || !referencedSymbols.length ? void 0 : mapDefined(referencedSymbols, ({ definition, references }) => (
// Only include referenced symbols that have a valid definition.
definition && {
definition: checker.runWithCancellationToken(cancellationToken, (checker2) => definitionToReferencedSymbolDefinitionInfo(definition, checker2, node)),
references: references.map((r) => toReferencedSymbolEntry(r, symbol))
}
));
}
function isDefinitionForReference(node) {
return node.kind === 90 /* DefaultKeyword */ || !!getDeclarationFromName(node) || isLiteralComputedPropertyDeclarationName(node) || node.kind === 137 /* ConstructorKeyword */ && isConstructorDeclaration(node.parent);
}
function getImplementationsAtPosition(program, cancellationToken, sourceFiles, sourceFile, position) {
const node = getTouchingPropertyName(sourceFile, position);
let referenceEntries;
const entries = getImplementationReferenceEntries(program, cancellationToken, sourceFiles, node, position);
if (node.parent.kind === 210 /* PropertyAccessExpression */ || node.parent.kind === 207 /* BindingElement */ || node.parent.kind === 211 /* ElementAccessExpression */ || node.kind === 108 /* SuperKeyword */) {
referenceEntries = entries && [...entries];
} else if (entries) {
const queue = createQueue(entries);
const seenNodes = /* @__PURE__ */ new Map();
while (!queue.isEmpty()) {
const entry = queue.dequeue();
if (!addToSeen(seenNodes, getNodeId(entry.node))) {
continue;
}
referenceEntries = append(referenceEntries, entry);
const entries2 = getImplementationReferenceEntries(program, cancellationToken, sourceFiles, entry.node, entry.node.pos);
if (entries2) {
queue.enqueue(...entries2);
}
}
}
const checker = program.getTypeChecker();
return map(referenceEntries, (entry) => toImplementationLocation(entry, checker));
}
function getImplementationReferenceEntries(program, cancellationToken, sourceFiles, node, position) {
if (node.kind === 311 /* SourceFile */) {
return void 0;
}
const checker = program.getTypeChecker();
if (node.parent.kind === 303 /* ShorthandPropertyAssignment */) {
const result = [];
Core.getReferenceEntriesForShorthandPropertyAssignment(node, checker, (node2) => result.push(nodeEntry(node2)));
return result;
} else if (node.kind === 108 /* SuperKeyword */ || isSuperProperty(node.parent)) {
const symbol = checker.getSymbolAtLocation(node);
return symbol.valueDeclaration && [nodeEntry(symbol.valueDeclaration)];
} else {
return getReferenceEntriesForNode(position, node, program, sourceFiles, cancellationToken, { implementations: true, use: 1 /* References */ });
}
}
function findReferenceOrRenameEntries(program, cancellationToken, sourceFiles, node, position, options, convertEntry) {
return map(flattenEntries(Core.getReferencedSymbolsForNode(position, node, program, sourceFiles, cancellationToken, options)), (entry) => convertEntry(entry, node, program.getTypeChecker()));
}
function getReferenceEntriesForNode(position, node, program, sourceFiles, cancellationToken, options = {}, sourceFilesSet = new Set(sourceFiles.map((f) => f.fileName))) {
return flattenEntries(Core.getReferencedSymbolsForNode(position, node, program, sourceFiles, cancellationToken, options, sourceFilesSet));
}
function flattenEntries(referenceSymbols) {
return referenceSymbols && flatMap(referenceSymbols, (r) => r.references);
}
function definitionToReferencedSymbolDefinitionInfo(def, checker, originalNode) {
const info = (() => {
switch (def.type) {
case 0 /* Symbol */: {
const { symbol } = def;
const { displayParts: displayParts2, kind: kind2 } = getDefinitionKindAndDisplayParts(symbol, checker, originalNode);
const name2 = displayParts2.map((p) => p.text).join("");
const declaration = symbol.declarations && firstOrUndefined(symbol.declarations);
const node = declaration ? getNameOfDeclaration(declaration) || declaration : originalNode;
return {
...getFileAndTextSpanFromNode(node),
name: name2,
kind: kind2,
displayParts: displayParts2,
context: getContextNode(declaration)
};
}
case 1 /* Label */: {
const { node } = def;
return { ...getFileAndTextSpanFromNode(node), name: node.text, kind: "label" /* label */, displayParts: [displayPart(node.text, 17 /* text */)] };
}
case 2 /* Keyword */: {
const { node } = def;
const name2 = tokenToString(node.kind);
return { ...getFileAndTextSpanFromNode(node), name: name2, kind: "keyword" /* keyword */, displayParts: [{ text: name2, kind: "keyword" /* keyword */ }] };
}
case 3 /* This */: {
const { node } = def;
const symbol = checker.getSymbolAtLocation(node);
const displayParts2 = symbol && ts_SymbolDisplay_exports.getSymbolDisplayPartsDocumentationAndSymbolKind(
checker,
symbol,
node.getSourceFile(),
getContainerNode(node),
node
).displayParts || [textPart("this")];
return { ...getFileAndTextSpanFromNode(node), name: "this", kind: "var" /* variableElement */, displayParts: displayParts2 };
}
case 4 /* String */: {
const { node } = def;
return {
...getFileAndTextSpanFromNode(node),
name: node.text,
kind: "var" /* variableElement */,
displayParts: [displayPart(getTextOfNode(node), 8 /* stringLiteral */)]
};
}
case 5 /* TripleSlashReference */: {
return {
textSpan: createTextSpanFromRange(def.reference),
sourceFile: def.file,
name: def.reference.fileName,
kind: "string" /* string */,
displayParts: [displayPart(`"${def.reference.fileName}"`, 8 /* stringLiteral */)]
};
}
default:
return Debug.assertNever(def);
}
})();
const { sourceFile, textSpan, name, kind, displayParts, context } = info;
return {
containerKind: "" /* unknown */,
containerName: "",
fileName: sourceFile.fileName,
kind,
name,
textSpan,
displayParts,
...toContextSpan(textSpan, sourceFile, context)
};
}
function getFileAndTextSpanFromNode(node) {
const sourceFile = node.getSourceFile();
return {
sourceFile,
textSpan: getTextSpan(isComputedPropertyName(node) ? node.expression : node, sourceFile)
};
}
function getDefinitionKindAndDisplayParts(symbol, checker, node) {
const meaning = Core.getIntersectingMeaningFromDeclarations(node, symbol);
const enclosingDeclaration = symbol.declarations && firstOrUndefined(symbol.declarations) || node;
const { displayParts, symbolKind } = ts_SymbolDisplay_exports.getSymbolDisplayPartsDocumentationAndSymbolKind(checker, symbol, enclosingDeclaration.getSourceFile(), enclosingDeclaration, enclosingDeclaration, meaning);
return { displayParts, kind: symbolKind };
}
function toRenameLocation(entry, originalNode, checker, providePrefixAndSuffixText, quotePreference) {
return { ...entryToDocumentSpan(entry), ...providePrefixAndSuffixText && getPrefixAndSuffixText(entry, originalNode, checker, quotePreference) };
}
function toReferencedSymbolEntry(entry, symbol) {
const referenceEntry = toReferenceEntry(entry);
if (!symbol)
return referenceEntry;
return {
...referenceEntry,
isDefinition: entry.kind !== 0 /* Span */ && isDeclarationOfSymbol(entry.node, symbol)
};
}
function toReferenceEntry(entry) {
const documentSpan = entryToDocumentSpan(entry);
if (entry.kind === 0 /* Span */) {
return { ...documentSpan, isWriteAccess: false };
}
const { kind, node } = entry;
return {
...documentSpan,
isWriteAccess: isWriteAccessForReference(node),
isInString: kind === 2 /* StringLiteral */ ? true : void 0
};
}
function entryToDocumentSpan(entry) {
if (entry.kind === 0 /* Span */) {
return { textSpan: entry.textSpan, fileName: entry.fileName };
} else {
const sourceFile = entry.node.getSourceFile();
const textSpan = getTextSpan(entry.node, sourceFile);
return {
textSpan,
fileName: sourceFile.fileName,
...toContextSpan(textSpan, sourceFile, entry.context)
};
}
}
function getPrefixAndSuffixText(entry, originalNode, checker, quotePreference) {
if (entry.kind !== 0 /* Span */ && isIdentifier(originalNode)) {
const { node, kind } = entry;
const parent2 = node.parent;
const name = originalNode.text;
const isShorthandAssignment = isShorthandPropertyAssignment(parent2);
if (isShorthandAssignment || isObjectBindingElementWithoutPropertyName(parent2) && parent2.name === node && parent2.dotDotDotToken === void 0) {
const prefixColon = { prefixText: name + ": " };
const suffixColon = { suffixText: ": " + name };
if (kind === 3 /* SearchedLocalFoundProperty */) {
return prefixColon;
}
if (kind === 4 /* SearchedPropertyFoundLocal */) {
return suffixColon;
}
if (isShorthandAssignment) {
const grandParent = parent2.parent;
if (isObjectLiteralExpression(grandParent) && isBinaryExpression(grandParent.parent) && isModuleExportsAccessExpression(grandParent.parent.left)) {
return prefixColon;
}
return suffixColon;
} else {
return prefixColon;
}
} else if (isImportSpecifier(parent2) && !parent2.propertyName) {
const originalSymbol = isExportSpecifier(originalNode.parent) ? checker.getExportSpecifierLocalTargetSymbol(originalNode.parent) : checker.getSymbolAtLocation(originalNode);
return contains(originalSymbol.declarations, parent2) ? { prefixText: name + " as " } : emptyOptions;
} else if (isExportSpecifier(parent2) && !parent2.propertyName) {
return originalNode === entry.node || checker.getSymbolAtLocation(originalNode) === checker.getSymbolAtLocation(entry.node) ? { prefixText: name + " as " } : { suffixText: " as " + name };
}
}
if (entry.kind !== 0 /* Span */ && isNumericLiteral(entry.node) && isAccessExpression(entry.node.parent)) {
const quote2 = getQuoteFromPreference(quotePreference);
return { prefixText: quote2, suffixText: quote2 };
}
return emptyOptions;
}
function toImplementationLocation(entry, checker) {
const documentSpan = entryToDocumentSpan(entry);
if (entry.kind !== 0 /* Span */) {
const { node } = entry;
return {
...documentSpan,
...implementationKindDisplayParts(node, checker)
};
} else {
return { ...documentSpan, kind: "" /* unknown */, displayParts: [] };
}
}
function implementationKindDisplayParts(node, checker) {
const symbol = checker.getSymbolAtLocation(isDeclaration(node) && node.name ? node.name : node);
if (symbol) {
return getDefinitionKindAndDisplayParts(symbol, checker, node);
} else if (node.kind === 209 /* ObjectLiteralExpression */) {
return {
kind: "interface" /* interfaceElement */,
displayParts: [punctuationPart(21 /* OpenParenToken */), textPart("object literal"), punctuationPart(22 /* CloseParenToken */)]
};
} else if (node.kind === 230 /* ClassExpression */) {
return {
kind: "local class" /* localClassElement */,
displayParts: [punctuationPart(21 /* OpenParenToken */), textPart("anonymous local class"), punctuationPart(22 /* CloseParenToken */)]
};
} else {
return { kind: getNodeKind(node), displayParts: [] };
}
}
function toHighlightSpan(entry) {
const documentSpan = entryToDocumentSpan(entry);
if (entry.kind === 0 /* Span */) {
return {
fileName: documentSpan.fileName,
span: {
textSpan: documentSpan.textSpan,
kind: "reference" /* reference */
}
};
}
const writeAccess = isWriteAccessForReference(entry.node);
const span = {
textSpan: documentSpan.textSpan,
kind: writeAccess ? "writtenReference" /* writtenReference */ : "reference" /* reference */,
isInString: entry.kind === 2 /* StringLiteral */ ? true : void 0,
...documentSpan.contextSpan && { contextSpan: documentSpan.contextSpan }
};
return { fileName: documentSpan.fileName, span };
}
function getTextSpan(node, sourceFile, endNode2) {
let start2 = node.getStart(sourceFile);
let end = (endNode2 || node).getEnd();
if (isStringLiteralLike(node) && end - start2 > 2) {
Debug.assert(endNode2 === void 0);
start2 += 1;
end -= 1;
}
return createTextSpanFromBounds(start2, end);
}
function getTextSpanOfEntry(entry) {
return entry.kind === 0 /* Span */ ? entry.textSpan : getTextSpan(entry.node, entry.node.getSourceFile());
}
function isWriteAccessForReference(node) {
const decl = getDeclarationFromName(node);
return !!decl && declarationIsWriteAccess(decl) || node.kind === 90 /* DefaultKeyword */ || isWriteAccess(node);
}
function isDeclarationOfSymbol(node, target) {
var _a;
if (!target)
return false;
const source = getDeclarationFromName(node) || (node.kind === 90 /* DefaultKeyword */ ? node.parent : isLiteralComputedPropertyDeclarationName(node) ? node.parent.parent : node.kind === 137 /* ConstructorKeyword */ && isConstructorDeclaration(node.parent) ? node.parent.parent : void 0);
const commonjsSource = source && isBinaryExpression(source) ? source.left : void 0;
return !!(source && ((_a = target.declarations) == null ? void 0 : _a.some((d) => d === source || d === commonjsSource)));
}
function declarationIsWriteAccess(decl) {
if (!!(decl.flags & 16777216 /* Ambient */))
return true;
switch (decl.kind) {
case 225 /* BinaryExpression */:
case 207 /* BindingElement */:
case 262 /* ClassDeclaration */:
case 230 /* ClassExpression */:
case 90 /* DefaultKeyword */:
case 265 /* EnumDeclaration */:
case 305 /* EnumMember */:
case 280 /* ExportSpecifier */:
case 272 /* ImportClause */:
case 270 /* ImportEqualsDeclaration */:
case 275 /* ImportSpecifier */:
case 263 /* InterfaceDeclaration */:
case 344 /* JSDocCallbackTag */:
case 352 /* JSDocTypedefTag */:
case 290 /* JsxAttribute */:
case 266 /* ModuleDeclaration */:
case 269 /* NamespaceExportDeclaration */:
case 273 /* NamespaceImport */:
case 279 /* NamespaceExport */:
case 168 /* Parameter */:
case 303 /* ShorthandPropertyAssignment */:
case 264 /* TypeAliasDeclaration */:
case 167 /* TypeParameter */:
return true;
case 302 /* PropertyAssignment */:
return !isArrayLiteralOrObjectLiteralDestructuringPattern(decl.parent);
case 261 /* FunctionDeclaration */:
case 217 /* FunctionExpression */:
case 175 /* Constructor */:
case 173 /* MethodDeclaration */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
return !!decl.body;
case 259 /* VariableDeclaration */:
case 171 /* PropertyDeclaration */:
return !!decl.initializer || isCatchClause(decl.parent);
case 172 /* MethodSignature */:
case 170 /* PropertySignature */:
case 354 /* JSDocPropertyTag */:
case 347 /* JSDocParameterTag */:
return false;
default:
return Debug.failBadSyntaxKind(decl);
}
}
var Core;
((Core2) => {
function getReferencedSymbolsForNode(position, node, program, sourceFiles, cancellationToken, options = {}, sourceFilesSet = new Set(sourceFiles.map((f) => f.fileName))) {
var _a, _b, _c;
node = getAdjustedNode2(node, options);
if (isSourceFile(node)) {
const resolvedRef = ts_GoToDefinition_exports.getReferenceAtPosition(node, position, program);
if (!(resolvedRef == null ? void 0 : resolvedRef.file)) {
return void 0;
}
const moduleSymbol = program.getTypeChecker().getMergedSymbol(resolvedRef.file.symbol);
if (moduleSymbol) {
return getReferencedSymbolsForModule(
program,
moduleSymbol,
/*excludeImportTypeOfExportEquals*/
false,
sourceFiles,
sourceFilesSet
);
}
const fileIncludeReasons = program.getFileIncludeReasons();
if (!fileIncludeReasons) {
return void 0;
}
return [{
definition: { type: 5 /* TripleSlashReference */, reference: resolvedRef.reference, file: node },
references: getReferencesForNonModule(resolvedRef.file, fileIncludeReasons, program) || emptyArray
}];
}
if (!options.implementations) {
const special = getReferencedSymbolsSpecial(node, sourceFiles, cancellationToken);
if (special) {
return special;
}
}
const checker = program.getTypeChecker();
const symbol = checker.getSymbolAtLocation(isConstructorDeclaration(node) && node.parent.name || node);
if (!symbol) {
if (!options.implementations && isStringLiteralLike(node)) {
if (isModuleSpecifierLike(node)) {
const fileIncludeReasons = program.getFileIncludeReasons();
const referencedFileName = (_c = (_b = (_a = node.getSourceFile().resolvedModules) == null ? void 0 : _a.get(node.text, getModeForUsageLocation(node.getSourceFile(), node))) == null ? void 0 : _b.resolvedModule) == null ? void 0 : _c.resolvedFileName;
const referencedFile = referencedFileName ? program.getSourceFile(referencedFileName) : void 0;
if (referencedFile) {
return [{ definition: { type: 4 /* String */, node }, references: getReferencesForNonModule(referencedFile, fileIncludeReasons, program) || emptyArray }];
}
}
return getReferencesForStringLiteral(node, sourceFiles, checker, cancellationToken);
}
return void 0;
}
if (symbol.escapedName === "export=" /* ExportEquals */) {
return getReferencedSymbolsForModule(
program,
symbol.parent,
/*excludeImportTypeOfExportEquals*/
false,
sourceFiles,
sourceFilesSet
);
}
const moduleReferences = getReferencedSymbolsForModuleIfDeclaredBySourceFile(symbol, program, sourceFiles, cancellationToken, options, sourceFilesSet);
if (moduleReferences && !(symbol.flags & 33554432 /* Transient */)) {
return moduleReferences;
}
const aliasedSymbol = getMergedAliasedSymbolOfNamespaceExportDeclaration(node, symbol, checker);
const moduleReferencesOfExportTarget = aliasedSymbol && getReferencedSymbolsForModuleIfDeclaredBySourceFile(aliasedSymbol, program, sourceFiles, cancellationToken, options, sourceFilesSet);
const references = getReferencedSymbolsForSymbol(symbol, node, sourceFiles, sourceFilesSet, checker, cancellationToken, options);
return mergeReferences(program, moduleReferences, references, moduleReferencesOfExportTarget);
}
Core2.getReferencedSymbolsForNode = getReferencedSymbolsForNode;
function getAdjustedNode2(node, options) {
if (options.use === 1 /* References */) {
node = getAdjustedReferenceLocation(node);
} else if (options.use === 2 /* Rename */) {
node = getAdjustedRenameLocation(node);
}
return node;
}
Core2.getAdjustedNode = getAdjustedNode2;
function getReferencesForFileName(fileName, program, sourceFiles, sourceFilesSet = new Set(sourceFiles.map((f) => f.fileName))) {
var _a, _b;
const moduleSymbol = (_a = program.getSourceFile(fileName)) == null ? void 0 : _a.symbol;
if (moduleSymbol) {
return ((_b = getReferencedSymbolsForModule(
program,
moduleSymbol,
/*excludeImportTypeOfExportEquals*/
false,
sourceFiles,
sourceFilesSet
)[0]) == null ? void 0 : _b.references) || emptyArray;
}
const fileIncludeReasons = program.getFileIncludeReasons();
const referencedFile = program.getSourceFile(fileName);
return referencedFile && fileIncludeReasons && getReferencesForNonModule(referencedFile, fileIncludeReasons, program) || emptyArray;
}
Core2.getReferencesForFileName = getReferencesForFileName;
function getReferencesForNonModule(referencedFile, refFileMap, program) {
let entries;
const references = refFileMap.get(referencedFile.path) || emptyArray;
for (const ref of references) {
if (isReferencedFile(ref)) {
const referencingFile = program.getSourceFileByPath(ref.file);
const location = getReferencedFileLocation(program.getSourceFileByPath, ref);
if (isReferenceFileLocation(location)) {
entries = append(entries, {
kind: 0 /* Span */,
fileName: referencingFile.fileName,
textSpan: createTextSpanFromRange(location)
});
}
}
}
return entries;
}
function getMergedAliasedSymbolOfNamespaceExportDeclaration(node, symbol, checker) {
if (node.parent && isNamespaceExportDeclaration(node.parent)) {
const aliasedSymbol = checker.getAliasedSymbol(symbol);
const targetSymbol = checker.getMergedSymbol(aliasedSymbol);
if (aliasedSymbol !== targetSymbol) {
return targetSymbol;
}
}
return void 0;
}
function getReferencedSymbolsForModuleIfDeclaredBySourceFile(symbol, program, sourceFiles, cancellationToken, options, sourceFilesSet) {
const moduleSourceFile = symbol.flags & 1536 /* Module */ && symbol.declarations && find(symbol.declarations, isSourceFile);
if (!moduleSourceFile)
return void 0;
const exportEquals = symbol.exports.get("export=" /* ExportEquals */);
const moduleReferences = getReferencedSymbolsForModule(program, symbol, !!exportEquals, sourceFiles, sourceFilesSet);
if (!exportEquals || !sourceFilesSet.has(moduleSourceFile.fileName))
return moduleReferences;
const checker = program.getTypeChecker();
symbol = skipAlias(exportEquals, checker);
return mergeReferences(program, moduleReferences, getReferencedSymbolsForSymbol(
symbol,
/*node*/
void 0,
sourceFiles,
sourceFilesSet,
checker,
cancellationToken,
options
));
}
function mergeReferences(program, ...referencesToMerge) {
let result;
for (const references of referencesToMerge) {
if (!references || !references.length)
continue;
if (!result) {
result = references;
continue;
}
for (const entry of references) {
if (!entry.definition || entry.definition.type !== 0 /* Symbol */) {
result.push(entry);
continue;
}
const symbol = entry.definition.symbol;
const refIndex = findIndex(result, (ref) => !!ref.definition && ref.definition.type === 0 /* Symbol */ && ref.definition.symbol === symbol);
if (refIndex === -1) {
result.push(entry);
continue;
}
const reference = result[refIndex];
result[refIndex] = {
definition: reference.definition,
references: reference.references.concat(entry.references).sort((entry1, entry2) => {
const entry1File = getSourceFileIndexOfEntry(program, entry1);
const entry2File = getSourceFileIndexOfEntry(program, entry2);
if (entry1File !== entry2File) {
return compareValues(entry1File, entry2File);
}
const entry1Span = getTextSpanOfEntry(entry1);
const entry2Span = getTextSpanOfEntry(entry2);
return entry1Span.start !== entry2Span.start ? compareValues(entry1Span.start, entry2Span.start) : compareValues(entry1Span.length, entry2Span.length);
})
};
}
}
return result;
}
function getSourceFileIndexOfEntry(program, entry) {
const sourceFile = entry.kind === 0 /* Span */ ? program.getSourceFile(entry.fileName) : entry.node.getSourceFile();
return program.getSourceFiles().indexOf(sourceFile);
}
function getReferencedSymbolsForModule(program, symbol, excludeImportTypeOfExportEquals, sourceFiles, sourceFilesSet) {
Debug.assert(!!symbol.valueDeclaration);
const references = mapDefined(findModuleReferences(program, sourceFiles, symbol), (reference) => {
if (reference.kind === "import") {
const parent2 = reference.literal.parent;
if (isLiteralTypeNode(parent2)) {
const importType = cast(parent2.parent, isImportTypeNode);
if (excludeImportTypeOfExportEquals && !importType.qualifier) {
return void 0;
}
}
return nodeEntry(reference.literal);
} else if (reference.kind === "implicit") {
const range = reference.literal.text !== externalHelpersModuleNameText && forEachChildRecursively(
reference.referencingFile,
(n) => !(n.transformFlags & 2 /* ContainsJsx */) ? "skip" : isJsxElement(n) || isJsxSelfClosingElement(n) || isJsxFragment(n) ? n : void 0
) || reference.referencingFile.statements[0] || reference.referencingFile;
return nodeEntry(range);
} else {
return {
kind: 0 /* Span */,
fileName: reference.referencingFile.fileName,
textSpan: createTextSpanFromRange(reference.ref)
};
}
});
if (symbol.declarations) {
for (const decl of symbol.declarations) {
switch (decl.kind) {
case 311 /* SourceFile */:
break;
case 266 /* ModuleDeclaration */:
if (sourceFilesSet.has(decl.getSourceFile().fileName)) {
references.push(nodeEntry(decl.name));
}
break;
default:
Debug.assert(!!(symbol.flags & 33554432 /* Transient */), "Expected a module symbol to be declared by a SourceFile or ModuleDeclaration.");
}
}
}
const exported = symbol.exports.get("export=" /* ExportEquals */);
if (exported == null ? void 0 : exported.declarations) {
for (const decl of exported.declarations) {
const sourceFile = decl.getSourceFile();
if (sourceFilesSet.has(sourceFile.fileName)) {
const node = isBinaryExpression(decl) && isPropertyAccessExpression(decl.left) ? decl.left.expression : isExportAssignment(decl) ? Debug.checkDefined(findChildOfKind(decl, 95 /* ExportKeyword */, sourceFile)) : getNameOfDeclaration(decl) || decl;
references.push(nodeEntry(node));
}
}
}
return references.length ? [{ definition: { type: 0 /* Symbol */, symbol }, references }] : emptyArray;
}
function isReadonlyTypeOperator(node) {
return node.kind === 148 /* ReadonlyKeyword */ && isTypeOperatorNode(node.parent) && node.parent.operator === 148 /* ReadonlyKeyword */;
}
function getReferencedSymbolsSpecial(node, sourceFiles, cancellationToken) {
if (isTypeKeyword(node.kind)) {
if (node.kind === 116 /* VoidKeyword */ && isVoidExpression(node.parent)) {
return void 0;
}
if (node.kind === 148 /* ReadonlyKeyword */ && !isReadonlyTypeOperator(node)) {
return void 0;
}
return getAllReferencesForKeyword(
sourceFiles,
node.kind,
cancellationToken,
node.kind === 148 /* ReadonlyKeyword */ ? isReadonlyTypeOperator : void 0
);
}
if (isImportMeta(node.parent) && node.parent.name === node) {
return getAllReferencesForImportMeta(sourceFiles, cancellationToken);
}
if (isStaticModifier(node) && isClassStaticBlockDeclaration(node.parent)) {
return [{ definition: { type: 2 /* Keyword */, node }, references: [nodeEntry(node)] }];
}
if (isJumpStatementTarget(node)) {
const labelDefinition = getTargetLabel(node.parent, node.text);
return labelDefinition && getLabelReferencesInNode(labelDefinition.parent, labelDefinition);
} else if (isLabelOfLabeledStatement(node)) {
return getLabelReferencesInNode(node.parent, node);
}
if (isThis(node)) {
return getReferencesForThisKeyword(node, sourceFiles, cancellationToken);
}
if (node.kind === 108 /* SuperKeyword */) {
return getReferencesForSuperKeyword(node);
}
return void 0;
}
function getReferencedSymbolsForSymbol(originalSymbol, node, sourceFiles, sourceFilesSet, checker, cancellationToken, options) {
const symbol = node && skipPastExportOrImportSpecifierOrUnion(
originalSymbol,
node,
checker,
/*useLocalSymbolForExportSpecifier*/
!isForRenameWithPrefixAndSuffixText(options)
) || originalSymbol;
const searchMeaning = node ? getIntersectingMeaningFromDeclarations(node, symbol) : 7 /* All */;
const result = [];
const state = new State(sourceFiles, sourceFilesSet, node ? getSpecialSearchKind(node) : 0 /* None */, checker, cancellationToken, searchMeaning, options, result);
const exportSpecifier = !isForRenameWithPrefixAndSuffixText(options) || !symbol.declarations ? void 0 : find(symbol.declarations, isExportSpecifier);
if (exportSpecifier) {
getReferencesAtExportSpecifier(
exportSpecifier.name,
symbol,
exportSpecifier,
state.createSearch(
node,
originalSymbol,
/*comingFrom*/
void 0
),
state,
/*addReferencesHere*/
true,
/*alwaysGetReferences*/
true
);
} else if (node && node.kind === 90 /* DefaultKeyword */ && symbol.escapedName === "default" /* Default */ && symbol.parent) {
addReference(node, symbol, state);
searchForImportsOfExport(node, symbol, { exportingModuleSymbol: symbol.parent, exportKind: 1 /* Default */ }, state);
} else {
const search = state.createSearch(
node,
symbol,
/*comingFrom*/
void 0,
{ allSearchSymbols: node ? populateSearchSymbolSet(symbol, node, checker, options.use === 2 /* Rename */, !!options.providePrefixAndSuffixTextForRename, !!options.implementations) : [symbol] }
);
getReferencesInContainerOrFiles(symbol, state, search);
}
return result;
}
function getReferencesInContainerOrFiles(symbol, state, search) {
const scope = getSymbolScope(symbol);
if (scope) {
getReferencesInContainer(
scope,
scope.getSourceFile(),
search,
state,
/*addReferencesHere*/
!(isSourceFile(scope) && !contains(state.sourceFiles, scope))
);
} else {
for (const sourceFile of state.sourceFiles) {
state.cancellationToken.throwIfCancellationRequested();
searchForName(sourceFile, search, state);
}
}
}
function getSpecialSearchKind(node) {
switch (node.kind) {
case 175 /* Constructor */:
case 137 /* ConstructorKeyword */:
return 1 /* Constructor */;
case 80 /* Identifier */:
if (isClassLike(node.parent)) {
Debug.assert(node.parent.name === node);
return 2 /* Class */;
}
default:
return 0 /* None */;
}
}
function skipPastExportOrImportSpecifierOrUnion(symbol, node, checker, useLocalSymbolForExportSpecifier) {
const { parent: parent2 } = node;
if (isExportSpecifier(parent2) && useLocalSymbolForExportSpecifier) {
return getLocalSymbolForExportSpecifier(node, symbol, parent2, checker);
}
return firstDefined(symbol.declarations, (decl) => {
if (!decl.parent) {
if (symbol.flags & 33554432 /* Transient */)
return void 0;
Debug.fail(`Unexpected symbol at ${Debug.formatSyntaxKind(node.kind)}: ${Debug.formatSymbol(symbol)}`);
}
return isTypeLiteralNode(decl.parent) && isUnionTypeNode(decl.parent.parent) ? checker.getPropertyOfType(checker.getTypeFromTypeNode(decl.parent.parent), symbol.name) : void 0;
});
}
let SpecialSearchKind;
((SpecialSearchKind2) => {
SpecialSearchKind2[SpecialSearchKind2["None"] = 0] = "None";
SpecialSearchKind2[SpecialSearchKind2["Constructor"] = 1] = "Constructor";
SpecialSearchKind2[SpecialSearchKind2["Class"] = 2] = "Class";
})(SpecialSearchKind || (SpecialSearchKind = {}));
function getNonModuleSymbolOfMergedModuleSymbol(symbol) {
if (!(symbol.flags & (1536 /* Module */ | 33554432 /* Transient */)))
return void 0;
const decl = symbol.declarations && find(symbol.declarations, (d) => !isSourceFile(d) && !isModuleDeclaration(d));
return decl && decl.symbol;
}
class State {
constructor(sourceFiles, sourceFilesSet, specialSearchKind, checker, cancellationToken, searchMeaning, options, result) {
this.sourceFiles = sourceFiles;
this.sourceFilesSet = sourceFilesSet;
this.specialSearchKind = specialSearchKind;
this.checker = checker;
this.cancellationToken = cancellationToken;
this.searchMeaning = searchMeaning;
this.options = options;
this.result = result;
/** Cache for `explicitlyinheritsFrom`. */
this.inheritsFromCache = /* @__PURE__ */ new Map();
/**
* Type nodes can contain multiple references to the same type. For example:
* let x: Foo & (Foo & Bar) = ...
* Because we are returning the implementation locations and not the identifier locations,
* duplicate entries would be returned here as each of the type references is part of
* the same implementation. For that reason, check before we add a new entry.
*/
this.markSeenContainingTypeReference = nodeSeenTracker();
/**
* It's possible that we will encounter the right side of `export { foo as bar } from "x";` more than once.
* For example:
* // b.ts
* export { foo as bar } from "./a";
* import { bar } from "./b";
*
* Normally at `foo as bar` we directly add `foo` and do not locally search for it (since it doesn't declare a local).
* But another reference to it may appear in the same source file.
* See `tests/cases/fourslash/transitiveExportImports3.ts`.
*/
this.markSeenReExportRHS = nodeSeenTracker();
this.symbolIdToReferences = [];
// Source file ID -> symbol ID -> Whether the symbol has been searched for in the source file.
this.sourceFileToSeenSymbols = [];
}
includesSourceFile(sourceFile) {
return this.sourceFilesSet.has(sourceFile.fileName);
}
/** Gets every place to look for references of an exported symbols. See `ImportsResult` in `importTracker.ts` for more documentation. */
getImportSearches(exportSymbol, exportInfo) {
if (!this.importTracker)
this.importTracker = createImportTracker(this.sourceFiles, this.sourceFilesSet, this.checker, this.cancellationToken);
return this.importTracker(exportSymbol, exportInfo, this.options.use === 2 /* Rename */);
}
/** @param allSearchSymbols set of additional symbols for use by `includes`. */
createSearch(location, symbol, comingFrom, searchOptions = {}) {
const {
text = stripQuotes(symbolName(getLocalSymbolForExportDefault(symbol) || getNonModuleSymbolOfMergedModuleSymbol(symbol) || symbol)),
allSearchSymbols = [symbol]
} = searchOptions;
const escapedText = escapeLeadingUnderscores(text);
const parents = this.options.implementations && location ? getParentSymbolsOfPropertyAccess(location, symbol, this.checker) : void 0;
return { symbol, comingFrom, text, escapedText, parents, allSearchSymbols, includes: (sym) => contains(allSearchSymbols, sym) };
}
/**
* Callback to add references for a particular searched symbol.
* This initializes a reference group, so only call this if you will add at least one reference.
*/
referenceAdder(searchSymbol) {
const symbolId = getSymbolId(searchSymbol);
let references = this.symbolIdToReferences[symbolId];
if (!references) {
references = this.symbolIdToReferences[symbolId] = [];
this.result.push({ definition: { type: 0 /* Symbol */, symbol: searchSymbol }, references });
}
return (node, kind) => references.push(nodeEntry(node, kind));
}
/** Add a reference with no associated definition. */
addStringOrCommentReference(fileName, textSpan) {
this.result.push({
definition: void 0,
references: [{ kind: 0 /* Span */, fileName, textSpan }]
});
}
/** Returns `true` the first time we search for a symbol in a file and `false` afterwards. */
markSearchedSymbols(sourceFile, symbols) {
const sourceId = getNodeId(sourceFile);
const seenSymbols = this.sourceFileToSeenSymbols[sourceId] || (this.sourceFileToSeenSymbols[sourceId] = /* @__PURE__ */ new Set());
let anyNewSymbols = false;
for (const sym of symbols) {
anyNewSymbols = tryAddToSet(seenSymbols, getSymbolId(sym)) || anyNewSymbols;
}
return anyNewSymbols;
}
}
function searchForImportsOfExport(exportLocation, exportSymbol, exportInfo, state) {
const { importSearches, singleReferences, indirectUsers } = state.getImportSearches(exportSymbol, exportInfo);
if (singleReferences.length) {
const addRef = state.referenceAdder(exportSymbol);
for (const singleRef of singleReferences) {
if (shouldAddSingleReference(singleRef, state))
addRef(singleRef);
}
}
for (const [importLocation, importSymbol] of importSearches) {
getReferencesInSourceFile(importLocation.getSourceFile(), state.createSearch(importLocation, importSymbol, 1 /* Export */), state);
}
if (indirectUsers.length) {
let indirectSearch;
switch (exportInfo.exportKind) {
case 0 /* Named */:
indirectSearch = state.createSearch(exportLocation, exportSymbol, 1 /* Export */);
break;
case 1 /* Default */:
indirectSearch = state.options.use === 2 /* Rename */ ? void 0 : state.createSearch(exportLocation, exportSymbol, 1 /* Export */, { text: "default" });
break;
case 2 /* ExportEquals */:
break;
}
if (indirectSearch) {
for (const indirectUser of indirectUsers) {
searchForName(indirectUser, indirectSearch, state);
}
}
}
}
function eachExportReference(sourceFiles, checker, cancellationToken, exportSymbol, exportingModuleSymbol, exportName, isDefaultExport, cb) {
const importTracker = createImportTracker(sourceFiles, new Set(sourceFiles.map((f) => f.fileName)), checker, cancellationToken);
const { importSearches, indirectUsers, singleReferences } = importTracker(
exportSymbol,
{ exportKind: isDefaultExport ? 1 /* Default */ : 0 /* Named */, exportingModuleSymbol },
/*isForRename*/
false
);
for (const [importLocation] of importSearches) {
cb(importLocation);
}
for (const singleReference of singleReferences) {
if (isIdentifier(singleReference) && isImportTypeNode(singleReference.parent)) {
cb(singleReference);
}
}
for (const indirectUser of indirectUsers) {
for (const node of getPossibleSymbolReferenceNodes(indirectUser, isDefaultExport ? "default" : exportName)) {
const symbol = checker.getSymbolAtLocation(node);
const hasExportAssignmentDeclaration = some(symbol == null ? void 0 : symbol.declarations, (d) => tryCast(d, isExportAssignment) ? true : false);
if (isIdentifier(node) && !isImportOrExportSpecifier(node.parent) && (symbol === exportSymbol || hasExportAssignmentDeclaration)) {
cb(node);
}
}
}
}
Core2.eachExportReference = eachExportReference;
function shouldAddSingleReference(singleRef, state) {
if (!hasMatchingMeaning(singleRef, state))
return false;
if (state.options.use !== 2 /* Rename */)
return true;
if (!isIdentifier(singleRef))
return false;
return !(isImportOrExportSpecifier(singleRef.parent) && singleRef.escapedText === "default" /* Default */);
}
function searchForImportedSymbol(symbol, state) {
if (!symbol.declarations)
return;
for (const declaration of symbol.declarations) {
const exportingFile = declaration.getSourceFile();
getReferencesInSourceFile(exportingFile, state.createSearch(declaration, symbol, 0 /* Import */), state, state.includesSourceFile(exportingFile));
}
}
function searchForName(sourceFile, search, state) {
if (getNameTable(sourceFile).get(search.escapedText) !== void 0) {
getReferencesInSourceFile(sourceFile, search, state);
}
}
function getPropertySymbolOfDestructuringAssignment(location, checker) {
return isArrayLiteralOrObjectLiteralDestructuringPattern(location.parent.parent) ? checker.getPropertySymbolOfDestructuringAssignment(location) : void 0;
}
function getSymbolScope(symbol) {
const { declarations, flags, parent: parent2, valueDeclaration } = symbol;
if (valueDeclaration && (valueDeclaration.kind === 217 /* FunctionExpression */ || valueDeclaration.kind === 230 /* ClassExpression */)) {
return valueDeclaration;
}
if (!declarations) {
return void 0;
}
if (flags & (4 /* Property */ | 8192 /* Method */)) {
const privateDeclaration = find(declarations, (d) => hasEffectiveModifier(d, 8 /* Private */) || isPrivateIdentifierClassElementDeclaration(d));
if (privateDeclaration) {
return getAncestor(privateDeclaration, 262 /* ClassDeclaration */);
}
return void 0;
}
if (declarations.some(isObjectBindingElementWithoutPropertyName)) {
return void 0;
}
const exposedByParent = parent2 && !(symbol.flags & 262144 /* TypeParameter */);
if (exposedByParent && !(isExternalModuleSymbol(parent2) && !parent2.globalExports)) {
return void 0;
}
let scope;
for (const declaration of declarations) {
const container = getContainerNode(declaration);
if (scope && scope !== container) {
return void 0;
}
if (!container || container.kind === 311 /* SourceFile */ && !isExternalOrCommonJsModule(container)) {
return void 0;
}
scope = container;
if (isFunctionExpression(scope)) {
let next;
while (next = getNextJSDocCommentLocation(scope)) {
scope = next;
}
}
}
return exposedByParent ? scope.getSourceFile() : scope;
}
function isSymbolReferencedInFile(definition, checker, sourceFile, searchContainer = sourceFile) {
return eachSymbolReferenceInFile(definition, checker, sourceFile, () => true, searchContainer) || false;
}
Core2.isSymbolReferencedInFile = isSymbolReferencedInFile;
function eachSymbolReferenceInFile(definition, checker, sourceFile, cb, searchContainer = sourceFile) {
const symbol = isParameterPropertyDeclaration(definition.parent, definition.parent.parent) ? first(checker.getSymbolsOfParameterPropertyDeclaration(definition.parent, definition.text)) : checker.getSymbolAtLocation(definition);
if (!symbol)
return void 0;
for (const token of getPossibleSymbolReferenceNodes(sourceFile, symbol.name, searchContainer)) {
if (!isIdentifier(token) || token === definition || token.escapedText !== definition.escapedText)
continue;
const referenceSymbol = checker.getSymbolAtLocation(token);
if (referenceSymbol === symbol || checker.getShorthandAssignmentValueSymbol(token.parent) === symbol || isExportSpecifier(token.parent) && getLocalSymbolForExportSpecifier(token, referenceSymbol, token.parent, checker) === symbol) {
const res = cb(token);
if (res)
return res;
}
}
}
Core2.eachSymbolReferenceInFile = eachSymbolReferenceInFile;
function getTopMostDeclarationNamesInFile(declarationName, sourceFile) {
const candidates = filter(getPossibleSymbolReferenceNodes(sourceFile, declarationName), (name) => !!getDeclarationFromName(name));
return candidates.reduce((topMost, decl) => {
const depth = getDepth(decl);
if (!some(topMost.declarationNames) || depth === topMost.depth) {
topMost.declarationNames.push(decl);
topMost.depth = depth;
} else if (depth < topMost.depth) {
topMost.declarationNames = [decl];
topMost.depth = depth;
}
return topMost;
}, { depth: Infinity, declarationNames: [] }).declarationNames;
function getDepth(declaration) {
let depth = 0;
while (declaration) {
declaration = getContainerNode(declaration);
depth++;
}
return depth;
}
}
Core2.getTopMostDeclarationNamesInFile = getTopMostDeclarationNamesInFile;
function someSignatureUsage(signature, sourceFiles, checker, cb) {
if (!signature.name || !isIdentifier(signature.name))
return false;
const symbol = Debug.checkDefined(checker.getSymbolAtLocation(signature.name));
for (const sourceFile of sourceFiles) {
for (const name of getPossibleSymbolReferenceNodes(sourceFile, symbol.name)) {
if (!isIdentifier(name) || name === signature.name || name.escapedText !== signature.name.escapedText)
continue;
const called = climbPastPropertyAccess(name);
const call = isCallExpression(called.parent) && called.parent.expression === called ? called.parent : void 0;
const referenceSymbol = checker.getSymbolAtLocation(name);
if (referenceSymbol && checker.getRootSymbols(referenceSymbol).some((s) => s === symbol)) {
if (cb(name, call)) {
return true;
}
}
}
}
return false;
}
Core2.someSignatureUsage = someSignatureUsage;
function getPossibleSymbolReferenceNodes(sourceFile, symbolName2, container = sourceFile) {
return getPossibleSymbolReferencePositions(sourceFile, symbolName2, container).map((pos) => getTouchingPropertyName(sourceFile, pos));
}
function getPossibleSymbolReferencePositions(sourceFile, symbolName2, container = sourceFile) {
const positions = [];
if (!symbolName2 || !symbolName2.length) {
return positions;
}
const text = sourceFile.text;
const sourceLength = text.length;
const symbolNameLength = symbolName2.length;
let position = text.indexOf(symbolName2, container.pos);
while (position >= 0) {
if (position > container.end)
break;
const endPosition = position + symbolNameLength;
if ((position === 0 || !isIdentifierPart(text.charCodeAt(position - 1), 99 /* Latest */)) && (endPosition === sourceLength || !isIdentifierPart(text.charCodeAt(endPosition), 99 /* Latest */))) {
positions.push(position);
}
position = text.indexOf(symbolName2, position + symbolNameLength + 1);
}
return positions;
}
function getLabelReferencesInNode(container, targetLabel) {
const sourceFile = container.getSourceFile();
const labelName = targetLabel.text;
const references = mapDefined(getPossibleSymbolReferenceNodes(sourceFile, labelName, container), (node) => (
// Only pick labels that are either the target label, or have a target that is the target label
node === targetLabel || isJumpStatementTarget(node) && getTargetLabel(node, labelName) === targetLabel ? nodeEntry(node) : void 0
));
return [{ definition: { type: 1 /* Label */, node: targetLabel }, references }];
}
function isValidReferencePosition(node, searchSymbolName) {
switch (node.kind) {
case 81 /* PrivateIdentifier */:
if (isJSDocMemberName(node.parent)) {
return true;
}
case 80 /* Identifier */:
return node.text.length === searchSymbolName.length;
case 15 /* NoSubstitutionTemplateLiteral */:
case 11 /* StringLiteral */: {
const str = node;
return (isLiteralNameOfPropertyDeclarationOrIndexAccess(str) || isNameOfModuleDeclaration(node) || isExpressionOfExternalModuleImportEqualsDeclaration(node) || isCallExpression(node.parent) && isBindableObjectDefinePropertyCall(node.parent) && node.parent.arguments[1] === node) && str.text.length === searchSymbolName.length;
}
case 9 /* NumericLiteral */:
return isLiteralNameOfPropertyDeclarationOrIndexAccess(node) && node.text.length === searchSymbolName.length;
case 90 /* DefaultKeyword */:
return "default".length === searchSymbolName.length;
default:
return false;
}
}
function getAllReferencesForImportMeta(sourceFiles, cancellationToken) {
const references = flatMap(sourceFiles, (sourceFile) => {
cancellationToken.throwIfCancellationRequested();
return mapDefined(getPossibleSymbolReferenceNodes(sourceFile, "meta", sourceFile), (node) => {
const parent2 = node.parent;
if (isImportMeta(parent2)) {
return nodeEntry(parent2);
}
});
});
return references.length ? [{ definition: { type: 2 /* Keyword */, node: references[0].node }, references }] : void 0;
}
function getAllReferencesForKeyword(sourceFiles, keywordKind, cancellationToken, filter2) {
const references = flatMap(sourceFiles, (sourceFile) => {
cancellationToken.throwIfCancellationRequested();
return mapDefined(getPossibleSymbolReferenceNodes(sourceFile, tokenToString(keywordKind), sourceFile), (referenceLocation) => {
if (referenceLocation.kind === keywordKind && (!filter2 || filter2(referenceLocation))) {
return nodeEntry(referenceLocation);
}
});
});
return references.length ? [{ definition: { type: 2 /* Keyword */, node: references[0].node }, references }] : void 0;
}
function getReferencesInSourceFile(sourceFile, search, state, addReferencesHere = true) {
state.cancellationToken.throwIfCancellationRequested();
return getReferencesInContainer(sourceFile, sourceFile, search, state, addReferencesHere);
}
function getReferencesInContainer(container, sourceFile, search, state, addReferencesHere) {
if (!state.markSearchedSymbols(sourceFile, search.allSearchSymbols)) {
return;
}
for (const position of getPossibleSymbolReferencePositions(sourceFile, search.text, container)) {
getReferencesAtLocation(sourceFile, position, search, state, addReferencesHere);
}
}
function hasMatchingMeaning(referenceLocation, state) {
return !!(getMeaningFromLocation(referenceLocation) & state.searchMeaning);
}
function getReferencesAtLocation(sourceFile, position, search, state, addReferencesHere) {
const referenceLocation = getTouchingPropertyName(sourceFile, position);
if (!isValidReferencePosition(referenceLocation, search.text)) {
if (!state.options.implementations && (state.options.findInStrings && isInString(sourceFile, position) || state.options.findInComments && isInNonReferenceComment(sourceFile, position))) {
state.addStringOrCommentReference(sourceFile.fileName, createTextSpan(position, search.text.length));
}
return;
}
if (!hasMatchingMeaning(referenceLocation, state))
return;
let referenceSymbol = state.checker.getSymbolAtLocation(referenceLocation);
if (!referenceSymbol) {
return;
}
const parent2 = referenceLocation.parent;
if (isImportSpecifier(parent2) && parent2.propertyName === referenceLocation) {
return;
}
if (isExportSpecifier(parent2)) {
Debug.assert(referenceLocation.kind === 80 /* Identifier */);
getReferencesAtExportSpecifier(referenceLocation, referenceSymbol, parent2, search, state, addReferencesHere);
return;
}
const relatedSymbol = getRelatedSymbol(search, referenceSymbol, referenceLocation, state);
if (!relatedSymbol) {
getReferenceForShorthandProperty(referenceSymbol, search, state);
return;
}
switch (state.specialSearchKind) {
case 0 /* None */:
if (addReferencesHere)
addReference(referenceLocation, relatedSymbol, state);
break;
case 1 /* Constructor */:
addConstructorReferences(referenceLocation, sourceFile, search, state);
break;
case 2 /* Class */:
addClassStaticThisReferences(referenceLocation, search, state);
break;
default:
Debug.assertNever(state.specialSearchKind);
}
if (isInJSFile(referenceLocation) && isBindingElement(referenceLocation.parent) && isVariableDeclarationInitializedToBareOrAccessedRequire(referenceLocation.parent.parent.parent)) {
referenceSymbol = referenceLocation.parent.symbol;
if (!referenceSymbol)
return;
}
getImportOrExportReferences(referenceLocation, referenceSymbol, search, state);
}
function getReferencesAtExportSpecifier(referenceLocation, referenceSymbol, exportSpecifier, search, state, addReferencesHere, alwaysGetReferences) {
Debug.assert(!alwaysGetReferences || !!state.options.providePrefixAndSuffixTextForRename, "If alwaysGetReferences is true, then prefix/suffix text must be enabled");
const { parent: parent2, propertyName, name } = exportSpecifier;
const exportDeclaration = parent2.parent;
const localSymbol = getLocalSymbolForExportSpecifier(referenceLocation, referenceSymbol, exportSpecifier, state.checker);
if (!alwaysGetReferences && !search.includes(localSymbol)) {
return;
}
if (!propertyName) {
if (!(state.options.use === 2 /* Rename */ && name.escapedText === "default" /* Default */)) {
addRef();
}
} else if (referenceLocation === propertyName) {
if (!exportDeclaration.moduleSpecifier) {
addRef();
}
if (addReferencesHere && state.options.use !== 2 /* Rename */ && state.markSeenReExportRHS(name)) {
addReference(name, Debug.checkDefined(exportSpecifier.symbol), state);
}
} else {
if (state.markSeenReExportRHS(referenceLocation)) {
addRef();
}
}
if (!isForRenameWithPrefixAndSuffixText(state.options) || alwaysGetReferences) {
const isDefaultExport = referenceLocation.escapedText === "default" || exportSpecifier.name.escapedText === "default";
const exportKind = isDefaultExport ? 1 /* Default */ : 0 /* Named */;
const exportSymbol = Debug.checkDefined(exportSpecifier.symbol);
const exportInfo = getExportInfo(exportSymbol, exportKind, state.checker);
if (exportInfo) {
searchForImportsOfExport(referenceLocation, exportSymbol, exportInfo, state);
}
}
if (search.comingFrom !== 1 /* Export */ && exportDeclaration.moduleSpecifier && !propertyName && !isForRenameWithPrefixAndSuffixText(state.options)) {
const imported = state.checker.getExportSpecifierLocalTargetSymbol(exportSpecifier);
if (imported)
searchForImportedSymbol(imported, state);
}
function addRef() {
if (addReferencesHere)
addReference(referenceLocation, localSymbol, state);
}
}
function getLocalSymbolForExportSpecifier(referenceLocation, referenceSymbol, exportSpecifier, checker) {
return isExportSpecifierAlias(referenceLocation, exportSpecifier) && checker.getExportSpecifierLocalTargetSymbol(exportSpecifier) || referenceSymbol;
}
function isExportSpecifierAlias(referenceLocation, exportSpecifier) {
const { parent: parent2, propertyName, name } = exportSpecifier;
Debug.assert(propertyName === referenceLocation || name === referenceLocation);
if (propertyName) {
return propertyName === referenceLocation;
} else {
return !parent2.parent.moduleSpecifier;
}
}
function getImportOrExportReferences(referenceLocation, referenceSymbol, search, state) {
const importOrExport = getImportOrExportSymbol(referenceLocation, referenceSymbol, state.checker, search.comingFrom === 1 /* Export */);
if (!importOrExport)
return;
const { symbol } = importOrExport;
if (importOrExport.kind === 0 /* Import */) {
if (!isForRenameWithPrefixAndSuffixText(state.options)) {
searchForImportedSymbol(symbol, state);
}
} else {
searchForImportsOfExport(referenceLocation, symbol, importOrExport.exportInfo, state);
}
}
function getReferenceForShorthandProperty({ flags, valueDeclaration }, search, state) {
const shorthandValueSymbol = state.checker.getShorthandAssignmentValueSymbol(valueDeclaration);
const name = valueDeclaration && getNameOfDeclaration(valueDeclaration);
if (!(flags & 33554432 /* Transient */) && name && search.includes(shorthandValueSymbol)) {
addReference(name, shorthandValueSymbol, state);
}
}
function addReference(referenceLocation, relatedSymbol, state) {
const { kind, symbol } = "kind" in relatedSymbol ? relatedSymbol : { kind: void 0, symbol: relatedSymbol };
if (state.options.use === 2 /* Rename */ && referenceLocation.kind === 90 /* DefaultKeyword */) {
return;
}
const addRef = state.referenceAdder(symbol);
if (state.options.implementations) {
addImplementationReferences(referenceLocation, addRef, state);
} else {
addRef(referenceLocation, kind);
}
}
function addConstructorReferences(referenceLocation, sourceFile, search, state) {
if (isNewExpressionTarget(referenceLocation)) {
addReference(referenceLocation, search.symbol, state);
}
const pusher = () => state.referenceAdder(search.symbol);
if (isClassLike(referenceLocation.parent)) {
Debug.assert(referenceLocation.kind === 90 /* DefaultKeyword */ || referenceLocation.parent.name === referenceLocation);
findOwnConstructorReferences(search.symbol, sourceFile, pusher());
} else {
const classExtending = tryGetClassByExtendingIdentifier(referenceLocation);
if (classExtending) {
findSuperConstructorAccesses(classExtending, pusher());
findInheritedConstructorReferences(classExtending, state);
}
}
}
function addClassStaticThisReferences(referenceLocation, search, state) {
addReference(referenceLocation, search.symbol, state);
const classLike = referenceLocation.parent;
if (state.options.use === 2 /* Rename */ || !isClassLike(classLike))
return;
Debug.assert(classLike.name === referenceLocation);
const addRef = state.referenceAdder(search.symbol);
for (const member of classLike.members) {
if (!(isMethodOrAccessor(member) && isStatic(member))) {
continue;
}
if (member.body) {
member.body.forEachChild(function cb(node) {
if (node.kind === 110 /* ThisKeyword */) {
addRef(node);
} else if (!isFunctionLike(node) && !isClassLike(node)) {
node.forEachChild(cb);
}
});
}
}
}
function findOwnConstructorReferences(classSymbol, sourceFile, addNode) {
const constructorSymbol = getClassConstructorSymbol(classSymbol);
if (constructorSymbol && constructorSymbol.declarations) {
for (const decl of constructorSymbol.declarations) {
const ctrKeyword = findChildOfKind(decl, 137 /* ConstructorKeyword */, sourceFile);
Debug.assert(decl.kind === 175 /* Constructor */ && !!ctrKeyword);
addNode(ctrKeyword);
}
}
if (classSymbol.exports) {
classSymbol.exports.forEach((member) => {
const decl = member.valueDeclaration;
if (decl && decl.kind === 173 /* MethodDeclaration */) {
const body = decl.body;
if (body) {
forEachDescendantOfKind(body, 110 /* ThisKeyword */, (thisKeyword) => {
if (isNewExpressionTarget(thisKeyword)) {
addNode(thisKeyword);
}
});
}
}
});
}
}
function getClassConstructorSymbol(classSymbol) {
return classSymbol.members && classSymbol.members.get("__constructor" /* Constructor */);
}
function findSuperConstructorAccesses(classDeclaration, addNode) {
const constructor = getClassConstructorSymbol(classDeclaration.symbol);
if (!(constructor && constructor.declarations)) {
return;
}
for (const decl of constructor.declarations) {
Debug.assert(decl.kind === 175 /* Constructor */);
const body = decl.body;
if (body) {
forEachDescendantOfKind(body, 108 /* SuperKeyword */, (node) => {
if (isCallExpressionTarget(node)) {
addNode(node);
}
});
}
}
}
function hasOwnConstructor(classDeclaration) {
return !!getClassConstructorSymbol(classDeclaration.symbol);
}
function findInheritedConstructorReferences(classDeclaration, state) {
if (hasOwnConstructor(classDeclaration))
return;
const classSymbol = classDeclaration.symbol;
const search = state.createSearch(
/*location*/
void 0,
classSymbol,
/*comingFrom*/
void 0
);
getReferencesInContainerOrFiles(classSymbol, state, search);
}
function addImplementationReferences(refNode, addReference2, state) {
if (isDeclarationName(refNode) && isImplementation(refNode.parent)) {
addReference2(refNode);
return;
}
if (refNode.kind !== 80 /* Identifier */) {
return;
}
if (refNode.parent.kind === 303 /* ShorthandPropertyAssignment */) {
getReferenceEntriesForShorthandPropertyAssignment(refNode, state.checker, addReference2);
}
const containingClass = getContainingClassIfInHeritageClause(refNode);
if (containingClass) {
addReference2(containingClass);
return;
}
const typeNode = findAncestor(refNode, (a) => !isQualifiedName(a.parent) && !isTypeNode(a.parent) && !isTypeElement(a.parent));
const typeHavingNode = typeNode.parent;
if (hasType(typeHavingNode) && typeHavingNode.type === typeNode && state.markSeenContainingTypeReference(typeHavingNode)) {
if (hasInitializer(typeHavingNode)) {
addIfImplementation(typeHavingNode.initializer);
} else if (isFunctionLike(typeHavingNode) && typeHavingNode.body) {
const body = typeHavingNode.body;
if (body.kind === 240 /* Block */) {
forEachReturnStatement(body, (returnStatement) => {
if (returnStatement.expression)
addIfImplementation(returnStatement.expression);
});
} else {
addIfImplementation(body);
}
} else if (isAssertionExpression(typeHavingNode)) {
addIfImplementation(typeHavingNode.expression);
}
}
function addIfImplementation(e) {
if (isImplementationExpression(e))
addReference2(e);
}
}
function getContainingClassIfInHeritageClause(node) {
return isIdentifier(node) || isPropertyAccessExpression(node) ? getContainingClassIfInHeritageClause(node.parent) : isExpressionWithTypeArguments(node) ? tryCast(node.parent.parent, isClassLike) : void 0;
}
function isImplementationExpression(node) {
switch (node.kind) {
case 216 /* ParenthesizedExpression */:
return isImplementationExpression(node.expression);
case 218 /* ArrowFunction */:
case 217 /* FunctionExpression */:
case 209 /* ObjectLiteralExpression */:
case 230 /* ClassExpression */:
case 208 /* ArrayLiteralExpression */:
return true;
default:
return false;
}
}
function explicitlyInheritsFrom(symbol, parent2, cachedResults, checker) {
if (symbol === parent2) {
return true;
}
const key = getSymbolId(symbol) + "," + getSymbolId(parent2);
const cached = cachedResults.get(key);
if (cached !== void 0) {
return cached;
}
cachedResults.set(key, false);
const inherits = !!symbol.declarations && symbol.declarations.some((declaration) => getAllSuperTypeNodes(declaration).some((typeReference) => {
const type = checker.getTypeAtLocation(typeReference);
return !!type && !!type.symbol && explicitlyInheritsFrom(type.symbol, parent2, cachedResults, checker);
}));
cachedResults.set(key, inherits);
return inherits;
}
function getReferencesForSuperKeyword(superKeyword) {
let searchSpaceNode = getSuperContainer(
superKeyword,
/*stopOnFunctions*/
false
);
if (!searchSpaceNode) {
return void 0;
}
let staticFlag = 32 /* Static */;
switch (searchSpaceNode.kind) {
case 171 /* PropertyDeclaration */:
case 170 /* PropertySignature */:
case 173 /* MethodDeclaration */:
case 172 /* MethodSignature */:
case 175 /* Constructor */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
staticFlag &= getSyntacticModifierFlags(searchSpaceNode);
searchSpaceNode = searchSpaceNode.parent;
break;
default:
return void 0;
}
const sourceFile = searchSpaceNode.getSourceFile();
const references = mapDefined(getPossibleSymbolReferenceNodes(sourceFile, "super", searchSpaceNode), (node) => {
if (node.kind !== 108 /* SuperKeyword */) {
return;
}
const container = getSuperContainer(
node,
/*stopOnFunctions*/
false
);
return container && isStatic(container) === !!staticFlag && container.parent.symbol === searchSpaceNode.symbol ? nodeEntry(node) : void 0;
});
return [{ definition: { type: 0 /* Symbol */, symbol: searchSpaceNode.symbol }, references }];
}
function isParameterName(node) {
return node.kind === 80 /* Identifier */ && node.parent.kind === 168 /* Parameter */ && node.parent.name === node;
}
function getReferencesForThisKeyword(thisOrSuperKeyword, sourceFiles, cancellationToken) {
let searchSpaceNode = getThisContainer(
thisOrSuperKeyword,
/*includeArrowFunctions*/
false,
/*includeClassComputedPropertyName*/
false
);
let staticFlag = 32 /* Static */;
switch (searchSpaceNode.kind) {
case 173 /* MethodDeclaration */:
case 172 /* MethodSignature */:
if (isObjectLiteralMethod(searchSpaceNode)) {
staticFlag &= getSyntacticModifierFlags(searchSpaceNode);
searchSpaceNode = searchSpaceNode.parent;
break;
}
case 171 /* PropertyDeclaration */:
case 170 /* PropertySignature */:
case 175 /* Constructor */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
staticFlag &= getSyntacticModifierFlags(searchSpaceNode);
searchSpaceNode = searchSpaceNode.parent;
break;
case 311 /* SourceFile */:
if (isExternalModule(searchSpaceNode) || isParameterName(thisOrSuperKeyword)) {
return void 0;
}
case 261 /* FunctionDeclaration */:
case 217 /* FunctionExpression */:
break;
default:
return void 0;
}
const references = flatMap(searchSpaceNode.kind === 311 /* SourceFile */ ? sourceFiles : [searchSpaceNode.getSourceFile()], (sourceFile) => {
cancellationToken.throwIfCancellationRequested();
return getPossibleSymbolReferenceNodes(sourceFile, "this", isSourceFile(searchSpaceNode) ? sourceFile : searchSpaceNode).filter((node) => {
if (!isThis(node)) {
return false;
}
const container = getThisContainer(
node,
/*includeArrowFunctions*/
false,
/*includeClassComputedPropertyName*/
false
);
if (!canHaveSymbol(container))
return false;
switch (searchSpaceNode.kind) {
case 217 /* FunctionExpression */:
case 261 /* FunctionDeclaration */:
return searchSpaceNode.symbol === container.symbol;
case 173 /* MethodDeclaration */:
case 172 /* MethodSignature */:
return isObjectLiteralMethod(searchSpaceNode) && searchSpaceNode.symbol === container.symbol;
case 230 /* ClassExpression */:
case 262 /* ClassDeclaration */:
case 209 /* ObjectLiteralExpression */:
return container.parent && canHaveSymbol(container.parent) && searchSpaceNode.symbol === container.parent.symbol && isStatic(container) === !!staticFlag;
case 311 /* SourceFile */:
return container.kind === 311 /* SourceFile */ && !isExternalModule(container) && !isParameterName(node);
}
});
}).map((n) => nodeEntry(n));
const thisParameter = firstDefined(references, (r) => isParameter(r.node.parent) ? r.node : void 0);
return [{
definition: { type: 3 /* This */, node: thisParameter || thisOrSuperKeyword },
references
}];
}
function getReferencesForStringLiteral(node, sourceFiles, checker, cancellationToken) {
const type = getContextualTypeFromParentOrAncestorTypeNode(node, checker);
const references = flatMap(sourceFiles, (sourceFile) => {
cancellationToken.throwIfCancellationRequested();
return mapDefined(getPossibleSymbolReferenceNodes(sourceFile, node.text), (ref) => {
if (isStringLiteralLike(ref) && ref.text === node.text) {
if (type) {
const refType = getContextualTypeFromParentOrAncestorTypeNode(ref, checker);
if (type !== checker.getStringType() && type === refType) {
return nodeEntry(ref, 2 /* StringLiteral */);
}
} else {
return isNoSubstitutionTemplateLiteral(ref) && !rangeIsOnSingleLine(ref, sourceFile) ? void 0 : nodeEntry(ref, 2 /* StringLiteral */);
}
}
});
});
return [{
definition: { type: 4 /* String */, node },
references
}];
}
function populateSearchSymbolSet(symbol, location, checker, isForRename, providePrefixAndSuffixText, implementations) {
const result = [];
forEachRelatedSymbol(
symbol,
location,
checker,
isForRename,
!(isForRename && providePrefixAndSuffixText),
(sym, root, base) => {
if (base) {
if (isStaticSymbol(symbol) !== isStaticSymbol(base)) {
base = void 0;
}
}
result.push(base || root || sym);
},
// when try to find implementation, implementations is true, and not allowed to find base class
/*allowBaseTypes*/
() => !implementations
);
return result;
}
function forEachRelatedSymbol(symbol, location, checker, isForRenamePopulateSearchSymbolSet, onlyIncludeBindingElementAtReferenceLocation, cbSymbol, allowBaseTypes) {
const containingObjectLiteralElement = getContainingObjectLiteralElement(location);
if (containingObjectLiteralElement) {
const shorthandValueSymbol = checker.getShorthandAssignmentValueSymbol(location.parent);
if (shorthandValueSymbol && isForRenamePopulateSearchSymbolSet) {
return cbSymbol(
shorthandValueSymbol,
/*rootSymbol*/
void 0,
/*baseSymbol*/
void 0,
3 /* SearchedLocalFoundProperty */
);
}
const contextualType = checker.getContextualType(containingObjectLiteralElement.parent);
const res2 = contextualType && firstDefined(
getPropertySymbolsFromContextualType(
containingObjectLiteralElement,
checker,
contextualType,
/*unionSymbolOk*/
true
),
(sym) => fromRoot(sym, 4 /* SearchedPropertyFoundLocal */)
);
if (res2)
return res2;
const propertySymbol = getPropertySymbolOfDestructuringAssignment(location, checker);
const res1 = propertySymbol && cbSymbol(
propertySymbol,
/*rootSymbol*/
void 0,
/*baseSymbol*/
void 0,
4 /* SearchedPropertyFoundLocal */
);
if (res1)
return res1;
const res22 = shorthandValueSymbol && cbSymbol(
shorthandValueSymbol,
/*rootSymbol*/
void 0,
/*baseSymbol*/
void 0,
3 /* SearchedLocalFoundProperty */
);
if (res22)
return res22;
}
const aliasedSymbol = getMergedAliasedSymbolOfNamespaceExportDeclaration(location, symbol, checker);
if (aliasedSymbol) {
const res2 = cbSymbol(
aliasedSymbol,
/*rootSymbol*/
void 0,
/*baseSymbol*/
void 0,
1 /* Node */
);
if (res2)
return res2;
}
const res = fromRoot(symbol);
if (res)
return res;
if (symbol.valueDeclaration && isParameterPropertyDeclaration(symbol.valueDeclaration, symbol.valueDeclaration.parent)) {
const paramProps = checker.getSymbolsOfParameterPropertyDeclaration(cast(symbol.valueDeclaration, isParameter), symbol.name);
Debug.assert(paramProps.length === 2 && !!(paramProps[0].flags & 1 /* FunctionScopedVariable */) && !!(paramProps[1].flags & 4 /* Property */));
return fromRoot(symbol.flags & 1 /* FunctionScopedVariable */ ? paramProps[1] : paramProps[0]);
}
const exportSpecifier = getDeclarationOfKind(symbol, 280 /* ExportSpecifier */);
if (!isForRenamePopulateSearchSymbolSet || exportSpecifier && !exportSpecifier.propertyName) {
const localSymbol = exportSpecifier && checker.getExportSpecifierLocalTargetSymbol(exportSpecifier);
if (localSymbol) {
const res2 = cbSymbol(
localSymbol,
/*rootSymbol*/
void 0,
/*baseSymbol*/
void 0,
1 /* Node */
);
if (res2)
return res2;
}
}
if (!isForRenamePopulateSearchSymbolSet) {
let bindingElementPropertySymbol;
if (onlyIncludeBindingElementAtReferenceLocation) {
bindingElementPropertySymbol = isObjectBindingElementWithoutPropertyName(location.parent) ? getPropertySymbolFromBindingElement(checker, location.parent) : void 0;
} else {
bindingElementPropertySymbol = getPropertySymbolOfObjectBindingPatternWithoutPropertyName(symbol, checker);
}
return bindingElementPropertySymbol && fromRoot(bindingElementPropertySymbol, 4 /* SearchedPropertyFoundLocal */);
}
Debug.assert(isForRenamePopulateSearchSymbolSet);
const includeOriginalSymbolOfBindingElement = onlyIncludeBindingElementAtReferenceLocation;
if (includeOriginalSymbolOfBindingElement) {
const bindingElementPropertySymbol = getPropertySymbolOfObjectBindingPatternWithoutPropertyName(symbol, checker);
return bindingElementPropertySymbol && fromRoot(bindingElementPropertySymbol, 4 /* SearchedPropertyFoundLocal */);
}
function fromRoot(sym, kind) {
return firstDefined(checker.getRootSymbols(sym), (rootSymbol) => cbSymbol(
sym,
rootSymbol,
/*baseSymbol*/
void 0,
kind
) || (rootSymbol.parent && rootSymbol.parent.flags & (32 /* Class */ | 64 /* Interface */) && allowBaseTypes(rootSymbol) ? getPropertySymbolsFromBaseTypes(rootSymbol.parent, rootSymbol.name, checker, (base) => cbSymbol(sym, rootSymbol, base, kind)) : void 0));
}
function getPropertySymbolOfObjectBindingPatternWithoutPropertyName(symbol2, checker2) {
const bindingElement = getDeclarationOfKind(symbol2, 207 /* BindingElement */);
if (bindingElement && isObjectBindingElementWithoutPropertyName(bindingElement)) {
return getPropertySymbolFromBindingElement(checker2, bindingElement);
}
}
}
function getPropertySymbolsFromBaseTypes(symbol, propertyName, checker, cb) {
const seen = /* @__PURE__ */ new Map();
return recur(symbol);
function recur(symbol2) {
if (!(symbol2.flags & (32 /* Class */ | 64 /* Interface */)) || !addToSeen(seen, getSymbolId(symbol2)))
return;
return firstDefined(symbol2.declarations, (declaration) => firstDefined(getAllSuperTypeNodes(declaration), (typeReference) => {
const type = checker.getTypeAtLocation(typeReference);
const propertySymbol = type && type.symbol && checker.getPropertyOfType(type, propertyName);
return type && propertySymbol && (firstDefined(checker.getRootSymbols(propertySymbol), cb) || recur(type.symbol));
}));
}
}
function isStaticSymbol(symbol) {
if (!symbol.valueDeclaration)
return false;
const modifierFlags = getEffectiveModifierFlags(symbol.valueDeclaration);
return !!(modifierFlags & 32 /* Static */);
}
function getRelatedSymbol(search, referenceSymbol, referenceLocation, state) {
const { checker } = state;
return forEachRelatedSymbol(
referenceSymbol,
referenceLocation,
checker,
/*isForRenamePopulateSearchSymbolSet*/
false,
/*onlyIncludeBindingElementAtReferenceLocation*/
state.options.use !== 2 /* Rename */ || !!state.options.providePrefixAndSuffixTextForRename,
(sym, rootSymbol, baseSymbol, kind) => {
if (baseSymbol) {
if (isStaticSymbol(referenceSymbol) !== isStaticSymbol(baseSymbol)) {
baseSymbol = void 0;
}
}
return search.includes(baseSymbol || rootSymbol || sym) ? { symbol: rootSymbol && !(getCheckFlags(sym) & 6 /* Synthetic */) ? rootSymbol : sym, kind } : void 0;
},
/*allowBaseTypes*/
(rootSymbol) => !(search.parents && !search.parents.some((parent2) => explicitlyInheritsFrom(rootSymbol.parent, parent2, state.inheritsFromCache, checker)))
);
}
function getIntersectingMeaningFromDeclarations(node, symbol) {
let meaning = getMeaningFromLocation(node);
const { declarations } = symbol;
if (declarations) {
let lastIterationMeaning;
do {
lastIterationMeaning = meaning;
for (const declaration of declarations) {
const declarationMeaning = getMeaningFromDeclaration(declaration);
if (declarationMeaning & meaning) {
meaning |= declarationMeaning;
}
}
} while (meaning !== lastIterationMeaning);
}
return meaning;
}
Core2.getIntersectingMeaningFromDeclarations = getIntersectingMeaningFromDeclarations;
function isImplementation(node) {
return !!(node.flags & 16777216 /* Ambient */) ? !(isInterfaceDeclaration(node) || isTypeAliasDeclaration(node)) : isVariableLike(node) ? hasInitializer(node) : isFunctionLikeDeclaration(node) ? !!node.body : isClassLike(node) || isModuleOrEnumDeclaration(node);
}
function getReferenceEntriesForShorthandPropertyAssignment(node, checker, addReference2) {
const refSymbol = checker.getSymbolAtLocation(node);
const shorthandSymbol = checker.getShorthandAssignmentValueSymbol(refSymbol.valueDeclaration);
if (shorthandSymbol) {
for (const declaration of shorthandSymbol.getDeclarations()) {
if (getMeaningFromDeclaration(declaration) & 1 /* Value */) {
addReference2(declaration);
}
}
}
}
Core2.getReferenceEntriesForShorthandPropertyAssignment = getReferenceEntriesForShorthandPropertyAssignment;
function forEachDescendantOfKind(node, kind, action) {
forEachChild(node, (child) => {
if (child.kind === kind) {
action(child);
}
forEachDescendantOfKind(child, kind, action);
});
}
function tryGetClassByExtendingIdentifier(node) {
return tryGetClassExtendingExpressionWithTypeArguments(climbPastPropertyAccess(node).parent);
}
function getParentSymbolsOfPropertyAccess(location, symbol, checker) {
const propertyAccessExpression = isRightSideOfPropertyAccess(location) ? location.parent : void 0;
const lhsType = propertyAccessExpression && checker.getTypeAtLocation(propertyAccessExpression.expression);
const res = mapDefined(lhsType && (lhsType.isUnionOrIntersection() ? lhsType.types : lhsType.symbol === symbol.parent ? void 0 : [lhsType]), (t) => t.symbol && t.symbol.flags & (32 /* Class */ | 64 /* Interface */) ? t.symbol : void 0);
return res.length === 0 ? void 0 : res;
}
function isForRenameWithPrefixAndSuffixText(options) {
return options.use === 2 /* Rename */ && options.providePrefixAndSuffixTextForRename;
}
})(Core || (Core = {}));
// src/services/_namespaces/ts.GoToDefinition.ts
var ts_GoToDefinition_exports = {};
__export(ts_GoToDefinition_exports, {
createDefinitionInfo: () => createDefinitionInfo,
findReferenceInPosition: () => findReferenceInPosition,
getDefinitionAndBoundSpan: () => getDefinitionAndBoundSpan,
getDefinitionAtPosition: () => getDefinitionAtPosition,
getReferenceAtPosition: () => getReferenceAtPosition,
getTypeDefinitionAtPosition: () => getTypeDefinitionAtPosition
});
// src/services/goToDefinition.ts
function getDefinitionAtPosition(program, sourceFile, position, searchOtherFilesOnly, stopAtAlias) {
var _a, _b;
const resolvedRef = getReferenceAtPosition(sourceFile, position, program);
const fileReferenceDefinition = resolvedRef && [getDefinitionInfoForFileReference(resolvedRef.reference.fileName, resolvedRef.fileName, resolvedRef.unverified)] || emptyArray;
if (resolvedRef == null ? void 0 : resolvedRef.file) {
return fileReferenceDefinition;
}
const node = getTouchingPropertyName(sourceFile, position);
if (node === sourceFile) {
return void 0;
}
const { parent: parent2 } = node;
const typeChecker = program.getTypeChecker();
if (node.kind === 163 /* OverrideKeyword */ || isIdentifier(node) && isJSDocOverrideTag(parent2) && parent2.tagName === node) {
return getDefinitionFromOverriddenMember(typeChecker, node) || emptyArray;
}
if (isJumpStatementTarget(node)) {
const label = getTargetLabel(node.parent, node.text);
return label ? [createDefinitionInfoFromName(
typeChecker,
label,
"label" /* label */,
node.text,
/*containerName*/
void 0
)] : void 0;
}
if (node.kind === 107 /* ReturnKeyword */) {
const functionDeclaration = findAncestor(node.parent, (n) => isClassStaticBlockDeclaration(n) ? "quit" : isFunctionLikeDeclaration(n));
return functionDeclaration ? [createDefinitionFromSignatureDeclaration(typeChecker, functionDeclaration)] : void 0;
}
if (node.kind === 135 /* AwaitKeyword */) {
const functionDeclaration = findAncestor(node, (n) => isFunctionLikeDeclaration(n));
const isAsyncFunction2 = functionDeclaration && some(functionDeclaration.modifiers, (node2) => node2.kind === 134 /* AsyncKeyword */);
return isAsyncFunction2 ? [createDefinitionFromSignatureDeclaration(typeChecker, functionDeclaration)] : void 0;
}
if (node.kind === 127 /* YieldKeyword */) {
const functionDeclaration = findAncestor(node, (n) => isFunctionLikeDeclaration(n));
const isGeneratorFunction = functionDeclaration && functionDeclaration.asteriskToken;
return isGeneratorFunction ? [createDefinitionFromSignatureDeclaration(typeChecker, functionDeclaration)] : void 0;
}
if (isStaticModifier(node) && isClassStaticBlockDeclaration(node.parent)) {
const classDecl = node.parent.parent;
const { symbol: symbol2, failedAliasResolution: failedAliasResolution2 } = getSymbol(classDecl, typeChecker, stopAtAlias);
const staticBlocks = filter(classDecl.members, isClassStaticBlockDeclaration);
const containerName = symbol2 ? typeChecker.symbolToString(symbol2, classDecl) : "";
const sourceFile2 = node.getSourceFile();
return map(staticBlocks, (staticBlock) => {
let { pos } = moveRangePastModifiers(staticBlock);
pos = skipTrivia(sourceFile2.text, pos);
return createDefinitionInfoFromName(
typeChecker,
staticBlock,
"constructor" /* constructorImplementationElement */,
"static {}",
containerName,
/*unverified*/
false,
failedAliasResolution2,
{ start: pos, length: "static".length }
);
});
}
let { symbol, failedAliasResolution } = getSymbol(node, typeChecker, stopAtAlias);
let fallbackNode = node;
if (searchOtherFilesOnly && failedAliasResolution) {
const importDeclaration = forEach([node, ...(symbol == null ? void 0 : symbol.declarations) || emptyArray], (n) => findAncestor(n, isAnyImportOrBareOrAccessedRequire));
const moduleSpecifier = importDeclaration && tryGetModuleSpecifierFromDeclaration(importDeclaration);
if (moduleSpecifier) {
({ symbol, failedAliasResolution } = getSymbol(moduleSpecifier, typeChecker, stopAtAlias));
fallbackNode = moduleSpecifier;
}
}
if (!symbol && isModuleSpecifierLike(fallbackNode)) {
const ref = (_b = (_a = sourceFile.resolvedModules) == null ? void 0 : _a.get(fallbackNode.text, getModeForUsageLocation(sourceFile, fallbackNode))) == null ? void 0 : _b.resolvedModule;
if (ref) {
return [{
name: fallbackNode.text,
fileName: ref.resolvedFileName,
containerName: void 0,
containerKind: void 0,
kind: "script" /* scriptElement */,
textSpan: createTextSpan(0, 0),
failedAliasResolution,
isAmbient: isDeclarationFileName(ref.resolvedFileName),
unverified: fallbackNode !== node
}];
}
}
if (!symbol) {
return concatenate(fileReferenceDefinition, getDefinitionInfoForIndexSignatures(node, typeChecker));
}
if (searchOtherFilesOnly && every(symbol.declarations, (d) => d.getSourceFile().fileName === sourceFile.fileName))
return void 0;
const calledDeclaration = tryGetSignatureDeclaration(typeChecker, node);
if (calledDeclaration && !(isJsxOpeningLikeElement(node.parent) && isConstructorLike(calledDeclaration))) {
const sigInfo = createDefinitionFromSignatureDeclaration(typeChecker, calledDeclaration, failedAliasResolution);
if (typeChecker.getRootSymbols(symbol).some((s) => symbolMatchesSignature(s, calledDeclaration))) {
return [sigInfo];
} else {
const defs = getDefinitionFromSymbol(typeChecker, symbol, node, failedAliasResolution, calledDeclaration) || emptyArray;
return node.kind === 108 /* SuperKeyword */ ? [sigInfo, ...defs] : [...defs, sigInfo];
}
}
if (node.parent.kind === 303 /* ShorthandPropertyAssignment */) {
const shorthandSymbol = typeChecker.getShorthandAssignmentValueSymbol(symbol.valueDeclaration);
const definitions = (shorthandSymbol == null ? void 0 : shorthandSymbol.declarations) ? shorthandSymbol.declarations.map((decl) => createDefinitionInfo(
decl,
typeChecker,
shorthandSymbol,
node,
/*unverified*/
false,
failedAliasResolution
)) : emptyArray;
return concatenate(definitions, getDefinitionFromObjectLiteralElement(typeChecker, node));
}
if (isPropertyName(node) && isBindingElement(parent2) && isObjectBindingPattern(parent2.parent) && node === (parent2.propertyName || parent2.name)) {
const name = getNameFromPropertyName(node);
const type = typeChecker.getTypeAtLocation(parent2.parent);
return name === void 0 ? emptyArray : flatMap(type.isUnion() ? type.types : [type], (t) => {
const prop = t.getProperty(name);
return prop && getDefinitionFromSymbol(typeChecker, prop, node);
});
}
const objectLiteralElementDefinition = getDefinitionFromObjectLiteralElement(typeChecker, node);
return concatenate(fileReferenceDefinition, objectLiteralElementDefinition.length ? objectLiteralElementDefinition : getDefinitionFromSymbol(typeChecker, symbol, node, failedAliasResolution));
}
function symbolMatchesSignature(s, calledDeclaration) {
var _a;
return s === calledDeclaration.symbol || s === calledDeclaration.symbol.parent || isAssignmentExpression(calledDeclaration.parent) || !isCallLikeExpression(calledDeclaration.parent) && s === ((_a = tryCast(calledDeclaration.parent, canHaveSymbol)) == null ? void 0 : _a.symbol);
}
function getDefinitionFromObjectLiteralElement(typeChecker, node) {
const element = getContainingObjectLiteralElement(node);
if (element) {
const contextualType = element && typeChecker.getContextualType(element.parent);
if (contextualType) {
return flatMap(getPropertySymbolsFromContextualType(
element,
typeChecker,
contextualType,
/*unionSymbolOk*/
false
), (propertySymbol) => getDefinitionFromSymbol(typeChecker, propertySymbol, node));
}
}
return emptyArray;
}
function getDefinitionFromOverriddenMember(typeChecker, node) {
const classElement = findAncestor(node, isClassElement);
if (!(classElement && classElement.name))
return;
const baseDeclaration = findAncestor(classElement, isClassLike);
if (!baseDeclaration)
return;
const baseTypeNode = getEffectiveBaseTypeNode(baseDeclaration);
if (!baseTypeNode)
return;
const expression = skipParentheses(baseTypeNode.expression);
const base = isClassExpression(expression) ? expression.symbol : typeChecker.getSymbolAtLocation(expression);
if (!base)
return;
const name = unescapeLeadingUnderscores(getTextOfPropertyName(classElement.name));
const symbol = hasStaticModifier(classElement) ? typeChecker.getPropertyOfType(typeChecker.getTypeOfSymbol(base), name) : typeChecker.getPropertyOfType(typeChecker.getDeclaredTypeOfSymbol(base), name);
if (!symbol)
return;
return getDefinitionFromSymbol(typeChecker, symbol, node);
}
function getReferenceAtPosition(sourceFile, position, program) {
var _a, _b, _c, _d;
const referencePath = findReferenceInPosition(sourceFile.referencedFiles, position);
if (referencePath) {
const file = program.getSourceFileFromReference(sourceFile, referencePath);
return file && { reference: referencePath, fileName: file.fileName, file, unverified: false };
}
const typeReferenceDirective = findReferenceInPosition(sourceFile.typeReferenceDirectives, position);
if (typeReferenceDirective) {
const reference = (_a = program.getResolvedTypeReferenceDirectives().get(typeReferenceDirective.fileName, typeReferenceDirective.resolutionMode || sourceFile.impliedNodeFormat)) == null ? void 0 : _a.resolvedTypeReferenceDirective;
const file = reference && program.getSourceFile(reference.resolvedFileName);
return file && { reference: typeReferenceDirective, fileName: file.fileName, file, unverified: false };
}
const libReferenceDirective = findReferenceInPosition(sourceFile.libReferenceDirectives, position);
if (libReferenceDirective) {
const file = program.getLibFileFromReference(libReferenceDirective);
return file && { reference: libReferenceDirective, fileName: file.fileName, file, unverified: false };
}
if ((_b = sourceFile.resolvedModules) == null ? void 0 : _b.size()) {
const node = getTouchingToken(sourceFile, position);
if (isModuleSpecifierLike(node) && isExternalModuleNameRelative(node.text) && sourceFile.resolvedModules.has(node.text, getModeForUsageLocation(sourceFile, node))) {
const verifiedFileName = (_d = (_c = sourceFile.resolvedModules.get(node.text, getModeForUsageLocation(sourceFile, node))) == null ? void 0 : _c.resolvedModule) == null ? void 0 : _d.resolvedFileName;
const fileName = verifiedFileName || resolvePath(getDirectoryPath(sourceFile.fileName), node.text);
return {
file: program.getSourceFile(fileName),
fileName,
reference: {
pos: node.getStart(),
end: node.getEnd(),
fileName: node.text
},
unverified: !verifiedFileName
};
}
}
return void 0;
}
function getTypeDefinitionAtPosition(typeChecker, sourceFile, position) {
const node = getTouchingPropertyName(sourceFile, position);
if (node === sourceFile) {
return void 0;
}
if (isImportMeta(node.parent) && node.parent.name === node) {
return definitionFromType(
typeChecker.getTypeAtLocation(node.parent),
typeChecker,
node.parent,
/*failedAliasResolution*/
false
);
}
const { symbol, failedAliasResolution } = getSymbol(
node,
typeChecker,
/*stopAtAlias*/
false
);
if (!symbol)
return void 0;
const typeAtLocation = typeChecker.getTypeOfSymbolAtLocation(symbol, node);
const returnType = tryGetReturnTypeOfFunction(symbol, typeAtLocation, typeChecker);
const fromReturnType = returnType && definitionFromType(returnType, typeChecker, node, failedAliasResolution);
const typeDefinitions = fromReturnType && fromReturnType.length !== 0 ? fromReturnType : definitionFromType(typeAtLocation, typeChecker, node, failedAliasResolution);
return typeDefinitions.length ? typeDefinitions : !(symbol.flags & 111551 /* Value */) && symbol.flags & 788968 /* Type */ ? getDefinitionFromSymbol(typeChecker, skipAlias(symbol, typeChecker), node, failedAliasResolution) : void 0;
}
function definitionFromType(type, checker, node, failedAliasResolution) {
return flatMap(type.isUnion() && !(type.flags & 32 /* Enum */) ? type.types : [type], (t) => t.symbol && getDefinitionFromSymbol(checker, t.symbol, node, failedAliasResolution));
}
function tryGetReturnTypeOfFunction(symbol, type, checker) {
if (type.symbol === symbol || // At `const f = () => {}`, the symbol is `f` and the type symbol is at `() => {}`
symbol.valueDeclaration && type.symbol && isVariableDeclaration(symbol.valueDeclaration) && symbol.valueDeclaration.initializer === type.symbol.valueDeclaration) {
const sigs = type.getCallSignatures();
if (sigs.length === 1)
return checker.getReturnTypeOfSignature(first(sigs));
}
return void 0;
}
function getDefinitionAndBoundSpan(program, sourceFile, position) {
const definitions = getDefinitionAtPosition(program, sourceFile, position);
if (!definitions || definitions.length === 0) {
return void 0;
}
const comment = findReferenceInPosition(sourceFile.referencedFiles, position) || findReferenceInPosition(sourceFile.typeReferenceDirectives, position) || findReferenceInPosition(sourceFile.libReferenceDirectives, position);
if (comment) {
return { definitions, textSpan: createTextSpanFromRange(comment) };
}
const node = getTouchingPropertyName(sourceFile, position);
const textSpan = createTextSpan(node.getStart(), node.getWidth());
return { definitions, textSpan };
}
function getDefinitionInfoForIndexSignatures(node, checker) {
return mapDefined(checker.getIndexInfosAtLocation(node), (info) => info.declaration && createDefinitionFromSignatureDeclaration(checker, info.declaration));
}
function getSymbol(node, checker, stopAtAlias) {
const symbol = checker.getSymbolAtLocation(node);
let failedAliasResolution = false;
if ((symbol == null ? void 0 : symbol.declarations) && symbol.flags & 2097152 /* Alias */ && !stopAtAlias && shouldSkipAlias(node, symbol.declarations[0])) {
const aliased = checker.getAliasedSymbol(symbol);
if (aliased.declarations) {
return { symbol: aliased };
} else {
failedAliasResolution = true;
}
}
return { symbol, failedAliasResolution };
}
function shouldSkipAlias(node, declaration) {
if (node.kind !== 80 /* Identifier */) {
return false;
}
if (node.parent === declaration) {
return true;
}
if (declaration.kind === 273 /* NamespaceImport */) {
return false;
}
return true;
}
function isExpandoDeclaration(node) {
if (!isAssignmentDeclaration(node))
return false;
const containingAssignment = findAncestor(node, (p) => {
if (isAssignmentExpression(p))
return true;
if (!isAssignmentDeclaration(p))
return "quit";
return false;
});
return !!containingAssignment && getAssignmentDeclarationKind(containingAssignment) === 5 /* Property */;
}
function getDefinitionFromSymbol(typeChecker, symbol, node, failedAliasResolution, excludeDeclaration) {
const filteredDeclarations = filter(symbol.declarations, (d) => d !== excludeDeclaration);
const withoutExpandos = filter(filteredDeclarations, (d) => !isExpandoDeclaration(d));
const results = some(withoutExpandos) ? withoutExpandos : filteredDeclarations;
return getConstructSignatureDefinition() || getCallSignatureDefinition() || map(results, (declaration) => createDefinitionInfo(
declaration,
typeChecker,
symbol,
node,
/*unverified*/
false,
failedAliasResolution
));
function getConstructSignatureDefinition() {
if (symbol.flags & 32 /* Class */ && !(symbol.flags & (16 /* Function */ | 3 /* Variable */)) && (isNewExpressionTarget(node) || node.kind === 137 /* ConstructorKeyword */)) {
const cls = find(filteredDeclarations, isClassLike) || Debug.fail("Expected declaration to have at least one class-like declaration");
return getSignatureDefinition(
cls.members,
/*selectConstructors*/
true
);
}
}
function getCallSignatureDefinition() {
return isCallOrNewExpressionTarget(node) || isNameOfFunctionDeclaration(node) ? getSignatureDefinition(
filteredDeclarations,
/*selectConstructors*/
false
) : void 0;
}
function getSignatureDefinition(signatureDeclarations, selectConstructors) {
if (!signatureDeclarations) {
return void 0;
}
const declarations = signatureDeclarations.filter(selectConstructors ? isConstructorDeclaration : isFunctionLike);
const declarationsWithBody = declarations.filter((d) => !!d.body);
return declarations.length ? declarationsWithBody.length !== 0 ? declarationsWithBody.map((x) => createDefinitionInfo(x, typeChecker, symbol, node)) : [createDefinitionInfo(
last(declarations),
typeChecker,
symbol,
node,
/*unverified*/
false,
failedAliasResolution
)] : void 0;
}
}
function createDefinitionInfo(declaration, checker, symbol, node, unverified, failedAliasResolution) {
const symbolName2 = checker.symbolToString(symbol);
const symbolKind = ts_SymbolDisplay_exports.getSymbolKind(checker, symbol, node);
const containerName = symbol.parent ? checker.symbolToString(symbol.parent, node) : "";
return createDefinitionInfoFromName(checker, declaration, symbolKind, symbolName2, containerName, unverified, failedAliasResolution);
}
function createDefinitionInfoFromName(checker, declaration, symbolKind, symbolName2, containerName, unverified, failedAliasResolution, textSpan) {
const sourceFile = declaration.getSourceFile();
if (!textSpan) {
const name = getNameOfDeclaration(declaration) || declaration;
textSpan = createTextSpanFromNode(name, sourceFile);
}
return {
fileName: sourceFile.fileName,
textSpan,
kind: symbolKind,
name: symbolName2,
containerKind: void 0,
// TODO: GH#18217
containerName,
...ts_FindAllReferences_exports.toContextSpan(
textSpan,
sourceFile,
ts_FindAllReferences_exports.getContextNode(declaration)
),
isLocal: !isDefinitionVisible(checker, declaration),
isAmbient: !!(declaration.flags & 16777216 /* Ambient */),
unverified,
failedAliasResolution
};
}
function isDefinitionVisible(checker, declaration) {
if (checker.isDeclarationVisible(declaration))
return true;
if (!declaration.parent)
return false;
if (hasInitializer(declaration.parent) && declaration.parent.initializer === declaration)
return isDefinitionVisible(checker, declaration.parent);
switch (declaration.kind) {
case 171 /* PropertyDeclaration */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
case 173 /* MethodDeclaration */:
if (hasEffectiveModifier(declaration, 8 /* Private */))
return false;
case 175 /* Constructor */:
case 302 /* PropertyAssignment */:
case 303 /* ShorthandPropertyAssignment */:
case 209 /* ObjectLiteralExpression */:
case 230 /* ClassExpression */:
case 218 /* ArrowFunction */:
case 217 /* FunctionExpression */:
return isDefinitionVisible(checker, declaration.parent);
default:
return false;
}
}
function createDefinitionFromSignatureDeclaration(typeChecker, decl, failedAliasResolution) {
return createDefinitionInfo(
decl,
typeChecker,
decl.symbol,
decl,
/*unverified*/
false,
failedAliasResolution
);
}
function findReferenceInPosition(refs, pos) {
return find(refs, (ref) => textRangeContainsPositionInclusive(ref, pos));
}
function getDefinitionInfoForFileReference(name, targetFileName, unverified) {
return {
fileName: targetFileName,
textSpan: createTextSpanFromBounds(0, 0),
kind: "script" /* scriptElement */,
name,
containerName: void 0,
containerKind: void 0,
// TODO: GH#18217
unverified
};
}
function getAncestorCallLikeExpression(node) {
const target = findAncestor(node, (n) => !isRightSideOfPropertyAccess(n));
const callLike = target == null ? void 0 : target.parent;
return callLike && isCallLikeExpression(callLike) && getInvokedExpression(callLike) === target ? callLike : void 0;
}
function tryGetSignatureDeclaration(typeChecker, node) {
const callLike = getAncestorCallLikeExpression(node);
const signature = callLike && typeChecker.getResolvedSignature(callLike);
return tryCast(signature && signature.declaration, (d) => isFunctionLike(d) && !isFunctionTypeNode(d));
}
function isConstructorLike(node) {
switch (node.kind) {
case 175 /* Constructor */:
case 184 /* ConstructorType */:
case 179 /* ConstructSignature */:
return true;
default:
return false;
}
}
// src/services/_namespaces/ts.InlayHints.ts
var ts_InlayHints_exports = {};
__export(ts_InlayHints_exports, {
provideInlayHints: () => provideInlayHints
});
// src/services/inlayHints.ts
var maxHintsLength = 30;
var leadingParameterNameCommentRegexFactory = (name) => {
return new RegExp(`^\\s?/\\*\\*?\\s?${name}\\s?\\*\\/\\s?$`);
};
function shouldShowParameterNameHints(preferences) {
return preferences.includeInlayParameterNameHints === "literals" || preferences.includeInlayParameterNameHints === "all";
}
function shouldShowLiteralParameterNameHintsOnly(preferences) {
return preferences.includeInlayParameterNameHints === "literals";
}
function provideInlayHints(context) {
const { file, program, span, cancellationToken, preferences } = context;
const sourceFileText = file.text;
const compilerOptions = program.getCompilerOptions();
const checker = program.getTypeChecker();
const result = [];
visitor(file);
return result;
function visitor(node) {
if (!node || node.getFullWidth() === 0) {
return;
}
switch (node.kind) {
case 266 /* ModuleDeclaration */:
case 262 /* ClassDeclaration */:
case 263 /* InterfaceDeclaration */:
case 261 /* FunctionDeclaration */:
case 230 /* ClassExpression */:
case 217 /* FunctionExpression */:
case 173 /* MethodDeclaration */:
case 218 /* ArrowFunction */:
cancellationToken.throwIfCancellationRequested();
}
if (!textSpanIntersectsWith(span, node.pos, node.getFullWidth())) {
return;
}
if (isTypeNode(node) && !isExpressionWithTypeArguments(node)) {
return;
}
if (preferences.includeInlayVariableTypeHints && isVariableDeclaration(node)) {
visitVariableLikeDeclaration(node);
} else if (preferences.includeInlayPropertyDeclarationTypeHints && isPropertyDeclaration(node)) {
visitVariableLikeDeclaration(node);
} else if (preferences.includeInlayEnumMemberValueHints && isEnumMember(node)) {
visitEnumMember(node);
} else if (shouldShowParameterNameHints(preferences) && (isCallExpression(node) || isNewExpression(node))) {
visitCallOrNewExpression(node);
} else {
if (preferences.includeInlayFunctionParameterTypeHints && isFunctionLikeDeclaration(node) && hasContextSensitiveParameters(node)) {
visitFunctionLikeForParameterType(node);
}
if (preferences.includeInlayFunctionLikeReturnTypeHints && isSignatureSupportingReturnAnnotation(node)) {
visitFunctionDeclarationLikeForReturnType(node);
}
}
return forEachChild(node, visitor);
}
function isSignatureSupportingReturnAnnotation(node) {
return isArrowFunction(node) || isFunctionExpression(node) || isFunctionDeclaration(node) || isMethodDeclaration(node) || isGetAccessorDeclaration(node);
}
function addParameterHints(text, position, isFirstVariadicArgument) {
result.push({
text: `${isFirstVariadicArgument ? "..." : ""}${truncation(text, maxHintsLength)}:`,
position,
kind: "Parameter" /* Parameter */,
whitespaceAfter: true
});
}
function addTypeHints(text, position) {
result.push({
text: `: ${truncation(text, maxHintsLength)}`,
position,
kind: "Type" /* Type */,
whitespaceBefore: true
});
}
function addEnumMemberValueHints(text, position) {
result.push({
text: `= ${truncation(text, maxHintsLength)}`,
position,
kind: "Enum" /* Enum */,
whitespaceBefore: true
});
}
function visitEnumMember(member) {
if (member.initializer) {
return;
}
const enumValue = checker.getConstantValue(member);
if (enumValue !== void 0) {
addEnumMemberValueHints(enumValue.toString(), member.end);
}
}
function isModuleReferenceType(type) {
return type.symbol && type.symbol.flags & 1536 /* Module */;
}
function visitVariableLikeDeclaration(decl) {
if (!decl.initializer || isBindingPattern(decl.name) || isVariableDeclaration(decl) && !isHintableDeclaration(decl)) {
return;
}
const effectiveTypeAnnotation = getEffectiveTypeAnnotationNode(decl);
if (effectiveTypeAnnotation) {
return;
}
const declarationType = checker.getTypeAtLocation(decl);
if (isModuleReferenceType(declarationType)) {
return;
}
const typeDisplayString = printTypeInSingleLine(declarationType);
if (typeDisplayString) {
const isVariableNameMatchesType = preferences.includeInlayVariableTypeHintsWhenTypeMatchesName === false && equateStringsCaseInsensitive(decl.name.getText(), typeDisplayString);
if (isVariableNameMatchesType) {
return;
}
addTypeHints(typeDisplayString, decl.name.end);
}
}
function visitCallOrNewExpression(expr) {
const args = expr.arguments;
if (!args || !args.length) {
return;
}
const candidates = [];
const signature = checker.getResolvedSignatureForSignatureHelp(expr, candidates);
if (!signature || !candidates.length) {
return;
}
for (let i = 0; i < args.length; ++i) {
const originalArg = args[i];
const arg = skipParentheses(originalArg);
if (shouldShowLiteralParameterNameHintsOnly(preferences) && !isHintableLiteral(arg)) {
continue;
}
const identifierNameInfo = checker.getParameterIdentifierNameAtPosition(signature, i);
if (identifierNameInfo) {
const [parameterName, isFirstVariadicArgument] = identifierNameInfo;
const isParameterNameNotSameAsArgument = preferences.includeInlayParameterNameHintsWhenArgumentMatchesName || !identifierOrAccessExpressionPostfixMatchesParameterName(arg, parameterName);
if (!isParameterNameNotSameAsArgument && !isFirstVariadicArgument) {
continue;
}
const name = unescapeLeadingUnderscores(parameterName);
if (leadingCommentsContainsParameterName(arg, name)) {
continue;
}
addParameterHints(name, originalArg.getStart(), isFirstVariadicArgument);
}
}
}
function identifierOrAccessExpressionPostfixMatchesParameterName(expr, parameterName) {
if (isIdentifier(expr)) {
return expr.text === parameterName;
}
if (isPropertyAccessExpression(expr)) {
return expr.name.text === parameterName;
}
return false;
}
function leadingCommentsContainsParameterName(node, name) {
if (!isIdentifierText(name, compilerOptions.target, getLanguageVariant(file.scriptKind))) {
return false;
}
const ranges = getLeadingCommentRanges(sourceFileText, node.pos);
if (!(ranges == null ? void 0 : ranges.length)) {
return false;
}
const regex = leadingParameterNameCommentRegexFactory(name);
return some(ranges, (range) => regex.test(sourceFileText.substring(range.pos, range.end)));
}
function isHintableLiteral(node) {
switch (node.kind) {
case 223 /* PrefixUnaryExpression */: {
const operand = node.operand;
return isLiteralExpression(operand) || isIdentifier(operand) && isInfinityOrNaNString(operand.escapedText);
}
case 112 /* TrueKeyword */:
case 97 /* FalseKeyword */:
case 106 /* NullKeyword */:
case 15 /* NoSubstitutionTemplateLiteral */:
case 227 /* TemplateExpression */:
return true;
case 80 /* Identifier */: {
const name = node.escapedText;
return isUndefined(name) || isInfinityOrNaNString(name);
}
}
return isLiteralExpression(node);
}
function visitFunctionDeclarationLikeForReturnType(decl) {
if (isArrowFunction(decl)) {
if (!findChildOfKind(decl, 21 /* OpenParenToken */, file)) {
return;
}
}
const effectiveTypeAnnotation = getEffectiveReturnTypeNode(decl);
if (effectiveTypeAnnotation || !decl.body) {
return;
}
const signature = checker.getSignatureFromDeclaration(decl);
if (!signature) {
return;
}
const returnType = checker.getReturnTypeOfSignature(signature);
if (isModuleReferenceType(returnType)) {
return;
}
const typeDisplayString = printTypeInSingleLine(returnType);
if (!typeDisplayString) {
return;
}
addTypeHints(typeDisplayString, getTypeAnnotationPosition(decl));
}
function getTypeAnnotationPosition(decl) {
const closeParenToken = findChildOfKind(decl, 22 /* CloseParenToken */, file);
if (closeParenToken) {
return closeParenToken.end;
}
return decl.parameters.end;
}
function visitFunctionLikeForParameterType(node) {
const signature = checker.getSignatureFromDeclaration(node);
if (!signature) {
return;
}
for (let i = 0; i < node.parameters.length && i < signature.parameters.length; ++i) {
const param = node.parameters[i];
if (!isHintableDeclaration(param)) {
continue;
}
const effectiveTypeAnnotation = getEffectiveTypeAnnotationNode(param);
if (effectiveTypeAnnotation) {
continue;
}
const typeDisplayString = getParameterDeclarationTypeDisplayString(signature.parameters[i]);
if (!typeDisplayString) {
continue;
}
addTypeHints(typeDisplayString, param.questionToken ? param.questionToken.end : param.name.end);
}
}
function getParameterDeclarationTypeDisplayString(symbol) {
const valueDeclaration = symbol.valueDeclaration;
if (!valueDeclaration || !isParameter(valueDeclaration)) {
return void 0;
}
const signatureParamType = checker.getTypeOfSymbolAtLocation(symbol, valueDeclaration);
if (isModuleReferenceType(signatureParamType)) {
return void 0;
}
return printTypeInSingleLine(signatureParamType);
}
function truncation(text, maxLength2) {
if (text.length > maxLength2) {
return text.substr(0, maxLength2 - "...".length) + "...";
}
return text;
}
function printTypeInSingleLine(type) {
const flags = 70221824 /* IgnoreErrors */ | 1048576 /* AllowUniqueESSymbolType */ | 16384 /* UseAliasDefinedOutsideCurrentScope */;
const printer = createPrinterWithRemoveComments();
return usingSingleLineStringWriter((writer) => {
const typeNode = checker.typeToTypeNode(
type,
/*enclosingDeclaration*/
void 0,
flags
);
Debug.assertIsDefined(typeNode, "should always get typenode");
printer.writeNode(
4 /* Unspecified */,
typeNode,
/*sourceFile*/
file,
writer
);
});
}
function isUndefined(name) {
return name === "undefined";
}
function isHintableDeclaration(node) {
if ((isParameterDeclaration(node) || isVariableDeclaration(node) && isVarConst(node)) && node.initializer) {
const initializer = skipParentheses(node.initializer);
return !(isHintableLiteral(initializer) || isNewExpression(initializer) || isObjectLiteralExpression(initializer) || isAssertionExpression(initializer));
}
return true;
}
}
// src/services/_namespaces/ts.JsDoc.ts
var ts_JsDoc_exports = {};
__export(ts_JsDoc_exports, {
getDocCommentTemplateAtPosition: () => getDocCommentTemplateAtPosition,
getJSDocParameterNameCompletionDetails: () => getJSDocParameterNameCompletionDetails,
getJSDocParameterNameCompletions: () => getJSDocParameterNameCompletions,
getJSDocTagCompletionDetails: () => getJSDocTagCompletionDetails,
getJSDocTagCompletions: () => getJSDocTagCompletions,
getJSDocTagNameCompletionDetails: () => getJSDocTagNameCompletionDetails,
getJSDocTagNameCompletions: () => getJSDocTagNameCompletions,
getJsDocCommentsFromDeclarations: () => getJsDocCommentsFromDeclarations,
getJsDocTagsFromDeclarations: () => getJsDocTagsFromDeclarations
});
// src/services/jsDoc.ts
var jsDocTagNames = [
"abstract",
"access",
"alias",
"argument",
"async",
"augments",
"author",
"borrows",
"callback",
"class",
"classdesc",
"constant",
"constructor",
"constructs",
"copyright",
"default",
"deprecated",
"description",
"emits",
"enum",
"event",
"example",
"exports",
"extends",
"external",
"field",
"file",
"fileoverview",
"fires",
"function",
"generator",
"global",
"hideconstructor",
"host",
"ignore",
"implements",
"inheritdoc",
"inner",
"instance",
"interface",
"kind",
"lends",
"license",
"link",
"linkcode",
"linkplain",
"listens",
"member",
"memberof",
"method",
"mixes",
"module",
"name",
"namespace",
"overload",
"override",
"package",
"param",
"private",
"prop",
"property",
"protected",
"public",
"readonly",
"requires",
"returns",
"satisfies",
"see",
"since",
"static",
"summary",
"template",
"this",
"throws",
"todo",
"tutorial",
"type",
"typedef",
"var",
"variation",
"version",
"virtual",
"yields"
];
var jsDocTagNameCompletionEntries;
var jsDocTagCompletionEntries;
function getJsDocCommentsFromDeclarations(declarations, checker) {
const parts = [];
forEachUnique(declarations, (declaration) => {
for (const jsdoc of getCommentHavingNodes(declaration)) {
const inheritDoc = isJSDoc(jsdoc) && jsdoc.tags && find(jsdoc.tags, (t) => t.kind === 333 /* JSDocTag */ && (t.tagName.escapedText === "inheritDoc" || t.tagName.escapedText === "inheritdoc"));
if (jsdoc.comment === void 0 && !inheritDoc || isJSDoc(jsdoc) && declaration.kind !== 352 /* JSDocTypedefTag */ && declaration.kind !== 344 /* JSDocCallbackTag */ && jsdoc.tags && jsdoc.tags.some((t) => t.kind === 352 /* JSDocTypedefTag */ || t.kind === 344 /* JSDocCallbackTag */) && !jsdoc.tags.some((t) => t.kind === 347 /* JSDocParameterTag */ || t.kind === 348 /* JSDocReturnTag */)) {
continue;
}
let newparts = jsdoc.comment ? getDisplayPartsFromComment(jsdoc.comment, checker) : [];
if (inheritDoc && inheritDoc.comment) {
newparts = newparts.concat(getDisplayPartsFromComment(inheritDoc.comment, checker));
}
if (!contains(parts, newparts, isIdenticalListOfDisplayParts)) {
parts.push(newparts);
}
}
});
return flatten(intersperse(parts, [lineBreakPart()]));
}
function isIdenticalListOfDisplayParts(parts1, parts2) {
return arraysEqual(parts1, parts2, (p1, p2) => p1.kind === p2.kind && p1.text === p2.text);
}
function getCommentHavingNodes(declaration) {
switch (declaration.kind) {
case 347 /* JSDocParameterTag */:
case 354 /* JSDocPropertyTag */:
return [declaration];
case 344 /* JSDocCallbackTag */:
case 352 /* JSDocTypedefTag */:
return [declaration, declaration.parent];
default:
return getJSDocCommentsAndTags(declaration);
}
}
function getJsDocTagsFromDeclarations(declarations, checker) {
const infos = [];
forEachUnique(declarations, (declaration) => {
const tags = getJSDocTags(declaration);
if (tags.some((t) => t.kind === 352 /* JSDocTypedefTag */ || t.kind === 344 /* JSDocCallbackTag */) && !tags.some((t) => t.kind === 347 /* JSDocParameterTag */ || t.kind === 348 /* JSDocReturnTag */)) {
return;
}
for (const tag of tags) {
infos.push({ name: tag.tagName.text, text: getCommentDisplayParts(tag, checker) });
}
});
return infos;
}
function getDisplayPartsFromComment(comment, checker) {
if (typeof comment === "string") {
return [textPart(comment)];
}
return flatMap(
comment,
(node) => node.kind === 327 /* JSDocText */ ? [textPart(node.text)] : buildLinkParts(node, checker)
);
}
function getCommentDisplayParts(tag, checker) {
const { comment, kind } = tag;
const namePart = getTagNameDisplayPart(kind);
switch (kind) {
case 355 /* JSDocThrowsTag */:
const typeExpression = tag.typeExpression;
return typeExpression ? withNode(typeExpression) : comment === void 0 ? void 0 : getDisplayPartsFromComment(comment, checker);
case 335 /* JSDocImplementsTag */:
return withNode(tag.class);
case 334 /* JSDocAugmentsTag */:
return withNode(tag.class);
case 351 /* JSDocTemplateTag */:
const templateTag = tag;
const displayParts = [];
if (templateTag.constraint) {
displayParts.push(textPart(templateTag.constraint.getText()));
}
if (length(templateTag.typeParameters)) {
if (length(displayParts)) {
displayParts.push(spacePart());
}
const lastTypeParameter = templateTag.typeParameters[templateTag.typeParameters.length - 1];
forEach(templateTag.typeParameters, (tp) => {
displayParts.push(namePart(tp.getText()));
if (lastTypeParameter !== tp) {
displayParts.push(...[punctuationPart(28 /* CommaToken */), spacePart()]);
}
});
}
if (comment) {
displayParts.push(...[spacePart(), ...getDisplayPartsFromComment(comment, checker)]);
}
return displayParts;
case 350 /* JSDocTypeTag */:
case 356 /* JSDocSatisfiesTag */:
return withNode(tag.typeExpression);
case 352 /* JSDocTypedefTag */:
case 344 /* JSDocCallbackTag */:
case 354 /* JSDocPropertyTag */:
case 347 /* JSDocParameterTag */:
case 353 /* JSDocSeeTag */:
const { name } = tag;
return name ? withNode(name) : comment === void 0 ? void 0 : getDisplayPartsFromComment(comment, checker);
default:
return comment === void 0 ? void 0 : getDisplayPartsFromComment(comment, checker);
}
function withNode(node) {
return addComment(node.getText());
}
function addComment(s) {
if (comment) {
if (s.match(/^https?$/)) {
return [textPart(s), ...getDisplayPartsFromComment(comment, checker)];
} else {
return [namePart(s), spacePart(), ...getDisplayPartsFromComment(comment, checker)];
}
} else {
return [textPart(s)];
}
}
}
function getTagNameDisplayPart(kind) {
switch (kind) {
case 347 /* JSDocParameterTag */:
return parameterNamePart;
case 354 /* JSDocPropertyTag */:
return propertyNamePart;
case 351 /* JSDocTemplateTag */:
return typeParameterNamePart;
case 352 /* JSDocTypedefTag */:
case 344 /* JSDocCallbackTag */:
return typeAliasNamePart;
default:
return textPart;
}
}
function getJSDocTagNameCompletions() {
return jsDocTagNameCompletionEntries || (jsDocTagNameCompletionEntries = map(jsDocTagNames, (tagName) => {
return {
name: tagName,
kind: "keyword" /* keyword */,
kindModifiers: "",
sortText: ts_Completions_exports.SortText.LocationPriority
};
}));
}
var getJSDocTagNameCompletionDetails = getJSDocTagCompletionDetails;
function getJSDocTagCompletions() {
return jsDocTagCompletionEntries || (jsDocTagCompletionEntries = map(jsDocTagNames, (tagName) => {
return {
name: `@${tagName}`,
kind: "keyword" /* keyword */,
kindModifiers: "",
sortText: ts_Completions_exports.SortText.LocationPriority
};
}));
}
function getJSDocTagCompletionDetails(name) {
return {
name,
kind: "" /* unknown */,
// TODO: should have its own kind?
kindModifiers: "",
displayParts: [textPart(name)],
documentation: emptyArray,
tags: void 0,
codeActions: void 0
};
}
function getJSDocParameterNameCompletions(tag) {
if (!isIdentifier(tag.name)) {
return emptyArray;
}
const nameThusFar = tag.name.text;
const jsdoc = tag.parent;
const fn = jsdoc.parent;
if (!isFunctionLike(fn))
return [];
return mapDefined(fn.parameters, (param) => {
if (!isIdentifier(param.name))
return void 0;
const name = param.name.text;
if (jsdoc.tags.some((t) => t !== tag && isJSDocParameterTag(t) && isIdentifier(t.name) && t.name.escapedText === name) || nameThusFar !== void 0 && !startsWith(name, nameThusFar)) {
return void 0;
}
return { name, kind: "parameter" /* parameterElement */, kindModifiers: "", sortText: ts_Completions_exports.SortText.LocationPriority };
});
}
function getJSDocParameterNameCompletionDetails(name) {
return {
name,
kind: "parameter" /* parameterElement */,
kindModifiers: "",
displayParts: [textPart(name)],
documentation: emptyArray,
tags: void 0,
codeActions: void 0
};
}
function getDocCommentTemplateAtPosition(newLine, sourceFile, position, options) {
const tokenAtPos = getTokenAtPosition(sourceFile, position);
const existingDocComment = findAncestor(tokenAtPos, isJSDoc);
if (existingDocComment && (existingDocComment.comment !== void 0 || length(existingDocComment.tags))) {
return void 0;
}
const tokenStart = tokenAtPos.getStart(sourceFile);
if (!existingDocComment && tokenStart < position) {
return void 0;
}
const commentOwnerInfo = getCommentOwnerInfo(tokenAtPos, options);
if (!commentOwnerInfo) {
return void 0;
}
const { commentOwner, parameters, hasReturn: hasReturn2 } = commentOwnerInfo;
const commentOwnerJsDoc = hasJSDocNodes(commentOwner) && commentOwner.jsDoc ? commentOwner.jsDoc : void 0;
const lastJsDoc = lastOrUndefined(commentOwnerJsDoc);
if (commentOwner.getStart(sourceFile) < position || lastJsDoc && existingDocComment && lastJsDoc !== existingDocComment) {
return void 0;
}
const indentationStr = getIndentationStringAtPosition(sourceFile, position);
const isJavaScriptFile = hasJSFileExtension(sourceFile.fileName);
const tags = (parameters ? parameterDocComments(parameters || [], isJavaScriptFile, indentationStr, newLine) : "") + (hasReturn2 ? returnsDocComment(indentationStr, newLine) : "");
const openComment = "/**";
const closeComment = " */";
const hasTag = (commentOwnerJsDoc || []).some((jsDoc) => !!jsDoc.tags);
if (tags && !hasTag) {
const preamble = openComment + newLine + indentationStr + " * ";
const endLine = tokenStart === position ? newLine + indentationStr : "";
const result = preamble + newLine + tags + indentationStr + closeComment + endLine;
return { newText: result, caretOffset: preamble.length };
}
return { newText: openComment + closeComment, caretOffset: 3 };
}
function getIndentationStringAtPosition(sourceFile, position) {
const { text } = sourceFile;
const lineStart = getLineStartPositionForPosition(position, sourceFile);
let pos = lineStart;
for (; pos <= position && isWhiteSpaceSingleLine(text.charCodeAt(pos)); pos++)
;
return text.slice(lineStart, pos);
}
function parameterDocComments(parameters, isJavaScriptFile, indentationStr, newLine) {
return parameters.map(({ name, dotDotDotToken }, i) => {
const paramName = name.kind === 80 /* Identifier */ ? name.text : "param" + i;
const type = isJavaScriptFile ? dotDotDotToken ? "{...any} " : "{any} " : "";
return `${indentationStr} * @param ${type}${paramName}${newLine}`;
}).join("");
}
function returnsDocComment(indentationStr, newLine) {
return `${indentationStr} * @returns${newLine}`;
}
function getCommentOwnerInfo(tokenAtPos, options) {
return forEachAncestor(tokenAtPos, (n) => getCommentOwnerInfoWorker(n, options));
}
function getCommentOwnerInfoWorker(commentOwner, options) {
switch (commentOwner.kind) {
case 261 /* FunctionDeclaration */:
case 217 /* FunctionExpression */:
case 173 /* MethodDeclaration */:
case 175 /* Constructor */:
case 172 /* MethodSignature */:
case 218 /* ArrowFunction */:
const host = commentOwner;
return { commentOwner, parameters: host.parameters, hasReturn: hasReturn(host, options) };
case 302 /* PropertyAssignment */:
return getCommentOwnerInfoWorker(commentOwner.initializer, options);
case 262 /* ClassDeclaration */:
case 263 /* InterfaceDeclaration */:
case 265 /* EnumDeclaration */:
case 305 /* EnumMember */:
case 264 /* TypeAliasDeclaration */:
return { commentOwner };
case 170 /* PropertySignature */: {
const host2 = commentOwner;
return host2.type && isFunctionTypeNode(host2.type) ? { commentOwner, parameters: host2.type.parameters, hasReturn: hasReturn(host2.type, options) } : { commentOwner };
}
case 242 /* VariableStatement */: {
const varStatement = commentOwner;
const varDeclarations = varStatement.declarationList.declarations;
const host2 = varDeclarations.length === 1 && varDeclarations[0].initializer ? getRightHandSideOfAssignment(varDeclarations[0].initializer) : void 0;
return host2 ? { commentOwner, parameters: host2.parameters, hasReturn: hasReturn(host2, options) } : { commentOwner };
}
case 311 /* SourceFile */:
return "quit";
case 266 /* ModuleDeclaration */:
return commentOwner.parent.kind === 266 /* ModuleDeclaration */ ? void 0 : { commentOwner };
case 243 /* ExpressionStatement */:
return getCommentOwnerInfoWorker(commentOwner.expression, options);
case 225 /* BinaryExpression */: {
const be = commentOwner;
if (getAssignmentDeclarationKind(be) === 0 /* None */) {
return "quit";
}
return isFunctionLike(be.right) ? { commentOwner, parameters: be.right.parameters, hasReturn: hasReturn(be.right, options) } : { commentOwner };
}
case 171 /* PropertyDeclaration */:
const init = commentOwner.initializer;
if (init && (isFunctionExpression(init) || isArrowFunction(init))) {
return { commentOwner, parameters: init.parameters, hasReturn: hasReturn(init, options) };
}
}
}
function hasReturn(node, options) {
return !!(options == null ? void 0 : options.generateReturnInDocTemplate) && (isFunctionTypeNode(node) || isArrowFunction(node) && isExpression(node.body) || isFunctionLikeDeclaration(node) && node.body && isBlock(node.body) && !!forEachReturnStatement(node.body, (n) => n));
}
function getRightHandSideOfAssignment(rightHandSide) {
while (rightHandSide.kind === 216 /* ParenthesizedExpression */) {
rightHandSide = rightHandSide.expression;
}
switch (rightHandSide.kind) {
case 217 /* FunctionExpression */:
case 218 /* ArrowFunction */:
return rightHandSide;
case 230 /* ClassExpression */:
return find(rightHandSide.members, isConstructorDeclaration);
}
}
// src/services/_namespaces/ts.OrganizeImports.ts
var ts_OrganizeImports_exports = {};
__export(ts_OrganizeImports_exports, {
coalesceExports: () => coalesceExports,
coalesceImports: () => coalesceImports,
compareImportOrExportSpecifiers: () => compareImportOrExportSpecifiers,
compareImportsOrRequireStatements: () => compareImportsOrRequireStatements,
compareModuleSpecifiers: () => compareModuleSpecifiers2,
detectImportDeclarationSorting: () => detectImportDeclarationSorting,
detectImportSpecifierSorting: () => detectImportSpecifierSorting,
detectSorting: () => detectSorting,
getImportDeclarationInsertionIndex: () => getImportDeclarationInsertionIndex,
getImportSpecifierInsertionIndex: () => getImportSpecifierInsertionIndex,
getOrganizeImportsComparer: () => getOrganizeImportsComparer,
organizeImports: () => organizeImports
});
// src/services/organizeImports.ts
function organizeImports(sourceFile, formatContext, host, program, preferences, mode) {
const changeTracker = ts_textChanges_exports.ChangeTracker.fromContext({ host, formatContext, preferences });
const shouldSort = mode === "SortAndCombine" /* SortAndCombine */ || mode === "All" /* All */;
const shouldCombine = shouldSort;
const shouldRemove = mode === "RemoveUnused" /* RemoveUnused */ || mode === "All" /* All */;
const topLevelImportGroupDecls = groupByNewlineContiguous(sourceFile, sourceFile.statements.filter(isImportDeclaration));
const comparer = getOrganizeImportsComparerWithDetection(preferences, shouldSort ? () => detectSortingWorker(topLevelImportGroupDecls, preferences) === 2 /* CaseInsensitive */ : void 0);
const processImportsOfSameModuleSpecifier = (importGroup) => {
if (shouldRemove)
importGroup = removeUnusedImports(importGroup, sourceFile, program);
if (shouldCombine)
importGroup = coalesceImportsWorker(importGroup, comparer, sourceFile);
if (shouldSort)
importGroup = stableSort(importGroup, (s1, s2) => compareImportsOrRequireStatements(s1, s2, comparer));
return importGroup;
};
topLevelImportGroupDecls.forEach((importGroupDecl) => organizeImportsWorker(importGroupDecl, processImportsOfSameModuleSpecifier));
if (mode !== "RemoveUnused" /* RemoveUnused */) {
getTopLevelExportGroups(sourceFile).forEach((exportGroupDecl) => organizeImportsWorker(exportGroupDecl, (group2) => coalesceExportsWorker(group2, comparer)));
}
for (const ambientModule of sourceFile.statements.filter(isAmbientModule)) {
if (!ambientModule.body)
continue;
const ambientModuleImportGroupDecls = groupByNewlineContiguous(sourceFile, ambientModule.body.statements.filter(isImportDeclaration));
ambientModuleImportGroupDecls.forEach((importGroupDecl) => organizeImportsWorker(importGroupDecl, processImportsOfSameModuleSpecifier));
if (mode !== "RemoveUnused" /* RemoveUnused */) {
const ambientModuleExportDecls = ambientModule.body.statements.filter(isExportDeclaration);
organizeImportsWorker(ambientModuleExportDecls, (group2) => coalesceExportsWorker(group2, comparer));
}
}
return changeTracker.getChanges();
function organizeImportsWorker(oldImportDecls, coalesce) {
if (length(oldImportDecls) === 0) {
return;
}
suppressLeadingTrivia(oldImportDecls[0]);
const oldImportGroups = shouldCombine ? group(oldImportDecls, (importDecl) => getExternalModuleName2(importDecl.moduleSpecifier)) : [oldImportDecls];
const sortedImportGroups = shouldSort ? stableSort(oldImportGroups, (group1, group2) => compareModuleSpecifiersWorker(group1[0].moduleSpecifier, group2[0].moduleSpecifier, comparer)) : oldImportGroups;
const newImportDecls = flatMap(sortedImportGroups, (importGroup) => getExternalModuleName2(importGroup[0].moduleSpecifier) || importGroup[0].moduleSpecifier === void 0 ? coalesce(importGroup) : importGroup);
if (newImportDecls.length === 0) {
changeTracker.deleteNodes(
sourceFile,
oldImportDecls,
{
leadingTriviaOption: ts_textChanges_exports.LeadingTriviaOption.Exclude,
trailingTriviaOption: ts_textChanges_exports.TrailingTriviaOption.Include
},
/*hasTrailingComment*/
true
);
} else {
const replaceOptions = {
leadingTriviaOption: ts_textChanges_exports.LeadingTriviaOption.Exclude,
// Leave header comment in place
trailingTriviaOption: ts_textChanges_exports.TrailingTriviaOption.Include,
suffix: getNewLineOrDefaultFromHost(host, formatContext.options)
};
changeTracker.replaceNodeWithNodes(sourceFile, oldImportDecls[0], newImportDecls, replaceOptions);
const hasTrailingComment = changeTracker.nodeHasTrailingComment(sourceFile, oldImportDecls[0], replaceOptions);
changeTracker.deleteNodes(sourceFile, oldImportDecls.slice(1), {
trailingTriviaOption: ts_textChanges_exports.TrailingTriviaOption.Include
}, hasTrailingComment);
}
}
}
function groupByNewlineContiguous(sourceFile, decls) {
const scanner2 = createScanner(
sourceFile.languageVersion,
/*skipTrivia*/
false,
sourceFile.languageVariant
);
const group2 = [];
let groupIndex = 0;
for (const decl of decls) {
if (group2[groupIndex] && isNewGroup(sourceFile, decl, scanner2)) {
groupIndex++;
}
if (!group2[groupIndex]) {
group2[groupIndex] = [];
}
group2[groupIndex].push(decl);
}
return group2;
}
function isNewGroup(sourceFile, decl, scanner2) {
const startPos = decl.getFullStart();
const endPos = decl.getStart();
scanner2.setText(sourceFile.text, startPos, endPos - startPos);
let numberOfNewLines = 0;
while (scanner2.getTokenStart() < endPos) {
const tokenKind = scanner2.scan();
if (tokenKind === 4 /* NewLineTrivia */) {
numberOfNewLines++;
if (numberOfNewLines >= 2) {
return true;
}
}
}
return false;
}
function removeUnusedImports(oldImports, sourceFile, program) {
const typeChecker = program.getTypeChecker();
const compilerOptions = program.getCompilerOptions();
const jsxNamespace = typeChecker.getJsxNamespace(sourceFile);
const jsxFragmentFactory = typeChecker.getJsxFragmentFactory(sourceFile);
const jsxElementsPresent = !!(sourceFile.transformFlags & 2 /* ContainsJsx */);
const usedImports = [];
for (const importDecl of oldImports) {
const { importClause, moduleSpecifier } = importDecl;
if (!importClause) {
usedImports.push(importDecl);
continue;
}
let { name, namedBindings } = importClause;
if (name && !isDeclarationUsed(name)) {
name = void 0;
}
if (namedBindings) {
if (isNamespaceImport(namedBindings)) {
if (!isDeclarationUsed(namedBindings.name)) {
namedBindings = void 0;
}
} else {
const newElements = namedBindings.elements.filter((e) => isDeclarationUsed(e.name));
if (newElements.length < namedBindings.elements.length) {
namedBindings = newElements.length ? factory.updateNamedImports(namedBindings, newElements) : void 0;
}
}
}
if (name || namedBindings) {
usedImports.push(updateImportDeclarationAndClause(importDecl, name, namedBindings));
} else if (hasModuleDeclarationMatchingSpecifier(sourceFile, moduleSpecifier)) {
if (sourceFile.isDeclarationFile) {
usedImports.push(factory.createImportDeclaration(
importDecl.modifiers,
/*importClause*/
void 0,
moduleSpecifier,
/*assertClause*/
void 0
));
} else {
usedImports.push(importDecl);
}
}
}
return usedImports;
function isDeclarationUsed(identifier) {
return jsxElementsPresent && (identifier.text === jsxNamespace || jsxFragmentFactory && identifier.text === jsxFragmentFactory) && jsxModeNeedsExplicitImport(compilerOptions.jsx) || ts_FindAllReferences_exports.Core.isSymbolReferencedInFile(identifier, typeChecker, sourceFile);
}
}
function hasModuleDeclarationMatchingSpecifier(sourceFile, moduleSpecifier) {
const moduleSpecifierText = isStringLiteral(moduleSpecifier) && moduleSpecifier.text;
return isString(moduleSpecifierText) && some(sourceFile.moduleAugmentations, (moduleName) => isStringLiteral(moduleName) && moduleName.text === moduleSpecifierText);
}
function getExternalModuleName2(specifier) {
return specifier !== void 0 && isStringLiteralLike(specifier) ? specifier.text : void 0;
}
function coalesceImports(importGroup, ignoreCase, sourceFile) {
const comparer = getOrganizeImportsOrdinalStringComparer(ignoreCase);
return coalesceImportsWorker(importGroup, comparer, sourceFile);
}
function coalesceImportsWorker(importGroup, comparer, sourceFile) {
if (importGroup.length === 0) {
return importGroup;
}
const { importWithoutClause, typeOnlyImports, regularImports } = getCategorizedImports(importGroup);
const coalescedImports = [];
if (importWithoutClause) {
coalescedImports.push(importWithoutClause);
}
for (const group2 of [regularImports, typeOnlyImports]) {
const isTypeOnly = group2 === typeOnlyImports;
const { defaultImports, namespaceImports, namedImports } = group2;
if (!isTypeOnly && defaultImports.length === 1 && namespaceImports.length === 1 && namedImports.length === 0) {
const defaultImport = defaultImports[0];
coalescedImports.push(
updateImportDeclarationAndClause(defaultImport, defaultImport.importClause.name, namespaceImports[0].importClause.namedBindings)
);
continue;
}
const sortedNamespaceImports = stableSort(namespaceImports, (i1, i2) => comparer(i1.importClause.namedBindings.name.text, i2.importClause.namedBindings.name.text));
for (const namespaceImport of sortedNamespaceImports) {
coalescedImports.push(
updateImportDeclarationAndClause(
namespaceImport,
/*name*/
void 0,
namespaceImport.importClause.namedBindings
)
);
}
const firstDefaultImport = firstOrUndefined(defaultImports);
const firstNamedImport = firstOrUndefined(namedImports);
const importDecl = firstDefaultImport ?? firstNamedImport;
if (!importDecl) {
continue;
}
let newDefaultImport;
const newImportSpecifiers = [];
if (defaultImports.length === 1) {
newDefaultImport = defaultImports[0].importClause.name;
} else {
for (const defaultImport of defaultImports) {
newImportSpecifiers.push(
factory.createImportSpecifier(
/*isTypeOnly*/
false,
factory.createIdentifier("default"),
defaultImport.importClause.name
)
);
}
}
newImportSpecifiers.push(...getNewImportSpecifiers(namedImports));
const sortedImportSpecifiers = factory.createNodeArray(
sortSpecifiers(newImportSpecifiers, comparer),
firstNamedImport == null ? void 0 : firstNamedImport.importClause.namedBindings.elements.hasTrailingComma
);
const newNamedImports = sortedImportSpecifiers.length === 0 ? newDefaultImport ? void 0 : factory.createNamedImports(emptyArray) : firstNamedImport ? factory.updateNamedImports(firstNamedImport.importClause.namedBindings, sortedImportSpecifiers) : factory.createNamedImports(sortedImportSpecifiers);
if (sourceFile && newNamedImports && (firstNamedImport == null ? void 0 : firstNamedImport.importClause.namedBindings) && !rangeIsOnSingleLine(firstNamedImport.importClause.namedBindings, sourceFile)) {
setEmitFlags(newNamedImports, 2 /* MultiLine */);
}
if (isTypeOnly && newDefaultImport && newNamedImports) {
coalescedImports.push(
updateImportDeclarationAndClause(
importDecl,
newDefaultImport,
/*namedBindings*/
void 0
)
);
coalescedImports.push(
updateImportDeclarationAndClause(
firstNamedImport ?? importDecl,
/*name*/
void 0,
newNamedImports
)
);
} else {
coalescedImports.push(
updateImportDeclarationAndClause(importDecl, newDefaultImport, newNamedImports)
);
}
}
return coalescedImports;
}
function getCategorizedImports(importGroup) {
let importWithoutClause;
const typeOnlyImports = { defaultImports: [], namespaceImports: [], namedImports: [] };
const regularImports = { defaultImports: [], namespaceImports: [], namedImports: [] };
for (const importDeclaration of importGroup) {
if (importDeclaration.importClause === void 0) {
importWithoutClause = importWithoutClause || importDeclaration;
continue;
}
const group2 = importDeclaration.importClause.isTypeOnly ? typeOnlyImports : regularImports;
const { name, namedBindings } = importDeclaration.importClause;
if (name) {
group2.defaultImports.push(importDeclaration);
}
if (namedBindings) {
if (isNamespaceImport(namedBindings)) {
group2.namespaceImports.push(importDeclaration);
} else {
group2.namedImports.push(importDeclaration);
}
}
}
return {
importWithoutClause,
typeOnlyImports,
regularImports
};
}
function coalesceExports(exportGroup, ignoreCase) {
const comparer = getOrganizeImportsOrdinalStringComparer(ignoreCase);
return coalesceExportsWorker(exportGroup, comparer);
}
function coalesceExportsWorker(exportGroup, comparer) {
if (exportGroup.length === 0) {
return exportGroup;
}
const { exportWithoutClause, namedExports, typeOnlyExports } = getCategorizedExports(exportGroup);
const coalescedExports = [];
if (exportWithoutClause) {
coalescedExports.push(exportWithoutClause);
}
for (const exportGroup2 of [namedExports, typeOnlyExports]) {
if (exportGroup2.length === 0) {
continue;
}
const newExportSpecifiers = [];
newExportSpecifiers.push(...flatMap(exportGroup2, (i) => i.exportClause && isNamedExports(i.exportClause) ? i.exportClause.elements : emptyArray));
const sortedExportSpecifiers = sortSpecifiers(newExportSpecifiers, comparer);
const exportDecl = exportGroup2[0];
coalescedExports.push(
factory.updateExportDeclaration(
exportDecl,
exportDecl.modifiers,
exportDecl.isTypeOnly,
exportDecl.exportClause && (isNamedExports(exportDecl.exportClause) ? factory.updateNamedExports(exportDecl.exportClause, sortedExportSpecifiers) : factory.updateNamespaceExport(exportDecl.exportClause, exportDecl.exportClause.name)),
exportDecl.moduleSpecifier,
exportDecl.assertClause
)
);
}
return coalescedExports;
function getCategorizedExports(exportGroup2) {
let exportWithoutClause2;
const namedExports2 = [];
const typeOnlyExports2 = [];
for (const exportDeclaration of exportGroup2) {
if (exportDeclaration.exportClause === void 0) {
exportWithoutClause2 = exportWithoutClause2 || exportDeclaration;
} else if (exportDeclaration.isTypeOnly) {
typeOnlyExports2.push(exportDeclaration);
} else {
namedExports2.push(exportDeclaration);
}
}
return {
exportWithoutClause: exportWithoutClause2,
namedExports: namedExports2,
typeOnlyExports: typeOnlyExports2
};
}
}
function updateImportDeclarationAndClause(importDeclaration, name, namedBindings) {
return factory.updateImportDeclaration(
importDeclaration,
importDeclaration.modifiers,
factory.updateImportClause(importDeclaration.importClause, importDeclaration.importClause.isTypeOnly, name, namedBindings),
// TODO: GH#18217
importDeclaration.moduleSpecifier,
importDeclaration.assertClause
);
}
function sortSpecifiers(specifiers, comparer) {
return stableSort(specifiers, (s1, s2) => compareImportOrExportSpecifiers(s1, s2, comparer));
}
function compareImportOrExportSpecifiers(s1, s2, comparer) {
return compareBooleans(s1.isTypeOnly, s2.isTypeOnly) || comparer(s1.name.text, s2.name.text);
}
function compareModuleSpecifiers2(m1, m2, ignoreCase) {
const comparer = getOrganizeImportsOrdinalStringComparer(!!ignoreCase);
return compareModuleSpecifiersWorker(m1, m2, comparer);
}
function compareModuleSpecifiersWorker(m1, m2, comparer) {
const name1 = m1 === void 0 ? void 0 : getExternalModuleName2(m1);
const name2 = m2 === void 0 ? void 0 : getExternalModuleName2(m2);
return compareBooleans(name1 === void 0, name2 === void 0) || compareBooleans(isExternalModuleNameRelative(name1), isExternalModuleNameRelative(name2)) || comparer(name1, name2);
}
function getModuleSpecifierExpression(declaration) {
var _a;
switch (declaration.kind) {
case 270 /* ImportEqualsDeclaration */:
return (_a = tryCast(declaration.moduleReference, isExternalModuleReference)) == null ? void 0 : _a.expression;
case 271 /* ImportDeclaration */:
return declaration.moduleSpecifier;
case 242 /* VariableStatement */:
return declaration.declarationList.declarations[0].initializer.arguments[0];
}
}
function detectSorting(sourceFile, preferences) {
return detectSortingWorker(
groupByNewlineContiguous(sourceFile, sourceFile.statements.filter(isImportDeclaration)),
preferences
);
}
function detectSortingWorker(importGroups, preferences) {
const collateCaseSensitive = getOrganizeImportsComparer(
preferences,
/*ignoreCase*/
false
);
const collateCaseInsensitive = getOrganizeImportsComparer(
preferences,
/*ignoreCase*/
true
);
let sortState = 3 /* Both */;
let seenUnsortedGroup = false;
for (const importGroup of importGroups) {
if (importGroup.length > 1) {
const moduleSpecifierSort = detectSortCaseSensitivity(
importGroup,
(i) => {
var _a;
return ((_a = tryCast(i.moduleSpecifier, isStringLiteral)) == null ? void 0 : _a.text) ?? "";
},
collateCaseSensitive,
collateCaseInsensitive
);
if (moduleSpecifierSort) {
sortState &= moduleSpecifierSort;
seenUnsortedGroup = true;
}
if (!sortState) {
return sortState;
}
}
const declarationWithNamedImports = find(
importGroup,
(i) => {
var _a, _b;
return ((_b = tryCast((_a = i.importClause) == null ? void 0 : _a.namedBindings, isNamedImports)) == null ? void 0 : _b.elements.length) > 1;
}
);
if (declarationWithNamedImports) {
const namedImportSort = detectImportSpecifierSorting(declarationWithNamedImports.importClause.namedBindings.elements, preferences);
if (namedImportSort) {
sortState &= namedImportSort;
seenUnsortedGroup = true;
}
if (!sortState) {
return sortState;
}
}
if (sortState !== 3 /* Both */) {
return sortState;
}
}
return seenUnsortedGroup ? 0 /* None */ : sortState;
}
function detectImportDeclarationSorting(imports, preferences) {
const collateCaseSensitive = getOrganizeImportsComparer(
preferences,
/*ignoreCase*/
false
);
const collateCaseInsensitive = getOrganizeImportsComparer(
preferences,
/*ignoreCase*/
true
);
return detectSortCaseSensitivity(
imports,
(s) => getExternalModuleName2(getModuleSpecifierExpression(s)) || "",
collateCaseSensitive,
collateCaseInsensitive
);
}
var ImportSpecifierSortingCache = class {
has([specifiers, preferences]) {
if (this._lastPreferences !== preferences || !this._cache)
return false;
return this._cache.has(specifiers);
}
get([specifiers, preferences]) {
if (this._lastPreferences !== preferences || !this._cache)
return void 0;
return this._cache.get(specifiers);
}
set([specifiers, preferences], value) {
if (this._lastPreferences !== preferences) {
this._lastPreferences = preferences;
this._cache = void 0;
}
this._cache ?? (this._cache = /* @__PURE__ */ new WeakMap());
this._cache.set(specifiers, value);
}
};
var detectImportSpecifierSorting = memoizeCached((specifiers, preferences) => {
if (!arrayIsSorted(specifiers, (s1, s2) => compareBooleans(s1.isTypeOnly, s2.isTypeOnly))) {
return 0 /* None */;
}
const collateCaseSensitive = getOrganizeImportsComparer(
preferences,
/*ignoreCase*/
false
);
const collateCaseInsensitive = getOrganizeImportsComparer(
preferences,
/*ignoreCase*/
true
);
return detectSortCaseSensitivity(specifiers, (specifier) => specifier.name.text, collateCaseSensitive, collateCaseInsensitive);
}, new ImportSpecifierSortingCache());
function getImportDeclarationInsertionIndex(sortedImports, newImport, comparer) {
const index = binarySearch(sortedImports, newImport, identity, (a, b) => compareImportsOrRequireStatements(a, b, comparer));
return index < 0 ? ~index : index;
}
function getImportSpecifierInsertionIndex(sortedImports, newImport, comparer) {
const index = binarySearch(sortedImports, newImport, identity, (s1, s2) => compareImportOrExportSpecifiers(s1, s2, comparer));
return index < 0 ? ~index : index;
}
function compareImportsOrRequireStatements(s1, s2, comparer) {
return compareModuleSpecifiersWorker(getModuleSpecifierExpression(s1), getModuleSpecifierExpression(s2), comparer) || compareImportKind(s1, s2);
}
function compareImportKind(s1, s2) {
return compareValues(getImportKindOrder(s1), getImportKindOrder(s2));
}
function getImportKindOrder(s1) {
var _a;
switch (s1.kind) {
case 271 /* ImportDeclaration */:
if (!s1.importClause)
return 0;
if (s1.importClause.isTypeOnly)
return 1;
if (((_a = s1.importClause.namedBindings) == null ? void 0 : _a.kind) === 273 /* NamespaceImport */)
return 2;
if (s1.importClause.name)
return 3;
return 4;
case 270 /* ImportEqualsDeclaration */:
return 5;
case 242 /* VariableStatement */:
return 6;
}
}
function getNewImportSpecifiers(namedImports) {
return flatMap(
namedImports,
(namedImport) => map(
tryGetNamedBindingElements(namedImport),
(importSpecifier) => importSpecifier.name && importSpecifier.propertyName && importSpecifier.name.escapedText === importSpecifier.propertyName.escapedText ? factory.updateImportSpecifier(
importSpecifier,
importSpecifier.isTypeOnly,
/*propertyName*/
void 0,
importSpecifier.name
) : importSpecifier
)
);
}
function tryGetNamedBindingElements(namedImport) {
var _a;
return ((_a = namedImport.importClause) == null ? void 0 : _a.namedBindings) && isNamedImports(namedImport.importClause.namedBindings) ? namedImport.importClause.namedBindings.elements : void 0;
}
function getOrganizeImportsOrdinalStringComparer(ignoreCase) {
return ignoreCase ? compareStringsCaseInsensitiveEslintCompatible : compareStringsCaseSensitive;
}
function getOrganizeImportsUnicodeStringComparer(ignoreCase, preferences) {
const resolvedLocale = getOrganizeImportsLocale(preferences);
const caseFirst = preferences.organizeImportsCaseFirst ?? false;
const numeric = preferences.organizeImportsNumericCollation ?? false;
const accents = preferences.organizeImportsAccentCollation ?? true;
const sensitivity = ignoreCase ? accents ? "accent" : "base" : accents ? "variant" : "case";
const collator = new Intl.Collator(resolvedLocale, {
usage: "sort",
caseFirst: caseFirst || "false",
sensitivity,
numeric
});
return collator.compare;
}
function getOrganizeImportsLocale(preferences) {
let locale = preferences.organizeImportsLocale;
if (locale === "auto")
locale = getUILocale();
if (locale === void 0)
locale = "en";
const supportedLocales = Intl.Collator.supportedLocalesOf(locale);
const resolvedLocale = supportedLocales.length ? supportedLocales[0] : "en";
return resolvedLocale;
}
function getOrganizeImportsComparer(preferences, ignoreCase) {
const collation = preferences.organizeImportsCollation ?? "ordinal";
return collation === "unicode" ? getOrganizeImportsUnicodeStringComparer(ignoreCase, preferences) : getOrganizeImportsOrdinalStringComparer(ignoreCase);
}
function getOrganizeImportsComparerWithDetection(preferences, detectIgnoreCase) {
const ignoreCase = typeof preferences.organizeImportsIgnoreCase === "boolean" ? preferences.organizeImportsIgnoreCase : (detectIgnoreCase == null ? void 0 : detectIgnoreCase()) ?? false;
return getOrganizeImportsComparer(preferences, ignoreCase);
}
function getTopLevelExportGroups(sourceFile) {
const topLevelExportGroups = [];
const statements = sourceFile.statements;
const len = length(statements);
let i = 0;
let groupIndex = 0;
while (i < len) {
if (isExportDeclaration(statements[i])) {
if (topLevelExportGroups[groupIndex] === void 0) {
topLevelExportGroups[groupIndex] = [];
}
const exportDecl = statements[i];
if (exportDecl.moduleSpecifier) {
topLevelExportGroups[groupIndex].push(exportDecl);
i++;
} else {
while (i < len && isExportDeclaration(statements[i])) {
topLevelExportGroups[groupIndex].push(statements[i++]);
}
groupIndex++;
}
} else {
i++;
}
}
return flatMap(topLevelExportGroups, (exportGroupDecls) => groupByNewlineContiguous(sourceFile, exportGroupDecls));
}
// src/services/_namespaces/ts.OutliningElementsCollector.ts
var ts_OutliningElementsCollector_exports = {};
__export(ts_OutliningElementsCollector_exports, {
collectElements: () => collectElements
});
// src/services/outliningElementsCollector.ts
function collectElements(sourceFile, cancellationToken) {
const res = [];
addNodeOutliningSpans(sourceFile, cancellationToken, res);
addRegionOutliningSpans(sourceFile, res);
return res.sort((span1, span2) => span1.textSpan.start - span2.textSpan.start);
}
function addNodeOutliningSpans(sourceFile, cancellationToken, out) {
let depthRemaining = 40;
let current = 0;
const statements = [...sourceFile.statements, sourceFile.endOfFileToken];
const n = statements.length;
while (current < n) {
while (current < n && !isAnyImportSyntax(statements[current])) {
visitNode3(statements[current]);
current++;
}
if (current === n)
break;
const firstImport = current;
while (current < n && isAnyImportSyntax(statements[current])) {
visitNode3(statements[current]);
current++;
}
const lastImport = current - 1;
if (lastImport !== firstImport) {
out.push(createOutliningSpanFromBounds(findChildOfKind(statements[firstImport], 102 /* ImportKeyword */, sourceFile).getStart(sourceFile), statements[lastImport].getEnd(), "imports" /* Imports */));
}
}
function visitNode3(n2) {
var _a;
if (depthRemaining === 0)
return;
cancellationToken.throwIfCancellationRequested();
if (isDeclaration(n2) || isVariableStatement(n2) || isReturnStatement(n2) || isCallOrNewExpression(n2) || n2.kind === 1 /* EndOfFileToken */) {
addOutliningForLeadingCommentsForNode(n2, sourceFile, cancellationToken, out);
}
if (isFunctionLike(n2) && isBinaryExpression(n2.parent) && isPropertyAccessExpression(n2.parent.left)) {
addOutliningForLeadingCommentsForNode(n2.parent.left, sourceFile, cancellationToken, out);
}
if (isBlock(n2) || isModuleBlock(n2)) {
addOutliningForLeadingCommentsForPos(n2.statements.end, sourceFile, cancellationToken, out);
}
if (isClassLike(n2) || isInterfaceDeclaration(n2)) {
addOutliningForLeadingCommentsForPos(n2.members.end, sourceFile, cancellationToken, out);
}
const span = getOutliningSpanForNode(n2, sourceFile);
if (span)
out.push(span);
depthRemaining--;
if (isCallExpression(n2)) {
depthRemaining++;
visitNode3(n2.expression);
depthRemaining--;
n2.arguments.forEach(visitNode3);
(_a = n2.typeArguments) == null ? void 0 : _a.forEach(visitNode3);
} else if (isIfStatement(n2) && n2.elseStatement && isIfStatement(n2.elseStatement)) {
visitNode3(n2.expression);
visitNode3(n2.thenStatement);
depthRemaining++;
visitNode3(n2.elseStatement);
depthRemaining--;
} else {
n2.forEachChild(visitNode3);
}
depthRemaining++;
}
}
function addRegionOutliningSpans(sourceFile, out) {
const regions = [];
const lineStarts = sourceFile.getLineStarts();
for (const currentLineStart of lineStarts) {
const lineEnd = sourceFile.getLineEndOfPosition(currentLineStart);
const lineText = sourceFile.text.substring(currentLineStart, lineEnd);
const result = isRegionDelimiter(lineText);
if (!result || isInComment(sourceFile, currentLineStart)) {
continue;
}
if (!result[1]) {
const span = createTextSpanFromBounds(sourceFile.text.indexOf("//", currentLineStart), lineEnd);
regions.push(createOutliningSpan(
span,
"region" /* Region */,
span,
/*autoCollapse*/
false,
result[2] || "#region"
));
} else {
const region = regions.pop();
if (region) {
region.textSpan.length = lineEnd - region.textSpan.start;
region.hintSpan.length = lineEnd - region.textSpan.start;
out.push(region);
}
}
}
}
var regionDelimiterRegExp = /^#(end)?region(?:\s+(.*))?(?:\r)?$/;
function isRegionDelimiter(lineText) {
lineText = trimStringStart(lineText);
if (!startsWith(lineText, "//")) {
return null;
}
lineText = trimString(lineText.slice(2));
return regionDelimiterRegExp.exec(lineText);
}
function addOutliningForLeadingCommentsForPos(pos, sourceFile, cancellationToken, out) {
const comments = getLeadingCommentRanges(sourceFile.text, pos);
if (!comments)
return;
let firstSingleLineCommentStart = -1;
let lastSingleLineCommentEnd = -1;
let singleLineCommentCount = 0;
const sourceText = sourceFile.getFullText();
for (const { kind, pos: pos2, end } of comments) {
cancellationToken.throwIfCancellationRequested();
switch (kind) {
case 2 /* SingleLineCommentTrivia */:
const commentText = sourceText.slice(pos2, end);
if (isRegionDelimiter(commentText)) {
combineAndAddMultipleSingleLineComments();
singleLineCommentCount = 0;
break;
}
if (singleLineCommentCount === 0) {
firstSingleLineCommentStart = pos2;
}
lastSingleLineCommentEnd = end;
singleLineCommentCount++;
break;
case 3 /* MultiLineCommentTrivia */:
combineAndAddMultipleSingleLineComments();
out.push(createOutliningSpanFromBounds(pos2, end, "comment" /* Comment */));
singleLineCommentCount = 0;
break;
default:
Debug.assertNever(kind);
}
}
combineAndAddMultipleSingleLineComments();
function combineAndAddMultipleSingleLineComments() {
if (singleLineCommentCount > 1) {
out.push(createOutliningSpanFromBounds(firstSingleLineCommentStart, lastSingleLineCommentEnd, "comment" /* Comment */));
}
}
}
function addOutliningForLeadingCommentsForNode(n, sourceFile, cancellationToken, out) {
if (isJsxText(n))
return;
addOutliningForLeadingCommentsForPos(n.pos, sourceFile, cancellationToken, out);
}
function createOutliningSpanFromBounds(pos, end, kind) {
return createOutliningSpan(createTextSpanFromBounds(pos, end), kind);
}
function getOutliningSpanForNode(n, sourceFile) {
switch (n.kind) {
case 240 /* Block */:
if (isFunctionLike(n.parent)) {
return functionSpan(n.parent, n, sourceFile);
}
switch (n.parent.kind) {
case 245 /* DoStatement */:
case 248 /* ForInStatement */:
case 249 /* ForOfStatement */:
case 247 /* ForStatement */:
case 244 /* IfStatement */:
case 246 /* WhileStatement */:
case 253 /* WithStatement */:
case 298 /* CatchClause */:
return spanForNode(n.parent);
case 257 /* TryStatement */:
const tryStatement = n.parent;
if (tryStatement.tryBlock === n) {
return spanForNode(n.parent);
} else if (tryStatement.finallyBlock === n) {
const node = findChildOfKind(tryStatement, 98 /* FinallyKeyword */, sourceFile);
if (node)
return spanForNode(node);
}
default:
return createOutliningSpan(createTextSpanFromNode(n, sourceFile), "code" /* Code */);
}
case 267 /* ModuleBlock */:
return spanForNode(n.parent);
case 262 /* ClassDeclaration */:
case 230 /* ClassExpression */:
case 263 /* InterfaceDeclaration */:
case 265 /* EnumDeclaration */:
case 268 /* CaseBlock */:
case 186 /* TypeLiteral */:
case 205 /* ObjectBindingPattern */:
return spanForNode(n);
case 188 /* TupleType */:
return spanForNode(
n,
/*autoCollapse*/
false,
/*useFullStart*/
!isTupleTypeNode(n.parent),
23 /* OpenBracketToken */
);
case 295 /* CaseClause */:
case 296 /* DefaultClause */:
return spanForNodeArray(n.statements);
case 209 /* ObjectLiteralExpression */:
return spanForObjectOrArrayLiteral(n);
case 208 /* ArrayLiteralExpression */:
return spanForObjectOrArrayLiteral(n, 23 /* OpenBracketToken */);
case 283 /* JsxElement */:
return spanForJSXElement(n);
case 287 /* JsxFragment */:
return spanForJSXFragment(n);
case 284 /* JsxSelfClosingElement */:
case 285 /* JsxOpeningElement */:
return spanForJSXAttributes(n.attributes);
case 227 /* TemplateExpression */:
case 15 /* NoSubstitutionTemplateLiteral */:
return spanForTemplateLiteral(n);
case 206 /* ArrayBindingPattern */:
return spanForNode(
n,
/*autoCollapse*/
false,
/*useFullStart*/
!isBindingElement(n.parent),
23 /* OpenBracketToken */
);
case 218 /* ArrowFunction */:
return spanForArrowFunction(n);
case 212 /* CallExpression */:
return spanForCallExpression(n);
case 216 /* ParenthesizedExpression */:
return spanForParenthesizedExpression(n);
case 274 /* NamedImports */:
case 278 /* NamedExports */:
case 299 /* AssertClause */:
return spanForNamedImportsOrExportsOrAssertClause(n);
}
function spanForNamedImportsOrExportsOrAssertClause(node) {
if (!node.elements.length) {
return void 0;
}
const openToken = findChildOfKind(node, 19 /* OpenBraceToken */, sourceFile);
const closeToken = findChildOfKind(node, 20 /* CloseBraceToken */, sourceFile);
if (!openToken || !closeToken || positionsAreOnSameLine(openToken.pos, closeToken.pos, sourceFile)) {
return void 0;
}
return spanBetweenTokens(
openToken,
closeToken,
node,
sourceFile,
/*autoCollapse*/
false,
/*useFullStart*/
false
);
}
function spanForCallExpression(node) {
if (!node.arguments.length) {
return void 0;
}
const openToken = findChildOfKind(node, 21 /* OpenParenToken */, sourceFile);
const closeToken = findChildOfKind(node, 22 /* CloseParenToken */, sourceFile);
if (!openToken || !closeToken || positionsAreOnSameLine(openToken.pos, closeToken.pos, sourceFile)) {
return void 0;
}
return spanBetweenTokens(
openToken,
closeToken,
node,
sourceFile,
/*autoCollapse*/
false,
/*useFullStart*/
true
);
}
function spanForArrowFunction(node) {
if (isBlock(node.body) || isParenthesizedExpression(node.body) || positionsAreOnSameLine(node.body.getFullStart(), node.body.getEnd(), sourceFile)) {
return void 0;
}
const textSpan = createTextSpanFromBounds(node.body.getFullStart(), node.body.getEnd());
return createOutliningSpan(textSpan, "code" /* Code */, createTextSpanFromNode(node));
}
function spanForJSXElement(node) {
const textSpan = createTextSpanFromBounds(node.openingElement.getStart(sourceFile), node.closingElement.getEnd());
const tagName = node.openingElement.tagName.getText(sourceFile);
const bannerText = "<" + tagName + ">..." + tagName + ">";
return createOutliningSpan(
textSpan,
"code" /* Code */,
textSpan,
/*autoCollapse*/
false,
bannerText
);
}
function spanForJSXFragment(node) {
const textSpan = createTextSpanFromBounds(node.openingFragment.getStart(sourceFile), node.closingFragment.getEnd());
const bannerText = "<>...>";
return createOutliningSpan(
textSpan,
"code" /* Code */,
textSpan,
/*autoCollapse*/
false,
bannerText
);
}
function spanForJSXAttributes(node) {
if (node.properties.length === 0) {
return void 0;
}
return createOutliningSpanFromBounds(node.getStart(sourceFile), node.getEnd(), "code" /* Code */);
}
function spanForTemplateLiteral(node) {
if (node.kind === 15 /* NoSubstitutionTemplateLiteral */ && node.text.length === 0) {
return void 0;
}
return createOutliningSpanFromBounds(node.getStart(sourceFile), node.getEnd(), "code" /* Code */);
}
function spanForObjectOrArrayLiteral(node, open = 19 /* OpenBraceToken */) {
return spanForNode(
node,
/*autoCollapse*/
false,
/*useFullStart*/
!isArrayLiteralExpression(node.parent) && !isCallExpression(node.parent),
open
);
}
function spanForNode(hintSpanNode, autoCollapse = false, useFullStart = true, open = 19 /* OpenBraceToken */, close = open === 19 /* OpenBraceToken */ ? 20 /* CloseBraceToken */ : 24 /* CloseBracketToken */) {
const openToken = findChildOfKind(n, open, sourceFile);
const closeToken = findChildOfKind(n, close, sourceFile);
return openToken && closeToken && spanBetweenTokens(openToken, closeToken, hintSpanNode, sourceFile, autoCollapse, useFullStart);
}
function spanForNodeArray(nodeArray) {
return nodeArray.length ? createOutliningSpan(createTextSpanFromRange(nodeArray), "code" /* Code */) : void 0;
}
function spanForParenthesizedExpression(node) {
if (positionsAreOnSameLine(node.getStart(), node.getEnd(), sourceFile))
return void 0;
const textSpan = createTextSpanFromBounds(node.getStart(), node.getEnd());
return createOutliningSpan(textSpan, "code" /* Code */, createTextSpanFromNode(node));
}
}
function functionSpan(node, body, sourceFile) {
const openToken = tryGetFunctionOpenToken(node, body, sourceFile);
const closeToken = findChildOfKind(body, 20 /* CloseBraceToken */, sourceFile);
return openToken && closeToken && spanBetweenTokens(
openToken,
closeToken,
node,
sourceFile,
/*autoCollapse*/
node.kind !== 218 /* ArrowFunction */
);
}
function spanBetweenTokens(openToken, closeToken, hintSpanNode, sourceFile, autoCollapse = false, useFullStart = true) {
const textSpan = createTextSpanFromBounds(useFullStart ? openToken.getFullStart() : openToken.getStart(sourceFile), closeToken.getEnd());
return createOutliningSpan(textSpan, "code" /* Code */, createTextSpanFromNode(hintSpanNode, sourceFile), autoCollapse);
}
function createOutliningSpan(textSpan, kind, hintSpan = textSpan, autoCollapse = false, bannerText = "...") {
return { textSpan, kind, hintSpan, bannerText, autoCollapse };
}
function tryGetFunctionOpenToken(node, body, sourceFile) {
if (isNodeArrayMultiLine(node.parameters, sourceFile)) {
const openParenToken = findChildOfKind(node, 21 /* OpenParenToken */, sourceFile);
if (openParenToken) {
return openParenToken;
}
}
return findChildOfKind(body, 19 /* OpenBraceToken */, sourceFile);
}
// src/services/_namespaces/ts.Rename.ts
var ts_Rename_exports = {};
__export(ts_Rename_exports, {
getRenameInfo: () => getRenameInfo,
nodeIsEligibleForRename: () => nodeIsEligibleForRename
});
// src/services/rename.ts
function getRenameInfo(program, sourceFile, position, preferences) {
const node = getAdjustedRenameLocation(getTouchingPropertyName(sourceFile, position));
if (nodeIsEligibleForRename(node)) {
const renameInfo = getRenameInfoForNode(node, program.getTypeChecker(), sourceFile, program, preferences);
if (renameInfo) {
return renameInfo;
}
}
return getRenameInfoError(Diagnostics.You_cannot_rename_this_element);
}
function getRenameInfoForNode(node, typeChecker, sourceFile, program, preferences) {
const symbol = typeChecker.getSymbolAtLocation(node);
if (!symbol) {
if (isStringLiteralLike(node)) {
const type = getContextualTypeFromParentOrAncestorTypeNode(node, typeChecker);
if (type && (type.flags & 128 /* StringLiteral */ || type.flags & 1048576 /* Union */ && every(type.types, (type2) => !!(type2.flags & 128 /* StringLiteral */)))) {
return getRenameInfoSuccess(node.text, node.text, "string" /* string */, "", node, sourceFile);
}
} else if (isLabelName(node)) {
const name = getTextOfNode(node);
return getRenameInfoSuccess(name, name, "label" /* label */, "" /* none */, node, sourceFile);
}
return void 0;
}
const { declarations } = symbol;
if (!declarations || declarations.length === 0)
return;
if (declarations.some((declaration) => isDefinedInLibraryFile(program, declaration))) {
return getRenameInfoError(Diagnostics.You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library);
}
if (isIdentifier(node) && node.escapedText === "default" && symbol.parent && symbol.parent.flags & 1536 /* Module */) {
return void 0;
}
if (isStringLiteralLike(node) && tryGetImportFromModuleSpecifier(node)) {
return preferences.allowRenameOfImportPath ? getRenameInfoForModule(node, sourceFile, symbol) : void 0;
}
const wouldRenameNodeModules = wouldRenameInOtherNodeModules(sourceFile, symbol, typeChecker, preferences);
if (wouldRenameNodeModules) {
return getRenameInfoError(wouldRenameNodeModules);
}
const kind = ts_SymbolDisplay_exports.getSymbolKind(typeChecker, symbol, node);
const specifierName = isImportOrExportSpecifierName(node) || isStringOrNumericLiteralLike(node) && node.parent.kind === 166 /* ComputedPropertyName */ ? stripQuotes(getTextOfIdentifierOrLiteral(node)) : void 0;
const displayName = specifierName || typeChecker.symbolToString(symbol);
const fullDisplayName = specifierName || typeChecker.getFullyQualifiedName(symbol);
return getRenameInfoSuccess(displayName, fullDisplayName, kind, ts_SymbolDisplay_exports.getSymbolModifiers(typeChecker, symbol), node, sourceFile);
}
function isDefinedInLibraryFile(program, declaration) {
const sourceFile = declaration.getSourceFile();
return program.isSourceFileDefaultLibrary(sourceFile) && fileExtensionIs(sourceFile.fileName, ".d.ts" /* Dts */);
}
function wouldRenameInOtherNodeModules(originalFile, symbol, checker, preferences) {
if (!preferences.providePrefixAndSuffixTextForRename && symbol.flags & 2097152 /* Alias */) {
const importSpecifier = symbol.declarations && find(symbol.declarations, (decl) => isImportSpecifier(decl));
if (importSpecifier && !importSpecifier.propertyName) {
symbol = checker.getAliasedSymbol(symbol);
}
}
const { declarations } = symbol;
if (!declarations) {
return void 0;
}
const originalPackage = getPackagePathComponents(originalFile.path);
if (originalPackage === void 0) {
if (some(declarations, (declaration) => isInsideNodeModules(declaration.getSourceFile().path))) {
return Diagnostics.You_cannot_rename_elements_that_are_defined_in_a_node_modules_folder;
} else {
return void 0;
}
}
for (const declaration of declarations) {
const declPackage = getPackagePathComponents(declaration.getSourceFile().path);
if (declPackage) {
const length2 = Math.min(originalPackage.length, declPackage.length);
for (let i = 0; i <= length2; i++) {
if (compareStringsCaseSensitive(originalPackage[i], declPackage[i]) !== 0 /* EqualTo */) {
return Diagnostics.You_cannot_rename_elements_that_are_defined_in_another_node_modules_folder;
}
}
}
}
return void 0;
}
function getPackagePathComponents(filePath) {
const components = getPathComponents(filePath);
const nodeModulesIdx = components.lastIndexOf("node_modules");
if (nodeModulesIdx === -1) {
return void 0;
}
return components.slice(0, nodeModulesIdx + 2);
}
function getRenameInfoForModule(node, sourceFile, moduleSymbol) {
if (!isExternalModuleNameRelative(node.text)) {
return getRenameInfoError(Diagnostics.You_cannot_rename_a_module_via_a_global_import);
}
const moduleSourceFile = moduleSymbol.declarations && find(moduleSymbol.declarations, isSourceFile);
if (!moduleSourceFile)
return void 0;
const withoutIndex = endsWith(node.text, "/index") || endsWith(node.text, "/index.js") ? void 0 : tryRemoveSuffix(removeFileExtension(moduleSourceFile.fileName), "/index");
const name = withoutIndex === void 0 ? moduleSourceFile.fileName : withoutIndex;
const kind = withoutIndex === void 0 ? "module" /* moduleElement */ : "directory" /* directory */;
const indexAfterLastSlash = node.text.lastIndexOf("/") + 1;
const triggerSpan = createTextSpan(node.getStart(sourceFile) + 1 + indexAfterLastSlash, node.text.length - indexAfterLastSlash);
return {
canRename: true,
fileToRename: name,
kind,
displayName: name,
fullDisplayName: name,
kindModifiers: "" /* none */,
triggerSpan
};
}
function getRenameInfoSuccess(displayName, fullDisplayName, kind, kindModifiers, node, sourceFile) {
return {
canRename: true,
fileToRename: void 0,
kind,
displayName,
fullDisplayName,
kindModifiers,
triggerSpan: createTriggerSpanForNode(node, sourceFile)
};
}
function getRenameInfoError(diagnostic) {
return { canRename: false, localizedErrorMessage: getLocaleSpecificMessage(diagnostic) };
}
function createTriggerSpanForNode(node, sourceFile) {
let start2 = node.getStart(sourceFile);
let width = node.getWidth(sourceFile);
if (isStringLiteralLike(node)) {
start2 += 1;
width -= 2;
}
return createTextSpan(start2, width);
}
function nodeIsEligibleForRename(node) {
switch (node.kind) {
case 80 /* Identifier */:
case 81 /* PrivateIdentifier */:
case 11 /* StringLiteral */:
case 15 /* NoSubstitutionTemplateLiteral */:
case 110 /* ThisKeyword */:
return true;
case 9 /* NumericLiteral */:
return isLiteralNameOfPropertyDeclarationOrIndexAccess(node);
default:
return false;
}
}
// src/services/_namespaces/ts.SignatureHelp.ts
var ts_SignatureHelp_exports = {};
__export(ts_SignatureHelp_exports, {
getArgumentInfoForCompletions: () => getArgumentInfoForCompletions,
getSignatureHelpItems: () => getSignatureHelpItems
});
// src/services/signatureHelp.ts
function getSignatureHelpItems(program, sourceFile, position, triggerReason, cancellationToken) {
const typeChecker = program.getTypeChecker();
const startingToken = findTokenOnLeftOfPosition(sourceFile, position);
if (!startingToken) {
return void 0;
}
const onlyUseSyntacticOwners = !!triggerReason && triggerReason.kind === "characterTyped";
if (onlyUseSyntacticOwners && (isInString(sourceFile, position, startingToken) || isInComment(sourceFile, position))) {
return void 0;
}
const isManuallyInvoked = !!triggerReason && triggerReason.kind === "invoked";
const argumentInfo = getContainingArgumentInfo(startingToken, position, sourceFile, typeChecker, isManuallyInvoked);
if (!argumentInfo)
return void 0;
cancellationToken.throwIfCancellationRequested();
const candidateInfo = getCandidateOrTypeInfo(argumentInfo, typeChecker, sourceFile, startingToken, onlyUseSyntacticOwners);
cancellationToken.throwIfCancellationRequested();
if (!candidateInfo) {
return isSourceFileJS(sourceFile) ? createJSSignatureHelpItems(argumentInfo, program, cancellationToken) : void 0;
}
return typeChecker.runWithCancellationToken(cancellationToken, (typeChecker2) => candidateInfo.kind === 0 /* Candidate */ ? createSignatureHelpItems(candidateInfo.candidates, candidateInfo.resolvedSignature, argumentInfo, sourceFile, typeChecker2) : createTypeHelpItems(candidateInfo.symbol, argumentInfo, sourceFile, typeChecker2));
}
function getCandidateOrTypeInfo({ invocation, argumentCount }, checker, sourceFile, startingToken, onlyUseSyntacticOwners) {
switch (invocation.kind) {
case 0 /* Call */: {
if (onlyUseSyntacticOwners && !isSyntacticOwner(startingToken, invocation.node, sourceFile)) {
return void 0;
}
const candidates = [];
const resolvedSignature = checker.getResolvedSignatureForSignatureHelp(invocation.node, candidates, argumentCount);
return candidates.length === 0 ? void 0 : { kind: 0 /* Candidate */, candidates, resolvedSignature };
}
case 1 /* TypeArgs */: {
const { called } = invocation;
if (onlyUseSyntacticOwners && !containsPrecedingToken(startingToken, sourceFile, isIdentifier(called) ? called.parent : called)) {
return void 0;
}
const candidates = getPossibleGenericSignatures(called, argumentCount, checker);
if (candidates.length !== 0)
return { kind: 0 /* Candidate */, candidates, resolvedSignature: first(candidates) };
const symbol = checker.getSymbolAtLocation(called);
return symbol && { kind: 1 /* Type */, symbol };
}
case 2 /* Contextual */:
return { kind: 0 /* Candidate */, candidates: [invocation.signature], resolvedSignature: invocation.signature };
default:
return Debug.assertNever(invocation);
}
}
function isSyntacticOwner(startingToken, node, sourceFile) {
if (!isCallOrNewExpression(node))
return false;
const invocationChildren = node.getChildren(sourceFile);
switch (startingToken.kind) {
case 21 /* OpenParenToken */:
return contains(invocationChildren, startingToken);
case 28 /* CommaToken */: {
const containingList = findContainingList(startingToken);
return !!containingList && contains(invocationChildren, containingList);
}
case 30 /* LessThanToken */:
return containsPrecedingToken(startingToken, sourceFile, node.expression);
default:
return false;
}
}
function createJSSignatureHelpItems(argumentInfo, program, cancellationToken) {
if (argumentInfo.invocation.kind === 2 /* Contextual */)
return void 0;
const expression = getExpressionFromInvocation(argumentInfo.invocation);
const name = isPropertyAccessExpression(expression) ? expression.name.text : void 0;
const typeChecker = program.getTypeChecker();
return name === void 0 ? void 0 : firstDefined(program.getSourceFiles(), (sourceFile) => firstDefined(sourceFile.getNamedDeclarations().get(name), (declaration) => {
const type = declaration.symbol && typeChecker.getTypeOfSymbolAtLocation(declaration.symbol, declaration);
const callSignatures = type && type.getCallSignatures();
if (callSignatures && callSignatures.length) {
return typeChecker.runWithCancellationToken(
cancellationToken,
(typeChecker2) => createSignatureHelpItems(
callSignatures,
callSignatures[0],
argumentInfo,
sourceFile,
typeChecker2,
/*useFullPrefix*/
true
)
);
}
}));
}
function containsPrecedingToken(startingToken, sourceFile, container) {
const pos = startingToken.getFullStart();
let currentParent = startingToken.parent;
while (currentParent) {
const precedingToken = findPrecedingToken(
pos,
sourceFile,
currentParent,
/*excludeJsdoc*/
true
);
if (precedingToken) {
return rangeContainsRange(container, precedingToken);
}
currentParent = currentParent.parent;
}
return Debug.fail("Could not find preceding token");
}
function getArgumentInfoForCompletions(node, position, sourceFile) {
const info = getImmediatelyContainingArgumentInfo(node, position, sourceFile);
return !info || info.isTypeParameterList || info.invocation.kind !== 0 /* Call */ ? void 0 : { invocation: info.invocation.node, argumentCount: info.argumentCount, argumentIndex: info.argumentIndex };
}
function getArgumentOrParameterListInfo(node, position, sourceFile) {
const info = getArgumentOrParameterListAndIndex(node, sourceFile);
if (!info)
return void 0;
const { list, argumentIndex } = info;
const argumentCount = getArgumentCount(
list,
/*ignoreTrailingComma*/
isInString(sourceFile, position, node)
);
if (argumentIndex !== 0) {
Debug.assertLessThan(argumentIndex, argumentCount);
}
const argumentsSpan = getApplicableSpanForArguments(list, sourceFile);
return { list, argumentIndex, argumentCount, argumentsSpan };
}
function getArgumentOrParameterListAndIndex(node, sourceFile) {
if (node.kind === 30 /* LessThanToken */ || node.kind === 21 /* OpenParenToken */) {
return { list: getChildListThatStartsWithOpenerToken(node.parent, node, sourceFile), argumentIndex: 0 };
} else {
const list = findContainingList(node);
return list && { list, argumentIndex: getArgumentIndex(list, node) };
}
}
function getImmediatelyContainingArgumentInfo(node, position, sourceFile) {
const { parent: parent2 } = node;
if (isCallOrNewExpression(parent2)) {
const invocation = parent2;
const info = getArgumentOrParameterListInfo(node, position, sourceFile);
if (!info)
return void 0;
const { list, argumentIndex, argumentCount, argumentsSpan } = info;
const isTypeParameterList = !!parent2.typeArguments && parent2.typeArguments.pos === list.pos;
return { isTypeParameterList, invocation: { kind: 0 /* Call */, node: invocation }, argumentsSpan, argumentIndex, argumentCount };
} else if (isNoSubstitutionTemplateLiteral(node) && isTaggedTemplateExpression(parent2)) {
if (isInsideTemplateLiteral(node, position, sourceFile)) {
return getArgumentListInfoForTemplate(
parent2,
/*argumentIndex*/
0,
sourceFile
);
}
return void 0;
} else if (isTemplateHead(node) && parent2.parent.kind === 214 /* TaggedTemplateExpression */) {
const templateExpression = parent2;
const tagExpression = templateExpression.parent;
Debug.assert(templateExpression.kind === 227 /* TemplateExpression */);
const argumentIndex = isInsideTemplateLiteral(node, position, sourceFile) ? 0 : 1;
return getArgumentListInfoForTemplate(tagExpression, argumentIndex, sourceFile);
} else if (isTemplateSpan(parent2) && isTaggedTemplateExpression(parent2.parent.parent)) {
const templateSpan = parent2;
const tagExpression = parent2.parent.parent;
if (isTemplateTail(node) && !isInsideTemplateLiteral(node, position, sourceFile)) {
return void 0;
}
const spanIndex = templateSpan.parent.templateSpans.indexOf(templateSpan);
const argumentIndex = getArgumentIndexForTemplatePiece(spanIndex, node, position, sourceFile);
return getArgumentListInfoForTemplate(tagExpression, argumentIndex, sourceFile);
} else if (isJsxOpeningLikeElement(parent2)) {
const attributeSpanStart = parent2.attributes.pos;
const attributeSpanEnd = skipTrivia(
sourceFile.text,
parent2.attributes.end,
/*stopAfterLineBreak*/
false
);
return {
isTypeParameterList: false,
invocation: { kind: 0 /* Call */, node: parent2 },
argumentsSpan: createTextSpan(attributeSpanStart, attributeSpanEnd - attributeSpanStart),
argumentIndex: 0,
argumentCount: 1
};
} else {
const typeArgInfo = getPossibleTypeArgumentsInfo(node, sourceFile);
if (typeArgInfo) {
const { called, nTypeArguments } = typeArgInfo;
const invocation = { kind: 1 /* TypeArgs */, called };
const argumentsSpan = createTextSpanFromBounds(called.getStart(sourceFile), node.end);
return { isTypeParameterList: true, invocation, argumentsSpan, argumentIndex: nTypeArguments, argumentCount: nTypeArguments + 1 };
}
return void 0;
}
}
function getImmediatelyContainingArgumentOrContextualParameterInfo(node, position, sourceFile, checker) {
return tryGetParameterInfo(node, position, sourceFile, checker) || getImmediatelyContainingArgumentInfo(node, position, sourceFile);
}
function getHighestBinary(b) {
return isBinaryExpression(b.parent) ? getHighestBinary(b.parent) : b;
}
function countBinaryExpressionParameters(b) {
return isBinaryExpression(b.left) ? countBinaryExpressionParameters(b.left) + 1 : 2;
}
function tryGetParameterInfo(startingToken, position, sourceFile, checker) {
const node = getAdjustedNode(startingToken);
if (node === void 0)
return void 0;
const info = getContextualSignatureLocationInfo(node, sourceFile, position, checker);
if (info === void 0)
return void 0;
const { contextualType, argumentIndex, argumentCount, argumentsSpan } = info;
const nonNullableContextualType = contextualType.getNonNullableType();
const symbol = nonNullableContextualType.symbol;
if (symbol === void 0)
return void 0;
const signature = lastOrUndefined(nonNullableContextualType.getCallSignatures());
if (signature === void 0)
return void 0;
const invocation = { kind: 2 /* Contextual */, signature, node: startingToken, symbol: chooseBetterSymbol(symbol) };
return { isTypeParameterList: false, invocation, argumentsSpan, argumentIndex, argumentCount };
}
function getAdjustedNode(node) {
switch (node.kind) {
case 21 /* OpenParenToken */:
case 28 /* CommaToken */:
return node;
default:
return findAncestor(node.parent, (n) => isParameter(n) ? true : isBindingElement(n) || isObjectBindingPattern(n) || isArrayBindingPattern(n) ? false : "quit");
}
}
function getContextualSignatureLocationInfo(node, sourceFile, position, checker) {
const { parent: parent2 } = node;
switch (parent2.kind) {
case 216 /* ParenthesizedExpression */:
case 173 /* MethodDeclaration */:
case 217 /* FunctionExpression */:
case 218 /* ArrowFunction */:
const info = getArgumentOrParameterListInfo(node, position, sourceFile);
if (!info)
return void 0;
const { argumentIndex, argumentCount, argumentsSpan } = info;
const contextualType = isMethodDeclaration(parent2) ? checker.getContextualTypeForObjectLiteralElement(parent2) : checker.getContextualType(parent2);
return contextualType && { contextualType, argumentIndex, argumentCount, argumentsSpan };
case 225 /* BinaryExpression */: {
const highestBinary = getHighestBinary(parent2);
const contextualType2 = checker.getContextualType(highestBinary);
const argumentIndex2 = node.kind === 21 /* OpenParenToken */ ? 0 : countBinaryExpressionParameters(parent2) - 1;
const argumentCount2 = countBinaryExpressionParameters(highestBinary);
return contextualType2 && { contextualType: contextualType2, argumentIndex: argumentIndex2, argumentCount: argumentCount2, argumentsSpan: createTextSpanFromNode(parent2) };
}
default:
return void 0;
}
}
function chooseBetterSymbol(s) {
return s.name === "__type" /* Type */ ? firstDefined(s.declarations, (d) => {
var _a;
return isFunctionTypeNode(d) ? (_a = tryCast(d.parent, canHaveSymbol)) == null ? void 0 : _a.symbol : void 0;
}) || s : s;
}
function getArgumentIndex(argumentsList, node) {
let argumentIndex = 0;
for (const child of argumentsList.getChildren()) {
if (child === node) {
break;
}
if (child.kind !== 28 /* CommaToken */) {
argumentIndex++;
}
}
return argumentIndex;
}
function getArgumentCount(argumentsList, ignoreTrailingComma) {
const listChildren = argumentsList.getChildren();
let argumentCount = countWhere(listChildren, (arg) => arg.kind !== 28 /* CommaToken */);
if (!ignoreTrailingComma && listChildren.length > 0 && last(listChildren).kind === 28 /* CommaToken */) {
argumentCount++;
}
return argumentCount;
}
function getArgumentIndexForTemplatePiece(spanIndex, node, position, sourceFile) {
Debug.assert(position >= node.getStart(), "Assumed 'position' could not occur before node.");
if (isTemplateLiteralToken(node)) {
if (isInsideTemplateLiteral(node, position, sourceFile)) {
return 0;
}
return spanIndex + 2;
}
return spanIndex + 1;
}
function getArgumentListInfoForTemplate(tagExpression, argumentIndex, sourceFile) {
const argumentCount = isNoSubstitutionTemplateLiteral(tagExpression.template) ? 1 : tagExpression.template.templateSpans.length + 1;
if (argumentIndex !== 0) {
Debug.assertLessThan(argumentIndex, argumentCount);
}
return {
isTypeParameterList: false,
invocation: { kind: 0 /* Call */, node: tagExpression },
argumentsSpan: getApplicableSpanForTaggedTemplate(tagExpression, sourceFile),
argumentIndex,
argumentCount
};
}
function getApplicableSpanForArguments(argumentsList, sourceFile) {
const applicableSpanStart = argumentsList.getFullStart();
const applicableSpanEnd = skipTrivia(
sourceFile.text,
argumentsList.getEnd(),
/*stopAfterLineBreak*/
false
);
return createTextSpan(applicableSpanStart, applicableSpanEnd - applicableSpanStart);
}
function getApplicableSpanForTaggedTemplate(taggedTemplate, sourceFile) {
const template = taggedTemplate.template;
const applicableSpanStart = template.getStart();
let applicableSpanEnd = template.getEnd();
if (template.kind === 227 /* TemplateExpression */) {
const lastSpan = last(template.templateSpans);
if (lastSpan.literal.getFullWidth() === 0) {
applicableSpanEnd = skipTrivia(
sourceFile.text,
applicableSpanEnd,
/*stopAfterLineBreak*/
false
);
}
}
return createTextSpan(applicableSpanStart, applicableSpanEnd - applicableSpanStart);
}
function getContainingArgumentInfo(node, position, sourceFile, checker, isManuallyInvoked) {
for (let n = node; !isSourceFile(n) && (isManuallyInvoked || !isBlock(n)); n = n.parent) {
Debug.assert(rangeContainsRange(n.parent, n), "Not a subspan", () => `Child: ${Debug.formatSyntaxKind(n.kind)}, parent: ${Debug.formatSyntaxKind(n.parent.kind)}`);
const argumentInfo = getImmediatelyContainingArgumentOrContextualParameterInfo(n, position, sourceFile, checker);
if (argumentInfo) {
return argumentInfo;
}
}
return void 0;
}
function getChildListThatStartsWithOpenerToken(parent2, openerToken, sourceFile) {
const children = parent2.getChildren(sourceFile);
const indexOfOpenerToken = children.indexOf(openerToken);
Debug.assert(indexOfOpenerToken >= 0 && children.length > indexOfOpenerToken + 1);
return children[indexOfOpenerToken + 1];
}
function getExpressionFromInvocation(invocation) {
return invocation.kind === 0 /* Call */ ? getInvokedExpression(invocation.node) : invocation.called;
}
function getEnclosingDeclarationFromInvocation(invocation) {
return invocation.kind === 0 /* Call */ ? invocation.node : invocation.kind === 1 /* TypeArgs */ ? invocation.called : invocation.node;
}
var signatureHelpNodeBuilderFlags = 8192 /* OmitParameterModifiers */ | 70221824 /* IgnoreErrors */ | 16384 /* UseAliasDefinedOutsideCurrentScope */;
function createSignatureHelpItems(candidates, resolvedSignature, { isTypeParameterList, argumentCount, argumentsSpan: applicableSpan, invocation, argumentIndex }, sourceFile, typeChecker, useFullPrefix) {
var _a;
const enclosingDeclaration = getEnclosingDeclarationFromInvocation(invocation);
const callTargetSymbol = invocation.kind === 2 /* Contextual */ ? invocation.symbol : typeChecker.getSymbolAtLocation(getExpressionFromInvocation(invocation)) || useFullPrefix && ((_a = resolvedSignature.declaration) == null ? void 0 : _a.symbol);
const callTargetDisplayParts = callTargetSymbol ? symbolToDisplayParts(
typeChecker,
callTargetSymbol,
useFullPrefix ? sourceFile : void 0,
/*meaning*/
void 0
) : emptyArray;
const items = map(candidates, (candidateSignature) => getSignatureHelpItem(candidateSignature, callTargetDisplayParts, isTypeParameterList, typeChecker, enclosingDeclaration, sourceFile));
if (argumentIndex !== 0) {
Debug.assertLessThan(argumentIndex, argumentCount);
}
let selectedItemIndex = 0;
let itemsSeen = 0;
for (let i = 0; i < items.length; i++) {
const item = items[i];
if (candidates[i] === resolvedSignature) {
selectedItemIndex = itemsSeen;
if (item.length > 1) {
let count = 0;
for (const i2 of item) {
if (i2.isVariadic || i2.parameters.length >= argumentCount) {
selectedItemIndex = itemsSeen + count;
break;
}
count++;
}
}
}
itemsSeen += item.length;
}
Debug.assert(selectedItemIndex !== -1);
const help = { items: flatMapToMutable(items, identity), applicableSpan, selectedItemIndex, argumentIndex, argumentCount };
const selected = help.items[selectedItemIndex];
if (selected.isVariadic) {
const firstRest = findIndex(selected.parameters, (p) => !!p.isRest);
if (-1 < firstRest && firstRest < selected.parameters.length - 1) {
help.argumentIndex = selected.parameters.length;
} else {
help.argumentIndex = Math.min(help.argumentIndex, selected.parameters.length - 1);
}
}
return help;
}
function createTypeHelpItems(symbol, { argumentCount, argumentsSpan: applicableSpan, invocation, argumentIndex }, sourceFile, checker) {
const typeParameters = checker.getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(symbol);
if (!typeParameters)
return void 0;
const items = [getTypeHelpItem(symbol, typeParameters, checker, getEnclosingDeclarationFromInvocation(invocation), sourceFile)];
return { items, applicableSpan, selectedItemIndex: 0, argumentIndex, argumentCount };
}
function getTypeHelpItem(symbol, typeParameters, checker, enclosingDeclaration, sourceFile) {
const typeSymbolDisplay = symbolToDisplayParts(checker, symbol);
const printer = createPrinterWithRemoveComments();
const parameters = typeParameters.map((t) => createSignatureHelpParameterForTypeParameter(t, checker, enclosingDeclaration, sourceFile, printer));
const documentation = symbol.getDocumentationComment(checker);
const tags = symbol.getJsDocTags(checker);
const prefixDisplayParts = [...typeSymbolDisplay, punctuationPart(30 /* LessThanToken */)];
return { isVariadic: false, prefixDisplayParts, suffixDisplayParts: [punctuationPart(32 /* GreaterThanToken */)], separatorDisplayParts, parameters, documentation, tags };
}
var separatorDisplayParts = [punctuationPart(28 /* CommaToken */), spacePart()];
function getSignatureHelpItem(candidateSignature, callTargetDisplayParts, isTypeParameterList, checker, enclosingDeclaration, sourceFile) {
const infos = (isTypeParameterList ? itemInfoForTypeParameters : itemInfoForParameters)(candidateSignature, checker, enclosingDeclaration, sourceFile);
return map(infos, ({ isVariadic, parameters, prefix, suffix }) => {
const prefixDisplayParts = [...callTargetDisplayParts, ...prefix];
const suffixDisplayParts = [...suffix, ...returnTypeToDisplayParts(candidateSignature, enclosingDeclaration, checker)];
const documentation = candidateSignature.getDocumentationComment(checker);
const tags = candidateSignature.getJsDocTags();
return { isVariadic, prefixDisplayParts, suffixDisplayParts, separatorDisplayParts, parameters, documentation, tags };
});
}
function returnTypeToDisplayParts(candidateSignature, enclosingDeclaration, checker) {
return mapToDisplayParts((writer) => {
writer.writePunctuation(":");
writer.writeSpace(" ");
const predicate = checker.getTypePredicateOfSignature(candidateSignature);
if (predicate) {
checker.writeTypePredicate(
predicate,
enclosingDeclaration,
/*flags*/
void 0,
writer
);
} else {
checker.writeType(
checker.getReturnTypeOfSignature(candidateSignature),
enclosingDeclaration,
/*flags*/
void 0,
writer
);
}
});
}
function itemInfoForTypeParameters(candidateSignature, checker, enclosingDeclaration, sourceFile) {
const typeParameters = (candidateSignature.target || candidateSignature).typeParameters;
const printer = createPrinterWithRemoveComments();
const parameters = (typeParameters || emptyArray).map((t) => createSignatureHelpParameterForTypeParameter(t, checker, enclosingDeclaration, sourceFile, printer));
const thisParameter = candidateSignature.thisParameter ? [checker.symbolToParameterDeclaration(candidateSignature.thisParameter, enclosingDeclaration, signatureHelpNodeBuilderFlags)] : [];
return checker.getExpandedParameters(candidateSignature).map((paramList) => {
const params = factory.createNodeArray([...thisParameter, ...map(paramList, (param) => checker.symbolToParameterDeclaration(param, enclosingDeclaration, signatureHelpNodeBuilderFlags))]);
const parameterParts = mapToDisplayParts((writer) => {
printer.writeList(2576 /* CallExpressionArguments */, params, sourceFile, writer);
});
return { isVariadic: false, parameters, prefix: [punctuationPart(30 /* LessThanToken */)], suffix: [punctuationPart(32 /* GreaterThanToken */), ...parameterParts] };
});
}
function itemInfoForParameters(candidateSignature, checker, enclosingDeclaration, sourceFile) {
const printer = createPrinterWithRemoveComments();
const typeParameterParts = mapToDisplayParts((writer) => {
if (candidateSignature.typeParameters && candidateSignature.typeParameters.length) {
const args = factory.createNodeArray(candidateSignature.typeParameters.map((p) => checker.typeParameterToDeclaration(p, enclosingDeclaration, signatureHelpNodeBuilderFlags)));
printer.writeList(53776 /* TypeParameters */, args, sourceFile, writer);
}
});
const lists = checker.getExpandedParameters(candidateSignature);
const isVariadic = !checker.hasEffectiveRestParameter(candidateSignature) ? (_) => false : lists.length === 1 ? (_) => true : (pList) => {
var _a;
return !!(pList.length && ((_a = tryCast(pList[pList.length - 1], isTransientSymbol)) == null ? void 0 : _a.links.checkFlags) & 32768 /* RestParameter */);
};
return lists.map((parameterList) => ({
isVariadic: isVariadic(parameterList),
parameters: parameterList.map((p) => createSignatureHelpParameterForParameter(p, checker, enclosingDeclaration, sourceFile, printer)),
prefix: [...typeParameterParts, punctuationPart(21 /* OpenParenToken */)],
suffix: [punctuationPart(22 /* CloseParenToken */)]
}));
}
function createSignatureHelpParameterForParameter(parameter, checker, enclosingDeclaration, sourceFile, printer) {
const displayParts = mapToDisplayParts((writer) => {
const param = checker.symbolToParameterDeclaration(parameter, enclosingDeclaration, signatureHelpNodeBuilderFlags);
printer.writeNode(4 /* Unspecified */, param, sourceFile, writer);
});
const isOptional = checker.isOptionalParameter(parameter.valueDeclaration);
const isRest = isTransientSymbol(parameter) && !!(parameter.links.checkFlags & 32768 /* RestParameter */);
return { name: parameter.name, documentation: parameter.getDocumentationComment(checker), displayParts, isOptional, isRest };
}
function createSignatureHelpParameterForTypeParameter(typeParameter, checker, enclosingDeclaration, sourceFile, printer) {
const displayParts = mapToDisplayParts((writer) => {
const param = checker.typeParameterToDeclaration(typeParameter, enclosingDeclaration, signatureHelpNodeBuilderFlags);
printer.writeNode(4 /* Unspecified */, param, sourceFile, writer);
});
return { name: typeParameter.symbol.name, documentation: typeParameter.symbol.getDocumentationComment(checker), displayParts, isOptional: false, isRest: false };
}
// src/services/_namespaces/ts.SmartSelectionRange.ts
var ts_SmartSelectionRange_exports = {};
__export(ts_SmartSelectionRange_exports, {
getSmartSelectionRange: () => getSmartSelectionRange
});
// src/services/smartSelection.ts
function getSmartSelectionRange(pos, sourceFile) {
var _a, _b;
let selectionRange = {
textSpan: createTextSpanFromBounds(sourceFile.getFullStart(), sourceFile.getEnd())
};
let parentNode = sourceFile;
outer:
while (true) {
const children = getSelectionChildren(parentNode);
if (!children.length)
break;
for (let i = 0; i < children.length; i++) {
const prevNode = children[i - 1];
const node = children[i];
const nextNode = children[i + 1];
if (getTokenPosOfNode(
node,
sourceFile,
/*includeJsDoc*/
true
) > pos) {
break outer;
}
const comment = singleOrUndefined(getTrailingCommentRanges(sourceFile.text, node.end));
if (comment && comment.kind === 2 /* SingleLineCommentTrivia */) {
pushSelectionCommentRange(comment.pos, comment.end);
}
if (positionShouldSnapToNode(sourceFile, pos, node)) {
if (isFunctionBody(node) && isFunctionLikeDeclaration(parentNode) && !positionsAreOnSameLine(node.getStart(sourceFile), node.getEnd(), sourceFile)) {
pushSelectionRange(node.getStart(sourceFile), node.getEnd());
}
if (isBlock(node) || isTemplateSpan(node) || isTemplateHead(node) || isTemplateTail(node) || prevNode && isTemplateHead(prevNode) || isVariableDeclarationList(node) && isVariableStatement(parentNode) || isSyntaxList(node) && isVariableDeclarationList(parentNode) || isVariableDeclaration(node) && isSyntaxList(parentNode) && children.length === 1 || isJSDocTypeExpression(node) || isJSDocSignature(node) || isJSDocTypeLiteral(node)) {
parentNode = node;
break;
}
if (isTemplateSpan(parentNode) && nextNode && isTemplateMiddleOrTemplateTail(nextNode)) {
const start3 = node.getFullStart() - "${".length;
const end2 = nextNode.getStart() + "}".length;
pushSelectionRange(start3, end2);
}
const isBetweenMultiLineBookends = isSyntaxList(node) && isListOpener(prevNode) && isListCloser(nextNode) && !positionsAreOnSameLine(prevNode.getStart(), nextNode.getStart(), sourceFile);
let start2 = isBetweenMultiLineBookends ? prevNode.getEnd() : node.getStart();
const end = isBetweenMultiLineBookends ? nextNode.getStart() : getEndPos(sourceFile, node);
if (hasJSDocNodes(node) && ((_a = node.jsDoc) == null ? void 0 : _a.length)) {
pushSelectionRange(first(node.jsDoc).getStart(), end);
}
if (isSyntaxList(node)) {
const firstChild = node.getChildren()[0];
if (firstChild && hasJSDocNodes(firstChild) && ((_b = firstChild.jsDoc) == null ? void 0 : _b.length) && firstChild.getStart() !== node.pos) {
start2 = Math.min(start2, first(firstChild.jsDoc).getStart());
}
}
pushSelectionRange(start2, end);
if (isStringLiteral(node) || isTemplateLiteral(node)) {
pushSelectionRange(start2 + 1, end - 1);
}
parentNode = node;
break;
}
if (i === children.length - 1) {
break outer;
}
}
}
return selectionRange;
function pushSelectionRange(start2, end) {
if (start2 !== end) {
const textSpan = createTextSpanFromBounds(start2, end);
if (!selectionRange || // Skip ranges that are identical to the parent
!textSpansEqual(textSpan, selectionRange.textSpan) && // Skip ranges that don't contain the original position
textSpanIntersectsWithPosition(textSpan, pos)) {
selectionRange = { textSpan, ...selectionRange && { parent: selectionRange } };
}
}
}
function pushSelectionCommentRange(start2, end) {
pushSelectionRange(start2, end);
let pos2 = start2;
while (sourceFile.text.charCodeAt(pos2) === 47 /* slash */) {
pos2++;
}
pushSelectionRange(pos2, end);
}
}
function positionShouldSnapToNode(sourceFile, pos, node) {
Debug.assert(node.pos <= pos);
if (pos < node.end) {
return true;
}
const nodeEnd = node.getEnd();
if (nodeEnd === pos) {
return getTouchingPropertyName(sourceFile, pos).pos < node.end;
}
return false;
}
var isImport2 = or(isImportDeclaration, isImportEqualsDeclaration);
function getSelectionChildren(node) {
var _a;
if (isSourceFile(node)) {
return groupChildren(node.getChildAt(0).getChildren(), isImport2);
}
if (isMappedTypeNode(node)) {
const [openBraceToken, ...children] = node.getChildren();
const closeBraceToken = Debug.checkDefined(children.pop());
Debug.assertEqual(openBraceToken.kind, 19 /* OpenBraceToken */);
Debug.assertEqual(closeBraceToken.kind, 20 /* CloseBraceToken */);
const groupedWithPlusMinusTokens = groupChildren(children, (child) => child === node.readonlyToken || child.kind === 148 /* ReadonlyKeyword */ || child === node.questionToken || child.kind === 58 /* QuestionToken */);
const groupedWithBrackets = groupChildren(
groupedWithPlusMinusTokens,
({ kind }) => kind === 23 /* OpenBracketToken */ || kind === 167 /* TypeParameter */ || kind === 24 /* CloseBracketToken */
);
return [
openBraceToken,
// Pivot on `:`
createSyntaxList2(splitChildren(groupedWithBrackets, ({ kind }) => kind === 59 /* ColonToken */)),
closeBraceToken
];
}
if (isPropertySignature(node)) {
const children = groupChildren(node.getChildren(), (child) => child === node.name || contains(node.modifiers, child));
const firstJSDocChild = ((_a = children[0]) == null ? void 0 : _a.kind) === 326 /* JSDoc */ ? children[0] : void 0;
const withJSDocSeparated = firstJSDocChild ? children.slice(1) : children;
const splittedChildren = splitChildren(withJSDocSeparated, ({ kind }) => kind === 59 /* ColonToken */);
return firstJSDocChild ? [firstJSDocChild, createSyntaxList2(splittedChildren)] : splittedChildren;
}
if (isParameter(node)) {
const groupedDotDotDotAndName = groupChildren(node.getChildren(), (child) => child === node.dotDotDotToken || child === node.name);
const groupedWithQuestionToken = groupChildren(groupedDotDotDotAndName, (child) => child === groupedDotDotDotAndName[0] || child === node.questionToken);
return splitChildren(groupedWithQuestionToken, ({ kind }) => kind === 64 /* EqualsToken */);
}
if (isBindingElement(node)) {
return splitChildren(node.getChildren(), ({ kind }) => kind === 64 /* EqualsToken */);
}
return node.getChildren();
}
function groupChildren(children, groupOn) {
const result = [];
let group2;
for (const child of children) {
if (groupOn(child)) {
group2 = group2 || [];
group2.push(child);
} else {
if (group2) {
result.push(createSyntaxList2(group2));
group2 = void 0;
}
result.push(child);
}
}
if (group2) {
result.push(createSyntaxList2(group2));
}
return result;
}
function splitChildren(children, pivotOn, separateTrailingSemicolon = true) {
if (children.length < 2) {
return children;
}
const splitTokenIndex = findIndex(children, pivotOn);
if (splitTokenIndex === -1) {
return children;
}
const leftChildren = children.slice(0, splitTokenIndex);
const splitToken = children[splitTokenIndex];
const lastToken = last(children);
const separateLastToken = separateTrailingSemicolon && lastToken.kind === 27 /* SemicolonToken */;
const rightChildren = children.slice(splitTokenIndex + 1, separateLastToken ? children.length - 1 : void 0);
const result = compact([
leftChildren.length ? createSyntaxList2(leftChildren) : void 0,
splitToken,
rightChildren.length ? createSyntaxList2(rightChildren) : void 0
]);
return separateLastToken ? result.concat(lastToken) : result;
}
function createSyntaxList2(children) {
Debug.assertGreaterThanOrEqual(children.length, 1);
return setTextRangePosEnd(parseNodeFactory.createSyntaxList(children), children[0].pos, last(children).end);
}
function isListOpener(token) {
const kind = token && token.kind;
return kind === 19 /* OpenBraceToken */ || kind === 23 /* OpenBracketToken */ || kind === 21 /* OpenParenToken */ || kind === 285 /* JsxOpeningElement */;
}
function isListCloser(token) {
const kind = token && token.kind;
return kind === 20 /* CloseBraceToken */ || kind === 24 /* CloseBracketToken */ || kind === 22 /* CloseParenToken */ || kind === 286 /* JsxClosingElement */;
}
function getEndPos(sourceFile, node) {
switch (node.kind) {
case 347 /* JSDocParameterTag */:
case 344 /* JSDocCallbackTag */:
case 354 /* JSDocPropertyTag */:
case 352 /* JSDocTypedefTag */:
case 349 /* JSDocThisTag */:
return sourceFile.getLineEndOfPosition(node.getStart());
default:
return node.getEnd();
}
}
// src/services/_namespaces/ts.SymbolDisplay.ts
var ts_SymbolDisplay_exports = {};
__export(ts_SymbolDisplay_exports, {
getSymbolDisplayPartsDocumentationAndSymbolKind: () => getSymbolDisplayPartsDocumentationAndSymbolKind,
getSymbolKind: () => getSymbolKind,
getSymbolModifiers: () => getSymbolModifiers
});
// src/services/symbolDisplay.ts
var symbolDisplayNodeBuilderFlags = 8192 /* OmitParameterModifiers */ | 70221824 /* IgnoreErrors */ | 16384 /* UseAliasDefinedOutsideCurrentScope */;
function getSymbolKind(typeChecker, symbol, location) {
const result = getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(typeChecker, symbol, location);
if (result !== "" /* unknown */) {
return result;
}
const flags = getCombinedLocalAndExportSymbolFlags(symbol);
if (flags & 32 /* Class */) {
return getDeclarationOfKind(symbol, 230 /* ClassExpression */) ? "local class" /* localClassElement */ : "class" /* classElement */;
}
if (flags & 384 /* Enum */)
return "enum" /* enumElement */;
if (flags & 524288 /* TypeAlias */)
return "type" /* typeElement */;
if (flags & 64 /* Interface */)
return "interface" /* interfaceElement */;
if (flags & 262144 /* TypeParameter */)
return "type parameter" /* typeParameterElement */;
if (flags & 8 /* EnumMember */)
return "enum member" /* enumMemberElement */;
if (flags & 2097152 /* Alias */)
return "alias" /* alias */;
if (flags & 1536 /* Module */)
return "module" /* moduleElement */;
return result;
}
function getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(typeChecker, symbol, location) {
const roots = typeChecker.getRootSymbols(symbol);
if (roots.length === 1 && first(roots).flags & 8192 /* Method */ && typeChecker.getTypeOfSymbolAtLocation(symbol, location).getNonNullableType().getCallSignatures().length !== 0) {
return "method" /* memberFunctionElement */;
}
if (typeChecker.isUndefinedSymbol(symbol)) {
return "var" /* variableElement */;
}
if (typeChecker.isArgumentsSymbol(symbol)) {
return "local var" /* localVariableElement */;
}
if (location.kind === 110 /* ThisKeyword */ && isExpression(location) || isThisInTypeQuery(location)) {
return "parameter" /* parameterElement */;
}
const flags = getCombinedLocalAndExportSymbolFlags(symbol);
if (flags & 3 /* Variable */) {
if (isFirstDeclarationOfSymbolParameter(symbol)) {
return "parameter" /* parameterElement */;
} else if (symbol.valueDeclaration && isVarConst(symbol.valueDeclaration)) {
return "const" /* constElement */;
} else if (forEach(symbol.declarations, isLet)) {
return "let" /* letElement */;
}
return isLocalVariableOrFunction(symbol) ? "local var" /* localVariableElement */ : "var" /* variableElement */;
}
if (flags & 16 /* Function */)
return isLocalVariableOrFunction(symbol) ? "local function" /* localFunctionElement */ : "function" /* functionElement */;
if (flags & 32768 /* GetAccessor */)
return "getter" /* memberGetAccessorElement */;
if (flags & 65536 /* SetAccessor */)
return "setter" /* memberSetAccessorElement */;
if (flags & 8192 /* Method */)
return "method" /* memberFunctionElement */;
if (flags & 16384 /* Constructor */)
return "constructor" /* constructorImplementationElement */;
if (flags & 131072 /* Signature */)
return "index" /* indexSignatureElement */;
if (flags & 4 /* Property */) {
if (flags & 33554432 /* Transient */ && symbol.links.checkFlags & 6 /* Synthetic */) {
const unionPropertyKind = forEach(typeChecker.getRootSymbols(symbol), (rootSymbol) => {
const rootSymbolFlags = rootSymbol.getFlags();
if (rootSymbolFlags & (98308 /* PropertyOrAccessor */ | 3 /* Variable */)) {
return "property" /* memberVariableElement */;
}
});
if (!unionPropertyKind) {
const typeOfUnionProperty = typeChecker.getTypeOfSymbolAtLocation(symbol, location);
if (typeOfUnionProperty.getCallSignatures().length) {
return "method" /* memberFunctionElement */;
}
return "property" /* memberVariableElement */;
}
return unionPropertyKind;
}
return "property" /* memberVariableElement */;
}
return "" /* unknown */;
}
function getNormalizedSymbolModifiers(symbol) {
if (symbol.declarations && symbol.declarations.length) {
const [declaration, ...declarations] = symbol.declarations;
const excludeFlags = length(declarations) && isDeprecatedDeclaration(declaration) && some(declarations, (d) => !isDeprecatedDeclaration(d)) ? 8192 /* Deprecated */ : 0 /* None */;
const modifiers = getNodeModifiers(declaration, excludeFlags);
if (modifiers) {
return modifiers.split(",");
}
}
return [];
}
function getSymbolModifiers(typeChecker, symbol) {
if (!symbol) {
return "" /* none */;
}
const modifiers = new Set(getNormalizedSymbolModifiers(symbol));
if (symbol.flags & 2097152 /* Alias */) {
const resolvedSymbol = typeChecker.getAliasedSymbol(symbol);
if (resolvedSymbol !== symbol) {
forEach(getNormalizedSymbolModifiers(resolvedSymbol), (modifier) => {
modifiers.add(modifier);
});
}
}
if (symbol.flags & 16777216 /* Optional */) {
modifiers.add("optional" /* optionalModifier */);
}
return modifiers.size > 0 ? arrayFrom(modifiers.values()).join(",") : "" /* none */;
}
function getSymbolDisplayPartsDocumentationAndSymbolKind(typeChecker, symbol, sourceFile, enclosingDeclaration, location, semanticMeaning = getMeaningFromLocation(location), alias) {
var _a;
const displayParts = [];
let documentation = [];
let tags = [];
const symbolFlags = getCombinedLocalAndExportSymbolFlags(symbol);
let symbolKind = semanticMeaning & 1 /* Value */ ? getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(typeChecker, symbol, location) : "" /* unknown */;
let hasAddedSymbolInfo = false;
const isThisExpression = location.kind === 110 /* ThisKeyword */ && isInExpressionContext(location) || isThisInTypeQuery(location);
let type;
let documentationFromAlias;
let tagsFromAlias;
let hasMultipleSignatures = false;
if (location.kind === 110 /* ThisKeyword */ && !isThisExpression) {
return { displayParts: [keywordPart(110 /* ThisKeyword */)], documentation: [], symbolKind: "primitive type" /* primitiveType */, tags: void 0 };
}
if (symbolKind !== "" /* unknown */ || symbolFlags & 32 /* Class */ || symbolFlags & 2097152 /* Alias */) {
if (symbolKind === "getter" /* memberGetAccessorElement */ || symbolKind === "setter" /* memberSetAccessorElement */) {
const declaration = find(symbol.declarations, (declaration2) => declaration2.name === location);
if (declaration) {
switch (declaration.kind) {
case 176 /* GetAccessor */:
symbolKind = "getter" /* memberGetAccessorElement */;
break;
case 177 /* SetAccessor */:
symbolKind = "setter" /* memberSetAccessorElement */;
break;
case 171 /* PropertyDeclaration */:
symbolKind = "accessor" /* memberAccessorVariableElement */;
break;
default:
Debug.assertNever(declaration);
}
} else {
symbolKind = "property" /* memberVariableElement */;
}
}
let signature;
type = isThisExpression ? typeChecker.getTypeAtLocation(location) : typeChecker.getTypeOfSymbolAtLocation(symbol, location);
if (location.parent && location.parent.kind === 210 /* PropertyAccessExpression */) {
const right = location.parent.name;
if (right === location || right && right.getFullWidth() === 0) {
location = location.parent;
}
}
let callExpressionLike;
if (isCallOrNewExpression(location)) {
callExpressionLike = location;
} else if (isCallExpressionTarget(location) || isNewExpressionTarget(location)) {
callExpressionLike = location.parent;
} else if (location.parent && (isJsxOpeningLikeElement(location.parent) || isTaggedTemplateExpression(location.parent)) && isFunctionLike(symbol.valueDeclaration)) {
callExpressionLike = location.parent;
}
if (callExpressionLike) {
signature = typeChecker.getResolvedSignature(callExpressionLike);
const useConstructSignatures = callExpressionLike.kind === 213 /* NewExpression */ || isCallExpression(callExpressionLike) && callExpressionLike.expression.kind === 108 /* SuperKeyword */;
const allSignatures = useConstructSignatures ? type.getConstructSignatures() : type.getCallSignatures();
if (signature && !contains(allSignatures, signature.target) && !contains(allSignatures, signature)) {
signature = allSignatures.length ? allSignatures[0] : void 0;
}
if (signature) {
if (useConstructSignatures && symbolFlags & 32 /* Class */) {
symbolKind = "constructor" /* constructorImplementationElement */;
addPrefixForAnyFunctionOrVar(type.symbol, symbolKind);
} else if (symbolFlags & 2097152 /* Alias */) {
symbolKind = "alias" /* alias */;
pushSymbolKind(symbolKind);
displayParts.push(spacePart());
if (useConstructSignatures) {
if (signature.flags & 4 /* Abstract */) {
displayParts.push(keywordPart(128 /* AbstractKeyword */));
displayParts.push(spacePart());
}
displayParts.push(keywordPart(105 /* NewKeyword */));
displayParts.push(spacePart());
}
addFullSymbolName(symbol);
} else {
addPrefixForAnyFunctionOrVar(symbol, symbolKind);
}
switch (symbolKind) {
case "JSX attribute" /* jsxAttribute */:
case "property" /* memberVariableElement */:
case "var" /* variableElement */:
case "const" /* constElement */:
case "let" /* letElement */:
case "parameter" /* parameterElement */:
case "local var" /* localVariableElement */:
displayParts.push(punctuationPart(59 /* ColonToken */));
displayParts.push(spacePart());
if (!(getObjectFlags(type) & 16 /* Anonymous */) && type.symbol) {
addRange(displayParts, symbolToDisplayParts(
typeChecker,
type.symbol,
enclosingDeclaration,
/*meaning*/
void 0,
4 /* AllowAnyNodeKind */ | 1 /* WriteTypeParametersOrArguments */
));
displayParts.push(lineBreakPart());
}
if (useConstructSignatures) {
if (signature.flags & 4 /* Abstract */) {
displayParts.push(keywordPart(128 /* AbstractKeyword */));
displayParts.push(spacePart());
}
displayParts.push(keywordPart(105 /* NewKeyword */));
displayParts.push(spacePart());
}
addSignatureDisplayParts(signature, allSignatures, 262144 /* WriteArrowStyleSignature */);
break;
default:
addSignatureDisplayParts(signature, allSignatures);
}
hasAddedSymbolInfo = true;
hasMultipleSignatures = allSignatures.length > 1;
}
} else if (isNameOfFunctionDeclaration(location) && !(symbolFlags & 98304 /* Accessor */) || // name of function declaration
location.kind === 137 /* ConstructorKeyword */ && location.parent.kind === 175 /* Constructor */) {
const functionDeclaration = location.parent;
const locationIsSymbolDeclaration = symbol.declarations && find(symbol.declarations, (declaration) => declaration === (location.kind === 137 /* ConstructorKeyword */ ? functionDeclaration.parent : functionDeclaration));
if (locationIsSymbolDeclaration) {
const allSignatures = functionDeclaration.kind === 175 /* Constructor */ ? type.getNonNullableType().getConstructSignatures() : type.getNonNullableType().getCallSignatures();
if (!typeChecker.isImplementationOfOverload(functionDeclaration)) {
signature = typeChecker.getSignatureFromDeclaration(functionDeclaration);
} else {
signature = allSignatures[0];
}
if (functionDeclaration.kind === 175 /* Constructor */) {
symbolKind = "constructor" /* constructorImplementationElement */;
addPrefixForAnyFunctionOrVar(type.symbol, symbolKind);
} else {
addPrefixForAnyFunctionOrVar(functionDeclaration.kind === 178 /* CallSignature */ && !(type.symbol.flags & 2048 /* TypeLiteral */ || type.symbol.flags & 4096 /* ObjectLiteral */) ? type.symbol : symbol, symbolKind);
}
if (signature) {
addSignatureDisplayParts(signature, allSignatures);
}
hasAddedSymbolInfo = true;
hasMultipleSignatures = allSignatures.length > 1;
}
}
}
if (symbolFlags & 32 /* Class */ && !hasAddedSymbolInfo && !isThisExpression) {
addAliasPrefixIfNecessary();
if (getDeclarationOfKind(symbol, 230 /* ClassExpression */)) {
pushSymbolKind("local class" /* localClassElement */);
} else {
displayParts.push(keywordPart(86 /* ClassKeyword */));
}
displayParts.push(spacePart());
addFullSymbolName(symbol);
writeTypeParametersOfSymbol(symbol, sourceFile);
}
if (symbolFlags & 64 /* Interface */ && semanticMeaning & 2 /* Type */) {
prefixNextMeaning();
displayParts.push(keywordPart(120 /* InterfaceKeyword */));
displayParts.push(spacePart());
addFullSymbolName(symbol);
writeTypeParametersOfSymbol(symbol, sourceFile);
}
if (symbolFlags & 524288 /* TypeAlias */ && semanticMeaning & 2 /* Type */) {
prefixNextMeaning();
displayParts.push(keywordPart(156 /* TypeKeyword */));
displayParts.push(spacePart());
addFullSymbolName(symbol);
writeTypeParametersOfSymbol(symbol, sourceFile);
displayParts.push(spacePart());
displayParts.push(operatorPart(64 /* EqualsToken */));
displayParts.push(spacePart());
addRange(displayParts, typeToDisplayParts(typeChecker, location.parent && isConstTypeReference(location.parent) ? typeChecker.getTypeAtLocation(location.parent) : typeChecker.getDeclaredTypeOfSymbol(symbol), enclosingDeclaration, 8388608 /* InTypeAlias */));
}
if (symbolFlags & 384 /* Enum */) {
prefixNextMeaning();
if (some(symbol.declarations, (d) => isEnumDeclaration(d) && isEnumConst(d))) {
displayParts.push(keywordPart(87 /* ConstKeyword */));
displayParts.push(spacePart());
}
displayParts.push(keywordPart(94 /* EnumKeyword */));
displayParts.push(spacePart());
addFullSymbolName(symbol);
}
if (symbolFlags & 1536 /* Module */ && !isThisExpression) {
prefixNextMeaning();
const declaration = getDeclarationOfKind(symbol, 266 /* ModuleDeclaration */);
const isNamespace = declaration && declaration.name && declaration.name.kind === 80 /* Identifier */;
displayParts.push(keywordPart(isNamespace ? 145 /* NamespaceKeyword */ : 144 /* ModuleKeyword */));
displayParts.push(spacePart());
addFullSymbolName(symbol);
}
if (symbolFlags & 262144 /* TypeParameter */ && semanticMeaning & 2 /* Type */) {
prefixNextMeaning();
displayParts.push(punctuationPart(21 /* OpenParenToken */));
displayParts.push(textPart("type parameter"));
displayParts.push(punctuationPart(22 /* CloseParenToken */));
displayParts.push(spacePart());
addFullSymbolName(symbol);
if (symbol.parent) {
addInPrefix();
addFullSymbolName(symbol.parent, enclosingDeclaration);
writeTypeParametersOfSymbol(symbol.parent, enclosingDeclaration);
} else {
const decl = getDeclarationOfKind(symbol, 167 /* TypeParameter */);
if (decl === void 0)
return Debug.fail();
const declaration = decl.parent;
if (declaration) {
if (isFunctionLike(declaration)) {
addInPrefix();
const signature = typeChecker.getSignatureFromDeclaration(declaration);
if (declaration.kind === 179 /* ConstructSignature */) {
displayParts.push(keywordPart(105 /* NewKeyword */));
displayParts.push(spacePart());
} else if (declaration.kind !== 178 /* CallSignature */ && declaration.name) {
addFullSymbolName(declaration.symbol);
}
addRange(displayParts, signatureToDisplayParts(typeChecker, signature, sourceFile, 32 /* WriteTypeArgumentsOfSignature */));
} else if (isTypeAliasDeclaration(declaration)) {
addInPrefix();
displayParts.push(keywordPart(156 /* TypeKeyword */));
displayParts.push(spacePart());
addFullSymbolName(declaration.symbol);
writeTypeParametersOfSymbol(declaration.symbol, sourceFile);
}
}
}
}
if (symbolFlags & 8 /* EnumMember */) {
symbolKind = "enum member" /* enumMemberElement */;
addPrefixForAnyFunctionOrVar(symbol, "enum member");
const declaration = (_a = symbol.declarations) == null ? void 0 : _a[0];
if ((declaration == null ? void 0 : declaration.kind) === 305 /* EnumMember */) {
const constantValue = typeChecker.getConstantValue(declaration);
if (constantValue !== void 0) {
displayParts.push(spacePart());
displayParts.push(operatorPart(64 /* EqualsToken */));
displayParts.push(spacePart());
displayParts.push(displayPart(
getTextOfConstantValue(constantValue),
typeof constantValue === "number" ? 7 /* numericLiteral */ : 8 /* stringLiteral */
));
}
}
}
if (symbol.flags & 2097152 /* Alias */) {
prefixNextMeaning();
if (!hasAddedSymbolInfo || documentation.length === 0 && tags.length === 0) {
const resolvedSymbol = typeChecker.getAliasedSymbol(symbol);
if (resolvedSymbol !== symbol && resolvedSymbol.declarations && resolvedSymbol.declarations.length > 0) {
const resolvedNode = resolvedSymbol.declarations[0];
const declarationName = getNameOfDeclaration(resolvedNode);
if (declarationName && !hasAddedSymbolInfo) {
const isExternalModuleDeclaration = isModuleWithStringLiteralName(resolvedNode) && hasSyntacticModifier(resolvedNode, 2 /* Ambient */);
const shouldUseAliasName = symbol.name !== "default" && !isExternalModuleDeclaration;
const resolvedInfo = getSymbolDisplayPartsDocumentationAndSymbolKind(
typeChecker,
resolvedSymbol,
getSourceFileOfNode(resolvedNode),
resolvedNode,
declarationName,
semanticMeaning,
shouldUseAliasName ? symbol : resolvedSymbol
);
displayParts.push(...resolvedInfo.displayParts);
displayParts.push(lineBreakPart());
documentationFromAlias = resolvedInfo.documentation;
tagsFromAlias = resolvedInfo.tags;
} else {
documentationFromAlias = resolvedSymbol.getContextualDocumentationComment(resolvedNode, typeChecker);
tagsFromAlias = resolvedSymbol.getJsDocTags(typeChecker);
}
}
}
if (symbol.declarations) {
switch (symbol.declarations[0].kind) {
case 269 /* NamespaceExportDeclaration */:
displayParts.push(keywordPart(95 /* ExportKeyword */));
displayParts.push(spacePart());
displayParts.push(keywordPart(145 /* NamespaceKeyword */));
break;
case 276 /* ExportAssignment */:
displayParts.push(keywordPart(95 /* ExportKeyword */));
displayParts.push(spacePart());
displayParts.push(keywordPart(symbol.declarations[0].isExportEquals ? 64 /* EqualsToken */ : 90 /* DefaultKeyword */));
break;
case 280 /* ExportSpecifier */:
displayParts.push(keywordPart(95 /* ExportKeyword */));
break;
default:
displayParts.push(keywordPart(102 /* ImportKeyword */));
}
}
displayParts.push(spacePart());
addFullSymbolName(symbol);
forEach(symbol.declarations, (declaration) => {
if (declaration.kind === 270 /* ImportEqualsDeclaration */) {
const importEqualsDeclaration = declaration;
if (isExternalModuleImportEqualsDeclaration(importEqualsDeclaration)) {
displayParts.push(spacePart());
displayParts.push(operatorPart(64 /* EqualsToken */));
displayParts.push(spacePart());
displayParts.push(keywordPart(149 /* RequireKeyword */));
displayParts.push(punctuationPart(21 /* OpenParenToken */));
displayParts.push(displayPart(getTextOfNode(getExternalModuleImportEqualsDeclarationExpression(importEqualsDeclaration)), 8 /* stringLiteral */));
displayParts.push(punctuationPart(22 /* CloseParenToken */));
} else {
const internalAliasSymbol = typeChecker.getSymbolAtLocation(importEqualsDeclaration.moduleReference);
if (internalAliasSymbol) {
displayParts.push(spacePart());
displayParts.push(operatorPart(64 /* EqualsToken */));
displayParts.push(spacePart());
addFullSymbolName(internalAliasSymbol, enclosingDeclaration);
}
}
return true;
}
});
}
if (!hasAddedSymbolInfo) {
if (symbolKind !== "" /* unknown */) {
if (type) {
if (isThisExpression) {
prefixNextMeaning();
displayParts.push(keywordPart(110 /* ThisKeyword */));
} else {
addPrefixForAnyFunctionOrVar(symbol, symbolKind);
}
if (symbolKind === "property" /* memberVariableElement */ || symbolKind === "accessor" /* memberAccessorVariableElement */ || symbolKind === "getter" /* memberGetAccessorElement */ || symbolKind === "setter" /* memberSetAccessorElement */ || symbolKind === "JSX attribute" /* jsxAttribute */ || symbolFlags & 3 /* Variable */ || symbolKind === "local var" /* localVariableElement */ || symbolKind === "index" /* indexSignatureElement */ || isThisExpression) {
displayParts.push(punctuationPart(59 /* ColonToken */));
displayParts.push(spacePart());
if (type.symbol && type.symbol.flags & 262144 /* TypeParameter */ && symbolKind !== "index" /* indexSignatureElement */) {
const typeParameterParts = mapToDisplayParts((writer) => {
const param = typeChecker.typeParameterToDeclaration(type, enclosingDeclaration, symbolDisplayNodeBuilderFlags);
getPrinter().writeNode(4 /* Unspecified */, param, getSourceFileOfNode(getParseTreeNode(enclosingDeclaration)), writer);
});
addRange(displayParts, typeParameterParts);
} else {
addRange(displayParts, typeToDisplayParts(typeChecker, type, enclosingDeclaration));
}
if (isTransientSymbol(symbol) && symbol.links.target && isTransientSymbol(symbol.links.target) && symbol.links.target.links.tupleLabelDeclaration) {
const labelDecl = symbol.links.target.links.tupleLabelDeclaration;
Debug.assertNode(labelDecl.name, isIdentifier);
displayParts.push(spacePart());
displayParts.push(punctuationPart(21 /* OpenParenToken */));
displayParts.push(textPart(idText(labelDecl.name)));
displayParts.push(punctuationPart(22 /* CloseParenToken */));
}
} else if (symbolFlags & 16 /* Function */ || symbolFlags & 8192 /* Method */ || symbolFlags & 16384 /* Constructor */ || symbolFlags & 131072 /* Signature */ || symbolFlags & 98304 /* Accessor */ || symbolKind === "method" /* memberFunctionElement */) {
const allSignatures = type.getNonNullableType().getCallSignatures();
if (allSignatures.length) {
addSignatureDisplayParts(allSignatures[0], allSignatures);
hasMultipleSignatures = allSignatures.length > 1;
}
}
}
} else {
symbolKind = getSymbolKind(typeChecker, symbol, location);
}
}
if (documentation.length === 0 && !hasMultipleSignatures) {
documentation = symbol.getContextualDocumentationComment(enclosingDeclaration, typeChecker);
}
if (documentation.length === 0 && symbolFlags & 4 /* Property */) {
if (symbol.parent && symbol.declarations && forEach(symbol.parent.declarations, (declaration) => declaration.kind === 311 /* SourceFile */)) {
for (const declaration of symbol.declarations) {
if (!declaration.parent || declaration.parent.kind !== 225 /* BinaryExpression */) {
continue;
}
const rhsSymbol = typeChecker.getSymbolAtLocation(declaration.parent.right);
if (!rhsSymbol) {
continue;
}
documentation = rhsSymbol.getDocumentationComment(typeChecker);
tags = rhsSymbol.getJsDocTags(typeChecker);
if (documentation.length > 0) {
break;
}
}
}
}
if (documentation.length === 0 && isIdentifier(location) && symbol.valueDeclaration && isBindingElement(symbol.valueDeclaration)) {
const declaration = symbol.valueDeclaration;
const parent2 = declaration.parent;
if (isIdentifier(declaration.name) && isObjectBindingPattern(parent2)) {
const name = getTextOfIdentifierOrLiteral(declaration.name);
const objectType = typeChecker.getTypeAtLocation(parent2);
documentation = firstDefined(objectType.isUnion() ? objectType.types : [objectType], (t) => {
const prop = t.getProperty(name);
return prop ? prop.getDocumentationComment(typeChecker) : void 0;
}) || emptyArray;
}
}
if (tags.length === 0 && !hasMultipleSignatures) {
tags = symbol.getContextualJsDocTags(enclosingDeclaration, typeChecker);
}
if (documentation.length === 0 && documentationFromAlias) {
documentation = documentationFromAlias;
}
if (tags.length === 0 && tagsFromAlias) {
tags = tagsFromAlias;
}
return { displayParts, documentation, symbolKind, tags: tags.length === 0 ? void 0 : tags };
function getPrinter() {
return createPrinterWithRemoveComments();
}
function prefixNextMeaning() {
if (displayParts.length) {
displayParts.push(lineBreakPart());
}
addAliasPrefixIfNecessary();
}
function addAliasPrefixIfNecessary() {
if (alias) {
pushSymbolKind("alias" /* alias */);
displayParts.push(spacePart());
}
}
function addInPrefix() {
displayParts.push(spacePart());
displayParts.push(keywordPart(103 /* InKeyword */));
displayParts.push(spacePart());
}
function addFullSymbolName(symbolToDisplay, enclosingDeclaration2) {
let indexInfos;
if (alias && symbolToDisplay === symbol) {
symbolToDisplay = alias;
}
if (symbolKind === "index" /* indexSignatureElement */) {
indexInfos = typeChecker.getIndexInfosOfIndexSymbol(symbolToDisplay);
}
let fullSymbolDisplayParts = [];
if (symbolToDisplay.flags & 131072 /* Signature */ && indexInfos) {
if (symbolToDisplay.parent) {
fullSymbolDisplayParts = symbolToDisplayParts(typeChecker, symbolToDisplay.parent);
}
fullSymbolDisplayParts.push(punctuationPart(23 /* OpenBracketToken */));
indexInfos.forEach((info, i) => {
fullSymbolDisplayParts.push(...typeToDisplayParts(typeChecker, info.keyType));
if (i !== indexInfos.length - 1) {
fullSymbolDisplayParts.push(spacePart());
fullSymbolDisplayParts.push(punctuationPart(52 /* BarToken */));
fullSymbolDisplayParts.push(spacePart());
}
});
fullSymbolDisplayParts.push(punctuationPart(24 /* CloseBracketToken */));
} else {
fullSymbolDisplayParts = symbolToDisplayParts(
typeChecker,
symbolToDisplay,
enclosingDeclaration2 || sourceFile,
/*meaning*/
void 0,
1 /* WriteTypeParametersOrArguments */ | 2 /* UseOnlyExternalAliasing */ | 4 /* AllowAnyNodeKind */
);
}
addRange(displayParts, fullSymbolDisplayParts);
if (symbol.flags & 16777216 /* Optional */) {
displayParts.push(punctuationPart(58 /* QuestionToken */));
}
}
function addPrefixForAnyFunctionOrVar(symbol2, symbolKind2) {
prefixNextMeaning();
if (symbolKind2) {
pushSymbolKind(symbolKind2);
if (symbol2 && !some(symbol2.declarations, (d) => isArrowFunction(d) || (isFunctionExpression(d) || isClassExpression(d)) && !d.name)) {
displayParts.push(spacePart());
addFullSymbolName(symbol2);
}
}
}
function pushSymbolKind(symbolKind2) {
switch (symbolKind2) {
case "var" /* variableElement */:
case "function" /* functionElement */:
case "let" /* letElement */:
case "const" /* constElement */:
case "constructor" /* constructorImplementationElement */:
displayParts.push(textOrKeywordPart(symbolKind2));
return;
default:
displayParts.push(punctuationPart(21 /* OpenParenToken */));
displayParts.push(textOrKeywordPart(symbolKind2));
displayParts.push(punctuationPart(22 /* CloseParenToken */));
return;
}
}
function addSignatureDisplayParts(signature, allSignatures, flags = 0 /* None */) {
addRange(displayParts, signatureToDisplayParts(typeChecker, signature, enclosingDeclaration, flags | 32 /* WriteTypeArgumentsOfSignature */));
if (allSignatures.length > 1) {
displayParts.push(spacePart());
displayParts.push(punctuationPart(21 /* OpenParenToken */));
displayParts.push(operatorPart(40 /* PlusToken */));
displayParts.push(displayPart((allSignatures.length - 1).toString(), 7 /* numericLiteral */));
displayParts.push(spacePart());
displayParts.push(textPart(allSignatures.length === 2 ? "overload" : "overloads"));
displayParts.push(punctuationPart(22 /* CloseParenToken */));
}
documentation = signature.getDocumentationComment(typeChecker);
tags = signature.getJsDocTags();
if (allSignatures.length > 1 && documentation.length === 0 && tags.length === 0) {
documentation = allSignatures[0].getDocumentationComment(typeChecker);
tags = allSignatures[0].getJsDocTags().filter((tag) => tag.name !== "deprecated");
}
}
function writeTypeParametersOfSymbol(symbol2, enclosingDeclaration2) {
const typeParameterParts = mapToDisplayParts((writer) => {
const params = typeChecker.symbolToTypeParameterDeclarations(symbol2, enclosingDeclaration2, symbolDisplayNodeBuilderFlags);
getPrinter().writeList(53776 /* TypeParameters */, params, getSourceFileOfNode(getParseTreeNode(enclosingDeclaration2)), writer);
});
addRange(displayParts, typeParameterParts);
}
}
function isLocalVariableOrFunction(symbol) {
if (symbol.parent) {
return false;
}
return forEach(symbol.declarations, (declaration) => {
if (declaration.kind === 217 /* FunctionExpression */) {
return true;
}
if (declaration.kind !== 259 /* VariableDeclaration */ && declaration.kind !== 261 /* FunctionDeclaration */) {
return false;
}
for (let parent2 = declaration.parent; !isFunctionBlock(parent2); parent2 = parent2.parent) {
if (parent2.kind === 311 /* SourceFile */ || parent2.kind === 267 /* ModuleBlock */) {
return false;
}
}
return true;
});
}
// src/services/_namespaces/ts.textChanges.ts
var ts_textChanges_exports = {};
__export(ts_textChanges_exports, {
ChangeTracker: () => ChangeTracker,
LeadingTriviaOption: () => LeadingTriviaOption,
TrailingTriviaOption: () => TrailingTriviaOption,
applyChanges: () => applyChanges,
assignPositionsToNode: () => assignPositionsToNode,
createWriter: () => createWriter,
deleteNode: () => deleteNode,
isThisTypeAnnotatable: () => isThisTypeAnnotatable,
isValidLocationToAddComment: () => isValidLocationToAddComment
});
// src/services/textChanges.ts
function getPos2(n) {
const result = n.__pos;
Debug.assert(typeof result === "number");
return result;
}
function setPos(n, pos) {
Debug.assert(typeof pos === "number");
n.__pos = pos;
}
function getEnd(n) {
const result = n.__end;
Debug.assert(typeof result === "number");
return result;
}
function setEnd(n, end) {
Debug.assert(typeof end === "number");
n.__end = end;
}
var LeadingTriviaOption = /* @__PURE__ */ ((LeadingTriviaOption2) => {
LeadingTriviaOption2[LeadingTriviaOption2["Exclude"] = 0] = "Exclude";
LeadingTriviaOption2[LeadingTriviaOption2["IncludeAll"] = 1] = "IncludeAll";
LeadingTriviaOption2[LeadingTriviaOption2["JSDoc"] = 2] = "JSDoc";
LeadingTriviaOption2[LeadingTriviaOption2["StartLine"] = 3] = "StartLine";
return LeadingTriviaOption2;
})(LeadingTriviaOption || {});
var TrailingTriviaOption = /* @__PURE__ */ ((TrailingTriviaOption2) => {
TrailingTriviaOption2[TrailingTriviaOption2["Exclude"] = 0] = "Exclude";
TrailingTriviaOption2[TrailingTriviaOption2["ExcludeWhitespace"] = 1] = "ExcludeWhitespace";
TrailingTriviaOption2[TrailingTriviaOption2["Include"] = 2] = "Include";
return TrailingTriviaOption2;
})(TrailingTriviaOption || {});
function skipWhitespacesAndLineBreaks(text, start2) {
return skipTrivia(
text,
start2,
/*stopAfterLineBreak*/
false,
/*stopAtComments*/
true
);
}
function hasCommentsBeforeLineBreak(text, start2) {
let i = start2;
while (i < text.length) {
const ch = text.charCodeAt(i);
if (isWhiteSpaceSingleLine(ch)) {
i++;
continue;
}
return ch === 47 /* slash */;
}
return false;
}
var useNonAdjustedPositions = {
leadingTriviaOption: 0 /* Exclude */,
trailingTriviaOption: 0 /* Exclude */
};
function getAdjustedRange(sourceFile, startNode2, endNode2, options) {
return { pos: getAdjustedStartPosition(sourceFile, startNode2, options), end: getAdjustedEndPosition(sourceFile, endNode2, options) };
}
function getAdjustedStartPosition(sourceFile, node, options, hasTrailingComment = false) {
var _a, _b;
const { leadingTriviaOption } = options;
if (leadingTriviaOption === 0 /* Exclude */) {
return node.getStart(sourceFile);
}
if (leadingTriviaOption === 3 /* StartLine */) {
const startPos = node.getStart(sourceFile);
const pos = getLineStartPositionForPosition(startPos, sourceFile);
return rangeContainsPosition(node, pos) ? pos : startPos;
}
if (leadingTriviaOption === 2 /* JSDoc */) {
const JSDocComments = getJSDocCommentRanges(node, sourceFile.text);
if (JSDocComments == null ? void 0 : JSDocComments.length) {
return getLineStartPositionForPosition(JSDocComments[0].pos, sourceFile);
}
}
const fullStart = node.getFullStart();
const start2 = node.getStart(sourceFile);
if (fullStart === start2) {
return start2;
}
const fullStartLine = getLineStartPositionForPosition(fullStart, sourceFile);
const startLine = getLineStartPositionForPosition(start2, sourceFile);
if (startLine === fullStartLine) {
return leadingTriviaOption === 1 /* IncludeAll */ ? fullStart : start2;
}
if (hasTrailingComment) {
const comment = ((_a = getLeadingCommentRanges(sourceFile.text, fullStart)) == null ? void 0 : _a[0]) || ((_b = getTrailingCommentRanges(sourceFile.text, fullStart)) == null ? void 0 : _b[0]);
if (comment) {
return skipTrivia(
sourceFile.text,
comment.end,
/*stopAfterLineBreak*/
true,
/*stopAtComments*/
true
);
}
}
const nextLineStart = fullStart > 0 ? 1 : 0;
let adjustedStartPosition = getStartPositionOfLine(getLineOfLocalPosition(sourceFile, fullStartLine) + nextLineStart, sourceFile);
adjustedStartPosition = skipWhitespacesAndLineBreaks(sourceFile.text, adjustedStartPosition);
return getStartPositionOfLine(getLineOfLocalPosition(sourceFile, adjustedStartPosition), sourceFile);
}
function getEndPositionOfMultilineTrailingComment(sourceFile, node, options) {
const { end } = node;
const { trailingTriviaOption } = options;
if (trailingTriviaOption === 2 /* Include */) {
const comments = getTrailingCommentRanges(sourceFile.text, end);
if (comments) {
const nodeEndLine = getLineOfLocalPosition(sourceFile, node.end);
for (const comment of comments) {
if (comment.kind === 2 /* SingleLineCommentTrivia */ || getLineOfLocalPosition(sourceFile, comment.pos) > nodeEndLine) {
break;
}
const commentEndLine = getLineOfLocalPosition(sourceFile, comment.end);
if (commentEndLine > nodeEndLine) {
return skipTrivia(
sourceFile.text,
comment.end,
/*stopAfterLineBreak*/
true,
/*stopAtComments*/
true
);
}
}
}
}
return void 0;
}
function getAdjustedEndPosition(sourceFile, node, options) {
var _a;
const { end } = node;
const { trailingTriviaOption } = options;
if (trailingTriviaOption === 0 /* Exclude */) {
return end;
}
if (trailingTriviaOption === 1 /* ExcludeWhitespace */) {
const comments = concatenate(getTrailingCommentRanges(sourceFile.text, end), getLeadingCommentRanges(sourceFile.text, end));
const realEnd = (_a = comments == null ? void 0 : comments[comments.length - 1]) == null ? void 0 : _a.end;
if (realEnd) {
return realEnd;
}
return end;
}
const multilineEndPosition = getEndPositionOfMultilineTrailingComment(sourceFile, node, options);
if (multilineEndPosition) {
return multilineEndPosition;
}
const newEnd = skipTrivia(
sourceFile.text,
end,
/*stopAfterLineBreak*/
true
);
return newEnd !== end && (trailingTriviaOption === 2 /* Include */ || isLineBreak(sourceFile.text.charCodeAt(newEnd - 1))) ? newEnd : end;
}
function isSeparator(node, candidate) {
return !!candidate && !!node.parent && (candidate.kind === 28 /* CommaToken */ || candidate.kind === 27 /* SemicolonToken */ && node.parent.kind === 209 /* ObjectLiteralExpression */);
}
function isThisTypeAnnotatable(containingFunction) {
return isFunctionExpression(containingFunction) || isFunctionDeclaration(containingFunction);
}
var ChangeTracker = class {
/** Public for tests only. Other callers should use `ChangeTracker.with`. */
constructor(newLineCharacter, formatContext) {
this.newLineCharacter = newLineCharacter;
this.formatContext = formatContext;
this.changes = [];
this.classesWithNodesInsertedAtStart = /* @__PURE__ */ new Map();
// Set implemented as Map
this.deletedNodes = [];
}
static fromContext(context) {
return new ChangeTracker(getNewLineOrDefaultFromHost(context.host, context.formatContext.options), context.formatContext);
}
static with(context, cb) {
const tracker = ChangeTracker.fromContext(context);
cb(tracker);
return tracker.getChanges();
}
pushRaw(sourceFile, change) {
Debug.assertEqual(sourceFile.fileName, change.fileName);
for (const c of change.textChanges) {
this.changes.push({
kind: 3 /* Text */,
sourceFile,
text: c.newText,
range: createTextRangeFromSpan(c.span)
});
}
}
deleteRange(sourceFile, range) {
this.changes.push({ kind: 0 /* Remove */, sourceFile, range });
}
delete(sourceFile, node) {
this.deletedNodes.push({ sourceFile, node });
}
/** Stop! Consider using `delete` instead, which has logic for deleting nodes from delimited lists. */
deleteNode(sourceFile, node, options = { leadingTriviaOption: 1 /* IncludeAll */ }) {
this.deleteRange(sourceFile, getAdjustedRange(sourceFile, node, node, options));
}
deleteNodes(sourceFile, nodes, options = { leadingTriviaOption: 1 /* IncludeAll */ }, hasTrailingComment) {
for (const node of nodes) {
const pos = getAdjustedStartPosition(sourceFile, node, options, hasTrailingComment);
const end = getAdjustedEndPosition(sourceFile, node, options);
this.deleteRange(sourceFile, { pos, end });
hasTrailingComment = !!getEndPositionOfMultilineTrailingComment(sourceFile, node, options);
}
}
deleteModifier(sourceFile, modifier) {
this.deleteRange(sourceFile, { pos: modifier.getStart(sourceFile), end: skipTrivia(
sourceFile.text,
modifier.end,
/*stopAfterLineBreak*/
true
) });
}
deleteNodeRange(sourceFile, startNode2, endNode2, options = { leadingTriviaOption: 1 /* IncludeAll */ }) {
const startPosition = getAdjustedStartPosition(sourceFile, startNode2, options);
const endPosition = getAdjustedEndPosition(sourceFile, endNode2, options);
this.deleteRange(sourceFile, { pos: startPosition, end: endPosition });
}
deleteNodeRangeExcludingEnd(sourceFile, startNode2, afterEndNode, options = { leadingTriviaOption: 1 /* IncludeAll */ }) {
const startPosition = getAdjustedStartPosition(sourceFile, startNode2, options);
const endPosition = afterEndNode === void 0 ? sourceFile.text.length : getAdjustedStartPosition(sourceFile, afterEndNode, options);
this.deleteRange(sourceFile, { pos: startPosition, end: endPosition });
}
replaceRange(sourceFile, range, newNode, options = {}) {
this.changes.push({ kind: 1 /* ReplaceWithSingleNode */, sourceFile, range, options, node: newNode });
}
replaceNode(sourceFile, oldNode, newNode, options = useNonAdjustedPositions) {
this.replaceRange(sourceFile, getAdjustedRange(sourceFile, oldNode, oldNode, options), newNode, options);
}
replaceNodeRange(sourceFile, startNode2, endNode2, newNode, options = useNonAdjustedPositions) {
this.replaceRange(sourceFile, getAdjustedRange(sourceFile, startNode2, endNode2, options), newNode, options);
}
replaceRangeWithNodes(sourceFile, range, newNodes, options = {}) {
this.changes.push({ kind: 2 /* ReplaceWithMultipleNodes */, sourceFile, range, options, nodes: newNodes });
}
replaceNodeWithNodes(sourceFile, oldNode, newNodes, options = useNonAdjustedPositions) {
this.replaceRangeWithNodes(sourceFile, getAdjustedRange(sourceFile, oldNode, oldNode, options), newNodes, options);
}
replaceNodeWithText(sourceFile, oldNode, text) {
this.replaceRangeWithText(sourceFile, getAdjustedRange(sourceFile, oldNode, oldNode, useNonAdjustedPositions), text);
}
replaceNodeRangeWithNodes(sourceFile, startNode2, endNode2, newNodes, options = useNonAdjustedPositions) {
this.replaceRangeWithNodes(sourceFile, getAdjustedRange(sourceFile, startNode2, endNode2, options), newNodes, options);
}
nodeHasTrailingComment(sourceFile, oldNode, configurableEnd = useNonAdjustedPositions) {
return !!getEndPositionOfMultilineTrailingComment(sourceFile, oldNode, configurableEnd);
}
nextCommaToken(sourceFile, node) {
const next = findNextToken(node, node.parent, sourceFile);
return next && next.kind === 28 /* CommaToken */ ? next : void 0;
}
replacePropertyAssignment(sourceFile, oldNode, newNode) {
const suffix = this.nextCommaToken(sourceFile, oldNode) ? "" : "," + this.newLineCharacter;
this.replaceNode(sourceFile, oldNode, newNode, { suffix });
}
insertNodeAt(sourceFile, pos, newNode, options = {}) {
this.replaceRange(sourceFile, createRange(pos), newNode, options);
}
insertNodesAt(sourceFile, pos, newNodes, options = {}) {
this.replaceRangeWithNodes(sourceFile, createRange(pos), newNodes, options);
}
insertNodeAtTopOfFile(sourceFile, newNode, blankLineBetween) {
this.insertAtTopOfFile(sourceFile, newNode, blankLineBetween);
}
insertNodesAtTopOfFile(sourceFile, newNodes, blankLineBetween) {
this.insertAtTopOfFile(sourceFile, newNodes, blankLineBetween);
}
insertAtTopOfFile(sourceFile, insert, blankLineBetween) {
const pos = getInsertionPositionAtSourceFileTop(sourceFile);
const options = {
prefix: pos === 0 ? void 0 : this.newLineCharacter,
suffix: (isLineBreak(sourceFile.text.charCodeAt(pos)) ? "" : this.newLineCharacter) + (blankLineBetween ? this.newLineCharacter : "")
};
if (isArray(insert)) {
this.insertNodesAt(sourceFile, pos, insert, options);
} else {
this.insertNodeAt(sourceFile, pos, insert, options);
}
}
insertNodesAtEndOfFile(sourceFile, newNodes, blankLineBetween) {
this.insertAtEndOfFile(sourceFile, newNodes, blankLineBetween);
}
insertAtEndOfFile(sourceFile, insert, blankLineBetween) {
const pos = sourceFile.end + 1;
const options = {
prefix: this.newLineCharacter,
suffix: this.newLineCharacter + (blankLineBetween ? this.newLineCharacter : "")
};
this.insertNodesAt(sourceFile, pos, insert, options);
}
insertStatementsInNewFile(fileName, statements, oldFile) {
if (!this.newFileChanges) {
this.newFileChanges = createMultiMap();
}
this.newFileChanges.add(fileName, { oldFile, statements });
}
insertFirstParameter(sourceFile, parameters, newParam) {
const p0 = firstOrUndefined(parameters);
if (p0) {
this.insertNodeBefore(sourceFile, p0, newParam);
} else {
this.insertNodeAt(sourceFile, parameters.pos, newParam);
}
}
insertNodeBefore(sourceFile, before, newNode, blankLineBetween = false, options = {}) {
this.insertNodeAt(sourceFile, getAdjustedStartPosition(sourceFile, before, options), newNode, this.getOptionsForInsertNodeBefore(before, newNode, blankLineBetween));
}
insertModifierAt(sourceFile, pos, modifier, options = {}) {
this.insertNodeAt(sourceFile, pos, factory.createToken(modifier), options);
}
insertModifierBefore(sourceFile, modifier, before) {
return this.insertModifierAt(sourceFile, before.getStart(sourceFile), modifier, { suffix: " " });
}
insertCommentBeforeLine(sourceFile, lineNumber, position, commentText) {
const lineStartPosition = getStartPositionOfLine(lineNumber, sourceFile);
const startPosition = getFirstNonSpaceCharacterPosition(sourceFile.text, lineStartPosition);
const insertAtLineStart = isValidLocationToAddComment(sourceFile, startPosition);
const token = getTouchingToken(sourceFile, insertAtLineStart ? startPosition : position);
const indent3 = sourceFile.text.slice(lineStartPosition, startPosition);
const text = `${insertAtLineStart ? "" : this.newLineCharacter}//${commentText}${this.newLineCharacter}${indent3}`;
this.insertText(sourceFile, token.getStart(sourceFile), text);
}
insertJsdocCommentBefore(sourceFile, node, tag) {
const fnStart = node.getStart(sourceFile);
if (node.jsDoc) {
for (const jsdoc of node.jsDoc) {
this.deleteRange(sourceFile, {
pos: getLineStartPositionForPosition(jsdoc.getStart(sourceFile), sourceFile),
end: getAdjustedEndPosition(
sourceFile,
jsdoc,
/*options*/
{}
)
});
}
}
const startPosition = getPrecedingNonSpaceCharacterPosition(sourceFile.text, fnStart - 1);
const indent3 = sourceFile.text.slice(startPosition, fnStart);
this.insertNodeAt(sourceFile, fnStart, tag, { suffix: this.newLineCharacter + indent3 });
}
createJSDocText(sourceFile, node) {
const comments = flatMap(node.jsDoc, (jsDoc2) => isString(jsDoc2.comment) ? factory.createJSDocText(jsDoc2.comment) : jsDoc2.comment);
const jsDoc = singleOrUndefined(node.jsDoc);
return jsDoc && positionsAreOnSameLine(jsDoc.pos, jsDoc.end, sourceFile) && length(comments) === 0 ? void 0 : factory.createNodeArray(intersperse(comments, factory.createJSDocText("\n")));
}
replaceJSDocComment(sourceFile, node, tags) {
this.insertJsdocCommentBefore(sourceFile, updateJSDocHost(node), factory.createJSDocComment(this.createJSDocText(sourceFile, node), factory.createNodeArray(tags)));
}
addJSDocTags(sourceFile, parent2, newTags) {
const oldTags = flatMapToMutable(parent2.jsDoc, (j) => j.tags);
const unmergedNewTags = newTags.filter((newTag) => !oldTags.some((tag, i) => {
const merged = tryMergeJsdocTags(tag, newTag);
if (merged)
oldTags[i] = merged;
return !!merged;
}));
this.replaceJSDocComment(sourceFile, parent2, [...oldTags, ...unmergedNewTags]);
}
filterJSDocTags(sourceFile, parent2, predicate) {
this.replaceJSDocComment(sourceFile, parent2, filter(flatMapToMutable(parent2.jsDoc, (j) => j.tags), predicate));
}
replaceRangeWithText(sourceFile, range, text) {
this.changes.push({ kind: 3 /* Text */, sourceFile, range, text });
}
insertText(sourceFile, pos, text) {
this.replaceRangeWithText(sourceFile, createRange(pos), text);
}
/** Prefer this over replacing a node with another that has a type annotation, as it avoids reformatting the other parts of the node. */
tryInsertTypeAnnotation(sourceFile, node, type) {
let endNode2;
if (isFunctionLike(node)) {
endNode2 = findChildOfKind(node, 22 /* CloseParenToken */, sourceFile);
if (!endNode2) {
if (!isArrowFunction(node))
return false;
endNode2 = first(node.parameters);
}
} else {
endNode2 = (node.kind === 259 /* VariableDeclaration */ ? node.exclamationToken : node.questionToken) ?? node.name;
}
this.insertNodeAt(sourceFile, endNode2.end, type, { prefix: ": " });
return true;
}
tryInsertThisTypeAnnotation(sourceFile, node, type) {
const start2 = findChildOfKind(node, 21 /* OpenParenToken */, sourceFile).getStart(sourceFile) + 1;
const suffix = node.parameters.length ? ", " : "";
this.insertNodeAt(sourceFile, start2, type, { prefix: "this: ", suffix });
}
insertTypeParameters(sourceFile, node, typeParameters) {
const start2 = (findChildOfKind(node, 21 /* OpenParenToken */, sourceFile) || first(node.parameters)).getStart(sourceFile);
this.insertNodesAt(sourceFile, start2, typeParameters, { prefix: "<", suffix: ">", joiner: ", " });
}
getOptionsForInsertNodeBefore(before, inserted, blankLineBetween) {
if (isStatement(before) || isClassElement(before)) {
return { suffix: blankLineBetween ? this.newLineCharacter + this.newLineCharacter : this.newLineCharacter };
} else if (isVariableDeclaration(before)) {
return { suffix: ", " };
} else if (isParameter(before)) {
return isParameter(inserted) ? { suffix: ", " } : {};
} else if (isStringLiteral(before) && isImportDeclaration(before.parent) || isNamedImports(before)) {
return { suffix: ", " };
} else if (isImportSpecifier(before)) {
return { suffix: "," + (blankLineBetween ? this.newLineCharacter : " ") };
}
return Debug.failBadSyntaxKind(before);
}
insertNodeAtConstructorStart(sourceFile, ctr, newStatement) {
const firstStatement = firstOrUndefined(ctr.body.statements);
if (!firstStatement || !ctr.body.multiLine) {
this.replaceConstructorBody(sourceFile, ctr, [newStatement, ...ctr.body.statements]);
} else {
this.insertNodeBefore(sourceFile, firstStatement, newStatement);
}
}
insertNodeAtConstructorStartAfterSuperCall(sourceFile, ctr, newStatement) {
const superCallStatement = find(ctr.body.statements, (stmt) => isExpressionStatement(stmt) && isSuperCall(stmt.expression));
if (!superCallStatement || !ctr.body.multiLine) {
this.replaceConstructorBody(sourceFile, ctr, [...ctr.body.statements, newStatement]);
} else {
this.insertNodeAfter(sourceFile, superCallStatement, newStatement);
}
}
insertNodeAtConstructorEnd(sourceFile, ctr, newStatement) {
const lastStatement = lastOrUndefined(ctr.body.statements);
if (!lastStatement || !ctr.body.multiLine) {
this.replaceConstructorBody(sourceFile, ctr, [...ctr.body.statements, newStatement]);
} else {
this.insertNodeAfter(sourceFile, lastStatement, newStatement);
}
}
replaceConstructorBody(sourceFile, ctr, statements) {
this.replaceNode(sourceFile, ctr.body, factory.createBlock(
statements,
/*multiLine*/
true
));
}
insertNodeAtEndOfScope(sourceFile, scope, newNode) {
const pos = getAdjustedStartPosition(sourceFile, scope.getLastToken(), {});
this.insertNodeAt(sourceFile, pos, newNode, {
prefix: isLineBreak(sourceFile.text.charCodeAt(scope.getLastToken().pos)) ? this.newLineCharacter : this.newLineCharacter + this.newLineCharacter,
suffix: this.newLineCharacter
});
}
insertMemberAtStart(sourceFile, node, newElement) {
this.insertNodeAtStartWorker(sourceFile, node, newElement);
}
insertNodeAtObjectStart(sourceFile, obj, newElement) {
this.insertNodeAtStartWorker(sourceFile, obj, newElement);
}
insertNodeAtStartWorker(sourceFile, node, newElement) {
const indentation = this.guessIndentationFromExistingMembers(sourceFile, node) ?? this.computeIndentationForNewMember(sourceFile, node);
this.insertNodeAt(sourceFile, getMembersOrProperties(node).pos, newElement, this.getInsertNodeAtStartInsertOptions(sourceFile, node, indentation));
}
/**
* Tries to guess the indentation from the existing members of a class/interface/object. All members must be on
* new lines and must share the same indentation.
*/
guessIndentationFromExistingMembers(sourceFile, node) {
let indentation;
let lastRange = node;
for (const member of getMembersOrProperties(node)) {
if (rangeStartPositionsAreOnSameLine(lastRange, member, sourceFile)) {
return void 0;
}
const memberStart = member.getStart(sourceFile);
const memberIndentation = ts_formatting_exports.SmartIndenter.findFirstNonWhitespaceColumn(getLineStartPositionForPosition(memberStart, sourceFile), memberStart, sourceFile, this.formatContext.options);
if (indentation === void 0) {
indentation = memberIndentation;
} else if (memberIndentation !== indentation) {
return void 0;
}
lastRange = member;
}
return indentation;
}
computeIndentationForNewMember(sourceFile, node) {
const nodeStart = node.getStart(sourceFile);
return ts_formatting_exports.SmartIndenter.findFirstNonWhitespaceColumn(getLineStartPositionForPosition(nodeStart, sourceFile), nodeStart, sourceFile, this.formatContext.options) + (this.formatContext.options.indentSize ?? 4);
}
getInsertNodeAtStartInsertOptions(sourceFile, node, indentation) {
const members = getMembersOrProperties(node);
const isEmpty = members.length === 0;
const isFirstInsertion = addToSeen(this.classesWithNodesInsertedAtStart, getNodeId(node), { node, sourceFile });
const insertTrailingComma = isObjectLiteralExpression(node) && (!isJsonSourceFile(sourceFile) || !isEmpty);
const insertLeadingComma = isObjectLiteralExpression(node) && isJsonSourceFile(sourceFile) && isEmpty && !isFirstInsertion;
return {
indentation,
prefix: (insertLeadingComma ? "," : "") + this.newLineCharacter,
suffix: insertTrailingComma ? "," : isInterfaceDeclaration(node) && isEmpty ? ";" : ""
};
}
insertNodeAfterComma(sourceFile, after, newNode) {
const endPosition = this.insertNodeAfterWorker(sourceFile, this.nextCommaToken(sourceFile, after) || after, newNode);
this.insertNodeAt(sourceFile, endPosition, newNode, this.getInsertNodeAfterOptions(sourceFile, after));
}
insertNodeAfter(sourceFile, after, newNode) {
const endPosition = this.insertNodeAfterWorker(sourceFile, after, newNode);
this.insertNodeAt(sourceFile, endPosition, newNode, this.getInsertNodeAfterOptions(sourceFile, after));
}
insertNodeAtEndOfList(sourceFile, list, newNode) {
this.insertNodeAt(sourceFile, list.end, newNode, { prefix: ", " });
}
insertNodesAfter(sourceFile, after, newNodes) {
const endPosition = this.insertNodeAfterWorker(sourceFile, after, first(newNodes));
this.insertNodesAt(sourceFile, endPosition, newNodes, this.getInsertNodeAfterOptions(sourceFile, after));
}
insertNodeAfterWorker(sourceFile, after, newNode) {
if (needSemicolonBetween(after, newNode)) {
if (sourceFile.text.charCodeAt(after.end - 1) !== 59 /* semicolon */) {
this.replaceRange(sourceFile, createRange(after.end), factory.createToken(27 /* SemicolonToken */));
}
}
const endPosition = getAdjustedEndPosition(sourceFile, after, {});
return endPosition;
}
getInsertNodeAfterOptions(sourceFile, after) {
const options = this.getInsertNodeAfterOptionsWorker(after);
return {
...options,
prefix: after.end === sourceFile.end && isStatement(after) ? options.prefix ? `
${options.prefix}` : "\n" : options.prefix
};
}
getInsertNodeAfterOptionsWorker(node) {
switch (node.kind) {
case 262 /* ClassDeclaration */:
case 266 /* ModuleDeclaration */:
return { prefix: this.newLineCharacter, suffix: this.newLineCharacter };
case 259 /* VariableDeclaration */:
case 11 /* StringLiteral */:
case 80 /* Identifier */:
return { prefix: ", " };
case 302 /* PropertyAssignment */:
return { suffix: "," + this.newLineCharacter };
case 95 /* ExportKeyword */:
return { prefix: " " };
case 168 /* Parameter */:
return {};
default:
Debug.assert(isStatement(node) || isClassOrTypeElement(node));
return { suffix: this.newLineCharacter };
}
}
insertName(sourceFile, node, name) {
Debug.assert(!node.name);
if (node.kind === 218 /* ArrowFunction */) {
const arrow = findChildOfKind(node, 39 /* EqualsGreaterThanToken */, sourceFile);
const lparen = findChildOfKind(node, 21 /* OpenParenToken */, sourceFile);
if (lparen) {
this.insertNodesAt(sourceFile, lparen.getStart(sourceFile), [factory.createToken(100 /* FunctionKeyword */), factory.createIdentifier(name)], { joiner: " " });
deleteNode(this, sourceFile, arrow);
} else {
this.insertText(sourceFile, first(node.parameters).getStart(sourceFile), `function ${name}(`);
this.replaceRange(sourceFile, arrow, factory.createToken(22 /* CloseParenToken */));
}
if (node.body.kind !== 240 /* Block */) {
this.insertNodesAt(sourceFile, node.body.getStart(sourceFile), [factory.createToken(19 /* OpenBraceToken */), factory.createToken(107 /* ReturnKeyword */)], { joiner: " ", suffix: " " });
this.insertNodesAt(sourceFile, node.body.end, [factory.createToken(27 /* SemicolonToken */), factory.createToken(20 /* CloseBraceToken */)], { joiner: " " });
}
} else {
const pos = findChildOfKind(node, node.kind === 217 /* FunctionExpression */ ? 100 /* FunctionKeyword */ : 86 /* ClassKeyword */, sourceFile).end;
this.insertNodeAt(sourceFile, pos, factory.createIdentifier(name), { prefix: " " });
}
}
insertExportModifier(sourceFile, node) {
this.insertText(sourceFile, node.getStart(sourceFile), "export ");
}
insertImportSpecifierAtIndex(sourceFile, importSpecifier, namedImports, index) {
const prevSpecifier = namedImports.elements[index - 1];
if (prevSpecifier) {
this.insertNodeInListAfter(sourceFile, prevSpecifier, importSpecifier);
} else {
this.insertNodeBefore(
sourceFile,
namedImports.elements[0],
importSpecifier,
!positionsAreOnSameLine(namedImports.elements[0].getStart(), namedImports.parent.parent.getStart(), sourceFile)
);
}
}
/**
* This function should be used to insert nodes in lists when nodes don't carry separators as the part of the node range,
* i.e. arguments in arguments lists, parameters in parameter lists etc.
* Note that separators are part of the node in statements and class elements.
*/
insertNodeInListAfter(sourceFile, after, newNode, containingList = ts_formatting_exports.SmartIndenter.getContainingList(after, sourceFile)) {
if (!containingList) {
Debug.fail("node is not a list element");
return;
}
const index = indexOfNode(containingList, after);
if (index < 0) {
return;
}
const end = after.getEnd();
if (index !== containingList.length - 1) {
const nextToken = getTokenAtPosition(sourceFile, after.end);
if (nextToken && isSeparator(after, nextToken)) {
const nextNode = containingList[index + 1];
const startPos = skipWhitespacesAndLineBreaks(sourceFile.text, nextNode.getFullStart());
const suffix = `${tokenToString(nextToken.kind)}${sourceFile.text.substring(nextToken.end, startPos)}`;
this.insertNodesAt(sourceFile, startPos, [newNode], { suffix });
}
} else {
const afterStart = after.getStart(sourceFile);
const afterStartLinePosition = getLineStartPositionForPosition(afterStart, sourceFile);
let separator;
let multilineList = false;
if (containingList.length === 1) {
separator = 28 /* CommaToken */;
} else {
const tokenBeforeInsertPosition = findPrecedingToken(after.pos, sourceFile);
separator = isSeparator(after, tokenBeforeInsertPosition) ? tokenBeforeInsertPosition.kind : 28 /* CommaToken */;
const afterMinusOneStartLinePosition = getLineStartPositionForPosition(containingList[index - 1].getStart(sourceFile), sourceFile);
multilineList = afterMinusOneStartLinePosition !== afterStartLinePosition;
}
if (hasCommentsBeforeLineBreak(sourceFile.text, after.end)) {
multilineList = true;
}
if (multilineList) {
this.replaceRange(sourceFile, createRange(end), factory.createToken(separator));
const indentation = ts_formatting_exports.SmartIndenter.findFirstNonWhitespaceColumn(afterStartLinePosition, afterStart, sourceFile, this.formatContext.options);
let insertPos = skipTrivia(
sourceFile.text,
end,
/*stopAfterLineBreak*/
true,
/*stopAtComments*/
false
);
while (insertPos !== end && isLineBreak(sourceFile.text.charCodeAt(insertPos - 1))) {
insertPos--;
}
this.replaceRange(sourceFile, createRange(insertPos), newNode, { indentation, prefix: this.newLineCharacter });
} else {
this.replaceRange(sourceFile, createRange(end), newNode, { prefix: `${tokenToString(separator)} ` });
}
}
}
parenthesizeExpression(sourceFile, expression) {
this.replaceRange(sourceFile, rangeOfNode(expression), factory.createParenthesizedExpression(expression));
}
finishClassesWithNodesInsertedAtStart() {
this.classesWithNodesInsertedAtStart.forEach(({ node, sourceFile }) => {
const [openBraceEnd, closeBraceEnd] = getClassOrObjectBraceEnds(node, sourceFile);
if (openBraceEnd !== void 0 && closeBraceEnd !== void 0) {
const isEmpty = getMembersOrProperties(node).length === 0;
const isSingleLine = positionsAreOnSameLine(openBraceEnd, closeBraceEnd, sourceFile);
if (isEmpty && isSingleLine && openBraceEnd !== closeBraceEnd - 1) {
this.deleteRange(sourceFile, createRange(openBraceEnd, closeBraceEnd - 1));
}
if (isSingleLine) {
this.insertText(sourceFile, closeBraceEnd - 1, this.newLineCharacter);
}
}
});
}
finishDeleteDeclarations() {
const deletedNodesInLists = /* @__PURE__ */ new Set();
for (const { sourceFile, node } of this.deletedNodes) {
if (!this.deletedNodes.some((d) => d.sourceFile === sourceFile && rangeContainsRangeExclusive(d.node, node))) {
if (isArray(node)) {
this.deleteRange(sourceFile, rangeOfTypeParameters(sourceFile, node));
} else {
deleteDeclaration.deleteDeclaration(this, deletedNodesInLists, sourceFile, node);
}
}
}
deletedNodesInLists.forEach((node) => {
const sourceFile = node.getSourceFile();
const list = ts_formatting_exports.SmartIndenter.getContainingList(node, sourceFile);
if (node !== last(list))
return;
const lastNonDeletedIndex = findLastIndex(list, (n) => !deletedNodesInLists.has(n), list.length - 2);
if (lastNonDeletedIndex !== -1) {
this.deleteRange(sourceFile, { pos: list[lastNonDeletedIndex].end, end: startPositionToDeleteNodeInList(sourceFile, list[lastNonDeletedIndex + 1]) });
}
});
}
/**
* Note: after calling this, the TextChanges object must be discarded!
* @param validate only for tests
* The reason we must validate as part of this method is that `getNonFormattedText` changes the node's positions,
* so we can only call this once and can't get the non-formatted text separately.
*/
getChanges(validate) {
this.finishDeleteDeclarations();
this.finishClassesWithNodesInsertedAtStart();
const changes = changesToText.getTextChangesFromChanges(this.changes, this.newLineCharacter, this.formatContext, validate);
if (this.newFileChanges) {
this.newFileChanges.forEach((insertions, fileName) => {
changes.push(changesToText.newFileChanges(fileName, insertions, this.newLineCharacter, this.formatContext));
});
}
return changes;
}
createNewFile(oldFile, fileName, statements) {
this.insertStatementsInNewFile(fileName, statements, oldFile);
}
};
function updateJSDocHost(parent2) {
if (parent2.kind !== 218 /* ArrowFunction */) {
return parent2;
}
const jsDocNode = parent2.parent.kind === 171 /* PropertyDeclaration */ ? parent2.parent : parent2.parent.parent;
jsDocNode.jsDoc = parent2.jsDoc;
return jsDocNode;
}
function tryMergeJsdocTags(oldTag, newTag) {
if (oldTag.kind !== newTag.kind) {
return void 0;
}
switch (oldTag.kind) {
case 347 /* JSDocParameterTag */: {
const oldParam = oldTag;
const newParam = newTag;
return isIdentifier(oldParam.name) && isIdentifier(newParam.name) && oldParam.name.escapedText === newParam.name.escapedText ? factory.createJSDocParameterTag(
/*tagName*/
void 0,
newParam.name,
/*isBracketed*/
false,
newParam.typeExpression,
newParam.isNameFirst,
oldParam.comment
) : void 0;
}
case 348 /* JSDocReturnTag */:
return factory.createJSDocReturnTag(
/*tagName*/
void 0,
newTag.typeExpression,
oldTag.comment
);
case 350 /* JSDocTypeTag */:
return factory.createJSDocTypeTag(
/*tagName*/
void 0,
newTag.typeExpression,
oldTag.comment
);
}
}
function startPositionToDeleteNodeInList(sourceFile, node) {
return skipTrivia(
sourceFile.text,
getAdjustedStartPosition(sourceFile, node, { leadingTriviaOption: 1 /* IncludeAll */ }),
/*stopAfterLineBreak*/
false,
/*stopAtComments*/
true
);
}
function endPositionToDeleteNodeInList(sourceFile, node, prevNode, nextNode) {
const end = startPositionToDeleteNodeInList(sourceFile, nextNode);
if (prevNode === void 0 || positionsAreOnSameLine(getAdjustedEndPosition(sourceFile, node, {}), end, sourceFile)) {
return end;
}
const token = findPrecedingToken(nextNode.getStart(sourceFile), sourceFile);
if (isSeparator(node, token)) {
const prevToken = findPrecedingToken(node.getStart(sourceFile), sourceFile);
if (isSeparator(prevNode, prevToken)) {
const pos = skipTrivia(
sourceFile.text,
token.getEnd(),
/*stopAfterLineBreak*/
true,
/*stopAtComments*/
true
);
if (positionsAreOnSameLine(prevToken.getStart(sourceFile), token.getStart(sourceFile), sourceFile)) {
return isLineBreak(sourceFile.text.charCodeAt(pos - 1)) ? pos - 1 : pos;
}
if (isLineBreak(sourceFile.text.charCodeAt(pos))) {
return pos;
}
}
}
return end;
}
function getClassOrObjectBraceEnds(cls, sourceFile) {
const open = findChildOfKind(cls, 19 /* OpenBraceToken */, sourceFile);
const close = findChildOfKind(cls, 20 /* CloseBraceToken */, sourceFile);
return [open == null ? void 0 : open.end, close == null ? void 0 : close.end];
}
function getMembersOrProperties(node) {
return isObjectLiteralExpression(node) ? node.properties : node.members;
}
var changesToText;
((changesToText2) => {
function getTextChangesFromChanges(changes, newLineCharacter, formatContext, validate) {
return mapDefined(group(changes, (c) => c.sourceFile.path), (changesInFile) => {
const sourceFile = changesInFile[0].sourceFile;
const normalized = stableSort(changesInFile, (a, b) => a.range.pos - b.range.pos || a.range.end - b.range.end);
for (let i = 0; i < normalized.length - 1; i++) {
Debug.assert(normalized[i].range.end <= normalized[i + 1].range.pos, "Changes overlap", () => `${JSON.stringify(normalized[i].range)} and ${JSON.stringify(normalized[i + 1].range)}`);
}
const textChanges2 = mapDefined(normalized, (c) => {
const span = createTextSpanFromRange(c.range);
const targetSourceFile = c.kind === 1 /* ReplaceWithSingleNode */ ? getSourceFileOfNode(getOriginalNode(c.node)) ?? c.sourceFile : c.kind === 2 /* ReplaceWithMultipleNodes */ ? getSourceFileOfNode(getOriginalNode(c.nodes[0])) ?? c.sourceFile : c.sourceFile;
const newText = computeNewText(c, targetSourceFile, sourceFile, newLineCharacter, formatContext, validate);
if (span.length === newText.length && stringContainsAt(targetSourceFile.text, newText, span.start)) {
return void 0;
}
return createTextChange(span, newText);
});
return textChanges2.length > 0 ? { fileName: sourceFile.fileName, textChanges: textChanges2 } : void 0;
});
}
changesToText2.getTextChangesFromChanges = getTextChangesFromChanges;
function newFileChanges(fileName, insertions, newLineCharacter, formatContext) {
const text = newFileChangesWorker(getScriptKindFromFileName(fileName), insertions, newLineCharacter, formatContext);
return { fileName, textChanges: [createTextChange(createTextSpan(0, 0), text)], isNewFile: true };
}
changesToText2.newFileChanges = newFileChanges;
function newFileChangesWorker(scriptKind, insertions, newLineCharacter, formatContext) {
const nonFormattedText = flatMap(insertions, (insertion) => insertion.statements.map((s) => s === 4 /* NewLineTrivia */ ? "" : getNonformattedText(s, insertion.oldFile, newLineCharacter).text)).join(newLineCharacter);
const sourceFile = createSourceFile(
"any file name",
nonFormattedText,
99 /* ESNext */,
/*setParentNodes*/
true,
scriptKind
);
const changes = ts_formatting_exports.formatDocument(sourceFile, formatContext);
return applyChanges(nonFormattedText, changes) + newLineCharacter;
}
changesToText2.newFileChangesWorker = newFileChangesWorker;
function computeNewText(change, targetSourceFile, sourceFile, newLineCharacter, formatContext, validate) {
var _a;
if (change.kind === 0 /* Remove */) {
return "";
}
if (change.kind === 3 /* Text */) {
return change.text;
}
const { options = {}, range: { pos } } = change;
const format = (n) => getFormattedTextOfNode(n, targetSourceFile, sourceFile, pos, options, newLineCharacter, formatContext, validate);
const text = change.kind === 2 /* ReplaceWithMultipleNodes */ ? change.nodes.map((n) => removeSuffix(format(n), newLineCharacter)).join(((_a = change.options) == null ? void 0 : _a.joiner) || newLineCharacter) : format(change.node);
const noIndent = options.indentation !== void 0 || getLineStartPositionForPosition(pos, targetSourceFile) === pos ? text : text.replace(/^\s+/, "");
return (options.prefix || "") + noIndent + (!options.suffix || endsWith(noIndent, options.suffix) ? "" : options.suffix);
}
function getFormattedTextOfNode(nodeIn, targetSourceFile, sourceFile, pos, { indentation, prefix, delta }, newLineCharacter, formatContext, validate) {
const { node, text } = getNonformattedText(nodeIn, targetSourceFile, newLineCharacter);
if (validate)
validate(node, text);
const formatOptions = getFormatCodeSettingsForWriting(formatContext, targetSourceFile);
const initialIndentation = indentation !== void 0 ? indentation : ts_formatting_exports.SmartIndenter.getIndentation(pos, sourceFile, formatOptions, prefix === newLineCharacter || getLineStartPositionForPosition(pos, targetSourceFile) === pos);
if (delta === void 0) {
delta = ts_formatting_exports.SmartIndenter.shouldIndentChildNode(formatOptions, nodeIn) ? formatOptions.indentSize || 0 : 0;
}
const file = {
text,
getLineAndCharacterOfPosition(pos2) {
return getLineAndCharacterOfPosition(this, pos2);
}
};
const changes = ts_formatting_exports.formatNodeGivenIndentation(node, file, targetSourceFile.languageVariant, initialIndentation, delta, { ...formatContext, options: formatOptions });
return applyChanges(text, changes);
}
function getNonformattedText(node, sourceFile, newLineCharacter) {
const writer = createWriter(newLineCharacter);
const newLine = getNewLineKind(newLineCharacter);
createPrinter({
newLine,
neverAsciiEscape: true,
preserveSourceNewlines: true,
terminateUnterminatedLiterals: true
}, writer).writeNode(4 /* Unspecified */, node, sourceFile, writer);
return { text: writer.getText(), node: assignPositionsToNode(node) };
}
changesToText2.getNonformattedText = getNonformattedText;
})(changesToText || (changesToText = {}));
function applyChanges(text, changes) {
for (let i = changes.length - 1; i >= 0; i--) {
const { span, newText } = changes[i];
text = `${text.substring(0, span.start)}${newText}${text.substring(textSpanEnd(span))}`;
}
return text;
}
function isTrivia2(s) {
return skipTrivia(s, 0) === s.length;
}
var textChangesTransformationContext = {
...nullTransformationContext,
factory: createNodeFactory(
nullTransformationContext.factory.flags | 1 /* NoParenthesizerRules */,
nullTransformationContext.factory.baseFactory
)
};
function assignPositionsToNode(node) {
const visited = visitEachChild(node, assignPositionsToNode, textChangesTransformationContext, assignPositionsToNodeArray, assignPositionsToNode);
const newNode = nodeIsSynthesized(visited) ? visited : Object.create(visited);
setTextRangePosEnd(newNode, getPos2(node), getEnd(node));
return newNode;
}
function assignPositionsToNodeArray(nodes, visitor, test, start2, count) {
const visited = visitNodes2(nodes, visitor, test, start2, count);
if (!visited) {
return visited;
}
Debug.assert(nodes);
const nodeArray = visited === nodes ? factory.createNodeArray(visited.slice(0)) : visited;
setTextRangePosEnd(nodeArray, getPos2(nodes), getEnd(nodes));
return nodeArray;
}
function createWriter(newLine) {
let lastNonTriviaPosition = 0;
const writer = createTextWriter(newLine);
const onBeforeEmitNode = (node) => {
if (node) {
setPos(node, lastNonTriviaPosition);
}
};
const onAfterEmitNode = (node) => {
if (node) {
setEnd(node, lastNonTriviaPosition);
}
};
const onBeforeEmitNodeArray = (nodes) => {
if (nodes) {
setPos(nodes, lastNonTriviaPosition);
}
};
const onAfterEmitNodeArray = (nodes) => {
if (nodes) {
setEnd(nodes, lastNonTriviaPosition);
}
};
const onBeforeEmitToken = (node) => {
if (node) {
setPos(node, lastNonTriviaPosition);
}
};
const onAfterEmitToken = (node) => {
if (node) {
setEnd(node, lastNonTriviaPosition);
}
};
function setLastNonTriviaPosition(s, force) {
if (force || !isTrivia2(s)) {
lastNonTriviaPosition = writer.getTextPos();
let i = 0;
while (isWhiteSpaceLike(s.charCodeAt(s.length - i - 1))) {
i++;
}
lastNonTriviaPosition -= i;
}
}
function write(s) {
writer.write(s);
setLastNonTriviaPosition(
s,
/*force*/
false
);
}
function writeComment(s) {
writer.writeComment(s);
}
function writeKeyword(s) {
writer.writeKeyword(s);
setLastNonTriviaPosition(
s,
/*force*/
false
);
}
function writeOperator(s) {
writer.writeOperator(s);
setLastNonTriviaPosition(
s,
/*force*/
false
);
}
function writePunctuation(s) {
writer.writePunctuation(s);
setLastNonTriviaPosition(
s,
/*force*/
false
);
}
function writeTrailingSemicolon(s) {
writer.writeTrailingSemicolon(s);
setLastNonTriviaPosition(
s,
/*force*/
false
);
}
function writeParameter(s) {
writer.writeParameter(s);
setLastNonTriviaPosition(
s,
/*force*/
false
);
}
function writeProperty(s) {
writer.writeProperty(s);
setLastNonTriviaPosition(
s,
/*force*/
false
);
}
function writeSpace(s) {
writer.writeSpace(s);
setLastNonTriviaPosition(
s,
/*force*/
false
);
}
function writeStringLiteral(s) {
writer.writeStringLiteral(s);
setLastNonTriviaPosition(
s,
/*force*/
false
);
}
function writeSymbol(s, sym) {
writer.writeSymbol(s, sym);
setLastNonTriviaPosition(
s,
/*force*/
false
);
}
function writeLine(force) {
writer.writeLine(force);
}
function increaseIndent() {
writer.increaseIndent();
}
function decreaseIndent() {
writer.decreaseIndent();
}
function getText() {
return writer.getText();
}
function rawWrite(s) {
writer.rawWrite(s);
setLastNonTriviaPosition(
s,
/*force*/
false
);
}
function writeLiteral(s) {
writer.writeLiteral(s);
setLastNonTriviaPosition(
s,
/*force*/
true
);
}
function getTextPos() {
return writer.getTextPos();
}
function getLine() {
return writer.getLine();
}
function getColumn() {
return writer.getColumn();
}
function getIndent() {
return writer.getIndent();
}
function isAtStartOfLine() {
return writer.isAtStartOfLine();
}
function clear2() {
writer.clear();
lastNonTriviaPosition = 0;
}
return {
onBeforeEmitNode,
onAfterEmitNode,
onBeforeEmitNodeArray,
onAfterEmitNodeArray,
onBeforeEmitToken,
onAfterEmitToken,
write,
writeComment,
writeKeyword,
writeOperator,
writePunctuation,
writeTrailingSemicolon,
writeParameter,
writeProperty,
writeSpace,
writeStringLiteral,
writeSymbol,
writeLine,
increaseIndent,
decreaseIndent,
getText,
rawWrite,
writeLiteral,
getTextPos,
getLine,
getColumn,
getIndent,
isAtStartOfLine,
hasTrailingComment: () => writer.hasTrailingComment(),
hasTrailingWhitespace: () => writer.hasTrailingWhitespace(),
clear: clear2
};
}
function getInsertionPositionAtSourceFileTop(sourceFile) {
let lastPrologue;
for (const node of sourceFile.statements) {
if (isPrologueDirective(node)) {
lastPrologue = node;
} else {
break;
}
}
let position = 0;
const text = sourceFile.text;
if (lastPrologue) {
position = lastPrologue.end;
advancePastLineBreak();
return position;
}
const shebang = getShebang(text);
if (shebang !== void 0) {
position = shebang.length;
advancePastLineBreak();
}
const ranges = getLeadingCommentRanges(text, position);
if (!ranges)
return position;
let lastComment;
let firstNodeLine;
for (const range of ranges) {
if (range.kind === 3 /* MultiLineCommentTrivia */) {
if (isPinnedComment(text, range.pos)) {
lastComment = { range, pinnedOrTripleSlash: true };
continue;
}
} else if (isRecognizedTripleSlashComment(text, range.pos, range.end)) {
lastComment = { range, pinnedOrTripleSlash: true };
continue;
}
if (lastComment) {
if (lastComment.pinnedOrTripleSlash)
break;
const commentLine = sourceFile.getLineAndCharacterOfPosition(range.pos).line;
const lastCommentEndLine = sourceFile.getLineAndCharacterOfPosition(lastComment.range.end).line;
if (commentLine >= lastCommentEndLine + 2)
break;
}
if (sourceFile.statements.length) {
if (firstNodeLine === void 0)
firstNodeLine = sourceFile.getLineAndCharacterOfPosition(sourceFile.statements[0].getStart()).line;
const commentEndLine = sourceFile.getLineAndCharacterOfPosition(range.end).line;
if (firstNodeLine < commentEndLine + 2)
break;
}
lastComment = { range, pinnedOrTripleSlash: false };
}
if (lastComment) {
position = lastComment.range.end;
advancePastLineBreak();
}
return position;
function advancePastLineBreak() {
if (position < text.length) {
const charCode = text.charCodeAt(position);
if (isLineBreak(charCode)) {
position++;
if (position < text.length && charCode === 13 /* carriageReturn */ && text.charCodeAt(position) === 10 /* lineFeed */) {
position++;
}
}
}
}
}
function isValidLocationToAddComment(sourceFile, position) {
return !isInComment(sourceFile, position) && !isInString(sourceFile, position) && !isInTemplateString(sourceFile, position) && !isInJSXText(sourceFile, position);
}
function needSemicolonBetween(a, b) {
return (isPropertySignature(a) || isPropertyDeclaration(a)) && isClassOrTypeElement(b) && b.name.kind === 166 /* ComputedPropertyName */ || isStatementButNotDeclaration(a) && isStatementButNotDeclaration(b);
}
var deleteDeclaration;
((_deleteDeclaration) => {
function deleteDeclaration2(changes, deletedNodesInLists, sourceFile, node) {
switch (node.kind) {
case 168 /* Parameter */: {
const oldFunction = node.parent;
if (isArrowFunction(oldFunction) && oldFunction.parameters.length === 1 && !findChildOfKind(oldFunction, 21 /* OpenParenToken */, sourceFile)) {
changes.replaceNodeWithText(sourceFile, node, "()");
} else {
deleteNodeInList(changes, deletedNodesInLists, sourceFile, node);
}
break;
}
case 271 /* ImportDeclaration */:
case 270 /* ImportEqualsDeclaration */:
const isFirstImport = sourceFile.imports.length && node === first(sourceFile.imports).parent || node === find(sourceFile.statements, isAnyImportSyntax);
deleteNode(changes, sourceFile, node, {
leadingTriviaOption: isFirstImport ? 0 /* Exclude */ : hasJSDocNodes(node) ? 2 /* JSDoc */ : 3 /* StartLine */
});
break;
case 207 /* BindingElement */:
const pattern = node.parent;
const preserveComma = pattern.kind === 206 /* ArrayBindingPattern */ && node !== last(pattern.elements);
if (preserveComma) {
deleteNode(changes, sourceFile, node);
} else {
deleteNodeInList(changes, deletedNodesInLists, sourceFile, node);
}
break;
case 259 /* VariableDeclaration */:
deleteVariableDeclaration(changes, deletedNodesInLists, sourceFile, node);
break;
case 167 /* TypeParameter */:
deleteNodeInList(changes, deletedNodesInLists, sourceFile, node);
break;
case 275 /* ImportSpecifier */:
const namedImports = node.parent;
if (namedImports.elements.length === 1) {
deleteImportBinding(changes, sourceFile, namedImports);
} else {
deleteNodeInList(changes, deletedNodesInLists, sourceFile, node);
}
break;
case 273 /* NamespaceImport */:
deleteImportBinding(changes, sourceFile, node);
break;
case 27 /* SemicolonToken */:
deleteNode(changes, sourceFile, node, { trailingTriviaOption: 0 /* Exclude */ });
break;
case 100 /* FunctionKeyword */:
deleteNode(changes, sourceFile, node, { leadingTriviaOption: 0 /* Exclude */ });
break;
case 262 /* ClassDeclaration */:
case 261 /* FunctionDeclaration */:
deleteNode(changes, sourceFile, node, { leadingTriviaOption: hasJSDocNodes(node) ? 2 /* JSDoc */ : 3 /* StartLine */ });
break;
default:
if (!node.parent) {
deleteNode(changes, sourceFile, node);
} else if (isImportClause(node.parent) && node.parent.name === node) {
deleteDefaultImport(changes, sourceFile, node.parent);
} else if (isCallExpression(node.parent) && contains(node.parent.arguments, node)) {
deleteNodeInList(changes, deletedNodesInLists, sourceFile, node);
} else {
deleteNode(changes, sourceFile, node);
}
}
}
_deleteDeclaration.deleteDeclaration = deleteDeclaration2;
function deleteDefaultImport(changes, sourceFile, importClause) {
if (!importClause.namedBindings) {
deleteNode(changes, sourceFile, importClause.parent);
} else {
const start2 = importClause.name.getStart(sourceFile);
const nextToken = getTokenAtPosition(sourceFile, importClause.name.end);
if (nextToken && nextToken.kind === 28 /* CommaToken */) {
const end = skipTrivia(
sourceFile.text,
nextToken.end,
/*stopAfterLineBreak*/
false,
/*stopAtComments*/
true
);
changes.deleteRange(sourceFile, { pos: start2, end });
} else {
deleteNode(changes, sourceFile, importClause.name);
}
}
}
function deleteImportBinding(changes, sourceFile, node) {
if (node.parent.name) {
const previousToken = Debug.checkDefined(getTokenAtPosition(sourceFile, node.pos - 1));
changes.deleteRange(sourceFile, { pos: previousToken.getStart(sourceFile), end: node.end });
} else {
const importDecl = getAncestor(node, 271 /* ImportDeclaration */);
deleteNode(changes, sourceFile, importDecl);
}
}
function deleteVariableDeclaration(changes, deletedNodesInLists, sourceFile, node) {
const { parent: parent2 } = node;
if (parent2.kind === 298 /* CatchClause */) {
changes.deleteNodeRange(sourceFile, findChildOfKind(parent2, 21 /* OpenParenToken */, sourceFile), findChildOfKind(parent2, 22 /* CloseParenToken */, sourceFile));
return;
}
if (parent2.declarations.length !== 1) {
deleteNodeInList(changes, deletedNodesInLists, sourceFile, node);
return;
}
const gp = parent2.parent;
switch (gp.kind) {
case 249 /* ForOfStatement */:
case 248 /* ForInStatement */:
changes.replaceNode(sourceFile, node, factory.createObjectLiteralExpression());
break;
case 247 /* ForStatement */:
deleteNode(changes, sourceFile, parent2);
break;
case 242 /* VariableStatement */:
deleteNode(changes, sourceFile, gp, { leadingTriviaOption: hasJSDocNodes(gp) ? 2 /* JSDoc */ : 3 /* StartLine */ });
break;
default:
Debug.assertNever(gp);
}
}
})(deleteDeclaration || (deleteDeclaration = {}));
function deleteNode(changes, sourceFile, node, options = { leadingTriviaOption: 1 /* IncludeAll */ }) {
const startPosition = getAdjustedStartPosition(sourceFile, node, options);
const endPosition = getAdjustedEndPosition(sourceFile, node, options);
changes.deleteRange(sourceFile, { pos: startPosition, end: endPosition });
}
function deleteNodeInList(changes, deletedNodesInLists, sourceFile, node) {
const containingList = Debug.checkDefined(ts_formatting_exports.SmartIndenter.getContainingList(node, sourceFile));
const index = indexOfNode(containingList, node);
Debug.assert(index !== -1);
if (containingList.length === 1) {
deleteNode(changes, sourceFile, node);
return;
}
Debug.assert(!deletedNodesInLists.has(node), "Deleting a node twice");
deletedNodesInLists.add(node);
changes.deleteRange(sourceFile, {
pos: startPositionToDeleteNodeInList(sourceFile, node),
end: index === containingList.length - 1 ? getAdjustedEndPosition(sourceFile, node, {}) : endPositionToDeleteNodeInList(sourceFile, node, containingList[index - 1], containingList[index + 1])
});
}
// src/services/_namespaces/ts.formatting.ts
var ts_formatting_exports = {};
__export(ts_formatting_exports, {
FormattingContext: () => FormattingContext,
FormattingRequestKind: () => FormattingRequestKind,
RuleAction: () => RuleAction,
RuleFlags: () => RuleFlags,
SmartIndenter: () => SmartIndenter,
anyContext: () => anyContext,
createTextRangeWithKind: () => createTextRangeWithKind,
formatDocument: () => formatDocument,
formatNodeGivenIndentation: () => formatNodeGivenIndentation,
formatOnClosingCurly: () => formatOnClosingCurly,
formatOnEnter: () => formatOnEnter,
formatOnOpeningCurly: () => formatOnOpeningCurly,
formatOnSemicolon: () => formatOnSemicolon,
formatSelection: () => formatSelection,
getAllRules: () => getAllRules,
getFormatContext: () => getFormatContext,
getFormattingScanner: () => getFormattingScanner,
getIndentationString: () => getIndentationString,
getRangeOfEnclosingComment: () => getRangeOfEnclosingComment
});
// src/services/formatting/formattingContext.ts
var FormattingRequestKind = /* @__PURE__ */ ((FormattingRequestKind2) => {
FormattingRequestKind2[FormattingRequestKind2["FormatDocument"] = 0] = "FormatDocument";
FormattingRequestKind2[FormattingRequestKind2["FormatSelection"] = 1] = "FormatSelection";
FormattingRequestKind2[FormattingRequestKind2["FormatOnEnter"] = 2] = "FormatOnEnter";
FormattingRequestKind2[FormattingRequestKind2["FormatOnSemicolon"] = 3] = "FormatOnSemicolon";
FormattingRequestKind2[FormattingRequestKind2["FormatOnOpeningCurlyBrace"] = 4] = "FormatOnOpeningCurlyBrace";
FormattingRequestKind2[FormattingRequestKind2["FormatOnClosingCurlyBrace"] = 5] = "FormatOnClosingCurlyBrace";
return FormattingRequestKind2;
})(FormattingRequestKind || {});
var FormattingContext = class {
constructor(sourceFile, formattingRequestKind, options) {
this.sourceFile = sourceFile;
this.formattingRequestKind = formattingRequestKind;
this.options = options;
}
updateContext(currentRange, currentTokenParent, nextRange, nextTokenParent, commonParent) {
this.currentTokenSpan = Debug.checkDefined(currentRange);
this.currentTokenParent = Debug.checkDefined(currentTokenParent);
this.nextTokenSpan = Debug.checkDefined(nextRange);
this.nextTokenParent = Debug.checkDefined(nextTokenParent);
this.contextNode = Debug.checkDefined(commonParent);
this.contextNodeAllOnSameLine = void 0;
this.nextNodeAllOnSameLine = void 0;
this.tokensAreOnSameLine = void 0;
this.contextNodeBlockIsOnOneLine = void 0;
this.nextNodeBlockIsOnOneLine = void 0;
}
ContextNodeAllOnSameLine() {
if (this.contextNodeAllOnSameLine === void 0) {
this.contextNodeAllOnSameLine = this.NodeIsOnOneLine(this.contextNode);
}
return this.contextNodeAllOnSameLine;
}
NextNodeAllOnSameLine() {
if (this.nextNodeAllOnSameLine === void 0) {
this.nextNodeAllOnSameLine = this.NodeIsOnOneLine(this.nextTokenParent);
}
return this.nextNodeAllOnSameLine;
}
TokensAreOnSameLine() {
if (this.tokensAreOnSameLine === void 0) {
const startLine = this.sourceFile.getLineAndCharacterOfPosition(this.currentTokenSpan.pos).line;
const endLine = this.sourceFile.getLineAndCharacterOfPosition(this.nextTokenSpan.pos).line;
this.tokensAreOnSameLine = startLine === endLine;
}
return this.tokensAreOnSameLine;
}
ContextNodeBlockIsOnOneLine() {
if (this.contextNodeBlockIsOnOneLine === void 0) {
this.contextNodeBlockIsOnOneLine = this.BlockIsOnOneLine(this.contextNode);
}
return this.contextNodeBlockIsOnOneLine;
}
NextNodeBlockIsOnOneLine() {
if (this.nextNodeBlockIsOnOneLine === void 0) {
this.nextNodeBlockIsOnOneLine = this.BlockIsOnOneLine(this.nextTokenParent);
}
return this.nextNodeBlockIsOnOneLine;
}
NodeIsOnOneLine(node) {
const startLine = this.sourceFile.getLineAndCharacterOfPosition(node.getStart(this.sourceFile)).line;
const endLine = this.sourceFile.getLineAndCharacterOfPosition(node.getEnd()).line;
return startLine === endLine;
}
BlockIsOnOneLine(node) {
const openBrace = findChildOfKind(node, 19 /* OpenBraceToken */, this.sourceFile);
const closeBrace = findChildOfKind(node, 20 /* CloseBraceToken */, this.sourceFile);
if (openBrace && closeBrace) {
const startLine = this.sourceFile.getLineAndCharacterOfPosition(openBrace.getEnd()).line;
const endLine = this.sourceFile.getLineAndCharacterOfPosition(closeBrace.getStart(this.sourceFile)).line;
return startLine === endLine;
}
return false;
}
};
// src/services/formatting/formattingScanner.ts
var standardScanner = createScanner(
99 /* Latest */,
/*skipTrivia*/
false,
0 /* Standard */
);
var jsxScanner = createScanner(
99 /* Latest */,
/*skipTrivia*/
false,
1 /* JSX */
);
function getFormattingScanner(text, languageVariant, startPos, endPos, cb) {
const scanner2 = languageVariant === 1 /* JSX */ ? jsxScanner : standardScanner;
scanner2.setText(text);
scanner2.resetTokenState(startPos);
let wasNewLine = true;
let leadingTrivia;
let trailingTrivia;
let savedPos;
let lastScanAction;
let lastTokenInfo;
const res = cb({
advance,
readTokenInfo,
readEOFTokenRange,
isOnToken,
isOnEOF,
getCurrentLeadingTrivia: () => leadingTrivia,
lastTrailingTriviaWasNewLine: () => wasNewLine,
skipToEndOf,
skipToStartOf,
getTokenFullStart: () => (lastTokenInfo == null ? void 0 : lastTokenInfo.token.pos) ?? scanner2.getTokenStart(),
getStartPos: () => (lastTokenInfo == null ? void 0 : lastTokenInfo.token.pos) ?? scanner2.getTokenStart()
});
lastTokenInfo = void 0;
scanner2.setText(void 0);
return res;
function advance() {
lastTokenInfo = void 0;
const isStarted = scanner2.getTokenFullStart() !== startPos;
if (isStarted) {
wasNewLine = !!trailingTrivia && last(trailingTrivia).kind === 4 /* NewLineTrivia */;
} else {
scanner2.scan();
}
leadingTrivia = void 0;
trailingTrivia = void 0;
let pos = scanner2.getTokenFullStart();
while (pos < endPos) {
const t = scanner2.getToken();
if (!isTrivia(t)) {
break;
}
scanner2.scan();
const item = {
pos,
end: scanner2.getTokenFullStart(),
kind: t
};
pos = scanner2.getTokenFullStart();
leadingTrivia = append(leadingTrivia, item);
}
savedPos = scanner2.getTokenFullStart();
}
function shouldRescanGreaterThanToken(node) {
switch (node.kind) {
case 34 /* GreaterThanEqualsToken */:
case 72 /* GreaterThanGreaterThanEqualsToken */:
case 73 /* GreaterThanGreaterThanGreaterThanEqualsToken */:
case 50 /* GreaterThanGreaterThanGreaterThanToken */:
case 49 /* GreaterThanGreaterThanToken */:
return true;
}
return false;
}
function shouldRescanJsxIdentifier(node) {
if (node.parent) {
switch (node.parent.kind) {
case 290 /* JsxAttribute */:
case 285 /* JsxOpeningElement */:
case 286 /* JsxClosingElement */:
case 284 /* JsxSelfClosingElement */:
return isKeyword(node.kind) || node.kind === 80 /* Identifier */;
}
}
return false;
}
function shouldRescanJsxText(node) {
return isJsxText(node) || isJsxElement(node) && (lastTokenInfo == null ? void 0 : lastTokenInfo.token.kind) === 12 /* JsxText */;
}
function shouldRescanSlashToken(container) {
return container.kind === 14 /* RegularExpressionLiteral */;
}
function shouldRescanTemplateToken(container) {
return container.kind === 17 /* TemplateMiddle */ || container.kind === 18 /* TemplateTail */;
}
function shouldRescanJsxAttributeValue(node) {
return node.parent && isJsxAttribute(node.parent) && node.parent.initializer === node;
}
function startsWithSlashToken(t) {
return t === 44 /* SlashToken */ || t === 69 /* SlashEqualsToken */;
}
function readTokenInfo(n) {
Debug.assert(isOnToken());
const expectedScanAction = shouldRescanGreaterThanToken(n) ? 1 /* RescanGreaterThanToken */ : shouldRescanSlashToken(n) ? 2 /* RescanSlashToken */ : shouldRescanTemplateToken(n) ? 3 /* RescanTemplateToken */ : shouldRescanJsxIdentifier(n) ? 4 /* RescanJsxIdentifier */ : shouldRescanJsxText(n) ? 5 /* RescanJsxText */ : shouldRescanJsxAttributeValue(n) ? 6 /* RescanJsxAttributeValue */ : 0 /* Scan */;
if (lastTokenInfo && expectedScanAction === lastScanAction) {
return fixTokenKind(lastTokenInfo, n);
}
if (scanner2.getTokenFullStart() !== savedPos) {
Debug.assert(lastTokenInfo !== void 0);
scanner2.resetTokenState(savedPos);
scanner2.scan();
}
let currentToken = getNextToken(n, expectedScanAction);
const token = createTextRangeWithKind(
scanner2.getTokenFullStart(),
scanner2.getTokenEnd(),
currentToken
);
if (trailingTrivia) {
trailingTrivia = void 0;
}
while (scanner2.getTokenFullStart() < endPos) {
currentToken = scanner2.scan();
if (!isTrivia(currentToken)) {
break;
}
const trivia = createTextRangeWithKind(
scanner2.getTokenFullStart(),
scanner2.getTokenEnd(),
currentToken
);
if (!trailingTrivia) {
trailingTrivia = [];
}
trailingTrivia.push(trivia);
if (currentToken === 4 /* NewLineTrivia */) {
scanner2.scan();
break;
}
}
lastTokenInfo = { leadingTrivia, trailingTrivia, token };
return fixTokenKind(lastTokenInfo, n);
}
function getNextToken(n, expectedScanAction) {
const token = scanner2.getToken();
lastScanAction = 0 /* Scan */;
switch (expectedScanAction) {
case 1 /* RescanGreaterThanToken */:
if (token === 32 /* GreaterThanToken */) {
lastScanAction = 1 /* RescanGreaterThanToken */;
const newToken = scanner2.reScanGreaterToken();
Debug.assert(n.kind === newToken);
return newToken;
}
break;
case 2 /* RescanSlashToken */:
if (startsWithSlashToken(token)) {
lastScanAction = 2 /* RescanSlashToken */;
const newToken = scanner2.reScanSlashToken();
Debug.assert(n.kind === newToken);
return newToken;
}
break;
case 3 /* RescanTemplateToken */:
if (token === 20 /* CloseBraceToken */) {
lastScanAction = 3 /* RescanTemplateToken */;
return scanner2.reScanTemplateToken(
/*isTaggedTemplate*/
false
);
}
break;
case 4 /* RescanJsxIdentifier */:
lastScanAction = 4 /* RescanJsxIdentifier */;
return scanner2.scanJsxIdentifier();
case 5 /* RescanJsxText */:
lastScanAction = 5 /* RescanJsxText */;
return scanner2.reScanJsxToken(
/*allowMultilineJsxText*/
false
);
case 6 /* RescanJsxAttributeValue */:
lastScanAction = 6 /* RescanJsxAttributeValue */;
return scanner2.reScanJsxAttributeValue();
case 0 /* Scan */:
break;
default:
Debug.assertNever(expectedScanAction);
}
return token;
}
function readEOFTokenRange() {
Debug.assert(isOnEOF());
return createTextRangeWithKind(scanner2.getTokenFullStart(), scanner2.getTokenEnd(), 1 /* EndOfFileToken */);
}
function isOnToken() {
const current = lastTokenInfo ? lastTokenInfo.token.kind : scanner2.getToken();
return current !== 1 /* EndOfFileToken */ && !isTrivia(current);
}
function isOnEOF() {
const current = lastTokenInfo ? lastTokenInfo.token.kind : scanner2.getToken();
return current === 1 /* EndOfFileToken */;
}
function fixTokenKind(tokenInfo, container) {
if (isToken(container) && tokenInfo.token.kind !== container.kind) {
tokenInfo.token.kind = container.kind;
}
return tokenInfo;
}
function skipToEndOf(node) {
scanner2.resetTokenState(node.end);
savedPos = scanner2.getTokenFullStart();
lastScanAction = void 0;
lastTokenInfo = void 0;
wasNewLine = false;
leadingTrivia = void 0;
trailingTrivia = void 0;
}
function skipToStartOf(node) {
scanner2.resetTokenState(node.pos);
savedPos = scanner2.getTokenFullStart();
lastScanAction = void 0;
lastTokenInfo = void 0;
wasNewLine = false;
leadingTrivia = void 0;
trailingTrivia = void 0;
}
}
// src/services/formatting/rule.ts
var anyContext = emptyArray;
var RuleAction = /* @__PURE__ */ ((RuleAction2) => {
RuleAction2[RuleAction2["None"] = 0] = "None";
RuleAction2[RuleAction2["StopProcessingSpaceActions"] = 1] = "StopProcessingSpaceActions";
RuleAction2[RuleAction2["StopProcessingTokenActions"] = 2] = "StopProcessingTokenActions";
RuleAction2[RuleAction2["InsertSpace"] = 4] = "InsertSpace";
RuleAction2[RuleAction2["InsertNewLine"] = 8] = "InsertNewLine";
RuleAction2[RuleAction2["DeleteSpace"] = 16] = "DeleteSpace";
RuleAction2[RuleAction2["DeleteToken"] = 32] = "DeleteToken";
RuleAction2[RuleAction2["InsertTrailingSemicolon"] = 64] = "InsertTrailingSemicolon";
RuleAction2[RuleAction2["StopAction"] = 3] = "StopAction";
RuleAction2[RuleAction2["ModifySpaceAction"] = 28] = "ModifySpaceAction";
RuleAction2[RuleAction2["ModifyTokenAction"] = 96] = "ModifyTokenAction";
return RuleAction2;
})(RuleAction || {});
var RuleFlags = /* @__PURE__ */ ((RuleFlags2) => {
RuleFlags2[RuleFlags2["None"] = 0] = "None";
RuleFlags2[RuleFlags2["CanDeleteNewLines"] = 1] = "CanDeleteNewLines";
return RuleFlags2;
})(RuleFlags || {});
// src/services/formatting/rules.ts
function getAllRules() {
const allTokens = [];
for (let token = 0 /* FirstToken */; token <= 164 /* LastToken */; token++) {
if (token !== 1 /* EndOfFileToken */) {
allTokens.push(token);
}
}
function anyTokenExcept(...tokens) {
return { tokens: allTokens.filter((t) => !tokens.some((t2) => t2 === t)), isSpecific: false };
}
const anyToken = { tokens: allTokens, isSpecific: false };
const anyTokenIncludingMultilineComments = tokenRangeFrom([...allTokens, 3 /* MultiLineCommentTrivia */]);
const anyTokenIncludingEOF = tokenRangeFrom([...allTokens, 1 /* EndOfFileToken */]);
const keywords = tokenRangeFromRange(83 /* FirstKeyword */, 164 /* LastKeyword */);
const binaryOperators = tokenRangeFromRange(30 /* FirstBinaryOperator */, 79 /* LastBinaryOperator */);
const binaryKeywordOperators = [
103 /* InKeyword */,
104 /* InstanceOfKeyword */,
164 /* OfKeyword */,
130 /* AsKeyword */,
142 /* IsKeyword */,
152 /* SatisfiesKeyword */
];
const unaryPrefixOperators = [46 /* PlusPlusToken */, 47 /* MinusMinusToken */, 55 /* TildeToken */, 54 /* ExclamationToken */];
const unaryPrefixExpressions = [
9 /* NumericLiteral */,
10 /* BigIntLiteral */,
80 /* Identifier */,
21 /* OpenParenToken */,
23 /* OpenBracketToken */,
19 /* OpenBraceToken */,
110 /* ThisKeyword */,
105 /* NewKeyword */
];
const unaryPreincrementExpressions = [80 /* Identifier */, 21 /* OpenParenToken */, 110 /* ThisKeyword */, 105 /* NewKeyword */];
const unaryPostincrementExpressions = [80 /* Identifier */, 22 /* CloseParenToken */, 24 /* CloseBracketToken */, 105 /* NewKeyword */];
const unaryPredecrementExpressions = [80 /* Identifier */, 21 /* OpenParenToken */, 110 /* ThisKeyword */, 105 /* NewKeyword */];
const unaryPostdecrementExpressions = [80 /* Identifier */, 22 /* CloseParenToken */, 24 /* CloseBracketToken */, 105 /* NewKeyword */];
const comments = [2 /* SingleLineCommentTrivia */, 3 /* MultiLineCommentTrivia */];
const typeNames = [80 /* Identifier */, ...typeKeywords];
const functionOpenBraceLeftTokenRange = anyTokenIncludingMultilineComments;
const typeScriptOpenBraceLeftTokenRange = tokenRangeFrom([80 /* Identifier */, 3 /* MultiLineCommentTrivia */, 86 /* ClassKeyword */, 95 /* ExportKeyword */, 102 /* ImportKeyword */]);
const controlOpenBraceLeftTokenRange = tokenRangeFrom([22 /* CloseParenToken */, 3 /* MultiLineCommentTrivia */, 92 /* DoKeyword */, 113 /* TryKeyword */, 98 /* FinallyKeyword */, 93 /* ElseKeyword */]);
const highPriorityCommonRules = [
// Leave comments alone
rule("IgnoreBeforeComment", anyToken, comments, anyContext, 1 /* StopProcessingSpaceActions */),
rule("IgnoreAfterLineComment", 2 /* SingleLineCommentTrivia */, anyToken, anyContext, 1 /* StopProcessingSpaceActions */),
rule("NotSpaceBeforeColon", anyToken, 59 /* ColonToken */, [isNonJsxSameLineTokenContext, isNotBinaryOpContext, isNotTypeAnnotationContext], 16 /* DeleteSpace */),
rule("SpaceAfterColon", 59 /* ColonToken */, anyToken, [isNonJsxSameLineTokenContext, isNotBinaryOpContext], 4 /* InsertSpace */),
rule("NoSpaceBeforeQuestionMark", anyToken, 58 /* QuestionToken */, [isNonJsxSameLineTokenContext, isNotBinaryOpContext, isNotTypeAnnotationContext], 16 /* DeleteSpace */),
// insert space after '?' only when it is used in conditional operator
rule("SpaceAfterQuestionMarkInConditionalOperator", 58 /* QuestionToken */, anyToken, [isNonJsxSameLineTokenContext, isConditionalOperatorContext], 4 /* InsertSpace */),
// in other cases there should be no space between '?' and next token
rule("NoSpaceAfterQuestionMark", 58 /* QuestionToken */, anyToken, [isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
rule("NoSpaceBeforeDot", anyToken, [25 /* DotToken */, 29 /* QuestionDotToken */], [isNonJsxSameLineTokenContext, isNotPropertyAccessOnIntegerLiteral], 16 /* DeleteSpace */),
rule("NoSpaceAfterDot", [25 /* DotToken */, 29 /* QuestionDotToken */], anyToken, [isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
rule("NoSpaceBetweenImportParenInImportType", 102 /* ImportKeyword */, 21 /* OpenParenToken */, [isNonJsxSameLineTokenContext, isImportTypeContext], 16 /* DeleteSpace */),
// Special handling of unary operators.
// Prefix operators generally shouldn't have a space between
// them and their target unary expression.
rule("NoSpaceAfterUnaryPrefixOperator", unaryPrefixOperators, unaryPrefixExpressions, [isNonJsxSameLineTokenContext, isNotBinaryOpContext], 16 /* DeleteSpace */),
rule("NoSpaceAfterUnaryPreincrementOperator", 46 /* PlusPlusToken */, unaryPreincrementExpressions, [isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
rule("NoSpaceAfterUnaryPredecrementOperator", 47 /* MinusMinusToken */, unaryPredecrementExpressions, [isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
rule("NoSpaceBeforeUnaryPostincrementOperator", unaryPostincrementExpressions, 46 /* PlusPlusToken */, [isNonJsxSameLineTokenContext, isNotStatementConditionContext], 16 /* DeleteSpace */),
rule("NoSpaceBeforeUnaryPostdecrementOperator", unaryPostdecrementExpressions, 47 /* MinusMinusToken */, [isNonJsxSameLineTokenContext, isNotStatementConditionContext], 16 /* DeleteSpace */),
// More unary operator special-casing.
// DevDiv 181814: Be careful when removing leading whitespace
// around unary operators. Examples:
// 1 - -2 --X--> 1--2
// a + ++b --X--> a+++b
rule("SpaceAfterPostincrementWhenFollowedByAdd", 46 /* PlusPlusToken */, 40 /* PlusToken */, [isNonJsxSameLineTokenContext, isBinaryOpContext], 4 /* InsertSpace */),
rule("SpaceAfterAddWhenFollowedByUnaryPlus", 40 /* PlusToken */, 40 /* PlusToken */, [isNonJsxSameLineTokenContext, isBinaryOpContext], 4 /* InsertSpace */),
rule("SpaceAfterAddWhenFollowedByPreincrement", 40 /* PlusToken */, 46 /* PlusPlusToken */, [isNonJsxSameLineTokenContext, isBinaryOpContext], 4 /* InsertSpace */),
rule("SpaceAfterPostdecrementWhenFollowedBySubtract", 47 /* MinusMinusToken */, 41 /* MinusToken */, [isNonJsxSameLineTokenContext, isBinaryOpContext], 4 /* InsertSpace */),
rule("SpaceAfterSubtractWhenFollowedByUnaryMinus", 41 /* MinusToken */, 41 /* MinusToken */, [isNonJsxSameLineTokenContext, isBinaryOpContext], 4 /* InsertSpace */),
rule("SpaceAfterSubtractWhenFollowedByPredecrement", 41 /* MinusToken */, 47 /* MinusMinusToken */, [isNonJsxSameLineTokenContext, isBinaryOpContext], 4 /* InsertSpace */),
rule("NoSpaceAfterCloseBrace", 20 /* CloseBraceToken */, [28 /* CommaToken */, 27 /* SemicolonToken */], [isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
// For functions and control block place } on a new line [multi-line rule]
rule("NewLineBeforeCloseBraceInBlockContext", anyTokenIncludingMultilineComments, 20 /* CloseBraceToken */, [isMultilineBlockContext], 8 /* InsertNewLine */),
// Space/new line after }.
rule("SpaceAfterCloseBrace", 20 /* CloseBraceToken */, anyTokenExcept(22 /* CloseParenToken */), [isNonJsxSameLineTokenContext, isAfterCodeBlockContext], 4 /* InsertSpace */),
// Special case for (}, else) and (}, while) since else & while tokens are not part of the tree which makes SpaceAfterCloseBrace rule not applied
// Also should not apply to })
rule("SpaceBetweenCloseBraceAndElse", 20 /* CloseBraceToken */, 93 /* ElseKeyword */, [isNonJsxSameLineTokenContext], 4 /* InsertSpace */),
rule("SpaceBetweenCloseBraceAndWhile", 20 /* CloseBraceToken */, 117 /* WhileKeyword */, [isNonJsxSameLineTokenContext], 4 /* InsertSpace */),
rule("NoSpaceBetweenEmptyBraceBrackets", 19 /* OpenBraceToken */, 20 /* CloseBraceToken */, [isNonJsxSameLineTokenContext, isObjectContext], 16 /* DeleteSpace */),
// Add a space after control dec context if the next character is an open bracket ex: 'if (false)[a, b] = [1, 2];' -> 'if (false) [a, b] = [1, 2];'
rule("SpaceAfterConditionalClosingParen", 22 /* CloseParenToken */, 23 /* OpenBracketToken */, [isControlDeclContext], 4 /* InsertSpace */),
rule("NoSpaceBetweenFunctionKeywordAndStar", 100 /* FunctionKeyword */, 42 /* AsteriskToken */, [isFunctionDeclarationOrFunctionExpressionContext], 16 /* DeleteSpace */),
rule("SpaceAfterStarInGeneratorDeclaration", 42 /* AsteriskToken */, 80 /* Identifier */, [isFunctionDeclarationOrFunctionExpressionContext], 4 /* InsertSpace */),
rule("SpaceAfterFunctionInFuncDecl", 100 /* FunctionKeyword */, anyToken, [isFunctionDeclContext], 4 /* InsertSpace */),
// Insert new line after { and before } in multi-line contexts.
rule("NewLineAfterOpenBraceInBlockContext", 19 /* OpenBraceToken */, anyToken, [isMultilineBlockContext], 8 /* InsertNewLine */),
// For get/set members, we check for (identifier,identifier) since get/set don't have tokens and they are represented as just an identifier token.
// Though, we do extra check on the context to make sure we are dealing with get/set node. Example:
// get x() {}
// set x(val) {}
rule("SpaceAfterGetSetInMember", [139 /* GetKeyword */, 153 /* SetKeyword */], 80 /* Identifier */, [isFunctionDeclContext], 4 /* InsertSpace */),
rule("NoSpaceBetweenYieldKeywordAndStar", 127 /* YieldKeyword */, 42 /* AsteriskToken */, [isNonJsxSameLineTokenContext, isYieldOrYieldStarWithOperand], 16 /* DeleteSpace */),
rule("SpaceBetweenYieldOrYieldStarAndOperand", [127 /* YieldKeyword */, 42 /* AsteriskToken */], anyToken, [isNonJsxSameLineTokenContext, isYieldOrYieldStarWithOperand], 4 /* InsertSpace */),
rule("NoSpaceBetweenReturnAndSemicolon", 107 /* ReturnKeyword */, 27 /* SemicolonToken */, [isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
rule("SpaceAfterCertainKeywords", [115 /* VarKeyword */, 111 /* ThrowKeyword */, 105 /* NewKeyword */, 91 /* DeleteKeyword */, 107 /* ReturnKeyword */, 114 /* TypeOfKeyword */, 135 /* AwaitKeyword */], anyToken, [isNonJsxSameLineTokenContext], 4 /* InsertSpace */),
rule("SpaceAfterLetConstInVariableDeclaration", [121 /* LetKeyword */, 87 /* ConstKeyword */], anyToken, [isNonJsxSameLineTokenContext, isStartOfVariableDeclarationList], 4 /* InsertSpace */),
rule("NoSpaceBeforeOpenParenInFuncCall", anyToken, 21 /* OpenParenToken */, [isNonJsxSameLineTokenContext, isFunctionCallOrNewContext, isPreviousTokenNotComma], 16 /* DeleteSpace */),
// Special case for binary operators (that are keywords). For these we have to add a space and shouldn't follow any user options.
rule("SpaceBeforeBinaryKeywordOperator", anyToken, binaryKeywordOperators, [isNonJsxSameLineTokenContext, isBinaryOpContext], 4 /* InsertSpace */),
rule("SpaceAfterBinaryKeywordOperator", binaryKeywordOperators, anyToken, [isNonJsxSameLineTokenContext, isBinaryOpContext], 4 /* InsertSpace */),
rule("SpaceAfterVoidOperator", 116 /* VoidKeyword */, anyToken, [isNonJsxSameLineTokenContext, isVoidOpContext], 4 /* InsertSpace */),
// Async-await
rule("SpaceBetweenAsyncAndOpenParen", 134 /* AsyncKeyword */, 21 /* OpenParenToken */, [isArrowFunctionContext, isNonJsxSameLineTokenContext], 4 /* InsertSpace */),
rule("SpaceBetweenAsyncAndFunctionKeyword", 134 /* AsyncKeyword */, [100 /* FunctionKeyword */, 80 /* Identifier */], [isNonJsxSameLineTokenContext], 4 /* InsertSpace */),
// Template string
rule("NoSpaceBetweenTagAndTemplateString", [80 /* Identifier */, 22 /* CloseParenToken */], [15 /* NoSubstitutionTemplateLiteral */, 16 /* TemplateHead */], [isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
// JSX opening elements
rule("SpaceBeforeJsxAttribute", anyToken, 80 /* Identifier */, [isNextTokenParentJsxAttribute, isNonJsxSameLineTokenContext], 4 /* InsertSpace */),
rule("SpaceBeforeSlashInJsxOpeningElement", anyToken, 44 /* SlashToken */, [isJsxSelfClosingElementContext, isNonJsxSameLineTokenContext], 4 /* InsertSpace */),
rule("NoSpaceBeforeGreaterThanTokenInJsxOpeningElement", 44 /* SlashToken */, 32 /* GreaterThanToken */, [isJsxSelfClosingElementContext, isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
rule("NoSpaceBeforeEqualInJsxAttribute", anyToken, 64 /* EqualsToken */, [isJsxAttributeContext, isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
rule("NoSpaceAfterEqualInJsxAttribute", 64 /* EqualsToken */, anyToken, [isJsxAttributeContext, isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
// TypeScript-specific rules
// Use of module as a function call. e.g.: import m2 = module("m2");
rule("NoSpaceAfterModuleImport", [144 /* ModuleKeyword */, 149 /* RequireKeyword */], 21 /* OpenParenToken */, [isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
// Add a space around certain TypeScript keywords
rule(
"SpaceAfterCertainTypeScriptKeywords",
[
128 /* AbstractKeyword */,
129 /* AccessorKeyword */,
86 /* ClassKeyword */,
138 /* DeclareKeyword */,
90 /* DefaultKeyword */,
94 /* EnumKeyword */,
95 /* ExportKeyword */,
96 /* ExtendsKeyword */,
139 /* GetKeyword */,
119 /* ImplementsKeyword */,
102 /* ImportKeyword */,
120 /* InterfaceKeyword */,
144 /* ModuleKeyword */,
145 /* NamespaceKeyword */,
123 /* PrivateKeyword */,
125 /* PublicKeyword */,
124 /* ProtectedKeyword */,
148 /* ReadonlyKeyword */,
153 /* SetKeyword */,
126 /* StaticKeyword */,
156 /* TypeKeyword */,
160 /* FromKeyword */,
143 /* KeyOfKeyword */,
140 /* InferKeyword */
],
anyToken,
[isNonJsxSameLineTokenContext],
4 /* InsertSpace */
),
rule(
"SpaceBeforeCertainTypeScriptKeywords",
anyToken,
[96 /* ExtendsKeyword */, 119 /* ImplementsKeyword */, 160 /* FromKeyword */],
[isNonJsxSameLineTokenContext],
4 /* InsertSpace */
),
// Treat string literals in module names as identifiers, and add a space between the literal and the opening Brace braces, e.g.: module "m2" {
rule("SpaceAfterModuleName", 11 /* StringLiteral */, 19 /* OpenBraceToken */, [isModuleDeclContext], 4 /* InsertSpace */),
// Lambda expressions
rule("SpaceBeforeArrow", anyToken, 39 /* EqualsGreaterThanToken */, [isNonJsxSameLineTokenContext], 4 /* InsertSpace */),
rule("SpaceAfterArrow", 39 /* EqualsGreaterThanToken */, anyToken, [isNonJsxSameLineTokenContext], 4 /* InsertSpace */),
// Optional parameters and let args
rule("NoSpaceAfterEllipsis", 26 /* DotDotDotToken */, 80 /* Identifier */, [isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
rule("NoSpaceAfterOptionalParameters", 58 /* QuestionToken */, [22 /* CloseParenToken */, 28 /* CommaToken */], [isNonJsxSameLineTokenContext, isNotBinaryOpContext], 16 /* DeleteSpace */),
// Remove spaces in empty interface literals. e.g.: x: {}
rule("NoSpaceBetweenEmptyInterfaceBraceBrackets", 19 /* OpenBraceToken */, 20 /* CloseBraceToken */, [isNonJsxSameLineTokenContext, isObjectTypeContext], 16 /* DeleteSpace */),
// generics and type assertions
rule("NoSpaceBeforeOpenAngularBracket", typeNames, 30 /* LessThanToken */, [isNonJsxSameLineTokenContext, isTypeArgumentOrParameterOrAssertionContext], 16 /* DeleteSpace */),
rule("NoSpaceBetweenCloseParenAndAngularBracket", 22 /* CloseParenToken */, 30 /* LessThanToken */, [isNonJsxSameLineTokenContext, isTypeArgumentOrParameterOrAssertionContext], 16 /* DeleteSpace */),
rule("NoSpaceAfterOpenAngularBracket", 30 /* LessThanToken */, anyToken, [isNonJsxSameLineTokenContext, isTypeArgumentOrParameterOrAssertionContext], 16 /* DeleteSpace */),
rule("NoSpaceBeforeCloseAngularBracket", anyToken, 32 /* GreaterThanToken */, [isNonJsxSameLineTokenContext, isTypeArgumentOrParameterOrAssertionContext], 16 /* DeleteSpace */),
rule("NoSpaceAfterCloseAngularBracket", 32 /* GreaterThanToken */, [21 /* OpenParenToken */, 23 /* OpenBracketToken */, 32 /* GreaterThanToken */, 28 /* CommaToken */], [
isNonJsxSameLineTokenContext,
isTypeArgumentOrParameterOrAssertionContext,
isNotFunctionDeclContext,
isNonTypeAssertionContext
], 16 /* DeleteSpace */),
// decorators
rule("SpaceBeforeAt", [22 /* CloseParenToken */, 80 /* Identifier */], 60 /* AtToken */, [isNonJsxSameLineTokenContext], 4 /* InsertSpace */),
rule("NoSpaceAfterAt", 60 /* AtToken */, anyToken, [isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
// Insert space after @ in decorator
rule(
"SpaceAfterDecorator",
anyToken,
[
128 /* AbstractKeyword */,
80 /* Identifier */,
95 /* ExportKeyword */,
90 /* DefaultKeyword */,
86 /* ClassKeyword */,
126 /* StaticKeyword */,
125 /* PublicKeyword */,
123 /* PrivateKeyword */,
124 /* ProtectedKeyword */,
139 /* GetKeyword */,
153 /* SetKeyword */,
23 /* OpenBracketToken */,
42 /* AsteriskToken */
],
[isEndOfDecoratorContextOnSameLine],
4 /* InsertSpace */
),
rule("NoSpaceBeforeNonNullAssertionOperator", anyToken, 54 /* ExclamationToken */, [isNonJsxSameLineTokenContext, isNonNullAssertionContext], 16 /* DeleteSpace */),
rule("NoSpaceAfterNewKeywordOnConstructorSignature", 105 /* NewKeyword */, 21 /* OpenParenToken */, [isNonJsxSameLineTokenContext, isConstructorSignatureContext], 16 /* DeleteSpace */),
rule("SpaceLessThanAndNonJSXTypeAnnotation", 30 /* LessThanToken */, 30 /* LessThanToken */, [isNonJsxSameLineTokenContext], 4 /* InsertSpace */)
];
const userConfigurableRules = [
// Treat constructor as an identifier in a function declaration, and remove spaces between constructor and following left parentheses
rule("SpaceAfterConstructor", 137 /* ConstructorKeyword */, 21 /* OpenParenToken */, [isOptionEnabled("insertSpaceAfterConstructor"), isNonJsxSameLineTokenContext], 4 /* InsertSpace */),
rule("NoSpaceAfterConstructor", 137 /* ConstructorKeyword */, 21 /* OpenParenToken */, [isOptionDisabledOrUndefined("insertSpaceAfterConstructor"), isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
rule("SpaceAfterComma", 28 /* CommaToken */, anyToken, [isOptionEnabled("insertSpaceAfterCommaDelimiter"), isNonJsxSameLineTokenContext, isNonJsxElementOrFragmentContext, isNextTokenNotCloseBracket, isNextTokenNotCloseParen], 4 /* InsertSpace */),
rule("NoSpaceAfterComma", 28 /* CommaToken */, anyToken, [isOptionDisabledOrUndefined("insertSpaceAfterCommaDelimiter"), isNonJsxSameLineTokenContext, isNonJsxElementOrFragmentContext], 16 /* DeleteSpace */),
// Insert space after function keyword for anonymous functions
rule("SpaceAfterAnonymousFunctionKeyword", [100 /* FunctionKeyword */, 42 /* AsteriskToken */], 21 /* OpenParenToken */, [isOptionEnabled("insertSpaceAfterFunctionKeywordForAnonymousFunctions"), isFunctionDeclContext], 4 /* InsertSpace */),
rule("NoSpaceAfterAnonymousFunctionKeyword", [100 /* FunctionKeyword */, 42 /* AsteriskToken */], 21 /* OpenParenToken */, [isOptionDisabledOrUndefined("insertSpaceAfterFunctionKeywordForAnonymousFunctions"), isFunctionDeclContext], 16 /* DeleteSpace */),
// Insert space after keywords in control flow statements
rule("SpaceAfterKeywordInControl", keywords, 21 /* OpenParenToken */, [isOptionEnabled("insertSpaceAfterKeywordsInControlFlowStatements"), isControlDeclContext], 4 /* InsertSpace */),
rule("NoSpaceAfterKeywordInControl", keywords, 21 /* OpenParenToken */, [isOptionDisabledOrUndefined("insertSpaceAfterKeywordsInControlFlowStatements"), isControlDeclContext], 16 /* DeleteSpace */),
// Insert space after opening and before closing nonempty parenthesis
rule("SpaceAfterOpenParen", 21 /* OpenParenToken */, anyToken, [isOptionEnabled("insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis"), isNonJsxSameLineTokenContext], 4 /* InsertSpace */),
rule("SpaceBeforeCloseParen", anyToken, 22 /* CloseParenToken */, [isOptionEnabled("insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis"), isNonJsxSameLineTokenContext], 4 /* InsertSpace */),
rule("SpaceBetweenOpenParens", 21 /* OpenParenToken */, 21 /* OpenParenToken */, [isOptionEnabled("insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis"), isNonJsxSameLineTokenContext], 4 /* InsertSpace */),
rule("NoSpaceBetweenParens", 21 /* OpenParenToken */, 22 /* CloseParenToken */, [isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
rule("NoSpaceAfterOpenParen", 21 /* OpenParenToken */, anyToken, [isOptionDisabledOrUndefined("insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis"), isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
rule("NoSpaceBeforeCloseParen", anyToken, 22 /* CloseParenToken */, [isOptionDisabledOrUndefined("insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis"), isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
// Insert space after opening and before closing nonempty brackets
rule("SpaceAfterOpenBracket", 23 /* OpenBracketToken */, anyToken, [isOptionEnabled("insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets"), isNonJsxSameLineTokenContext], 4 /* InsertSpace */),
rule("SpaceBeforeCloseBracket", anyToken, 24 /* CloseBracketToken */, [isOptionEnabled("insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets"), isNonJsxSameLineTokenContext], 4 /* InsertSpace */),
rule("NoSpaceBetweenBrackets", 23 /* OpenBracketToken */, 24 /* CloseBracketToken */, [isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
rule("NoSpaceAfterOpenBracket", 23 /* OpenBracketToken */, anyToken, [isOptionDisabledOrUndefined("insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets"), isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
rule("NoSpaceBeforeCloseBracket", anyToken, 24 /* CloseBracketToken */, [isOptionDisabledOrUndefined("insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets"), isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
// Insert a space after { and before } in single-line contexts, but remove space from empty object literals {}.
rule("SpaceAfterOpenBrace", 19 /* OpenBraceToken */, anyToken, [isOptionEnabledOrUndefined("insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces"), isBraceWrappedContext], 4 /* InsertSpace */),
rule("SpaceBeforeCloseBrace", anyToken, 20 /* CloseBraceToken */, [isOptionEnabledOrUndefined("insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces"), isBraceWrappedContext], 4 /* InsertSpace */),
rule("NoSpaceBetweenEmptyBraceBrackets", 19 /* OpenBraceToken */, 20 /* CloseBraceToken */, [isNonJsxSameLineTokenContext, isObjectContext], 16 /* DeleteSpace */),
rule("NoSpaceAfterOpenBrace", 19 /* OpenBraceToken */, anyToken, [isOptionDisabled("insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces"), isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
rule("NoSpaceBeforeCloseBrace", anyToken, 20 /* CloseBraceToken */, [isOptionDisabled("insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces"), isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
// Insert a space after opening and before closing empty brace brackets
rule("SpaceBetweenEmptyBraceBrackets", 19 /* OpenBraceToken */, 20 /* CloseBraceToken */, [isOptionEnabled("insertSpaceAfterOpeningAndBeforeClosingEmptyBraces")], 4 /* InsertSpace */),
rule("NoSpaceBetweenEmptyBraceBrackets", 19 /* OpenBraceToken */, 20 /* CloseBraceToken */, [isOptionDisabled("insertSpaceAfterOpeningAndBeforeClosingEmptyBraces"), isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
// Insert space after opening and before closing template string braces
rule("SpaceAfterTemplateHeadAndMiddle", [16 /* TemplateHead */, 17 /* TemplateMiddle */], anyToken, [isOptionEnabled("insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces"), isNonJsxTextContext], 4 /* InsertSpace */, 1 /* CanDeleteNewLines */),
rule("SpaceBeforeTemplateMiddleAndTail", anyToken, [17 /* TemplateMiddle */, 18 /* TemplateTail */], [isOptionEnabled("insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces"), isNonJsxSameLineTokenContext], 4 /* InsertSpace */),
rule("NoSpaceAfterTemplateHeadAndMiddle", [16 /* TemplateHead */, 17 /* TemplateMiddle */], anyToken, [isOptionDisabledOrUndefined("insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces"), isNonJsxTextContext], 16 /* DeleteSpace */, 1 /* CanDeleteNewLines */),
rule("NoSpaceBeforeTemplateMiddleAndTail", anyToken, [17 /* TemplateMiddle */, 18 /* TemplateTail */], [isOptionDisabledOrUndefined("insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces"), isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
// No space after { and before } in JSX expression
rule("SpaceAfterOpenBraceInJsxExpression", 19 /* OpenBraceToken */, anyToken, [isOptionEnabled("insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces"), isNonJsxSameLineTokenContext, isJsxExpressionContext], 4 /* InsertSpace */),
rule("SpaceBeforeCloseBraceInJsxExpression", anyToken, 20 /* CloseBraceToken */, [isOptionEnabled("insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces"), isNonJsxSameLineTokenContext, isJsxExpressionContext], 4 /* InsertSpace */),
rule("NoSpaceAfterOpenBraceInJsxExpression", 19 /* OpenBraceToken */, anyToken, [isOptionDisabledOrUndefined("insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces"), isNonJsxSameLineTokenContext, isJsxExpressionContext], 16 /* DeleteSpace */),
rule("NoSpaceBeforeCloseBraceInJsxExpression", anyToken, 20 /* CloseBraceToken */, [isOptionDisabledOrUndefined("insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces"), isNonJsxSameLineTokenContext, isJsxExpressionContext], 16 /* DeleteSpace */),
// Insert space after semicolon in for statement
rule("SpaceAfterSemicolonInFor", 27 /* SemicolonToken */, anyToken, [isOptionEnabled("insertSpaceAfterSemicolonInForStatements"), isNonJsxSameLineTokenContext, isForContext], 4 /* InsertSpace */),
rule("NoSpaceAfterSemicolonInFor", 27 /* SemicolonToken */, anyToken, [isOptionDisabledOrUndefined("insertSpaceAfterSemicolonInForStatements"), isNonJsxSameLineTokenContext, isForContext], 16 /* DeleteSpace */),
// Insert space before and after binary operators
rule("SpaceBeforeBinaryOperator", anyToken, binaryOperators, [isOptionEnabled("insertSpaceBeforeAndAfterBinaryOperators"), isNonJsxSameLineTokenContext, isBinaryOpContext], 4 /* InsertSpace */),
rule("SpaceAfterBinaryOperator", binaryOperators, anyToken, [isOptionEnabled("insertSpaceBeforeAndAfterBinaryOperators"), isNonJsxSameLineTokenContext, isBinaryOpContext], 4 /* InsertSpace */),
rule("NoSpaceBeforeBinaryOperator", anyToken, binaryOperators, [isOptionDisabledOrUndefined("insertSpaceBeforeAndAfterBinaryOperators"), isNonJsxSameLineTokenContext, isBinaryOpContext], 16 /* DeleteSpace */),
rule("NoSpaceAfterBinaryOperator", binaryOperators, anyToken, [isOptionDisabledOrUndefined("insertSpaceBeforeAndAfterBinaryOperators"), isNonJsxSameLineTokenContext, isBinaryOpContext], 16 /* DeleteSpace */),
rule("SpaceBeforeOpenParenInFuncDecl", anyToken, 21 /* OpenParenToken */, [isOptionEnabled("insertSpaceBeforeFunctionParenthesis"), isNonJsxSameLineTokenContext, isFunctionDeclContext], 4 /* InsertSpace */),
rule("NoSpaceBeforeOpenParenInFuncDecl", anyToken, 21 /* OpenParenToken */, [isOptionDisabledOrUndefined("insertSpaceBeforeFunctionParenthesis"), isNonJsxSameLineTokenContext, isFunctionDeclContext], 16 /* DeleteSpace */),
// Open Brace braces after control block
rule("NewLineBeforeOpenBraceInControl", controlOpenBraceLeftTokenRange, 19 /* OpenBraceToken */, [isOptionEnabled("placeOpenBraceOnNewLineForControlBlocks"), isControlDeclContext, isBeforeMultilineBlockContext], 8 /* InsertNewLine */, 1 /* CanDeleteNewLines */),
// Open Brace braces after function
// TypeScript: Function can have return types, which can be made of tons of different token kinds
rule("NewLineBeforeOpenBraceInFunction", functionOpenBraceLeftTokenRange, 19 /* OpenBraceToken */, [isOptionEnabled("placeOpenBraceOnNewLineForFunctions"), isFunctionDeclContext, isBeforeMultilineBlockContext], 8 /* InsertNewLine */, 1 /* CanDeleteNewLines */),
// Open Brace braces after TypeScript module/class/interface
rule("NewLineBeforeOpenBraceInTypeScriptDeclWithBlock", typeScriptOpenBraceLeftTokenRange, 19 /* OpenBraceToken */, [isOptionEnabled("placeOpenBraceOnNewLineForFunctions"), isTypeScriptDeclWithBlockContext, isBeforeMultilineBlockContext], 8 /* InsertNewLine */, 1 /* CanDeleteNewLines */),
rule("SpaceAfterTypeAssertion", 32 /* GreaterThanToken */, anyToken, [isOptionEnabled("insertSpaceAfterTypeAssertion"), isNonJsxSameLineTokenContext, isTypeAssertionContext], 4 /* InsertSpace */),
rule("NoSpaceAfterTypeAssertion", 32 /* GreaterThanToken */, anyToken, [isOptionDisabledOrUndefined("insertSpaceAfterTypeAssertion"), isNonJsxSameLineTokenContext, isTypeAssertionContext], 16 /* DeleteSpace */),
rule("SpaceBeforeTypeAnnotation", anyToken, [58 /* QuestionToken */, 59 /* ColonToken */], [isOptionEnabled("insertSpaceBeforeTypeAnnotation"), isNonJsxSameLineTokenContext, isTypeAnnotationContext], 4 /* InsertSpace */),
rule("NoSpaceBeforeTypeAnnotation", anyToken, [58 /* QuestionToken */, 59 /* ColonToken */], [isOptionDisabledOrUndefined("insertSpaceBeforeTypeAnnotation"), isNonJsxSameLineTokenContext, isTypeAnnotationContext], 16 /* DeleteSpace */),
rule("NoOptionalSemicolon", 27 /* SemicolonToken */, anyTokenIncludingEOF, [optionEquals("semicolons", "remove" /* Remove */), isSemicolonDeletionContext], 32 /* DeleteToken */),
rule("OptionalSemicolon", anyToken, anyTokenIncludingEOF, [optionEquals("semicolons", "insert" /* Insert */), isSemicolonInsertionContext], 64 /* InsertTrailingSemicolon */)
];
const lowPriorityCommonRules = [
// Space after keyword but not before ; or : or ?
rule("NoSpaceBeforeSemicolon", anyToken, 27 /* SemicolonToken */, [isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
rule("SpaceBeforeOpenBraceInControl", controlOpenBraceLeftTokenRange, 19 /* OpenBraceToken */, [isOptionDisabledOrUndefinedOrTokensOnSameLine("placeOpenBraceOnNewLineForControlBlocks"), isControlDeclContext, isNotFormatOnEnter, isSameLineTokenOrBeforeBlockContext], 4 /* InsertSpace */, 1 /* CanDeleteNewLines */),
rule("SpaceBeforeOpenBraceInFunction", functionOpenBraceLeftTokenRange, 19 /* OpenBraceToken */, [isOptionDisabledOrUndefinedOrTokensOnSameLine("placeOpenBraceOnNewLineForFunctions"), isFunctionDeclContext, isBeforeBlockContext, isNotFormatOnEnter, isSameLineTokenOrBeforeBlockContext], 4 /* InsertSpace */, 1 /* CanDeleteNewLines */),
rule("SpaceBeforeOpenBraceInTypeScriptDeclWithBlock", typeScriptOpenBraceLeftTokenRange, 19 /* OpenBraceToken */, [isOptionDisabledOrUndefinedOrTokensOnSameLine("placeOpenBraceOnNewLineForFunctions"), isTypeScriptDeclWithBlockContext, isNotFormatOnEnter, isSameLineTokenOrBeforeBlockContext], 4 /* InsertSpace */, 1 /* CanDeleteNewLines */),
rule("NoSpaceBeforeComma", anyToken, 28 /* CommaToken */, [isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
// No space before and after indexer `x[]`
rule("NoSpaceBeforeOpenBracket", anyTokenExcept(134 /* AsyncKeyword */, 84 /* CaseKeyword */), 23 /* OpenBracketToken */, [isNonJsxSameLineTokenContext], 16 /* DeleteSpace */),
rule("NoSpaceAfterCloseBracket", 24 /* CloseBracketToken */, anyToken, [isNonJsxSameLineTokenContext, isNotBeforeBlockInFunctionDeclarationContext], 16 /* DeleteSpace */),
rule("SpaceAfterSemicolon", 27 /* SemicolonToken */, anyToken, [isNonJsxSameLineTokenContext], 4 /* InsertSpace */),
// Remove extra space between for and await
rule("SpaceBetweenForAndAwaitKeyword", 99 /* ForKeyword */, 135 /* AwaitKeyword */, [isNonJsxSameLineTokenContext], 4 /* InsertSpace */),
// Add a space between statements. All keywords except (do,else,case) has open/close parens after them.
// So, we have a rule to add a space for [),Any], [do,Any], [else,Any], and [case,Any]
rule(
"SpaceBetweenStatements",
[22 /* CloseParenToken */, 92 /* DoKeyword */, 93 /* ElseKeyword */, 84 /* CaseKeyword */],
anyToken,
[isNonJsxSameLineTokenContext, isNonJsxElementOrFragmentContext, isNotForContext],
4 /* InsertSpace */
),
// This low-pri rule takes care of "try {", "catch {" and "finally {" in case the rule SpaceBeforeOpenBraceInControl didn't execute on FormatOnEnter.
rule("SpaceAfterTryCatchFinally", [113 /* TryKeyword */, 85 /* CatchKeyword */, 98 /* FinallyKeyword */], 19 /* OpenBraceToken */, [isNonJsxSameLineTokenContext], 4 /* InsertSpace */)
];
return [
...highPriorityCommonRules,
...userConfigurableRules,
...lowPriorityCommonRules
];
}
function rule(debugName, left, right, context, action, flags = 0 /* None */) {
return { leftTokenRange: toTokenRange(left), rightTokenRange: toTokenRange(right), rule: { debugName, context, action, flags } };
}
function tokenRangeFrom(tokens) {
return { tokens, isSpecific: true };
}
function toTokenRange(arg) {
return typeof arg === "number" ? tokenRangeFrom([arg]) : isArray(arg) ? tokenRangeFrom(arg) : arg;
}
function tokenRangeFromRange(from, to, except = []) {
const tokens = [];
for (let token = from; token <= to; token++) {
if (!contains(except, token)) {
tokens.push(token);
}
}
return tokenRangeFrom(tokens);
}
function optionEquals(optionName, optionValue) {
return (context) => context.options && context.options[optionName] === optionValue;
}
function isOptionEnabled(optionName) {
return (context) => context.options && hasProperty(context.options, optionName) && !!context.options[optionName];
}
function isOptionDisabled(optionName) {
return (context) => context.options && hasProperty(context.options, optionName) && !context.options[optionName];
}
function isOptionDisabledOrUndefined(optionName) {
return (context) => !context.options || !hasProperty(context.options, optionName) || !context.options[optionName];
}
function isOptionDisabledOrUndefinedOrTokensOnSameLine(optionName) {
return (context) => !context.options || !hasProperty(context.options, optionName) || !context.options[optionName] || context.TokensAreOnSameLine();
}
function isOptionEnabledOrUndefined(optionName) {
return (context) => !context.options || !hasProperty(context.options, optionName) || !!context.options[optionName];
}
function isForContext(context) {
return context.contextNode.kind === 247 /* ForStatement */;
}
function isNotForContext(context) {
return !isForContext(context);
}
function isBinaryOpContext(context) {
switch (context.contextNode.kind) {
case 225 /* BinaryExpression */:
return context.contextNode.operatorToken.kind !== 28 /* CommaToken */;
case 226 /* ConditionalExpression */:
case 193 /* ConditionalType */:
case 233 /* AsExpression */:
case 280 /* ExportSpecifier */:
case 275 /* ImportSpecifier */:
case 181 /* TypePredicate */:
case 191 /* UnionType */:
case 192 /* IntersectionType */:
case 237 /* SatisfiesExpression */:
return true;
case 207 /* BindingElement */:
case 264 /* TypeAliasDeclaration */:
case 270 /* ImportEqualsDeclaration */:
case 276 /* ExportAssignment */:
case 259 /* VariableDeclaration */:
case 168 /* Parameter */:
case 305 /* EnumMember */:
case 171 /* PropertyDeclaration */:
case 170 /* PropertySignature */:
return context.currentTokenSpan.kind === 64 /* EqualsToken */ || context.nextTokenSpan.kind === 64 /* EqualsToken */;
case 248 /* ForInStatement */:
case 167 /* TypeParameter */:
return context.currentTokenSpan.kind === 103 /* InKeyword */ || context.nextTokenSpan.kind === 103 /* InKeyword */ || context.currentTokenSpan.kind === 64 /* EqualsToken */ || context.nextTokenSpan.kind === 64 /* EqualsToken */;
case 249 /* ForOfStatement */:
return context.currentTokenSpan.kind === 164 /* OfKeyword */ || context.nextTokenSpan.kind === 164 /* OfKeyword */;
}
return false;
}
function isNotBinaryOpContext(context) {
return !isBinaryOpContext(context);
}
function isNotTypeAnnotationContext(context) {
return !isTypeAnnotationContext(context);
}
function isTypeAnnotationContext(context) {
const contextKind = context.contextNode.kind;
return contextKind === 171 /* PropertyDeclaration */ || contextKind === 170 /* PropertySignature */ || contextKind === 168 /* Parameter */ || contextKind === 259 /* VariableDeclaration */ || isFunctionLikeKind(contextKind);
}
function isConditionalOperatorContext(context) {
return context.contextNode.kind === 226 /* ConditionalExpression */ || context.contextNode.kind === 193 /* ConditionalType */;
}
function isSameLineTokenOrBeforeBlockContext(context) {
return context.TokensAreOnSameLine() || isBeforeBlockContext(context);
}
function isBraceWrappedContext(context) {
return context.contextNode.kind === 205 /* ObjectBindingPattern */ || context.contextNode.kind === 199 /* MappedType */ || isSingleLineBlockContext(context);
}
function isBeforeMultilineBlockContext(context) {
return isBeforeBlockContext(context) && !(context.NextNodeAllOnSameLine() || context.NextNodeBlockIsOnOneLine());
}
function isMultilineBlockContext(context) {
return isBlockContext(context) && !(context.ContextNodeAllOnSameLine() || context.ContextNodeBlockIsOnOneLine());
}
function isSingleLineBlockContext(context) {
return isBlockContext(context) && (context.ContextNodeAllOnSameLine() || context.ContextNodeBlockIsOnOneLine());
}
function isBlockContext(context) {
return nodeIsBlockContext(context.contextNode);
}
function isBeforeBlockContext(context) {
return nodeIsBlockContext(context.nextTokenParent);
}
function nodeIsBlockContext(node) {
if (nodeIsTypeScriptDeclWithBlockContext(node)) {
return true;
}
switch (node.kind) {
case 240 /* Block */:
case 268 /* CaseBlock */:
case 209 /* ObjectLiteralExpression */:
case 267 /* ModuleBlock */:
return true;
}
return false;
}
function isFunctionDeclContext(context) {
switch (context.contextNode.kind) {
case 261 /* FunctionDeclaration */:
case 173 /* MethodDeclaration */:
case 172 /* MethodSignature */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
case 178 /* CallSignature */:
case 217 /* FunctionExpression */:
case 175 /* Constructor */:
case 218 /* ArrowFunction */:
case 263 /* InterfaceDeclaration */:
return true;
}
return false;
}
function isNotFunctionDeclContext(context) {
return !isFunctionDeclContext(context);
}
function isFunctionDeclarationOrFunctionExpressionContext(context) {
return context.contextNode.kind === 261 /* FunctionDeclaration */ || context.contextNode.kind === 217 /* FunctionExpression */;
}
function isTypeScriptDeclWithBlockContext(context) {
return nodeIsTypeScriptDeclWithBlockContext(context.contextNode);
}
function nodeIsTypeScriptDeclWithBlockContext(node) {
switch (node.kind) {
case 262 /* ClassDeclaration */:
case 230 /* ClassExpression */:
case 263 /* InterfaceDeclaration */:
case 265 /* EnumDeclaration */:
case 186 /* TypeLiteral */:
case 266 /* ModuleDeclaration */:
case 277 /* ExportDeclaration */:
case 278 /* NamedExports */:
case 271 /* ImportDeclaration */:
case 274 /* NamedImports */:
return true;
}
return false;
}
function isAfterCodeBlockContext(context) {
switch (context.currentTokenParent.kind) {
case 262 /* ClassDeclaration */:
case 266 /* ModuleDeclaration */:
case 265 /* EnumDeclaration */:
case 298 /* CatchClause */:
case 267 /* ModuleBlock */:
case 254 /* SwitchStatement */:
return true;
case 240 /* Block */: {
const blockParent = context.currentTokenParent.parent;
if (!blockParent || blockParent.kind !== 218 /* ArrowFunction */ && blockParent.kind !== 217 /* FunctionExpression */) {
return true;
}
}
}
return false;
}
function isControlDeclContext(context) {
switch (context.contextNode.kind) {
case 244 /* IfStatement */:
case 254 /* SwitchStatement */:
case 247 /* ForStatement */:
case 248 /* ForInStatement */:
case 249 /* ForOfStatement */:
case 246 /* WhileStatement */:
case 257 /* TryStatement */:
case 245 /* DoStatement */:
case 253 /* WithStatement */:
case 298 /* CatchClause */:
return true;
default:
return false;
}
}
function isObjectContext(context) {
return context.contextNode.kind === 209 /* ObjectLiteralExpression */;
}
function isFunctionCallContext(context) {
return context.contextNode.kind === 212 /* CallExpression */;
}
function isNewContext(context) {
return context.contextNode.kind === 213 /* NewExpression */;
}
function isFunctionCallOrNewContext(context) {
return isFunctionCallContext(context) || isNewContext(context);
}
function isPreviousTokenNotComma(context) {
return context.currentTokenSpan.kind !== 28 /* CommaToken */;
}
function isNextTokenNotCloseBracket(context) {
return context.nextTokenSpan.kind !== 24 /* CloseBracketToken */;
}
function isNextTokenNotCloseParen(context) {
return context.nextTokenSpan.kind !== 22 /* CloseParenToken */;
}
function isArrowFunctionContext(context) {
return context.contextNode.kind === 218 /* ArrowFunction */;
}
function isImportTypeContext(context) {
return context.contextNode.kind === 204 /* ImportType */;
}
function isNonJsxSameLineTokenContext(context) {
return context.TokensAreOnSameLine() && context.contextNode.kind !== 12 /* JsxText */;
}
function isNonJsxTextContext(context) {
return context.contextNode.kind !== 12 /* JsxText */;
}
function isNonJsxElementOrFragmentContext(context) {
return context.contextNode.kind !== 283 /* JsxElement */ && context.contextNode.kind !== 287 /* JsxFragment */;
}
function isJsxExpressionContext(context) {
return context.contextNode.kind === 293 /* JsxExpression */ || context.contextNode.kind === 292 /* JsxSpreadAttribute */;
}
function isNextTokenParentJsxAttribute(context) {
return context.nextTokenParent.kind === 290 /* JsxAttribute */;
}
function isJsxAttributeContext(context) {
return context.contextNode.kind === 290 /* JsxAttribute */;
}
function isJsxSelfClosingElementContext(context) {
return context.contextNode.kind === 284 /* JsxSelfClosingElement */;
}
function isNotBeforeBlockInFunctionDeclarationContext(context) {
return !isFunctionDeclContext(context) && !isBeforeBlockContext(context);
}
function isEndOfDecoratorContextOnSameLine(context) {
return context.TokensAreOnSameLine() && hasDecorators(context.contextNode) && nodeIsInDecoratorContext(context.currentTokenParent) && !nodeIsInDecoratorContext(context.nextTokenParent);
}
function nodeIsInDecoratorContext(node) {
while (node && isExpression(node)) {
node = node.parent;
}
return node && node.kind === 169 /* Decorator */;
}
function isStartOfVariableDeclarationList(context) {
return context.currentTokenParent.kind === 260 /* VariableDeclarationList */ && context.currentTokenParent.getStart(context.sourceFile) === context.currentTokenSpan.pos;
}
function isNotFormatOnEnter(context) {
return context.formattingRequestKind !== 2 /* FormatOnEnter */;
}
function isModuleDeclContext(context) {
return context.contextNode.kind === 266 /* ModuleDeclaration */;
}
function isObjectTypeContext(context) {
return context.contextNode.kind === 186 /* TypeLiteral */;
}
function isConstructorSignatureContext(context) {
return context.contextNode.kind === 179 /* ConstructSignature */;
}
function isTypeArgumentOrParameterOrAssertion(token, parent2) {
if (token.kind !== 30 /* LessThanToken */ && token.kind !== 32 /* GreaterThanToken */) {
return false;
}
switch (parent2.kind) {
case 182 /* TypeReference */:
case 215 /* TypeAssertionExpression */:
case 264 /* TypeAliasDeclaration */:
case 262 /* ClassDeclaration */:
case 230 /* ClassExpression */:
case 263 /* InterfaceDeclaration */:
case 261 /* FunctionDeclaration */:
case 217 /* FunctionExpression */:
case 218 /* ArrowFunction */:
case 173 /* MethodDeclaration */:
case 172 /* MethodSignature */:
case 178 /* CallSignature */:
case 179 /* ConstructSignature */:
case 212 /* CallExpression */:
case 213 /* NewExpression */:
case 232 /* ExpressionWithTypeArguments */:
return true;
default:
return false;
}
}
function isTypeArgumentOrParameterOrAssertionContext(context) {
return isTypeArgumentOrParameterOrAssertion(context.currentTokenSpan, context.currentTokenParent) || isTypeArgumentOrParameterOrAssertion(context.nextTokenSpan, context.nextTokenParent);
}
function isTypeAssertionContext(context) {
return context.contextNode.kind === 215 /* TypeAssertionExpression */;
}
function isNonTypeAssertionContext(context) {
return !isTypeAssertionContext(context);
}
function isVoidOpContext(context) {
return context.currentTokenSpan.kind === 116 /* VoidKeyword */ && context.currentTokenParent.kind === 221 /* VoidExpression */;
}
function isYieldOrYieldStarWithOperand(context) {
return context.contextNode.kind === 228 /* YieldExpression */ && context.contextNode.expression !== void 0;
}
function isNonNullAssertionContext(context) {
return context.contextNode.kind === 234 /* NonNullExpression */;
}
function isNotStatementConditionContext(context) {
return !isStatementConditionContext(context);
}
function isStatementConditionContext(context) {
switch (context.contextNode.kind) {
case 244 /* IfStatement */:
case 247 /* ForStatement */:
case 248 /* ForInStatement */:
case 249 /* ForOfStatement */:
case 245 /* DoStatement */:
case 246 /* WhileStatement */:
return true;
default:
return false;
}
}
function isSemicolonDeletionContext(context) {
let nextTokenKind = context.nextTokenSpan.kind;
let nextTokenStart = context.nextTokenSpan.pos;
if (isTrivia(nextTokenKind)) {
const nextRealToken = context.nextTokenParent === context.currentTokenParent ? findNextToken(
context.currentTokenParent,
findAncestor(context.currentTokenParent, (a) => !a.parent),
context.sourceFile
) : context.nextTokenParent.getFirstToken(context.sourceFile);
if (!nextRealToken) {
return true;
}
nextTokenKind = nextRealToken.kind;
nextTokenStart = nextRealToken.getStart(context.sourceFile);
}
const startLine = context.sourceFile.getLineAndCharacterOfPosition(context.currentTokenSpan.pos).line;
const endLine = context.sourceFile.getLineAndCharacterOfPosition(nextTokenStart).line;
if (startLine === endLine) {
return nextTokenKind === 20 /* CloseBraceToken */ || nextTokenKind === 1 /* EndOfFileToken */;
}
if (nextTokenKind === 239 /* SemicolonClassElement */ || nextTokenKind === 27 /* SemicolonToken */) {
return false;
}
if (context.contextNode.kind === 263 /* InterfaceDeclaration */ || context.contextNode.kind === 264 /* TypeAliasDeclaration */) {
return !isPropertySignature(context.currentTokenParent) || !!context.currentTokenParent.type || nextTokenKind !== 21 /* OpenParenToken */;
}
if (isPropertyDeclaration(context.currentTokenParent)) {
return !context.currentTokenParent.initializer;
}
return context.currentTokenParent.kind !== 247 /* ForStatement */ && context.currentTokenParent.kind !== 241 /* EmptyStatement */ && context.currentTokenParent.kind !== 239 /* SemicolonClassElement */ && nextTokenKind !== 23 /* OpenBracketToken */ && nextTokenKind !== 21 /* OpenParenToken */ && nextTokenKind !== 40 /* PlusToken */ && nextTokenKind !== 41 /* MinusToken */ && nextTokenKind !== 44 /* SlashToken */ && nextTokenKind !== 14 /* RegularExpressionLiteral */ && nextTokenKind !== 28 /* CommaToken */ && nextTokenKind !== 227 /* TemplateExpression */ && nextTokenKind !== 16 /* TemplateHead */ && nextTokenKind !== 15 /* NoSubstitutionTemplateLiteral */ && nextTokenKind !== 25 /* DotToken */;
}
function isSemicolonInsertionContext(context) {
return positionIsASICandidate(context.currentTokenSpan.end, context.currentTokenParent, context.sourceFile);
}
function isNotPropertyAccessOnIntegerLiteral(context) {
return !isPropertyAccessExpression(context.contextNode) || !isNumericLiteral(context.contextNode.expression) || context.contextNode.expression.getText().indexOf(".") !== -1;
}
// src/services/formatting/rulesMap.ts
function getFormatContext(options, host) {
return { options, getRules: getRulesMap(), host };
}
var rulesMapCache;
function getRulesMap() {
if (rulesMapCache === void 0) {
rulesMapCache = createRulesMap(getAllRules());
}
return rulesMapCache;
}
function getRuleActionExclusion(ruleAction) {
let mask2 = 0 /* None */;
if (ruleAction & 1 /* StopProcessingSpaceActions */) {
mask2 |= 28 /* ModifySpaceAction */;
}
if (ruleAction & 2 /* StopProcessingTokenActions */) {
mask2 |= 96 /* ModifyTokenAction */;
}
if (ruleAction & 28 /* ModifySpaceAction */) {
mask2 |= 28 /* ModifySpaceAction */;
}
if (ruleAction & 96 /* ModifyTokenAction */) {
mask2 |= 96 /* ModifyTokenAction */;
}
return mask2;
}
function createRulesMap(rules) {
const map2 = buildMap(rules);
return (context) => {
const bucket = map2[getRuleBucketIndex(context.currentTokenSpan.kind, context.nextTokenSpan.kind)];
if (bucket) {
const rules2 = [];
let ruleActionMask = 0;
for (const rule2 of bucket) {
const acceptRuleActions = ~getRuleActionExclusion(ruleActionMask);
if (rule2.action & acceptRuleActions && every(rule2.context, (c) => c(context))) {
rules2.push(rule2);
ruleActionMask |= rule2.action;
}
}
if (rules2.length) {
return rules2;
}
}
};
}
function buildMap(rules) {
const map2 = new Array(mapRowLength * mapRowLength);
const rulesBucketConstructionStateList = new Array(map2.length);
for (const rule2 of rules) {
const specificRule = rule2.leftTokenRange.isSpecific && rule2.rightTokenRange.isSpecific;
for (const left of rule2.leftTokenRange.tokens) {
for (const right of rule2.rightTokenRange.tokens) {
const index = getRuleBucketIndex(left, right);
let rulesBucket = map2[index];
if (rulesBucket === void 0) {
rulesBucket = map2[index] = [];
}
addRule(rulesBucket, rule2.rule, specificRule, rulesBucketConstructionStateList, index);
}
}
}
return map2;
}
function getRuleBucketIndex(row, column) {
Debug.assert(row <= 164 /* LastKeyword */ && column <= 164 /* LastKeyword */, "Must compute formatting context from tokens");
return row * mapRowLength + column;
}
var maskBitSize = 5;
var mask = 31;
var mapRowLength = 164 /* LastToken */ + 1;
var RulesPosition = ((RulesPosition2) => {
RulesPosition2[RulesPosition2["StopRulesSpecific"] = 0] = "StopRulesSpecific";
RulesPosition2[RulesPosition2["StopRulesAny"] = maskBitSize * 1] = "StopRulesAny";
RulesPosition2[RulesPosition2["ContextRulesSpecific"] = maskBitSize * 2] = "ContextRulesSpecific";
RulesPosition2[RulesPosition2["ContextRulesAny"] = maskBitSize * 3] = "ContextRulesAny";
RulesPosition2[RulesPosition2["NoContextRulesSpecific"] = maskBitSize * 4] = "NoContextRulesSpecific";
RulesPosition2[RulesPosition2["NoContextRulesAny"] = maskBitSize * 5] = "NoContextRulesAny";
return RulesPosition2;
})(RulesPosition || {});
function addRule(rules, rule2, specificTokens, constructionState, rulesBucketIndex) {
const position = rule2.action & 3 /* StopAction */ ? specificTokens ? 0 /* StopRulesSpecific */ : RulesPosition.StopRulesAny : rule2.context !== anyContext ? specificTokens ? RulesPosition.ContextRulesSpecific : RulesPosition.ContextRulesAny : specificTokens ? RulesPosition.NoContextRulesSpecific : RulesPosition.NoContextRulesAny;
const state = constructionState[rulesBucketIndex] || 0;
rules.splice(getInsertionIndex(state, position), 0, rule2);
constructionState[rulesBucketIndex] = increaseInsertionIndex(state, position);
}
function getInsertionIndex(indexBitmap, maskPosition) {
let index = 0;
for (let pos = 0; pos <= maskPosition; pos += maskBitSize) {
index += indexBitmap & mask;
indexBitmap >>= maskBitSize;
}
return index;
}
function increaseInsertionIndex(indexBitmap, maskPosition) {
const value = (indexBitmap >> maskPosition & mask) + 1;
Debug.assert((value & mask) === value, "Adding more rules into the sub-bucket than allowed. Maximum allowed is 32 rules.");
return indexBitmap & ~(mask << maskPosition) | value << maskPosition;
}
// src/services/formatting/formatting.ts
function createTextRangeWithKind(pos, end, kind) {
const textRangeWithKind = { pos, end, kind };
if (Debug.isDebugging) {
Object.defineProperty(textRangeWithKind, "__debugKind", {
get: () => Debug.formatSyntaxKind(kind)
});
}
return textRangeWithKind;
}
function formatOnEnter(position, sourceFile, formatContext) {
const line = sourceFile.getLineAndCharacterOfPosition(position).line;
if (line === 0) {
return [];
}
let endOfFormatSpan = getEndLinePosition(line, sourceFile);
while (isWhiteSpaceSingleLine(sourceFile.text.charCodeAt(endOfFormatSpan))) {
endOfFormatSpan--;
}
if (isLineBreak(sourceFile.text.charCodeAt(endOfFormatSpan))) {
endOfFormatSpan--;
}
const span = {
// get start position for the previous line
pos: getStartPositionOfLine(line - 1, sourceFile),
// end value is exclusive so add 1 to the result
end: endOfFormatSpan + 1
};
return formatSpan(span, sourceFile, formatContext, 2 /* FormatOnEnter */);
}
function formatOnSemicolon(position, sourceFile, formatContext) {
const semicolon = findImmediatelyPrecedingTokenOfKind(position, 27 /* SemicolonToken */, sourceFile);
return formatNodeLines(findOutermostNodeWithinListLevel(semicolon), sourceFile, formatContext, 3 /* FormatOnSemicolon */);
}
function formatOnOpeningCurly(position, sourceFile, formatContext) {
const openingCurly = findImmediatelyPrecedingTokenOfKind(position, 19 /* OpenBraceToken */, sourceFile);
if (!openingCurly) {
return [];
}
const curlyBraceRange = openingCurly.parent;
const outermostNode = findOutermostNodeWithinListLevel(curlyBraceRange);
const textRange = {
pos: getLineStartPositionForPosition(outermostNode.getStart(sourceFile), sourceFile),
// TODO: GH#18217
end: position
};
return formatSpan(textRange, sourceFile, formatContext, 4 /* FormatOnOpeningCurlyBrace */);
}
function formatOnClosingCurly(position, sourceFile, formatContext) {
const precedingToken = findImmediatelyPrecedingTokenOfKind(position, 20 /* CloseBraceToken */, sourceFile);
return formatNodeLines(findOutermostNodeWithinListLevel(precedingToken), sourceFile, formatContext, 5 /* FormatOnClosingCurlyBrace */);
}
function formatDocument(sourceFile, formatContext) {
const span = {
pos: 0,
end: sourceFile.text.length
};
return formatSpan(span, sourceFile, formatContext, 0 /* FormatDocument */);
}
function formatSelection(start2, end, sourceFile, formatContext) {
const span = {
pos: getLineStartPositionForPosition(start2, sourceFile),
end
};
return formatSpan(span, sourceFile, formatContext, 1 /* FormatSelection */);
}
function findImmediatelyPrecedingTokenOfKind(end, expectedTokenKind, sourceFile) {
const precedingToken = findPrecedingToken(end, sourceFile);
return precedingToken && precedingToken.kind === expectedTokenKind && end === precedingToken.getEnd() ? precedingToken : void 0;
}
function findOutermostNodeWithinListLevel(node) {
let current = node;
while (current && current.parent && current.parent.end === node.end && !isListElement(current.parent, current)) {
current = current.parent;
}
return current;
}
function isListElement(parent2, node) {
switch (parent2.kind) {
case 262 /* ClassDeclaration */:
case 263 /* InterfaceDeclaration */:
return rangeContainsRange(parent2.members, node);
case 266 /* ModuleDeclaration */:
const body = parent2.body;
return !!body && body.kind === 267 /* ModuleBlock */ && rangeContainsRange(body.statements, node);
case 311 /* SourceFile */:
case 240 /* Block */:
case 267 /* ModuleBlock */:
return rangeContainsRange(parent2.statements, node);
case 298 /* CatchClause */:
return rangeContainsRange(parent2.block.statements, node);
}
return false;
}
function findEnclosingNode(range, sourceFile) {
return find2(sourceFile);
function find2(n) {
const candidate = forEachChild(n, (c) => startEndContainsRange(c.getStart(sourceFile), c.end, range) && c);
if (candidate) {
const result = find2(candidate);
if (result) {
return result;
}
}
return n;
}
}
function prepareRangeContainsErrorFunction(errors, originalRange) {
if (!errors.length) {
return rangeHasNoErrors;
}
const sorted = errors.filter((d) => rangeOverlapsWithStartEnd(originalRange, d.start, d.start + d.length)).sort((e1, e2) => e1.start - e2.start);
if (!sorted.length) {
return rangeHasNoErrors;
}
let index = 0;
return (r) => {
while (true) {
if (index >= sorted.length) {
return false;
}
const error = sorted[index];
if (r.end <= error.start) {
return false;
}
if (startEndOverlapsWithStartEnd(r.pos, r.end, error.start, error.start + error.length)) {
return true;
}
index++;
}
};
function rangeHasNoErrors() {
return false;
}
}
function getScanStartPosition(enclosingNode, originalRange, sourceFile) {
const start2 = enclosingNode.getStart(sourceFile);
if (start2 === originalRange.pos && enclosingNode.end === originalRange.end) {
return start2;
}
const precedingToken = findPrecedingToken(originalRange.pos, sourceFile);
if (!precedingToken) {
return enclosingNode.pos;
}
if (precedingToken.end >= originalRange.pos) {
return enclosingNode.pos;
}
return precedingToken.end;
}
function getOwnOrInheritedDelta(n, options, sourceFile) {
let previousLine = -1 /* Unknown */;
let child;
while (n) {
const line = sourceFile.getLineAndCharacterOfPosition(n.getStart(sourceFile)).line;
if (previousLine !== -1 /* Unknown */ && line !== previousLine) {
break;
}
if (SmartIndenter.shouldIndentChildNode(options, n, child, sourceFile)) {
return options.indentSize;
}
previousLine = line;
child = n;
n = n.parent;
}
return 0;
}
function formatNodeGivenIndentation(node, sourceFileLike, languageVariant, initialIndentation, delta, formatContext) {
const range = { pos: node.pos, end: node.end };
return getFormattingScanner(sourceFileLike.text, languageVariant, range.pos, range.end, (scanner2) => formatSpanWorker(
range,
node,
initialIndentation,
delta,
scanner2,
formatContext,
1 /* FormatSelection */,
(_) => false,
// assume that node does not have any errors
sourceFileLike
));
}
function formatNodeLines(node, sourceFile, formatContext, requestKind) {
if (!node) {
return [];
}
const span = {
pos: getLineStartPositionForPosition(node.getStart(sourceFile), sourceFile),
end: node.end
};
return formatSpan(span, sourceFile, formatContext, requestKind);
}
function formatSpan(originalRange, sourceFile, formatContext, requestKind) {
const enclosingNode = findEnclosingNode(originalRange, sourceFile);
return getFormattingScanner(
sourceFile.text,
sourceFile.languageVariant,
getScanStartPosition(enclosingNode, originalRange, sourceFile),
originalRange.end,
(scanner2) => formatSpanWorker(
originalRange,
enclosingNode,
SmartIndenter.getIndentationForNode(enclosingNode, originalRange, sourceFile, formatContext.options),
getOwnOrInheritedDelta(enclosingNode, formatContext.options, sourceFile),
scanner2,
formatContext,
requestKind,
prepareRangeContainsErrorFunction(sourceFile.parseDiagnostics, originalRange),
sourceFile
)
);
}
function formatSpanWorker(originalRange, enclosingNode, initialIndentation, delta, formattingScanner, { options, getRules, host }, requestKind, rangeContainsError, sourceFile) {
var _a;
const formattingContext = new FormattingContext(sourceFile, requestKind, options);
let previousRangeTriviaEnd;
let previousRange;
let previousParent;
let previousRangeStartLine;
let lastIndentedLine;
let indentationOnLastIndentedLine = -1 /* Unknown */;
const edits = [];
formattingScanner.advance();
if (formattingScanner.isOnToken()) {
const startLine = sourceFile.getLineAndCharacterOfPosition(enclosingNode.getStart(sourceFile)).line;
let undecoratedStartLine = startLine;
if (hasDecorators(enclosingNode)) {
undecoratedStartLine = sourceFile.getLineAndCharacterOfPosition(getNonDecoratorTokenPosOfNode(enclosingNode, sourceFile)).line;
}
processNode(enclosingNode, enclosingNode, startLine, undecoratedStartLine, initialIndentation, delta);
}
if (!formattingScanner.isOnToken()) {
const indentation = SmartIndenter.nodeWillIndentChild(
options,
enclosingNode,
/*child*/
void 0,
sourceFile,
/*indentByDefault*/
false
) ? initialIndentation + options.indentSize : initialIndentation;
const leadingTrivia = formattingScanner.getCurrentLeadingTrivia();
if (leadingTrivia) {
indentTriviaItems(
leadingTrivia,
indentation,
/*indentNextTokenOrTrivia*/
false,
(item) => processRange(
item,
sourceFile.getLineAndCharacterOfPosition(item.pos),
enclosingNode,
enclosingNode,
/*dynamicIndentation*/
void 0
)
);
if (options.trimTrailingWhitespace !== false) {
trimTrailingWhitespacesForRemainingRange(leadingTrivia);
}
}
}
if (previousRange && formattingScanner.getTokenFullStart() >= originalRange.end) {
const tokenInfo = formattingScanner.isOnEOF() ? formattingScanner.readEOFTokenRange() : formattingScanner.isOnToken() ? formattingScanner.readTokenInfo(enclosingNode).token : void 0;
if (tokenInfo && tokenInfo.pos === previousRangeTriviaEnd) {
const parent2 = ((_a = findPrecedingToken(tokenInfo.end, sourceFile, enclosingNode)) == null ? void 0 : _a.parent) || previousParent;
processPair(
tokenInfo,
sourceFile.getLineAndCharacterOfPosition(tokenInfo.pos).line,
parent2,
previousRange,
previousRangeStartLine,
previousParent,
parent2,
/*dynamicIndentation*/
void 0
);
}
}
return edits;
function tryComputeIndentationForListItem(startPos, endPos, parentStartLine, range, inheritedIndentation) {
if (rangeOverlapsWithStartEnd(range, startPos, endPos) || rangeContainsStartEnd(range, startPos, endPos)) {
if (inheritedIndentation !== -1 /* Unknown */) {
return inheritedIndentation;
}
} else {
const startLine = sourceFile.getLineAndCharacterOfPosition(startPos).line;
const startLinePosition = getLineStartPositionForPosition(startPos, sourceFile);
const column = SmartIndenter.findFirstNonWhitespaceColumn(startLinePosition, startPos, sourceFile, options);
if (startLine !== parentStartLine || startPos === column) {
const baseIndentSize = SmartIndenter.getBaseIndentation(options);
return baseIndentSize > column ? baseIndentSize : column;
}
}
return -1 /* Unknown */;
}
function computeIndentation(node, startLine, inheritedIndentation, parent2, parentDynamicIndentation, effectiveParentStartLine) {
const delta2 = SmartIndenter.shouldIndentChildNode(options, node) ? options.indentSize : 0;
if (effectiveParentStartLine === startLine) {
return {
indentation: startLine === lastIndentedLine ? indentationOnLastIndentedLine : parentDynamicIndentation.getIndentation(),
delta: Math.min(options.indentSize, parentDynamicIndentation.getDelta(node) + delta2)
};
} else if (inheritedIndentation === -1 /* Unknown */) {
if (node.kind === 21 /* OpenParenToken */ && startLine === lastIndentedLine) {
return { indentation: indentationOnLastIndentedLine, delta: parentDynamicIndentation.getDelta(node) };
} else if (SmartIndenter.childStartsOnTheSameLineWithElseInIfStatement(parent2, node, startLine, sourceFile) || SmartIndenter.childIsUnindentedBranchOfConditionalExpression(parent2, node, startLine, sourceFile) || SmartIndenter.argumentStartsOnSameLineAsPreviousArgument(parent2, node, startLine, sourceFile)) {
return { indentation: parentDynamicIndentation.getIndentation(), delta: delta2 };
} else {
return { indentation: parentDynamicIndentation.getIndentation() + parentDynamicIndentation.getDelta(node), delta: delta2 };
}
} else {
return { indentation: inheritedIndentation, delta: delta2 };
}
}
function getFirstNonDecoratorTokenOfNode(node) {
if (canHaveModifiers(node)) {
const modifier = find(node.modifiers, isModifier, findIndex(node.modifiers, isDecorator));
if (modifier)
return modifier.kind;
}
switch (node.kind) {
case 262 /* ClassDeclaration */:
return 86 /* ClassKeyword */;
case 263 /* InterfaceDeclaration */:
return 120 /* InterfaceKeyword */;
case 261 /* FunctionDeclaration */:
return 100 /* FunctionKeyword */;
case 265 /* EnumDeclaration */:
return 265 /* EnumDeclaration */;
case 176 /* GetAccessor */:
return 139 /* GetKeyword */;
case 177 /* SetAccessor */:
return 153 /* SetKeyword */;
case 173 /* MethodDeclaration */:
if (node.asteriskToken) {
return 42 /* AsteriskToken */;
}
case 171 /* PropertyDeclaration */:
case 168 /* Parameter */:
const name = getNameOfDeclaration(node);
if (name) {
return name.kind;
}
}
}
function getDynamicIndentation(node, nodeStartLine, indentation, delta2) {
return {
getIndentationForComment: (kind, tokenIndentation, container) => {
switch (kind) {
case 20 /* CloseBraceToken */:
case 24 /* CloseBracketToken */:
case 22 /* CloseParenToken */:
return indentation + getDelta(container);
}
return tokenIndentation !== -1 /* Unknown */ ? tokenIndentation : indentation;
},
// if list end token is LessThanToken '>' then its delta should be explicitly suppressed
// so that LessThanToken as a binary operator can still be indented.
// foo.then
// <
// number,
// string,
// >();
// vs
// var a = xValue
// > yValue;
getIndentationForToken: (line, kind, container, suppressDelta) => !suppressDelta && shouldAddDelta(line, kind, container) ? indentation + getDelta(container) : indentation,
getIndentation: () => indentation,
getDelta,
recomputeIndentation: (lineAdded, parent2) => {
if (SmartIndenter.shouldIndentChildNode(options, parent2, node, sourceFile)) {
indentation += lineAdded ? options.indentSize : -options.indentSize;
delta2 = SmartIndenter.shouldIndentChildNode(options, node) ? options.indentSize : 0;
}
}
};
function shouldAddDelta(line, kind, container) {
switch (kind) {
case 19 /* OpenBraceToken */:
case 20 /* CloseBraceToken */:
case 22 /* CloseParenToken */:
case 93 /* ElseKeyword */:
case 117 /* WhileKeyword */:
case 60 /* AtToken */:
return false;
case 44 /* SlashToken */:
case 32 /* GreaterThanToken */:
switch (container.kind) {
case 285 /* JsxOpeningElement */:
case 286 /* JsxClosingElement */:
case 284 /* JsxSelfClosingElement */:
return false;
}
break;
case 23 /* OpenBracketToken */:
case 24 /* CloseBracketToken */:
if (container.kind !== 199 /* MappedType */) {
return false;
}
break;
}
return nodeStartLine !== line && !(hasDecorators(node) && kind === getFirstNonDecoratorTokenOfNode(node));
}
function getDelta(child) {
return SmartIndenter.nodeWillIndentChild(
options,
node,
child,
sourceFile,
/*indentByDefault*/
true
) ? delta2 : 0;
}
}
function processNode(node, contextNode, nodeStartLine, undecoratedNodeStartLine, indentation, delta2) {
if (!rangeOverlapsWithStartEnd(originalRange, node.getStart(sourceFile), node.getEnd())) {
return;
}
const nodeDynamicIndentation = getDynamicIndentation(node, nodeStartLine, indentation, delta2);
let childContextNode = contextNode;
forEachChild(
node,
(child) => {
processChildNode(
child,
/*inheritedIndentation*/
-1 /* Unknown */,
node,
nodeDynamicIndentation,
nodeStartLine,
undecoratedNodeStartLine,
/*isListItem*/
false
);
},
(nodes) => {
processChildNodes(nodes, node, nodeStartLine, nodeDynamicIndentation);
}
);
while (formattingScanner.isOnToken() && formattingScanner.getTokenFullStart() < originalRange.end) {
const tokenInfo = formattingScanner.readTokenInfo(node);
if (tokenInfo.token.end > Math.min(node.end, originalRange.end)) {
break;
}
consumeTokenAndAdvanceScanner(tokenInfo, node, nodeDynamicIndentation, node);
}
function processChildNode(child, inheritedIndentation, parent2, parentDynamicIndentation, parentStartLine, undecoratedParentStartLine, isListItem, isFirstListItem) {
Debug.assert(!nodeIsSynthesized(child));
if (nodeIsMissing(child) || isGrammarError(parent2, child)) {
return inheritedIndentation;
}
const childStartPos = child.getStart(sourceFile);
const childStartLine = sourceFile.getLineAndCharacterOfPosition(childStartPos).line;
let undecoratedChildStartLine = childStartLine;
if (hasDecorators(child)) {
undecoratedChildStartLine = sourceFile.getLineAndCharacterOfPosition(getNonDecoratorTokenPosOfNode(child, sourceFile)).line;
}
let childIndentationAmount = -1 /* Unknown */;
if (isListItem && rangeContainsRange(originalRange, parent2)) {
childIndentationAmount = tryComputeIndentationForListItem(childStartPos, child.end, parentStartLine, originalRange, inheritedIndentation);
if (childIndentationAmount !== -1 /* Unknown */) {
inheritedIndentation = childIndentationAmount;
}
}
if (!rangeOverlapsWithStartEnd(originalRange, child.pos, child.end)) {
if (child.end < originalRange.pos) {
formattingScanner.skipToEndOf(child);
}
return inheritedIndentation;
}
if (child.getFullWidth() === 0) {
return inheritedIndentation;
}
while (formattingScanner.isOnToken() && formattingScanner.getTokenFullStart() < originalRange.end) {
const tokenInfo = formattingScanner.readTokenInfo(node);
if (tokenInfo.token.end > originalRange.end) {
return inheritedIndentation;
}
if (tokenInfo.token.end > childStartPos) {
if (tokenInfo.token.pos > childStartPos) {
formattingScanner.skipToStartOf(child);
}
break;
}
consumeTokenAndAdvanceScanner(tokenInfo, node, parentDynamicIndentation, node);
}
if (!formattingScanner.isOnToken() || formattingScanner.getTokenFullStart() >= originalRange.end) {
return inheritedIndentation;
}
if (isToken(child)) {
const tokenInfo = formattingScanner.readTokenInfo(child);
if (child.kind !== 12 /* JsxText */) {
Debug.assert(tokenInfo.token.end === child.end, "Token end is child end");
consumeTokenAndAdvanceScanner(tokenInfo, node, parentDynamicIndentation, child);
return inheritedIndentation;
}
}
const effectiveParentStartLine = child.kind === 169 /* Decorator */ ? childStartLine : undecoratedParentStartLine;
const childIndentation = computeIndentation(child, childStartLine, childIndentationAmount, node, parentDynamicIndentation, effectiveParentStartLine);
processNode(child, childContextNode, childStartLine, undecoratedChildStartLine, childIndentation.indentation, childIndentation.delta);
childContextNode = node;
if (isFirstListItem && parent2.kind === 208 /* ArrayLiteralExpression */ && inheritedIndentation === -1 /* Unknown */) {
inheritedIndentation = childIndentation.indentation;
}
return inheritedIndentation;
}
function processChildNodes(nodes, parent2, parentStartLine, parentDynamicIndentation) {
Debug.assert(isNodeArray(nodes));
Debug.assert(!nodeIsSynthesized(nodes));
const listStartToken = getOpenTokenForList(parent2, nodes);
let listDynamicIndentation = parentDynamicIndentation;
let startLine = parentStartLine;
if (!rangeOverlapsWithStartEnd(originalRange, nodes.pos, nodes.end)) {
if (nodes.end < originalRange.pos) {
formattingScanner.skipToEndOf(nodes);
}
return;
}
if (listStartToken !== 0 /* Unknown */) {
while (formattingScanner.isOnToken() && formattingScanner.getTokenFullStart() < originalRange.end) {
const tokenInfo = formattingScanner.readTokenInfo(parent2);
if (tokenInfo.token.end > nodes.pos) {
break;
} else if (tokenInfo.token.kind === listStartToken) {
startLine = sourceFile.getLineAndCharacterOfPosition(tokenInfo.token.pos).line;
consumeTokenAndAdvanceScanner(tokenInfo, parent2, parentDynamicIndentation, parent2);
let indentationOnListStartToken;
if (indentationOnLastIndentedLine !== -1 /* Unknown */) {
indentationOnListStartToken = indentationOnLastIndentedLine;
} else {
const startLinePosition = getLineStartPositionForPosition(tokenInfo.token.pos, sourceFile);
indentationOnListStartToken = SmartIndenter.findFirstNonWhitespaceColumn(startLinePosition, tokenInfo.token.pos, sourceFile, options);
}
listDynamicIndentation = getDynamicIndentation(parent2, parentStartLine, indentationOnListStartToken, options.indentSize);
} else {
consumeTokenAndAdvanceScanner(tokenInfo, parent2, parentDynamicIndentation, parent2);
}
}
}
let inheritedIndentation = -1 /* Unknown */;
for (let i = 0; i < nodes.length; i++) {
const child = nodes[i];
inheritedIndentation = processChildNode(
child,
inheritedIndentation,
node,
listDynamicIndentation,
startLine,
startLine,
/*isListItem*/
true,
/*isFirstListItem*/
i === 0
);
}
const listEndToken = getCloseTokenForOpenToken(listStartToken);
if (listEndToken !== 0 /* Unknown */ && formattingScanner.isOnToken() && formattingScanner.getTokenFullStart() < originalRange.end) {
let tokenInfo = formattingScanner.readTokenInfo(parent2);
if (tokenInfo.token.kind === 28 /* CommaToken */) {
consumeTokenAndAdvanceScanner(tokenInfo, parent2, listDynamicIndentation, parent2);
tokenInfo = formattingScanner.isOnToken() ? formattingScanner.readTokenInfo(parent2) : void 0;
}
if (tokenInfo && tokenInfo.token.kind === listEndToken && rangeContainsRange(parent2, tokenInfo.token)) {
consumeTokenAndAdvanceScanner(
tokenInfo,
parent2,
listDynamicIndentation,
parent2,
/*isListEndToken*/
true
);
}
}
}
function consumeTokenAndAdvanceScanner(currentTokenInfo, parent2, dynamicIndentation, container, isListEndToken) {
Debug.assert(rangeContainsRange(parent2, currentTokenInfo.token));
const lastTriviaWasNewLine = formattingScanner.lastTrailingTriviaWasNewLine();
let indentToken = false;
if (currentTokenInfo.leadingTrivia) {
processTrivia(currentTokenInfo.leadingTrivia, parent2, childContextNode, dynamicIndentation);
}
let lineAction = 0 /* None */;
const isTokenInRange = rangeContainsRange(originalRange, currentTokenInfo.token);
const tokenStart = sourceFile.getLineAndCharacterOfPosition(currentTokenInfo.token.pos);
if (isTokenInRange) {
const rangeHasError = rangeContainsError(currentTokenInfo.token);
const savePreviousRange = previousRange;
lineAction = processRange(currentTokenInfo.token, tokenStart, parent2, childContextNode, dynamicIndentation);
if (!rangeHasError) {
if (lineAction === 0 /* None */) {
const prevEndLine = savePreviousRange && sourceFile.getLineAndCharacterOfPosition(savePreviousRange.end).line;
indentToken = lastTriviaWasNewLine && tokenStart.line !== prevEndLine;
} else {
indentToken = lineAction === 1 /* LineAdded */;
}
}
}
if (currentTokenInfo.trailingTrivia) {
previousRangeTriviaEnd = last(currentTokenInfo.trailingTrivia).end;
processTrivia(currentTokenInfo.trailingTrivia, parent2, childContextNode, dynamicIndentation);
}
if (indentToken) {
const tokenIndentation = isTokenInRange && !rangeContainsError(currentTokenInfo.token) ? dynamicIndentation.getIndentationForToken(tokenStart.line, currentTokenInfo.token.kind, container, !!isListEndToken) : -1 /* Unknown */;
let indentNextTokenOrTrivia = true;
if (currentTokenInfo.leadingTrivia) {
const commentIndentation = dynamicIndentation.getIndentationForComment(currentTokenInfo.token.kind, tokenIndentation, container);
indentNextTokenOrTrivia = indentTriviaItems(
currentTokenInfo.leadingTrivia,
commentIndentation,
indentNextTokenOrTrivia,
(item) => insertIndentation(
item.pos,
commentIndentation,
/*lineAdded*/
false
)
);
}
if (tokenIndentation !== -1 /* Unknown */ && indentNextTokenOrTrivia) {
insertIndentation(currentTokenInfo.token.pos, tokenIndentation, lineAction === 1 /* LineAdded */);
lastIndentedLine = tokenStart.line;
indentationOnLastIndentedLine = tokenIndentation;
}
}
formattingScanner.advance();
childContextNode = parent2;
}
}
function indentTriviaItems(trivia, commentIndentation, indentNextTokenOrTrivia, indentSingleLine) {
for (const triviaItem of trivia) {
const triviaInRange = rangeContainsRange(originalRange, triviaItem);
switch (triviaItem.kind) {
case 3 /* MultiLineCommentTrivia */:
if (triviaInRange) {
indentMultilineComment(
triviaItem,
commentIndentation,
/*firstLineIsIndented*/
!indentNextTokenOrTrivia
);
}
indentNextTokenOrTrivia = false;
break;
case 2 /* SingleLineCommentTrivia */:
if (indentNextTokenOrTrivia && triviaInRange) {
indentSingleLine(triviaItem);
}
indentNextTokenOrTrivia = false;
break;
case 4 /* NewLineTrivia */:
indentNextTokenOrTrivia = true;
break;
}
}
return indentNextTokenOrTrivia;
}
function processTrivia(trivia, parent2, contextNode, dynamicIndentation) {
for (const triviaItem of trivia) {
if (isComment(triviaItem.kind) && rangeContainsRange(originalRange, triviaItem)) {
const triviaItemStart = sourceFile.getLineAndCharacterOfPosition(triviaItem.pos);
processRange(triviaItem, triviaItemStart, parent2, contextNode, dynamicIndentation);
}
}
}
function processRange(range, rangeStart, parent2, contextNode, dynamicIndentation) {
const rangeHasError = rangeContainsError(range);
let lineAction = 0 /* None */;
if (!rangeHasError) {
if (!previousRange) {
const originalStart = sourceFile.getLineAndCharacterOfPosition(originalRange.pos);
trimTrailingWhitespacesForLines(originalStart.line, rangeStart.line);
} else {
lineAction = processPair(range, rangeStart.line, parent2, previousRange, previousRangeStartLine, previousParent, contextNode, dynamicIndentation);
}
}
previousRange = range;
previousRangeTriviaEnd = range.end;
previousParent = parent2;
previousRangeStartLine = rangeStart.line;
return lineAction;
}
function processPair(currentItem, currentStartLine, currentParent, previousItem, previousStartLine, previousParent2, contextNode, dynamicIndentation) {
formattingContext.updateContext(previousItem, previousParent2, currentItem, currentParent, contextNode);
const rules = getRules(formattingContext);
let trimTrailingWhitespaces = formattingContext.options.trimTrailingWhitespace !== false;
let lineAction = 0 /* None */;
if (rules) {
forEachRight(rules, (rule2) => {
lineAction = applyRuleEdits(rule2, previousItem, previousStartLine, currentItem, currentStartLine);
if (dynamicIndentation) {
switch (lineAction) {
case 2 /* LineRemoved */:
if (currentParent.getStart(sourceFile) === currentItem.pos) {
dynamicIndentation.recomputeIndentation(
/*lineAddedByFormatting*/
false,
contextNode
);
}
break;
case 1 /* LineAdded */:
if (currentParent.getStart(sourceFile) === currentItem.pos) {
dynamicIndentation.recomputeIndentation(
/*lineAddedByFormatting*/
true,
contextNode
);
}
break;
default:
Debug.assert(lineAction === 0 /* None */);
}
}
trimTrailingWhitespaces = trimTrailingWhitespaces && !(rule2.action & 16 /* DeleteSpace */) && rule2.flags !== 1 /* CanDeleteNewLines */;
});
} else {
trimTrailingWhitespaces = trimTrailingWhitespaces && currentItem.kind !== 1 /* EndOfFileToken */;
}
if (currentStartLine !== previousStartLine && trimTrailingWhitespaces) {
trimTrailingWhitespacesForLines(previousStartLine, currentStartLine, previousItem);
}
return lineAction;
}
function insertIndentation(pos, indentation, lineAdded) {
const indentationString = getIndentationString(indentation, options);
if (lineAdded) {
recordReplace(pos, 0, indentationString);
} else {
const tokenStart = sourceFile.getLineAndCharacterOfPosition(pos);
const startLinePosition = getStartPositionOfLine(tokenStart.line, sourceFile);
if (indentation !== characterToColumn(startLinePosition, tokenStart.character) || indentationIsDifferent(indentationString, startLinePosition)) {
recordReplace(startLinePosition, tokenStart.character, indentationString);
}
}
}
function characterToColumn(startLinePosition, characterInLine) {
let column = 0;
for (let i = 0; i < characterInLine; i++) {
if (sourceFile.text.charCodeAt(startLinePosition + i) === 9 /* tab */) {
column += options.tabSize - column % options.tabSize;
} else {
column++;
}
}
return column;
}
function indentationIsDifferent(indentationString, startLinePosition) {
return indentationString !== sourceFile.text.substr(startLinePosition, indentationString.length);
}
function indentMultilineComment(commentRange, indentation, firstLineIsIndented, indentFinalLine = true) {
let startLine = sourceFile.getLineAndCharacterOfPosition(commentRange.pos).line;
const endLine = sourceFile.getLineAndCharacterOfPosition(commentRange.end).line;
if (startLine === endLine) {
if (!firstLineIsIndented) {
insertIndentation(
commentRange.pos,
indentation,
/*lineAdded*/
false
);
}
return;
}
const parts = [];
let startPos = commentRange.pos;
for (let line = startLine; line < endLine; line++) {
const endOfLine = getEndLinePosition(line, sourceFile);
parts.push({ pos: startPos, end: endOfLine });
startPos = getStartPositionOfLine(line + 1, sourceFile);
}
if (indentFinalLine) {
parts.push({ pos: startPos, end: commentRange.end });
}
if (parts.length === 0)
return;
const startLinePos = getStartPositionOfLine(startLine, sourceFile);
const nonWhitespaceColumnInFirstPart = SmartIndenter.findFirstNonWhitespaceCharacterAndColumn(startLinePos, parts[0].pos, sourceFile, options);
let startIndex = 0;
if (firstLineIsIndented) {
startIndex = 1;
startLine++;
}
const delta2 = indentation - nonWhitespaceColumnInFirstPart.column;
for (let i = startIndex; i < parts.length; i++, startLine++) {
const startLinePos2 = getStartPositionOfLine(startLine, sourceFile);
const nonWhitespaceCharacterAndColumn = i === 0 ? nonWhitespaceColumnInFirstPart : SmartIndenter.findFirstNonWhitespaceCharacterAndColumn(parts[i].pos, parts[i].end, sourceFile, options);
const newIndentation = nonWhitespaceCharacterAndColumn.column + delta2;
if (newIndentation > 0) {
const indentationString = getIndentationString(newIndentation, options);
recordReplace(startLinePos2, nonWhitespaceCharacterAndColumn.character, indentationString);
} else {
recordDelete(startLinePos2, nonWhitespaceCharacterAndColumn.character);
}
}
}
function trimTrailingWhitespacesForLines(line1, line2, range) {
for (let line = line1; line < line2; line++) {
const lineStartPosition = getStartPositionOfLine(line, sourceFile);
const lineEndPosition = getEndLinePosition(line, sourceFile);
if (range && (isComment(range.kind) || isStringOrRegularExpressionOrTemplateLiteral(range.kind)) && range.pos <= lineEndPosition && range.end > lineEndPosition) {
continue;
}
const whitespaceStart = getTrailingWhitespaceStartPosition(lineStartPosition, lineEndPosition);
if (whitespaceStart !== -1) {
Debug.assert(whitespaceStart === lineStartPosition || !isWhiteSpaceSingleLine(sourceFile.text.charCodeAt(whitespaceStart - 1)));
recordDelete(whitespaceStart, lineEndPosition + 1 - whitespaceStart);
}
}
}
function getTrailingWhitespaceStartPosition(start2, end) {
let pos = end;
while (pos >= start2 && isWhiteSpaceSingleLine(sourceFile.text.charCodeAt(pos))) {
pos--;
}
if (pos !== end) {
return pos + 1;
}
return -1;
}
function trimTrailingWhitespacesForRemainingRange(trivias) {
let startPos = previousRange ? previousRange.end : originalRange.pos;
for (const trivia of trivias) {
if (isComment(trivia.kind)) {
if (startPos < trivia.pos) {
trimTrailingWitespacesForPositions(startPos, trivia.pos - 1, previousRange);
}
startPos = trivia.end + 1;
}
}
if (startPos < originalRange.end) {
trimTrailingWitespacesForPositions(startPos, originalRange.end, previousRange);
}
}
function trimTrailingWitespacesForPositions(startPos, endPos, previousRange2) {
const startLine = sourceFile.getLineAndCharacterOfPosition(startPos).line;
const endLine = sourceFile.getLineAndCharacterOfPosition(endPos).line;
trimTrailingWhitespacesForLines(startLine, endLine + 1, previousRange2);
}
function recordDelete(start2, len) {
if (len) {
edits.push(createTextChangeFromStartLength(start2, len, ""));
}
}
function recordReplace(start2, len, newText) {
if (len || newText) {
edits.push(createTextChangeFromStartLength(start2, len, newText));
}
}
function recordInsert(start2, text) {
if (text) {
edits.push(createTextChangeFromStartLength(start2, 0, text));
}
}
function applyRuleEdits(rule2, previousRange2, previousStartLine, currentRange, currentStartLine) {
const onLaterLine = currentStartLine !== previousStartLine;
switch (rule2.action) {
case 1 /* StopProcessingSpaceActions */:
return 0 /* None */;
case 16 /* DeleteSpace */:
if (previousRange2.end !== currentRange.pos) {
recordDelete(previousRange2.end, currentRange.pos - previousRange2.end);
return onLaterLine ? 2 /* LineRemoved */ : 0 /* None */;
}
break;
case 32 /* DeleteToken */:
recordDelete(previousRange2.pos, previousRange2.end - previousRange2.pos);
break;
case 8 /* InsertNewLine */:
if (rule2.flags !== 1 /* CanDeleteNewLines */ && previousStartLine !== currentStartLine) {
return 0 /* None */;
}
const lineDelta = currentStartLine - previousStartLine;
if (lineDelta !== 1) {
recordReplace(previousRange2.end, currentRange.pos - previousRange2.end, getNewLineOrDefaultFromHost(host, options));
return onLaterLine ? 0 /* None */ : 1 /* LineAdded */;
}
break;
case 4 /* InsertSpace */:
if (rule2.flags !== 1 /* CanDeleteNewLines */ && previousStartLine !== currentStartLine) {
return 0 /* None */;
}
const posDelta = currentRange.pos - previousRange2.end;
if (posDelta !== 1 || sourceFile.text.charCodeAt(previousRange2.end) !== 32 /* space */) {
recordReplace(previousRange2.end, currentRange.pos - previousRange2.end, " ");
return onLaterLine ? 2 /* LineRemoved */ : 0 /* None */;
}
break;
case 64 /* InsertTrailingSemicolon */:
recordInsert(previousRange2.end, ";");
}
return 0 /* None */;
}
}
function getRangeOfEnclosingComment(sourceFile, position, precedingToken, tokenAtPosition = getTokenAtPosition(sourceFile, position)) {
const jsdoc = findAncestor(tokenAtPosition, isJSDoc);
if (jsdoc)
tokenAtPosition = jsdoc.parent;
const tokenStart = tokenAtPosition.getStart(sourceFile);
if (tokenStart <= position && position < tokenAtPosition.getEnd()) {
return void 0;
}
precedingToken = precedingToken === null ? void 0 : precedingToken === void 0 ? findPrecedingToken(position, sourceFile) : precedingToken;
const trailingRangesOfPreviousToken = precedingToken && getTrailingCommentRanges(sourceFile.text, precedingToken.end);
const leadingCommentRangesOfNextToken = getLeadingCommentRangesOfNode(tokenAtPosition, sourceFile);
const commentRanges = concatenate(trailingRangesOfPreviousToken, leadingCommentRangesOfNextToken);
return commentRanges && find(commentRanges, (range) => rangeContainsPositionExclusive(range, position) || // The end marker of a single-line comment does not include the newline character.
// With caret at `^`, in the following case, we are inside a comment (^ denotes the cursor position):
//
// // asdf ^\n
//
// But for closed multi-line comments, we don't want to be inside the comment in the following case:
//
// /* asdf */^
//
// However, unterminated multi-line comments *do* contain their end.
//
// Internally, we represent the end of the comment at the newline and closing '/', respectively.
//
position === range.end && (range.kind === 2 /* SingleLineCommentTrivia */ || position === sourceFile.getFullWidth()));
}
function getOpenTokenForList(node, list) {
switch (node.kind) {
case 175 /* Constructor */:
case 261 /* FunctionDeclaration */:
case 217 /* FunctionExpression */:
case 173 /* MethodDeclaration */:
case 172 /* MethodSignature */:
case 218 /* ArrowFunction */:
case 178 /* CallSignature */:
case 179 /* ConstructSignature */:
case 183 /* FunctionType */:
case 184 /* ConstructorType */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
if (node.typeParameters === list) {
return 30 /* LessThanToken */;
} else if (node.parameters === list) {
return 21 /* OpenParenToken */;
}
break;
case 212 /* CallExpression */:
case 213 /* NewExpression */:
if (node.typeArguments === list) {
return 30 /* LessThanToken */;
} else if (node.arguments === list) {
return 21 /* OpenParenToken */;
}
break;
case 262 /* ClassDeclaration */:
case 230 /* ClassExpression */:
case 263 /* InterfaceDeclaration */:
case 264 /* TypeAliasDeclaration */:
if (node.typeParameters === list) {
return 30 /* LessThanToken */;
}
break;
case 182 /* TypeReference */:
case 214 /* TaggedTemplateExpression */:
case 185 /* TypeQuery */:
case 232 /* ExpressionWithTypeArguments */:
case 204 /* ImportType */:
if (node.typeArguments === list) {
return 30 /* LessThanToken */;
}
break;
case 186 /* TypeLiteral */:
return 19 /* OpenBraceToken */;
}
return 0 /* Unknown */;
}
function getCloseTokenForOpenToken(kind) {
switch (kind) {
case 21 /* OpenParenToken */:
return 22 /* CloseParenToken */;
case 30 /* LessThanToken */:
return 32 /* GreaterThanToken */;
case 19 /* OpenBraceToken */:
return 20 /* CloseBraceToken */;
}
return 0 /* Unknown */;
}
var internedSizes;
var internedTabsIndentation;
var internedSpacesIndentation;
function getIndentationString(indentation, options) {
const resetInternedStrings = !internedSizes || (internedSizes.tabSize !== options.tabSize || internedSizes.indentSize !== options.indentSize);
if (resetInternedStrings) {
internedSizes = { tabSize: options.tabSize, indentSize: options.indentSize };
internedTabsIndentation = internedSpacesIndentation = void 0;
}
if (!options.convertTabsToSpaces) {
const tabs = Math.floor(indentation / options.tabSize);
const spaces = indentation - tabs * options.tabSize;
let tabString;
if (!internedTabsIndentation) {
internedTabsIndentation = [];
}
if (internedTabsIndentation[tabs] === void 0) {
internedTabsIndentation[tabs] = tabString = repeatString(" ", tabs);
} else {
tabString = internedTabsIndentation[tabs];
}
return spaces ? tabString + repeatString(" ", spaces) : tabString;
} else {
let spacesString;
const quotient = Math.floor(indentation / options.indentSize);
const remainder = indentation % options.indentSize;
if (!internedSpacesIndentation) {
internedSpacesIndentation = [];
}
if (internedSpacesIndentation[quotient] === void 0) {
spacesString = repeatString(" ", options.indentSize * quotient);
internedSpacesIndentation[quotient] = spacesString;
} else {
spacesString = internedSpacesIndentation[quotient];
}
return remainder ? spacesString + repeatString(" ", remainder) : spacesString;
}
}
// src/services/formatting/smartIndenter.ts
var SmartIndenter;
((SmartIndenter2) => {
let Value;
((Value2) => {
Value2[Value2["Unknown"] = -1] = "Unknown";
})(Value || (Value = {}));
function getIndentation(position, sourceFile, options, assumeNewLineBeforeCloseBrace = false) {
if (position > sourceFile.text.length) {
return getBaseIndentation(options);
}
if (options.indentStyle === 0 /* None */) {
return 0;
}
const precedingToken = findPrecedingToken(
position,
sourceFile,
/*startNode*/
void 0,
/*excludeJsdoc*/
true
);
const enclosingCommentRange = getRangeOfEnclosingComment(sourceFile, position, precedingToken || null);
if (enclosingCommentRange && enclosingCommentRange.kind === 3 /* MultiLineCommentTrivia */) {
return getCommentIndent(sourceFile, position, options, enclosingCommentRange);
}
if (!precedingToken) {
return getBaseIndentation(options);
}
const precedingTokenIsLiteral = isStringOrRegularExpressionOrTemplateLiteral(precedingToken.kind);
if (precedingTokenIsLiteral && precedingToken.getStart(sourceFile) <= position && position < precedingToken.end) {
return 0;
}
const lineAtPosition = sourceFile.getLineAndCharacterOfPosition(position).line;
const currentToken = getTokenAtPosition(sourceFile, position);
const isObjectLiteral = currentToken.kind === 19 /* OpenBraceToken */ && currentToken.parent.kind === 209 /* ObjectLiteralExpression */;
if (options.indentStyle === 1 /* Block */ || isObjectLiteral) {
return getBlockIndent(sourceFile, position, options);
}
if (precedingToken.kind === 28 /* CommaToken */ && precedingToken.parent.kind !== 225 /* BinaryExpression */) {
const actualIndentation = getActualIndentationForListItemBeforeComma(precedingToken, sourceFile, options);
if (actualIndentation !== -1 /* Unknown */) {
return actualIndentation;
}
}
const containerList = getListByPosition(position, precedingToken.parent, sourceFile);
if (containerList && !rangeContainsRange(containerList, precedingToken)) {
const useTheSameBaseIndentation = [217 /* FunctionExpression */, 218 /* ArrowFunction */].indexOf(currentToken.parent.kind) !== -1;
const indentSize = useTheSameBaseIndentation ? 0 : options.indentSize;
return getActualIndentationForListStartLine(containerList, sourceFile, options) + indentSize;
}
return getSmartIndent(sourceFile, position, precedingToken, lineAtPosition, assumeNewLineBeforeCloseBrace, options);
}
SmartIndenter2.getIndentation = getIndentation;
function getCommentIndent(sourceFile, position, options, enclosingCommentRange) {
const previousLine = getLineAndCharacterOfPosition(sourceFile, position).line - 1;
const commentStartLine = getLineAndCharacterOfPosition(sourceFile, enclosingCommentRange.pos).line;
Debug.assert(commentStartLine >= 0);
if (previousLine <= commentStartLine) {
return findFirstNonWhitespaceColumn(getStartPositionOfLine(commentStartLine, sourceFile), position, sourceFile, options);
}
const startPositionOfLine = getStartPositionOfLine(previousLine, sourceFile);
const { column, character } = findFirstNonWhitespaceCharacterAndColumn(startPositionOfLine, position, sourceFile, options);
if (column === 0) {
return column;
}
const firstNonWhitespaceCharacterCode = sourceFile.text.charCodeAt(startPositionOfLine + character);
return firstNonWhitespaceCharacterCode === 42 /* asterisk */ ? column - 1 : column;
}
function getBlockIndent(sourceFile, position, options) {
let current = position;
while (current > 0) {
const char = sourceFile.text.charCodeAt(current);
if (!isWhiteSpaceLike(char)) {
break;
}
current--;
}
const lineStart = getLineStartPositionForPosition(current, sourceFile);
return findFirstNonWhitespaceColumn(lineStart, current, sourceFile, options);
}
function getSmartIndent(sourceFile, position, precedingToken, lineAtPosition, assumeNewLineBeforeCloseBrace, options) {
let previous;
let current = precedingToken;
while (current) {
if (positionBelongsToNode(current, position, sourceFile) && shouldIndentChildNode(
options,
current,
previous,
sourceFile,
/*isNextChild*/
true
)) {
const currentStart = getStartLineAndCharacterForNode(current, sourceFile);
const nextTokenKind = nextTokenIsCurlyBraceOnSameLineAsCursor(precedingToken, current, lineAtPosition, sourceFile);
const indentationDelta = nextTokenKind !== 0 /* Unknown */ ? assumeNewLineBeforeCloseBrace && nextTokenKind === 2 /* CloseBrace */ ? options.indentSize : 0 : lineAtPosition !== currentStart.line ? options.indentSize : 0;
return getIndentationForNodeWorker(
current,
currentStart,
/*ignoreActualIndentationRange*/
void 0,
indentationDelta,
sourceFile,
/*isNextChild*/
true,
options
);
}
const actualIndentation = getActualIndentationForListItem(
current,
sourceFile,
options,
/*listIndentsChild*/
true
);
if (actualIndentation !== -1 /* Unknown */) {
return actualIndentation;
}
previous = current;
current = current.parent;
}
return getBaseIndentation(options);
}
function getIndentationForNode(n, ignoreActualIndentationRange, sourceFile, options) {
const start2 = sourceFile.getLineAndCharacterOfPosition(n.getStart(sourceFile));
return getIndentationForNodeWorker(
n,
start2,
ignoreActualIndentationRange,
/*indentationDelta*/
0,
sourceFile,
/*isNextChild*/
false,
options
);
}
SmartIndenter2.getIndentationForNode = getIndentationForNode;
function getBaseIndentation(options) {
return options.baseIndentSize || 0;
}
SmartIndenter2.getBaseIndentation = getBaseIndentation;
function getIndentationForNodeWorker(current, currentStart, ignoreActualIndentationRange, indentationDelta, sourceFile, isNextChild, options) {
var _a;
let parent2 = current.parent;
while (parent2) {
let useActualIndentation = true;
if (ignoreActualIndentationRange) {
const start2 = current.getStart(sourceFile);
useActualIndentation = start2 < ignoreActualIndentationRange.pos || start2 > ignoreActualIndentationRange.end;
}
const containingListOrParentStart = getContainingListOrParentStart(parent2, current, sourceFile);
const parentAndChildShareLine = containingListOrParentStart.line === currentStart.line || childStartsOnTheSameLineWithElseInIfStatement(parent2, current, currentStart.line, sourceFile);
if (useActualIndentation) {
const firstListChild = (_a = getContainingList(current, sourceFile)) == null ? void 0 : _a[0];
const listIndentsChild = !!firstListChild && getStartLineAndCharacterForNode(firstListChild, sourceFile).line > containingListOrParentStart.line;
let actualIndentation = getActualIndentationForListItem(current, sourceFile, options, listIndentsChild);
if (actualIndentation !== -1 /* Unknown */) {
return actualIndentation + indentationDelta;
}
actualIndentation = getActualIndentationForNode(current, parent2, currentStart, parentAndChildShareLine, sourceFile, options);
if (actualIndentation !== -1 /* Unknown */) {
return actualIndentation + indentationDelta;
}
}
if (shouldIndentChildNode(options, parent2, current, sourceFile, isNextChild) && !parentAndChildShareLine) {
indentationDelta += options.indentSize;
}
const useTrueStart = isArgumentAndStartLineOverlapsExpressionBeingCalled(parent2, current, currentStart.line, sourceFile);
current = parent2;
parent2 = current.parent;
currentStart = useTrueStart ? sourceFile.getLineAndCharacterOfPosition(current.getStart(sourceFile)) : containingListOrParentStart;
}
return indentationDelta + getBaseIndentation(options);
}
function getContainingListOrParentStart(parent2, child, sourceFile) {
const containingList = getContainingList(child, sourceFile);
const startPos = containingList ? containingList.pos : parent2.getStart(sourceFile);
return sourceFile.getLineAndCharacterOfPosition(startPos);
}
function getActualIndentationForListItemBeforeComma(commaToken, sourceFile, options) {
const commaItemInfo = findListItemInfo(commaToken);
if (commaItemInfo && commaItemInfo.listItemIndex > 0) {
return deriveActualIndentationFromList(commaItemInfo.list.getChildren(), commaItemInfo.listItemIndex - 1, sourceFile, options);
} else {
return -1 /* Unknown */;
}
}
function getActualIndentationForNode(current, parent2, currentLineAndChar, parentAndChildShareLine, sourceFile, options) {
const useActualIndentation = (isDeclaration(current) || isStatementButNotDeclaration(current)) && (parent2.kind === 311 /* SourceFile */ || !parentAndChildShareLine);
if (!useActualIndentation) {
return -1 /* Unknown */;
}
return findColumnForFirstNonWhitespaceCharacterInLine(currentLineAndChar, sourceFile, options);
}
let NextTokenKind;
((NextTokenKind2) => {
NextTokenKind2[NextTokenKind2["Unknown"] = 0] = "Unknown";
NextTokenKind2[NextTokenKind2["OpenBrace"] = 1] = "OpenBrace";
NextTokenKind2[NextTokenKind2["CloseBrace"] = 2] = "CloseBrace";
})(NextTokenKind || (NextTokenKind = {}));
function nextTokenIsCurlyBraceOnSameLineAsCursor(precedingToken, current, lineAtPosition, sourceFile) {
const nextToken = findNextToken(precedingToken, current, sourceFile);
if (!nextToken) {
return 0 /* Unknown */;
}
if (nextToken.kind === 19 /* OpenBraceToken */) {
return 1 /* OpenBrace */;
} else if (nextToken.kind === 20 /* CloseBraceToken */) {
const nextTokenStartLine = getStartLineAndCharacterForNode(nextToken, sourceFile).line;
return lineAtPosition === nextTokenStartLine ? 2 /* CloseBrace */ : 0 /* Unknown */;
}
return 0 /* Unknown */;
}
function getStartLineAndCharacterForNode(n, sourceFile) {
return sourceFile.getLineAndCharacterOfPosition(n.getStart(sourceFile));
}
function isArgumentAndStartLineOverlapsExpressionBeingCalled(parent2, child, childStartLine, sourceFile) {
if (!(isCallExpression(parent2) && contains(parent2.arguments, child))) {
return false;
}
const expressionOfCallExpressionEnd = parent2.expression.getEnd();
const expressionOfCallExpressionEndLine = getLineAndCharacterOfPosition(sourceFile, expressionOfCallExpressionEnd).line;
return expressionOfCallExpressionEndLine === childStartLine;
}
SmartIndenter2.isArgumentAndStartLineOverlapsExpressionBeingCalled = isArgumentAndStartLineOverlapsExpressionBeingCalled;
function childStartsOnTheSameLineWithElseInIfStatement(parent2, child, childStartLine, sourceFile) {
if (parent2.kind === 244 /* IfStatement */ && parent2.elseStatement === child) {
const elseKeyword = findChildOfKind(parent2, 93 /* ElseKeyword */, sourceFile);
Debug.assert(elseKeyword !== void 0);
const elseKeywordStartLine = getStartLineAndCharacterForNode(elseKeyword, sourceFile).line;
return elseKeywordStartLine === childStartLine;
}
return false;
}
SmartIndenter2.childStartsOnTheSameLineWithElseInIfStatement = childStartsOnTheSameLineWithElseInIfStatement;
function childIsUnindentedBranchOfConditionalExpression(parent2, child, childStartLine, sourceFile) {
if (isConditionalExpression(parent2) && (child === parent2.whenTrue || child === parent2.whenFalse)) {
const conditionEndLine = getLineAndCharacterOfPosition(sourceFile, parent2.condition.end).line;
if (child === parent2.whenTrue) {
return childStartLine === conditionEndLine;
} else {
const trueStartLine = getStartLineAndCharacterForNode(parent2.whenTrue, sourceFile).line;
const trueEndLine = getLineAndCharacterOfPosition(sourceFile, parent2.whenTrue.end).line;
return conditionEndLine === trueStartLine && trueEndLine === childStartLine;
}
}
return false;
}
SmartIndenter2.childIsUnindentedBranchOfConditionalExpression = childIsUnindentedBranchOfConditionalExpression;
function argumentStartsOnSameLineAsPreviousArgument(parent2, child, childStartLine, sourceFile) {
if (isCallOrNewExpression(parent2)) {
if (!parent2.arguments)
return false;
const currentNode = find(parent2.arguments, (arg) => arg.pos === child.pos);
if (!currentNode)
return false;
const currentIndex = parent2.arguments.indexOf(currentNode);
if (currentIndex === 0)
return false;
const previousNode = parent2.arguments[currentIndex - 1];
const lineOfPreviousNode = getLineAndCharacterOfPosition(sourceFile, previousNode.getEnd()).line;
if (childStartLine === lineOfPreviousNode) {
return true;
}
}
return false;
}
SmartIndenter2.argumentStartsOnSameLineAsPreviousArgument = argumentStartsOnSameLineAsPreviousArgument;
function getContainingList(node, sourceFile) {
return node.parent && getListByRange(node.getStart(sourceFile), node.getEnd(), node.parent, sourceFile);
}
SmartIndenter2.getContainingList = getContainingList;
function getListByPosition(pos, node, sourceFile) {
return node && getListByRange(pos, pos, node, sourceFile);
}
function getListByRange(start2, end, node, sourceFile) {
switch (node.kind) {
case 182 /* TypeReference */:
return getList(node.typeArguments);
case 209 /* ObjectLiteralExpression */:
return getList(node.properties);
case 208 /* ArrayLiteralExpression */:
return getList(node.elements);
case 186 /* TypeLiteral */:
return getList(node.members);
case 261 /* FunctionDeclaration */:
case 217 /* FunctionExpression */:
case 218 /* ArrowFunction */:
case 173 /* MethodDeclaration */:
case 172 /* MethodSignature */:
case 178 /* CallSignature */:
case 175 /* Constructor */:
case 184 /* ConstructorType */:
case 179 /* ConstructSignature */:
return getList(node.typeParameters) || getList(node.parameters);
case 176 /* GetAccessor */:
return getList(node.parameters);
case 262 /* ClassDeclaration */:
case 230 /* ClassExpression */:
case 263 /* InterfaceDeclaration */:
case 264 /* TypeAliasDeclaration */:
case 351 /* JSDocTemplateTag */:
return getList(node.typeParameters);
case 213 /* NewExpression */:
case 212 /* CallExpression */:
return getList(node.typeArguments) || getList(node.arguments);
case 260 /* VariableDeclarationList */:
return getList(node.declarations);
case 274 /* NamedImports */:
case 278 /* NamedExports */:
return getList(node.elements);
case 205 /* ObjectBindingPattern */:
case 206 /* ArrayBindingPattern */:
return getList(node.elements);
}
function getList(list) {
return list && rangeContainsStartEnd(getVisualListRange(node, list, sourceFile), start2, end) ? list : void 0;
}
}
function getVisualListRange(node, list, sourceFile) {
const children = node.getChildren(sourceFile);
for (let i = 1; i < children.length - 1; i++) {
if (children[i].pos === list.pos && children[i].end === list.end) {
return { pos: children[i - 1].end, end: children[i + 1].getStart(sourceFile) };
}
}
return list;
}
function getActualIndentationForListStartLine(list, sourceFile, options) {
if (!list) {
return -1 /* Unknown */;
}
return findColumnForFirstNonWhitespaceCharacterInLine(sourceFile.getLineAndCharacterOfPosition(list.pos), sourceFile, options);
}
function getActualIndentationForListItem(node, sourceFile, options, listIndentsChild) {
if (node.parent && node.parent.kind === 260 /* VariableDeclarationList */) {
return -1 /* Unknown */;
}
const containingList = getContainingList(node, sourceFile);
if (containingList) {
const index = containingList.indexOf(node);
if (index !== -1) {
const result = deriveActualIndentationFromList(containingList, index, sourceFile, options);
if (result !== -1 /* Unknown */) {
return result;
}
}
return getActualIndentationForListStartLine(containingList, sourceFile, options) + (listIndentsChild ? options.indentSize : 0);
}
return -1 /* Unknown */;
}
function deriveActualIndentationFromList(list, index, sourceFile, options) {
Debug.assert(index >= 0 && index < list.length);
const node = list[index];
let lineAndCharacter = getStartLineAndCharacterForNode(node, sourceFile);
for (let i = index - 1; i >= 0; i--) {
if (list[i].kind === 28 /* CommaToken */) {
continue;
}
const prevEndLine = sourceFile.getLineAndCharacterOfPosition(list[i].end).line;
if (prevEndLine !== lineAndCharacter.line) {
return findColumnForFirstNonWhitespaceCharacterInLine(lineAndCharacter, sourceFile, options);
}
lineAndCharacter = getStartLineAndCharacterForNode(list[i], sourceFile);
}
return -1 /* Unknown */;
}
function findColumnForFirstNonWhitespaceCharacterInLine(lineAndCharacter, sourceFile, options) {
const lineStart = sourceFile.getPositionOfLineAndCharacter(lineAndCharacter.line, 0);
return findFirstNonWhitespaceColumn(lineStart, lineStart + lineAndCharacter.character, sourceFile, options);
}
function findFirstNonWhitespaceCharacterAndColumn(startPos, endPos, sourceFile, options) {
let character = 0;
let column = 0;
for (let pos = startPos; pos < endPos; pos++) {
const ch = sourceFile.text.charCodeAt(pos);
if (!isWhiteSpaceSingleLine(ch)) {
break;
}
if (ch === 9 /* tab */) {
column += options.tabSize + column % options.tabSize;
} else {
column++;
}
character++;
}
return { column, character };
}
SmartIndenter2.findFirstNonWhitespaceCharacterAndColumn = findFirstNonWhitespaceCharacterAndColumn;
function findFirstNonWhitespaceColumn(startPos, endPos, sourceFile, options) {
return findFirstNonWhitespaceCharacterAndColumn(startPos, endPos, sourceFile, options).column;
}
SmartIndenter2.findFirstNonWhitespaceColumn = findFirstNonWhitespaceColumn;
function nodeWillIndentChild(settings, parent2, child, sourceFile, indentByDefault) {
const childKind = child ? child.kind : 0 /* Unknown */;
switch (parent2.kind) {
case 243 /* ExpressionStatement */:
case 262 /* ClassDeclaration */:
case 230 /* ClassExpression */:
case 263 /* InterfaceDeclaration */:
case 265 /* EnumDeclaration */:
case 264 /* TypeAliasDeclaration */:
case 208 /* ArrayLiteralExpression */:
case 240 /* Block */:
case 267 /* ModuleBlock */:
case 209 /* ObjectLiteralExpression */:
case 186 /* TypeLiteral */:
case 199 /* MappedType */:
case 188 /* TupleType */:
case 216 /* ParenthesizedExpression */:
case 210 /* PropertyAccessExpression */:
case 212 /* CallExpression */:
case 213 /* NewExpression */:
case 242 /* VariableStatement */:
case 276 /* ExportAssignment */:
case 252 /* ReturnStatement */:
case 226 /* ConditionalExpression */:
case 206 /* ArrayBindingPattern */:
case 205 /* ObjectBindingPattern */:
case 285 /* JsxOpeningElement */:
case 288 /* JsxOpeningFragment */:
case 284 /* JsxSelfClosingElement */:
case 293 /* JsxExpression */:
case 172 /* MethodSignature */:
case 178 /* CallSignature */:
case 179 /* ConstructSignature */:
case 168 /* Parameter */:
case 183 /* FunctionType */:
case 184 /* ConstructorType */:
case 195 /* ParenthesizedType */:
case 214 /* TaggedTemplateExpression */:
case 222 /* AwaitExpression */:
case 278 /* NamedExports */:
case 274 /* NamedImports */:
case 280 /* ExportSpecifier */:
case 275 /* ImportSpecifier */:
case 171 /* PropertyDeclaration */:
case 295 /* CaseClause */:
case 296 /* DefaultClause */:
return true;
case 268 /* CaseBlock */:
return settings.indentSwitchCase ?? true;
case 259 /* VariableDeclaration */:
case 302 /* PropertyAssignment */:
case 225 /* BinaryExpression */:
if (!settings.indentMultiLineObjectLiteralBeginningOnBlankLine && sourceFile && childKind === 209 /* ObjectLiteralExpression */) {
return rangeIsOnOneLine(sourceFile, child);
}
if (parent2.kind === 225 /* BinaryExpression */ && sourceFile && child && childKind === 283 /* JsxElement */) {
const parentStartLine = sourceFile.getLineAndCharacterOfPosition(skipTrivia(sourceFile.text, parent2.pos)).line;
const childStartLine = sourceFile.getLineAndCharacterOfPosition(skipTrivia(sourceFile.text, child.pos)).line;
return parentStartLine !== childStartLine;
}
if (parent2.kind !== 225 /* BinaryExpression */) {
return true;
}
break;
case 245 /* DoStatement */:
case 246 /* WhileStatement */:
case 248 /* ForInStatement */:
case 249 /* ForOfStatement */:
case 247 /* ForStatement */:
case 244 /* IfStatement */:
case 261 /* FunctionDeclaration */:
case 217 /* FunctionExpression */:
case 173 /* MethodDeclaration */:
case 175 /* Constructor */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
return childKind !== 240 /* Block */;
case 218 /* ArrowFunction */:
if (sourceFile && childKind === 216 /* ParenthesizedExpression */) {
return rangeIsOnOneLine(sourceFile, child);
}
return childKind !== 240 /* Block */;
case 277 /* ExportDeclaration */:
return childKind !== 278 /* NamedExports */;
case 271 /* ImportDeclaration */:
return childKind !== 272 /* ImportClause */ || !!child.namedBindings && child.namedBindings.kind !== 274 /* NamedImports */;
case 283 /* JsxElement */:
return childKind !== 286 /* JsxClosingElement */;
case 287 /* JsxFragment */:
return childKind !== 289 /* JsxClosingFragment */;
case 192 /* IntersectionType */:
case 191 /* UnionType */:
if (childKind === 186 /* TypeLiteral */ || childKind === 188 /* TupleType */) {
return false;
}
break;
}
return indentByDefault;
}
SmartIndenter2.nodeWillIndentChild = nodeWillIndentChild;
function isControlFlowEndingStatement(kind, parent2) {
switch (kind) {
case 252 /* ReturnStatement */:
case 256 /* ThrowStatement */:
case 250 /* ContinueStatement */:
case 251 /* BreakStatement */:
return parent2.kind !== 240 /* Block */;
default:
return false;
}
}
function shouldIndentChildNode(settings, parent2, child, sourceFile, isNextChild = false) {
return nodeWillIndentChild(
settings,
parent2,
child,
sourceFile,
/*indentByDefault*/
false
) && !(isNextChild && child && isControlFlowEndingStatement(child.kind, parent2));
}
SmartIndenter2.shouldIndentChildNode = shouldIndentChildNode;
function rangeIsOnOneLine(sourceFile, range) {
const rangeStart = skipTrivia(sourceFile.text, range.pos);
const startLine = sourceFile.getLineAndCharacterOfPosition(rangeStart).line;
const endLine = sourceFile.getLineAndCharacterOfPosition(range.end).line;
return startLine === endLine;
}
})(SmartIndenter || (SmartIndenter = {}));
// src/server/_namespaces/ts.ts
var ts_exports2 = {};
__export(ts_exports2, {
ANONYMOUS: () => ANONYMOUS,
AccessFlags: () => AccessFlags,
AssertionLevel: () => AssertionLevel,
AssignmentDeclarationKind: () => AssignmentDeclarationKind,
AssignmentKind: () => AssignmentKind,
Associativity: () => Associativity,
BreakpointResolver: () => ts_BreakpointResolver_exports,
BuilderFileEmit: () => BuilderFileEmit,
BuilderProgramKind: () => BuilderProgramKind,
BuilderState: () => BuilderState,
BundleFileSectionKind: () => BundleFileSectionKind,
CallHierarchy: () => ts_CallHierarchy_exports,
CharacterCodes: () => CharacterCodes,
CheckFlags: () => CheckFlags,
CheckMode: () => CheckMode,
ClassificationType: () => ClassificationType,
ClassificationTypeNames: () => ClassificationTypeNames,
CommentDirectiveType: () => CommentDirectiveType,
Comparison: () => Comparison,
CompletionInfoFlags: () => CompletionInfoFlags,
CompletionTriggerKind: () => CompletionTriggerKind,
Completions: () => ts_Completions_exports,
ConfigFileProgramReloadLevel: () => ConfigFileProgramReloadLevel,
ContextFlags: () => ContextFlags,
CoreServicesShimHostAdapter: () => CoreServicesShimHostAdapter,
Debug: () => Debug,
DiagnosticCategory: () => DiagnosticCategory,
Diagnostics: () => Diagnostics,
DocumentHighlights: () => DocumentHighlights,
ElementFlags: () => ElementFlags,
EmitFlags: () => EmitFlags,
EmitHint: () => EmitHint,
EmitOnly: () => EmitOnly,
EndOfLineState: () => EndOfLineState,
EnumKind: () => EnumKind,
ExitStatus: () => ExitStatus,
ExportKind: () => ExportKind,
Extension: () => Extension,
ExternalEmitHelpers: () => ExternalEmitHelpers,
FileIncludeKind: () => FileIncludeKind,
FilePreprocessingDiagnosticsKind: () => FilePreprocessingDiagnosticsKind,
FileSystemEntryKind: () => FileSystemEntryKind,
FileWatcherEventKind: () => FileWatcherEventKind,
FindAllReferences: () => ts_FindAllReferences_exports,
FlattenLevel: () => FlattenLevel,
FlowFlags: () => FlowFlags,
ForegroundColorEscapeSequences: () => ForegroundColorEscapeSequences,
FunctionFlags: () => FunctionFlags,
GeneratedIdentifierFlags: () => GeneratedIdentifierFlags,
GetLiteralTextFlags: () => GetLiteralTextFlags,
GoToDefinition: () => ts_GoToDefinition_exports,
HighlightSpanKind: () => HighlightSpanKind,
ImportKind: () => ImportKind,
ImportsNotUsedAsValues: () => ImportsNotUsedAsValues,
IndentStyle: () => IndentStyle,
IndexFlags: () => IndexFlags,
IndexKind: () => IndexKind,
InferenceFlags: () => InferenceFlags,
InferencePriority: () => InferencePriority,
InlayHintKind: () => InlayHintKind,
InlayHints: () => ts_InlayHints_exports,
InternalEmitFlags: () => InternalEmitFlags,
InternalSymbolName: () => InternalSymbolName,
InvalidatedProjectKind: () => InvalidatedProjectKind,
JsDoc: () => ts_JsDoc_exports,
JsTyping: () => ts_JsTyping_exports,
JsxEmit: () => JsxEmit,
JsxFlags: () => JsxFlags,
JsxReferenceKind: () => JsxReferenceKind,
LanguageServiceMode: () => LanguageServiceMode,
LanguageServiceShimHostAdapter: () => LanguageServiceShimHostAdapter,
LanguageVariant: () => LanguageVariant,
LexicalEnvironmentFlags: () => LexicalEnvironmentFlags,
ListFormat: () => ListFormat,
LogLevel: () => LogLevel,
MemberOverrideStatus: () => MemberOverrideStatus,
ModifierFlags: () => ModifierFlags,
ModuleDetectionKind: () => ModuleDetectionKind,
ModuleInstanceState: () => ModuleInstanceState,
ModuleKind: () => ModuleKind,
ModuleResolutionKind: () => ModuleResolutionKind,
ModuleSpecifierEnding: () => ModuleSpecifierEnding,
NavigateTo: () => ts_NavigateTo_exports,
NavigationBar: () => ts_NavigationBar_exports,
NewLineKind: () => NewLineKind,
NodeBuilderFlags: () => NodeBuilderFlags,
NodeCheckFlags: () => NodeCheckFlags,
NodeFactoryFlags: () => NodeFactoryFlags,
NodeFlags: () => NodeFlags,
NodeResolutionFeatures: () => NodeResolutionFeatures,
ObjectFlags: () => ObjectFlags,
OperationCanceledException: () => OperationCanceledException,
OperatorPrecedence: () => OperatorPrecedence,
OrganizeImports: () => ts_OrganizeImports_exports,
OrganizeImportsMode: () => OrganizeImportsMode,
OuterExpressionKinds: () => OuterExpressionKinds,
OutliningElementsCollector: () => ts_OutliningElementsCollector_exports,
OutliningSpanKind: () => OutliningSpanKind,
OutputFileType: () => OutputFileType,
PackageJsonAutoImportPreference: () => PackageJsonAutoImportPreference,
PackageJsonDependencyGroup: () => PackageJsonDependencyGroup,
PatternMatchKind: () => PatternMatchKind,
PollingInterval: () => PollingInterval,
PollingWatchKind: () => PollingWatchKind,
PragmaKindFlags: () => PragmaKindFlags,
PrivateIdentifierKind: () => PrivateIdentifierKind,
ProcessLevel: () => ProcessLevel,
QuotePreference: () => QuotePreference,
RelationComparisonResult: () => RelationComparisonResult,
Rename: () => ts_Rename_exports,
ScriptElementKind: () => ScriptElementKind,
ScriptElementKindModifier: () => ScriptElementKindModifier,
ScriptKind: () => ScriptKind,
ScriptSnapshot: () => ScriptSnapshot,
ScriptTarget: () => ScriptTarget,
SemanticClassificationFormat: () => SemanticClassificationFormat,
SemanticMeaning: () => SemanticMeaning,
SemicolonPreference: () => SemicolonPreference,
SignatureCheckMode: () => SignatureCheckMode,
SignatureFlags: () => SignatureFlags,
SignatureHelp: () => ts_SignatureHelp_exports,
SignatureKind: () => SignatureKind,
SmartSelectionRange: () => ts_SmartSelectionRange_exports,
SnippetKind: () => SnippetKind,
SortKind: () => SortKind,
StructureIsReused: () => StructureIsReused,
SymbolAccessibility: () => SymbolAccessibility,
SymbolDisplay: () => ts_SymbolDisplay_exports,
SymbolDisplayPartKind: () => SymbolDisplayPartKind,
SymbolFlags: () => SymbolFlags,
SymbolFormatFlags: () => SymbolFormatFlags,
SyntaxKind: () => SyntaxKind,
SyntheticSymbolKind: () => SyntheticSymbolKind,
Ternary: () => Ternary,
ThrottledCancellationToken: () => ThrottledCancellationToken,
TokenClass: () => TokenClass,
TokenFlags: () => TokenFlags,
TransformFlags: () => TransformFlags,
TypeFacts: () => TypeFacts,
TypeFlags: () => TypeFlags,
TypeFormatFlags: () => TypeFormatFlags,
TypeMapKind: () => TypeMapKind,
TypePredicateKind: () => TypePredicateKind,
TypeReferenceSerializationKind: () => TypeReferenceSerializationKind,
TypeScriptServicesFactory: () => TypeScriptServicesFactory,
UnionReduction: () => UnionReduction,
UpToDateStatusType: () => UpToDateStatusType,
VarianceFlags: () => VarianceFlags,
Version: () => Version,
VersionRange: () => VersionRange,
WatchDirectoryFlags: () => WatchDirectoryFlags,
WatchDirectoryKind: () => WatchDirectoryKind,
WatchFileKind: () => WatchFileKind,
WatchLogLevel: () => WatchLogLevel,
WatchType: () => WatchType,
accessPrivateIdentifier: () => accessPrivateIdentifier,
addEmitFlags: () => addEmitFlags,
addEmitHelper: () => addEmitHelper,
addEmitHelpers: () => addEmitHelpers,
addInternalEmitFlags: () => addInternalEmitFlags,
addNodeFactoryPatcher: () => addNodeFactoryPatcher,
addObjectAllocatorPatcher: () => addObjectAllocatorPatcher,
addRange: () => addRange,
addRelatedInfo: () => addRelatedInfo,
addSyntheticLeadingComment: () => addSyntheticLeadingComment,
addSyntheticTrailingComment: () => addSyntheticTrailingComment,
addToSeen: () => addToSeen,
advancedAsyncSuperHelper: () => advancedAsyncSuperHelper,
affectsDeclarationPathOptionDeclarations: () => affectsDeclarationPathOptionDeclarations,
affectsEmitOptionDeclarations: () => affectsEmitOptionDeclarations,
allKeysStartWithDot: () => allKeysStartWithDot,
altDirectorySeparator: () => altDirectorySeparator,
and: () => and,
append: () => append,
appendIfUnique: () => appendIfUnique,
arrayFrom: () => arrayFrom,
arrayIsEqualTo: () => arrayIsEqualTo,
arrayIsHomogeneous: () => arrayIsHomogeneous,
arrayIsSorted: () => arrayIsSorted,
arrayOf: () => arrayOf,
arrayReverseIterator: () => arrayReverseIterator,
arrayToMap: () => arrayToMap,
arrayToMultiMap: () => arrayToMultiMap,
arrayToNumericMap: () => arrayToNumericMap,
arraysEqual: () => arraysEqual,
assertType: () => assertType,
assign: () => assign,
assignHelper: () => assignHelper,
asyncDelegator: () => asyncDelegator,
asyncGeneratorHelper: () => asyncGeneratorHelper,
asyncSuperHelper: () => asyncSuperHelper,
asyncValues: () => asyncValues,
attachFileToDiagnostics: () => attachFileToDiagnostics,
awaitHelper: () => awaitHelper,
awaiterHelper: () => awaiterHelper,
base64decode: () => base64decode,
base64encode: () => base64encode,
binarySearch: () => binarySearch,
binarySearchKey: () => binarySearchKey,
bindSourceFile: () => bindSourceFile,
breakIntoCharacterSpans: () => breakIntoCharacterSpans,
breakIntoWordSpans: () => breakIntoWordSpans,
buildLinkParts: () => buildLinkParts,
buildOpts: () => buildOpts,
buildOverload: () => buildOverload,
bundlerModuleNameResolver: () => bundlerModuleNameResolver,
canBeConvertedToAsync: () => canBeConvertedToAsync,
canHaveDecorators: () => canHaveDecorators,
canHaveExportModifier: () => canHaveExportModifier,
canHaveFlowNode: () => canHaveFlowNode,
canHaveIllegalDecorators: () => canHaveIllegalDecorators,
canHaveIllegalModifiers: () => canHaveIllegalModifiers,
canHaveIllegalType: () => canHaveIllegalType,
canHaveIllegalTypeParameters: () => canHaveIllegalTypeParameters,
canHaveJSDoc: () => canHaveJSDoc,
canHaveLocals: () => canHaveLocals,
canHaveModifiers: () => canHaveModifiers,
canHaveSymbol: () => canHaveSymbol,
canJsonReportNoInputFiles: () => canJsonReportNoInputFiles,
canProduceDiagnostics: () => canProduceDiagnostics,
canUsePropertyAccess: () => canUsePropertyAccess,
canWatchAffectingLocation: () => canWatchAffectingLocation,
canWatchAtTypes: () => canWatchAtTypes,
canWatchDirectoryOrFile: () => canWatchDirectoryOrFile,
cartesianProduct: () => cartesianProduct,
cast: () => cast,
chainBundle: () => chainBundle,
chainDiagnosticMessages: () => chainDiagnosticMessages,
changeAnyExtension: () => changeAnyExtension,
changeCompilerHostLikeToUseCache: () => changeCompilerHostLikeToUseCache,
changeExtension: () => changeExtension,
changesAffectModuleResolution: () => changesAffectModuleResolution,
changesAffectingProgramStructure: () => changesAffectingProgramStructure,
childIsDecorated: () => childIsDecorated,
classElementOrClassElementParameterIsDecorated: () => classElementOrClassElementParameterIsDecorated,
classOrConstructorParameterIsDecorated: () => classOrConstructorParameterIsDecorated,
classPrivateFieldGetHelper: () => classPrivateFieldGetHelper,
classPrivateFieldInHelper: () => classPrivateFieldInHelper,
classPrivateFieldSetHelper: () => classPrivateFieldSetHelper,
classicNameResolver: () => classicNameResolver,
classifier: () => ts_classifier_exports,
cleanExtendedConfigCache: () => cleanExtendedConfigCache,
clear: () => clear,
clearMap: () => clearMap,
clearSharedExtendedConfigFileWatcher: () => clearSharedExtendedConfigFileWatcher,
climbPastPropertyAccess: () => climbPastPropertyAccess,
climbPastPropertyOrElementAccess: () => climbPastPropertyOrElementAccess,
clone: () => clone,
cloneCompilerOptions: () => cloneCompilerOptions,
closeFileWatcher: () => closeFileWatcher,
closeFileWatcherOf: () => closeFileWatcherOf,
codefix: () => ts_codefix_exports,
collapseTextChangeRangesAcrossMultipleVersions: () => collapseTextChangeRangesAcrossMultipleVersions,
collectExternalModuleInfo: () => collectExternalModuleInfo,
combine: () => combine,
combinePaths: () => combinePaths,
commentPragmas: () => commentPragmas,
commonOptionsWithBuild: () => commonOptionsWithBuild,
commonPackageFolders: () => commonPackageFolders,
compact: () => compact,
compareBooleans: () => compareBooleans,
compareDataObjects: () => compareDataObjects,
compareDiagnostics: () => compareDiagnostics,
compareDiagnosticsSkipRelatedInformation: () => compareDiagnosticsSkipRelatedInformation,
compareEmitHelpers: () => compareEmitHelpers,
compareNumberOfDirectorySeparators: () => compareNumberOfDirectorySeparators,
comparePaths: () => comparePaths,
comparePathsCaseInsensitive: () => comparePathsCaseInsensitive,
comparePathsCaseSensitive: () => comparePathsCaseSensitive,
comparePatternKeys: () => comparePatternKeys,
compareProperties: () => compareProperties,
compareStringsCaseInsensitive: () => compareStringsCaseInsensitive,
compareStringsCaseInsensitiveEslintCompatible: () => compareStringsCaseInsensitiveEslintCompatible,
compareStringsCaseSensitive: () => compareStringsCaseSensitive,
compareStringsCaseSensitiveUI: () => compareStringsCaseSensitiveUI,
compareTextSpans: () => compareTextSpans,
compareValues: () => compareValues,
compileOnSaveCommandLineOption: () => compileOnSaveCommandLineOption,
compilerOptionsAffectDeclarationPath: () => compilerOptionsAffectDeclarationPath,
compilerOptionsAffectEmit: () => compilerOptionsAffectEmit,
compilerOptionsAffectSemanticDiagnostics: () => compilerOptionsAffectSemanticDiagnostics,
compilerOptionsDidYouMeanDiagnostics: () => compilerOptionsDidYouMeanDiagnostics,
compilerOptionsIndicateEsModules: () => compilerOptionsIndicateEsModules,
compose: () => compose,
computeCommonSourceDirectoryOfFilenames: () => computeCommonSourceDirectoryOfFilenames,
computeLineAndCharacterOfPosition: () => computeLineAndCharacterOfPosition,
computeLineOfPosition: () => computeLineOfPosition,
computeLineStarts: () => computeLineStarts,
computePositionOfLineAndCharacter: () => computePositionOfLineAndCharacter,
computeSignature: () => computeSignature,
computeSignatureWithDiagnostics: () => computeSignatureWithDiagnostics,
computeSuggestionDiagnostics: () => computeSuggestionDiagnostics,
concatenate: () => concatenate,
concatenateDiagnosticMessageChains: () => concatenateDiagnosticMessageChains,
consumesNodeCoreModules: () => consumesNodeCoreModules,
contains: () => contains,
containsIgnoredPath: () => containsIgnoredPath,
containsObjectRestOrSpread: () => containsObjectRestOrSpread,
containsParseError: () => containsParseError,
containsPath: () => containsPath,
convertCompilerOptionsForTelemetry: () => convertCompilerOptionsForTelemetry,
convertCompilerOptionsFromJson: () => convertCompilerOptionsFromJson,
convertJsonOption: () => convertJsonOption,
convertToBase64: () => convertToBase64,
convertToJson: () => convertToJson,
convertToObject: () => convertToObject,
convertToOptionsWithAbsolutePaths: () => convertToOptionsWithAbsolutePaths,
convertToRelativePath: () => convertToRelativePath,
convertToTSConfig: () => convertToTSConfig,
convertTypeAcquisitionFromJson: () => convertTypeAcquisitionFromJson,
copyComments: () => copyComments,
copyEntries: () => copyEntries,
copyLeadingComments: () => copyLeadingComments,
copyProperties: () => copyProperties,
copyTrailingAsLeadingComments: () => copyTrailingAsLeadingComments,
copyTrailingComments: () => copyTrailingComments,
couldStartTrivia: () => couldStartTrivia,
countWhere: () => countWhere,
createAbstractBuilder: () => createAbstractBuilder,
createAccessorPropertyBackingField: () => createAccessorPropertyBackingField,
createAccessorPropertyGetRedirector: () => createAccessorPropertyGetRedirector,
createAccessorPropertySetRedirector: () => createAccessorPropertySetRedirector,
createBaseNodeFactory: () => createBaseNodeFactory,
createBinaryExpressionTrampoline: () => createBinaryExpressionTrampoline,
createBindingHelper: () => createBindingHelper,
createBuildInfo: () => createBuildInfo,
createBuilderProgram: () => createBuilderProgram,
createBuilderProgramUsingProgramBuildInfo: () => createBuilderProgramUsingProgramBuildInfo,
createBuilderStatusReporter: () => createBuilderStatusReporter,
createCacheWithRedirects: () => createCacheWithRedirects,
createCacheableExportInfoMap: () => createCacheableExportInfoMap,
createCachedDirectoryStructureHost: () => createCachedDirectoryStructureHost,
createClassifier: () => createClassifier,
createCommentDirectivesMap: () => createCommentDirectivesMap,
createCompilerDiagnostic: () => createCompilerDiagnostic,
createCompilerDiagnosticForInvalidCustomType: () => createCompilerDiagnosticForInvalidCustomType,
createCompilerDiagnosticFromMessageChain: () => createCompilerDiagnosticFromMessageChain,
createCompilerHost: () => createCompilerHost,
createCompilerHostFromProgramHost: () => createCompilerHostFromProgramHost,
createCompilerHostWorker: () => createCompilerHostWorker,
createDetachedDiagnostic: () => createDetachedDiagnostic,
createDiagnosticCollection: () => createDiagnosticCollection,
createDiagnosticForFileFromMessageChain: () => createDiagnosticForFileFromMessageChain,
createDiagnosticForNode: () => createDiagnosticForNode,
createDiagnosticForNodeArray: () => createDiagnosticForNodeArray,
createDiagnosticForNodeArrayFromMessageChain: () => createDiagnosticForNodeArrayFromMessageChain,
createDiagnosticForNodeFromMessageChain: () => createDiagnosticForNodeFromMessageChain,
createDiagnosticForNodeInSourceFile: () => createDiagnosticForNodeInSourceFile,
createDiagnosticForRange: () => createDiagnosticForRange,
createDiagnosticMessageChainFromDiagnostic: () => createDiagnosticMessageChainFromDiagnostic,
createDiagnosticReporter: () => createDiagnosticReporter,
createDocumentPositionMapper: () => createDocumentPositionMapper,
createDocumentRegistry: () => createDocumentRegistry,
createDocumentRegistryInternal: () => createDocumentRegistryInternal,
createEmitAndSemanticDiagnosticsBuilderProgram: () => createEmitAndSemanticDiagnosticsBuilderProgram,
createEmitHelperFactory: () => createEmitHelperFactory,
createEmptyExports: () => createEmptyExports,
createExpressionForJsxElement: () => createExpressionForJsxElement,
createExpressionForJsxFragment: () => createExpressionForJsxFragment,
createExpressionForObjectLiteralElementLike: () => createExpressionForObjectLiteralElementLike,
createExpressionForPropertyName: () => createExpressionForPropertyName,
createExpressionFromEntityName: () => createExpressionFromEntityName,
createExternalHelpersImportDeclarationIfNeeded: () => createExternalHelpersImportDeclarationIfNeeded,
createFileDiagnostic: () => createFileDiagnostic,
createFileDiagnosticFromMessageChain: () => createFileDiagnosticFromMessageChain,
createForOfBindingStatement: () => createForOfBindingStatement,
createGetCanonicalFileName: () => createGetCanonicalFileName,
createGetSourceFile: () => createGetSourceFile,
createGetSymbolAccessibilityDiagnosticForNode: () => createGetSymbolAccessibilityDiagnosticForNode,
createGetSymbolAccessibilityDiagnosticForNodeName: () => createGetSymbolAccessibilityDiagnosticForNodeName,
createGetSymbolWalker: () => createGetSymbolWalker,
createIncrementalCompilerHost: () => createIncrementalCompilerHost,
createIncrementalProgram: () => createIncrementalProgram,
createInputFiles: () => createInputFiles,
createInputFilesWithFilePaths: () => createInputFilesWithFilePaths,
createInputFilesWithFileTexts: () => createInputFilesWithFileTexts,
createJsxFactoryExpression: () => createJsxFactoryExpression,
createLanguageService: () => createLanguageService,
createLanguageServiceSourceFile: () => createLanguageServiceSourceFile,
createMemberAccessForPropertyName: () => createMemberAccessForPropertyName,
createModeAwareCache: () => createModeAwareCache,
createModeAwareCacheKey: () => createModeAwareCacheKey,
createModuleNotFoundChain: () => createModuleNotFoundChain,
createModuleResolutionCache: () => createModuleResolutionCache,
createModuleResolutionLoader: () => createModuleResolutionLoader,
createModuleSpecifierResolutionHost: () => createModuleSpecifierResolutionHost,
createMultiMap: () => createMultiMap,
createNodeConverters: () => createNodeConverters,
createNodeFactory: () => createNodeFactory,
createOptionNameMap: () => createOptionNameMap,
createOverload: () => createOverload,
createPackageJsonImportFilter: () => createPackageJsonImportFilter,
createPackageJsonInfo: () => createPackageJsonInfo,
createParenthesizerRules: () => createParenthesizerRules,
createPatternMatcher: () => createPatternMatcher,
createPrependNodes: () => createPrependNodes,
createPrinter: () => createPrinter,
createPrinterWithDefaults: () => createPrinterWithDefaults,
createPrinterWithRemoveComments: () => createPrinterWithRemoveComments,
createPrinterWithRemoveCommentsNeverAsciiEscape: () => createPrinterWithRemoveCommentsNeverAsciiEscape,
createPrinterWithRemoveCommentsOmitTrailingSemicolon: () => createPrinterWithRemoveCommentsOmitTrailingSemicolon,
createProgram: () => createProgram,
createProgramHost: () => createProgramHost,
createPropertyNameNodeForIdentifierOrLiteral: () => createPropertyNameNodeForIdentifierOrLiteral,
createQueue: () => createQueue,
createRange: () => createRange,
createRedirectedBuilderProgram: () => createRedirectedBuilderProgram,
createResolutionCache: () => createResolutionCache,
createRuntimeTypeSerializer: () => createRuntimeTypeSerializer,
createScanner: () => createScanner,
createSemanticDiagnosticsBuilderProgram: () => createSemanticDiagnosticsBuilderProgram,
createSet: () => createSet,
createSolutionBuilder: () => createSolutionBuilder,
createSolutionBuilderHost: () => createSolutionBuilderHost,
createSolutionBuilderWithWatch: () => createSolutionBuilderWithWatch,
createSolutionBuilderWithWatchHost: () => createSolutionBuilderWithWatchHost,
createSortedArray: () => createSortedArray,
createSourceFile: () => createSourceFile,
createSourceMapGenerator: () => createSourceMapGenerator,
createSourceMapSource: () => createSourceMapSource,
createSuperAccessVariableStatement: () => createSuperAccessVariableStatement,
createSymbolTable: () => createSymbolTable,
createSymlinkCache: () => createSymlinkCache,
createSystemWatchFunctions: () => createSystemWatchFunctions,
createTextChange: () => createTextChange,
createTextChangeFromStartLength: () => createTextChangeFromStartLength,
createTextChangeRange: () => createTextChangeRange,
createTextRangeFromNode: () => createTextRangeFromNode,
createTextRangeFromSpan: () => createTextRangeFromSpan,
createTextSpan: () => createTextSpan,
createTextSpanFromBounds: () => createTextSpanFromBounds,
createTextSpanFromNode: () => createTextSpanFromNode,
createTextSpanFromRange: () => createTextSpanFromRange,
createTextSpanFromStringLiteralLikeContent: () => createTextSpanFromStringLiteralLikeContent,
createTextWriter: () => createTextWriter,
createTokenRange: () => createTokenRange,
createTypeChecker: () => createTypeChecker,
createTypeReferenceDirectiveResolutionCache: () => createTypeReferenceDirectiveResolutionCache,
createTypeReferenceResolutionLoader: () => createTypeReferenceResolutionLoader,
createUnparsedSourceFile: () => createUnparsedSourceFile,
createWatchCompilerHost: () => createWatchCompilerHost2,
createWatchCompilerHostOfConfigFile: () => createWatchCompilerHostOfConfigFile,
createWatchCompilerHostOfFilesAndCompilerOptions: () => createWatchCompilerHostOfFilesAndCompilerOptions,
createWatchFactory: () => createWatchFactory,
createWatchHost: () => createWatchHost,
createWatchProgram: () => createWatchProgram,
createWatchStatusReporter: () => createWatchStatusReporter,
createWriteFileMeasuringIO: () => createWriteFileMeasuringIO,
declarationNameToString: () => declarationNameToString,
decodeMappings: () => decodeMappings,
decodedTextSpanIntersectsWith: () => decodedTextSpanIntersectsWith,
decorateHelper: () => decorateHelper,
deduplicate: () => deduplicate,
defaultIncludeSpec: () => defaultIncludeSpec,
defaultInitCompilerOptions: () => defaultInitCompilerOptions,
defaultMaximumTruncationLength: () => defaultMaximumTruncationLength,
detectSortCaseSensitivity: () => detectSortCaseSensitivity,
diagnosticCategoryName: () => diagnosticCategoryName,
diagnosticToString: () => diagnosticToString,
directoryProbablyExists: () => directoryProbablyExists,
directorySeparator: () => directorySeparator,
displayPart: () => displayPart,
displayPartsToString: () => displayPartsToString,
disposeEmitNodes: () => disposeEmitNodes,
documentSpansEqual: () => documentSpansEqual,
dumpTracingLegend: () => dumpTracingLegend,
elementAt: () => elementAt,
elideNodes: () => elideNodes,
emitComments: () => emitComments,
emitDetachedComments: () => emitDetachedComments,
emitFiles: () => emitFiles,
emitFilesAndReportErrors: () => emitFilesAndReportErrors,
emitFilesAndReportErrorsAndGetExitStatus: () => emitFilesAndReportErrorsAndGetExitStatus,
emitModuleKindIsNonNodeESM: () => emitModuleKindIsNonNodeESM,
emitNewLineBeforeLeadingCommentOfPosition: () => emitNewLineBeforeLeadingCommentOfPosition,
emitNewLineBeforeLeadingComments: () => emitNewLineBeforeLeadingComments,
emitNewLineBeforeLeadingCommentsOfPosition: () => emitNewLineBeforeLeadingCommentsOfPosition,
emitSkippedWithNoDiagnostics: () => emitSkippedWithNoDiagnostics,
emitUsingBuildInfo: () => emitUsingBuildInfo,
emptyArray: () => emptyArray,
emptyFileSystemEntries: () => emptyFileSystemEntries,
emptyMap: () => emptyMap,
emptyOptions: () => emptyOptions,
emptySet: () => emptySet,
endsWith: () => endsWith,
ensurePathIsNonModuleName: () => ensurePathIsNonModuleName,
ensureScriptKind: () => ensureScriptKind,
ensureTrailingDirectorySeparator: () => ensureTrailingDirectorySeparator,
entityNameToString: () => entityNameToString,
enumerateInsertsAndDeletes: () => enumerateInsertsAndDeletes,
equalOwnProperties: () => equalOwnProperties,
equateStringsCaseInsensitive: () => equateStringsCaseInsensitive,
equateStringsCaseSensitive: () => equateStringsCaseSensitive,
equateValues: () => equateValues,
esDecorateHelper: () => esDecorateHelper,
escapeJsxAttributeString: () => escapeJsxAttributeString,
escapeLeadingUnderscores: () => escapeLeadingUnderscores,
escapeNonAsciiString: () => escapeNonAsciiString,
escapeSnippetText: () => escapeSnippetText,
escapeString: () => escapeString,
every: () => every,
expandPreOrPostfixIncrementOrDecrementExpression: () => expandPreOrPostfixIncrementOrDecrementExpression,
explainFiles: () => explainFiles,
explainIfFileIsRedirectAndImpliedFormat: () => explainIfFileIsRedirectAndImpliedFormat,
exportAssignmentIsAlias: () => exportAssignmentIsAlias,
exportStarHelper: () => exportStarHelper,
expressionResultIsUnused: () => expressionResultIsUnused,
extend: () => extend,
extendsHelper: () => extendsHelper,
extensionFromPath: () => extensionFromPath,
extensionIsTS: () => extensionIsTS,
extensionsNotSupportingExtensionlessResolution: () => extensionsNotSupportingExtensionlessResolution,
externalHelpersModuleNameText: () => externalHelpersModuleNameText,
factory: () => factory,
fileExtensionIs: () => fileExtensionIs,
fileExtensionIsOneOf: () => fileExtensionIsOneOf,
fileIncludeReasonToDiagnostics: () => fileIncludeReasonToDiagnostics,
fileShouldUseJavaScriptRequire: () => fileShouldUseJavaScriptRequire,
filter: () => filter,
filterMutate: () => filterMutate,
filterSemanticDiagnostics: () => filterSemanticDiagnostics,
find: () => find,
findAncestor: () => findAncestor,
findBestPatternMatch: () => findBestPatternMatch,
findChildOfKind: () => findChildOfKind,
findComputedPropertyNameCacheAssignment: () => findComputedPropertyNameCacheAssignment,
findConfigFile: () => findConfigFile,
findContainingList: () => findContainingList,
findDiagnosticForNode: () => findDiagnosticForNode,
findFirstNonJsxWhitespaceToken: () => findFirstNonJsxWhitespaceToken,
findIndex: () => findIndex,
findLast: () => findLast,
findLastIndex: () => findLastIndex,
findListItemInfo: () => findListItemInfo,
findMap: () => findMap,
findModifier: () => findModifier,
findNextToken: () => findNextToken,
findPackageJson: () => findPackageJson,
findPackageJsons: () => findPackageJsons,
findPrecedingMatchingToken: () => findPrecedingMatchingToken,
findPrecedingToken: () => findPrecedingToken,
findSuperStatementIndex: () => findSuperStatementIndex,
findTokenOnLeftOfPosition: () => findTokenOnLeftOfPosition,
findUseStrictPrologue: () => findUseStrictPrologue,
first: () => first,
firstDefined: () => firstDefined,
firstDefinedIterator: () => firstDefinedIterator,
firstIterator: () => firstIterator,
firstOrOnly: () => firstOrOnly,
firstOrUndefined: () => firstOrUndefined,
firstOrUndefinedIterator: () => firstOrUndefinedIterator,
fixupCompilerOptions: () => fixupCompilerOptions,
flatMap: () => flatMap,
flatMapIterator: () => flatMapIterator,
flatMapToMutable: () => flatMapToMutable,
flatten: () => flatten,
flattenCommaList: () => flattenCommaList,
flattenDestructuringAssignment: () => flattenDestructuringAssignment,
flattenDestructuringBinding: () => flattenDestructuringBinding,
flattenDiagnosticMessageText: () => flattenDiagnosticMessageText,
forEach: () => forEach,
forEachAncestor: () => forEachAncestor,
forEachAncestorDirectory: () => forEachAncestorDirectory,
forEachChild: () => forEachChild,
forEachChildRecursively: () => forEachChildRecursively,
forEachEmittedFile: () => forEachEmittedFile,
forEachEnclosingBlockScopeContainer: () => forEachEnclosingBlockScopeContainer,
forEachEntry: () => forEachEntry,
forEachExternalModuleToImportFrom: () => forEachExternalModuleToImportFrom,
forEachImportClauseDeclaration: () => forEachImportClauseDeclaration,
forEachKey: () => forEachKey,
forEachLeadingCommentRange: () => forEachLeadingCommentRange,
forEachNameInAccessChainWalkingLeft: () => forEachNameInAccessChainWalkingLeft,
forEachPropertyAssignment: () => forEachPropertyAssignment,
forEachResolvedProjectReference: () => forEachResolvedProjectReference,
forEachReturnStatement: () => forEachReturnStatement,
forEachRight: () => forEachRight,
forEachTrailingCommentRange: () => forEachTrailingCommentRange,
forEachTsConfigPropArray: () => forEachTsConfigPropArray,
forEachUnique: () => forEachUnique,
forEachYieldExpression: () => forEachYieldExpression,
forSomeAncestorDirectory: () => forSomeAncestorDirectory,
formatColorAndReset: () => formatColorAndReset,
formatDiagnostic: () => formatDiagnostic,
formatDiagnostics: () => formatDiagnostics,
formatDiagnosticsWithColorAndContext: () => formatDiagnosticsWithColorAndContext,
formatGeneratedName: () => formatGeneratedName,
formatGeneratedNamePart: () => formatGeneratedNamePart,
formatLocation: () => formatLocation,
formatMessage: () => formatMessage,
formatStringFromArgs: () => formatStringFromArgs,
formatting: () => ts_formatting_exports,
fullTripleSlashAMDReferencePathRegEx: () => fullTripleSlashAMDReferencePathRegEx,
fullTripleSlashReferencePathRegEx: () => fullTripleSlashReferencePathRegEx,
generateDjb2Hash: () => generateDjb2Hash,
generateTSConfig: () => generateTSConfig,
generatorHelper: () => generatorHelper,
getAdjustedReferenceLocation: () => getAdjustedReferenceLocation,
getAdjustedRenameLocation: () => getAdjustedRenameLocation,
getAliasDeclarationFromName: () => getAliasDeclarationFromName,
getAllAccessorDeclarations: () => getAllAccessorDeclarations,
getAllDecoratorsOfClass: () => getAllDecoratorsOfClass,
getAllDecoratorsOfClassElement: () => getAllDecoratorsOfClassElement,
getAllJSDocTags: () => getAllJSDocTags,
getAllJSDocTagsOfKind: () => getAllJSDocTagsOfKind,
getAllKeys: () => getAllKeys,
getAllProjectOutputs: () => getAllProjectOutputs,
getAllSuperTypeNodes: () => getAllSuperTypeNodes,
getAllUnscopedEmitHelpers: () => getAllUnscopedEmitHelpers,
getAllowJSCompilerOption: () => getAllowJSCompilerOption,
getAllowSyntheticDefaultImports: () => getAllowSyntheticDefaultImports,
getAncestor: () => getAncestor,
getAnyExtensionFromPath: () => getAnyExtensionFromPath,
getAreDeclarationMapsEnabled: () => getAreDeclarationMapsEnabled,
getAssignedExpandoInitializer: () => getAssignedExpandoInitializer,
getAssignedName: () => getAssignedName,
getAssignmentDeclarationKind: () => getAssignmentDeclarationKind,
getAssignmentDeclarationPropertyAccessKind: () => getAssignmentDeclarationPropertyAccessKind,
getAssignmentTargetKind: () => getAssignmentTargetKind,
getAutomaticTypeDirectiveNames: () => getAutomaticTypeDirectiveNames,
getBaseFileName: () => getBaseFileName,
getBinaryOperatorPrecedence: () => getBinaryOperatorPrecedence,
getBuildInfo: () => getBuildInfo,
getBuildInfoFileVersionMap: () => getBuildInfoFileVersionMap,
getBuildInfoText: () => getBuildInfoText,
getBuildOrderFromAnyBuildOrder: () => getBuildOrderFromAnyBuildOrder,
getBuilderCreationParameters: () => getBuilderCreationParameters,
getBuilderFileEmit: () => getBuilderFileEmit,
getCheckFlags: () => getCheckFlags,
getClassExtendsHeritageElement: () => getClassExtendsHeritageElement,
getClassLikeDeclarationOfSymbol: () => getClassLikeDeclarationOfSymbol,
getCombinedLocalAndExportSymbolFlags: () => getCombinedLocalAndExportSymbolFlags,
getCombinedModifierFlags: () => getCombinedModifierFlags,
getCombinedNodeFlags: () => getCombinedNodeFlags,
getCombinedNodeFlagsAlwaysIncludeJSDoc: () => getCombinedNodeFlagsAlwaysIncludeJSDoc,
getCommentRange: () => getCommentRange,
getCommonSourceDirectory: () => getCommonSourceDirectory,
getCommonSourceDirectoryOfConfig: () => getCommonSourceDirectoryOfConfig,
getCompilerOptionValue: () => getCompilerOptionValue,
getCompilerOptionsDiffValue: () => getCompilerOptionsDiffValue,
getConditions: () => getConditions,
getConfigFileParsingDiagnostics: () => getConfigFileParsingDiagnostics,
getConstantValue: () => getConstantValue,
getContainerNode: () => getContainerNode,
getContainingClass: () => getContainingClass,
getContainingClassStaticBlock: () => getContainingClassStaticBlock,
getContainingFunction: () => getContainingFunction,
getContainingFunctionDeclaration: () => getContainingFunctionDeclaration,
getContainingFunctionOrClassStaticBlock: () => getContainingFunctionOrClassStaticBlock,
getContainingNodeArray: () => getContainingNodeArray,
getContainingObjectLiteralElement: () => getContainingObjectLiteralElement,
getContextualTypeFromParent: () => getContextualTypeFromParent,
getContextualTypeFromParentOrAncestorTypeNode: () => getContextualTypeFromParentOrAncestorTypeNode,
getCurrentTime: () => getCurrentTime,
getDeclarationDiagnostics: () => getDeclarationDiagnostics,
getDeclarationEmitExtensionForPath: () => getDeclarationEmitExtensionForPath,
getDeclarationEmitOutputFilePath: () => getDeclarationEmitOutputFilePath,
getDeclarationEmitOutputFilePathWorker: () => getDeclarationEmitOutputFilePathWorker,
getDeclarationFromName: () => getDeclarationFromName,
getDeclarationModifierFlagsFromSymbol: () => getDeclarationModifierFlagsFromSymbol,
getDeclarationOfKind: () => getDeclarationOfKind,
getDeclarationsOfKind: () => getDeclarationsOfKind,
getDeclaredExpandoInitializer: () => getDeclaredExpandoInitializer,
getDecorators: () => getDecorators,
getDefaultCompilerOptions: () => getDefaultCompilerOptions2,
getDefaultExportInfoWorker: () => getDefaultExportInfoWorker,
getDefaultFormatCodeSettings: () => getDefaultFormatCodeSettings,
getDefaultLibFileName: () => getDefaultLibFileName,
getDefaultLibFilePath: () => getDefaultLibFilePath,
getDefaultLikeExportInfo: () => getDefaultLikeExportInfo,
getDiagnosticText: () => getDiagnosticText,
getDiagnosticsWithinSpan: () => getDiagnosticsWithinSpan,
getDirectoryPath: () => getDirectoryPath,
getDirectoryToWatchFailedLookupLocation: () => getDirectoryToWatchFailedLookupLocation,
getDirectoryToWatchFailedLookupLocationFromTypeRoot: () => getDirectoryToWatchFailedLookupLocationFromTypeRoot,
getDocumentPositionMapper: () => getDocumentPositionMapper,
getESModuleInterop: () => getESModuleInterop,
getEditsForFileRename: () => getEditsForFileRename,
getEffectiveBaseTypeNode: () => getEffectiveBaseTypeNode,
getEffectiveConstraintOfTypeParameter: () => getEffectiveConstraintOfTypeParameter,
getEffectiveContainerForJSDocTemplateTag: () => getEffectiveContainerForJSDocTemplateTag,
getEffectiveImplementsTypeNodes: () => getEffectiveImplementsTypeNodes,
getEffectiveInitializer: () => getEffectiveInitializer,
getEffectiveJSDocHost: () => getEffectiveJSDocHost,
getEffectiveModifierFlags: () => getEffectiveModifierFlags,
getEffectiveModifierFlagsAlwaysIncludeJSDoc: () => getEffectiveModifierFlagsAlwaysIncludeJSDoc,
getEffectiveModifierFlagsNoCache: () => getEffectiveModifierFlagsNoCache,
getEffectiveReturnTypeNode: () => getEffectiveReturnTypeNode,
getEffectiveSetAccessorTypeAnnotationNode: () => getEffectiveSetAccessorTypeAnnotationNode,
getEffectiveTypeAnnotationNode: () => getEffectiveTypeAnnotationNode,
getEffectiveTypeParameterDeclarations: () => getEffectiveTypeParameterDeclarations,
getEffectiveTypeRoots: () => getEffectiveTypeRoots,
getElementOrPropertyAccessArgumentExpressionOrName: () => getElementOrPropertyAccessArgumentExpressionOrName,
getElementOrPropertyAccessName: () => getElementOrPropertyAccessName,
getElementsOfBindingOrAssignmentPattern: () => getElementsOfBindingOrAssignmentPattern,
getEmitDeclarations: () => getEmitDeclarations,
getEmitFlags: () => getEmitFlags,
getEmitHelpers: () => getEmitHelpers,
getEmitModuleDetectionKind: () => getEmitModuleDetectionKind,
getEmitModuleKind: () => getEmitModuleKind,
getEmitModuleResolutionKind: () => getEmitModuleResolutionKind,
getEmitScriptTarget: () => getEmitScriptTarget,
getEnclosingBlockScopeContainer: () => getEnclosingBlockScopeContainer,
getEncodedSemanticClassifications: () => getEncodedSemanticClassifications,
getEncodedSyntacticClassifications: () => getEncodedSyntacticClassifications,
getEndLinePosition: () => getEndLinePosition,
getEntityNameFromTypeNode: () => getEntityNameFromTypeNode,
getEntrypointsFromPackageJsonInfo: () => getEntrypointsFromPackageJsonInfo,
getErrorCountForSummary: () => getErrorCountForSummary,
getErrorSpanForNode: () => getErrorSpanForNode,
getErrorSummaryText: () => getErrorSummaryText,
getEscapedTextOfIdentifierOrLiteral: () => getEscapedTextOfIdentifierOrLiteral,
getEscapedTextOfJsxAttributeName: () => getEscapedTextOfJsxAttributeName,
getEscapedTextOfJsxNamespacedName: () => getEscapedTextOfJsxNamespacedName,
getExpandoInitializer: () => getExpandoInitializer,
getExportAssignmentExpression: () => getExportAssignmentExpression,
getExportInfoMap: () => getExportInfoMap,
getExportNeedsImportStarHelper: () => getExportNeedsImportStarHelper,
getExpressionAssociativity: () => getExpressionAssociativity,
getExpressionPrecedence: () => getExpressionPrecedence,
getExternalHelpersModuleName: () => getExternalHelpersModuleName,
getExternalModuleImportEqualsDeclarationExpression: () => getExternalModuleImportEqualsDeclarationExpression,
getExternalModuleName: () => getExternalModuleName,
getExternalModuleNameFromDeclaration: () => getExternalModuleNameFromDeclaration,
getExternalModuleNameFromPath: () => getExternalModuleNameFromPath,
getExternalModuleNameLiteral: () => getExternalModuleNameLiteral,
getExternalModuleRequireArgument: () => getExternalModuleRequireArgument,
getFallbackOptions: () => getFallbackOptions,
getFileEmitOutput: () => getFileEmitOutput,
getFileMatcherPatterns: () => getFileMatcherPatterns,
getFileNamesFromConfigSpecs: () => getFileNamesFromConfigSpecs,
getFileWatcherEventKind: () => getFileWatcherEventKind,
getFilesInErrorForSummary: () => getFilesInErrorForSummary,
getFirstConstructorWithBody: () => getFirstConstructorWithBody,
getFirstIdentifier: () => getFirstIdentifier,
getFirstNonSpaceCharacterPosition: () => getFirstNonSpaceCharacterPosition,
getFirstProjectOutput: () => getFirstProjectOutput,
getFixableErrorSpanExpression: () => getFixableErrorSpanExpression,
getFormatCodeSettingsForWriting: () => getFormatCodeSettingsForWriting,
getFullWidth: () => getFullWidth,
getFunctionFlags: () => getFunctionFlags,
getHeritageClause: () => getHeritageClause,
getHostSignatureFromJSDoc: () => getHostSignatureFromJSDoc,
getIdentifierAutoGenerate: () => getIdentifierAutoGenerate,
getIdentifierGeneratedImportReference: () => getIdentifierGeneratedImportReference,
getIdentifierTypeArguments: () => getIdentifierTypeArguments,
getImmediatelyInvokedFunctionExpression: () => getImmediatelyInvokedFunctionExpression,
getImpliedNodeFormatForFile: () => getImpliedNodeFormatForFile,
getImpliedNodeFormatForFileWorker: () => getImpliedNodeFormatForFileWorker,
getImportNeedsImportDefaultHelper: () => getImportNeedsImportDefaultHelper,
getImportNeedsImportStarHelper: () => getImportNeedsImportStarHelper,
getIndentSize: () => getIndentSize,
getIndentString: () => getIndentString,
getInferredLibraryNameResolveFrom: () => getInferredLibraryNameResolveFrom,
getInitializedVariables: () => getInitializedVariables,
getInitializerOfBinaryExpression: () => getInitializerOfBinaryExpression,
getInitializerOfBindingOrAssignmentElement: () => getInitializerOfBindingOrAssignmentElement,
getInterfaceBaseTypeNodes: () => getInterfaceBaseTypeNodes,
getInternalEmitFlags: () => getInternalEmitFlags,
getInvokedExpression: () => getInvokedExpression,
getIsolatedModules: () => getIsolatedModules,
getJSDocAugmentsTag: () => getJSDocAugmentsTag,
getJSDocClassTag: () => getJSDocClassTag,
getJSDocCommentRanges: () => getJSDocCommentRanges,
getJSDocCommentsAndTags: () => getJSDocCommentsAndTags,
getJSDocDeprecatedTag: () => getJSDocDeprecatedTag,
getJSDocDeprecatedTagNoCache: () => getJSDocDeprecatedTagNoCache,
getJSDocEnumTag: () => getJSDocEnumTag,
getJSDocHost: () => getJSDocHost,
getJSDocImplementsTags: () => getJSDocImplementsTags,
getJSDocOverrideTagNoCache: () => getJSDocOverrideTagNoCache,
getJSDocParameterTags: () => getJSDocParameterTags,
getJSDocParameterTagsNoCache: () => getJSDocParameterTagsNoCache,
getJSDocPrivateTag: () => getJSDocPrivateTag,
getJSDocPrivateTagNoCache: () => getJSDocPrivateTagNoCache,
getJSDocProtectedTag: () => getJSDocProtectedTag,
getJSDocProtectedTagNoCache: () => getJSDocProtectedTagNoCache,
getJSDocPublicTag: () => getJSDocPublicTag,
getJSDocPublicTagNoCache: () => getJSDocPublicTagNoCache,
getJSDocReadonlyTag: () => getJSDocReadonlyTag,
getJSDocReadonlyTagNoCache: () => getJSDocReadonlyTagNoCache,
getJSDocReturnTag: () => getJSDocReturnTag,
getJSDocReturnType: () => getJSDocReturnType,
getJSDocRoot: () => getJSDocRoot,
getJSDocSatisfiesExpressionType: () => getJSDocSatisfiesExpressionType,
getJSDocSatisfiesTag: () => getJSDocSatisfiesTag,
getJSDocTags: () => getJSDocTags,
getJSDocTagsNoCache: () => getJSDocTagsNoCache,
getJSDocTemplateTag: () => getJSDocTemplateTag,
getJSDocThisTag: () => getJSDocThisTag,
getJSDocType: () => getJSDocType,
getJSDocTypeAliasName: () => getJSDocTypeAliasName,
getJSDocTypeAssertionType: () => getJSDocTypeAssertionType,
getJSDocTypeParameterDeclarations: () => getJSDocTypeParameterDeclarations,
getJSDocTypeParameterTags: () => getJSDocTypeParameterTags,
getJSDocTypeParameterTagsNoCache: () => getJSDocTypeParameterTagsNoCache,
getJSDocTypeTag: () => getJSDocTypeTag,
getJSXImplicitImportBase: () => getJSXImplicitImportBase,
getJSXRuntimeImport: () => getJSXRuntimeImport,
getJSXTransformEnabled: () => getJSXTransformEnabled,
getKeyForCompilerOptions: () => getKeyForCompilerOptions,
getLanguageVariant: () => getLanguageVariant,
getLastChild: () => getLastChild,
getLeadingCommentRanges: () => getLeadingCommentRanges,
getLeadingCommentRangesOfNode: () => getLeadingCommentRangesOfNode,
getLeftmostAccessExpression: () => getLeftmostAccessExpression,
getLeftmostExpression: () => getLeftmostExpression,
getLineAndCharacterOfPosition: () => getLineAndCharacterOfPosition,
getLineInfo: () => getLineInfo,
getLineOfLocalPosition: () => getLineOfLocalPosition,
getLineOfLocalPositionFromLineMap: () => getLineOfLocalPositionFromLineMap,
getLineStartPositionForPosition: () => getLineStartPositionForPosition,
getLineStarts: () => getLineStarts,
getLinesBetweenPositionAndNextNonWhitespaceCharacter: () => getLinesBetweenPositionAndNextNonWhitespaceCharacter,
getLinesBetweenPositionAndPrecedingNonWhitespaceCharacter: () => getLinesBetweenPositionAndPrecedingNonWhitespaceCharacter,
getLinesBetweenPositions: () => getLinesBetweenPositions,
getLinesBetweenRangeEndAndRangeStart: () => getLinesBetweenRangeEndAndRangeStart,
getLinesBetweenRangeEndPositions: () => getLinesBetweenRangeEndPositions,
getLiteralText: () => getLiteralText,
getLocalNameForExternalImport: () => getLocalNameForExternalImport,
getLocalSymbolForExportDefault: () => getLocalSymbolForExportDefault,
getLocaleSpecificMessage: () => getLocaleSpecificMessage,
getLocaleTimeString: () => getLocaleTimeString,
getMappedContextSpan: () => getMappedContextSpan,
getMappedDocumentSpan: () => getMappedDocumentSpan,
getMappedLocation: () => getMappedLocation,
getMatchedFileSpec: () => getMatchedFileSpec,
getMatchedIncludeSpec: () => getMatchedIncludeSpec,
getMeaningFromDeclaration: () => getMeaningFromDeclaration,
getMeaningFromLocation: () => getMeaningFromLocation,
getMembersOfDeclaration: () => getMembersOfDeclaration,
getModeForFileReference: () => getModeForFileReference,
getModeForResolutionAtIndex: () => getModeForResolutionAtIndex,
getModeForUsageLocation: () => getModeForUsageLocation,
getModifiedTime: () => getModifiedTime,
getModifiers: () => getModifiers,
getModuleInstanceState: () => getModuleInstanceState,
getModuleNameStringLiteralAt: () => getModuleNameStringLiteralAt,
getModuleSpecifierEndingPreference: () => getModuleSpecifierEndingPreference,
getModuleSpecifierResolverHost: () => getModuleSpecifierResolverHost,
getNameForExportedSymbol: () => getNameForExportedSymbol,
getNameFromIndexInfo: () => getNameFromIndexInfo,
getNameFromPropertyName: () => getNameFromPropertyName,
getNameOfAccessExpression: () => getNameOfAccessExpression,
getNameOfCompilerOptionValue: () => getNameOfCompilerOptionValue,
getNameOfDeclaration: () => getNameOfDeclaration,
getNameOfExpando: () => getNameOfExpando,
getNameOfJSDocTypedef: () => getNameOfJSDocTypedef,
getNameOrArgument: () => getNameOrArgument,
getNameTable: () => getNameTable,
getNamesForExportedSymbol: () => getNamesForExportedSymbol,
getNamespaceDeclarationNode: () => getNamespaceDeclarationNode,
getNewLineCharacter: () => getNewLineCharacter,
getNewLineKind: () => getNewLineKind,
getNewLineOrDefaultFromHost: () => getNewLineOrDefaultFromHost,
getNewTargetContainer: () => getNewTargetContainer,
getNextJSDocCommentLocation: () => getNextJSDocCommentLocation,
getNodeForGeneratedName: () => getNodeForGeneratedName,
getNodeId: () => getNodeId,
getNodeKind: () => getNodeKind,
getNodeModifiers: () => getNodeModifiers,
getNodeModulePathParts: () => getNodeModulePathParts,
getNonAssignedNameOfDeclaration: () => getNonAssignedNameOfDeclaration,
getNonAssignmentOperatorForCompoundAssignment: () => getNonAssignmentOperatorForCompoundAssignment,
getNonAugmentationDeclaration: () => getNonAugmentationDeclaration,
getNonDecoratorTokenPosOfNode: () => getNonDecoratorTokenPosOfNode,
getNormalizedAbsolutePath: () => getNormalizedAbsolutePath,
getNormalizedAbsolutePathWithoutRoot: () => getNormalizedAbsolutePathWithoutRoot,
getNormalizedPathComponents: () => getNormalizedPathComponents,
getObjectFlags: () => getObjectFlags,
getOperator: () => getOperator,
getOperatorAssociativity: () => getOperatorAssociativity,
getOperatorPrecedence: () => getOperatorPrecedence,
getOptionFromName: () => getOptionFromName,
getOptionsForLibraryResolution: () => getOptionsForLibraryResolution,
getOptionsNameMap: () => getOptionsNameMap,
getOrCreateEmitNode: () => getOrCreateEmitNode,
getOrCreateExternalHelpersModuleNameIfNeeded: () => getOrCreateExternalHelpersModuleNameIfNeeded,
getOrUpdate: () => getOrUpdate,
getOriginalNode: () => getOriginalNode,
getOriginalNodeId: () => getOriginalNodeId,
getOriginalSourceFile: () => getOriginalSourceFile,
getOutputDeclarationFileName: () => getOutputDeclarationFileName,
getOutputExtension: () => getOutputExtension,
getOutputFileNames: () => getOutputFileNames,
getOutputPathsFor: () => getOutputPathsFor,
getOutputPathsForBundle: () => getOutputPathsForBundle,
getOwnEmitOutputFilePath: () => getOwnEmitOutputFilePath,
getOwnKeys: () => getOwnKeys,
getOwnValues: () => getOwnValues,
getPackageJsonInfo: () => getPackageJsonInfo,
getPackageJsonTypesVersionsPaths: () => getPackageJsonTypesVersionsPaths,
getPackageJsonsVisibleToFile: () => getPackageJsonsVisibleToFile,
getPackageNameFromTypesPackageName: () => getPackageNameFromTypesPackageName,
getPackageScopeForPath: () => getPackageScopeForPath,
getParameterSymbolFromJSDoc: () => getParameterSymbolFromJSDoc,
getParameterTypeNode: () => getParameterTypeNode,
getParentNodeInSpan: () => getParentNodeInSpan,
getParseTreeNode: () => getParseTreeNode,
getParsedCommandLineOfConfigFile: () => getParsedCommandLineOfConfigFile,
getPathComponents: () => getPathComponents,
getPathComponentsRelativeTo: () => getPathComponentsRelativeTo,
getPathFromPathComponents: () => getPathFromPathComponents,
getPathUpdater: () => getPathUpdater,
getPathsBasePath: () => getPathsBasePath,
getPatternFromSpec: () => getPatternFromSpec,
getPendingEmitKind: () => getPendingEmitKind,
getPositionOfLineAndCharacter: () => getPositionOfLineAndCharacter,
getPossibleGenericSignatures: () => getPossibleGenericSignatures,
getPossibleOriginalInputExtensionForExtension: () => getPossibleOriginalInputExtensionForExtension,
getPossibleTypeArgumentsInfo: () => getPossibleTypeArgumentsInfo,
getPreEmitDiagnostics: () => getPreEmitDiagnostics,
getPrecedingNonSpaceCharacterPosition: () => getPrecedingNonSpaceCharacterPosition,
getPrivateIdentifier: () => getPrivateIdentifier,
getProperties: () => getProperties,
getProperty: () => getProperty,
getPropertyArrayElementValue: () => getPropertyArrayElementValue,
getPropertyAssignmentAliasLikeExpression: () => getPropertyAssignmentAliasLikeExpression,
getPropertyNameForPropertyNameNode: () => getPropertyNameForPropertyNameNode,
getPropertyNameForUniqueESSymbol: () => getPropertyNameForUniqueESSymbol,
getPropertyNameOfBindingOrAssignmentElement: () => getPropertyNameOfBindingOrAssignmentElement,
getPropertySymbolFromBindingElement: () => getPropertySymbolFromBindingElement,
getPropertySymbolsFromContextualType: () => getPropertySymbolsFromContextualType,
getQuoteFromPreference: () => getQuoteFromPreference,
getQuotePreference: () => getQuotePreference,
getRangesWhere: () => getRangesWhere,
getRefactorContextSpan: () => getRefactorContextSpan,
getReferencedFileLocation: () => getReferencedFileLocation,
getRegexFromPattern: () => getRegexFromPattern,
getRegularExpressionForWildcard: () => getRegularExpressionForWildcard,
getRegularExpressionsForWildcards: () => getRegularExpressionsForWildcards,
getRelativePathFromDirectory: () => getRelativePathFromDirectory,
getRelativePathFromFile: () => getRelativePathFromFile,
getRelativePathToDirectoryOrUrl: () => getRelativePathToDirectoryOrUrl,
getRenameLocation: () => getRenameLocation,
getReplacementSpanForContextToken: () => getReplacementSpanForContextToken,
getResolutionDiagnostic: () => getResolutionDiagnostic,
getResolutionModeOverrideForClause: () => getResolutionModeOverrideForClause,
getResolveJsonModule: () => getResolveJsonModule,
getResolvePackageJsonExports: () => getResolvePackageJsonExports,
getResolvePackageJsonImports: () => getResolvePackageJsonImports,
getResolvedExternalModuleName: () => getResolvedExternalModuleName,
getResolvedModule: () => getResolvedModule,
getResolvedTypeReferenceDirective: () => getResolvedTypeReferenceDirective,
getRestIndicatorOfBindingOrAssignmentElement: () => getRestIndicatorOfBindingOrAssignmentElement,
getRestParameterElementType: () => getRestParameterElementType,
getRightMostAssignedExpression: () => getRightMostAssignedExpression,
getRootDeclaration: () => getRootDeclaration,
getRootDirectoryOfResolutionCache: () => getRootDirectoryOfResolutionCache,
getRootLength: () => getRootLength,
getRootPathSplitLength: () => getRootPathSplitLength,
getScriptKind: () => getScriptKind,
getScriptKindFromFileName: () => getScriptKindFromFileName,
getScriptTargetFeatures: () => getScriptTargetFeatures,
getSelectedEffectiveModifierFlags: () => getSelectedEffectiveModifierFlags,
getSelectedSyntacticModifierFlags: () => getSelectedSyntacticModifierFlags,
getSemanticClassifications: () => getSemanticClassifications,
getSemanticJsxChildren: () => getSemanticJsxChildren,
getSetAccessorTypeAnnotationNode: () => getSetAccessorTypeAnnotationNode,
getSetAccessorValueParameter: () => getSetAccessorValueParameter,
getSetExternalModuleIndicator: () => getSetExternalModuleIndicator,
getShebang: () => getShebang,
getSingleInitializerOfVariableStatementOrPropertyDeclaration: () => getSingleInitializerOfVariableStatementOrPropertyDeclaration,
getSingleVariableOfVariableStatement: () => getSingleVariableOfVariableStatement,
getSnapshotText: () => getSnapshotText,
getSnippetElement: () => getSnippetElement,
getSourceFileOfModule: () => getSourceFileOfModule,
getSourceFileOfNode: () => getSourceFileOfNode,
getSourceFilePathInNewDir: () => getSourceFilePathInNewDir,
getSourceFilePathInNewDirWorker: () => getSourceFilePathInNewDirWorker,
getSourceFileVersionAsHashFromText: () => getSourceFileVersionAsHashFromText,
getSourceFilesToEmit: () => getSourceFilesToEmit,
getSourceMapRange: () => getSourceMapRange,
getSourceMapper: () => getSourceMapper,
getSourceTextOfNodeFromSourceFile: () => getSourceTextOfNodeFromSourceFile,
getSpanOfTokenAtPosition: () => getSpanOfTokenAtPosition,
getSpellingSuggestion: () => getSpellingSuggestion,
getStartPositionOfLine: () => getStartPositionOfLine,
getStartPositionOfRange: () => getStartPositionOfRange,
getStartsOnNewLine: () => getStartsOnNewLine,
getStaticPropertiesAndClassStaticBlock: () => getStaticPropertiesAndClassStaticBlock,
getStrictOptionValue: () => getStrictOptionValue,
getStringComparer: () => getStringComparer,
getSuperCallFromStatement: () => getSuperCallFromStatement,
getSuperContainer: () => getSuperContainer,
getSupportedCodeFixes: () => getSupportedCodeFixes,
getSupportedExtensions: () => getSupportedExtensions,
getSupportedExtensionsWithJsonIfResolveJsonModule: () => getSupportedExtensionsWithJsonIfResolveJsonModule,
getSwitchedType: () => getSwitchedType,
getSymbolId: () => getSymbolId,
getSymbolNameForPrivateIdentifier: () => getSymbolNameForPrivateIdentifier,
getSymbolTarget: () => getSymbolTarget,
getSyntacticClassifications: () => getSyntacticClassifications,
getSyntacticModifierFlags: () => getSyntacticModifierFlags,
getSyntacticModifierFlagsNoCache: () => getSyntacticModifierFlagsNoCache,
getSynthesizedDeepClone: () => getSynthesizedDeepClone,
getSynthesizedDeepCloneWithReplacements: () => getSynthesizedDeepCloneWithReplacements,
getSynthesizedDeepClones: () => getSynthesizedDeepClones,
getSynthesizedDeepClonesWithReplacements: () => getSynthesizedDeepClonesWithReplacements,
getSyntheticLeadingComments: () => getSyntheticLeadingComments,
getSyntheticTrailingComments: () => getSyntheticTrailingComments,
getTargetLabel: () => getTargetLabel,
getTargetOfBindingOrAssignmentElement: () => getTargetOfBindingOrAssignmentElement,
getTemporaryModuleResolutionState: () => getTemporaryModuleResolutionState,
getTextOfConstantValue: () => getTextOfConstantValue,
getTextOfIdentifierOrLiteral: () => getTextOfIdentifierOrLiteral,
getTextOfJSDocComment: () => getTextOfJSDocComment,
getTextOfJsxAttributeName: () => getTextOfJsxAttributeName,
getTextOfJsxNamespacedName: () => getTextOfJsxNamespacedName,
getTextOfNode: () => getTextOfNode,
getTextOfNodeFromSourceText: () => getTextOfNodeFromSourceText,
getTextOfPropertyName: () => getTextOfPropertyName,
getThisContainer: () => getThisContainer,
getThisParameter: () => getThisParameter,
getTokenAtPosition: () => getTokenAtPosition,
getTokenPosOfNode: () => getTokenPosOfNode,
getTokenSourceMapRange: () => getTokenSourceMapRange,
getTouchingPropertyName: () => getTouchingPropertyName,
getTouchingToken: () => getTouchingToken,
getTrailingCommentRanges: () => getTrailingCommentRanges,
getTrailingSemicolonDeferringWriter: () => getTrailingSemicolonDeferringWriter,
getTransformFlagsSubtreeExclusions: () => getTransformFlagsSubtreeExclusions,
getTransformers: () => getTransformers,
getTsBuildInfoEmitOutputFilePath: () => getTsBuildInfoEmitOutputFilePath,
getTsConfigObjectLiteralExpression: () => getTsConfigObjectLiteralExpression,
getTsConfigPropArrayElementValue: () => getTsConfigPropArrayElementValue,
getTypeAnnotationNode: () => getTypeAnnotationNode,
getTypeArgumentOrTypeParameterList: () => getTypeArgumentOrTypeParameterList,
getTypeKeywordOfTypeOnlyImport: () => getTypeKeywordOfTypeOnlyImport,
getTypeNode: () => getTypeNode,
getTypeNodeIfAccessible: () => getTypeNodeIfAccessible,
getTypeParameterFromJsDoc: () => getTypeParameterFromJsDoc,
getTypeParameterOwner: () => getTypeParameterOwner,
getTypesPackageName: () => getTypesPackageName,
getUILocale: () => getUILocale,
getUniqueName: () => getUniqueName,
getUniqueSymbolId: () => getUniqueSymbolId,
getUseDefineForClassFields: () => getUseDefineForClassFields,
getWatchErrorSummaryDiagnosticMessage: () => getWatchErrorSummaryDiagnosticMessage,
getWatchFactory: () => getWatchFactory,
group: () => group,
groupBy: () => groupBy,
guessIndentation: () => guessIndentation,
handleNoEmitOptions: () => handleNoEmitOptions,
hasAbstractModifier: () => hasAbstractModifier,
hasAccessorModifier: () => hasAccessorModifier,
hasAmbientModifier: () => hasAmbientModifier,
hasChangesInResolutions: () => hasChangesInResolutions,
hasChildOfKind: () => hasChildOfKind,
hasContextSensitiveParameters: () => hasContextSensitiveParameters,
hasDecorators: () => hasDecorators,
hasDocComment: () => hasDocComment,
hasDynamicName: () => hasDynamicName,
hasEffectiveModifier: () => hasEffectiveModifier,
hasEffectiveModifiers: () => hasEffectiveModifiers,
hasEffectiveReadonlyModifier: () => hasEffectiveReadonlyModifier,
hasExtension: () => hasExtension,
hasIndexSignature: () => hasIndexSignature,
hasInitializer: () => hasInitializer,
hasInvalidEscape: () => hasInvalidEscape,
hasJSDocNodes: () => hasJSDocNodes,
hasJSDocParameterTags: () => hasJSDocParameterTags,
hasJSFileExtension: () => hasJSFileExtension,
hasJsonModuleEmitEnabled: () => hasJsonModuleEmitEnabled,
hasOnlyExpressionInitializer: () => hasOnlyExpressionInitializer,
hasOverrideModifier: () => hasOverrideModifier,
hasPossibleExternalModuleReference: () => hasPossibleExternalModuleReference,
hasProperty: () => hasProperty,
hasPropertyAccessExpressionWithName: () => hasPropertyAccessExpressionWithName,
hasQuestionToken: () => hasQuestionToken,
hasRecordedExternalHelpers: () => hasRecordedExternalHelpers,
hasRestParameter: () => hasRestParameter,
hasScopeMarker: () => hasScopeMarker,
hasStaticModifier: () => hasStaticModifier,
hasSyntacticModifier: () => hasSyntacticModifier,
hasSyntacticModifiers: () => hasSyntacticModifiers,
hasTSFileExtension: () => hasTSFileExtension,
hasTabstop: () => hasTabstop,
hasTrailingDirectorySeparator: () => hasTrailingDirectorySeparator,
hasType: () => hasType,
hasTypeArguments: () => hasTypeArguments,
hasZeroOrOneAsteriskCharacter: () => hasZeroOrOneAsteriskCharacter,
helperString: () => helperString,
hostGetCanonicalFileName: () => hostGetCanonicalFileName,
hostUsesCaseSensitiveFileNames: () => hostUsesCaseSensitiveFileNames,
idText: () => idText,
identifierIsThisKeyword: () => identifierIsThisKeyword,
identifierToKeywordKind: () => identifierToKeywordKind,
identity: () => identity,
identitySourceMapConsumer: () => identitySourceMapConsumer,
ignoreSourceNewlines: () => ignoreSourceNewlines,
ignoredPaths: () => ignoredPaths,
importDefaultHelper: () => importDefaultHelper,
importFromModuleSpecifier: () => importFromModuleSpecifier,
importNameElisionDisabled: () => importNameElisionDisabled,
importStarHelper: () => importStarHelper,
indexOfAnyCharCode: () => indexOfAnyCharCode,
indexOfNode: () => indexOfNode,
indicesOf: () => indicesOf,
inferredTypesContainingFile: () => inferredTypesContainingFile,
insertImports: () => insertImports,
insertLeadingStatement: () => insertLeadingStatement,
insertSorted: () => insertSorted,
insertStatementAfterCustomPrologue: () => insertStatementAfterCustomPrologue,
insertStatementAfterStandardPrologue: () => insertStatementAfterStandardPrologue,
insertStatementsAfterCustomPrologue: () => insertStatementsAfterCustomPrologue,
insertStatementsAfterStandardPrologue: () => insertStatementsAfterStandardPrologue,
intersperse: () => intersperse,
intrinsicTagNameToString: () => intrinsicTagNameToString,
introducesArgumentsExoticObject: () => introducesArgumentsExoticObject,
inverseJsxOptionMap: () => inverseJsxOptionMap,
isAbstractConstructorSymbol: () => isAbstractConstructorSymbol,
isAbstractModifier: () => isAbstractModifier,
isAccessExpression: () => isAccessExpression,
isAccessibilityModifier: () => isAccessibilityModifier,
isAccessor: () => isAccessor,
isAccessorModifier: () => isAccessorModifier,
isAliasSymbolDeclaration: () => isAliasSymbolDeclaration,
isAliasableExpression: () => isAliasableExpression,
isAmbientModule: () => isAmbientModule,
isAmbientPropertyDeclaration: () => isAmbientPropertyDeclaration,
isAnonymousFunctionDefinition: () => isAnonymousFunctionDefinition,
isAnyDirectorySeparator: () => isAnyDirectorySeparator,
isAnyImportOrBareOrAccessedRequire: () => isAnyImportOrBareOrAccessedRequire,
isAnyImportOrReExport: () => isAnyImportOrReExport,
isAnyImportSyntax: () => isAnyImportSyntax,
isAnySupportedFileExtension: () => isAnySupportedFileExtension,
isApplicableVersionedTypesKey: () => isApplicableVersionedTypesKey,
isArgumentExpressionOfElementAccess: () => isArgumentExpressionOfElementAccess,
isArray: () => isArray,
isArrayBindingElement: () => isArrayBindingElement,
isArrayBindingOrAssignmentElement: () => isArrayBindingOrAssignmentElement,
isArrayBindingOrAssignmentPattern: () => isArrayBindingOrAssignmentPattern,
isArrayBindingPattern: () => isArrayBindingPattern,
isArrayLiteralExpression: () => isArrayLiteralExpression,
isArrayLiteralOrObjectLiteralDestructuringPattern: () => isArrayLiteralOrObjectLiteralDestructuringPattern,
isArrayTypeNode: () => isArrayTypeNode,
isArrowFunction: () => isArrowFunction,
isAsExpression: () => isAsExpression,
isAssertClause: () => isAssertClause,
isAssertEntry: () => isAssertEntry,
isAssertionExpression: () => isAssertionExpression,
isAssertionKey: () => isAssertionKey,
isAssertsKeyword: () => isAssertsKeyword,
isAssignmentDeclaration: () => isAssignmentDeclaration,
isAssignmentExpression: () => isAssignmentExpression,
isAssignmentOperator: () => isAssignmentOperator,
isAssignmentPattern: () => isAssignmentPattern,
isAssignmentTarget: () => isAssignmentTarget,
isAsteriskToken: () => isAsteriskToken,
isAsyncFunction: () => isAsyncFunction,
isAsyncModifier: () => isAsyncModifier,
isAutoAccessorPropertyDeclaration: () => isAutoAccessorPropertyDeclaration,
isAwaitExpression: () => isAwaitExpression,
isAwaitKeyword: () => isAwaitKeyword,
isBigIntLiteral: () => isBigIntLiteral,
isBinaryExpression: () => isBinaryExpression,
isBinaryOperatorToken: () => isBinaryOperatorToken,
isBindableObjectDefinePropertyCall: () => isBindableObjectDefinePropertyCall,
isBindableStaticAccessExpression: () => isBindableStaticAccessExpression,
isBindableStaticElementAccessExpression: () => isBindableStaticElementAccessExpression,
isBindableStaticNameExpression: () => isBindableStaticNameExpression,
isBindingElement: () => isBindingElement,
isBindingElementOfBareOrAccessedRequire: () => isBindingElementOfBareOrAccessedRequire,
isBindingName: () => isBindingName,
isBindingOrAssignmentElement: () => isBindingOrAssignmentElement,
isBindingOrAssignmentPattern: () => isBindingOrAssignmentPattern,
isBindingPattern: () => isBindingPattern,
isBlock: () => isBlock,
isBlockOrCatchScoped: () => isBlockOrCatchScoped,
isBlockScope: () => isBlockScope,
isBlockScopedContainerTopLevel: () => isBlockScopedContainerTopLevel,
isBooleanLiteral: () => isBooleanLiteral,
isBreakOrContinueStatement: () => isBreakOrContinueStatement,
isBreakStatement: () => isBreakStatement,
isBuildInfoFile: () => isBuildInfoFile,
isBuilderProgram: () => isBuilderProgram2,
isBundle: () => isBundle,
isBundleFileTextLike: () => isBundleFileTextLike,
isCallChain: () => isCallChain,
isCallExpression: () => isCallExpression,
isCallExpressionTarget: () => isCallExpressionTarget,
isCallLikeExpression: () => isCallLikeExpression,
isCallOrNewExpression: () => isCallOrNewExpression,
isCallOrNewExpressionTarget: () => isCallOrNewExpressionTarget,
isCallSignatureDeclaration: () => isCallSignatureDeclaration,
isCallToHelper: () => isCallToHelper,
isCaseBlock: () => isCaseBlock,
isCaseClause: () => isCaseClause,
isCaseKeyword: () => isCaseKeyword,
isCaseOrDefaultClause: () => isCaseOrDefaultClause,
isCatchClause: () => isCatchClause,
isCatchClauseVariableDeclaration: () => isCatchClauseVariableDeclaration,
isCatchClauseVariableDeclarationOrBindingElement: () => isCatchClauseVariableDeclarationOrBindingElement,
isCheckJsEnabledForFile: () => isCheckJsEnabledForFile,
isChildOfNodeWithKind: () => isChildOfNodeWithKind,
isCircularBuildOrder: () => isCircularBuildOrder,
isClassDeclaration: () => isClassDeclaration,
isClassElement: () => isClassElement,
isClassExpression: () => isClassExpression,
isClassLike: () => isClassLike,
isClassMemberModifier: () => isClassMemberModifier,
isClassOrTypeElement: () => isClassOrTypeElement,
isClassStaticBlockDeclaration: () => isClassStaticBlockDeclaration,
isCollapsedRange: () => isCollapsedRange,
isColonToken: () => isColonToken,
isCommaExpression: () => isCommaExpression,
isCommaListExpression: () => isCommaListExpression,
isCommaSequence: () => isCommaSequence,
isCommaToken: () => isCommaToken,
isComment: () => isComment,
isCommonJsExportPropertyAssignment: () => isCommonJsExportPropertyAssignment,
isCommonJsExportedExpression: () => isCommonJsExportedExpression,
isCompoundAssignment: () => isCompoundAssignment,
isComputedNonLiteralName: () => isComputedNonLiteralName,
isComputedPropertyName: () => isComputedPropertyName,
isConciseBody: () => isConciseBody,
isConditionalExpression: () => isConditionalExpression,
isConditionalTypeNode: () => isConditionalTypeNode,
isConstTypeReference: () => isConstTypeReference,
isConstructSignatureDeclaration: () => isConstructSignatureDeclaration,
isConstructorDeclaration: () => isConstructorDeclaration,
isConstructorTypeNode: () => isConstructorTypeNode,
isContextualKeyword: () => isContextualKeyword,
isContinueStatement: () => isContinueStatement,
isCustomPrologue: () => isCustomPrologue,
isDebuggerStatement: () => isDebuggerStatement,
isDeclaration: () => isDeclaration,
isDeclarationBindingElement: () => isDeclarationBindingElement,
isDeclarationFileName: () => isDeclarationFileName,
isDeclarationName: () => isDeclarationName,
isDeclarationNameOfEnumOrNamespace: () => isDeclarationNameOfEnumOrNamespace,
isDeclarationReadonly: () => isDeclarationReadonly,
isDeclarationStatement: () => isDeclarationStatement,
isDeclarationWithTypeParameterChildren: () => isDeclarationWithTypeParameterChildren,
isDeclarationWithTypeParameters: () => isDeclarationWithTypeParameters,
isDecorator: () => isDecorator,
isDecoratorTarget: () => isDecoratorTarget,
isDefaultClause: () => isDefaultClause,
isDefaultImport: () => isDefaultImport,
isDefaultModifier: () => isDefaultModifier,
isDefaultedExpandoInitializer: () => isDefaultedExpandoInitializer,
isDeleteExpression: () => isDeleteExpression,
isDeleteTarget: () => isDeleteTarget,
isDeprecatedDeclaration: () => isDeprecatedDeclaration,
isDestructuringAssignment: () => isDestructuringAssignment,
isDiagnosticWithLocation: () => isDiagnosticWithLocation,
isDiskPathRoot: () => isDiskPathRoot,
isDoStatement: () => isDoStatement,
isDotDotDotToken: () => isDotDotDotToken,
isDottedName: () => isDottedName,
isDynamicName: () => isDynamicName,
isESSymbolIdentifier: () => isESSymbolIdentifier,
isEffectiveExternalModule: () => isEffectiveExternalModule,
isEffectiveModuleDeclaration: () => isEffectiveModuleDeclaration,
isEffectiveStrictModeSourceFile: () => isEffectiveStrictModeSourceFile,
isElementAccessChain: () => isElementAccessChain,
isElementAccessExpression: () => isElementAccessExpression,
isEmittedFileOfProgram: () => isEmittedFileOfProgram,
isEmptyArrayLiteral: () => isEmptyArrayLiteral,
isEmptyBindingElement: () => isEmptyBindingElement,
isEmptyBindingPattern: () => isEmptyBindingPattern,
isEmptyObjectLiteral: () => isEmptyObjectLiteral,
isEmptyStatement: () => isEmptyStatement,
isEmptyStringLiteral: () => isEmptyStringLiteral,
isEntityName: () => isEntityName,
isEntityNameExpression: () => isEntityNameExpression,
isEnumConst: () => isEnumConst,
isEnumDeclaration: () => isEnumDeclaration,
isEnumMember: () => isEnumMember,
isEqualityOperatorKind: () => isEqualityOperatorKind,
isEqualsGreaterThanToken: () => isEqualsGreaterThanToken,
isExclamationToken: () => isExclamationToken,
isExcludedFile: () => isExcludedFile,
isExclusivelyTypeOnlyImportOrExport: () => isExclusivelyTypeOnlyImportOrExport,
isExportAssignment: () => isExportAssignment,
isExportDeclaration: () => isExportDeclaration,
isExportModifier: () => isExportModifier,
isExportName: () => isExportName,
isExportNamespaceAsDefaultDeclaration: () => isExportNamespaceAsDefaultDeclaration,
isExportOrDefaultModifier: () => isExportOrDefaultModifier,
isExportSpecifier: () => isExportSpecifier,
isExportsIdentifier: () => isExportsIdentifier,
isExportsOrModuleExportsOrAlias: () => isExportsOrModuleExportsOrAlias,
isExpression: () => isExpression,
isExpressionNode: () => isExpressionNode,
isExpressionOfExternalModuleImportEqualsDeclaration: () => isExpressionOfExternalModuleImportEqualsDeclaration,
isExpressionOfOptionalChainRoot: () => isExpressionOfOptionalChainRoot,
isExpressionStatement: () => isExpressionStatement,
isExpressionWithTypeArguments: () => isExpressionWithTypeArguments,
isExpressionWithTypeArgumentsInClassExtendsClause: () => isExpressionWithTypeArgumentsInClassExtendsClause,
isExternalModule: () => isExternalModule,
isExternalModuleAugmentation: () => isExternalModuleAugmentation,
isExternalModuleImportEqualsDeclaration: () => isExternalModuleImportEqualsDeclaration,
isExternalModuleIndicator: () => isExternalModuleIndicator,
isExternalModuleNameRelative: () => isExternalModuleNameRelative,
isExternalModuleReference: () => isExternalModuleReference,
isExternalModuleSymbol: () => isExternalModuleSymbol,
isExternalOrCommonJsModule: () => isExternalOrCommonJsModule,
isFileLevelUniqueName: () => isFileLevelUniqueName,
isFileProbablyExternalModule: () => isFileProbablyExternalModule,
isFirstDeclarationOfSymbolParameter: () => isFirstDeclarationOfSymbolParameter,
isFixablePromiseHandler: () => isFixablePromiseHandler,
isForInOrOfStatement: () => isForInOrOfStatement,
isForInStatement: () => isForInStatement,
isForInitializer: () => isForInitializer,
isForOfStatement: () => isForOfStatement,
isForStatement: () => isForStatement,
isFunctionBlock: () => isFunctionBlock,
isFunctionBody: () => isFunctionBody,
isFunctionDeclaration: () => isFunctionDeclaration,
isFunctionExpression: () => isFunctionExpression,
isFunctionExpressionOrArrowFunction: () => isFunctionExpressionOrArrowFunction,
isFunctionLike: () => isFunctionLike,
isFunctionLikeDeclaration: () => isFunctionLikeDeclaration,
isFunctionLikeKind: () => isFunctionLikeKind,
isFunctionLikeOrClassStaticBlockDeclaration: () => isFunctionLikeOrClassStaticBlockDeclaration,
isFunctionOrConstructorTypeNode: () => isFunctionOrConstructorTypeNode,
isFunctionOrModuleBlock: () => isFunctionOrModuleBlock,
isFunctionSymbol: () => isFunctionSymbol,
isFunctionTypeNode: () => isFunctionTypeNode,
isFutureReservedKeyword: () => isFutureReservedKeyword,
isGeneratedIdentifier: () => isGeneratedIdentifier,
isGeneratedPrivateIdentifier: () => isGeneratedPrivateIdentifier,
isGetAccessor: () => isGetAccessor,
isGetAccessorDeclaration: () => isGetAccessorDeclaration,
isGetOrSetAccessorDeclaration: () => isGetOrSetAccessorDeclaration,
isGlobalDeclaration: () => isGlobalDeclaration,
isGlobalScopeAugmentation: () => isGlobalScopeAugmentation,
isGrammarError: () => isGrammarError,
isHeritageClause: () => isHeritageClause,
isHoistedFunction: () => isHoistedFunction,
isHoistedVariableStatement: () => isHoistedVariableStatement,
isIdentifier: () => isIdentifier,
isIdentifierANonContextualKeyword: () => isIdentifierANonContextualKeyword,
isIdentifierName: () => isIdentifierName,
isIdentifierOrThisTypeNode: () => isIdentifierOrThisTypeNode,
isIdentifierPart: () => isIdentifierPart,
isIdentifierStart: () => isIdentifierStart,
isIdentifierText: () => isIdentifierText,
isIdentifierTypePredicate: () => isIdentifierTypePredicate,
isIdentifierTypeReference: () => isIdentifierTypeReference,
isIfStatement: () => isIfStatement,
isIgnoredFileFromWildCardWatching: () => isIgnoredFileFromWildCardWatching,
isImplicitGlob: () => isImplicitGlob,
isImportCall: () => isImportCall,
isImportClause: () => isImportClause,
isImportDeclaration: () => isImportDeclaration,
isImportEqualsDeclaration: () => isImportEqualsDeclaration,
isImportKeyword: () => isImportKeyword,
isImportMeta: () => isImportMeta,
isImportOrExportSpecifier: () => isImportOrExportSpecifier,
isImportOrExportSpecifierName: () => isImportOrExportSpecifierName,
isImportSpecifier: () => isImportSpecifier,
isImportTypeAssertionContainer: () => isImportTypeAssertionContainer,
isImportTypeNode: () => isImportTypeNode,
isImportableFile: () => isImportableFile,
isInComment: () => isInComment,
isInExpressionContext: () => isInExpressionContext,
isInJSDoc: () => isInJSDoc,
isInJSFile: () => isInJSFile,
isInJSXText: () => isInJSXText,
isInJsonFile: () => isInJsonFile,
isInNonReferenceComment: () => isInNonReferenceComment,
isInReferenceComment: () => isInReferenceComment,
isInRightSideOfInternalImportEqualsDeclaration: () => isInRightSideOfInternalImportEqualsDeclaration,
isInString: () => isInString,
isInTemplateString: () => isInTemplateString,
isInTopLevelContext: () => isInTopLevelContext,
isIncrementalCompilation: () => isIncrementalCompilation,
isIndexSignatureDeclaration: () => isIndexSignatureDeclaration,
isIndexedAccessTypeNode: () => isIndexedAccessTypeNode,
isInferTypeNode: () => isInferTypeNode,
isInfinityOrNaNString: () => isInfinityOrNaNString,
isInitializedProperty: () => isInitializedProperty,
isInitializedVariable: () => isInitializedVariable,
isInsideJsxElement: () => isInsideJsxElement,
isInsideJsxElementOrAttribute: () => isInsideJsxElementOrAttribute,
isInsideNodeModules: () => isInsideNodeModules,
isInsideTemplateLiteral: () => isInsideTemplateLiteral,
isInstantiatedModule: () => isInstantiatedModule,
isInterfaceDeclaration: () => isInterfaceDeclaration,
isInternalDeclaration: () => isInternalDeclaration,
isInternalModuleImportEqualsDeclaration: () => isInternalModuleImportEqualsDeclaration,
isInternalName: () => isInternalName,
isIntersectionTypeNode: () => isIntersectionTypeNode,
isIntrinsicJsxName: () => isIntrinsicJsxName,
isIterationStatement: () => isIterationStatement,
isJSDoc: () => isJSDoc,
isJSDocAllType: () => isJSDocAllType,
isJSDocAugmentsTag: () => isJSDocAugmentsTag,
isJSDocAuthorTag: () => isJSDocAuthorTag,
isJSDocCallbackTag: () => isJSDocCallbackTag,
isJSDocClassTag: () => isJSDocClassTag,
isJSDocCommentContainingNode: () => isJSDocCommentContainingNode,
isJSDocConstructSignature: () => isJSDocConstructSignature,
isJSDocDeprecatedTag: () => isJSDocDeprecatedTag,
isJSDocEnumTag: () => isJSDocEnumTag,
isJSDocFunctionType: () => isJSDocFunctionType,
isJSDocImplementsTag: () => isJSDocImplementsTag,
isJSDocIndexSignature: () => isJSDocIndexSignature,
isJSDocLikeText: () => isJSDocLikeText,
isJSDocLink: () => isJSDocLink,
isJSDocLinkCode: () => isJSDocLinkCode,
isJSDocLinkLike: () => isJSDocLinkLike,
isJSDocLinkPlain: () => isJSDocLinkPlain,
isJSDocMemberName: () => isJSDocMemberName,
isJSDocNameReference: () => isJSDocNameReference,
isJSDocNamepathType: () => isJSDocNamepathType,
isJSDocNamespaceBody: () => isJSDocNamespaceBody,
isJSDocNode: () => isJSDocNode,
isJSDocNonNullableType: () => isJSDocNonNullableType,
isJSDocNullableType: () => isJSDocNullableType,
isJSDocOptionalParameter: () => isJSDocOptionalParameter,
isJSDocOptionalType: () => isJSDocOptionalType,
isJSDocOverloadTag: () => isJSDocOverloadTag,
isJSDocOverrideTag: () => isJSDocOverrideTag,
isJSDocParameterTag: () => isJSDocParameterTag,
isJSDocPrivateTag: () => isJSDocPrivateTag,
isJSDocPropertyLikeTag: () => isJSDocPropertyLikeTag,
isJSDocPropertyTag: () => isJSDocPropertyTag,
isJSDocProtectedTag: () => isJSDocProtectedTag,
isJSDocPublicTag: () => isJSDocPublicTag,
isJSDocReadonlyTag: () => isJSDocReadonlyTag,
isJSDocReturnTag: () => isJSDocReturnTag,
isJSDocSatisfiesExpression: () => isJSDocSatisfiesExpression,
isJSDocSatisfiesTag: () => isJSDocSatisfiesTag,
isJSDocSeeTag: () => isJSDocSeeTag,
isJSDocSignature: () => isJSDocSignature,
isJSDocTag: () => isJSDocTag,
isJSDocTemplateTag: () => isJSDocTemplateTag,
isJSDocThisTag: () => isJSDocThisTag,
isJSDocThrowsTag: () => isJSDocThrowsTag,
isJSDocTypeAlias: () => isJSDocTypeAlias,
isJSDocTypeAssertion: () => isJSDocTypeAssertion,
isJSDocTypeExpression: () => isJSDocTypeExpression,
isJSDocTypeLiteral: () => isJSDocTypeLiteral,
isJSDocTypeTag: () => isJSDocTypeTag,
isJSDocTypedefTag: () => isJSDocTypedefTag,
isJSDocUnknownTag: () => isJSDocUnknownTag,
isJSDocUnknownType: () => isJSDocUnknownType,
isJSDocVariadicType: () => isJSDocVariadicType,
isJSXTagName: () => isJSXTagName,
isJsonEqual: () => isJsonEqual,
isJsonSourceFile: () => isJsonSourceFile,
isJsxAttribute: () => isJsxAttribute,
isJsxAttributeLike: () => isJsxAttributeLike,
isJsxAttributeName: () => isJsxAttributeName,
isJsxAttributes: () => isJsxAttributes,
isJsxChild: () => isJsxChild,
isJsxClosingElement: () => isJsxClosingElement,
isJsxClosingFragment: () => isJsxClosingFragment,
isJsxElement: () => isJsxElement,
isJsxExpression: () => isJsxExpression,
isJsxFragment: () => isJsxFragment,
isJsxNamespacedName: () => isJsxNamespacedName,
isJsxOpeningElement: () => isJsxOpeningElement,
isJsxOpeningFragment: () => isJsxOpeningFragment,
isJsxOpeningLikeElement: () => isJsxOpeningLikeElement,
isJsxOpeningLikeElementTagName: () => isJsxOpeningLikeElementTagName,
isJsxSelfClosingElement: () => isJsxSelfClosingElement,
isJsxSpreadAttribute: () => isJsxSpreadAttribute,
isJsxTagNameExpression: () => isJsxTagNameExpression,
isJsxText: () => isJsxText,
isJumpStatementTarget: () => isJumpStatementTarget,
isKeyword: () => isKeyword,
isKeywordOrPunctuation: () => isKeywordOrPunctuation,
isKnownSymbol: () => isKnownSymbol,
isLabelName: () => isLabelName,
isLabelOfLabeledStatement: () => isLabelOfLabeledStatement,
isLabeledStatement: () => isLabeledStatement,
isLateVisibilityPaintedStatement: () => isLateVisibilityPaintedStatement,
isLeftHandSideExpression: () => isLeftHandSideExpression,
isLeftHandSideOfAssignment: () => isLeftHandSideOfAssignment,
isLet: () => isLet,
isLineBreak: () => isLineBreak,
isLiteralComputedPropertyDeclarationName: () => isLiteralComputedPropertyDeclarationName,
isLiteralExpression: () => isLiteralExpression,
isLiteralExpressionOfObject: () => isLiteralExpressionOfObject,
isLiteralImportTypeNode: () => isLiteralImportTypeNode,
isLiteralKind: () => isLiteralKind,
isLiteralLikeAccess: () => isLiteralLikeAccess,
isLiteralLikeElementAccess: () => isLiteralLikeElementAccess,
isLiteralNameOfPropertyDeclarationOrIndexAccess: () => isLiteralNameOfPropertyDeclarationOrIndexAccess,
isLiteralTypeLikeExpression: () => isLiteralTypeLikeExpression,
isLiteralTypeLiteral: () => isLiteralTypeLiteral,
isLiteralTypeNode: () => isLiteralTypeNode,
isLocalName: () => isLocalName,
isLogicalOperator: () => isLogicalOperator,
isLogicalOrCoalescingAssignmentExpression: () => isLogicalOrCoalescingAssignmentExpression,
isLogicalOrCoalescingAssignmentOperator: () => isLogicalOrCoalescingAssignmentOperator,
isLogicalOrCoalescingBinaryExpression: () => isLogicalOrCoalescingBinaryExpression,
isLogicalOrCoalescingBinaryOperator: () => isLogicalOrCoalescingBinaryOperator,
isMappedTypeNode: () => isMappedTypeNode,
isMemberName: () => isMemberName,
isMetaProperty: () => isMetaProperty,
isMethodDeclaration: () => isMethodDeclaration,
isMethodOrAccessor: () => isMethodOrAccessor,
isMethodSignature: () => isMethodSignature,
isMinusToken: () => isMinusToken,
isMissingDeclaration: () => isMissingDeclaration,
isModifier: () => isModifier,
isModifierKind: () => isModifierKind,
isModifierLike: () => isModifierLike,
isModuleAugmentationExternal: () => isModuleAugmentationExternal,
isModuleBlock: () => isModuleBlock,
isModuleBody: () => isModuleBody,
isModuleDeclaration: () => isModuleDeclaration,
isModuleExportsAccessExpression: () => isModuleExportsAccessExpression,
isModuleIdentifier: () => isModuleIdentifier,
isModuleName: () => isModuleName,
isModuleOrEnumDeclaration: () => isModuleOrEnumDeclaration,
isModuleReference: () => isModuleReference,
isModuleSpecifierLike: () => isModuleSpecifierLike,
isModuleWithStringLiteralName: () => isModuleWithStringLiteralName,
isNameOfFunctionDeclaration: () => isNameOfFunctionDeclaration,
isNameOfModuleDeclaration: () => isNameOfModuleDeclaration,
isNamedClassElement: () => isNamedClassElement,
isNamedDeclaration: () => isNamedDeclaration,
isNamedEvaluation: () => isNamedEvaluation,
isNamedEvaluationSource: () => isNamedEvaluationSource,
isNamedExportBindings: () => isNamedExportBindings,
isNamedExports: () => isNamedExports,
isNamedImportBindings: () => isNamedImportBindings,
isNamedImports: () => isNamedImports,
isNamedImportsOrExports: () => isNamedImportsOrExports,
isNamedTupleMember: () => isNamedTupleMember,
isNamespaceBody: () => isNamespaceBody,
isNamespaceExport: () => isNamespaceExport,
isNamespaceExportDeclaration: () => isNamespaceExportDeclaration,
isNamespaceImport: () => isNamespaceImport,
isNamespaceReexportDeclaration: () => isNamespaceReexportDeclaration,
isNewExpression: () => isNewExpression,
isNewExpressionTarget: () => isNewExpressionTarget,
isNightly: () => isNightly,
isNoSubstitutionTemplateLiteral: () => isNoSubstitutionTemplateLiteral,
isNode: () => isNode,
isNodeArray: () => isNodeArray,
isNodeArrayMultiLine: () => isNodeArrayMultiLine,
isNodeDescendantOf: () => isNodeDescendantOf,
isNodeKind: () => isNodeKind,
isNodeLikeSystem: () => isNodeLikeSystem,
isNodeModulesDirectory: () => isNodeModulesDirectory,
isNodeWithPossibleHoistedDeclaration: () => isNodeWithPossibleHoistedDeclaration,
isNonContextualKeyword: () => isNonContextualKeyword,
isNonExportDefaultModifier: () => isNonExportDefaultModifier,
isNonGlobalAmbientModule: () => isNonGlobalAmbientModule,
isNonGlobalDeclaration: () => isNonGlobalDeclaration,
isNonNullAccess: () => isNonNullAccess,
isNonNullChain: () => isNonNullChain,
isNonNullExpression: () => isNonNullExpression,
isNonStaticMethodOrAccessorWithPrivateName: () => isNonStaticMethodOrAccessorWithPrivateName,
isNotEmittedOrPartiallyEmittedNode: () => isNotEmittedOrPartiallyEmittedNode,
isNotEmittedStatement: () => isNotEmittedStatement,
isNullishCoalesce: () => isNullishCoalesce,
isNumber: () => isNumber,
isNumericLiteral: () => isNumericLiteral,
isNumericLiteralName: () => isNumericLiteralName,
isObjectBindingElementWithoutPropertyName: () => isObjectBindingElementWithoutPropertyName,
isObjectBindingOrAssignmentElement: () => isObjectBindingOrAssignmentElement,
isObjectBindingOrAssignmentPattern: () => isObjectBindingOrAssignmentPattern,
isObjectBindingPattern: () => isObjectBindingPattern,
isObjectLiteralElement: () => isObjectLiteralElement,
isObjectLiteralElementLike: () => isObjectLiteralElementLike,
isObjectLiteralExpression: () => isObjectLiteralExpression,
isObjectLiteralMethod: () => isObjectLiteralMethod,
isObjectLiteralOrClassExpressionMethodOrAccessor: () => isObjectLiteralOrClassExpressionMethodOrAccessor,
isObjectTypeDeclaration: () => isObjectTypeDeclaration,
isOctalDigit: () => isOctalDigit,
isOmittedExpression: () => isOmittedExpression,
isOptionalChain: () => isOptionalChain,
isOptionalChainRoot: () => isOptionalChainRoot,
isOptionalDeclaration: () => isOptionalDeclaration,
isOptionalJSDocPropertyLikeTag: () => isOptionalJSDocPropertyLikeTag,
isOptionalTypeNode: () => isOptionalTypeNode,
isOuterExpression: () => isOuterExpression,
isOutermostOptionalChain: () => isOutermostOptionalChain,
isOverrideModifier: () => isOverrideModifier,
isPackedArrayLiteral: () => isPackedArrayLiteral,
isParameter: () => isParameter,
isParameterDeclaration: () => isParameterDeclaration,
isParameterOrCatchClauseVariable: () => isParameterOrCatchClauseVariable,
isParameterPropertyDeclaration: () => isParameterPropertyDeclaration,
isParameterPropertyModifier: () => isParameterPropertyModifier,
isParenthesizedExpression: () => isParenthesizedExpression,
isParenthesizedTypeNode: () => isParenthesizedTypeNode,
isParseTreeNode: () => isParseTreeNode,
isPartOfTypeNode: () => isPartOfTypeNode,
isPartOfTypeQuery: () => isPartOfTypeQuery,
isPartiallyEmittedExpression: () => isPartiallyEmittedExpression,
isPatternMatch: () => isPatternMatch,
isPinnedComment: () => isPinnedComment,
isPlainJsFile: () => isPlainJsFile,
isPlusToken: () => isPlusToken,
isPossiblyTypeArgumentPosition: () => isPossiblyTypeArgumentPosition,
isPostfixUnaryExpression: () => isPostfixUnaryExpression,
isPrefixUnaryExpression: () => isPrefixUnaryExpression,
isPrivateIdentifier: () => isPrivateIdentifier,
isPrivateIdentifierClassElementDeclaration: () => isPrivateIdentifierClassElementDeclaration,
isPrivateIdentifierPropertyAccessExpression: () => isPrivateIdentifierPropertyAccessExpression,
isPrivateIdentifierSymbol: () => isPrivateIdentifierSymbol,
isProgramBundleEmitBuildInfo: () => isProgramBundleEmitBuildInfo,
isProgramUptoDate: () => isProgramUptoDate,
isPrologueDirective: () => isPrologueDirective,
isPropertyAccessChain: () => isPropertyAccessChain,
isPropertyAccessEntityNameExpression: () => isPropertyAccessEntityNameExpression,
isPropertyAccessExpression: () => isPropertyAccessExpression,
isPropertyAccessOrQualifiedName: () => isPropertyAccessOrQualifiedName,
isPropertyAccessOrQualifiedNameOrImportTypeNode: () => isPropertyAccessOrQualifiedNameOrImportTypeNode,
isPropertyAssignment: () => isPropertyAssignment,
isPropertyDeclaration: () => isPropertyDeclaration,
isPropertyName: () => isPropertyName,
isPropertyNameLiteral: () => isPropertyNameLiteral,
isPropertySignature: () => isPropertySignature,
isProtoSetter: () => isProtoSetter,
isPrototypeAccess: () => isPrototypeAccess,
isPrototypePropertyAssignment: () => isPrototypePropertyAssignment,
isPunctuation: () => isPunctuation,
isPushOrUnshiftIdentifier: () => isPushOrUnshiftIdentifier,
isQualifiedName: () => isQualifiedName,
isQuestionDotToken: () => isQuestionDotToken,
isQuestionOrExclamationToken: () => isQuestionOrExclamationToken,
isQuestionOrPlusOrMinusToken: () => isQuestionOrPlusOrMinusToken,
isQuestionToken: () => isQuestionToken,
isRawSourceMap: () => isRawSourceMap,
isReadonlyKeyword: () => isReadonlyKeyword,
isReadonlyKeywordOrPlusOrMinusToken: () => isReadonlyKeywordOrPlusOrMinusToken,
isRecognizedTripleSlashComment: () => isRecognizedTripleSlashComment,
isReferenceFileLocation: () => isReferenceFileLocation,
isReferencedFile: () => isReferencedFile,
isRegularExpressionLiteral: () => isRegularExpressionLiteral,
isRequireCall: () => isRequireCall,
isRequireVariableStatement: () => isRequireVariableStatement,
isRestParameter: () => isRestParameter,
isRestTypeNode: () => isRestTypeNode,
isReturnStatement: () => isReturnStatement,
isReturnStatementWithFixablePromiseHandler: () => isReturnStatementWithFixablePromiseHandler,
isRightSideOfAccessExpression: () => isRightSideOfAccessExpression,
isRightSideOfPropertyAccess: () => isRightSideOfPropertyAccess,
isRightSideOfQualifiedName: () => isRightSideOfQualifiedName,
isRightSideOfQualifiedNameOrPropertyAccess: () => isRightSideOfQualifiedNameOrPropertyAccess,
isRightSideOfQualifiedNameOrPropertyAccessOrJSDocMemberName: () => isRightSideOfQualifiedNameOrPropertyAccessOrJSDocMemberName,
isRootedDiskPath: () => isRootedDiskPath,
isSameEntityName: () => isSameEntityName,
isSatisfiesExpression: () => isSatisfiesExpression,
isScopeMarker: () => isScopeMarker,
isSemicolonClassElement: () => isSemicolonClassElement,
isSetAccessor: () => isSetAccessor,
isSetAccessorDeclaration: () => isSetAccessorDeclaration,
isShebangTrivia: () => isShebangTrivia,
isShorthandAmbientModuleSymbol: () => isShorthandAmbientModuleSymbol,
isShorthandPropertyAssignment: () => isShorthandPropertyAssignment,
isSignedNumericLiteral: () => isSignedNumericLiteral,
isSimpleCopiableExpression: () => isSimpleCopiableExpression,
isSimpleInlineableExpression: () => isSimpleInlineableExpression,
isSingleOrDoubleQuote: () => isSingleOrDoubleQuote,
isSourceFile: () => isSourceFile,
isSourceFileFromLibrary: () => isSourceFileFromLibrary,
isSourceFileJS: () => isSourceFileJS,
isSourceFileNotJS: () => isSourceFileNotJS,
isSourceFileNotJson: () => isSourceFileNotJson,
isSourceMapping: () => isSourceMapping,
isSpecialPropertyDeclaration: () => isSpecialPropertyDeclaration,
isSpreadAssignment: () => isSpreadAssignment,
isSpreadElement: () => isSpreadElement,
isStatement: () => isStatement,
isStatementButNotDeclaration: () => isStatementButNotDeclaration,
isStatementOrBlock: () => isStatementOrBlock,
isStatementWithLocals: () => isStatementWithLocals,
isStatic: () => isStatic,
isStaticModifier: () => isStaticModifier,
isString: () => isString,
isStringAKeyword: () => isStringAKeyword,
isStringANonContextualKeyword: () => isStringANonContextualKeyword,
isStringAndEmptyAnonymousObjectIntersection: () => isStringAndEmptyAnonymousObjectIntersection,
isStringDoubleQuoted: () => isStringDoubleQuoted,
isStringLiteral: () => isStringLiteral,
isStringLiteralLike: () => isStringLiteralLike,
isStringLiteralOrJsxExpression: () => isStringLiteralOrJsxExpression,
isStringLiteralOrTemplate: () => isStringLiteralOrTemplate,
isStringOrNumericLiteralLike: () => isStringOrNumericLiteralLike,
isStringOrRegularExpressionOrTemplateLiteral: () => isStringOrRegularExpressionOrTemplateLiteral,
isStringTextContainingNode: () => isStringTextContainingNode,
isSuperCall: () => isSuperCall,
isSuperKeyword: () => isSuperKeyword,
isSuperOrSuperProperty: () => isSuperOrSuperProperty,
isSuperProperty: () => isSuperProperty,
isSupportedSourceFileName: () => isSupportedSourceFileName,
isSwitchStatement: () => isSwitchStatement,
isSyntaxList: () => isSyntaxList,
isSyntheticExpression: () => isSyntheticExpression,
isSyntheticReference: () => isSyntheticReference,
isTagName: () => isTagName,
isTaggedTemplateExpression: () => isTaggedTemplateExpression,
isTaggedTemplateTag: () => isTaggedTemplateTag,
isTemplateExpression: () => isTemplateExpression,
isTemplateHead: () => isTemplateHead,
isTemplateLiteral: () => isTemplateLiteral,
isTemplateLiteralKind: () => isTemplateLiteralKind,
isTemplateLiteralToken: () => isTemplateLiteralToken,
isTemplateLiteralTypeNode: () => isTemplateLiteralTypeNode,
isTemplateLiteralTypeSpan: () => isTemplateLiteralTypeSpan,
isTemplateMiddle: () => isTemplateMiddle,
isTemplateMiddleOrTemplateTail: () => isTemplateMiddleOrTemplateTail,
isTemplateSpan: () => isTemplateSpan,
isTemplateTail: () => isTemplateTail,
isTextWhiteSpaceLike: () => isTextWhiteSpaceLike,
isThis: () => isThis,
isThisContainerOrFunctionBlock: () => isThisContainerOrFunctionBlock,
isThisIdentifier: () => isThisIdentifier,
isThisInTypeQuery: () => isThisInTypeQuery,
isThisInitializedDeclaration: () => isThisInitializedDeclaration,
isThisInitializedObjectBindingExpression: () => isThisInitializedObjectBindingExpression,
isThisProperty: () => isThisProperty,
isThisTypeNode: () => isThisTypeNode,
isThisTypeParameter: () => isThisTypeParameter,
isThisTypePredicate: () => isThisTypePredicate,
isThrowStatement: () => isThrowStatement,
isToken: () => isToken,
isTokenKind: () => isTokenKind,
isTraceEnabled: () => isTraceEnabled,
isTransientSymbol: () => isTransientSymbol,
isTrivia: () => isTrivia,
isTryStatement: () => isTryStatement,
isTupleTypeNode: () => isTupleTypeNode,
isTypeAlias: () => isTypeAlias,
isTypeAliasDeclaration: () => isTypeAliasDeclaration,
isTypeAssertionExpression: () => isTypeAssertionExpression,
isTypeDeclaration: () => isTypeDeclaration,
isTypeElement: () => isTypeElement,
isTypeKeyword: () => isTypeKeyword,
isTypeKeywordToken: () => isTypeKeywordToken,
isTypeKeywordTokenOrIdentifier: () => isTypeKeywordTokenOrIdentifier,
isTypeLiteralNode: () => isTypeLiteralNode,
isTypeNode: () => isTypeNode,
isTypeNodeKind: () => isTypeNodeKind,
isTypeOfExpression: () => isTypeOfExpression,
isTypeOnlyExportDeclaration: () => isTypeOnlyExportDeclaration,
isTypeOnlyImportDeclaration: () => isTypeOnlyImportDeclaration,
isTypeOnlyImportOrExportDeclaration: () => isTypeOnlyImportOrExportDeclaration,
isTypeOperatorNode: () => isTypeOperatorNode,
isTypeParameterDeclaration: () => isTypeParameterDeclaration,
isTypePredicateNode: () => isTypePredicateNode,
isTypeQueryNode: () => isTypeQueryNode,
isTypeReferenceNode: () => isTypeReferenceNode,
isTypeReferenceType: () => isTypeReferenceType,
isUMDExportSymbol: () => isUMDExportSymbol,
isUnaryExpression: () => isUnaryExpression,
isUnaryExpressionWithWrite: () => isUnaryExpressionWithWrite,
isUnicodeIdentifierStart: () => isUnicodeIdentifierStart,
isUnionTypeNode: () => isUnionTypeNode,
isUnparsedNode: () => isUnparsedNode,
isUnparsedPrepend: () => isUnparsedPrepend,
isUnparsedSource: () => isUnparsedSource,
isUnparsedTextLike: () => isUnparsedTextLike,
isUrl: () => isUrl,
isValidBigIntString: () => isValidBigIntString,
isValidESSymbolDeclaration: () => isValidESSymbolDeclaration,
isValidTypeOnlyAliasUseSite: () => isValidTypeOnlyAliasUseSite,
isValueSignatureDeclaration: () => isValueSignatureDeclaration,
isVarConst: () => isVarConst,
isVariableDeclaration: () => isVariableDeclaration,
isVariableDeclarationInVariableStatement: () => isVariableDeclarationInVariableStatement,
isVariableDeclarationInitializedToBareOrAccessedRequire: () => isVariableDeclarationInitializedToBareOrAccessedRequire,
isVariableDeclarationInitializedToRequire: () => isVariableDeclarationInitializedToRequire,
isVariableDeclarationList: () => isVariableDeclarationList,
isVariableLike: () => isVariableLike,
isVariableLikeOrAccessor: () => isVariableLikeOrAccessor,
isVariableStatement: () => isVariableStatement,
isVoidExpression: () => isVoidExpression,
isWatchSet: () => isWatchSet,
isWhileStatement: () => isWhileStatement,
isWhiteSpaceLike: () => isWhiteSpaceLike,
isWhiteSpaceSingleLine: () => isWhiteSpaceSingleLine,
isWithStatement: () => isWithStatement,
isWriteAccess: () => isWriteAccess,
isWriteOnlyAccess: () => isWriteOnlyAccess,
isYieldExpression: () => isYieldExpression,
jsxModeNeedsExplicitImport: () => jsxModeNeedsExplicitImport,
keywordPart: () => keywordPart,
last: () => last,
lastOrUndefined: () => lastOrUndefined,
length: () => length,
libMap: () => libMap,
libs: () => libs,
lineBreakPart: () => lineBreakPart,
linkNamePart: () => linkNamePart,
linkPart: () => linkPart,
linkTextPart: () => linkTextPart,
listFiles: () => listFiles,
loadModuleFromGlobalCache: () => loadModuleFromGlobalCache,
loadWithModeAwareCache: () => loadWithModeAwareCache,
makeIdentifierFromModuleName: () => makeIdentifierFromModuleName,
makeImport: () => makeImport,
makeImportIfNecessary: () => makeImportIfNecessary,
makeStringLiteral: () => makeStringLiteral,
mangleScopedPackageName: () => mangleScopedPackageName,
map: () => map,
mapAllOrFail: () => mapAllOrFail,
mapDefined: () => mapDefined,
mapDefinedEntries: () => mapDefinedEntries,
mapDefinedIterator: () => mapDefinedIterator,
mapEntries: () => mapEntries,
mapIterator: () => mapIterator,
mapOneOrMany: () => mapOneOrMany,
mapToDisplayParts: () => mapToDisplayParts,
matchFiles: () => matchFiles,
matchPatternOrExact: () => matchPatternOrExact,
matchedText: () => matchedText,
matchesExclude: () => matchesExclude,
maybeBind: () => maybeBind,
maybeSetLocalizedDiagnosticMessages: () => maybeSetLocalizedDiagnosticMessages,
memoize: () => memoize,
memoizeCached: () => memoizeCached,
memoizeOne: () => memoizeOne,
memoizeWeak: () => memoizeWeak,
metadataHelper: () => metadataHelper,
min: () => min,
minAndMax: () => minAndMax,
missingFileModifiedTime: () => missingFileModifiedTime,
modifierToFlag: () => modifierToFlag,
modifiersToFlags: () => modifiersToFlags,
moduleOptionDeclaration: () => moduleOptionDeclaration,
moduleResolutionIsEqualTo: () => moduleResolutionIsEqualTo,
moduleResolutionNameAndModeGetter: () => moduleResolutionNameAndModeGetter,
moduleResolutionOptionDeclarations: () => moduleResolutionOptionDeclarations,
moduleResolutionSupportsPackageJsonExportsAndImports: () => moduleResolutionSupportsPackageJsonExportsAndImports,
moduleResolutionUsesNodeModules: () => moduleResolutionUsesNodeModules,
moduleSpecifiers: () => ts_moduleSpecifiers_exports,
moveEmitHelpers: () => moveEmitHelpers,
moveRangeEnd: () => moveRangeEnd,
moveRangePastDecorators: () => moveRangePastDecorators,
moveRangePastModifiers: () => moveRangePastModifiers,
moveRangePos: () => moveRangePos,
moveSyntheticComments: () => moveSyntheticComments,
mutateMap: () => mutateMap,
mutateMapSkippingNewValues: () => mutateMapSkippingNewValues,
needsParentheses: () => needsParentheses,
needsScopeMarker: () => needsScopeMarker,
newCaseClauseTracker: () => newCaseClauseTracker,
newPrivateEnvironment: () => newPrivateEnvironment,
noEmitNotification: () => noEmitNotification,
noEmitSubstitution: () => noEmitSubstitution,
noTransformers: () => noTransformers,
noTruncationMaximumTruncationLength: () => noTruncationMaximumTruncationLength,
nodeCanBeDecorated: () => nodeCanBeDecorated,
nodeHasName: () => nodeHasName,
nodeIsDecorated: () => nodeIsDecorated,
nodeIsMissing: () => nodeIsMissing,
nodeIsPresent: () => nodeIsPresent,
nodeIsSynthesized: () => nodeIsSynthesized,
nodeModuleNameResolver: () => nodeModuleNameResolver,
nodeModulesPathPart: () => nodeModulesPathPart,
nodeNextJsonConfigResolver: () => nodeNextJsonConfigResolver,
nodeOrChildIsDecorated: () => nodeOrChildIsDecorated,
nodeOverlapsWithStartEnd: () => nodeOverlapsWithStartEnd,
nodePosToString: () => nodePosToString,
nodeSeenTracker: () => nodeSeenTracker,
nodeStartsNewLexicalEnvironment: () => nodeStartsNewLexicalEnvironment,
nodeToDisplayParts: () => nodeToDisplayParts,
noop: () => noop,
noopFileWatcher: () => noopFileWatcher,
normalizePath: () => normalizePath,
normalizeSlashes: () => normalizeSlashes,
not: () => not,
notImplemented: () => notImplemented,
notImplementedResolver: () => notImplementedResolver,
nullNodeConverters: () => nullNodeConverters,
nullParenthesizerRules: () => nullParenthesizerRules,
nullTransformationContext: () => nullTransformationContext,
objectAllocator: () => objectAllocator,
operatorPart: () => operatorPart,
optionDeclarations: () => optionDeclarations,
optionMapToObject: () => optionMapToObject,
optionsAffectingProgramStructure: () => optionsAffectingProgramStructure,
optionsForBuild: () => optionsForBuild,
optionsForWatch: () => optionsForWatch,
optionsHaveChanges: () => optionsHaveChanges,
optionsHaveModuleResolutionChanges: () => optionsHaveModuleResolutionChanges,
or: () => or,
orderedRemoveItem: () => orderedRemoveItem,
orderedRemoveItemAt: () => orderedRemoveItemAt,
outFile: () => outFile,
packageIdToPackageName: () => packageIdToPackageName,
packageIdToString: () => packageIdToString,
padLeft: () => padLeft,
padRight: () => padRight,
paramHelper: () => paramHelper,
parameterIsThisKeyword: () => parameterIsThisKeyword,
parameterNamePart: () => parameterNamePart,
parseBaseNodeFactory: () => parseBaseNodeFactory,
parseBigInt: () => parseBigInt,
parseBuildCommand: () => parseBuildCommand,
parseCommandLine: () => parseCommandLine,
parseCommandLineWorker: () => parseCommandLineWorker,
parseConfigFileTextToJson: () => parseConfigFileTextToJson,
parseConfigFileWithSystem: () => parseConfigFileWithSystem,
parseConfigHostFromCompilerHostLike: () => parseConfigHostFromCompilerHostLike,
parseCustomTypeOption: () => parseCustomTypeOption,
parseIsolatedEntityName: () => parseIsolatedEntityName,
parseIsolatedJSDocComment: () => parseIsolatedJSDocComment,
parseJSDocTypeExpressionForTests: () => parseJSDocTypeExpressionForTests,
parseJsonConfigFileContent: () => parseJsonConfigFileContent,
parseJsonSourceFileConfigFileContent: () => parseJsonSourceFileConfigFileContent,
parseJsonText: () => parseJsonText,
parseListTypeOption: () => parseListTypeOption,
parseNodeFactory: () => parseNodeFactory,
parseNodeModuleFromPath: () => parseNodeModuleFromPath,
parsePackageName: () => parsePackageName,
parsePseudoBigInt: () => parsePseudoBigInt,
parseValidBigInt: () => parseValidBigInt,
patchWriteFileEnsuringDirectory: () => patchWriteFileEnsuringDirectory,
pathContainsNodeModules: () => pathContainsNodeModules,
pathIsAbsolute: () => pathIsAbsolute,
pathIsBareSpecifier: () => pathIsBareSpecifier,
pathIsRelative: () => pathIsRelative,
patternText: () => patternText,
perfLogger: () => perfLogger,
performIncrementalCompilation: () => performIncrementalCompilation,
performance: () => ts_performance_exports,
plainJSErrors: () => plainJSErrors,
positionBelongsToNode: () => positionBelongsToNode,
positionIsASICandidate: () => positionIsASICandidate,
positionIsSynthesized: () => positionIsSynthesized,
positionsAreOnSameLine: () => positionsAreOnSameLine,
preProcessFile: () => preProcessFile,
probablyUsesSemicolons: () => probablyUsesSemicolons,
processCommentPragmas: () => processCommentPragmas,
processPragmasIntoFields: () => processPragmasIntoFields,
processTaggedTemplateExpression: () => processTaggedTemplateExpression,
programContainsEsModules: () => programContainsEsModules,
programContainsModules: () => programContainsModules,
projectReferenceIsEqualTo: () => projectReferenceIsEqualTo,
propKeyHelper: () => propKeyHelper,
propertyNamePart: () => propertyNamePart,
pseudoBigIntToString: () => pseudoBigIntToString,
punctuationPart: () => punctuationPart,
pushIfUnique: () => pushIfUnique,
quote: () => quote,
quotePreferenceFromString: () => quotePreferenceFromString,
rangeContainsPosition: () => rangeContainsPosition,
rangeContainsPositionExclusive: () => rangeContainsPositionExclusive,
rangeContainsRange: () => rangeContainsRange,
rangeContainsRangeExclusive: () => rangeContainsRangeExclusive,
rangeContainsStartEnd: () => rangeContainsStartEnd,
rangeEndIsOnSameLineAsRangeStart: () => rangeEndIsOnSameLineAsRangeStart,
rangeEndPositionsAreOnSameLine: () => rangeEndPositionsAreOnSameLine,
rangeEquals: () => rangeEquals,
rangeIsOnSingleLine: () => rangeIsOnSingleLine,
rangeOfNode: () => rangeOfNode,
rangeOfTypeParameters: () => rangeOfTypeParameters,
rangeOverlapsWithStartEnd: () => rangeOverlapsWithStartEnd,
rangeStartIsOnSameLineAsRangeEnd: () => rangeStartIsOnSameLineAsRangeEnd,
rangeStartPositionsAreOnSameLine: () => rangeStartPositionsAreOnSameLine,
readBuilderProgram: () => readBuilderProgram,
readConfigFile: () => readConfigFile,
readHelper: () => readHelper,
readJson: () => readJson,
readJsonConfigFile: () => readJsonConfigFile,
readJsonOrUndefined: () => readJsonOrUndefined,
realizeDiagnostics: () => realizeDiagnostics,
reduceEachLeadingCommentRange: () => reduceEachLeadingCommentRange,
reduceEachTrailingCommentRange: () => reduceEachTrailingCommentRange,
reduceLeft: () => reduceLeft,
reduceLeftIterator: () => reduceLeftIterator,
reducePathComponents: () => reducePathComponents,
refactor: () => ts_refactor_exports,
regExpEscape: () => regExpEscape,
relativeComplement: () => relativeComplement,
removeAllComments: () => removeAllComments,
removeEmitHelper: () => removeEmitHelper,
removeExtension: () => removeExtension,
removeFileExtension: () => removeFileExtension,
removeIgnoredPath: () => removeIgnoredPath,
removeMinAndVersionNumbers: () => removeMinAndVersionNumbers,
removeOptionality: () => removeOptionality,
removePrefix: () => removePrefix,
removeSuffix: () => removeSuffix,
removeTrailingDirectorySeparator: () => removeTrailingDirectorySeparator,
repeatString: () => repeatString,
replaceElement: () => replaceElement,
resolutionExtensionIsTSOrJson: () => resolutionExtensionIsTSOrJson,
resolveConfigFileProjectName: () => resolveConfigFileProjectName,
resolveJSModule: () => resolveJSModule,
resolveLibrary: () => resolveLibrary,
resolveModuleName: () => resolveModuleName,
resolveModuleNameFromCache: () => resolveModuleNameFromCache,
resolvePackageNameToPackageJson: () => resolvePackageNameToPackageJson,
resolvePath: () => resolvePath,
resolveProjectReferencePath: () => resolveProjectReferencePath,
resolveTripleslashReference: () => resolveTripleslashReference,
resolveTypeReferenceDirective: () => resolveTypeReferenceDirective,
resolvingEmptyArray: () => resolvingEmptyArray,
restHelper: () => restHelper,
returnFalse: () => returnFalse,
returnNoopFileWatcher: () => returnNoopFileWatcher,
returnTrue: () => returnTrue,
returnUndefined: () => returnUndefined,
returnsPromise: () => returnsPromise,
runInitializersHelper: () => runInitializersHelper,
sameFlatMap: () => sameFlatMap,
sameMap: () => sameMap,
sameMapping: () => sameMapping,
scanShebangTrivia: () => scanShebangTrivia,
scanTokenAtPosition: () => scanTokenAtPosition,
scanner: () => scanner,
screenStartingMessageCodes: () => screenStartingMessageCodes,
semanticDiagnosticsOptionDeclarations: () => semanticDiagnosticsOptionDeclarations,
serializeCompilerOptions: () => serializeCompilerOptions,
server: () => ts_server_exports3,
servicesVersion: () => servicesVersion,
setCommentRange: () => setCommentRange,
setConfigFileInOptions: () => setConfigFileInOptions,
setConstantValue: () => setConstantValue,
setEachParent: () => setEachParent,
setEmitFlags: () => setEmitFlags,
setFunctionNameHelper: () => setFunctionNameHelper,
setGetSourceFileAsHashVersioned: () => setGetSourceFileAsHashVersioned,
setIdentifierAutoGenerate: () => setIdentifierAutoGenerate,
setIdentifierGeneratedImportReference: () => setIdentifierGeneratedImportReference,
setIdentifierTypeArguments: () => setIdentifierTypeArguments,
setInternalEmitFlags: () => setInternalEmitFlags,
setLocalizedDiagnosticMessages: () => setLocalizedDiagnosticMessages,
setModuleDefaultHelper: () => setModuleDefaultHelper,
setNodeFlags: () => setNodeFlags,
setObjectAllocator: () => setObjectAllocator,
setOriginalNode: () => setOriginalNode,
setParent: () => setParent,
setParentRecursive: () => setParentRecursive,
setPrivateIdentifier: () => setPrivateIdentifier,
setResolvedModule: () => setResolvedModule,
setResolvedTypeReferenceDirective: () => setResolvedTypeReferenceDirective,
setSnippetElement: () => setSnippetElement,
setSourceMapRange: () => setSourceMapRange,
setStackTraceLimit: () => setStackTraceLimit,
setStartsOnNewLine: () => setStartsOnNewLine,
setSyntheticLeadingComments: () => setSyntheticLeadingComments,
setSyntheticTrailingComments: () => setSyntheticTrailingComments,
setSys: () => setSys,
setSysLog: () => setSysLog,
setTextRange: () => setTextRange,
setTextRangeEnd: () => setTextRangeEnd,
setTextRangePos: () => setTextRangePos,
setTextRangePosEnd: () => setTextRangePosEnd,
setTextRangePosWidth: () => setTextRangePosWidth,
setTokenSourceMapRange: () => setTokenSourceMapRange,
setTypeNode: () => setTypeNode,
setUILocale: () => setUILocale,
setValueDeclaration: () => setValueDeclaration,
shouldAllowImportingTsExtension: () => shouldAllowImportingTsExtension,
shouldPreserveConstEnums: () => shouldPreserveConstEnums,
shouldResolveJsRequire: () => shouldResolveJsRequire,
shouldUseUriStyleNodeCoreModules: () => shouldUseUriStyleNodeCoreModules,
showModuleSpecifier: () => showModuleSpecifier,
signatureHasLiteralTypes: () => signatureHasLiteralTypes,
signatureHasRestParameter: () => signatureHasRestParameter,
signatureToDisplayParts: () => signatureToDisplayParts,
single: () => single,
singleElementArray: () => singleElementArray,
singleIterator: () => singleIterator,
singleOrMany: () => singleOrMany,
singleOrUndefined: () => singleOrUndefined,
skipAlias: () => skipAlias,
skipAssertions: () => skipAssertions,
skipConstraint: () => skipConstraint,
skipOuterExpressions: () => skipOuterExpressions,
skipParentheses: () => skipParentheses,
skipPartiallyEmittedExpressions: () => skipPartiallyEmittedExpressions,
skipTrivia: () => skipTrivia,
skipTypeChecking: () => skipTypeChecking,
skipTypeParentheses: () => skipTypeParentheses,
skipWhile: () => skipWhile,
sliceAfter: () => sliceAfter,
some: () => some,
sort: () => sort,
sortAndDeduplicate: () => sortAndDeduplicate,
sortAndDeduplicateDiagnostics: () => sortAndDeduplicateDiagnostics,
sourceFileAffectingCompilerOptions: () => sourceFileAffectingCompilerOptions,
sourceFileMayBeEmitted: () => sourceFileMayBeEmitted,
sourceMapCommentRegExp: () => sourceMapCommentRegExp,
sourceMapCommentRegExpDontCareLineStart: () => sourceMapCommentRegExpDontCareLineStart,
spacePart: () => spacePart,
spanMap: () => spanMap,
spreadArrayHelper: () => spreadArrayHelper,
stableSort: () => stableSort,
startEndContainsRange: () => startEndContainsRange,
startEndOverlapsWithStartEnd: () => startEndOverlapsWithStartEnd,
startOnNewLine: () => startOnNewLine,
startTracing: () => startTracing,
startsWith: () => startsWith,
startsWithDirectory: () => startsWithDirectory,
startsWithUnderscore: () => startsWithUnderscore,
startsWithUseStrict: () => startsWithUseStrict,
stringContains: () => stringContains,
stringContainsAt: () => stringContainsAt,
stringToToken: () => stringToToken,
stripQuotes: () => stripQuotes,
supportedDeclarationExtensions: () => supportedDeclarationExtensions,
supportedJSExtensions: () => supportedJSExtensions,
supportedJSExtensionsFlat: () => supportedJSExtensionsFlat,
supportedLocaleDirectories: () => supportedLocaleDirectories,
supportedTSExtensions: () => supportedTSExtensions,
supportedTSExtensionsFlat: () => supportedTSExtensionsFlat,
supportedTSImplementationExtensions: () => supportedTSImplementationExtensions,
suppressLeadingAndTrailingTrivia: () => suppressLeadingAndTrailingTrivia,
suppressLeadingTrivia: () => suppressLeadingTrivia,
suppressTrailingTrivia: () => suppressTrailingTrivia,
symbolEscapedNameNoDefault: () => symbolEscapedNameNoDefault,
symbolName: () => symbolName,
symbolNameNoDefault: () => symbolNameNoDefault,
symbolPart: () => symbolPart,
symbolToDisplayParts: () => symbolToDisplayParts,
syntaxMayBeASICandidate: () => syntaxMayBeASICandidate,
syntaxRequiresTrailingSemicolonOrASI: () => syntaxRequiresTrailingSemicolonOrASI,
sys: () => sys,
sysLog: () => sysLog,
tagNamesAreEquivalent: () => tagNamesAreEquivalent,
takeWhile: () => takeWhile,
targetOptionDeclaration: () => targetOptionDeclaration,
templateObjectHelper: () => templateObjectHelper,
testFormatSettings: () => testFormatSettings,
textChangeRangeIsUnchanged: () => textChangeRangeIsUnchanged,
textChangeRangeNewSpan: () => textChangeRangeNewSpan,
textChanges: () => ts_textChanges_exports,
textOrKeywordPart: () => textOrKeywordPart,
textPart: () => textPart,
textRangeContainsPositionInclusive: () => textRangeContainsPositionInclusive,
textSpanContainsPosition: () => textSpanContainsPosition,
textSpanContainsTextSpan: () => textSpanContainsTextSpan,
textSpanEnd: () => textSpanEnd,
textSpanIntersection: () => textSpanIntersection,
textSpanIntersectsWith: () => textSpanIntersectsWith,
textSpanIntersectsWithPosition: () => textSpanIntersectsWithPosition,
textSpanIntersectsWithTextSpan: () => textSpanIntersectsWithTextSpan,
textSpanIsEmpty: () => textSpanIsEmpty,
textSpanOverlap: () => textSpanOverlap,
textSpanOverlapsWith: () => textSpanOverlapsWith,
textSpansEqual: () => textSpansEqual,
textToKeywordObj: () => textToKeywordObj,
timestamp: () => timestamp,
toArray: () => toArray,
toBuilderFileEmit: () => toBuilderFileEmit,
toBuilderStateFileInfoForMultiEmit: () => toBuilderStateFileInfoForMultiEmit,
toEditorSettings: () => toEditorSettings,
toFileNameLowerCase: () => toFileNameLowerCase,
toLowerCase: () => toLowerCase,
toPath: () => toPath,
toProgramEmitPending: () => toProgramEmitPending,
tokenIsIdentifierOrKeyword: () => tokenIsIdentifierOrKeyword,
tokenIsIdentifierOrKeywordOrGreaterThan: () => tokenIsIdentifierOrKeywordOrGreaterThan,
tokenToString: () => tokenToString,
trace: () => trace,
tracing: () => tracing,
tracingEnabled: () => tracingEnabled,
transform: () => transform,
transformClassFields: () => transformClassFields,
transformDeclarations: () => transformDeclarations,
transformECMAScriptModule: () => transformECMAScriptModule,
transformES2015: () => transformES2015,
transformES2016: () => transformES2016,
transformES2017: () => transformES2017,
transformES2018: () => transformES2018,
transformES2019: () => transformES2019,
transformES2020: () => transformES2020,
transformES2021: () => transformES2021,
transformES5: () => transformES5,
transformESDecorators: () => transformESDecorators,
transformESNext: () => transformESNext,
transformGenerators: () => transformGenerators,
transformJsx: () => transformJsx,
transformLegacyDecorators: () => transformLegacyDecorators,
transformModule: () => transformModule,
transformNodeModule: () => transformNodeModule,
transformNodes: () => transformNodes,
transformSystemModule: () => transformSystemModule,
transformTypeScript: () => transformTypeScript,
transpile: () => transpile,
transpileModule: () => transpileModule,
transpileOptionValueCompilerOptions: () => transpileOptionValueCompilerOptions,
trimString: () => trimString,
trimStringEnd: () => trimStringEnd,
trimStringStart: () => trimStringStart,
tryAddToSet: () => tryAddToSet,
tryAndIgnoreErrors: () => tryAndIgnoreErrors,
tryCast: () => tryCast,
tryDirectoryExists: () => tryDirectoryExists,
tryExtractTSExtension: () => tryExtractTSExtension,
tryFileExists: () => tryFileExists,
tryGetClassExtendingExpressionWithTypeArguments: () => tryGetClassExtendingExpressionWithTypeArguments,
tryGetClassImplementingOrExtendingExpressionWithTypeArguments: () => tryGetClassImplementingOrExtendingExpressionWithTypeArguments,
tryGetDirectories: () => tryGetDirectories,
tryGetExtensionFromPath: () => tryGetExtensionFromPath2,
tryGetImportFromModuleSpecifier: () => tryGetImportFromModuleSpecifier,
tryGetJSDocSatisfiesTypeNode: () => tryGetJSDocSatisfiesTypeNode,
tryGetModuleNameFromFile: () => tryGetModuleNameFromFile,
tryGetModuleSpecifierFromDeclaration: () => tryGetModuleSpecifierFromDeclaration,
tryGetNativePerformanceHooks: () => tryGetNativePerformanceHooks,
tryGetPropertyAccessOrIdentifierToString: () => tryGetPropertyAccessOrIdentifierToString,
tryGetPropertyNameOfBindingOrAssignmentElement: () => tryGetPropertyNameOfBindingOrAssignmentElement,
tryGetSourceMappingURL: () => tryGetSourceMappingURL,
tryGetTextOfPropertyName: () => tryGetTextOfPropertyName,
tryIOAndConsumeErrors: () => tryIOAndConsumeErrors,
tryParsePattern: () => tryParsePattern,
tryParsePatterns: () => tryParsePatterns,
tryParseRawSourceMap: () => tryParseRawSourceMap,
tryReadDirectory: () => tryReadDirectory,
tryReadFile: () => tryReadFile,
tryRemoveDirectoryPrefix: () => tryRemoveDirectoryPrefix,
tryRemoveExtension: () => tryRemoveExtension,
tryRemovePrefix: () => tryRemovePrefix,
tryRemoveSuffix: () => tryRemoveSuffix,
typeAcquisitionDeclarations: () => typeAcquisitionDeclarations,
typeAliasNamePart: () => typeAliasNamePart,
typeDirectiveIsEqualTo: () => typeDirectiveIsEqualTo,
typeKeywords: () => typeKeywords,
typeParameterNamePart: () => typeParameterNamePart,
typeReferenceResolutionNameAndModeGetter: () => typeReferenceResolutionNameAndModeGetter,
typeToDisplayParts: () => typeToDisplayParts,
unchangedPollThresholds: () => unchangedPollThresholds,
unchangedTextChangeRange: () => unchangedTextChangeRange,
unescapeLeadingUnderscores: () => unescapeLeadingUnderscores,
unmangleScopedPackageName: () => unmangleScopedPackageName,
unorderedRemoveItem: () => unorderedRemoveItem,
unorderedRemoveItemAt: () => unorderedRemoveItemAt,
unreachableCodeIsError: () => unreachableCodeIsError,
unusedLabelIsError: () => unusedLabelIsError,
unwrapInnermostStatementOfLabel: () => unwrapInnermostStatementOfLabel,
updateErrorForNoInputFiles: () => updateErrorForNoInputFiles,
updateLanguageServiceSourceFile: () => updateLanguageServiceSourceFile,
updateMissingFilePathsWatch: () => updateMissingFilePathsWatch,
updatePackageJsonWatch: () => updatePackageJsonWatch,
updateResolutionField: () => updateResolutionField,
updateSharedExtendedConfigFileWatcher: () => updateSharedExtendedConfigFileWatcher,
updateSourceFile: () => updateSourceFile,
updateWatchingWildcardDirectories: () => updateWatchingWildcardDirectories,
usesExtensionsOnImports: () => usesExtensionsOnImports,
usingSingleLineStringWriter: () => usingSingleLineStringWriter,
utf16EncodeAsString: () => utf16EncodeAsString,
validateLocaleAndSetLanguage: () => validateLocaleAndSetLanguage,
valuesHelper: () => valuesHelper,
version: () => version,
versionMajorMinor: () => versionMajorMinor,
visitArray: () => visitArray,
visitCommaListElements: () => visitCommaListElements,
visitEachChild: () => visitEachChild,
visitFunctionBody: () => visitFunctionBody,
visitIterationBody: () => visitIterationBody,
visitLexicalEnvironment: () => visitLexicalEnvironment,
visitNode: () => visitNode,
visitNodes: () => visitNodes2,
visitParameterList: () => visitParameterList,
walkUpBindingElementsAndPatterns: () => walkUpBindingElementsAndPatterns,
walkUpLexicalEnvironments: () => walkUpLexicalEnvironments,
walkUpOuterExpressions: () => walkUpOuterExpressions,
walkUpParenthesizedExpressions: () => walkUpParenthesizedExpressions,
walkUpParenthesizedTypes: () => walkUpParenthesizedTypes,
walkUpParenthesizedTypesAndGetParentAndChild: () => walkUpParenthesizedTypesAndGetParentAndChild,
whitespaceOrMapCommentRegExp: () => whitespaceOrMapCommentRegExp,
writeCommentRange: () => writeCommentRange,
writeFile: () => writeFile,
writeFileEnsuringDirectories: () => writeFileEnsuringDirectories,
zipToModeAwareCache: () => zipToModeAwareCache,
zipWith: () => zipWith
});
// src/deprecatedCompat/deprecate.ts
var enableDeprecationWarnings = true;
var typeScriptVersion2;
function getTypeScriptVersion() {
return typeScriptVersion2 ?? (typeScriptVersion2 = new Version(version));
}
function formatDeprecationMessage(name, error, errorAfter, since, message) {
let deprecationMessage = error ? "DeprecationError: " : "DeprecationWarning: ";
deprecationMessage += `'${name}' `;
deprecationMessage += since ? `has been deprecated since v${since}` : "is deprecated";
deprecationMessage += error ? " and can no longer be used." : errorAfter ? ` and will no longer be usable after v${errorAfter}.` : ".";
deprecationMessage += message ? ` ${formatStringFromArgs(message, [name], 0)}` : "";
return deprecationMessage;
}
function createErrorDeprecation(name, errorAfter, since, message) {
const deprecationMessage = formatDeprecationMessage(
name,
/*error*/
true,
errorAfter,
since,
message
);
return () => {
throw new TypeError(deprecationMessage);
};
}
function createWarningDeprecation(name, errorAfter, since, message) {
let hasWrittenDeprecation = false;
return () => {
if (enableDeprecationWarnings && !hasWrittenDeprecation) {
Debug.log.warn(formatDeprecationMessage(
name,
/*error*/
false,
errorAfter,
since,
message
));
hasWrittenDeprecation = true;
}
};
}
function createDeprecation(name, options = {}) {
const version2 = typeof options.typeScriptVersion === "string" ? new Version(options.typeScriptVersion) : options.typeScriptVersion ?? getTypeScriptVersion();
const errorAfter = typeof options.errorAfter === "string" ? new Version(options.errorAfter) : options.errorAfter;
const warnAfter = typeof options.warnAfter === "string" ? new Version(options.warnAfter) : options.warnAfter;
const since = typeof options.since === "string" ? new Version(options.since) : options.since ?? warnAfter;
const error = options.error || errorAfter && version2.compareTo(errorAfter) >= 0;
const warn = !warnAfter || version2.compareTo(warnAfter) >= 0;
return error ? createErrorDeprecation(name, errorAfter, since, options.message) : warn ? createWarningDeprecation(name, errorAfter, since, options.message) : noop;
}
function wrapFunction(deprecation, func) {
return function() {
deprecation();
return func.apply(this, arguments);
};
}
function deprecate(func, options) {
const deprecation = createDeprecation((options == null ? void 0 : options.name) ?? Debug.getFunctionName(func), options);
return wrapFunction(deprecation, func);
}
// src/deprecatedCompat/deprecations.ts
function createOverload(name, overloads, binder2, deprecations) {
Object.defineProperty(call, "name", { ...Object.getOwnPropertyDescriptor(call, "name"), value: name });
if (deprecations) {
for (const key of Object.keys(deprecations)) {
const index = +key;
if (!isNaN(index) && hasProperty(overloads, `${index}`)) {
overloads[index] = deprecate(overloads[index], { ...deprecations[index], name });
}
}
}
const bind = createBinder2(overloads, binder2);
return call;
function call(...args) {
const index = bind(args);
const fn = index !== void 0 ? overloads[index] : void 0;
if (typeof fn === "function") {
return fn(...args);
}
throw new TypeError("Invalid arguments");
}
}
function createBinder2(overloads, binder2) {
return (args) => {
for (let i = 0; hasProperty(overloads, `${i}`) && hasProperty(binder2, `${i}`); i++) {
const fn = binder2[i];
if (fn(args)) {
return i;
}
}
};
}
function buildOverload(name) {
return {
overload: (overloads) => ({
bind: (binder2) => ({
finish: () => createOverload(name, overloads, binder2),
deprecate: (deprecations) => ({
finish: () => createOverload(name, overloads, binder2, deprecations)
})
})
})
};
}
// src/deprecatedCompat/5.0/identifierProperties.ts
addObjectAllocatorPatcher((objectAllocator2) => {
const Identifier74 = objectAllocator2.getIdentifierConstructor();
if (!hasProperty(Identifier74.prototype, "originalKeywordKind")) {
Object.defineProperty(Identifier74.prototype, "originalKeywordKind", {
get: deprecate(function() {
return identifierToKeywordKind(this);
}, {
name: "originalKeywordKind",
since: "5.0",
warnAfter: "5.1",
errorAfter: "5.2",
message: "Use 'identifierToKeywordKind(identifier)' instead."
})
});
}
if (!hasProperty(Identifier74.prototype, "isInJSDocNamespace")) {
Object.defineProperty(Identifier74.prototype, "isInJSDocNamespace", {
get: deprecate(function() {
return this.flags & 2048 /* IdentifierIsInJSDocNamespace */ ? true : void 0;
}, {
name: "isInJSDocNamespace",
since: "5.0",
warnAfter: "5.1",
errorAfter: "5.2",
message: "Use '.parent' or the surrounding context to determine this instead."
})
});
}
});
// src/server/_namespaces/ts.server.ts
var ts_server_exports3 = {};
__export(ts_server_exports3, {
ActionInvalidate: () => ActionInvalidate,
ActionPackageInstalled: () => ActionPackageInstalled,
ActionSet: () => ActionSet,
ActionWatchTypingLocations: () => ActionWatchTypingLocations,
Arguments: () => Arguments,
AutoImportProviderProject: () => AutoImportProviderProject,
CharRangeSection: () => CharRangeSection,
CommandNames: () => CommandNames,
ConfigFileDiagEvent: () => ConfigFileDiagEvent,
ConfiguredProject: () => ConfiguredProject2,
Errors: () => Errors,
EventBeginInstallTypes: () => EventBeginInstallTypes,
EventEndInstallTypes: () => EventEndInstallTypes,
EventInitializationFailed: () => EventInitializationFailed,
EventTypesRegistry: () => EventTypesRegistry,
ExternalProject: () => ExternalProject2,
GcTimer: () => GcTimer,
InferredProject: () => InferredProject2,
LargeFileReferencedEvent: () => LargeFileReferencedEvent,
LineIndex: () => LineIndex,
LineLeaf: () => LineLeaf,
LineNode: () => LineNode,
LogLevel: () => LogLevel2,
Msg: () => Msg,
OpenFileInfoTelemetryEvent: () => OpenFileInfoTelemetryEvent,
Project: () => Project3,
ProjectInfoTelemetryEvent: () => ProjectInfoTelemetryEvent,
ProjectKind: () => ProjectKind,
ProjectLanguageServiceStateEvent: () => ProjectLanguageServiceStateEvent,
ProjectLoadingFinishEvent: () => ProjectLoadingFinishEvent,
ProjectLoadingStartEvent: () => ProjectLoadingStartEvent,
ProjectReferenceProjectLoadKind: () => ProjectReferenceProjectLoadKind,
ProjectService: () => ProjectService3,
ProjectsUpdatedInBackgroundEvent: () => ProjectsUpdatedInBackgroundEvent,
ScriptInfo: () => ScriptInfo,
ScriptVersionCache: () => ScriptVersionCache,
Session: () => Session3,
TextStorage: () => TextStorage,
ThrottledOperations: () => ThrottledOperations,
TypingsCache: () => TypingsCache,
allFilesAreJsOrDts: () => allFilesAreJsOrDts,
allRootFilesAreJsOrDts: () => allRootFilesAreJsOrDts,
asNormalizedPath: () => asNormalizedPath,
convertCompilerOptions: () => convertCompilerOptions,
convertFormatOptions: () => convertFormatOptions,
convertScriptKindName: () => convertScriptKindName,
convertTypeAcquisition: () => convertTypeAcquisition,
convertUserPreferences: () => convertUserPreferences,
convertWatchOptions: () => convertWatchOptions,
countEachFileTypes: () => countEachFileTypes,
createInstallTypingsRequest: () => createInstallTypingsRequest,
createModuleSpecifierCache: () => createModuleSpecifierCache,
createNormalizedPathMap: () => createNormalizedPathMap,
createPackageJsonCache: () => createPackageJsonCache,
createSortedArray: () => createSortedArray2,
emptyArray: () => emptyArray2,
findArgument: () => findArgument,
forEachResolvedProjectReferenceProject: () => forEachResolvedProjectReferenceProject,
formatDiagnosticToProtocol: () => formatDiagnosticToProtocol,
formatMessage: () => formatMessage2,
getBaseConfigFileName: () => getBaseConfigFileName,
getLocationInNewDocument: () => getLocationInNewDocument,
hasArgument: () => hasArgument,
hasNoTypeScriptSource: () => hasNoTypeScriptSource,
indent: () => indent2,
isConfigFile: () => isConfigFile,
isConfiguredProject: () => isConfiguredProject,
isDynamicFileName: () => isDynamicFileName,
isExternalProject: () => isExternalProject,
isInferredProject: () => isInferredProject,
isInferredProjectName: () => isInferredProjectName,
makeAutoImportProviderProjectName: () => makeAutoImportProviderProjectName,
makeAuxiliaryProjectName: () => makeAuxiliaryProjectName,
makeInferredProjectName: () => makeInferredProjectName,
maxFileSize: () => maxFileSize,
maxProgramSizeForNonTsFiles: () => maxProgramSizeForNonTsFiles,
normalizedPathToPath: () => normalizedPathToPath,
nowString: () => nowString,
nullCancellationToken: () => nullCancellationToken,
nullTypingsInstaller: () => nullTypingsInstaller,
projectContainsInfoDirectly: () => projectContainsInfoDirectly,
protocol: () => ts_server_protocol_exports,
removeSorted: () => removeSorted,
stringifyIndented: () => stringifyIndented,
toEvent: () => toEvent,
toNormalizedPath: () => toNormalizedPath,
tryConvertScriptKindName: () => tryConvertScriptKindName,
typingsInstaller: () => ts_server_typingsInstaller_exports,
updateProjectIfDirty: () => updateProjectIfDirty
});
// src/typingsInstallerCore/_namespaces/ts.server.typingsInstaller.ts
var ts_server_typingsInstaller_exports = {};
__export(ts_server_typingsInstaller_exports, {
TypingsInstaller: () => TypingsInstaller,
getNpmCommandForInstallation: () => getNpmCommandForInstallation,
installNpmPackages: () => installNpmPackages,
typingsName: () => typingsName
});
// src/typingsInstallerCore/typingsInstaller.ts
var nullLog = {
isEnabled: () => false,
writeLine: noop
};
function typingToFileName(cachePath, packageName, installTypingHost, log) {
try {
const result = resolveModuleName(packageName, combinePaths(cachePath, "index.d.ts"), { moduleResolution: 2 /* Node10 */ }, installTypingHost);
return result.resolvedModule && result.resolvedModule.resolvedFileName;
} catch (e) {
if (log.isEnabled()) {
log.writeLine(`Failed to resolve ${packageName} in folder '${cachePath}': ${e.message}`);
}
return void 0;
}
}
function installNpmPackages(npmPath, tsVersion, packageNames, install) {
let hasError = false;
for (let remaining = packageNames.length; remaining > 0; ) {
const result = getNpmCommandForInstallation(npmPath, tsVersion, packageNames, remaining);
remaining = result.remaining;
hasError = install(result.command) || hasError;
}
return hasError;
}
function getNpmCommandForInstallation(npmPath, tsVersion, packageNames, remaining) {
const sliceStart = packageNames.length - remaining;
let command, toSlice = remaining;
while (true) {
command = `${npmPath} install --ignore-scripts ${(toSlice === packageNames.length ? packageNames : packageNames.slice(sliceStart, sliceStart + toSlice)).join(" ")} --save-dev --user-agent="typesInstaller/${tsVersion}"`;
if (command.length < 8e3) {
break;
}
toSlice = toSlice - Math.floor(toSlice / 2);
}
return { command, remaining: remaining - toSlice };
}
var TypingsInstaller = class {
constructor(installTypingHost, globalCachePath, safeListPath, typesMapLocation, throttleLimit, log = nullLog) {
this.installTypingHost = installTypingHost;
this.globalCachePath = globalCachePath;
this.safeListPath = safeListPath;
this.typesMapLocation = typesMapLocation;
this.throttleLimit = throttleLimit;
this.log = log;
this.packageNameToTypingLocation = /* @__PURE__ */ new Map();
this.missingTypingsSet = /* @__PURE__ */ new Set();
this.knownCachesSet = /* @__PURE__ */ new Set();
this.projectWatchers = /* @__PURE__ */ new Map();
/** @internal */
this.pendingRunRequests = [];
this.installRunCount = 1;
this.inFlightRequestCount = 0;
this.latestDistTag = "latest";
const isLoggingEnabled = this.log.isEnabled();
if (isLoggingEnabled) {
this.log.writeLine(`Global cache location '${globalCachePath}', safe file path '${safeListPath}', types map path ${typesMapLocation}`);
}
this.processCacheLocation(this.globalCachePath);
}
closeProject(req) {
this.closeWatchers(req.projectName);
}
closeWatchers(projectName) {
if (this.log.isEnabled()) {
this.log.writeLine(`Closing file watchers for project '${projectName}'`);
}
const watchers = this.projectWatchers.get(projectName);
if (!watchers) {
if (this.log.isEnabled()) {
this.log.writeLine(`No watchers are registered for project '${projectName}'`);
}
return;
}
this.projectWatchers.delete(projectName);
this.sendResponse({ kind: ActionWatchTypingLocations, projectName, files: [] });
if (this.log.isEnabled()) {
this.log.writeLine(`Closing file watchers for project '${projectName}' - done.`);
}
}
install(req) {
if (this.log.isEnabled()) {
this.log.writeLine(`Got install request ${JSON.stringify(req)}`);
}
if (req.cachePath) {
if (this.log.isEnabled()) {
this.log.writeLine(`Request specifies cache path '${req.cachePath}', loading cached information...`);
}
this.processCacheLocation(req.cachePath);
}
if (this.safeList === void 0) {
this.initializeSafeList();
}
const discoverTypingsResult = ts_JsTyping_exports.discoverTypings(
this.installTypingHost,
this.log.isEnabled() ? (s) => this.log.writeLine(s) : void 0,
req.fileNames,
req.projectRootPath,
this.safeList,
this.packageNameToTypingLocation,
req.typeAcquisition,
req.unresolvedImports,
this.typesRegistry,
req.compilerOptions
);
if (this.log.isEnabled()) {
this.log.writeLine(`Finished typings discovery: ${JSON.stringify(discoverTypingsResult)}`);
}
this.watchFiles(req.projectName, discoverTypingsResult.filesToWatch);
if (discoverTypingsResult.newTypingNames.length) {
this.installTypings(req, req.cachePath || this.globalCachePath, discoverTypingsResult.cachedTypingPaths, discoverTypingsResult.newTypingNames);
} else {
this.sendResponse(this.createSetTypings(req, discoverTypingsResult.cachedTypingPaths));
if (this.log.isEnabled()) {
this.log.writeLine(`No new typings were requested as a result of typings discovery`);
}
}
}
initializeSafeList() {
if (this.typesMapLocation) {
const safeListFromMap = ts_JsTyping_exports.loadTypesMap(this.installTypingHost, this.typesMapLocation);
if (safeListFromMap) {
this.log.writeLine(`Loaded safelist from types map file '${this.typesMapLocation}'`);
this.safeList = safeListFromMap;
return;
}
this.log.writeLine(`Failed to load safelist from types map file '${this.typesMapLocation}'`);
}
this.safeList = ts_JsTyping_exports.loadSafeList(this.installTypingHost, this.safeListPath);
}
processCacheLocation(cacheLocation) {
if (this.log.isEnabled()) {
this.log.writeLine(`Processing cache location '${cacheLocation}'`);
}
if (this.knownCachesSet.has(cacheLocation)) {
if (this.log.isEnabled()) {
this.log.writeLine(`Cache location was already processed...`);
}
return;
}
const packageJson = combinePaths(cacheLocation, "package.json");
const packageLockJson = combinePaths(cacheLocation, "package-lock.json");
if (this.log.isEnabled()) {
this.log.writeLine(`Trying to find '${packageJson}'...`);
}
if (this.installTypingHost.fileExists(packageJson) && this.installTypingHost.fileExists(packageLockJson)) {
const npmConfig = JSON.parse(this.installTypingHost.readFile(packageJson));
const npmLock = JSON.parse(this.installTypingHost.readFile(packageLockJson));
if (this.log.isEnabled()) {
this.log.writeLine(`Loaded content of '${packageJson}': ${JSON.stringify(npmConfig)}`);
this.log.writeLine(`Loaded content of '${packageLockJson}'`);
}
if (npmConfig.devDependencies && npmLock.dependencies) {
for (const key in npmConfig.devDependencies) {
if (!hasProperty(npmLock.dependencies, key)) {
continue;
}
const packageName = getBaseFileName(key);
if (!packageName) {
continue;
}
const typingFile = typingToFileName(cacheLocation, packageName, this.installTypingHost, this.log);
if (!typingFile) {
this.missingTypingsSet.add(packageName);
continue;
}
const existingTypingFile = this.packageNameToTypingLocation.get(packageName);
if (existingTypingFile) {
if (existingTypingFile.typingLocation === typingFile) {
continue;
}
if (this.log.isEnabled()) {
this.log.writeLine(`New typing for package ${packageName} from '${typingFile}' conflicts with existing typing file '${existingTypingFile}'`);
}
}
if (this.log.isEnabled()) {
this.log.writeLine(`Adding entry into typings cache: '${packageName}' => '${typingFile}'`);
}
const info = getProperty(npmLock.dependencies, key);
const version2 = info && info.version;
if (!version2) {
continue;
}
const newTyping = { typingLocation: typingFile, version: new Version(version2) };
this.packageNameToTypingLocation.set(packageName, newTyping);
}
}
}
if (this.log.isEnabled()) {
this.log.writeLine(`Finished processing cache location '${cacheLocation}'`);
}
this.knownCachesSet.add(cacheLocation);
}
filterTypings(typingsToInstall) {
return mapDefined(typingsToInstall, (typing) => {
const typingKey = mangleScopedPackageName(typing);
if (this.missingTypingsSet.has(typingKey)) {
if (this.log.isEnabled())
this.log.writeLine(`'${typing}':: '${typingKey}' is in missingTypingsSet - skipping...`);
return void 0;
}
const validationResult = ts_JsTyping_exports.validatePackageName(typing);
if (validationResult !== ts_JsTyping_exports.NameValidationResult.Ok) {
this.missingTypingsSet.add(typingKey);
if (this.log.isEnabled())
this.log.writeLine(ts_JsTyping_exports.renderPackageNameValidationFailure(validationResult, typing));
return void 0;
}
if (!this.typesRegistry.has(typingKey)) {
if (this.log.isEnabled())
this.log.writeLine(`'${typing}':: Entry for package '${typingKey}' does not exist in local types registry - skipping...`);
return void 0;
}
if (this.packageNameToTypingLocation.get(typingKey) && ts_JsTyping_exports.isTypingUpToDate(this.packageNameToTypingLocation.get(typingKey), this.typesRegistry.get(typingKey))) {
if (this.log.isEnabled())
this.log.writeLine(`'${typing}':: '${typingKey}' already has an up-to-date typing - skipping...`);
return void 0;
}
return typingKey;
});
}
ensurePackageDirectoryExists(directory) {
const npmConfigPath = combinePaths(directory, "package.json");
if (this.log.isEnabled()) {
this.log.writeLine(`Npm config file: ${npmConfigPath}`);
}
if (!this.installTypingHost.fileExists(npmConfigPath)) {
if (this.log.isEnabled()) {
this.log.writeLine(`Npm config file: '${npmConfigPath}' is missing, creating new one...`);
}
this.ensureDirectoryExists(directory, this.installTypingHost);
this.installTypingHost.writeFile(npmConfigPath, '{ "private": true }');
}
}
installTypings(req, cachePath, currentlyCachedTypings, typingsToInstall) {
if (this.log.isEnabled()) {
this.log.writeLine(`Installing typings ${JSON.stringify(typingsToInstall)}`);
}
const filteredTypings = this.filterTypings(typingsToInstall);
if (filteredTypings.length === 0) {
if (this.log.isEnabled()) {
this.log.writeLine(`All typings are known to be missing or invalid - no need to install more typings`);
}
this.sendResponse(this.createSetTypings(req, currentlyCachedTypings));
return;
}
this.ensurePackageDirectoryExists(cachePath);
const requestId = this.installRunCount;
this.installRunCount++;
this.sendResponse({
kind: EventBeginInstallTypes,
eventId: requestId,
typingsInstallerVersion: version,
projectName: req.projectName
});
const scopedTypings = filteredTypings.map(typingsName);
this.installTypingsAsync(requestId, scopedTypings, cachePath, (ok) => {
try {
if (!ok) {
if (this.log.isEnabled()) {
this.log.writeLine(`install request failed, marking packages as missing to prevent repeated requests: ${JSON.stringify(filteredTypings)}`);
}
for (const typing of filteredTypings) {
this.missingTypingsSet.add(typing);
}
return;
}
if (this.log.isEnabled()) {
this.log.writeLine(`Installed typings ${JSON.stringify(scopedTypings)}`);
}
const installedTypingFiles = [];
for (const packageName of filteredTypings) {
const typingFile = typingToFileName(cachePath, packageName, this.installTypingHost, this.log);
if (!typingFile) {
this.missingTypingsSet.add(packageName);
continue;
}
const distTags = this.typesRegistry.get(packageName);
const newVersion = new Version(distTags[`ts${versionMajorMinor}`] || distTags[this.latestDistTag]);
const newTyping = { typingLocation: typingFile, version: newVersion };
this.packageNameToTypingLocation.set(packageName, newTyping);
installedTypingFiles.push(typingFile);
}
if (this.log.isEnabled()) {
this.log.writeLine(`Installed typing files ${JSON.stringify(installedTypingFiles)}`);
}
this.sendResponse(this.createSetTypings(req, currentlyCachedTypings.concat(installedTypingFiles)));
} finally {
const response = {
kind: EventEndInstallTypes,
eventId: requestId,
projectName: req.projectName,
packagesToInstall: scopedTypings,
installSuccess: ok,
typingsInstallerVersion: version
};
this.sendResponse(response);
}
});
}
ensureDirectoryExists(directory, host) {
const directoryName = getDirectoryPath(directory);
if (!host.directoryExists(directoryName)) {
this.ensureDirectoryExists(directoryName, host);
}
if (!host.directoryExists(directory)) {
host.createDirectory(directory);
}
}
watchFiles(projectName, files) {
if (!files.length) {
this.closeWatchers(projectName);
return;
}
const existing = this.projectWatchers.get(projectName);
const newSet = new Set(files);
if (!existing || forEachKey(newSet, (s) => !existing.has(s)) || forEachKey(existing, (s) => !newSet.has(s))) {
this.projectWatchers.set(projectName, newSet);
this.sendResponse({ kind: ActionWatchTypingLocations, projectName, files });
} else {
this.sendResponse({ kind: ActionWatchTypingLocations, projectName, files: void 0 });
}
}
createSetTypings(request, typings) {
return {
projectName: request.projectName,
typeAcquisition: request.typeAcquisition,
compilerOptions: request.compilerOptions,
typings,
unresolvedImports: request.unresolvedImports,
kind: ActionSet
};
}
installTypingsAsync(requestId, packageNames, cwd, onRequestCompleted) {
this.pendingRunRequests.unshift({ requestId, packageNames, cwd, onRequestCompleted });
this.executeWithThrottling();
}
executeWithThrottling() {
while (this.inFlightRequestCount < this.throttleLimit && this.pendingRunRequests.length) {
this.inFlightRequestCount++;
const request = this.pendingRunRequests.pop();
this.installWorker(request.requestId, request.packageNames, request.cwd, (ok) => {
this.inFlightRequestCount--;
request.onRequestCompleted(ok);
this.executeWithThrottling();
});
}
}
};
function typingsName(packageName) {
return `@types/${packageName}@ts${versionMajorMinor}`;
}
// src/server/utilitiesPublic.ts
var LogLevel2 = /* @__PURE__ */ ((LogLevel3) => {
LogLevel3[LogLevel3["terse"] = 0] = "terse";
LogLevel3[LogLevel3["normal"] = 1] = "normal";
LogLevel3[LogLevel3["requestTime"] = 2] = "requestTime";
LogLevel3[LogLevel3["verbose"] = 3] = "verbose";
return LogLevel3;
})(LogLevel2 || {});
var emptyArray2 = createSortedArray2();
var Msg = /* @__PURE__ */ ((Msg2) => {
Msg2["Err"] = "Err";
Msg2["Info"] = "Info";
Msg2["Perf"] = "Perf";
return Msg2;
})(Msg || {});
function createInstallTypingsRequest(project, typeAcquisition, unresolvedImports, cachePath) {
return {
projectName: project.getProjectName(),
fileNames: project.getFileNames(
/*excludeFilesFromExternalLibraries*/
true,
/*excludeConfigFiles*/
true
).concat(project.getExcludedFiles()),
compilerOptions: project.getCompilationSettings(),
typeAcquisition,
unresolvedImports,
projectRootPath: project.getCurrentDirectory(),
cachePath,
kind: "discover"
};
}
var Errors;
((Errors2) => {
function ThrowNoProject() {
throw new Error("No Project.");
}
Errors2.ThrowNoProject = ThrowNoProject;
function ThrowProjectLanguageServiceDisabled() {
throw new Error("The project's language service is disabled.");
}
Errors2.ThrowProjectLanguageServiceDisabled = ThrowProjectLanguageServiceDisabled;
function ThrowProjectDoesNotContainDocument(fileName, project) {
throw new Error(`Project '${project.getProjectName()}' does not contain document '${fileName}'`);
}
Errors2.ThrowProjectDoesNotContainDocument = ThrowProjectDoesNotContainDocument;
})(Errors || (Errors = {}));
function toNormalizedPath(fileName) {
return normalizePath(fileName);
}
function normalizedPathToPath(normalizedPath, currentDirectory, getCanonicalFileName) {
const f = isRootedDiskPath(normalizedPath) ? normalizedPath : getNormalizedAbsolutePath(normalizedPath, currentDirectory);
return getCanonicalFileName(f);
}
function asNormalizedPath(fileName) {
return fileName;
}
function createNormalizedPathMap() {
const map2 = /* @__PURE__ */ new Map();
return {
get(path) {
return map2.get(path);
},
set(path, value) {
map2.set(path, value);
},
contains(path) {
return map2.has(path);
},
remove(path) {
map2.delete(path);
}
};
}
function isInferredProjectName(name) {
return /dev\/null\/inferredProject\d+\*/.test(name);
}
function makeInferredProjectName(counter) {
return `/dev/null/inferredProject${counter}*`;
}
function makeAutoImportProviderProjectName(counter) {
return `/dev/null/autoImportProviderProject${counter}*`;
}
function makeAuxiliaryProjectName(counter) {
return `/dev/null/auxiliaryProject${counter}*`;
}
function createSortedArray2() {
return [];
}
// src/server/utilities.ts
var ThrottledOperations = class {
constructor(host, logger) {
this.host = host;
this.pendingTimeouts = /* @__PURE__ */ new Map();
this.logger = logger.hasLevel(3 /* verbose */) ? logger : void 0;
}
/**
* Wait `number` milliseconds and then invoke `cb`. If, while waiting, schedule
* is called again with the same `operationId`, cancel this operation in favor
* of the new one. (Note that the amount of time the canceled operation had been
* waiting does not affect the amount of time that the new operation waits.)
*/
schedule(operationId, delay, cb) {
const pendingTimeout = this.pendingTimeouts.get(operationId);
if (pendingTimeout) {
this.host.clearTimeout(pendingTimeout);
}
this.pendingTimeouts.set(operationId, this.host.setTimeout(ThrottledOperations.run, delay, operationId, this, cb));
if (this.logger) {
this.logger.info(`Scheduled: ${operationId}${pendingTimeout ? ", Cancelled earlier one" : ""}`);
}
}
cancel(operationId) {
const pendingTimeout = this.pendingTimeouts.get(operationId);
if (!pendingTimeout)
return false;
this.host.clearTimeout(pendingTimeout);
return this.pendingTimeouts.delete(operationId);
}
static run(operationId, self, cb) {
var _a, _b;
(_a = perfLogger) == null ? void 0 : _a.logStartScheduledOperation(operationId);
self.pendingTimeouts.delete(operationId);
if (self.logger) {
self.logger.info(`Running: ${operationId}`);
}
cb();
(_b = perfLogger) == null ? void 0 : _b.logStopScheduledOperation();
}
};
var GcTimer = class {
constructor(host, delay, logger) {
this.host = host;
this.delay = delay;
this.logger = logger;
}
scheduleCollect() {
if (!this.host.gc || this.timerId !== void 0) {
return;
}
this.timerId = this.host.setTimeout(GcTimer.run, this.delay, this);
}
static run(self) {
var _a, _b;
self.timerId = void 0;
(_a = perfLogger) == null ? void 0 : _a.logStartScheduledOperation("GC collect");
const log = self.logger.hasLevel(2 /* requestTime */);
const before = log && self.host.getMemoryUsage();
self.host.gc();
if (log) {
const after = self.host.getMemoryUsage();
self.logger.perftrc(`GC::before ${before}, after ${after}`);
}
(_b = perfLogger) == null ? void 0 : _b.logStopScheduledOperation();
}
};
function getBaseConfigFileName(configFilePath) {
const base = getBaseFileName(configFilePath);
return base === "tsconfig.json" || base === "jsconfig.json" ? base : void 0;
}
function removeSorted(array, remove, compare) {
if (!array || array.length === 0) {
return;
}
if (array[0] === remove) {
array.splice(0, 1);
return;
}
const removeIndex = binarySearch(array, remove, identity, compare);
if (removeIndex >= 0) {
array.splice(removeIndex, 1);
}
}
var indentStr = "\n ";
function indent2(str) {
return indentStr + str.replace(/\n/g, indentStr);
}
function stringifyIndented(json) {
return indentStr + JSON.stringify(json);
}
// src/server/_namespaces/ts.server.protocol.ts
var ts_server_protocol_exports = {};
__export(ts_server_protocol_exports, {
ClassificationType: () => ClassificationType2,
CommandTypes: () => CommandTypes,
CompletionTriggerKind: () => CompletionTriggerKind2,
IndentStyle: () => IndentStyle2,
JsxEmit: () => JsxEmit2,
ModuleKind: () => ModuleKind2,
ModuleResolutionKind: () => ModuleResolutionKind2,
NewLineKind: () => NewLineKind2,
OrganizeImportsMode: () => OrganizeImportsMode2,
PollingWatchKind: () => PollingWatchKind2,
ScriptTarget: () => ScriptTarget10,
SemicolonPreference: () => SemicolonPreference2,
WatchDirectoryKind: () => WatchDirectoryKind2,
WatchFileKind: () => WatchFileKind2
});
// src/server/protocol.ts
var CommandTypes = /* @__PURE__ */ ((CommandTypes2) => {
CommandTypes2["JsxClosingTag"] = "jsxClosingTag";
CommandTypes2["LinkedEditingRange"] = "linkedEditingRange";
CommandTypes2["Brace"] = "brace";
CommandTypes2["BraceFull"] = "brace-full";
CommandTypes2["BraceCompletion"] = "braceCompletion";
CommandTypes2["GetSpanOfEnclosingComment"] = "getSpanOfEnclosingComment";
CommandTypes2["Change"] = "change";
CommandTypes2["Close"] = "close";
CommandTypes2["Completions"] = "completions";
CommandTypes2["CompletionInfo"] = "completionInfo";
CommandTypes2["CompletionsFull"] = "completions-full";
CommandTypes2["CompletionDetails"] = "completionEntryDetails";
CommandTypes2["CompletionDetailsFull"] = "completionEntryDetails-full";
CommandTypes2["CompileOnSaveAffectedFileList"] = "compileOnSaveAffectedFileList";
CommandTypes2["CompileOnSaveEmitFile"] = "compileOnSaveEmitFile";
CommandTypes2["Configure"] = "configure";
CommandTypes2["Definition"] = "definition";
CommandTypes2["DefinitionFull"] = "definition-full";
CommandTypes2["DefinitionAndBoundSpan"] = "definitionAndBoundSpan";
CommandTypes2["DefinitionAndBoundSpanFull"] = "definitionAndBoundSpan-full";
CommandTypes2["Implementation"] = "implementation";
CommandTypes2["ImplementationFull"] = "implementation-full";
CommandTypes2["EmitOutput"] = "emit-output";
CommandTypes2["Exit"] = "exit";
CommandTypes2["FileReferences"] = "fileReferences";
CommandTypes2["FileReferencesFull"] = "fileReferences-full";
CommandTypes2["Format"] = "format";
CommandTypes2["Formatonkey"] = "formatonkey";
CommandTypes2["FormatFull"] = "format-full";
CommandTypes2["FormatonkeyFull"] = "formatonkey-full";
CommandTypes2["FormatRangeFull"] = "formatRange-full";
CommandTypes2["Geterr"] = "geterr";
CommandTypes2["GeterrForProject"] = "geterrForProject";
CommandTypes2["SemanticDiagnosticsSync"] = "semanticDiagnosticsSync";
CommandTypes2["SyntacticDiagnosticsSync"] = "syntacticDiagnosticsSync";
CommandTypes2["SuggestionDiagnosticsSync"] = "suggestionDiagnosticsSync";
CommandTypes2["NavBar"] = "navbar";
CommandTypes2["NavBarFull"] = "navbar-full";
CommandTypes2["Navto"] = "navto";
CommandTypes2["NavtoFull"] = "navto-full";
CommandTypes2["NavTree"] = "navtree";
CommandTypes2["NavTreeFull"] = "navtree-full";
CommandTypes2["DocumentHighlights"] = "documentHighlights";
CommandTypes2["DocumentHighlightsFull"] = "documentHighlights-full";
CommandTypes2["Open"] = "open";
CommandTypes2["Quickinfo"] = "quickinfo";
CommandTypes2["QuickinfoFull"] = "quickinfo-full";
CommandTypes2["References"] = "references";
CommandTypes2["ReferencesFull"] = "references-full";
CommandTypes2["Reload"] = "reload";
CommandTypes2["Rename"] = "rename";
CommandTypes2["RenameInfoFull"] = "rename-full";
CommandTypes2["RenameLocationsFull"] = "renameLocations-full";
CommandTypes2["Saveto"] = "saveto";
CommandTypes2["SignatureHelp"] = "signatureHelp";
CommandTypes2["SignatureHelpFull"] = "signatureHelp-full";
CommandTypes2["FindSourceDefinition"] = "findSourceDefinition";
CommandTypes2["Status"] = "status";
CommandTypes2["TypeDefinition"] = "typeDefinition";
CommandTypes2["ProjectInfo"] = "projectInfo";
CommandTypes2["ReloadProjects"] = "reloadProjects";
CommandTypes2["Unknown"] = "unknown";
CommandTypes2["OpenExternalProject"] = "openExternalProject";
CommandTypes2["OpenExternalProjects"] = "openExternalProjects";
CommandTypes2["CloseExternalProject"] = "closeExternalProject";
CommandTypes2["SynchronizeProjectList"] = "synchronizeProjectList";
CommandTypes2["ApplyChangedToOpenFiles"] = "applyChangedToOpenFiles";
CommandTypes2["UpdateOpen"] = "updateOpen";
CommandTypes2["EncodedSyntacticClassificationsFull"] = "encodedSyntacticClassifications-full";
CommandTypes2["EncodedSemanticClassificationsFull"] = "encodedSemanticClassifications-full";
CommandTypes2["Cleanup"] = "cleanup";
CommandTypes2["GetOutliningSpans"] = "getOutliningSpans";
CommandTypes2["GetOutliningSpansFull"] = "outliningSpans";
CommandTypes2["TodoComments"] = "todoComments";
CommandTypes2["Indentation"] = "indentation";
CommandTypes2["DocCommentTemplate"] = "docCommentTemplate";
CommandTypes2["CompilerOptionsDiagnosticsFull"] = "compilerOptionsDiagnostics-full";
CommandTypes2["NameOrDottedNameSpan"] = "nameOrDottedNameSpan";
CommandTypes2["BreakpointStatement"] = "breakpointStatement";
CommandTypes2["CompilerOptionsForInferredProjects"] = "compilerOptionsForInferredProjects";
CommandTypes2["GetCodeFixes"] = "getCodeFixes";
CommandTypes2["GetCodeFixesFull"] = "getCodeFixes-full";
CommandTypes2["GetCombinedCodeFix"] = "getCombinedCodeFix";
CommandTypes2["GetCombinedCodeFixFull"] = "getCombinedCodeFix-full";
CommandTypes2["ApplyCodeActionCommand"] = "applyCodeActionCommand";
CommandTypes2["GetSupportedCodeFixes"] = "getSupportedCodeFixes";
CommandTypes2["GetApplicableRefactors"] = "getApplicableRefactors";
CommandTypes2["GetEditsForRefactor"] = "getEditsForRefactor";
CommandTypes2["GetMoveToRefactoringFileSuggestions"] = "getMoveToRefactoringFileSuggestions";
CommandTypes2["GetEditsForRefactorFull"] = "getEditsForRefactor-full";
CommandTypes2["OrganizeImports"] = "organizeImports";
CommandTypes2["OrganizeImportsFull"] = "organizeImports-full";
CommandTypes2["GetEditsForFileRename"] = "getEditsForFileRename";
CommandTypes2["GetEditsForFileRenameFull"] = "getEditsForFileRename-full";
CommandTypes2["ConfigurePlugin"] = "configurePlugin";
CommandTypes2["SelectionRange"] = "selectionRange";
CommandTypes2["SelectionRangeFull"] = "selectionRange-full";
CommandTypes2["ToggleLineComment"] = "toggleLineComment";
CommandTypes2["ToggleLineCommentFull"] = "toggleLineComment-full";
CommandTypes2["ToggleMultilineComment"] = "toggleMultilineComment";
CommandTypes2["ToggleMultilineCommentFull"] = "toggleMultilineComment-full";
CommandTypes2["CommentSelection"] = "commentSelection";
CommandTypes2["CommentSelectionFull"] = "commentSelection-full";
CommandTypes2["UncommentSelection"] = "uncommentSelection";
CommandTypes2["UncommentSelectionFull"] = "uncommentSelection-full";
CommandTypes2["PrepareCallHierarchy"] = "prepareCallHierarchy";
CommandTypes2["ProvideCallHierarchyIncomingCalls"] = "provideCallHierarchyIncomingCalls";
CommandTypes2["ProvideCallHierarchyOutgoingCalls"] = "provideCallHierarchyOutgoingCalls";
CommandTypes2["ProvideInlayHints"] = "provideInlayHints";
return CommandTypes2;
})(CommandTypes || {});
var OrganizeImportsMode2 = /* @__PURE__ */ ((OrganizeImportsMode3) => {
OrganizeImportsMode3["All"] = "All";
OrganizeImportsMode3["SortAndCombine"] = "SortAndCombine";
OrganizeImportsMode3["RemoveUnused"] = "RemoveUnused";
return OrganizeImportsMode3;
})(OrganizeImportsMode2 || {});
var WatchFileKind2 = /* @__PURE__ */ ((WatchFileKind3) => {
WatchFileKind3["FixedPollingInterval"] = "FixedPollingInterval";
WatchFileKind3["PriorityPollingInterval"] = "PriorityPollingInterval";
WatchFileKind3["DynamicPriorityPolling"] = "DynamicPriorityPolling";
WatchFileKind3["FixedChunkSizePolling"] = "FixedChunkSizePolling";
WatchFileKind3["UseFsEvents"] = "UseFsEvents";
WatchFileKind3["UseFsEventsOnParentDirectory"] = "UseFsEventsOnParentDirectory";
return WatchFileKind3;
})(WatchFileKind2 || {});
var WatchDirectoryKind2 = /* @__PURE__ */ ((WatchDirectoryKind3) => {
WatchDirectoryKind3["UseFsEvents"] = "UseFsEvents";
WatchDirectoryKind3["FixedPollingInterval"] = "FixedPollingInterval";
WatchDirectoryKind3["DynamicPriorityPolling"] = "DynamicPriorityPolling";
WatchDirectoryKind3["FixedChunkSizePolling"] = "FixedChunkSizePolling";
return WatchDirectoryKind3;
})(WatchDirectoryKind2 || {});
var PollingWatchKind2 = /* @__PURE__ */ ((PollingWatchKind3) => {
PollingWatchKind3["FixedInterval"] = "FixedInterval";
PollingWatchKind3["PriorityInterval"] = "PriorityInterval";
PollingWatchKind3["DynamicPriority"] = "DynamicPriority";
PollingWatchKind3["FixedChunkSize"] = "FixedChunkSize";
return PollingWatchKind3;
})(PollingWatchKind2 || {});
var CompletionTriggerKind2 = /* @__PURE__ */ ((CompletionTriggerKind4) => {
CompletionTriggerKind4[CompletionTriggerKind4["Invoked"] = 1] = "Invoked";
CompletionTriggerKind4[CompletionTriggerKind4["TriggerCharacter"] = 2] = "TriggerCharacter";
CompletionTriggerKind4[CompletionTriggerKind4["TriggerForIncompleteCompletions"] = 3] = "TriggerForIncompleteCompletions";
return CompletionTriggerKind4;
})(CompletionTriggerKind2 || {});
var IndentStyle2 = /* @__PURE__ */ ((IndentStyle3) => {
IndentStyle3["None"] = "None";
IndentStyle3["Block"] = "Block";
IndentStyle3["Smart"] = "Smart";
return IndentStyle3;
})(IndentStyle2 || {});
var SemicolonPreference2 = /* @__PURE__ */ ((SemicolonPreference3) => {
SemicolonPreference3["Ignore"] = "ignore";
SemicolonPreference3["Insert"] = "insert";
SemicolonPreference3["Remove"] = "remove";
return SemicolonPreference3;
})(SemicolonPreference2 || {});
var JsxEmit2 = /* @__PURE__ */ ((JsxEmit3) => {
JsxEmit3["None"] = "None";
JsxEmit3["Preserve"] = "Preserve";
JsxEmit3["ReactNative"] = "ReactNative";
JsxEmit3["React"] = "React";
return JsxEmit3;
})(JsxEmit2 || {});
var ModuleKind2 = /* @__PURE__ */ ((ModuleKind3) => {
ModuleKind3["None"] = "None";
ModuleKind3["CommonJS"] = "CommonJS";
ModuleKind3["AMD"] = "AMD";
ModuleKind3["UMD"] = "UMD";
ModuleKind3["System"] = "System";
ModuleKind3["ES6"] = "ES6";
ModuleKind3["ES2015"] = "ES2015";
ModuleKind3["ESNext"] = "ESNext";
return ModuleKind3;
})(ModuleKind2 || {});
var ModuleResolutionKind2 = /* @__PURE__ */ ((ModuleResolutionKind3) => {
ModuleResolutionKind3["Classic"] = "Classic";
ModuleResolutionKind3["Node"] = "Node";
return ModuleResolutionKind3;
})(ModuleResolutionKind2 || {});
var NewLineKind2 = /* @__PURE__ */ ((NewLineKind3) => {
NewLineKind3["Crlf"] = "Crlf";
NewLineKind3["Lf"] = "Lf";
return NewLineKind3;
})(NewLineKind2 || {});
var ScriptTarget10 = /* @__PURE__ */ ((ScriptTarget11) => {
ScriptTarget11["ES3"] = "ES3";
ScriptTarget11["ES5"] = "ES5";
ScriptTarget11["ES6"] = "ES6";
ScriptTarget11["ES2015"] = "ES2015";
ScriptTarget11["ES2016"] = "ES2016";
ScriptTarget11["ES2017"] = "ES2017";
ScriptTarget11["ES2018"] = "ES2018";
ScriptTarget11["ES2019"] = "ES2019";
ScriptTarget11["ES2020"] = "ES2020";
ScriptTarget11["ES2021"] = "ES2021";
ScriptTarget11["ES2022"] = "ES2022";
ScriptTarget11["ESNext"] = "ESNext";
return ScriptTarget11;
})(ScriptTarget10 || {});
var ClassificationType2 = /* @__PURE__ */ ((ClassificationType3) => {
ClassificationType3[ClassificationType3["comment"] = 1] = "comment";
ClassificationType3[ClassificationType3["identifier"] = 2] = "identifier";
ClassificationType3[ClassificationType3["keyword"] = 3] = "keyword";
ClassificationType3[ClassificationType3["numericLiteral"] = 4] = "numericLiteral";
ClassificationType3[ClassificationType3["operator"] = 5] = "operator";
ClassificationType3[ClassificationType3["stringLiteral"] = 6] = "stringLiteral";
ClassificationType3[ClassificationType3["regularExpressionLiteral"] = 7] = "regularExpressionLiteral";
ClassificationType3[ClassificationType3["whiteSpace"] = 8] = "whiteSpace";
ClassificationType3[ClassificationType3["text"] = 9] = "text";
ClassificationType3[ClassificationType3["punctuation"] = 10] = "punctuation";
ClassificationType3[ClassificationType3["className"] = 11] = "className";
ClassificationType3[ClassificationType3["enumName"] = 12] = "enumName";
ClassificationType3[ClassificationType3["interfaceName"] = 13] = "interfaceName";
ClassificationType3[ClassificationType3["moduleName"] = 14] = "moduleName";
ClassificationType3[ClassificationType3["typeParameterName"] = 15] = "typeParameterName";
ClassificationType3[ClassificationType3["typeAliasName"] = 16] = "typeAliasName";
ClassificationType3[ClassificationType3["parameterName"] = 17] = "parameterName";
ClassificationType3[ClassificationType3["docCommentTagName"] = 18] = "docCommentTagName";
ClassificationType3[ClassificationType3["jsxOpenTagName"] = 19] = "jsxOpenTagName";
ClassificationType3[ClassificationType3["jsxCloseTagName"] = 20] = "jsxCloseTagName";
ClassificationType3[ClassificationType3["jsxSelfClosingTagName"] = 21] = "jsxSelfClosingTagName";
ClassificationType3[ClassificationType3["jsxAttribute"] = 22] = "jsxAttribute";
ClassificationType3[ClassificationType3["jsxText"] = 23] = "jsxText";
ClassificationType3[ClassificationType3["jsxAttributeStringLiteralValue"] = 24] = "jsxAttributeStringLiteralValue";
ClassificationType3[ClassificationType3["bigintLiteral"] = 25] = "bigintLiteral";
return ClassificationType3;
})(ClassificationType2 || {});
// src/server/scriptInfo.ts
var TextStorage = class {
constructor(host, info, initialVersion) {
this.host = host;
this.info = info;
/**
* True if the text is for the file thats open in the editor
*/
this.isOpen = false;
/**
* True if the text present is the text from the file on the disk
*/
this.ownFileText = false;
/**
* True when reloading contents of file from the disk is pending
*/
this.pendingReloadFromDisk = false;
this.version = initialVersion || 0;
}
getVersion() {
return this.svc ? `SVC-${this.version}-${this.svc.getSnapshotVersion()}` : `Text-${this.version}`;
}
hasScriptVersionCache_TestOnly() {
return this.svc !== void 0;
}
resetSourceMapInfo() {
this.info.sourceFileLike = void 0;
this.info.closeSourceMapFileWatcher();
this.info.sourceMapFilePath = void 0;
this.info.declarationInfoPath = void 0;
this.info.sourceInfos = void 0;
this.info.documentPositionMapper = void 0;
}
/** Public for testing */
useText(newText) {
this.svc = void 0;
this.text = newText;
this.textSnapshot = void 0;
this.lineMap = void 0;
this.fileSize = void 0;
this.resetSourceMapInfo();
this.version++;
}
edit(start2, end, newText) {
this.switchToScriptVersionCache().edit(start2, end - start2, newText);
this.ownFileText = false;
this.text = void 0;
this.textSnapshot = void 0;
this.lineMap = void 0;
this.fileSize = void 0;
this.resetSourceMapInfo();
}
/**
* Set the contents as newText
* returns true if text changed
*/
reload(newText) {
Debug.assert(newText !== void 0);
this.pendingReloadFromDisk = false;
if (!this.text && this.svc) {
this.text = getSnapshotText(this.svc.getSnapshot());
}
if (this.text !== newText) {
this.useText(newText);
this.ownFileText = false;
return true;
}
return false;
}
/**
* Reads the contents from tempFile(if supplied) or own file and sets it as contents
* returns true if text changed
*/
reloadWithFileText(tempFileName) {
const { text: newText, fileSize } = tempFileName || !this.info.isDynamicOrHasMixedContent() ? this.getFileTextAndSize(tempFileName) : { text: "", fileSize: void 0 };
const reloaded = this.reload(newText);
this.fileSize = fileSize;
this.ownFileText = !tempFileName || tempFileName === this.info.fileName;
return reloaded;
}
/**
* Schedule reload from the disk if its not already scheduled and its not own text
* returns true when scheduling reload
*/
scheduleReloadIfNeeded() {
return !this.pendingReloadFromDisk && !this.ownFileText ? this.pendingReloadFromDisk = true : false;
}
delayReloadFromFileIntoText() {
this.pendingReloadFromDisk = true;
}
/**
* For telemetry purposes, we would like to be able to report the size of the file.
* However, we do not want telemetry to require extra file I/O so we report a size
* that may be stale (e.g. may not reflect change made on disk since the last reload).
* NB: Will read from disk if the file contents have never been loaded because
* telemetry falsely indicating size 0 would be counter-productive.
*/
getTelemetryFileSize() {
return !!this.fileSize ? this.fileSize : !!this.text ? this.text.length : !!this.svc ? this.svc.getSnapshot().getLength() : this.getSnapshot().getLength();
}
getSnapshot() {
var _a;
return ((_a = this.tryUseScriptVersionCache()) == null ? void 0 : _a.getSnapshot()) || (this.textSnapshot ?? (this.textSnapshot = ScriptSnapshot.fromString(Debug.checkDefined(this.text))));
}
getAbsolutePositionAndLineText(oneBasedLine) {
const svc = this.tryUseScriptVersionCache();
if (svc)
return svc.getAbsolutePositionAndLineText(oneBasedLine);
const lineMap = this.getLineMap();
return oneBasedLine <= lineMap.length ? {
absolutePosition: lineMap[oneBasedLine - 1],
lineText: this.text.substring(lineMap[oneBasedLine - 1], lineMap[oneBasedLine])
} : {
absolutePosition: this.text.length,
lineText: void 0
};
}
/**
* @param line 0 based index
*/
lineToTextSpan(line) {
const svc = this.tryUseScriptVersionCache();
if (svc)
return svc.lineToTextSpan(line);
const lineMap = this.getLineMap();
const start2 = lineMap[line];
const end = line + 1 < lineMap.length ? lineMap[line + 1] : this.text.length;
return createTextSpanFromBounds(start2, end);
}
/**
* @param line 1 based index
* @param offset 1 based index
*/
lineOffsetToPosition(line, offset, allowEdits) {
const svc = this.tryUseScriptVersionCache();
return svc ? svc.lineOffsetToPosition(line, offset) : computePositionOfLineAndCharacter(this.getLineMap(), line - 1, offset - 1, this.text, allowEdits);
}
positionToLineOffset(position) {
const svc = this.tryUseScriptVersionCache();
if (svc)
return svc.positionToLineOffset(position);
const { line, character } = computeLineAndCharacterOfPosition(this.getLineMap(), position);
return { line: line + 1, offset: character + 1 };
}
getFileTextAndSize(tempFileName) {
let text;
const fileName = tempFileName || this.info.fileName;
const getText = () => text === void 0 ? text = this.host.readFile(fileName) || "" : text;
if (!hasTSFileExtension(this.info.fileName)) {
const fileSize = this.host.getFileSize ? this.host.getFileSize(fileName) : getText().length;
if (fileSize > maxFileSize) {
Debug.assert(!!this.info.containingProjects.length);
const service = this.info.containingProjects[0].projectService;
service.logger.info(`Skipped loading contents of large file ${fileName} for info ${this.info.fileName}: fileSize: ${fileSize}`);
this.info.containingProjects[0].projectService.sendLargeFileReferencedEvent(fileName, fileSize);
return { text: "", fileSize };
}
}
return { text: getText() };
}
/** @internal */
switchToScriptVersionCache() {
if (!this.svc || this.pendingReloadFromDisk) {
this.svc = ScriptVersionCache.fromString(this.getOrLoadText());
this.textSnapshot = void 0;
this.version++;
}
return this.svc;
}
tryUseScriptVersionCache() {
if (!this.svc || this.pendingReloadFromDisk) {
this.getOrLoadText();
}
if (this.isOpen) {
if (!this.svc && !this.textSnapshot) {
this.svc = ScriptVersionCache.fromString(Debug.checkDefined(this.text));
this.textSnapshot = void 0;
}
return this.svc;
}
return this.svc;
}
getOrLoadText() {
if (this.text === void 0 || this.pendingReloadFromDisk) {
Debug.assert(!this.svc || this.pendingReloadFromDisk, "ScriptVersionCache should not be set when reloading from disk");
this.reloadWithFileText();
}
return this.text;
}
getLineMap() {
Debug.assert(!this.svc, "ScriptVersionCache should not be set");
return this.lineMap || (this.lineMap = computeLineStarts(Debug.checkDefined(this.text)));
}
getLineInfo() {
const svc = this.tryUseScriptVersionCache();
if (svc) {
return {
getLineCount: () => svc.getLineCount(),
getLineText: (line) => svc.getAbsolutePositionAndLineText(line + 1).lineText
};
}
const lineMap = this.getLineMap();
return getLineInfo(this.text, lineMap);
}
};
function isDynamicFileName(fileName) {
return fileName[0] === "^" || (stringContains(fileName, "walkThroughSnippet:/") || stringContains(fileName, "untitled:/")) && getBaseFileName(fileName)[0] === "^" || stringContains(fileName, ":^") && !stringContains(fileName, directorySeparator);
}
var ScriptInfo = class {
constructor(host, fileName, scriptKind, hasMixedContent, path, initialVersion) {
this.host = host;
this.fileName = fileName;
this.scriptKind = scriptKind;
this.hasMixedContent = hasMixedContent;
this.path = path;
/**
* All projects that include this file
*/
this.containingProjects = [];
this.isDynamic = isDynamicFileName(fileName);
this.textStorage = new TextStorage(host, this, initialVersion);
if (hasMixedContent || this.isDynamic) {
this.realpath = this.path;
}
this.scriptKind = scriptKind ? scriptKind : getScriptKindFromFileName(fileName);
}
/** @internal */
isDynamicOrHasMixedContent() {
return this.hasMixedContent || this.isDynamic;
}
isScriptOpen() {
return this.textStorage.isOpen;
}
open(newText) {
this.textStorage.isOpen = true;
if (newText !== void 0 && this.textStorage.reload(newText)) {
this.markContainingProjectsAsDirty();
}
}
close(fileExists = true) {
this.textStorage.isOpen = false;
if (fileExists && this.textStorage.scheduleReloadIfNeeded()) {
this.markContainingProjectsAsDirty();
}
}
getSnapshot() {
return this.textStorage.getSnapshot();
}
ensureRealPath() {
if (this.realpath === void 0) {
this.realpath = this.path;
if (this.host.realpath) {
Debug.assert(!!this.containingProjects.length);
const project = this.containingProjects[0];
const realpath = this.host.realpath(this.path);
if (realpath) {
this.realpath = project.toPath(realpath);
if (this.realpath !== this.path) {
project.projectService.realpathToScriptInfos.add(this.realpath, this);
}
}
}
}
}
/** @internal */
getRealpathIfDifferent() {
return this.realpath && this.realpath !== this.path ? this.realpath : void 0;
}
/**
* @internal
* Does not compute realpath; uses precomputed result. Use `ensureRealPath`
* first if a definite result is needed.
*/
isSymlink() {
return this.realpath && this.realpath !== this.path;
}
getFormatCodeSettings() {
return this.formatSettings;
}
getPreferences() {
return this.preferences;
}
attachToProject(project) {
const isNew = !this.isAttached(project);
if (isNew) {
this.containingProjects.push(project);
if (!project.getCompilerOptions().preserveSymlinks) {
this.ensureRealPath();
}
project.onFileAddedOrRemoved(this.isSymlink());
}
return isNew;
}
isAttached(project) {
switch (this.containingProjects.length) {
case 0:
return false;
case 1:
return this.containingProjects[0] === project;
case 2:
return this.containingProjects[0] === project || this.containingProjects[1] === project;
default:
return contains(this.containingProjects, project);
}
}
detachFromProject(project) {
switch (this.containingProjects.length) {
case 0:
return;
case 1:
if (this.containingProjects[0] === project) {
project.onFileAddedOrRemoved(this.isSymlink());
this.containingProjects.pop();
}
break;
case 2:
if (this.containingProjects[0] === project) {
project.onFileAddedOrRemoved(this.isSymlink());
this.containingProjects[0] = this.containingProjects.pop();
} else if (this.containingProjects[1] === project) {
project.onFileAddedOrRemoved(this.isSymlink());
this.containingProjects.pop();
}
break;
default:
if (unorderedRemoveItem(this.containingProjects, project)) {
project.onFileAddedOrRemoved(this.isSymlink());
}
break;
}
}
detachAllProjects() {
for (const p of this.containingProjects) {
if (isConfiguredProject(p)) {
p.getCachedDirectoryStructureHost().addOrDeleteFile(this.fileName, this.path, 2 /* Deleted */);
}
const existingRoot = p.getRootFilesMap().get(this.path);
p.removeFile(
this,
/*fileExists*/
false,
/*detachFromProject*/
false
);
p.onFileAddedOrRemoved(this.isSymlink());
if (existingRoot && !isInferredProject(p)) {
p.addMissingFileRoot(existingRoot.fileName);
}
}
clear(this.containingProjects);
}
getDefaultProject() {
switch (this.containingProjects.length) {
case 0:
return Errors.ThrowNoProject();
case 1:
return ensurePrimaryProjectKind(this.containingProjects[0]);
default:
let firstExternalProject;
let firstConfiguredProject;
let firstInferredProject;
let firstNonSourceOfProjectReferenceRedirect;
let defaultConfiguredProject;
for (let index = 0; index < this.containingProjects.length; index++) {
const project = this.containingProjects[index];
if (isConfiguredProject(project)) {
if (!project.isSourceOfProjectReferenceRedirect(this.fileName)) {
if (defaultConfiguredProject === void 0 && index !== this.containingProjects.length - 1) {
defaultConfiguredProject = project.projectService.findDefaultConfiguredProject(this) || false;
}
if (defaultConfiguredProject === project)
return project;
if (!firstNonSourceOfProjectReferenceRedirect)
firstNonSourceOfProjectReferenceRedirect = project;
}
if (!firstConfiguredProject)
firstConfiguredProject = project;
} else if (!firstExternalProject && isExternalProject(project)) {
firstExternalProject = project;
} else if (!firstInferredProject && isInferredProject(project)) {
firstInferredProject = project;
}
}
return ensurePrimaryProjectKind(defaultConfiguredProject || firstNonSourceOfProjectReferenceRedirect || firstConfiguredProject || firstExternalProject || firstInferredProject);
}
}
registerFileUpdate() {
for (const p of this.containingProjects) {
p.registerFileUpdate(this.path);
}
}
setOptions(formatSettings, preferences) {
if (formatSettings) {
if (!this.formatSettings) {
this.formatSettings = getDefaultFormatCodeSettings(this.host.newLine);
assign(this.formatSettings, formatSettings);
} else {
this.formatSettings = { ...this.formatSettings, ...formatSettings };
}
}
if (preferences) {
if (!this.preferences) {
this.preferences = emptyOptions;
}
this.preferences = { ...this.preferences, ...preferences };
}
}
getLatestVersion() {
this.textStorage.getSnapshot();
return this.textStorage.getVersion();
}
saveTo(fileName) {
this.host.writeFile(fileName, getSnapshotText(this.textStorage.getSnapshot()));
}
/** @internal */
delayReloadNonMixedContentFile() {
Debug.assert(!this.isDynamicOrHasMixedContent());
this.textStorage.delayReloadFromFileIntoText();
this.markContainingProjectsAsDirty();
}
reloadFromFile(tempFileName) {
if (this.textStorage.reloadWithFileText(tempFileName)) {
this.markContainingProjectsAsDirty();
return true;
}
return false;
}
editContent(start2, end, newText) {
this.textStorage.edit(start2, end, newText);
this.markContainingProjectsAsDirty();
}
markContainingProjectsAsDirty() {
for (const p of this.containingProjects) {
p.markFileAsDirty(this.path);
}
}
isOrphan() {
return !forEach(this.containingProjects, (p) => !p.isOrphan());
}
/** @internal */
isContainedByBackgroundProject() {
return some(
this.containingProjects,
(p) => p.projectKind === 3 /* AutoImportProvider */ || p.projectKind === 4 /* Auxiliary */
);
}
/**
* @param line 1 based index
*/
lineToTextSpan(line) {
return this.textStorage.lineToTextSpan(line);
}
// eslint-disable-line @typescript-eslint/unified-signatures
lineOffsetToPosition(line, offset, allowEdits) {
return this.textStorage.lineOffsetToPosition(line, offset, allowEdits);
}
positionToLineOffset(position) {
failIfInvalidPosition(position);
const location = this.textStorage.positionToLineOffset(position);
failIfInvalidLocation(location);
return location;
}
isJavaScript() {
return this.scriptKind === 1 /* JS */ || this.scriptKind === 2 /* JSX */;
}
/** @internal */
closeSourceMapFileWatcher() {
if (this.sourceMapFilePath && !isString(this.sourceMapFilePath)) {
closeFileWatcherOf(this.sourceMapFilePath);
this.sourceMapFilePath = void 0;
}
}
};
function ensurePrimaryProjectKind(project) {
if (!project || project.projectKind === 3 /* AutoImportProvider */ || project.projectKind === 4 /* Auxiliary */) {
return Errors.ThrowNoProject();
}
return project;
}
function failIfInvalidPosition(position) {
Debug.assert(typeof position === "number", `Expected position ${position} to be a number.`);
Debug.assert(position >= 0, `Expected position to be non-negative.`);
}
function failIfInvalidLocation(location) {
Debug.assert(typeof location.line === "number", `Expected line ${location.line} to be a number.`);
Debug.assert(typeof location.offset === "number", `Expected offset ${location.offset} to be a number.`);
Debug.assert(location.line > 0, `Expected line to be non-${location.line === 0 ? "zero" : "negative"}`);
Debug.assert(location.offset > 0, `Expected offset to be non-${location.offset === 0 ? "zero" : "negative"}`);
}
// src/server/typingsCache.ts
var nullTypingsInstaller = {
isKnownTypesPackageName: returnFalse,
// Should never be called because we never provide a types registry.
installPackage: notImplemented,
enqueueInstallTypingsRequest: noop,
attach: noop,
onProjectClosed: noop,
globalTypingsCacheLocation: void 0
// TODO: GH#18217
};
function setIsEqualTo(arr1, arr2) {
if (arr1 === arr2) {
return true;
}
if ((arr1 || emptyArray2).length === 0 && (arr2 || emptyArray2).length === 0) {
return true;
}
const set = /* @__PURE__ */ new Map();
let unique = 0;
for (const v of arr1) {
if (set.get(v) !== true) {
set.set(v, true);
unique++;
}
}
for (const v of arr2) {
const isSet = set.get(v);
if (isSet === void 0) {
return false;
}
if (isSet === true) {
set.set(v, false);
unique--;
}
}
return unique === 0;
}
function typeAcquisitionChanged(opt1, opt2) {
return opt1.enable !== opt2.enable || !setIsEqualTo(opt1.include, opt2.include) || !setIsEqualTo(opt1.exclude, opt2.exclude);
}
function compilerOptionsChanged(opt1, opt2) {
return getAllowJSCompilerOption(opt1) !== getAllowJSCompilerOption(opt2);
}
function unresolvedImportsChanged(imports1, imports2) {
if (imports1 === imports2) {
return false;
}
return !arrayIsEqualTo(imports1, imports2);
}
var TypingsCache = class {
constructor(installer) {
this.installer = installer;
this.perProjectCache = /* @__PURE__ */ new Map();
}
isKnownTypesPackageName(name) {
return this.installer.isKnownTypesPackageName(name);
}
installPackage(options) {
return this.installer.installPackage(options);
}
enqueueInstallTypingsForProject(project, unresolvedImports, forceRefresh) {
const typeAcquisition = project.getTypeAcquisition();
if (!typeAcquisition || !typeAcquisition.enable) {
return;
}
const entry = this.perProjectCache.get(project.getProjectName());
if (forceRefresh || !entry || typeAcquisitionChanged(typeAcquisition, entry.typeAcquisition) || compilerOptionsChanged(project.getCompilationSettings(), entry.compilerOptions) || unresolvedImportsChanged(unresolvedImports, entry.unresolvedImports)) {
this.perProjectCache.set(project.getProjectName(), {
compilerOptions: project.getCompilationSettings(),
typeAcquisition,
typings: entry ? entry.typings : emptyArray2,
unresolvedImports,
poisoned: true
});
this.installer.enqueueInstallTypingsRequest(project, typeAcquisition, unresolvedImports);
}
}
updateTypingsForProject(projectName, compilerOptions, typeAcquisition, unresolvedImports, newTypings) {
const typings = sort(newTypings);
this.perProjectCache.set(projectName, {
compilerOptions,
typeAcquisition,
typings,
unresolvedImports,
poisoned: false
});
return !typeAcquisition || !typeAcquisition.enable ? emptyArray2 : typings;
}
onProjectClosed(project) {
this.perProjectCache.delete(project.getProjectName());
this.installer.onProjectClosed(project);
}
};
// src/server/project.ts
var ProjectKind = /* @__PURE__ */ ((ProjectKind2) => {
ProjectKind2[ProjectKind2["Inferred"] = 0] = "Inferred";
ProjectKind2[ProjectKind2["Configured"] = 1] = "Configured";
ProjectKind2[ProjectKind2["External"] = 2] = "External";
ProjectKind2[ProjectKind2["AutoImportProvider"] = 3] = "AutoImportProvider";
ProjectKind2[ProjectKind2["Auxiliary"] = 4] = "Auxiliary";
return ProjectKind2;
})(ProjectKind || {});
function countEachFileTypes(infos, includeSizes = false) {
const result = {
js: 0,
jsSize: 0,
jsx: 0,
jsxSize: 0,
ts: 0,
tsSize: 0,
tsx: 0,
tsxSize: 0,
dts: 0,
dtsSize: 0,
deferred: 0,
deferredSize: 0
};
for (const info of infos) {
const fileSize = includeSizes ? info.textStorage.getTelemetryFileSize() : 0;
switch (info.scriptKind) {
case 1 /* JS */:
result.js += 1;
result.jsSize += fileSize;
break;
case 2 /* JSX */:
result.jsx += 1;
result.jsxSize += fileSize;
break;
case 3 /* TS */:
if (isDeclarationFileName(info.fileName)) {
result.dts += 1;
result.dtsSize += fileSize;
} else {
result.ts += 1;
result.tsSize += fileSize;
}
break;
case 4 /* TSX */:
result.tsx += 1;
result.tsxSize += fileSize;
break;
case 7 /* Deferred */:
result.deferred += 1;
result.deferredSize += fileSize;
break;
}
}
return result;
}
function hasOneOrMoreJsAndNoTsFiles(project) {
const counts2 = countEachFileTypes(project.getScriptInfos());
return counts2.js > 0 && counts2.ts === 0 && counts2.tsx === 0;
}
function allRootFilesAreJsOrDts(project) {
const counts2 = countEachFileTypes(project.getRootScriptInfos());
return counts2.ts === 0 && counts2.tsx === 0;
}
function allFilesAreJsOrDts(project) {
const counts2 = countEachFileTypes(project.getScriptInfos());
return counts2.ts === 0 && counts2.tsx === 0;
}
function hasNoTypeScriptSource(fileNames) {
return !fileNames.some((fileName) => fileExtensionIs(fileName, ".ts" /* Ts */) && !isDeclarationFileName(fileName) || fileExtensionIs(fileName, ".tsx" /* Tsx */));
}
function isGeneratedFileWatcher(watch) {
return watch.generatedFilePath !== void 0;
}
var Project3 = class {
/** @internal */
constructor(projectName, projectKind, projectService, documentRegistry, hasExplicitListOfFiles, lastFileExceededProgramSize, compilerOptions, compileOnSaveEnabled, watchOptions, directoryStructureHost, currentDirectory) {
this.projectKind = projectKind;
this.projectService = projectService;
this.documentRegistry = documentRegistry;
this.compilerOptions = compilerOptions;
this.compileOnSaveEnabled = compileOnSaveEnabled;
this.watchOptions = watchOptions;
this.rootFiles = [];
this.rootFilesMap = /* @__PURE__ */ new Map();
/** @internal */
this.plugins = [];
/**
* This is map from files to unresolved imports in it
* Maop does not contain entries for files that do not have unresolved imports
* This helps in containing the set of files to invalidate
*
* @internal
*/
this.cachedUnresolvedImportsPerFile = /* @__PURE__ */ new Map();
/** @internal */
this.hasAddedorRemovedFiles = false;
/** @internal */
this.hasAddedOrRemovedSymlinks = false;
/**
* Last version that was reported.
*/
this.lastReportedVersion = 0;
/**
* Current project's program version. (incremented everytime new program is created that is not complete reuse from the old one)
* This property is changed in 'updateGraph' based on the set of files in program
*/
this.projectProgramVersion = 0;
/**
* Current version of the project state. It is changed when:
* - new root file was added/removed
* - edit happen in some file that is currently included in the project.
* This property is different from projectStructureVersion since in most cases edits don't affect set of files in the project
*/
this.projectStateVersion = 0;
this.isInitialLoadPending = returnFalse;
/** @internal */
this.dirty = false;
/** @internal */
this.typingFiles = emptyArray2;
/** @internal */
this.moduleSpecifierCache = createModuleSpecifierCache(this);
/** @internal */
this.createHash = maybeBind(this.projectService.host, this.projectService.host.createHash);
/** @internal */
this.globalCacheResolutionModuleName = ts_JsTyping_exports.nonRelativeModuleNameForTypingCache;
this.projectName = projectName;
this.directoryStructureHost = directoryStructureHost;
this.currentDirectory = this.projectService.getNormalizedAbsolutePath(currentDirectory);
this.getCanonicalFileName = this.projectService.toCanonicalFileName;
this.cancellationToken = new ThrottledCancellationToken(this.projectService.cancellationToken, this.projectService.throttleWaitMilliseconds);
if (!this.compilerOptions) {
this.compilerOptions = getDefaultCompilerOptions2();
this.compilerOptions.allowNonTsExtensions = true;
this.compilerOptions.allowJs = true;
} else if (hasExplicitListOfFiles || getAllowJSCompilerOption(this.compilerOptions) || this.projectService.hasDeferredExtension()) {
this.compilerOptions.allowNonTsExtensions = true;
}
switch (projectService.serverMode) {
case 0 /* Semantic */:
this.languageServiceEnabled = true;
break;
case 1 /* PartialSemantic */:
this.languageServiceEnabled = true;
this.compilerOptions.noResolve = true;
this.compilerOptions.types = [];
break;
case 2 /* Syntactic */:
this.languageServiceEnabled = false;
this.compilerOptions.noResolve = true;
this.compilerOptions.types = [];
break;
default:
Debug.assertNever(projectService.serverMode);
}
this.setInternalCompilerOptionsForEmittingJsFiles();
const host = this.projectService.host;
if (this.projectService.logger.loggingEnabled()) {
this.trace = (s) => this.writeLog(s);
} else if (host.trace) {
this.trace = (s) => host.trace(s);
}
this.realpath = maybeBind(host, host.realpath);
this.resolutionCache = createResolutionCache(
this,
this.currentDirectory,
/*logChangesWhenResolvingModule*/
true
);
this.languageService = createLanguageService(this, this.documentRegistry, this.projectService.serverMode);
if (lastFileExceededProgramSize) {
this.disableLanguageService(lastFileExceededProgramSize);
}
this.markAsDirty();
if (projectKind !== 3 /* AutoImportProvider */) {
this.projectService.pendingEnsureProjectForOpenFiles = true;
}
}
/** @internal */
getResolvedProjectReferenceToRedirect(_fileName) {
return void 0;
}
isNonTsProject() {
updateProjectIfDirty(this);
return allFilesAreJsOrDts(this);
}
isJsOnlyProject() {
updateProjectIfDirty(this);
return hasOneOrMoreJsAndNoTsFiles(this);
}
static resolveModule(moduleName, initialDir, host, log) {
return Project3.importServicePluginSync({ name: moduleName }, [initialDir], host, log).resolvedModule;
}
/** @internal */
static importServicePluginSync(pluginConfigEntry, searchPaths, host, log) {
Debug.assertIsDefined(host.require);
let errorLogs;
let resolvedModule;
for (const initialDir of searchPaths) {
const resolvedPath = normalizeSlashes(host.resolvePath(combinePaths(initialDir, "node_modules")));
log(`Loading ${pluginConfigEntry.name} from ${initialDir} (resolved to ${resolvedPath})`);
const result = host.require(resolvedPath, pluginConfigEntry.name);
if (!result.error) {
resolvedModule = result.module;
break;
}
const err = result.error.stack || result.error.message || JSON.stringify(result.error);
(errorLogs ?? (errorLogs = [])).push(`Failed to load module '${pluginConfigEntry.name}' from ${resolvedPath}: ${err}`);
}
return { pluginConfigEntry, resolvedModule, errorLogs };
}
/** @internal */
static async importServicePluginAsync(pluginConfigEntry, searchPaths, host, log) {
Debug.assertIsDefined(host.importPlugin);
let errorLogs;
let resolvedModule;
for (const initialDir of searchPaths) {
const resolvedPath = combinePaths(initialDir, "node_modules");
log(`Dynamically importing ${pluginConfigEntry.name} from ${initialDir} (resolved to ${resolvedPath})`);
let result;
try {
result = await host.importPlugin(resolvedPath, pluginConfigEntry.name);
} catch (e) {
result = { module: void 0, error: e };
}
if (!result.error) {
resolvedModule = result.module;
break;
}
const err = result.error.stack || result.error.message || JSON.stringify(result.error);
(errorLogs ?? (errorLogs = [])).push(`Failed to dynamically import module '${pluginConfigEntry.name}' from ${resolvedPath}: ${err}`);
}
return { pluginConfigEntry, resolvedModule, errorLogs };
}
isKnownTypesPackageName(name) {
return this.typingsCache.isKnownTypesPackageName(name);
}
installPackage(options) {
return this.typingsCache.installPackage({ ...options, projectName: this.projectName, projectRootPath: this.toPath(this.currentDirectory) });
}
/** @internal */
getGlobalTypingsCacheLocation() {
return this.getGlobalCache();
}
get typingsCache() {
return this.projectService.typingsCache;
}
/** @internal */
getSymlinkCache() {
if (!this.symlinks) {
this.symlinks = createSymlinkCache(this.getCurrentDirectory(), this.getCanonicalFileName);
}
if (this.program && !this.symlinks.hasProcessedResolutions()) {
this.symlinks.setSymlinksFromResolutions(
this.program.getSourceFiles(),
this.program.getAutomaticTypeDirectiveResolutions()
);
}
return this.symlinks;
}
// Method of LanguageServiceHost
getCompilationSettings() {
return this.compilerOptions;
}
// Method to support public API
getCompilerOptions() {
return this.getCompilationSettings();
}
getNewLine() {
return this.projectService.host.newLine;
}
getProjectVersion() {
return this.projectStateVersion.toString();
}
getProjectReferences() {
return void 0;
}
getScriptFileNames() {
if (!this.rootFiles) {
return emptyArray;
}
let result;
this.rootFilesMap.forEach((value) => {
if (this.languageServiceEnabled || value.info && value.info.isScriptOpen()) {
(result || (result = [])).push(value.fileName);
}
});
return addRange(result, this.typingFiles) || emptyArray;
}
getOrCreateScriptInfoAndAttachToProject(fileName) {
const scriptInfo = this.projectService.getOrCreateScriptInfoNotOpenedByClient(fileName, this.currentDirectory, this.directoryStructureHost);
if (scriptInfo) {
const existingValue = this.rootFilesMap.get(scriptInfo.path);
if (existingValue && existingValue.info !== scriptInfo) {
this.rootFiles.push(scriptInfo);
existingValue.info = scriptInfo;
}
scriptInfo.attachToProject(this);
}
return scriptInfo;
}
getScriptKind(fileName) {
const info = this.getOrCreateScriptInfoAndAttachToProject(fileName);
return info && info.scriptKind;
}
getScriptVersion(filename) {
const info = this.projectService.getOrCreateScriptInfoNotOpenedByClient(filename, this.currentDirectory, this.directoryStructureHost);
return info && info.getLatestVersion();
}
getScriptSnapshot(filename) {
const scriptInfo = this.getOrCreateScriptInfoAndAttachToProject(filename);
if (scriptInfo) {
return scriptInfo.getSnapshot();
}
}
getCancellationToken() {
return this.cancellationToken;
}
getCurrentDirectory() {
return this.currentDirectory;
}
getDefaultLibFileName() {
const nodeModuleBinDir = getDirectoryPath(normalizePath(this.projectService.getExecutingFilePath()));
return combinePaths(nodeModuleBinDir, getDefaultLibFileName(this.compilerOptions));
}
useCaseSensitiveFileNames() {
return this.projectService.host.useCaseSensitiveFileNames;
}
readDirectory(path, extensions, exclude, include, depth) {
return this.directoryStructureHost.readDirectory(path, extensions, exclude, include, depth);
}
readFile(fileName) {
return this.projectService.host.readFile(fileName);
}
writeFile(fileName, content) {
return this.projectService.host.writeFile(fileName, content);
}
fileExists(file) {
const path = this.toPath(file);
return !this.isWatchedMissingFile(path) && this.directoryStructureHost.fileExists(file);
}
/** @internal */
resolveModuleNameLiterals(moduleLiterals, containingFile, redirectedReference, options, containingSourceFile, reusedNames) {
return this.resolutionCache.resolveModuleNameLiterals(moduleLiterals, containingFile, redirectedReference, options, containingSourceFile, reusedNames);
}
getModuleResolutionCache() {
return this.resolutionCache.getModuleResolutionCache();
}
/** @internal */
resolveTypeReferenceDirectiveReferences(typeDirectiveReferences, containingFile, redirectedReference, options, containingSourceFile, reusedNames) {
return this.resolutionCache.resolveTypeReferenceDirectiveReferences(
typeDirectiveReferences,
containingFile,
redirectedReference,
options,
containingSourceFile,
reusedNames
);
}
/** @internal */
resolveLibrary(libraryName, resolveFrom, options, libFileName) {
return this.resolutionCache.resolveLibrary(libraryName, resolveFrom, options, libFileName);
}
directoryExists(path) {
return this.directoryStructureHost.directoryExists(path);
}
getDirectories(path) {
return this.directoryStructureHost.getDirectories(path);
}
/** @internal */
getCachedDirectoryStructureHost() {
return void 0;
}
/** @internal */
toPath(fileName) {
return toPath(fileName, this.currentDirectory, this.projectService.toCanonicalFileName);
}
/** @internal */
watchDirectoryOfFailedLookupLocation(directory, cb, flags) {
return this.projectService.watchFactory.watchDirectory(
directory,
cb,
flags,
this.projectService.getWatchOptions(this),
WatchType.FailedLookupLocations,
this
);
}
/** @internal */
watchAffectingFileLocation(file, cb) {
return this.projectService.watchFactory.watchFile(
file,
cb,
2e3 /* High */,
this.projectService.getWatchOptions(this),
WatchType.AffectingFileLocation,
this
);
}
/** @internal */
clearInvalidateResolutionOfFailedLookupTimer() {
return this.projectService.throttledOperations.cancel(`${this.getProjectName()}FailedLookupInvalidation`);
}
/** @internal */
scheduleInvalidateResolutionsOfFailedLookupLocations() {
this.projectService.throttledOperations.schedule(
`${this.getProjectName()}FailedLookupInvalidation`,
/*delay*/
1e3,
() => {
if (this.resolutionCache.invalidateResolutionsOfFailedLookupLocations()) {
this.projectService.delayUpdateProjectGraphAndEnsureProjectStructureForOpenFiles(this);
}
}
);
}
/** @internal */
invalidateResolutionsOfFailedLookupLocations() {
if (this.clearInvalidateResolutionOfFailedLookupTimer() && this.resolutionCache.invalidateResolutionsOfFailedLookupLocations()) {
this.markAsDirty();
this.projectService.delayEnsureProjectForOpenFiles();
}
}
/** @internal */
onInvalidatedResolution() {
this.projectService.delayUpdateProjectGraphAndEnsureProjectStructureForOpenFiles(this);
}
/** @internal */
watchTypeRootsDirectory(directory, cb, flags) {
return this.projectService.watchFactory.watchDirectory(
directory,
cb,
flags,
this.projectService.getWatchOptions(this),
WatchType.TypeRoots,
this
);
}
/** @internal */
hasChangedAutomaticTypeDirectiveNames() {
return this.resolutionCache.hasChangedAutomaticTypeDirectiveNames();
}
/** @internal */
onChangedAutomaticTypeDirectiveNames() {
this.projectService.delayUpdateProjectGraphAndEnsureProjectStructureForOpenFiles(this);
}
/** @internal */
getGlobalCache() {
return this.getTypeAcquisition().enable ? this.projectService.typingsInstaller.globalTypingsCacheLocation : void 0;
}
/** @internal */
fileIsOpen(filePath) {
return this.projectService.openFiles.has(filePath);
}
/** @internal */
writeLog(s) {
this.projectService.logger.info(s);
}
log(s) {
this.writeLog(s);
}
error(s) {
this.projectService.logger.msg(s, "Err" /* Err */);
}
setInternalCompilerOptionsForEmittingJsFiles() {
if (this.projectKind === 0 /* Inferred */ || this.projectKind === 2 /* External */) {
this.compilerOptions.noEmitForJsFiles = true;
}
}
/**
* Get the errors that dont have any file name associated
*/
getGlobalProjectErrors() {
return filter(this.projectErrors, (diagnostic) => !diagnostic.file) || emptyArray2;
}
/**
* Get all the project errors
*/
getAllProjectErrors() {
return this.projectErrors || emptyArray2;
}
setProjectErrors(projectErrors) {
this.projectErrors = projectErrors;
}
getLanguageService(ensureSynchronized = true) {
if (ensureSynchronized) {
updateProjectIfDirty(this);
}
return this.languageService;
}
/** @internal */
getSourceMapper() {
return this.getLanguageService().getSourceMapper();
}
/** @internal */
clearSourceMapperCache() {
this.languageService.clearSourceMapperCache();
}
/** @internal */
getDocumentPositionMapper(generatedFileName, sourceFileName) {
return this.projectService.getDocumentPositionMapper(this, generatedFileName, sourceFileName);
}
/** @internal */
getSourceFileLike(fileName) {
return this.projectService.getSourceFileLike(fileName, this);
}
/** @internal */
shouldEmitFile(scriptInfo) {
return scriptInfo && !scriptInfo.isDynamicOrHasMixedContent() && !this.program.isSourceOfProjectReferenceRedirect(scriptInfo.path);
}
getCompileOnSaveAffectedFileList(scriptInfo) {
if (!this.languageServiceEnabled) {
return [];
}
updateProjectIfDirty(this);
this.builderState = BuilderState.create(
this.program,
this.builderState,
/*disableUseFileVersionAsSignature*/
true
);
return mapDefined(
BuilderState.getFilesAffectedBy(
this.builderState,
this.program,
scriptInfo.path,
this.cancellationToken,
this.projectService.host
),
(sourceFile) => this.shouldEmitFile(this.projectService.getScriptInfoForPath(sourceFile.path)) ? sourceFile.fileName : void 0
);
}
/**
* Returns true if emit was conducted
*/
emitFile(scriptInfo, writeFile2) {
if (!this.languageServiceEnabled || !this.shouldEmitFile(scriptInfo)) {
return { emitSkipped: true, diagnostics: emptyArray2 };
}
const { emitSkipped, diagnostics, outputFiles } = this.getLanguageService().getEmitOutput(scriptInfo.fileName);
if (!emitSkipped) {
for (const outputFile of outputFiles) {
const outputFileAbsoluteFileName = getNormalizedAbsolutePath(outputFile.name, this.currentDirectory);
writeFile2(outputFileAbsoluteFileName, outputFile.text, outputFile.writeByteOrderMark);
}
if (this.builderState && getEmitDeclarations(this.compilerOptions)) {
const dtsFiles = outputFiles.filter((f) => isDeclarationFileName(f.name));
if (dtsFiles.length === 1) {
const sourceFile = this.program.getSourceFile(scriptInfo.fileName);
const signature = this.projectService.host.createHash ? this.projectService.host.createHash(dtsFiles[0].text) : generateDjb2Hash(dtsFiles[0].text);
BuilderState.updateSignatureOfFile(this.builderState, signature, sourceFile.resolvedPath);
}
}
}
return { emitSkipped, diagnostics };
}
enableLanguageService() {
if (this.languageServiceEnabled || this.projectService.serverMode === 2 /* Syntactic */) {
return;
}
this.languageServiceEnabled = true;
this.lastFileExceededProgramSize = void 0;
this.projectService.onUpdateLanguageServiceStateForProject(
this,
/*languageServiceEnabled*/
true
);
}
disableLanguageService(lastFileExceededProgramSize) {
if (!this.languageServiceEnabled) {
return;
}
Debug.assert(this.projectService.serverMode !== 2 /* Syntactic */);
this.languageService.cleanupSemanticCache();
this.languageServiceEnabled = false;
this.lastFileExceededProgramSize = lastFileExceededProgramSize;
this.builderState = void 0;
if (this.autoImportProviderHost) {
this.autoImportProviderHost.close();
}
this.autoImportProviderHost = void 0;
this.resolutionCache.closeTypeRootsWatch();
this.clearGeneratedFileWatch();
this.projectService.onUpdateLanguageServiceStateForProject(
this,
/*languageServiceEnabled*/
false
);
}
getProjectName() {
return this.projectName;
}
removeLocalTypingsFromTypeAcquisition(newTypeAcquisition) {
if (!newTypeAcquisition || !newTypeAcquisition.include) {
return newTypeAcquisition;
}
return { ...newTypeAcquisition, include: this.removeExistingTypings(newTypeAcquisition.include) };
}
getExternalFiles() {
return sort(flatMap(this.plugins, (plugin) => {
if (typeof plugin.module.getExternalFiles !== "function")
return;
try {
return plugin.module.getExternalFiles(this);
} catch (e) {
this.projectService.logger.info(`A plugin threw an exception in getExternalFiles: ${e}`);
if (e.stack) {
this.projectService.logger.info(e.stack);
}
}
}));
}
getSourceFile(path) {
if (!this.program) {
return void 0;
}
return this.program.getSourceFileByPath(path);
}
/** @internal */
getSourceFileOrConfigFile(path) {
const options = this.program.getCompilerOptions();
return path === options.configFilePath ? options.configFile : this.getSourceFile(path);
}
close() {
this.projectService.typingsCache.onProjectClosed(this);
this.closeWatchingTypingLocations();
if (this.program) {
for (const f of this.program.getSourceFiles()) {
this.detachScriptInfoIfNotRoot(f.fileName);
}
this.program.forEachResolvedProjectReference((ref) => this.detachScriptInfoFromProject(ref.sourceFile.fileName));
}
forEach(this.externalFiles, (externalFile) => this.detachScriptInfoIfNotRoot(externalFile));
for (const root of this.rootFiles) {
root.detachFromProject(this);
}
this.projectService.pendingEnsureProjectForOpenFiles = true;
this.rootFiles = void 0;
this.rootFilesMap = void 0;
this.externalFiles = void 0;
this.program = void 0;
this.builderState = void 0;
this.resolutionCache.clear();
this.resolutionCache = void 0;
this.cachedUnresolvedImportsPerFile = void 0;
this.moduleSpecifierCache = void 0;
this.directoryStructureHost = void 0;
this.exportMapCache = void 0;
this.projectErrors = void 0;
this.plugins.length = 0;
if (this.missingFilesMap) {
clearMap(this.missingFilesMap, closeFileWatcher);
this.missingFilesMap = void 0;
}
this.clearGeneratedFileWatch();
this.clearInvalidateResolutionOfFailedLookupTimer();
if (this.autoImportProviderHost) {
this.autoImportProviderHost.close();
}
this.autoImportProviderHost = void 0;
if (this.noDtsResolutionProject) {
this.noDtsResolutionProject.close();
}
this.noDtsResolutionProject = void 0;
this.languageService.dispose();
this.languageService = void 0;
}
detachScriptInfoIfNotRoot(uncheckedFilename) {
const info = this.projectService.getScriptInfo(uncheckedFilename);
if (info && !this.isRoot(info)) {
info.detachFromProject(this);
}
}
isClosed() {
return this.rootFiles === void 0;
}
hasRoots() {
return this.rootFiles && this.rootFiles.length > 0;
}
/** @internal */
isOrphan() {
return false;
}
getRootFiles() {
return this.rootFiles && this.rootFiles.map((info) => info.fileName);
}
/** @internal */
getRootFilesMap() {
return this.rootFilesMap;
}
getRootScriptInfos() {
return this.rootFiles;
}
getScriptInfos() {
if (!this.languageServiceEnabled) {
return this.rootFiles;
}
return map(this.program.getSourceFiles(), (sourceFile) => {
const scriptInfo = this.projectService.getScriptInfoForPath(sourceFile.resolvedPath);
Debug.assert(!!scriptInfo, "getScriptInfo", () => `scriptInfo for a file '${sourceFile.fileName}' Path: '${sourceFile.path}' / '${sourceFile.resolvedPath}' is missing.`);
return scriptInfo;
});
}
getExcludedFiles() {
return emptyArray2;
}
getFileNames(excludeFilesFromExternalLibraries, excludeConfigFiles) {
if (!this.program) {
return [];
}
if (!this.languageServiceEnabled) {
let rootFiles = this.getRootFiles();
if (this.compilerOptions) {
const defaultLibrary = getDefaultLibFilePath(this.compilerOptions);
if (defaultLibrary) {
(rootFiles || (rootFiles = [])).push(asNormalizedPath(defaultLibrary));
}
}
return rootFiles;
}
const result = [];
for (const f of this.program.getSourceFiles()) {
if (excludeFilesFromExternalLibraries && this.program.isSourceFileFromExternalLibrary(f)) {
continue;
}
result.push(asNormalizedPath(f.fileName));
}
if (!excludeConfigFiles) {
const configFile = this.program.getCompilerOptions().configFile;
if (configFile) {
result.push(asNormalizedPath(configFile.fileName));
if (configFile.extendedSourceFiles) {
for (const f of configFile.extendedSourceFiles) {
result.push(asNormalizedPath(f));
}
}
}
}
return result;
}
/** @internal */
getFileNamesWithRedirectInfo(includeProjectReferenceRedirectInfo) {
return this.getFileNames().map((fileName) => ({
fileName,
isSourceOfProjectReferenceRedirect: includeProjectReferenceRedirectInfo && this.isSourceOfProjectReferenceRedirect(fileName)
}));
}
hasConfigFile(configFilePath) {
if (this.program && this.languageServiceEnabled) {
const configFile = this.program.getCompilerOptions().configFile;
if (configFile) {
if (configFilePath === asNormalizedPath(configFile.fileName)) {
return true;
}
if (configFile.extendedSourceFiles) {
for (const f of configFile.extendedSourceFiles) {
if (configFilePath === asNormalizedPath(f)) {
return true;
}
}
}
}
}
return false;
}
containsScriptInfo(info) {
if (this.isRoot(info))
return true;
if (!this.program)
return false;
const file = this.program.getSourceFileByPath(info.path);
return !!file && file.resolvedPath === info.path;
}
containsFile(filename, requireOpen) {
const info = this.projectService.getScriptInfoForNormalizedPath(filename);
if (info && (info.isScriptOpen() || !requireOpen)) {
return this.containsScriptInfo(info);
}
return false;
}
isRoot(info) {
var _a;
return this.rootFilesMap && ((_a = this.rootFilesMap.get(info.path)) == null ? void 0 : _a.info) === info;
}
// add a root file to project
addRoot(info, fileName) {
Debug.assert(!this.isRoot(info));
this.rootFiles.push(info);
this.rootFilesMap.set(info.path, { fileName: fileName || info.fileName, info });
info.attachToProject(this);
this.markAsDirty();
}
// add a root file that doesnt exist on host
addMissingFileRoot(fileName) {
const path = this.projectService.toPath(fileName);
this.rootFilesMap.set(path, { fileName });
this.markAsDirty();
}
removeFile(info, fileExists, detachFromProject) {
if (this.isRoot(info)) {
this.removeRoot(info);
}
if (fileExists) {
this.resolutionCache.removeResolutionsOfFile(info.path);
} else {
this.resolutionCache.invalidateResolutionOfFile(info.path);
}
this.cachedUnresolvedImportsPerFile.delete(info.path);
if (detachFromProject) {
info.detachFromProject(this);
}
this.markAsDirty();
}
registerFileUpdate(fileName) {
(this.updatedFileNames || (this.updatedFileNames = /* @__PURE__ */ new Set())).add(fileName);
}
/** @internal */
markFileAsDirty(changedFile) {
this.markAsDirty();
if (this.exportMapCache && !this.exportMapCache.isEmpty()) {
(this.changedFilesForExportMapCache || (this.changedFilesForExportMapCache = /* @__PURE__ */ new Set())).add(changedFile);
}
}
markAsDirty() {
if (!this.dirty) {
this.projectStateVersion++;
this.dirty = true;
}
}
/** @internal */
onAutoImportProviderSettingsChanged() {
var _a;
if (this.autoImportProviderHost === false) {
this.autoImportProviderHost = void 0;
} else {
(_a = this.autoImportProviderHost) == null ? void 0 : _a.markAsDirty();
}
}
/** @internal */
onPackageJsonChange(packageJsonPath) {
var _a;
if ((_a = this.packageJsonsForAutoImport) == null ? void 0 : _a.has(packageJsonPath)) {
this.moduleSpecifierCache.clear();
if (this.autoImportProviderHost) {
this.autoImportProviderHost.markAsDirty();
}
}
}
/** @internal */
onFileAddedOrRemoved(isSymlink) {
this.hasAddedorRemovedFiles = true;
if (isSymlink) {
this.hasAddedOrRemovedSymlinks = true;
}
}
/** @internal */
onDiscoveredSymlink() {
this.hasAddedOrRemovedSymlinks = true;
}
/**
* Updates set of files that contribute to this project
* @returns: true if set of files in the project stays the same and false - otherwise.
*/
updateGraph() {
var _a, _b, _c, _d, _e;
(_a = tracing) == null ? void 0 : _a.push(tracing.Phase.Session, "updateGraph", { name: this.projectName, kind: ProjectKind[this.projectKind] });
(_b = perfLogger) == null ? void 0 : _b.logStartUpdateGraph();
this.resolutionCache.startRecordingFilesWithChangedResolutions();
const hasNewProgram = this.updateGraphWorker();
const hasAddedorRemovedFiles = this.hasAddedorRemovedFiles;
this.hasAddedorRemovedFiles = false;
this.hasAddedOrRemovedSymlinks = false;
const changedFiles = this.resolutionCache.finishRecordingFilesWithChangedResolutions() || emptyArray2;
for (const file of changedFiles) {
this.cachedUnresolvedImportsPerFile.delete(file);
}
if (this.languageServiceEnabled && this.projectService.serverMode === 0 /* Semantic */) {
if (hasNewProgram || changedFiles.length) {
this.lastCachedUnresolvedImportsList = getUnresolvedImports(this.program, this.cachedUnresolvedImportsPerFile);
}
this.projectService.typingsCache.enqueueInstallTypingsForProject(this, this.lastCachedUnresolvedImportsList, hasAddedorRemovedFiles);
} else {
this.lastCachedUnresolvedImportsList = void 0;
}
const isFirstProgramLoad = this.projectProgramVersion === 0 && hasNewProgram;
if (hasNewProgram) {
this.projectProgramVersion++;
}
if (hasAddedorRemovedFiles) {
if (!this.autoImportProviderHost)
this.autoImportProviderHost = void 0;
(_c = this.autoImportProviderHost) == null ? void 0 : _c.markAsDirty();
}
if (isFirstProgramLoad) {
this.getPackageJsonAutoImportProvider();
}
(_d = perfLogger) == null ? void 0 : _d.logStopUpdateGraph();
(_e = tracing) == null ? void 0 : _e.pop();
return !hasNewProgram;
}
/** @internal */
updateTypingFiles(typingFiles) {
if (enumerateInsertsAndDeletes(
typingFiles,
this.typingFiles,
getStringComparer(!this.useCaseSensitiveFileNames()),
/*inserted*/
noop,
(removed) => this.detachScriptInfoFromProject(removed)
)) {
this.typingFiles = typingFiles;
this.resolutionCache.setFilesWithInvalidatedNonRelativeUnresolvedImports(this.cachedUnresolvedImportsPerFile);
this.projectService.delayUpdateProjectGraphAndEnsureProjectStructureForOpenFiles(this);
}
}
/** @internal */
closeWatchingTypingLocations() {
if (this.typingWatchers)
clearMap(this.typingWatchers, closeFileWatcher);
this.typingWatchers = void 0;
}
/** @internal */
onTypingInstallerWatchInvoke() {
this.typingWatchers.isInvoked = true;
this.projectService.updateTypingsForProject({ projectName: this.getProjectName(), kind: ActionInvalidate });
}
/** @internal */
watchTypingLocations(files) {
if (!files) {
this.typingWatchers.isInvoked = false;
return;
}
if (!files.length) {
this.closeWatchingTypingLocations();
return;
}
const toRemove = new Map(this.typingWatchers);
if (!this.typingWatchers)
this.typingWatchers = /* @__PURE__ */ new Map();
this.typingWatchers.isInvoked = false;
const createProjectWatcher = (path, typingsWatcherType) => {
const canonicalPath = this.toPath(path);
toRemove.delete(canonicalPath);
if (!this.typingWatchers.has(canonicalPath)) {
this.typingWatchers.set(
canonicalPath,
typingsWatcherType === "FileWatcher" /* FileWatcher */ ? this.projectService.watchFactory.watchFile(
path,
() => !this.typingWatchers.isInvoked ? this.onTypingInstallerWatchInvoke() : this.writeLog(`TypingWatchers already invoked`),
2e3 /* High */,
this.projectService.getWatchOptions(this),
WatchType.TypingInstallerLocationFile,
this
) : this.projectService.watchFactory.watchDirectory(
path,
(f) => {
if (this.typingWatchers.isInvoked)
return this.writeLog(`TypingWatchers already invoked`);
if (!fileExtensionIs(f, ".json" /* Json */))
return this.writeLog(`Ignoring files that are not *.json`);
if (comparePaths(f, combinePaths(this.projectService.typingsInstaller.globalTypingsCacheLocation, "package.json"), !this.useCaseSensitiveFileNames()))
return this.writeLog(`Ignoring package.json change at global typings location`);
this.onTypingInstallerWatchInvoke();
},
1 /* Recursive */,
this.projectService.getWatchOptions(this),
WatchType.TypingInstallerLocationDirectory,
this
)
);
}
};
for (const file of files) {
const basename = getBaseFileName(file);
if (basename === "package.json" || basename === "bower.json") {
createProjectWatcher(file, "FileWatcher" /* FileWatcher */);
continue;
}
if (containsPath(this.currentDirectory, file, this.currentDirectory, !this.useCaseSensitiveFileNames())) {
const subDirectory = file.indexOf(directorySeparator, this.currentDirectory.length + 1);
if (subDirectory !== -1) {
createProjectWatcher(file.substr(0, subDirectory), "DirectoryWatcher" /* DirectoryWatcher */);
} else {
createProjectWatcher(file, "DirectoryWatcher" /* DirectoryWatcher */);
}
continue;
}
if (containsPath(this.projectService.typingsInstaller.globalTypingsCacheLocation, file, this.currentDirectory, !this.useCaseSensitiveFileNames())) {
createProjectWatcher(this.projectService.typingsInstaller.globalTypingsCacheLocation, "DirectoryWatcher" /* DirectoryWatcher */);
continue;
}
createProjectWatcher(file, "DirectoryWatcher" /* DirectoryWatcher */);
}
toRemove.forEach((watch, path) => {
watch.close();
this.typingWatchers.delete(path);
});
}
/** @internal */
getCurrentProgram() {
return this.program;
}
removeExistingTypings(include) {
const existing = getAutomaticTypeDirectiveNames(this.getCompilerOptions(), this.directoryStructureHost);
return include.filter((i) => existing.indexOf(i) < 0);
}
updateGraphWorker() {
var _a, _b;
const oldProgram = this.languageService.getCurrentProgram();
Debug.assert(!this.isClosed(), "Called update graph worker of closed project");
this.writeLog(`Starting updateGraphWorker: Project: ${this.getProjectName()}`);
const start2 = timestamp();
const { hasInvalidatedResolutions, hasInvalidatedLibResolutions } = this.resolutionCache.createHasInvalidatedResolutions(returnFalse, returnFalse);
this.hasInvalidatedResolutions = hasInvalidatedResolutions;
this.hasInvalidatedLibResolutions = hasInvalidatedLibResolutions;
this.resolutionCache.startCachingPerDirectoryResolution();
this.program = this.languageService.getProgram();
this.dirty = false;
(_a = tracing) == null ? void 0 : _a.push(tracing.Phase.Session, "finishCachingPerDirectoryResolution");
this.resolutionCache.finishCachingPerDirectoryResolution(this.program, oldProgram);
(_b = tracing) == null ? void 0 : _b.pop();
Debug.assert(oldProgram === void 0 || this.program !== void 0);
let hasNewProgram = false;
if (this.program && (!oldProgram || this.program !== oldProgram && this.program.structureIsReused !== 2 /* Completely */)) {
hasNewProgram = true;
if (oldProgram) {
for (const f of oldProgram.getSourceFiles()) {
const newFile = this.program.getSourceFileByPath(f.resolvedPath);
if (!newFile || f.resolvedPath === f.path && newFile.resolvedPath !== f.path) {
this.detachScriptInfoFromProject(f.fileName, !!this.program.getSourceFileByPath(f.path));
}
}
oldProgram.forEachResolvedProjectReference((resolvedProjectReference) => {
if (!this.program.getResolvedProjectReferenceByPath(resolvedProjectReference.sourceFile.path)) {
this.detachScriptInfoFromProject(resolvedProjectReference.sourceFile.fileName);
}
});
}
updateMissingFilePathsWatch(
this.program,
this.missingFilesMap || (this.missingFilesMap = /* @__PURE__ */ new Map()),
// Watch the missing files
(missingFilePath) => this.addMissingFileWatcher(missingFilePath)
);
if (this.generatedFilesMap) {
const outPath = outFile(this.compilerOptions);
if (isGeneratedFileWatcher(this.generatedFilesMap)) {
if (!outPath || !this.isValidGeneratedFileWatcher(
removeFileExtension(outPath) + ".d.ts" /* Dts */,
this.generatedFilesMap
)) {
this.clearGeneratedFileWatch();
}
} else {
if (outPath) {
this.clearGeneratedFileWatch();
} else {
this.generatedFilesMap.forEach((watcher, source) => {
const sourceFile = this.program.getSourceFileByPath(source);
if (!sourceFile || sourceFile.resolvedPath !== source || !this.isValidGeneratedFileWatcher(
getDeclarationEmitOutputFilePathWorker(sourceFile.fileName, this.compilerOptions, this.currentDirectory, this.program.getCommonSourceDirectory(), this.getCanonicalFileName),
watcher
)) {
closeFileWatcherOf(watcher);
this.generatedFilesMap.delete(source);
}
});
}
}
}
if (this.languageServiceEnabled && this.projectService.serverMode === 0 /* Semantic */) {
this.resolutionCache.updateTypeRootsWatch();
}
}
if (this.exportMapCache && !this.exportMapCache.isEmpty()) {
this.exportMapCache.releaseSymbols();
if (this.hasAddedorRemovedFiles || oldProgram && !this.program.structureIsReused) {
this.exportMapCache.clear();
} else if (this.changedFilesForExportMapCache && oldProgram && this.program) {
forEachKey(this.changedFilesForExportMapCache, (fileName) => {
const oldSourceFile = oldProgram.getSourceFileByPath(fileName);
const sourceFile = this.program.getSourceFileByPath(fileName);
if (!oldSourceFile || !sourceFile) {
this.exportMapCache.clear();
return true;
}
return this.exportMapCache.onFileChanged(oldSourceFile, sourceFile, !!this.getTypeAcquisition().enable);
});
}
}
if (this.changedFilesForExportMapCache) {
this.changedFilesForExportMapCache.clear();
}
if (this.hasAddedOrRemovedSymlinks || this.program && !this.program.structureIsReused && this.getCompilerOptions().preserveSymlinks) {
this.symlinks = void 0;
this.moduleSpecifierCache.clear();
}
const oldExternalFiles = this.externalFiles || emptyArray2;
this.externalFiles = this.getExternalFiles();
enumerateInsertsAndDeletes(
this.externalFiles,
oldExternalFiles,
getStringComparer(!this.useCaseSensitiveFileNames()),
// Ensure a ScriptInfo is created for new external files. This is performed indirectly
// by the host for files in the program when the program is retrieved above but
// the program doesn't contain external files so this must be done explicitly.
(inserted) => {
const scriptInfo = this.projectService.getOrCreateScriptInfoNotOpenedByClient(inserted, this.currentDirectory, this.directoryStructureHost);
scriptInfo == null ? void 0 : scriptInfo.attachToProject(this);
},
(removed) => this.detachScriptInfoFromProject(removed)
);
const elapsed = timestamp() - start2;
this.sendPerformanceEvent("UpdateGraph", elapsed);
this.writeLog(`Finishing updateGraphWorker: Project: ${this.getProjectName()} Version: ${this.getProjectVersion()} structureChanged: ${hasNewProgram}${this.program ? ` structureIsReused:: ${StructureIsReused[this.program.structureIsReused]}` : ""} Elapsed: ${elapsed}ms`);
if (this.projectService.logger.isTestLogger) {
if (this.program !== oldProgram) {
this.print(
/*writeProjectFileNames*/
true,
this.hasAddedorRemovedFiles,
/*writeFileVersionAndText*/
true
);
} else {
this.writeLog(`Same program as before`);
}
} else if (this.hasAddedorRemovedFiles) {
this.print(
/*writeProjectFileNames*/
true,
/*writeFileExplaination*/
true,
/*writeFileVersionAndText*/
false
);
} else if (this.program !== oldProgram) {
this.writeLog(`Different program with same set of files`);
}
return hasNewProgram;
}
/** @internal */
sendPerformanceEvent(kind, durationMs) {
this.projectService.sendPerformanceEvent(kind, durationMs);
}
detachScriptInfoFromProject(uncheckedFileName, noRemoveResolution) {
const scriptInfoToDetach = this.projectService.getScriptInfo(uncheckedFileName);
if (scriptInfoToDetach) {
scriptInfoToDetach.detachFromProject(this);
if (!noRemoveResolution) {
this.resolutionCache.removeResolutionsOfFile(scriptInfoToDetach.path);
}
}
}
addMissingFileWatcher(missingFilePath) {
var _a;
if (isConfiguredProject(this)) {
const configFileExistenceInfo = this.projectService.configFileExistenceInfoCache.get(missingFilePath);
if ((_a = configFileExistenceInfo == null ? void 0 : configFileExistenceInfo.config) == null ? void 0 : _a.projects.has(this.canonicalConfigFilePath))
return noopFileWatcher;
}
const fileWatcher = this.projectService.watchFactory.watchFile(
missingFilePath,
(fileName, eventKind) => {
if (isConfiguredProject(this)) {
this.getCachedDirectoryStructureHost().addOrDeleteFile(fileName, missingFilePath, eventKind);
}
if (eventKind === 0 /* Created */ && this.missingFilesMap.has(missingFilePath)) {
this.missingFilesMap.delete(missingFilePath);
fileWatcher.close();
this.projectService.delayUpdateProjectGraphAndEnsureProjectStructureForOpenFiles(this);
}
},
500 /* Medium */,
this.projectService.getWatchOptions(this),
WatchType.MissingFile,
this
);
return fileWatcher;
}
isWatchedMissingFile(path) {
return !!this.missingFilesMap && this.missingFilesMap.has(path);
}
/** @internal */
addGeneratedFileWatch(generatedFile, sourceFile) {
if (outFile(this.compilerOptions)) {
if (!this.generatedFilesMap) {
this.generatedFilesMap = this.createGeneratedFileWatcher(generatedFile);
}
} else {
const path = this.toPath(sourceFile);
if (this.generatedFilesMap) {
if (isGeneratedFileWatcher(this.generatedFilesMap)) {
Debug.fail(`${this.projectName} Expected to not have --out watcher for generated file with options: ${JSON.stringify(this.compilerOptions)}`);
return;
}
if (this.generatedFilesMap.has(path))
return;
} else {
this.generatedFilesMap = /* @__PURE__ */ new Map();
}
this.generatedFilesMap.set(path, this.createGeneratedFileWatcher(generatedFile));
}
}
createGeneratedFileWatcher(generatedFile) {
return {
generatedFilePath: this.toPath(generatedFile),
watcher: this.projectService.watchFactory.watchFile(
generatedFile,
() => {
this.clearSourceMapperCache();
this.projectService.delayUpdateProjectGraphAndEnsureProjectStructureForOpenFiles(this);
},
2e3 /* High */,
this.projectService.getWatchOptions(this),
WatchType.MissingGeneratedFile,
this
)
};
}
isValidGeneratedFileWatcher(generateFile, watcher) {
return this.toPath(generateFile) === watcher.generatedFilePath;
}
clearGeneratedFileWatch() {
if (this.generatedFilesMap) {
if (isGeneratedFileWatcher(this.generatedFilesMap)) {
closeFileWatcherOf(this.generatedFilesMap);
} else {
clearMap(this.generatedFilesMap, closeFileWatcherOf);
}
this.generatedFilesMap = void 0;
}
}
getScriptInfoForNormalizedPath(fileName) {
const scriptInfo = this.projectService.getScriptInfoForPath(this.toPath(fileName));
if (scriptInfo && !scriptInfo.isAttached(this)) {
return Errors.ThrowProjectDoesNotContainDocument(fileName, this);
}
return scriptInfo;
}
getScriptInfo(uncheckedFileName) {
return this.projectService.getScriptInfo(uncheckedFileName);
}
filesToString(writeProjectFileNames) {
return this.filesToStringWorker(
writeProjectFileNames,
/*writeFileExplaination*/
true,
/*writeFileVersionAndText*/
false
);
}
/** @internal */
filesToStringWorker(writeProjectFileNames, writeFileExplaination, writeFileVersionAndText) {
if (this.isInitialLoadPending())
return " Files (0) InitialLoadPending\n";
if (!this.program)
return " Files (0) NoProgram\n";
const sourceFiles = this.program.getSourceFiles();
let strBuilder = ` Files (${sourceFiles.length})
`;
if (writeProjectFileNames) {
for (const file of sourceFiles) {
strBuilder += ` ${file.fileName}${writeFileVersionAndText ? ` ${file.version} ${JSON.stringify(file.text)}` : ""}
`;
}
if (writeFileExplaination) {
strBuilder += "\n\n";
explainFiles(this.program, (s) => strBuilder += ` ${s}
`);
}
}
return strBuilder;
}
/** @internal */
print(writeProjectFileNames, writeFileExplaination, writeFileVersionAndText) {
this.writeLog(`Project '${this.projectName}' (${ProjectKind[this.projectKind]})`);
this.writeLog(this.filesToStringWorker(
writeProjectFileNames && this.projectService.logger.hasLevel(3 /* verbose */),
writeFileExplaination && this.projectService.logger.hasLevel(3 /* verbose */),
writeFileVersionAndText && this.projectService.logger.hasLevel(3 /* verbose */)
));
this.writeLog("-----------------------------------------------");
if (this.autoImportProviderHost) {
this.autoImportProviderHost.print(
/*writeProjectFileNames*/
false,
/*writeFileExplaination*/
false,
/*writeFileVersionAndText*/
false
);
}
}
setCompilerOptions(compilerOptions) {
var _a;
if (compilerOptions) {
compilerOptions.allowNonTsExtensions = true;
const oldOptions = this.compilerOptions;
this.compilerOptions = compilerOptions;
this.setInternalCompilerOptionsForEmittingJsFiles();
(_a = this.noDtsResolutionProject) == null ? void 0 : _a.setCompilerOptions(this.getCompilerOptionsForNoDtsResolutionProject());
if (changesAffectModuleResolution(oldOptions, compilerOptions)) {
this.cachedUnresolvedImportsPerFile.clear();
this.lastCachedUnresolvedImportsList = void 0;
this.resolutionCache.onChangesAffectModuleResolution();
this.moduleSpecifierCache.clear();
}
this.markAsDirty();
}
}
/** @internal */
setWatchOptions(watchOptions) {
this.watchOptions = watchOptions;
}
/** @internal */
getWatchOptions() {
return this.watchOptions;
}
setTypeAcquisition(newTypeAcquisition) {
if (newTypeAcquisition) {
this.typeAcquisition = this.removeLocalTypingsFromTypeAcquisition(newTypeAcquisition);
}
}
getTypeAcquisition() {
return this.typeAcquisition || {};
}
/** @internal */
getChangesSinceVersion(lastKnownVersion, includeProjectReferenceRedirectInfo) {
const includeProjectReferenceRedirectInfoIfRequested = includeProjectReferenceRedirectInfo ? (files) => arrayFrom(files.entries(), ([fileName, isSourceOfProjectReferenceRedirect]) => ({
fileName,
isSourceOfProjectReferenceRedirect
})) : (files) => arrayFrom(files.keys());
if (!this.isInitialLoadPending()) {
updateProjectIfDirty(this);
}
const info = {
projectName: this.getProjectName(),
version: this.projectProgramVersion,
isInferred: isInferredProject(this),
options: this.getCompilationSettings(),
languageServiceDisabled: !this.languageServiceEnabled,
lastFileExceededProgramSize: this.lastFileExceededProgramSize
};
const updatedFileNames = this.updatedFileNames;
this.updatedFileNames = void 0;
if (this.lastReportedFileNames && lastKnownVersion === this.lastReportedVersion) {
if (this.projectProgramVersion === this.lastReportedVersion && !updatedFileNames) {
return { info, projectErrors: this.getGlobalProjectErrors() };
}
const lastReportedFileNames = this.lastReportedFileNames;
const externalFiles = this.getExternalFiles().map((f) => ({
fileName: toNormalizedPath(f),
isSourceOfProjectReferenceRedirect: false
}));
const currentFiles = arrayToMap(
this.getFileNamesWithRedirectInfo(!!includeProjectReferenceRedirectInfo).concat(externalFiles),
(info2) => info2.fileName,
(info2) => info2.isSourceOfProjectReferenceRedirect
);
const added = /* @__PURE__ */ new Map();
const removed = /* @__PURE__ */ new Map();
const updated = updatedFileNames ? arrayFrom(updatedFileNames.keys()) : [];
const updatedRedirects = [];
forEachEntry(currentFiles, (isSourceOfProjectReferenceRedirect, fileName) => {
if (!lastReportedFileNames.has(fileName)) {
added.set(fileName, isSourceOfProjectReferenceRedirect);
} else if (includeProjectReferenceRedirectInfo && isSourceOfProjectReferenceRedirect !== lastReportedFileNames.get(fileName)) {
updatedRedirects.push({
fileName,
isSourceOfProjectReferenceRedirect
});
}
});
forEachEntry(lastReportedFileNames, (isSourceOfProjectReferenceRedirect, fileName) => {
if (!currentFiles.has(fileName)) {
removed.set(fileName, isSourceOfProjectReferenceRedirect);
}
});
this.lastReportedFileNames = currentFiles;
this.lastReportedVersion = this.projectProgramVersion;
return {
info,
changes: {
added: includeProjectReferenceRedirectInfoIfRequested(added),
removed: includeProjectReferenceRedirectInfoIfRequested(removed),
updated: includeProjectReferenceRedirectInfo ? updated.map((fileName) => ({
fileName,
isSourceOfProjectReferenceRedirect: this.isSourceOfProjectReferenceRedirect(fileName)
})) : updated,
updatedRedirects: includeProjectReferenceRedirectInfo ? updatedRedirects : void 0
},
projectErrors: this.getGlobalProjectErrors()
};
} else {
const projectFileNames = this.getFileNamesWithRedirectInfo(!!includeProjectReferenceRedirectInfo);
const externalFiles = this.getExternalFiles().map((f) => ({
fileName: toNormalizedPath(f),
isSourceOfProjectReferenceRedirect: false
}));
const allFiles = projectFileNames.concat(externalFiles);
this.lastReportedFileNames = arrayToMap(
allFiles,
(info2) => info2.fileName,
(info2) => info2.isSourceOfProjectReferenceRedirect
);
this.lastReportedVersion = this.projectProgramVersion;
return {
info,
files: includeProjectReferenceRedirectInfo ? allFiles : allFiles.map((f) => f.fileName),
projectErrors: this.getGlobalProjectErrors()
};
}
}
// remove a root file from project
removeRoot(info) {
orderedRemoveItem(this.rootFiles, info);
this.rootFilesMap.delete(info.path);
}
/** @internal */
isSourceOfProjectReferenceRedirect(fileName) {
return !!this.program && this.program.isSourceOfProjectReferenceRedirect(fileName);
}
/** @internal */
getGlobalPluginSearchPaths() {
return [
...this.projectService.pluginProbeLocations,
// ../../.. to walk from X/node_modules/typescript/lib/tsserver.js to X/node_modules/
combinePaths(this.projectService.getExecutingFilePath(), "../../..")
];
}
enableGlobalPlugins(options) {
if (!this.projectService.globalPlugins.length)
return;
const host = this.projectService.host;
if (!host.require && !host.importPlugin) {
this.projectService.logger.info("Plugins were requested but not running in environment that supports 'require'. Nothing will be loaded");
return;
}
const searchPaths = this.getGlobalPluginSearchPaths();
for (const globalPluginName of this.projectService.globalPlugins) {
if (!globalPluginName)
continue;
if (options.plugins && options.plugins.some((p) => p.name === globalPluginName))
continue;
this.projectService.logger.info(`Loading global plugin ${globalPluginName}`);
this.enablePlugin({ name: globalPluginName, global: true }, searchPaths);
}
}
enablePlugin(pluginConfigEntry, searchPaths) {
this.projectService.requestEnablePlugin(this, pluginConfigEntry, searchPaths);
}
/** @internal */
enableProxy(pluginModuleFactory, configEntry) {
try {
if (typeof pluginModuleFactory !== "function") {
this.projectService.logger.info(`Skipped loading plugin ${configEntry.name} because it did not expose a proper factory function`);
return;
}
const info = {
config: configEntry,
project: this,
languageService: this.languageService,
languageServiceHost: this,
serverHost: this.projectService.host,
session: this.projectService.session
};
const pluginModule = pluginModuleFactory({ typescript: ts_exports2 });
const newLS = pluginModule.create(info);
for (const k of Object.keys(this.languageService)) {
if (!(k in newLS)) {
this.projectService.logger.info(`Plugin activation warning: Missing proxied method ${k} in created LS. Patching.`);
newLS[k] = this.languageService[k];
}
}
this.projectService.logger.info(`Plugin validation succeeded`);
this.languageService = newLS;
this.plugins.push({ name: configEntry.name, module: pluginModule });
} catch (e) {
this.projectService.logger.info(`Plugin activation failed: ${e}`);
}
}
/** @internal */
onPluginConfigurationChanged(pluginName, configuration) {
this.plugins.filter((plugin) => plugin.name === pluginName).forEach((plugin) => {
if (plugin.module.onConfigurationChanged) {
plugin.module.onConfigurationChanged(configuration);
}
});
}
/** Starts a new check for diagnostics. Call this if some file has updated that would cause diagnostics to be changed. */
refreshDiagnostics() {
this.projectService.sendProjectsUpdatedInBackgroundEvent();
}
/** @internal */
getPackageJsonsVisibleToFile(fileName, rootDir) {
if (this.projectService.serverMode !== 0 /* Semantic */)
return emptyArray2;
return this.projectService.getPackageJsonsVisibleToFile(fileName, rootDir);
}
/** @internal */
getNearestAncestorDirectoryWithPackageJson(fileName) {
return this.projectService.getNearestAncestorDirectoryWithPackageJson(fileName);
}
/** @internal */
getPackageJsonsForAutoImport(rootDir) {
const packageJsons = this.getPackageJsonsVisibleToFile(combinePaths(this.currentDirectory, inferredTypesContainingFile), rootDir);
this.packageJsonsForAutoImport = new Set(packageJsons.map((p) => p.fileName));
return packageJsons;
}
/** @internal */
getPackageJsonCache() {
return this.projectService.packageJsonCache;
}
/** @internal */
getCachedExportInfoMap() {
return this.exportMapCache || (this.exportMapCache = createCacheableExportInfoMap(this));
}
/** @internal */
clearCachedExportInfoMap() {
var _a;
(_a = this.exportMapCache) == null ? void 0 : _a.clear();
}
/** @internal */
getModuleSpecifierCache() {
return this.moduleSpecifierCache;
}
/** @internal */
includePackageJsonAutoImports() {
if (this.projectService.includePackageJsonAutoImports() === 0 /* Off */ || !this.languageServiceEnabled || isInsideNodeModules(this.currentDirectory) || !this.isDefaultProjectForOpenFiles()) {
return 0 /* Off */;
}
return this.projectService.includePackageJsonAutoImports();
}
/** @internal */
getModuleResolutionHostForAutoImportProvider() {
var _a, _b;
if (this.program) {
return {
fileExists: this.program.fileExists,
directoryExists: this.program.directoryExists,
realpath: this.program.realpath || ((_a = this.projectService.host.realpath) == null ? void 0 : _a.bind(this.projectService.host)),
getCurrentDirectory: this.getCurrentDirectory.bind(this),
readFile: this.projectService.host.readFile.bind(this.projectService.host),
getDirectories: this.projectService.host.getDirectories.bind(this.projectService.host),
trace: (_b = this.projectService.host.trace) == null ? void 0 : _b.bind(this.projectService.host),
useCaseSensitiveFileNames: this.program.useCaseSensitiveFileNames()
};
}
return this.projectService.host;
}
/** @internal */
getPackageJsonAutoImportProvider() {
var _a, _b, _c;
if (this.autoImportProviderHost === false) {
return void 0;
}
if (this.projectService.serverMode !== 0 /* Semantic */) {
this.autoImportProviderHost = false;
return void 0;
}
if (this.autoImportProviderHost) {
updateProjectIfDirty(this.autoImportProviderHost);
if (this.autoImportProviderHost.isEmpty()) {
this.autoImportProviderHost.close();
this.autoImportProviderHost = void 0;
return void 0;
}
return this.autoImportProviderHost.getCurrentProgram();
}
const dependencySelection = this.includePackageJsonAutoImports();
if (dependencySelection) {
(_a = tracing) == null ? void 0 : _a.push(tracing.Phase.Session, "getPackageJsonAutoImportProvider");
const start2 = timestamp();
this.autoImportProviderHost = AutoImportProviderProject.create(dependencySelection, this, this.getModuleResolutionHostForAutoImportProvider(), this.documentRegistry);
if (this.autoImportProviderHost) {
updateProjectIfDirty(this.autoImportProviderHost);
this.sendPerformanceEvent("CreatePackageJsonAutoImportProvider", timestamp() - start2);
(_b = tracing) == null ? void 0 : _b.pop();
return this.autoImportProviderHost.getCurrentProgram();
}
(_c = tracing) == null ? void 0 : _c.pop();
}
}
/** @internal */
isDefaultProjectForOpenFiles() {
return !!forEachEntry(
this.projectService.openFiles,
(_, fileName) => this.projectService.tryGetDefaultProjectForFile(toNormalizedPath(fileName)) === this
);
}
/** @internal */
watchNodeModulesForPackageJsonChanges(directoryPath) {
return this.projectService.watchPackageJsonsInNodeModules(this.toPath(directoryPath), this);
}
/** @internal */
getIncompleteCompletionsCache() {
return this.projectService.getIncompleteCompletionsCache();
}
/** @internal */
getNoDtsResolutionProject(rootFileNames) {
Debug.assert(this.projectService.serverMode === 0 /* Semantic */);
if (!this.noDtsResolutionProject) {
this.noDtsResolutionProject = new AuxiliaryProject(this.projectService, this.documentRegistry, this.getCompilerOptionsForNoDtsResolutionProject(), this.currentDirectory);
}
enumerateInsertsAndDeletes(
rootFileNames.map(toNormalizedPath),
this.noDtsResolutionProject.getRootFiles(),
getStringComparer(!this.useCaseSensitiveFileNames()),
(pathToAdd) => {
const info = this.projectService.getOrCreateScriptInfoNotOpenedByClient(
pathToAdd,
this.currentDirectory,
this.noDtsResolutionProject.directoryStructureHost
);
if (info) {
this.noDtsResolutionProject.addRoot(info, pathToAdd);
}
},
(pathToRemove) => {
const info = this.noDtsResolutionProject.getScriptInfo(pathToRemove);
if (info) {
this.noDtsResolutionProject.removeRoot(info);
}
}
);
return this.noDtsResolutionProject;
}
/** @internal */
getCompilerOptionsForNoDtsResolutionProject() {
return {
...this.getCompilerOptions(),
noDtsResolution: true,
allowJs: true,
maxNodeModuleJsDepth: 3,
diagnostics: false,
skipLibCheck: true,
sourceMap: false,
types: emptyArray,
lib: emptyArray,
noLib: true
};
}
};
function getUnresolvedImports(program, cachedUnresolvedImportsPerFile) {
var _a, _b;
const sourceFiles = program.getSourceFiles();
(_a = tracing) == null ? void 0 : _a.push(tracing.Phase.Session, "getUnresolvedImports", { count: sourceFiles.length });
const ambientModules = program.getTypeChecker().getAmbientModules().map((mod) => stripQuotes(mod.getName()));
const result = sortAndDeduplicate(flatMap(sourceFiles, (sourceFile) => extractUnresolvedImportsFromSourceFile(sourceFile, ambientModules, cachedUnresolvedImportsPerFile)));
(_b = tracing) == null ? void 0 : _b.pop();
return result;
}
function extractUnresolvedImportsFromSourceFile(file, ambientModules, cachedUnresolvedImportsPerFile) {
return getOrUpdate(cachedUnresolvedImportsPerFile, file.path, () => {
if (!file.resolvedModules)
return emptyArray2;
let unresolvedImports;
file.resolvedModules.forEach(({ resolvedModule }, name) => {
if ((!resolvedModule || !resolutionExtensionIsTSOrJson(resolvedModule.extension)) && !isExternalModuleNameRelative(name) && !ambientModules.some((m) => m === name)) {
unresolvedImports = append(unresolvedImports, parsePackageName(name).packageName);
}
});
return unresolvedImports || emptyArray2;
});
}
var InferredProject2 = class extends Project3 {
/** @internal */
constructor(projectService, documentRegistry, compilerOptions, watchOptions, projectRootPath, currentDirectory, typeAcquisition) {
super(
projectService.newInferredProjectName(),
0 /* Inferred */,
projectService,
documentRegistry,
// TODO: GH#18217
/*files*/
void 0,
/*lastFileExceededProgramSize*/
void 0,
compilerOptions,
/*compileOnSaveEnabled*/
false,
watchOptions,
projectService.host,
currentDirectory
);
this._isJsInferredProject = false;
this.typeAcquisition = typeAcquisition;
this.projectRootPath = projectRootPath && projectService.toCanonicalFileName(projectRootPath);
if (!projectRootPath && !projectService.useSingleInferredProject) {
this.canonicalCurrentDirectory = projectService.toCanonicalFileName(this.currentDirectory);
}
this.enableGlobalPlugins(this.getCompilerOptions());
}
toggleJsInferredProject(isJsInferredProject) {
if (isJsInferredProject !== this._isJsInferredProject) {
this._isJsInferredProject = isJsInferredProject;
this.setCompilerOptions();
}
}
setCompilerOptions(options) {
if (!options && !this.getCompilationSettings()) {
return;
}
const newOptions = cloneCompilerOptions(options || this.getCompilationSettings());
if (this._isJsInferredProject && typeof newOptions.maxNodeModuleJsDepth !== "number") {
newOptions.maxNodeModuleJsDepth = 2;
} else if (!this._isJsInferredProject) {
newOptions.maxNodeModuleJsDepth = void 0;
}
newOptions.allowJs = true;
super.setCompilerOptions(newOptions);
}
addRoot(info) {
Debug.assert(info.isScriptOpen());
this.projectService.startWatchingConfigFilesForInferredProjectRoot(info);
if (!this._isJsInferredProject && info.isJavaScript()) {
this.toggleJsInferredProject(
/*isJsInferredProject*/
true
);
} else if (this.isOrphan() && this._isJsInferredProject && !info.isJavaScript()) {
this.toggleJsInferredProject(
/*isJsInferredProject*/
false
);
}
super.addRoot(info);
}
removeRoot(info) {
this.projectService.stopWatchingConfigFilesForInferredProjectRoot(info);
super.removeRoot(info);
if (!this.isOrphan() && this._isJsInferredProject && info.isJavaScript()) {
if (every(this.getRootScriptInfos(), (rootInfo) => !rootInfo.isJavaScript())) {
this.toggleJsInferredProject(
/*isJsInferredProject*/
false
);
}
}
}
/** @internal */
isOrphan() {
return !this.hasRoots();
}
isProjectWithSingleRoot() {
return !this.projectRootPath && !this.projectService.useSingleInferredProject || this.getRootScriptInfos().length === 1;
}
close() {
forEach(this.getRootScriptInfos(), (info) => this.projectService.stopWatchingConfigFilesForInferredProjectRoot(info));
super.close();
}
getTypeAcquisition() {
return this.typeAcquisition || {
enable: allRootFilesAreJsOrDts(this),
include: emptyArray,
exclude: emptyArray
};
}
};
var AuxiliaryProject = class extends Project3 {
constructor(projectService, documentRegistry, compilerOptions, currentDirectory) {
super(
projectService.newAuxiliaryProjectName(),
4 /* Auxiliary */,
projectService,
documentRegistry,
/*hasExplicitListOfFiles*/
false,
/*lastFileExceededProgramSize*/
void 0,
compilerOptions,
/*compileOnSaveEnabled*/
false,
/*watchOptions*/
void 0,
projectService.host,
currentDirectory
);
}
isOrphan() {
return true;
}
/** @internal */
scheduleInvalidateResolutionsOfFailedLookupLocations() {
return;
}
};
var _AutoImportProviderProject = class extends Project3 {
/** @internal */
constructor(hostProject, initialRootNames, documentRegistry, compilerOptions) {
super(
hostProject.projectService.newAutoImportProviderProjectName(),
3 /* AutoImportProvider */,
hostProject.projectService,
documentRegistry,
/*hasExplicitListOfFiles*/
false,
/*lastFileExceededProgramSize*/
void 0,
compilerOptions,
/*compileOnSaveEnabled*/
false,
hostProject.getWatchOptions(),
hostProject.projectService.host,
hostProject.currentDirectory
);
this.hostProject = hostProject;
this.rootFileNames = initialRootNames;
this.useSourceOfProjectReferenceRedirect = maybeBind(this.hostProject, this.hostProject.useSourceOfProjectReferenceRedirect);
this.getParsedCommandLine = maybeBind(this.hostProject, this.hostProject.getParsedCommandLine);
}
/** @internal */
static getRootFileNames(dependencySelection, hostProject, moduleResolutionHost, compilerOptions) {
var _a, _b;
if (!dependencySelection) {
return emptyArray;
}
const program = hostProject.getCurrentProgram();
if (!program) {
return emptyArray;
}
const start2 = timestamp();
let dependencyNames;
let rootNames;
const rootFileName = combinePaths(hostProject.currentDirectory, inferredTypesContainingFile);
const packageJsons = hostProject.getPackageJsonsForAutoImport(combinePaths(hostProject.currentDirectory, rootFileName));
for (const packageJson of packageJsons) {
(_a = packageJson.dependencies) == null ? void 0 : _a.forEach((_, dependenyName) => addDependency(dependenyName));
(_b = packageJson.peerDependencies) == null ? void 0 : _b.forEach((_, dependencyName) => addDependency(dependencyName));
}
let dependenciesAdded = 0;
if (dependencyNames) {
const symlinkCache = hostProject.getSymlinkCache();
for (const name of arrayFrom(dependencyNames.keys())) {
if (dependencySelection === 2 /* Auto */ && dependenciesAdded > this.maxDependencies) {
hostProject.log(`AutoImportProviderProject: attempted to add more than ${this.maxDependencies} dependencies. Aborting.`);
return emptyArray;
}
const packageJson = resolvePackageNameToPackageJson(
name,
hostProject.currentDirectory,
compilerOptions,
moduleResolutionHost,
program.getModuleResolutionCache()
);
if (packageJson) {
const entrypoints = getRootNamesFromPackageJson(packageJson, program, symlinkCache);
if (entrypoints) {
rootNames = concatenate(rootNames, entrypoints);
dependenciesAdded += entrypoints.length ? 1 : 0;
continue;
}
}
const done = forEach([hostProject.currentDirectory, hostProject.getGlobalTypingsCacheLocation()], (directory) => {
if (directory) {
const typesPackageJson = resolvePackageNameToPackageJson(
`@types/${name}`,
directory,
compilerOptions,
moduleResolutionHost,
program.getModuleResolutionCache()
);
if (typesPackageJson) {
const entrypoints = getRootNamesFromPackageJson(typesPackageJson, program, symlinkCache);
rootNames = concatenate(rootNames, entrypoints);
dependenciesAdded += (entrypoints == null ? void 0 : entrypoints.length) ? 1 : 0;
return true;
}
}
});
if (done)
continue;
if (packageJson && compilerOptions.allowJs && compilerOptions.maxNodeModuleJsDepth) {
const entrypoints = getRootNamesFromPackageJson(
packageJson,
program,
symlinkCache,
/*resolveJs*/
true
);
rootNames = concatenate(rootNames, entrypoints);
dependenciesAdded += (entrypoints == null ? void 0 : entrypoints.length) ? 1 : 0;
}
}
}
if (rootNames == null ? void 0 : rootNames.length) {
hostProject.log(`AutoImportProviderProject: found ${rootNames.length} root files in ${dependenciesAdded} dependencies in ${timestamp() - start2} ms`);
}
return rootNames || emptyArray;
function addDependency(dependency) {
if (!startsWith(dependency, "@types/")) {
(dependencyNames || (dependencyNames = /* @__PURE__ */ new Set())).add(dependency);
}
}
function getRootNamesFromPackageJson(packageJson, program2, symlinkCache, resolveJs) {
var _a2;
const entrypoints = getEntrypointsFromPackageJsonInfo(
packageJson,
compilerOptions,
moduleResolutionHost,
program2.getModuleResolutionCache(),
resolveJs
);
if (entrypoints) {
const real = (_a2 = moduleResolutionHost.realpath) == null ? void 0 : _a2.call(moduleResolutionHost, packageJson.packageDirectory);
const isSymlink = real && real !== packageJson.packageDirectory;
if (isSymlink) {
symlinkCache.setSymlinkedDirectory(packageJson.packageDirectory, {
real,
realPath: hostProject.toPath(real)
});
}
return mapDefined(entrypoints, (entrypoint) => {
const resolvedFileName = isSymlink ? entrypoint.replace(packageJson.packageDirectory, real) : entrypoint;
if (!program2.getSourceFile(resolvedFileName) && !(isSymlink && program2.getSourceFile(entrypoint))) {
return resolvedFileName;
}
});
}
}
}
/** @internal */
static create(dependencySelection, hostProject, moduleResolutionHost, documentRegistry) {
if (dependencySelection === 0 /* Off */) {
return void 0;
}
const compilerOptions = {
...hostProject.getCompilerOptions(),
...this.compilerOptionsOverrides
};
const rootNames = this.getRootFileNames(dependencySelection, hostProject, moduleResolutionHost, compilerOptions);
if (!rootNames.length) {
return void 0;
}
return new _AutoImportProviderProject(hostProject, rootNames, documentRegistry, compilerOptions);
}
/** @internal */
isEmpty() {
return !some(this.rootFileNames);
}
isOrphan() {
return true;
}
updateGraph() {
let rootFileNames = this.rootFileNames;
if (!rootFileNames) {
rootFileNames = _AutoImportProviderProject.getRootFileNames(
this.hostProject.includePackageJsonAutoImports(),
this.hostProject,
this.hostProject.getModuleResolutionHostForAutoImportProvider(),
this.getCompilationSettings()
);
}
this.projectService.setFileNamesOfAutoImportProviderProject(this, rootFileNames);
this.rootFileNames = rootFileNames;
const oldProgram = this.getCurrentProgram();
const hasSameSetOfFiles = super.updateGraph();
if (oldProgram && oldProgram !== this.getCurrentProgram()) {
this.hostProject.clearCachedExportInfoMap();
}
return hasSameSetOfFiles;
}
/** @internal */
scheduleInvalidateResolutionsOfFailedLookupLocations() {
return;
}
hasRoots() {
var _a;
return !!((_a = this.rootFileNames) == null ? void 0 : _a.length);
}
markAsDirty() {
this.rootFileNames = void 0;
super.markAsDirty();
}
getScriptFileNames() {
return this.rootFileNames || emptyArray;
}
getLanguageService() {
throw new Error("AutoImportProviderProject language service should never be used. To get the program, use `project.getCurrentProgram()`.");
}
/** @internal */
onAutoImportProviderSettingsChanged() {
throw new Error("AutoImportProviderProject is an auto import provider; use `markAsDirty()` instead.");
}
/** @internal */
onPackageJsonChange() {
throw new Error("package.json changes should be notified on an AutoImportProvider's host project");
}
getModuleResolutionHostForAutoImportProvider() {
throw new Error("AutoImportProviderProject cannot provide its own host; use `hostProject.getModuleResolutionHostForAutomImportProvider()` instead.");
}
getProjectReferences() {
return this.hostProject.getProjectReferences();
}
/** @internal */
includePackageJsonAutoImports() {
return 0 /* Off */;
}
getTypeAcquisition() {
return { enable: false };
}
/** @internal */
getSymlinkCache() {
return this.hostProject.getSymlinkCache();
}
/** @internal */
getModuleResolutionCache() {
var _a;
return (_a = this.hostProject.getCurrentProgram()) == null ? void 0 : _a.getModuleResolutionCache();
}
};
var AutoImportProviderProject = _AutoImportProviderProject;
/** @internal */
AutoImportProviderProject.maxDependencies = 10;
/** @internal */
AutoImportProviderProject.compilerOptionsOverrides = {
diagnostics: false,
skipLibCheck: true,
sourceMap: false,
types: emptyArray,
lib: emptyArray,
noLib: true
};
var ConfiguredProject2 = class extends Project3 {
/** @internal */
constructor(configFileName, canonicalConfigFilePath, projectService, documentRegistry, cachedDirectoryStructureHost) {
super(
configFileName,
1 /* Configured */,
projectService,
documentRegistry,
/*hasExplicitListOfFiles*/
false,
/*lastFileExceededProgramSize*/
void 0,
/*compilerOptions*/
{},
/*compileOnSaveEnabled*/
false,
/*watchOptions*/
void 0,
cachedDirectoryStructureHost,
getDirectoryPath(configFileName)
);
this.canonicalConfigFilePath = canonicalConfigFilePath;
/** @internal */
this.openFileWatchTriggered = /* @__PURE__ */ new Map();
/** @internal */
this.canConfigFileJsonReportNoInputFiles = false;
/** Ref count to the project when opened from external project */
this.externalProjectRefCount = 0;
/** @internal */
this.isInitialLoadPending = returnTrue;
/** @internal */
this.sendLoadingProjectFinish = false;
}
/** @internal */
setCompilerHost(host) {
this.compilerHost = host;
}
/** @internal */
getCompilerHost() {
return this.compilerHost;
}
/** @internal */
useSourceOfProjectReferenceRedirect() {
return this.languageServiceEnabled;
}
/** @internal */
getParsedCommandLine(fileName) {
const configFileName = asNormalizedPath(normalizePath(fileName));
const canonicalConfigFilePath = asNormalizedPath(this.projectService.toCanonicalFileName(configFileName));
let configFileExistenceInfo = this.projectService.configFileExistenceInfoCache.get(canonicalConfigFilePath);
if (!configFileExistenceInfo) {
this.projectService.configFileExistenceInfoCache.set(canonicalConfigFilePath, configFileExistenceInfo = { exists: this.projectService.host.fileExists(configFileName) });
}
this.projectService.ensureParsedConfigUptoDate(configFileName, canonicalConfigFilePath, configFileExistenceInfo, this);
if (this.languageServiceEnabled && this.projectService.serverMode === 0 /* Semantic */) {
this.projectService.watchWildcards(configFileName, configFileExistenceInfo, this);
}
return configFileExistenceInfo.exists ? configFileExistenceInfo.config.parsedCommandLine : void 0;
}
/** @internal */
onReleaseParsedCommandLine(fileName) {
this.releaseParsedConfig(asNormalizedPath(this.projectService.toCanonicalFileName(asNormalizedPath(normalizePath(fileName)))));
}
/** @internal */
releaseParsedConfig(canonicalConfigFilePath) {
this.projectService.stopWatchingWildCards(canonicalConfigFilePath, this);
this.projectService.releaseParsedConfig(canonicalConfigFilePath, this);
}
/**
* If the project has reload from disk pending, it reloads (and then updates graph as part of that) instead of just updating the graph
* @returns: true if set of files in the project stays the same and false - otherwise.
*/
updateGraph() {
const isInitialLoad = this.isInitialLoadPending();
this.isInitialLoadPending = returnFalse;
const reloadLevel = this.pendingReload;
this.pendingReload = 0 /* None */;
let result;
switch (reloadLevel) {
case 1 /* Partial */:
this.openFileWatchTriggered.clear();
result = this.projectService.reloadFileNamesOfConfiguredProject(this);
break;
case 2 /* Full */:
this.openFileWatchTriggered.clear();
const reason = Debug.checkDefined(this.pendingReloadReason);
this.pendingReloadReason = void 0;
this.projectService.reloadConfiguredProject(
this,
reason,
isInitialLoad,
/*clearSemanticCache*/
false
);
result = true;
break;
default:
result = super.updateGraph();
}
this.compilerHost = void 0;
this.projectService.sendProjectLoadingFinishEvent(this);
this.projectService.sendProjectTelemetry(this);
return result;
}
/** @internal */
getCachedDirectoryStructureHost() {
return this.directoryStructureHost;
}
getConfigFilePath() {
return asNormalizedPath(this.getProjectName());
}
getProjectReferences() {
return this.projectReferences;
}
updateReferences(refs) {
this.projectReferences = refs;
this.potentialProjectReferences = void 0;
}
/** @internal */
setPotentialProjectReference(canonicalConfigPath) {
Debug.assert(this.isInitialLoadPending());
(this.potentialProjectReferences || (this.potentialProjectReferences = /* @__PURE__ */ new Set())).add(canonicalConfigPath);
}
/** @internal */
getResolvedProjectReferenceToRedirect(fileName) {
const program = this.getCurrentProgram();
return program && program.getResolvedProjectReferenceToRedirect(fileName);
}
/** @internal */
forEachResolvedProjectReference(cb) {
var _a;
return (_a = this.getCurrentProgram()) == null ? void 0 : _a.forEachResolvedProjectReference(cb);
}
/** @internal */
enablePluginsWithOptions(options) {
var _a;
this.plugins.length = 0;
if (!((_a = options.plugins) == null ? void 0 : _a.length) && !this.projectService.globalPlugins.length)
return;
const host = this.projectService.host;
if (!host.require && !host.importPlugin) {
this.projectService.logger.info("Plugins were requested but not running in environment that supports 'require'. Nothing will be loaded");
return;
}
const searchPaths = this.getGlobalPluginSearchPaths();
if (this.projectService.allowLocalPluginLoads) {
const local = getDirectoryPath(this.canonicalConfigFilePath);
this.projectService.logger.info(`Local plugin loading enabled; adding ${local} to search paths`);
searchPaths.unshift(local);
}
if (options.plugins) {
for (const pluginConfigEntry of options.plugins) {
this.enablePlugin(pluginConfigEntry, searchPaths);
}
}
return this.enableGlobalPlugins(options);
}
/**
* Get the errors that dont have any file name associated
*/
getGlobalProjectErrors() {
return filter(this.projectErrors, (diagnostic) => !diagnostic.file) || emptyArray2;
}
/**
* Get all the project errors
*/
getAllProjectErrors() {
return this.projectErrors || emptyArray2;
}
setProjectErrors(projectErrors) {
this.projectErrors = projectErrors;
}
close() {
this.projectService.configFileExistenceInfoCache.forEach((_configFileExistenceInfo, canonicalConfigFilePath) => this.releaseParsedConfig(canonicalConfigFilePath));
this.projectErrors = void 0;
this.openFileWatchTriggered.clear();
this.compilerHost = void 0;
super.close();
}
/** @internal */
addExternalProjectReference() {
this.externalProjectRefCount++;
}
/** @internal */
deleteExternalProjectReference() {
this.externalProjectRefCount--;
}
/** @internal */
isSolution() {
return this.getRootFilesMap().size === 0 && !this.canConfigFileJsonReportNoInputFiles;
}
/**
* Find the configured project from the project references in project which contains the info directly
*
* @internal
*/
getDefaultChildProjectFromProjectWithReferences(info) {
return forEachResolvedProjectReferenceProject(
this,
info.path,
(child) => projectContainsInfoDirectly(child, info) ? child : void 0,
0 /* Find */
);
}
/**
* Returns true if the project is needed by any of the open script info/external project
*
* @internal
*/
hasOpenRef() {
var _a;
if (!!this.externalProjectRefCount) {
return true;
}
if (this.isClosed()) {
return false;
}
const configFileExistenceInfo = this.projectService.configFileExistenceInfoCache.get(this.canonicalConfigFilePath);
if (this.projectService.hasPendingProjectUpdate(this)) {
return !!((_a = configFileExistenceInfo.openFilesImpactedByConfigFile) == null ? void 0 : _a.size);
}
return !!configFileExistenceInfo.openFilesImpactedByConfigFile && forEachEntry(
configFileExistenceInfo.openFilesImpactedByConfigFile,
(_value, infoPath) => {
const info = this.projectService.getScriptInfoForPath(infoPath);
return this.containsScriptInfo(info) || !!forEachResolvedProjectReferenceProject(
this,
info.path,
(child) => child.containsScriptInfo(info),
0 /* Find */
);
}
) || false;
}
/** @internal */
hasExternalProjectRef() {
return !!this.externalProjectRefCount;
}
getEffectiveTypeRoots() {
return getEffectiveTypeRoots(this.getCompilationSettings(), this) || [];
}
/** @internal */
updateErrorOnNoInputFiles(fileNames) {
updateErrorForNoInputFiles(fileNames, this.getConfigFilePath(), this.getCompilerOptions().configFile.configFileSpecs, this.projectErrors, this.canConfigFileJsonReportNoInputFiles);
}
};
var ExternalProject2 = class extends Project3 {
/** @internal */
constructor(externalProjectName, projectService, documentRegistry, compilerOptions, lastFileExceededProgramSize, compileOnSaveEnabled, projectFilePath, watchOptions) {
super(
externalProjectName,
2 /* External */,
projectService,
documentRegistry,
/*hasExplicitListOfFiles*/
true,
lastFileExceededProgramSize,
compilerOptions,
compileOnSaveEnabled,
watchOptions,
projectService.host,
getDirectoryPath(projectFilePath || normalizeSlashes(externalProjectName))
);
this.externalProjectName = externalProjectName;
this.compileOnSaveEnabled = compileOnSaveEnabled;
this.excludedFiles = [];
this.enableGlobalPlugins(this.getCompilerOptions());
}
updateGraph() {
const result = super.updateGraph();
this.projectService.sendProjectTelemetry(this);
return result;
}
getExcludedFiles() {
return this.excludedFiles;
}
};
function isInferredProject(project) {
return project.projectKind === 0 /* Inferred */;
}
function isConfiguredProject(project) {
return project.projectKind === 1 /* Configured */;
}
function isExternalProject(project) {
return project.projectKind === 2 /* External */;
}
// src/server/editorServices.ts
var maxProgramSizeForNonTsFiles = 20 * 1024 * 1024;
var maxFileSize = 4 * 1024 * 1024;
var ProjectsUpdatedInBackgroundEvent = "projectsUpdatedInBackground";
var ProjectLoadingStartEvent = "projectLoadingStart";
var ProjectLoadingFinishEvent = "projectLoadingFinish";
var LargeFileReferencedEvent = "largeFileReferenced";
var ConfigFileDiagEvent = "configFileDiag";
var ProjectLanguageServiceStateEvent = "projectLanguageServiceState";
var ProjectInfoTelemetryEvent = "projectInfo";
var OpenFileInfoTelemetryEvent = "openFileInfo";
var ensureProjectForOpenFileSchedule = "*ensureProjectForOpenFiles*";
function prepareConvertersForEnumLikeCompilerOptions(commandLineOptions) {
const map2 = /* @__PURE__ */ new Map();
for (const option of commandLineOptions) {
if (typeof option.type === "object") {
const optionMap = option.type;
optionMap.forEach((value) => {
Debug.assert(typeof value === "number");
});
map2.set(option.name, optionMap);
}
}
return map2;
}
var compilerOptionConverters = prepareConvertersForEnumLikeCompilerOptions(optionDeclarations);
var watchOptionsConverters = prepareConvertersForEnumLikeCompilerOptions(optionsForWatch);
var indentStyle = new Map(Object.entries({
none: 0 /* None */,
block: 1 /* Block */,
smart: 2 /* Smart */
}));
var defaultTypeSafeList = {
"jquery": {
// jquery files can have names like "jquery-1.10.2.min.js" (or "jquery.intellisense.js")
match: /jquery(-[\d\.]+)?(\.intellisense)?(\.min)?\.js$/i,
types: ["jquery"]
},
"WinJS": {
// e.g. c:/temp/UWApp1/lib/winjs-4.0.1/js/base.js
match: /^(.*\/winjs-[.\d]+)\/js\/base\.js$/i,
// If the winjs/base.js file is found..
exclude: [["^", 1, "/.*"]],
// ..then exclude all files under the winjs folder
types: ["winjs"]
// And fetch the @types package for WinJS
},
"Kendo": {
// e.g. /Kendo3/wwwroot/lib/kendo/kendo.all.min.js
match: /^(.*\/kendo(-ui)?)\/kendo\.all(\.min)?\.js$/i,
exclude: [["^", 1, "/.*"]],
types: ["kendo-ui"]
},
"Office Nuget": {
// e.g. /scripts/Office/1/excel-15.debug.js
match: /^(.*\/office\/1)\/excel-\d+\.debug\.js$/i,
// Office NuGet package is installed under a "1/office" folder
exclude: [["^", 1, "/.*"]],
// Exclude that whole folder if the file indicated above is found in it
types: ["office"]
// @types package to fetch instead
},
"References": {
match: /^(.*\/_references\.js)$/i,
exclude: [["^", 1, "$"]]
}
};
function convertFormatOptions(protocolOptions) {
if (isString(protocolOptions.indentStyle)) {
protocolOptions.indentStyle = indentStyle.get(protocolOptions.indentStyle.toLowerCase());
Debug.assert(protocolOptions.indentStyle !== void 0);
}
return protocolOptions;
}
function convertCompilerOptions(protocolOptions) {
compilerOptionConverters.forEach((mappedValues, id) => {
const propertyValue = protocolOptions[id];
if (isString(propertyValue)) {
protocolOptions[id] = mappedValues.get(propertyValue.toLowerCase());
}
});
return protocolOptions;
}
function convertWatchOptions(protocolOptions, currentDirectory) {
let watchOptions;
let errors;
optionsForWatch.forEach((option) => {
const propertyValue = protocolOptions[option.name];
if (propertyValue === void 0)
return;
const mappedValues = watchOptionsConverters.get(option.name);
(watchOptions || (watchOptions = {}))[option.name] = mappedValues ? isString(propertyValue) ? mappedValues.get(propertyValue.toLowerCase()) : propertyValue : convertJsonOption(option, propertyValue, currentDirectory || "", errors || (errors = []));
});
return watchOptions && { watchOptions, errors };
}
function convertTypeAcquisition(protocolOptions) {
let result;
typeAcquisitionDeclarations.forEach((option) => {
const propertyValue = protocolOptions[option.name];
if (propertyValue === void 0)
return;
(result || (result = {}))[option.name] = propertyValue;
});
return result;
}
function tryConvertScriptKindName(scriptKindName) {
return isString(scriptKindName) ? convertScriptKindName(scriptKindName) : scriptKindName;
}
function convertScriptKindName(scriptKindName) {
switch (scriptKindName) {
case "JS":
return 1 /* JS */;
case "JSX":
return 2 /* JSX */;
case "TS":
return 3 /* TS */;
case "TSX":
return 4 /* TSX */;
default:
return 0 /* Unknown */;
}
}
function convertUserPreferences(preferences) {
const { lazyConfiguredProjectsFromExternalProject, ...userPreferences } = preferences;
return userPreferences;
}
var fileNamePropertyReader = {
getFileName: (x) => x,
getScriptKind: (fileName, extraFileExtensions) => {
let result;
if (extraFileExtensions) {
const fileExtension = getAnyExtensionFromPath(fileName);
if (fileExtension) {
some(extraFileExtensions, (info) => {
if (info.extension === fileExtension) {
result = info.scriptKind;
return true;
}
return false;
});
}
}
return result;
},
hasMixedContent: (fileName, extraFileExtensions) => some(extraFileExtensions, (ext) => ext.isMixedContent && fileExtensionIs(fileName, ext.extension))
};
var externalFilePropertyReader = {
getFileName: (x) => x.fileName,
getScriptKind: (x) => tryConvertScriptKindName(x.scriptKind),
// TODO: GH#18217
hasMixedContent: (x) => !!x.hasMixedContent
};
function findProjectByName(projectName, projects) {
for (const proj of projects) {
if (proj.getProjectName() === projectName) {
return proj;
}
}
}
var noopConfigFileWatcher = { close: noop };
function isOpenScriptInfo(infoOrFileNameOrConfig) {
return !!infoOrFileNameOrConfig.containingProjects;
}
function isAncestorConfigFileInfo(infoOrFileNameOrConfig) {
return !!infoOrFileNameOrConfig.configFileInfo;
}
var ProjectReferenceProjectLoadKind = /* @__PURE__ */ ((ProjectReferenceProjectLoadKind2) => {
ProjectReferenceProjectLoadKind2[ProjectReferenceProjectLoadKind2["Find"] = 0] = "Find";
ProjectReferenceProjectLoadKind2[ProjectReferenceProjectLoadKind2["FindCreate"] = 1] = "FindCreate";
ProjectReferenceProjectLoadKind2[ProjectReferenceProjectLoadKind2["FindCreateLoad"] = 2] = "FindCreateLoad";
return ProjectReferenceProjectLoadKind2;
})(ProjectReferenceProjectLoadKind || {});
function forEachResolvedProjectReferenceProject(project, fileName, cb, projectReferenceProjectLoadKind, reason) {
var _a;
const resolvedRefs = (_a = project.getCurrentProgram()) == null ? void 0 : _a.getResolvedProjectReferences();
if (!resolvedRefs)
return void 0;
let seenResolvedRefs;
const possibleDefaultRef = fileName ? project.getResolvedProjectReferenceToRedirect(fileName) : void 0;
if (possibleDefaultRef) {
const configFileName = toNormalizedPath(possibleDefaultRef.sourceFile.fileName);
const child = project.projectService.findConfiguredProjectByProjectName(configFileName);
if (child) {
const result = cb(child);
if (result)
return result;
} else if (projectReferenceProjectLoadKind !== 0 /* Find */) {
seenResolvedRefs = /* @__PURE__ */ new Map();
const result = forEachResolvedProjectReferenceProjectWorker(
resolvedRefs,
project.getCompilerOptions(),
(ref, loadKind) => possibleDefaultRef === ref ? callback(ref, loadKind) : void 0,
projectReferenceProjectLoadKind,
project.projectService,
seenResolvedRefs
);
if (result)
return result;
seenResolvedRefs.clear();
}
}
return forEachResolvedProjectReferenceProjectWorker(
resolvedRefs,
project.getCompilerOptions(),
(ref, loadKind) => possibleDefaultRef !== ref ? callback(ref, loadKind) : void 0,
projectReferenceProjectLoadKind,
project.projectService,
seenResolvedRefs
);
function callback(ref, loadKind) {
const configFileName = toNormalizedPath(ref.sourceFile.fileName);
const child = project.projectService.findConfiguredProjectByProjectName(configFileName) || (loadKind === 0 /* Find */ ? void 0 : loadKind === 1 /* FindCreate */ ? project.projectService.createConfiguredProject(configFileName) : loadKind === 2 /* FindCreateLoad */ ? project.projectService.createAndLoadConfiguredProject(configFileName, reason) : Debug.assertNever(loadKind));
return child && cb(child);
}
}
function forEachResolvedProjectReferenceProjectWorker(resolvedProjectReferences, parentOptions, cb, projectReferenceProjectLoadKind, projectService, seenResolvedRefs) {
const loadKind = parentOptions.disableReferencedProjectLoad ? 0 /* Find */ : projectReferenceProjectLoadKind;
return forEach(resolvedProjectReferences, (ref) => {
if (!ref)
return void 0;
const configFileName = toNormalizedPath(ref.sourceFile.fileName);
const canonicalPath = projectService.toCanonicalFileName(configFileName);
const seenValue = seenResolvedRefs == null ? void 0 : seenResolvedRefs.get(canonicalPath);
if (seenValue !== void 0 && seenValue >= loadKind) {
return void 0;
}
const result = cb(ref, loadKind);
if (result) {
return result;
}
(seenResolvedRefs || (seenResolvedRefs = /* @__PURE__ */ new Map())).set(canonicalPath, loadKind);
return ref.references && forEachResolvedProjectReferenceProjectWorker(ref.references, ref.commandLine.options, cb, loadKind, projectService, seenResolvedRefs);
});
}
function forEachPotentialProjectReference(project, cb) {
return project.potentialProjectReferences && forEachKey(project.potentialProjectReferences, cb);
}
function forEachAnyProjectReferenceKind(project, cb, cbProjectRef, cbPotentialProjectRef) {
return project.getCurrentProgram() ? project.forEachResolvedProjectReference(cb) : project.isInitialLoadPending() ? forEachPotentialProjectReference(project, cbPotentialProjectRef) : forEach(project.getProjectReferences(), cbProjectRef);
}
function callbackRefProject(project, cb, refPath) {
const refProject = refPath && project.projectService.configuredProjects.get(refPath);
return refProject && cb(refProject);
}
function forEachReferencedProject(project, cb) {
return forEachAnyProjectReferenceKind(
project,
(resolvedRef) => callbackRefProject(project, cb, resolvedRef.sourceFile.path),
(projectRef) => callbackRefProject(project, cb, project.toPath(resolveProjectReferencePath(projectRef))),
(potentialProjectRef) => callbackRefProject(project, cb, potentialProjectRef)
);
}
function getDetailWatchInfo(watchType, project) {
return `${isString(project) ? `Config: ${project} ` : project ? `Project: ${project.getProjectName()} ` : ""}WatchType: ${watchType}`;
}
function isScriptInfoWatchedFromNodeModules(info) {
return !info.isScriptOpen() && info.mTime !== void 0;
}
function projectContainsInfoDirectly(project, info) {
return project.containsScriptInfo(info) && !project.isSourceOfProjectReferenceRedirect(info.path);
}
function updateProjectIfDirty(project) {
project.invalidateResolutionsOfFailedLookupLocations();
return project.dirty && project.updateGraph();
}
function setProjectOptionsUsed(project) {
if (isConfiguredProject(project)) {
project.projectOptions = true;
}
}
function createProjectNameFactoryWithCounter(nameFactory) {
let nextId = 1;
return () => nameFactory(nextId++);
}
var _ProjectService = class {
constructor(opts) {
/**
* Container of all known scripts
*
* @internal
*/
this.filenameToScriptInfo = /* @__PURE__ */ new Map();
this.nodeModulesWatchers = /* @__PURE__ */ new Map();
/**
* Contains all the deleted script info's version information so that
* it does not reset when creating script info again
* (and could have potentially collided with version where contents mismatch)
*/
this.filenameToScriptInfoVersion = /* @__PURE__ */ new Map();
// Set of all '.js' files ever opened.
this.allJsFilesForOpenFileTelemetry = /* @__PURE__ */ new Map();
/**
* maps external project file name to list of config files that were the part of this project
*/
this.externalProjectToConfiguredProjectMap = /* @__PURE__ */ new Map();
/**
* external projects (configuration and list of root files is not controlled by tsserver)
*/
this.externalProjects = [];
/**
* projects built from openFileRoots
*/
this.inferredProjects = [];
/**
* projects specified by a tsconfig.json file
*/
this.configuredProjects = /* @__PURE__ */ new Map();
/** @internal */
this.newInferredProjectName = createProjectNameFactoryWithCounter(makeInferredProjectName);
/** @internal */
this.newAutoImportProviderProjectName = createProjectNameFactoryWithCounter(makeAutoImportProviderProjectName);
/** @internal */
this.newAuxiliaryProjectName = createProjectNameFactoryWithCounter(makeAuxiliaryProjectName);
/**
* Open files: with value being project root path, and key being Path of the file that is open
*/
this.openFiles = /* @__PURE__ */ new Map();
/** @internal */
this.configFileForOpenFiles = /* @__PURE__ */ new Map();
/**
* Map of open files that are opened without complete path but have projectRoot as current directory
*/
this.openFilesWithNonRootedDiskPath = /* @__PURE__ */ new Map();
this.compilerOptionsForInferredProjectsPerProjectRoot = /* @__PURE__ */ new Map();
this.watchOptionsForInferredProjectsPerProjectRoot = /* @__PURE__ */ new Map();
this.typeAcquisitionForInferredProjectsPerProjectRoot = /* @__PURE__ */ new Map();
/**
* Project size for configured or external projects
*/
this.projectToSizeMap = /* @__PURE__ */ new Map();
/**
* This is a map of config file paths existence that doesnt need query to disk
* - The entry can be present because there is inferred project that needs to watch addition of config file to directory
* In this case the exists could be true/false based on config file is present or not
* - Or it is present if we have configured project open with config file at that location
* In this case the exists property is always true
*
*
* @internal
*/
this.configFileExistenceInfoCache = /* @__PURE__ */ new Map();
this.safelist = defaultTypeSafeList;
this.legacySafelist = /* @__PURE__ */ new Map();
this.pendingProjectUpdates = /* @__PURE__ */ new Map();
/** @internal */
this.pendingEnsureProjectForOpenFiles = false;
/** Tracks projects that we have already sent telemetry for. */
this.seenProjects = /* @__PURE__ */ new Map();
/** @internal */
this.sharedExtendedConfigFileWatchers = /* @__PURE__ */ new Map();
/** @internal */
this.extendedConfigCache = /* @__PURE__ */ new Map();
this.host = opts.host;
this.logger = opts.logger;
this.cancellationToken = opts.cancellationToken;
this.useSingleInferredProject = opts.useSingleInferredProject;
this.useInferredProjectPerProjectRoot = opts.useInferredProjectPerProjectRoot;
this.typingsInstaller = opts.typingsInstaller || nullTypingsInstaller;
this.throttleWaitMilliseconds = opts.throttleWaitMilliseconds;
this.eventHandler = opts.eventHandler;
this.suppressDiagnosticEvents = opts.suppressDiagnosticEvents;
this.globalPlugins = opts.globalPlugins || emptyArray2;
this.pluginProbeLocations = opts.pluginProbeLocations || emptyArray2;
this.allowLocalPluginLoads = !!opts.allowLocalPluginLoads;
this.typesMapLocation = opts.typesMapLocation === void 0 ? combinePaths(getDirectoryPath(this.getExecutingFilePath()), "typesMap.json") : opts.typesMapLocation;
this.session = opts.session;
if (opts.serverMode !== void 0) {
this.serverMode = opts.serverMode;
} else {
this.serverMode = 0 /* Semantic */;
}
if (this.host.realpath) {
this.realpathToScriptInfos = createMultiMap();
}
this.currentDirectory = toNormalizedPath(this.host.getCurrentDirectory());
this.toCanonicalFileName = createGetCanonicalFileName(this.host.useCaseSensitiveFileNames);
this.globalCacheLocationDirectoryPath = this.typingsInstaller.globalTypingsCacheLocation ? ensureTrailingDirectorySeparator(this.toPath(this.typingsInstaller.globalTypingsCacheLocation)) : void 0;
this.throttledOperations = new ThrottledOperations(this.host, this.logger);
if (this.typesMapLocation) {
this.loadTypesMap();
} else {
this.logger.info("No types map provided; using the default");
}
this.typingsInstaller.attach(this);
this.typingsCache = new TypingsCache(this.typingsInstaller);
this.hostConfiguration = {
formatCodeOptions: getDefaultFormatCodeSettings(this.host.newLine),
preferences: emptyOptions,
hostInfo: "Unknown host",
extraFileExtensions: []
};
this.documentRegistry = createDocumentRegistryInternal(this.host.useCaseSensitiveFileNames, this.currentDirectory, this);
const watchLogLevel = this.logger.hasLevel(3 /* verbose */) ? 2 /* Verbose */ : this.logger.loggingEnabled() ? 1 /* TriggerOnly */ : 0 /* None */;
const log = watchLogLevel !== 0 /* None */ ? (s) => this.logger.info(s) : noop;
this.packageJsonCache = createPackageJsonCache(this);
this.watchFactory = this.serverMode !== 0 /* Semantic */ ? {
watchFile: returnNoopFileWatcher,
watchDirectory: returnNoopFileWatcher
} : getWatchFactory(this.host, watchLogLevel, log, getDetailWatchInfo);
}
toPath(fileName) {
return toPath(fileName, this.currentDirectory, this.toCanonicalFileName);
}
/** @internal */
getExecutingFilePath() {
return this.getNormalizedAbsolutePath(this.host.getExecutingFilePath());
}
/** @internal */
getNormalizedAbsolutePath(fileName) {
return getNormalizedAbsolutePath(fileName, this.host.getCurrentDirectory());
}
/** @internal */
setDocument(key, path, sourceFile) {
const info = Debug.checkDefined(this.getScriptInfoForPath(path));
info.cacheSourceFile = { key, sourceFile };
}
/** @internal */
getDocument(key, path) {
const info = this.getScriptInfoForPath(path);
return info && info.cacheSourceFile && info.cacheSourceFile.key === key ? info.cacheSourceFile.sourceFile : void 0;
}
/** @internal */
ensureInferredProjectsUpToDate_TestOnly() {
this.ensureProjectStructuresUptoDate();
}
/** @internal */
getCompilerOptionsForInferredProjects() {
return this.compilerOptionsForInferredProjects;
}
/** @internal */
onUpdateLanguageServiceStateForProject(project, languageServiceEnabled) {
if (!this.eventHandler) {
return;
}
const event = {
eventName: ProjectLanguageServiceStateEvent,
data: { project, languageServiceEnabled }
};
this.eventHandler(event);
}
loadTypesMap() {
try {
const fileContent = this.host.readFile(this.typesMapLocation);
if (fileContent === void 0) {
this.logger.info(`Provided types map file "${this.typesMapLocation}" doesn't exist`);
return;
}
const raw = JSON.parse(fileContent);
for (const k of Object.keys(raw.typesMap)) {
raw.typesMap[k].match = new RegExp(raw.typesMap[k].match, "i");
}
this.safelist = raw.typesMap;
for (const key in raw.simpleMap) {
if (hasProperty(raw.simpleMap, key)) {
this.legacySafelist.set(key, raw.simpleMap[key].toLowerCase());
}
}
} catch (e) {
this.logger.info(`Error loading types map: ${e}`);
this.safelist = defaultTypeSafeList;
this.legacySafelist.clear();
}
}
// eslint-disable-line @typescript-eslint/unified-signatures
updateTypingsForProject(response) {
const project = this.findProject(response.projectName);
if (!project) {
return;
}
switch (response.kind) {
case ActionSet:
project.updateTypingFiles(this.typingsCache.updateTypingsForProject(response.projectName, response.compilerOptions, response.typeAcquisition, response.unresolvedImports, response.typings));
return;
case ActionInvalidate:
this.typingsCache.enqueueInstallTypingsForProject(
project,
project.lastCachedUnresolvedImportsList,
/*forceRefresh*/
true
);
return;
}
}
/** @internal */
watchTypingLocations(response) {
var _a;
(_a = this.findProject(response.projectName)) == null ? void 0 : _a.watchTypingLocations(response.files);
}
/** @internal */
delayEnsureProjectForOpenFiles() {
if (!this.openFiles.size)
return;
this.pendingEnsureProjectForOpenFiles = true;
this.throttledOperations.schedule(
ensureProjectForOpenFileSchedule,
/*delay*/
2500,
() => {
if (this.pendingProjectUpdates.size !== 0) {
this.delayEnsureProjectForOpenFiles();
} else {
if (this.pendingEnsureProjectForOpenFiles) {
this.ensureProjectForOpenFiles();
this.sendProjectsUpdatedInBackgroundEvent();
}
}
}
);
}
delayUpdateProjectGraph(project) {
project.markAsDirty();
if (project.projectKind !== 3 /* AutoImportProvider */ && project.projectKind !== 4 /* Auxiliary */) {
const projectName = project.getProjectName();
this.pendingProjectUpdates.set(projectName, project);
this.throttledOperations.schedule(
projectName,
/*delay*/
250,
() => {
if (this.pendingProjectUpdates.delete(projectName)) {
updateProjectIfDirty(project);
}
}
);
}
}
/** @internal */
hasPendingProjectUpdate(project) {
return this.pendingProjectUpdates.has(project.getProjectName());
}
/** @internal */
sendProjectsUpdatedInBackgroundEvent() {
if (!this.eventHandler) {
return;
}
const event = {
eventName: ProjectsUpdatedInBackgroundEvent,
data: {
openFiles: arrayFrom(this.openFiles.keys(), (path) => this.getScriptInfoForPath(path).fileName)
}
};
this.eventHandler(event);
}
/** @internal */
sendLargeFileReferencedEvent(file, fileSize) {
if (!this.eventHandler) {
return;
}
const event = {
eventName: LargeFileReferencedEvent,
data: { file, fileSize, maxFileSize }
};
this.eventHandler(event);
}
/** @internal */
sendProjectLoadingStartEvent(project, reason) {
if (!this.eventHandler) {
return;
}
project.sendLoadingProjectFinish = true;
const event = {
eventName: ProjectLoadingStartEvent,
data: { project, reason }
};
this.eventHandler(event);
}
/** @internal */
sendProjectLoadingFinishEvent(project) {
if (!this.eventHandler || !project.sendLoadingProjectFinish) {
return;
}
project.sendLoadingProjectFinish = false;
const event = {
eventName: ProjectLoadingFinishEvent,
data: { project }
};
this.eventHandler(event);
}
/** @internal */
sendPerformanceEvent(kind, durationMs) {
if (this.performanceEventHandler) {
this.performanceEventHandler({ kind, durationMs });
}
}
/** @internal */
delayUpdateProjectGraphAndEnsureProjectStructureForOpenFiles(project) {
this.delayUpdateProjectGraph(project);
this.delayEnsureProjectForOpenFiles();
}
delayUpdateProjectGraphs(projects, clearSourceMapperCache) {
if (projects.length) {
for (const project of projects) {
if (clearSourceMapperCache)
project.clearSourceMapperCache();
this.delayUpdateProjectGraph(project);
}
this.delayEnsureProjectForOpenFiles();
}
}
setCompilerOptionsForInferredProjects(projectCompilerOptions, projectRootPath) {
Debug.assert(projectRootPath === void 0 || this.useInferredProjectPerProjectRoot, "Setting compiler options per project root path is only supported when useInferredProjectPerProjectRoot is enabled");
const compilerOptions = convertCompilerOptions(projectCompilerOptions);
const watchOptions = convertWatchOptions(projectCompilerOptions, projectRootPath);
const typeAcquisition = convertTypeAcquisition(projectCompilerOptions);
compilerOptions.allowNonTsExtensions = true;
const canonicalProjectRootPath = projectRootPath && this.toCanonicalFileName(projectRootPath);
if (canonicalProjectRootPath) {
this.compilerOptionsForInferredProjectsPerProjectRoot.set(canonicalProjectRootPath, compilerOptions);
this.watchOptionsForInferredProjectsPerProjectRoot.set(canonicalProjectRootPath, watchOptions || false);
this.typeAcquisitionForInferredProjectsPerProjectRoot.set(canonicalProjectRootPath, typeAcquisition);
} else {
this.compilerOptionsForInferredProjects = compilerOptions;
this.watchOptionsForInferredProjects = watchOptions;
this.typeAcquisitionForInferredProjects = typeAcquisition;
}
for (const project of this.inferredProjects) {
if (canonicalProjectRootPath ? project.projectRootPath === canonicalProjectRootPath : !project.projectRootPath || !this.compilerOptionsForInferredProjectsPerProjectRoot.has(project.projectRootPath)) {
project.setCompilerOptions(compilerOptions);
project.setTypeAcquisition(typeAcquisition);
project.setWatchOptions(watchOptions == null ? void 0 : watchOptions.watchOptions);
project.setProjectErrors(watchOptions == null ? void 0 : watchOptions.errors);
project.compileOnSaveEnabled = compilerOptions.compileOnSave;
project.markAsDirty();
this.delayUpdateProjectGraph(project);
}
}
this.delayEnsureProjectForOpenFiles();
}
findProject(projectName) {
if (projectName === void 0) {
return void 0;
}
if (isInferredProjectName(projectName)) {
return findProjectByName(projectName, this.inferredProjects);
}
return this.findExternalProjectByProjectName(projectName) || this.findConfiguredProjectByProjectName(toNormalizedPath(projectName));
}
/** @internal */
forEachProject(cb) {
this.externalProjects.forEach(cb);
this.configuredProjects.forEach(cb);
this.inferredProjects.forEach(cb);
}
/** @internal */
forEachEnabledProject(cb) {
this.forEachProject((project) => {
if (!project.isOrphan() && project.languageServiceEnabled) {
cb(project);
}
});
}
getDefaultProjectForFile(fileName, ensureProject) {
return ensureProject ? this.ensureDefaultProjectForFile(fileName) : this.tryGetDefaultProjectForFile(fileName);
}
/** @internal */
tryGetDefaultProjectForFile(fileNameOrScriptInfo) {
const scriptInfo = isString(fileNameOrScriptInfo) ? this.getScriptInfoForNormalizedPath(fileNameOrScriptInfo) : fileNameOrScriptInfo;
return scriptInfo && !scriptInfo.isOrphan() ? scriptInfo.getDefaultProject() : void 0;
}
/** @internal */
ensureDefaultProjectForFile(fileNameOrScriptInfo) {
return this.tryGetDefaultProjectForFile(fileNameOrScriptInfo) || this.doEnsureDefaultProjectForFile(fileNameOrScriptInfo);
}
doEnsureDefaultProjectForFile(fileNameOrScriptInfo) {
this.ensureProjectStructuresUptoDate();
const scriptInfo = isString(fileNameOrScriptInfo) ? this.getScriptInfoForNormalizedPath(fileNameOrScriptInfo) : fileNameOrScriptInfo;
return scriptInfo ? scriptInfo.getDefaultProject() : (this.logErrorForScriptInfoNotFound(isString(fileNameOrScriptInfo) ? fileNameOrScriptInfo : fileNameOrScriptInfo.fileName), Errors.ThrowNoProject());
}
getScriptInfoEnsuringProjectsUptoDate(uncheckedFileName) {
this.ensureProjectStructuresUptoDate();
return this.getScriptInfo(uncheckedFileName);
}
/**
* Ensures the project structures are upto date
* This means,
* - we go through all the projects and update them if they are dirty
* - if updates reflect some change in structure or there was pending request to ensure projects for open files
* ensure that each open script info has project
*/
ensureProjectStructuresUptoDate() {
let hasChanges = this.pendingEnsureProjectForOpenFiles;
this.pendingProjectUpdates.clear();
const updateGraph = (project) => {
hasChanges = updateProjectIfDirty(project) || hasChanges;
};
this.externalProjects.forEach(updateGraph);
this.configuredProjects.forEach(updateGraph);
this.inferredProjects.forEach(updateGraph);
if (hasChanges) {
this.ensureProjectForOpenFiles();
}
}
getFormatCodeOptions(file) {
const info = this.getScriptInfoForNormalizedPath(file);
return info && info.getFormatCodeSettings() || this.hostConfiguration.formatCodeOptions;
}
getPreferences(file) {
const info = this.getScriptInfoForNormalizedPath(file);
return { ...this.hostConfiguration.preferences, ...info && info.getPreferences() };
}
getHostFormatCodeOptions() {
return this.hostConfiguration.formatCodeOptions;
}
getHostPreferences() {
return this.hostConfiguration.preferences;
}
onSourceFileChanged(info, eventKind) {
if (eventKind === 2 /* Deleted */) {
this.handleDeletedFile(info);
} else if (!info.isScriptOpen()) {
info.delayReloadNonMixedContentFile();
this.delayUpdateProjectGraphs(
info.containingProjects,
/*clearSourceMapperCache*/
false
);
this.handleSourceMapProjects(info);
}
}
handleSourceMapProjects(info) {
if (info.sourceMapFilePath) {
if (isString(info.sourceMapFilePath)) {
const sourceMapFileInfo = this.getScriptInfoForPath(info.sourceMapFilePath);
this.delayUpdateSourceInfoProjects(sourceMapFileInfo && sourceMapFileInfo.sourceInfos);
} else {
this.delayUpdateSourceInfoProjects(info.sourceMapFilePath.sourceInfos);
}
}
this.delayUpdateSourceInfoProjects(info.sourceInfos);
if (info.declarationInfoPath) {
this.delayUpdateProjectsOfScriptInfoPath(info.declarationInfoPath);
}
}
delayUpdateSourceInfoProjects(sourceInfos) {
if (sourceInfos) {
sourceInfos.forEach((_value, path) => this.delayUpdateProjectsOfScriptInfoPath(path));
}
}
delayUpdateProjectsOfScriptInfoPath(path) {
const info = this.getScriptInfoForPath(path);
if (info) {
this.delayUpdateProjectGraphs(
info.containingProjects,
/*clearSourceMapperCache*/
true
);
}
}
handleDeletedFile(info) {
this.stopWatchingScriptInfo(info);
if (!info.isScriptOpen()) {
this.deleteScriptInfo(info);
const containingProjects = info.containingProjects.slice();
info.detachAllProjects();
this.delayUpdateProjectGraphs(
containingProjects,
/*clearSourceMapperCache*/
false
);
this.handleSourceMapProjects(info);
info.closeSourceMapFileWatcher();
if (info.declarationInfoPath) {
const declarationInfo = this.getScriptInfoForPath(info.declarationInfoPath);
if (declarationInfo) {
declarationInfo.sourceMapFilePath = void 0;
}
}
}
}
/**
* This is to watch whenever files are added or removed to the wildcard directories
*
* @internal
*/
watchWildcardDirectory(directory, flags, configFileName, config) {
return this.watchFactory.watchDirectory(
directory,
(fileOrDirectory) => {
const fileOrDirectoryPath = this.toPath(fileOrDirectory);
const fsResult = config.cachedDirectoryStructureHost.addOrDeleteFileOrDirectory(fileOrDirectory, fileOrDirectoryPath);
if (getBaseFileName(fileOrDirectoryPath) === "package.json" && !isInsideNodeModules(fileOrDirectoryPath) && (fsResult && fsResult.fileExists || !fsResult && this.host.fileExists(fileOrDirectoryPath))) {
this.logger.info(`Config: ${configFileName} Detected new package.json: ${fileOrDirectory}`);
this.onAddPackageJson(fileOrDirectoryPath);
}
const configuredProjectForConfig = this.findConfiguredProjectByProjectName(configFileName);
if (isIgnoredFileFromWildCardWatching({
watchedDirPath: directory,
fileOrDirectory,
fileOrDirectoryPath,
configFileName,
extraFileExtensions: this.hostConfiguration.extraFileExtensions,
currentDirectory: this.currentDirectory,
options: config.parsedCommandLine.options,
program: (configuredProjectForConfig == null ? void 0 : configuredProjectForConfig.getCurrentProgram()) || config.parsedCommandLine.fileNames,
useCaseSensitiveFileNames: this.host.useCaseSensitiveFileNames,
writeLog: (s) => this.logger.info(s),
toPath: (s) => this.toPath(s)
}))
return;
if (config.reloadLevel !== 2 /* Full */)
config.reloadLevel = 1 /* Partial */;
config.projects.forEach((watchWildcardDirectories, projectCanonicalPath) => {
if (!watchWildcardDirectories)
return;
const project = this.getConfiguredProjectByCanonicalConfigFilePath(projectCanonicalPath);
if (!project)
return;
const reloadLevel = configuredProjectForConfig === project ? 1 /* Partial */ : 0 /* None */;
if (project.pendingReload !== void 0 && project.pendingReload > reloadLevel)
return;
if (this.openFiles.has(fileOrDirectoryPath)) {
const info = Debug.checkDefined(this.getScriptInfoForPath(fileOrDirectoryPath));
if (info.isAttached(project)) {
const loadLevelToSet = Math.max(reloadLevel, project.openFileWatchTriggered.get(fileOrDirectoryPath) || 0 /* None */);
project.openFileWatchTriggered.set(fileOrDirectoryPath, loadLevelToSet);
} else {
project.pendingReload = reloadLevel;
this.delayUpdateProjectGraphAndEnsureProjectStructureForOpenFiles(project);
}
} else {
project.pendingReload = reloadLevel;
this.delayUpdateProjectGraphAndEnsureProjectStructureForOpenFiles(project);
}
});
},
flags,
this.getWatchOptionsFromProjectWatchOptions(config.parsedCommandLine.watchOptions),
WatchType.WildcardDirectory,
configFileName
);
}
/** @internal */
delayUpdateProjectsFromParsedConfigOnConfigFileChange(canonicalConfigFilePath, reloadReason) {
const configFileExistenceInfo = this.configFileExistenceInfoCache.get(canonicalConfigFilePath);
if (!(configFileExistenceInfo == null ? void 0 : configFileExistenceInfo.config))
return false;
let scheduledAnyProjectUpdate = false;
configFileExistenceInfo.config.reloadLevel = 2 /* Full */;
configFileExistenceInfo.config.projects.forEach((_watchWildcardDirectories, projectCanonicalPath) => {
const project = this.getConfiguredProjectByCanonicalConfigFilePath(projectCanonicalPath);
if (!project)
return;
scheduledAnyProjectUpdate = true;
if (projectCanonicalPath === canonicalConfigFilePath) {
if (project.isInitialLoadPending())
return;
project.pendingReload = 2 /* Full */;
project.pendingReloadReason = reloadReason;
this.delayUpdateProjectGraph(project);
} else {
project.resolutionCache.removeResolutionsFromProjectReferenceRedirects(this.toPath(canonicalConfigFilePath));
this.delayUpdateProjectGraph(project);
}
});
return scheduledAnyProjectUpdate;
}
/** @internal */
onConfigFileChanged(canonicalConfigFilePath, eventKind) {
var _a;
const configFileExistenceInfo = this.configFileExistenceInfoCache.get(canonicalConfigFilePath);
if (eventKind === 2 /* Deleted */) {
configFileExistenceInfo.exists = false;
const project = ((_a = configFileExistenceInfo.config) == null ? void 0 : _a.projects.has(canonicalConfigFilePath)) ? this.getConfiguredProjectByCanonicalConfigFilePath(canonicalConfigFilePath) : void 0;
if (project)
this.removeProject(project);
} else {
configFileExistenceInfo.exists = true;
}
this.delayUpdateProjectsFromParsedConfigOnConfigFileChange(canonicalConfigFilePath, "Change in config file detected");
this.reloadConfiguredProjectForFiles(
configFileExistenceInfo.openFilesImpactedByConfigFile,
/*clearSemanticCache*/
false,
/*delayReload*/
true,
eventKind !== 2 /* Deleted */ ? identity : (
// Reload open files if they are root of inferred project
returnTrue
),
// Reload all the open files impacted by config file
"Change in config file detected"
);
this.delayEnsureProjectForOpenFiles();
}
removeProject(project) {
this.logger.info("`remove Project::");
project.print(
/*writeProjectFileNames*/
true,
/*writeFileExplaination*/
true,
/*writeFileVersionAndText*/
false
);
project.close();
if (Debug.shouldAssert(1 /* Normal */)) {
this.filenameToScriptInfo.forEach((info) => Debug.assert(
!info.isAttached(project),
"Found script Info still attached to project",
() => `${project.projectName}: ScriptInfos still attached: ${JSON.stringify(
arrayFrom(
mapDefinedIterator(
this.filenameToScriptInfo.values(),
(info2) => info2.isAttached(project) ? {
fileName: info2.fileName,
projects: info2.containingProjects.map((p) => p.projectName),
hasMixedContent: info2.hasMixedContent
} : void 0
)
),
/*replacer*/
void 0,
" "
)}`
));
}
this.pendingProjectUpdates.delete(project.getProjectName());
switch (project.projectKind) {
case 2 /* External */:
unorderedRemoveItem(this.externalProjects, project);
this.projectToSizeMap.delete(project.getProjectName());
break;
case 1 /* Configured */:
this.configuredProjects.delete(project.canonicalConfigFilePath);
this.projectToSizeMap.delete(project.canonicalConfigFilePath);
break;
case 0 /* Inferred */:
unorderedRemoveItem(this.inferredProjects, project);
break;
}
}
/** @internal */
assignOrphanScriptInfoToInferredProject(info, projectRootPath) {
Debug.assert(info.isOrphan());
const project = this.getOrCreateInferredProjectForProjectRootPathIfEnabled(info, projectRootPath) || this.getOrCreateSingleInferredProjectIfEnabled() || this.getOrCreateSingleInferredWithoutProjectRoot(
info.isDynamic ? projectRootPath || this.currentDirectory : getDirectoryPath(
isRootedDiskPath(info.fileName) ? info.fileName : getNormalizedAbsolutePath(
info.fileName,
projectRootPath ? this.getNormalizedAbsolutePath(projectRootPath) : this.currentDirectory
)
)
);
project.addRoot(info);
if (info.containingProjects[0] !== project) {
info.detachFromProject(project);
info.containingProjects.unshift(project);
}
project.updateGraph();
if (!this.useSingleInferredProject && !project.projectRootPath) {
for (const inferredProject of this.inferredProjects) {
if (inferredProject === project || inferredProject.isOrphan()) {
continue;
}
const roots = inferredProject.getRootScriptInfos();
Debug.assert(roots.length === 1 || !!inferredProject.projectRootPath);
if (roots.length === 1 && forEach(roots[0].containingProjects, (p) => p !== roots[0].containingProjects[0] && !p.isOrphan())) {
inferredProject.removeFile(
roots[0],
/*fileExists*/
true,
/*detachFromProject*/
true
);
}
}
}
return project;
}
assignOrphanScriptInfosToInferredProject() {
this.openFiles.forEach((projectRootPath, path) => {
const info = this.getScriptInfoForPath(path);
if (info.isOrphan()) {
this.assignOrphanScriptInfoToInferredProject(info, projectRootPath);
}
});
}
/**
* Remove this file from the set of open, non-configured files.
* @param info The file that has been closed or newly configured
*/
closeOpenFile(info, skipAssignOrphanScriptInfosToInferredProject) {
const fileExists = info.isDynamic ? false : this.host.fileExists(info.fileName);
info.close(fileExists);
this.stopWatchingConfigFilesForClosedScriptInfo(info);
const canonicalFileName = this.toCanonicalFileName(info.fileName);
if (this.openFilesWithNonRootedDiskPath.get(canonicalFileName) === info) {
this.openFilesWithNonRootedDiskPath.delete(canonicalFileName);
}
let ensureProjectsForOpenFiles = false;
for (const p of info.containingProjects) {
if (isConfiguredProject(p)) {
if (info.hasMixedContent) {
info.registerFileUpdate();
}
const reloadLevel = p.openFileWatchTriggered.get(info.path);
if (reloadLevel !== void 0) {
p.openFileWatchTriggered.delete(info.path);
if (p.pendingReload !== void 0 && p.pendingReload < reloadLevel) {
p.pendingReload = reloadLevel;
p.markFileAsDirty(info.path);
}
}
} else if (isInferredProject(p) && p.isRoot(info)) {
if (p.isProjectWithSingleRoot()) {
ensureProjectsForOpenFiles = true;
}
p.removeFile(
info,
fileExists,
/*detachFromProject*/
true
);
}
if (!p.languageServiceEnabled) {
p.markAsDirty();
}
}
this.openFiles.delete(info.path);
this.configFileForOpenFiles.delete(info.path);
if (!skipAssignOrphanScriptInfosToInferredProject && ensureProjectsForOpenFiles) {
this.assignOrphanScriptInfosToInferredProject();
}
if (fileExists) {
this.watchClosedScriptInfo(info);
} else {
this.handleDeletedFile(info);
}
return ensureProjectsForOpenFiles;
}
deleteScriptInfo(info) {
this.filenameToScriptInfo.delete(info.path);
this.filenameToScriptInfoVersion.set(info.path, info.textStorage.version);
const realpath = info.getRealpathIfDifferent();
if (realpath) {
this.realpathToScriptInfos.remove(realpath, info);
}
}
configFileExists(configFileName, canonicalConfigFilePath, info) {
var _a;
let configFileExistenceInfo = this.configFileExistenceInfoCache.get(canonicalConfigFilePath);
if (configFileExistenceInfo) {
if (isOpenScriptInfo(info) && !((_a = configFileExistenceInfo.openFilesImpactedByConfigFile) == null ? void 0 : _a.has(info.path))) {
(configFileExistenceInfo.openFilesImpactedByConfigFile || (configFileExistenceInfo.openFilesImpactedByConfigFile = /* @__PURE__ */ new Map())).set(info.path, false);
}
return configFileExistenceInfo.exists;
}
const exists = this.host.fileExists(configFileName);
let openFilesImpactedByConfigFile;
if (isOpenScriptInfo(info)) {
(openFilesImpactedByConfigFile || (openFilesImpactedByConfigFile = /* @__PURE__ */ new Map())).set(info.path, false);
}
configFileExistenceInfo = { exists, openFilesImpactedByConfigFile };
this.configFileExistenceInfoCache.set(canonicalConfigFilePath, configFileExistenceInfo);
return exists;
}
/** @internal */
createConfigFileWatcherForParsedConfig(configFileName, canonicalConfigFilePath, forProject) {
var _a, _b;
const configFileExistenceInfo = this.configFileExistenceInfoCache.get(canonicalConfigFilePath);
if (!configFileExistenceInfo.watcher || configFileExistenceInfo.watcher === noopConfigFileWatcher) {
configFileExistenceInfo.watcher = this.watchFactory.watchFile(
configFileName,
(_fileName, eventKind) => this.onConfigFileChanged(canonicalConfigFilePath, eventKind),
2e3 /* High */,
this.getWatchOptionsFromProjectWatchOptions((_b = (_a = configFileExistenceInfo == null ? void 0 : configFileExistenceInfo.config) == null ? void 0 : _a.parsedCommandLine) == null ? void 0 : _b.watchOptions),
WatchType.ConfigFile,
forProject
);
}
const projects = configFileExistenceInfo.config.projects;
projects.set(forProject.canonicalConfigFilePath, projects.get(forProject.canonicalConfigFilePath) || false);
}
/**
* Returns true if the configFileExistenceInfo is needed/impacted by open files that are root of inferred project
*/
configFileExistenceImpactsRootOfInferredProject(configFileExistenceInfo) {
return configFileExistenceInfo.openFilesImpactedByConfigFile && forEachEntry(configFileExistenceInfo.openFilesImpactedByConfigFile, identity);
}
/** @internal */
releaseParsedConfig(canonicalConfigFilePath, forProject) {
var _a, _b, _c;
const configFileExistenceInfo = this.configFileExistenceInfoCache.get(canonicalConfigFilePath);
if (!((_a = configFileExistenceInfo.config) == null ? void 0 : _a.projects.delete(forProject.canonicalConfigFilePath)))
return;
if ((_b = configFileExistenceInfo.config) == null ? void 0 : _b.projects.size)
return;
configFileExistenceInfo.config = void 0;
clearSharedExtendedConfigFileWatcher(canonicalConfigFilePath, this.sharedExtendedConfigFileWatchers);
Debug.checkDefined(configFileExistenceInfo.watcher);
if ((_c = configFileExistenceInfo.openFilesImpactedByConfigFile) == null ? void 0 : _c.size) {
if (this.configFileExistenceImpactsRootOfInferredProject(configFileExistenceInfo)) {
if (!canWatchDirectoryOrFile(getPathComponents(getDirectoryPath(canonicalConfigFilePath)))) {
configFileExistenceInfo.watcher.close();
configFileExistenceInfo.watcher = noopConfigFileWatcher;
}
} else {
configFileExistenceInfo.watcher.close();
configFileExistenceInfo.watcher = void 0;
}
} else {
configFileExistenceInfo.watcher.close();
this.configFileExistenceInfoCache.delete(canonicalConfigFilePath);
}
}
/**
* Close the config file watcher in the cached ConfigFileExistenceInfo
* if there arent any open files that are root of inferred project and there is no parsed config held by any project
*
* @internal
*/
closeConfigFileWatcherOnReleaseOfOpenFile(configFileExistenceInfo) {
if (configFileExistenceInfo.watcher && !configFileExistenceInfo.config && !this.configFileExistenceImpactsRootOfInferredProject(configFileExistenceInfo)) {
configFileExistenceInfo.watcher.close();
configFileExistenceInfo.watcher = void 0;
}
}
/**
* This is called on file close, so that we stop watching the config file for this script info
*/
stopWatchingConfigFilesForClosedScriptInfo(info) {
Debug.assert(!info.isScriptOpen());
this.forEachConfigFileLocation(info, (canonicalConfigFilePath) => {
var _a, _b, _c;
const configFileExistenceInfo = this.configFileExistenceInfoCache.get(canonicalConfigFilePath);
if (configFileExistenceInfo) {
const infoIsRootOfInferredProject = (_a = configFileExistenceInfo.openFilesImpactedByConfigFile) == null ? void 0 : _a.get(info.path);
(_b = configFileExistenceInfo.openFilesImpactedByConfigFile) == null ? void 0 : _b.delete(info.path);
if (infoIsRootOfInferredProject) {
this.closeConfigFileWatcherOnReleaseOfOpenFile(configFileExistenceInfo);
}
if (!((_c = configFileExistenceInfo.openFilesImpactedByConfigFile) == null ? void 0 : _c.size) && !configFileExistenceInfo.config) {
Debug.assert(!configFileExistenceInfo.watcher);
this.configFileExistenceInfoCache.delete(canonicalConfigFilePath);
}
}
});
}
/**
* This is called by inferred project whenever script info is added as a root
*
* @internal
*/
startWatchingConfigFilesForInferredProjectRoot(info) {
Debug.assert(info.isScriptOpen());
this.forEachConfigFileLocation(info, (canonicalConfigFilePath, configFileName) => {
let configFileExistenceInfo = this.configFileExistenceInfoCache.get(canonicalConfigFilePath);
if (!configFileExistenceInfo) {
configFileExistenceInfo = { exists: this.host.fileExists(configFileName) };
this.configFileExistenceInfoCache.set(canonicalConfigFilePath, configFileExistenceInfo);
}
(configFileExistenceInfo.openFilesImpactedByConfigFile || (configFileExistenceInfo.openFilesImpactedByConfigFile = /* @__PURE__ */ new Map())).set(info.path, true);
configFileExistenceInfo.watcher || (configFileExistenceInfo.watcher = canWatchDirectoryOrFile(getPathComponents(getDirectoryPath(canonicalConfigFilePath))) ? this.watchFactory.watchFile(
configFileName,
(_filename, eventKind) => this.onConfigFileChanged(canonicalConfigFilePath, eventKind),
2e3 /* High */,
this.hostConfiguration.watchOptions,
WatchType.ConfigFileForInferredRoot
) : noopConfigFileWatcher);
});
}
/**
* This is called by inferred project whenever root script info is removed from it
*
* @internal
*/
stopWatchingConfigFilesForInferredProjectRoot(info) {
this.forEachConfigFileLocation(info, (canonicalConfigFilePath) => {
var _a;
const configFileExistenceInfo = this.configFileExistenceInfoCache.get(canonicalConfigFilePath);
if ((_a = configFileExistenceInfo == null ? void 0 : configFileExistenceInfo.openFilesImpactedByConfigFile) == null ? void 0 : _a.has(info.path)) {
Debug.assert(info.isScriptOpen());
configFileExistenceInfo.openFilesImpactedByConfigFile.set(info.path, false);
this.closeConfigFileWatcherOnReleaseOfOpenFile(configFileExistenceInfo);
}
});
}
/**
* This function tries to search for a tsconfig.json for the given file.
* This is different from the method the compiler uses because
* the compiler can assume it will always start searching in the
* current directory (the directory in which tsc was invoked).
* The server must start searching from the directory containing
* the newly opened file.
*/
forEachConfigFileLocation(info, action) {
if (this.serverMode !== 0 /* Semantic */) {
return void 0;
}
Debug.assert(!isOpenScriptInfo(info) || this.openFiles.has(info.path));
const projectRootPath = this.openFiles.get(info.path);
const scriptInfo = Debug.checkDefined(this.getScriptInfo(info.path));
if (scriptInfo.isDynamic)
return void 0;
let searchPath = asNormalizedPath(getDirectoryPath(info.fileName));
const isSearchPathInProjectRoot = () => containsPath(projectRootPath, searchPath, this.currentDirectory, !this.host.useCaseSensitiveFileNames);
const anySearchPathOk = !projectRootPath || !isSearchPathInProjectRoot();
let searchInDirectory = !isAncestorConfigFileInfo(info);
do {
if (searchInDirectory) {
const canonicalSearchPath = normalizedPathToPath(searchPath, this.currentDirectory, this.toCanonicalFileName);
const tsconfigFileName = asNormalizedPath(combinePaths(searchPath, "tsconfig.json"));
let result = action(combinePaths(canonicalSearchPath, "tsconfig.json"), tsconfigFileName);
if (result)
return tsconfigFileName;
const jsconfigFileName = asNormalizedPath(combinePaths(searchPath, "jsconfig.json"));
result = action(combinePaths(canonicalSearchPath, "jsconfig.json"), jsconfigFileName);
if (result)
return jsconfigFileName;
if (isNodeModulesDirectory(canonicalSearchPath)) {
break;
}
}
const parentPath = asNormalizedPath(getDirectoryPath(searchPath));
if (parentPath === searchPath)
break;
searchPath = parentPath;
searchInDirectory = true;
} while (anySearchPathOk || isSearchPathInProjectRoot());
return void 0;
}
/** @internal */
findDefaultConfiguredProject(info) {
if (!info.isScriptOpen())
return void 0;
const configFileName = this.getConfigFileNameForFile(info);
const project = configFileName && this.findConfiguredProjectByProjectName(configFileName);
return project && projectContainsInfoDirectly(project, info) ? project : project == null ? void 0 : project.getDefaultChildProjectFromProjectWithReferences(info);
}
/**
* This function tries to search for a tsconfig.json for the given file.
* This is different from the method the compiler uses because
* the compiler can assume it will always start searching in the
* current directory (the directory in which tsc was invoked).
* The server must start searching from the directory containing
* the newly opened file.
* If script info is passed in, it is asserted to be open script info
* otherwise just file name
*/
getConfigFileNameForFile(info) {
if (isOpenScriptInfo(info)) {
Debug.assert(info.isScriptOpen());
const result = this.configFileForOpenFiles.get(info.path);
if (result !== void 0)
return result || void 0;
}
this.logger.info(`Search path: ${getDirectoryPath(info.fileName)}`);
const configFileName = this.forEachConfigFileLocation(info, (canonicalConfigFilePath, configFileName2) => this.configFileExists(configFileName2, canonicalConfigFilePath, info));
if (configFileName) {
this.logger.info(`For info: ${info.fileName} :: Config file name: ${configFileName}`);
} else {
this.logger.info(`For info: ${info.fileName} :: No config files found.`);
}
if (isOpenScriptInfo(info)) {
this.configFileForOpenFiles.set(info.path, configFileName || false);
}
return configFileName;
}
printProjects() {
if (!this.logger.hasLevel(1 /* normal */)) {
return;
}
this.logger.startGroup();
this.externalProjects.forEach(printProjectWithoutFileNames);
this.configuredProjects.forEach(printProjectWithoutFileNames);
this.inferredProjects.forEach(printProjectWithoutFileNames);
this.logger.info("Open files: ");
this.openFiles.forEach((projectRootPath, path) => {
const info = this.getScriptInfoForPath(path);
this.logger.info(` FileName: ${info.fileName} ProjectRootPath: ${projectRootPath}`);
this.logger.info(` Projects: ${info.containingProjects.map((p) => p.getProjectName())}`);
});
this.logger.endGroup();
}
/** @internal */
findConfiguredProjectByProjectName(configFileName) {
const canonicalConfigFilePath = asNormalizedPath(this.toCanonicalFileName(configFileName));
return this.getConfiguredProjectByCanonicalConfigFilePath(canonicalConfigFilePath);
}
getConfiguredProjectByCanonicalConfigFilePath(canonicalConfigFilePath) {
return this.configuredProjects.get(canonicalConfigFilePath);
}
findExternalProjectByProjectName(projectFileName) {
return findProjectByName(projectFileName, this.externalProjects);
}
/** Get a filename if the language service exceeds the maximum allowed program size; otherwise returns undefined. */
getFilenameForExceededTotalSizeLimitForNonTsFiles(name, options, fileNames, propertyReader) {
if (options && options.disableSizeLimit || !this.host.getFileSize) {
return;
}
let availableSpace = maxProgramSizeForNonTsFiles;
this.projectToSizeMap.set(name, 0);
this.projectToSizeMap.forEach((val) => availableSpace -= val || 0);
let totalNonTsFileSize = 0;
for (const f of fileNames) {
const fileName = propertyReader.getFileName(f);
if (hasTSFileExtension(fileName)) {
continue;
}
totalNonTsFileSize += this.host.getFileSize(fileName);
if (totalNonTsFileSize > maxProgramSizeForNonTsFiles || totalNonTsFileSize > availableSpace) {
const top5LargestFiles = fileNames.map((f2) => propertyReader.getFileName(f2)).filter((name2) => !hasTSFileExtension(name2)).map((name2) => ({ name: name2, size: this.host.getFileSize(name2) })).sort((a, b) => b.size - a.size).slice(0, 5);
this.logger.info(`Non TS file size exceeded limit (${totalNonTsFileSize}). Largest files: ${top5LargestFiles.map((file) => `${file.name}:${file.size}`).join(", ")}`);
return fileName;
}
}
this.projectToSizeMap.set(name, totalNonTsFileSize);
}
createExternalProject(projectFileName, files, options, typeAcquisition, excludedFiles) {
const compilerOptions = convertCompilerOptions(options);
const watchOptionsAndErrors = convertWatchOptions(options, getDirectoryPath(normalizeSlashes(projectFileName)));
const project = new ExternalProject2(
projectFileName,
this,
this.documentRegistry,
compilerOptions,
/*lastFileExceededProgramSize*/
this.getFilenameForExceededTotalSizeLimitForNonTsFiles(projectFileName, compilerOptions, files, externalFilePropertyReader),
options.compileOnSave === void 0 ? true : options.compileOnSave,
/*projectFilePath*/
void 0,
watchOptionsAndErrors == null ? void 0 : watchOptionsAndErrors.watchOptions
);
project.setProjectErrors(watchOptionsAndErrors == null ? void 0 : watchOptionsAndErrors.errors);
project.excludedFiles = excludedFiles;
this.addFilesToNonInferredProject(project, files, externalFilePropertyReader, typeAcquisition);
this.externalProjects.push(project);
return project;
}
/** @internal */
sendProjectTelemetry(project) {
if (this.seenProjects.has(project.projectName)) {
setProjectOptionsUsed(project);
return;
}
this.seenProjects.set(project.projectName, true);
if (!this.eventHandler || !this.host.createSHA256Hash) {
setProjectOptionsUsed(project);
return;
}
const projectOptions = isConfiguredProject(project) ? project.projectOptions : void 0;
setProjectOptionsUsed(project);
const data = {
projectId: this.host.createSHA256Hash(project.projectName),
fileStats: countEachFileTypes(
project.getScriptInfos(),
/*includeSizes*/
true
),
compilerOptions: convertCompilerOptionsForTelemetry(project.getCompilationSettings()),
typeAcquisition: convertTypeAcquisition2(project.getTypeAcquisition()),
extends: projectOptions && projectOptions.configHasExtendsProperty,
files: projectOptions && projectOptions.configHasFilesProperty,
include: projectOptions && projectOptions.configHasIncludeProperty,
exclude: projectOptions && projectOptions.configHasExcludeProperty,
compileOnSave: project.compileOnSaveEnabled,
configFileName: configFileName(),
projectType: project instanceof ExternalProject2 ? "external" : "configured",
languageServiceEnabled: project.languageServiceEnabled,
version
};
this.eventHandler({ eventName: ProjectInfoTelemetryEvent, data });
function configFileName() {
if (!isConfiguredProject(project)) {
return "other";
}
return getBaseConfigFileName(project.getConfigFilePath()) || "other";
}
function convertTypeAcquisition2({ enable: enable2, include, exclude }) {
return {
enable: enable2,
include: include !== void 0 && include.length !== 0,
exclude: exclude !== void 0 && exclude.length !== 0
};
}
}
addFilesToNonInferredProject(project, files, propertyReader, typeAcquisition) {
this.updateNonInferredProjectFiles(project, files, propertyReader);
project.setTypeAcquisition(typeAcquisition);
}
/** @internal */
createConfiguredProject(configFileName) {
var _a;
(_a = tracing) == null ? void 0 : _a.instant(tracing.Phase.Session, "createConfiguredProject", { configFilePath: configFileName });
this.logger.info(`Creating configuration project ${configFileName}`);
const canonicalConfigFilePath = asNormalizedPath(this.toCanonicalFileName(configFileName));
let configFileExistenceInfo = this.configFileExistenceInfoCache.get(canonicalConfigFilePath);
if (!configFileExistenceInfo) {
this.configFileExistenceInfoCache.set(canonicalConfigFilePath, configFileExistenceInfo = { exists: true });
} else {
configFileExistenceInfo.exists = true;
}
if (!configFileExistenceInfo.config) {
configFileExistenceInfo.config = {
cachedDirectoryStructureHost: createCachedDirectoryStructureHost(this.host, this.host.getCurrentDirectory(), this.host.useCaseSensitiveFileNames),
projects: /* @__PURE__ */ new Map(),
reloadLevel: 2 /* Full */
};
}
const project = new ConfiguredProject2(
configFileName,
canonicalConfigFilePath,
this,
this.documentRegistry,
configFileExistenceInfo.config.cachedDirectoryStructureHost
);
this.configuredProjects.set(canonicalConfigFilePath, project);
this.createConfigFileWatcherForParsedConfig(configFileName, canonicalConfigFilePath, project);
return project;
}
/** @internal */
createConfiguredProjectWithDelayLoad(configFileName, reason) {
const project = this.createConfiguredProject(configFileName);
project.pendingReload = 2 /* Full */;
project.pendingReloadReason = reason;
return project;
}
/** @internal */
createAndLoadConfiguredProject(configFileName, reason) {
const project = this.createConfiguredProject(configFileName);
this.loadConfiguredProject(project, reason);
return project;
}
/** @internal */
createLoadAndUpdateConfiguredProject(configFileName, reason) {
const project = this.createAndLoadConfiguredProject(configFileName, reason);
project.updateGraph();
return project;
}
/**
* Read the config file of the project, and update the project root file names.
*
* @internal
*/
loadConfiguredProject(project, reason) {
var _a, _b;
(_a = tracing) == null ? void 0 : _a.push(tracing.Phase.Session, "loadConfiguredProject", { configFilePath: project.canonicalConfigFilePath });
this.sendProjectLoadingStartEvent(project, reason);
const configFilename = asNormalizedPath(normalizePath(project.getConfigFilePath()));
const configFileExistenceInfo = this.ensureParsedConfigUptoDate(
configFilename,
project.canonicalConfigFilePath,
this.configFileExistenceInfoCache.get(project.canonicalConfigFilePath),
project
);
const parsedCommandLine = configFileExistenceInfo.config.parsedCommandLine;
Debug.assert(!!parsedCommandLine.fileNames);
const compilerOptions = parsedCommandLine.options;
if (!project.projectOptions) {
project.projectOptions = {
configHasExtendsProperty: parsedCommandLine.raw.extends !== void 0,
configHasFilesProperty: parsedCommandLine.raw.files !== void 0,
configHasIncludeProperty: parsedCommandLine.raw.include !== void 0,
configHasExcludeProperty: parsedCommandLine.raw.exclude !== void 0
};
}
project.canConfigFileJsonReportNoInputFiles = canJsonReportNoInputFiles(parsedCommandLine.raw);
project.setProjectErrors(parsedCommandLine.options.configFile.parseDiagnostics);
project.updateReferences(parsedCommandLine.projectReferences);
const lastFileExceededProgramSize = this.getFilenameForExceededTotalSizeLimitForNonTsFiles(project.canonicalConfigFilePath, compilerOptions, parsedCommandLine.fileNames, fileNamePropertyReader);
if (lastFileExceededProgramSize) {
project.disableLanguageService(lastFileExceededProgramSize);
this.configFileExistenceInfoCache.forEach((_configFileExistenceInfo, canonicalConfigFilePath) => this.stopWatchingWildCards(canonicalConfigFilePath, project));
} else {
project.setCompilerOptions(compilerOptions);
project.setWatchOptions(parsedCommandLine.watchOptions);
project.enableLanguageService();
this.watchWildcards(configFilename, configFileExistenceInfo, project);
}
project.enablePluginsWithOptions(compilerOptions);
const filesToAdd = parsedCommandLine.fileNames.concat(project.getExternalFiles());
this.updateRootAndOptionsOfNonInferredProject(project, filesToAdd, fileNamePropertyReader, compilerOptions, parsedCommandLine.typeAcquisition, parsedCommandLine.compileOnSave, parsedCommandLine.watchOptions);
(_b = tracing) == null ? void 0 : _b.pop();
}
/** @internal */
ensureParsedConfigUptoDate(configFilename, canonicalConfigFilePath, configFileExistenceInfo, forProject) {
var _a, _b, _c;
if (configFileExistenceInfo.config) {
if (!configFileExistenceInfo.config.reloadLevel)
return configFileExistenceInfo;
if (configFileExistenceInfo.config.reloadLevel === 1 /* Partial */) {
this.reloadFileNamesOfParsedConfig(configFilename, configFileExistenceInfo.config);
return configFileExistenceInfo;
}
}
const cachedDirectoryStructureHost = ((_a = configFileExistenceInfo.config) == null ? void 0 : _a.cachedDirectoryStructureHost) || createCachedDirectoryStructureHost(this.host, this.host.getCurrentDirectory(), this.host.useCaseSensitiveFileNames);
const configFileContent = tryReadFile(configFilename, (fileName) => this.host.readFile(fileName));
const configFile = parseJsonText(configFilename, isString(configFileContent) ? configFileContent : "");
const configFileErrors = configFile.parseDiagnostics;
if (!isString(configFileContent))
configFileErrors.push(configFileContent);
const parsedCommandLine = parseJsonSourceFileConfigFileContent(
configFile,
cachedDirectoryStructureHost,
getDirectoryPath(configFilename),
/*existingOptions*/
{},
configFilename,
/*resolutionStack*/
[],
this.hostConfiguration.extraFileExtensions,
this.extendedConfigCache
);
if (parsedCommandLine.errors.length) {
configFileErrors.push(...parsedCommandLine.errors);
}
this.logger.info(`Config: ${configFilename} : ${JSON.stringify(
{
rootNames: parsedCommandLine.fileNames,
options: parsedCommandLine.options,
watchOptions: parsedCommandLine.watchOptions,
projectReferences: parsedCommandLine.projectReferences
},
/*replacer*/
void 0,
" "
)}`);
const oldCommandLine = (_b = configFileExistenceInfo.config) == null ? void 0 : _b.parsedCommandLine;
if (!configFileExistenceInfo.config) {
configFileExistenceInfo.config = { parsedCommandLine, cachedDirectoryStructureHost, projects: /* @__PURE__ */ new Map() };
} else {
configFileExistenceInfo.config.parsedCommandLine = parsedCommandLine;
configFileExistenceInfo.config.watchedDirectoriesStale = true;
configFileExistenceInfo.config.reloadLevel = void 0;
}
if (!oldCommandLine && !isJsonEqual(
// Old options
this.getWatchOptionsFromProjectWatchOptions(
/*projectOptions*/
void 0
),
// New options
this.getWatchOptionsFromProjectWatchOptions(parsedCommandLine.watchOptions)
)) {
(_c = configFileExistenceInfo.watcher) == null ? void 0 : _c.close();
configFileExistenceInfo.watcher = void 0;
}
this.createConfigFileWatcherForParsedConfig(configFilename, canonicalConfigFilePath, forProject);
updateSharedExtendedConfigFileWatcher(
canonicalConfigFilePath,
parsedCommandLine.options,
this.sharedExtendedConfigFileWatchers,
(extendedConfigFileName, extendedConfigFilePath) => this.watchFactory.watchFile(
extendedConfigFileName,
() => {
var _a2;
cleanExtendedConfigCache(this.extendedConfigCache, extendedConfigFilePath, (fileName) => this.toPath(fileName));
let ensureProjectsForOpenFiles = false;
(_a2 = this.sharedExtendedConfigFileWatchers.get(extendedConfigFilePath)) == null ? void 0 : _a2.projects.forEach((canonicalPath) => {
ensureProjectsForOpenFiles = this.delayUpdateProjectsFromParsedConfigOnConfigFileChange(canonicalPath, `Change in extended config file ${extendedConfigFileName} detected`) || ensureProjectsForOpenFiles;
});
if (ensureProjectsForOpenFiles)
this.delayEnsureProjectForOpenFiles();
},
2e3 /* High */,
this.hostConfiguration.watchOptions,
WatchType.ExtendedConfigFile,
configFilename
),
(fileName) => this.toPath(fileName)
);
return configFileExistenceInfo;
}
/** @internal */
watchWildcards(configFileName, { exists, config }, forProject) {
config.projects.set(forProject.canonicalConfigFilePath, true);
if (exists) {
if (config.watchedDirectories && !config.watchedDirectoriesStale)
return;
config.watchedDirectoriesStale = false;
updateWatchingWildcardDirectories(
config.watchedDirectories || (config.watchedDirectories = /* @__PURE__ */ new Map()),
new Map(Object.entries(config.parsedCommandLine.wildcardDirectories)),
// Create new directory watcher
(directory, flags) => this.watchWildcardDirectory(directory, flags, configFileName, config)
);
} else {
config.watchedDirectoriesStale = false;
if (!config.watchedDirectories)
return;
clearMap(config.watchedDirectories, closeFileWatcherOf);
config.watchedDirectories = void 0;
}
}
/** @internal */
stopWatchingWildCards(canonicalConfigFilePath, forProject) {
const configFileExistenceInfo = this.configFileExistenceInfoCache.get(canonicalConfigFilePath);
if (!configFileExistenceInfo.config || !configFileExistenceInfo.config.projects.get(forProject.canonicalConfigFilePath)) {
return;
}
configFileExistenceInfo.config.projects.set(forProject.canonicalConfigFilePath, false);
if (forEachEntry(configFileExistenceInfo.config.projects, identity))
return;
if (configFileExistenceInfo.config.watchedDirectories) {
clearMap(configFileExistenceInfo.config.watchedDirectories, closeFileWatcherOf);
configFileExistenceInfo.config.watchedDirectories = void 0;
}
configFileExistenceInfo.config.watchedDirectoriesStale = void 0;
}
updateNonInferredProjectFiles(project, files, propertyReader) {
const projectRootFilesMap = project.getRootFilesMap();
const newRootScriptInfoMap = /* @__PURE__ */ new Map();
for (const f of files) {
const newRootFile = propertyReader.getFileName(f);
const fileName = toNormalizedPath(newRootFile);
const isDynamic = isDynamicFileName(fileName);
let path;
if (!isDynamic && !project.fileExists(newRootFile)) {
path = normalizedPathToPath(fileName, this.currentDirectory, this.toCanonicalFileName);
const existingValue = projectRootFilesMap.get(path);
if (existingValue) {
if (existingValue.info) {
project.removeFile(
existingValue.info,
/*fileExists*/
false,
/*detachFromProject*/
true
);
existingValue.info = void 0;
}
existingValue.fileName = fileName;
} else {
projectRootFilesMap.set(path, { fileName });
}
} else {
const scriptKind = propertyReader.getScriptKind(f, this.hostConfiguration.extraFileExtensions);
const hasMixedContent = propertyReader.hasMixedContent(f, this.hostConfiguration.extraFileExtensions);
const scriptInfo = Debug.checkDefined(this.getOrCreateScriptInfoNotOpenedByClientForNormalizedPath(
fileName,
project.currentDirectory,
scriptKind,
hasMixedContent,
project.directoryStructureHost
));
path = scriptInfo.path;
const existingValue = projectRootFilesMap.get(path);
if (!existingValue || existingValue.info !== scriptInfo) {
project.addRoot(scriptInfo, fileName);
if (scriptInfo.isScriptOpen()) {
this.removeRootOfInferredProjectIfNowPartOfOtherProject(scriptInfo);
}
} else {
existingValue.fileName = fileName;
}
}
newRootScriptInfoMap.set(path, true);
}
if (projectRootFilesMap.size > newRootScriptInfoMap.size) {
projectRootFilesMap.forEach((value, path) => {
if (!newRootScriptInfoMap.has(path)) {
if (value.info) {
project.removeFile(
value.info,
project.fileExists(path),
/*detachFromProject*/
true
);
} else {
projectRootFilesMap.delete(path);
}
}
});
}
project.markAsDirty();
}
updateRootAndOptionsOfNonInferredProject(project, newUncheckedFiles, propertyReader, newOptions, newTypeAcquisition, compileOnSave, watchOptions) {
project.setCompilerOptions(newOptions);
project.setWatchOptions(watchOptions);
if (compileOnSave !== void 0) {
project.compileOnSaveEnabled = compileOnSave;
}
this.addFilesToNonInferredProject(project, newUncheckedFiles, propertyReader, newTypeAcquisition);
}
/**
* Reload the file names from config file specs and update the project graph
*
* @internal
*/
reloadFileNamesOfConfiguredProject(project) {
const fileNames = this.reloadFileNamesOfParsedConfig(project.getConfigFilePath(), this.configFileExistenceInfoCache.get(project.canonicalConfigFilePath).config);
project.updateErrorOnNoInputFiles(fileNames);
this.updateNonInferredProjectFiles(project, fileNames.concat(project.getExternalFiles()), fileNamePropertyReader);
return project.updateGraph();
}
/** @internal */
reloadFileNamesOfParsedConfig(configFileName, config) {
if (config.reloadLevel === void 0)
return config.parsedCommandLine.fileNames;
Debug.assert(config.reloadLevel === 1 /* Partial */);
const configFileSpecs = config.parsedCommandLine.options.configFile.configFileSpecs;
const fileNames = getFileNamesFromConfigSpecs(
configFileSpecs,
getDirectoryPath(configFileName),
config.parsedCommandLine.options,
config.cachedDirectoryStructureHost,
this.hostConfiguration.extraFileExtensions
);
config.parsedCommandLine = { ...config.parsedCommandLine, fileNames };
return fileNames;
}
/** @internal */
setFileNamesOfAutoImportProviderProject(project, fileNames) {
this.updateNonInferredProjectFiles(project, fileNames, fileNamePropertyReader);
}
/**
* Read the config file of the project again by clearing the cache and update the project graph
*
* @internal
*/
reloadConfiguredProject(project, reason, isInitialLoad, clearSemanticCache) {
const host = project.getCachedDirectoryStructureHost();
if (clearSemanticCache)
this.clearSemanticCache(project);
host.clearCache();
const configFileName = project.getConfigFilePath();
this.logger.info(`${isInitialLoad ? "Loading" : "Reloading"} configured project ${configFileName}`);
this.loadConfiguredProject(project, reason);
project.updateGraph();
this.sendConfigFileDiagEvent(project, configFileName);
}
/** @internal */
clearSemanticCache(project) {
project.resolutionCache.clear();
project.getLanguageService(
/*ensureSynchronized*/
false
).cleanupSemanticCache();
project.markAsDirty();
}
sendConfigFileDiagEvent(project, triggerFile) {
if (!this.eventHandler || this.suppressDiagnosticEvents) {
return;
}
const diagnostics = project.getLanguageService().getCompilerOptionsDiagnostics();
diagnostics.push(...project.getAllProjectErrors());
this.eventHandler({
eventName: ConfigFileDiagEvent,
data: { configFileName: project.getConfigFilePath(), diagnostics, triggerFile }
});
}
getOrCreateInferredProjectForProjectRootPathIfEnabled(info, projectRootPath) {
if (!this.useInferredProjectPerProjectRoot || // Its a dynamic info opened without project root
info.isDynamic && projectRootPath === void 0) {
return void 0;
}
if (projectRootPath) {
const canonicalProjectRootPath = this.toCanonicalFileName(projectRootPath);
for (const project of this.inferredProjects) {
if (project.projectRootPath === canonicalProjectRootPath) {
return project;
}
}
return this.createInferredProject(
projectRootPath,
/*isSingleInferredProject*/
false,
projectRootPath
);
}
let bestMatch;
for (const project of this.inferredProjects) {
if (!project.projectRootPath)
continue;
if (!containsPath(project.projectRootPath, info.path, this.host.getCurrentDirectory(), !this.host.useCaseSensitiveFileNames))
continue;
if (bestMatch && bestMatch.projectRootPath.length > project.projectRootPath.length)
continue;
bestMatch = project;
}
return bestMatch;
}
getOrCreateSingleInferredProjectIfEnabled() {
if (!this.useSingleInferredProject) {
return void 0;
}
if (this.inferredProjects.length > 0 && this.inferredProjects[0].projectRootPath === void 0) {
return this.inferredProjects[0];
}
return this.createInferredProject(
"",
/*isSingleInferredProject*/
true
);
}
getOrCreateSingleInferredWithoutProjectRoot(currentDirectory) {
Debug.assert(!this.useSingleInferredProject);
const expectedCurrentDirectory = this.toCanonicalFileName(this.getNormalizedAbsolutePath(currentDirectory));
for (const inferredProject of this.inferredProjects) {
if (!inferredProject.projectRootPath && inferredProject.isOrphan() && inferredProject.canonicalCurrentDirectory === expectedCurrentDirectory) {
return inferredProject;
}
}
return this.createInferredProject(currentDirectory);
}
createInferredProject(currentDirectory, isSingleInferredProject, projectRootPath) {
const compilerOptions = projectRootPath && this.compilerOptionsForInferredProjectsPerProjectRoot.get(projectRootPath) || this.compilerOptionsForInferredProjects;
let watchOptionsAndErrors;
let typeAcquisition;
if (projectRootPath) {
watchOptionsAndErrors = this.watchOptionsForInferredProjectsPerProjectRoot.get(projectRootPath);
typeAcquisition = this.typeAcquisitionForInferredProjectsPerProjectRoot.get(projectRootPath);
}
if (watchOptionsAndErrors === void 0) {
watchOptionsAndErrors = this.watchOptionsForInferredProjects;
}
if (typeAcquisition === void 0) {
typeAcquisition = this.typeAcquisitionForInferredProjects;
}
watchOptionsAndErrors = watchOptionsAndErrors || void 0;
const project = new InferredProject2(this, this.documentRegistry, compilerOptions, watchOptionsAndErrors == null ? void 0 : watchOptionsAndErrors.watchOptions, projectRootPath, currentDirectory, typeAcquisition);
project.setProjectErrors(watchOptionsAndErrors == null ? void 0 : watchOptionsAndErrors.errors);
if (isSingleInferredProject) {
this.inferredProjects.unshift(project);
} else {
this.inferredProjects.push(project);
}
return project;
}
/** @internal */
getOrCreateScriptInfoNotOpenedByClient(uncheckedFileName, currentDirectory, hostToQueryFileExistsOn) {
return this.getOrCreateScriptInfoNotOpenedByClientForNormalizedPath(
toNormalizedPath(uncheckedFileName),
currentDirectory,
/*scriptKind*/
void 0,
/*hasMixedContent*/
void 0,
hostToQueryFileExistsOn
);
}
getScriptInfo(uncheckedFileName) {
return this.getScriptInfoForNormalizedPath(toNormalizedPath(uncheckedFileName));
}
/** @internal */
getScriptInfoOrConfig(uncheckedFileName) {
const path = toNormalizedPath(uncheckedFileName);
const info = this.getScriptInfoForNormalizedPath(path);
if (info)
return info;
const configProject = this.configuredProjects.get(this.toPath(uncheckedFileName));
return configProject && configProject.getCompilerOptions().configFile;
}
/** @internal */
logErrorForScriptInfoNotFound(fileName) {
const names = arrayFrom(this.filenameToScriptInfo.entries(), ([path, scriptInfo]) => ({ path, fileName: scriptInfo.fileName }));
this.logger.msg(`Could not find file ${JSON.stringify(fileName)}.
All files are: ${JSON.stringify(names)}`, "Err" /* Err */);
}
/**
* Returns the projects that contain script info through SymLink
* Note that this does not return projects in info.containingProjects
*
* @internal
*/
getSymlinkedProjects(info) {
let projects;
if (this.realpathToScriptInfos) {
const realpath = info.getRealpathIfDifferent();
if (realpath) {
forEach(this.realpathToScriptInfos.get(realpath), combineProjects);
}
forEach(this.realpathToScriptInfos.get(info.path), combineProjects);
}
return projects;
function combineProjects(toAddInfo) {
if (toAddInfo !== info) {
for (const project of toAddInfo.containingProjects) {
if (project.languageServiceEnabled && !project.isOrphan() && !project.getCompilerOptions().preserveSymlinks && !info.isAttached(project)) {
if (!projects) {
projects = createMultiMap();
projects.add(toAddInfo.path, project);
} else if (!forEachEntry(projects, (projs, path) => path === toAddInfo.path ? false : contains(projs, project))) {
projects.add(toAddInfo.path, project);
}
}
}
}
}
}
watchClosedScriptInfo(info) {
Debug.assert(!info.fileWatcher);
if (!info.isDynamicOrHasMixedContent() && (!this.globalCacheLocationDirectoryPath || !startsWith(info.path, this.globalCacheLocationDirectoryPath))) {
const indexOfNodeModules = info.path.indexOf("/node_modules/");
if (!this.host.getModifiedTime || indexOfNodeModules === -1) {
info.fileWatcher = this.watchFactory.watchFile(
info.fileName,
(_fileName, eventKind) => this.onSourceFileChanged(info, eventKind),
500 /* Medium */,
this.hostConfiguration.watchOptions,
WatchType.ClosedScriptInfo
);
} else {
info.mTime = this.getModifiedTime(info);
info.fileWatcher = this.watchClosedScriptInfoInNodeModules(info.path.substr(0, indexOfNodeModules));
}
}
}
createNodeModulesWatcher(dir) {
const watcher = this.watchFactory.watchDirectory(
dir,
(fileOrDirectory) => {
var _a;
const fileOrDirectoryPath = removeIgnoredPath(this.toPath(fileOrDirectory));
if (!fileOrDirectoryPath)
return;
const basename = getBaseFileName(fileOrDirectoryPath);
if (((_a = result.affectedModuleSpecifierCacheProjects) == null ? void 0 : _a.size) && (basename === "package.json" || basename === "node_modules")) {
result.affectedModuleSpecifierCacheProjects.forEach((projectName) => {
var _a2, _b;
(_b = (_a2 = this.findProject(projectName)) == null ? void 0 : _a2.getModuleSpecifierCache()) == null ? void 0 : _b.clear();
});
}
if (result.refreshScriptInfoRefCount) {
if (dir === fileOrDirectoryPath) {
this.refreshScriptInfosInDirectory(dir);
} else {
const info = this.getScriptInfoForPath(fileOrDirectoryPath);
if (info) {
if (isScriptInfoWatchedFromNodeModules(info)) {
this.refreshScriptInfo(info);
}
} else if (!hasExtension(fileOrDirectoryPath)) {
this.refreshScriptInfosInDirectory(fileOrDirectoryPath);
}
}
}
},
1 /* Recursive */,
this.hostConfiguration.watchOptions,
WatchType.NodeModules
);
const result = {
refreshScriptInfoRefCount: 0,
affectedModuleSpecifierCacheProjects: void 0,
close: () => {
var _a;
if (!result.refreshScriptInfoRefCount && !((_a = result.affectedModuleSpecifierCacheProjects) == null ? void 0 : _a.size)) {
watcher.close();
this.nodeModulesWatchers.delete(dir);
}
}
};
this.nodeModulesWatchers.set(dir, result);
return result;
}
/** @internal */
watchPackageJsonsInNodeModules(dir, project) {
const watcher = this.nodeModulesWatchers.get(dir) || this.createNodeModulesWatcher(dir);
(watcher.affectedModuleSpecifierCacheProjects || (watcher.affectedModuleSpecifierCacheProjects = /* @__PURE__ */ new Set())).add(project.getProjectName());
return {
close: () => {
var _a;
(_a = watcher.affectedModuleSpecifierCacheProjects) == null ? void 0 : _a.delete(project.getProjectName());
watcher.close();
}
};
}
watchClosedScriptInfoInNodeModules(dir) {
const watchDir = dir + "/node_modules";
const watcher = this.nodeModulesWatchers.get(watchDir) || this.createNodeModulesWatcher(watchDir);
watcher.refreshScriptInfoRefCount++;
return {
close: () => {
watcher.refreshScriptInfoRefCount--;
watcher.close();
}
};
}
getModifiedTime(info) {
return (this.host.getModifiedTime(info.path) || missingFileModifiedTime).getTime();
}
refreshScriptInfo(info) {
const mTime = this.getModifiedTime(info);
if (mTime !== info.mTime) {
const eventKind = getFileWatcherEventKind(info.mTime, mTime);
info.mTime = mTime;
this.onSourceFileChanged(info, eventKind);
}
}
refreshScriptInfosInDirectory(dir) {
dir = dir + directorySeparator;
this.filenameToScriptInfo.forEach((info) => {
if (isScriptInfoWatchedFromNodeModules(info) && startsWith(info.path, dir)) {
this.refreshScriptInfo(info);
}
});
}
stopWatchingScriptInfo(info) {
if (info.fileWatcher) {
info.fileWatcher.close();
info.fileWatcher = void 0;
}
}
getOrCreateScriptInfoNotOpenedByClientForNormalizedPath(fileName, currentDirectory, scriptKind, hasMixedContent, hostToQueryFileExistsOn) {
if (isRootedDiskPath(fileName) || isDynamicFileName(fileName)) {
return this.getOrCreateScriptInfoWorker(
fileName,
currentDirectory,
/*openedByClient*/
false,
/*fileContent*/
void 0,
scriptKind,
hasMixedContent,
hostToQueryFileExistsOn
);
}
const info = this.openFilesWithNonRootedDiskPath.get(this.toCanonicalFileName(fileName));
if (info) {
return info;
}
return void 0;
}
getOrCreateScriptInfoOpenedByClientForNormalizedPath(fileName, currentDirectory, fileContent, scriptKind, hasMixedContent) {
return this.getOrCreateScriptInfoWorker(
fileName,
currentDirectory,
/*openedByClient*/
true,
fileContent,
scriptKind,
hasMixedContent
);
}
getOrCreateScriptInfoForNormalizedPath(fileName, openedByClient, fileContent, scriptKind, hasMixedContent, hostToQueryFileExistsOn) {
return this.getOrCreateScriptInfoWorker(fileName, this.currentDirectory, openedByClient, fileContent, scriptKind, hasMixedContent, hostToQueryFileExistsOn);
}
getOrCreateScriptInfoWorker(fileName, currentDirectory, openedByClient, fileContent, scriptKind, hasMixedContent, hostToQueryFileExistsOn) {
Debug.assert(fileContent === void 0 || openedByClient, "ScriptInfo needs to be opened by client to be able to set its user defined content");
const path = normalizedPathToPath(fileName, currentDirectory, this.toCanonicalFileName);
let info = this.getScriptInfoForPath(path);
if (!info) {
const isDynamic = isDynamicFileName(fileName);
Debug.assert(isRootedDiskPath(fileName) || isDynamic || openedByClient, "", () => `${JSON.stringify({ fileName, currentDirectory, hostCurrentDirectory: this.currentDirectory, openKeys: arrayFrom(this.openFilesWithNonRootedDiskPath.keys()) })}
Script info with non-dynamic relative file name can only be open script info or in context of host currentDirectory`);
Debug.assert(!isRootedDiskPath(fileName) || this.currentDirectory === currentDirectory || !this.openFilesWithNonRootedDiskPath.has(this.toCanonicalFileName(fileName)), "", () => `${JSON.stringify({ fileName, currentDirectory, hostCurrentDirectory: this.currentDirectory, openKeys: arrayFrom(this.openFilesWithNonRootedDiskPath.keys()) })}
Open script files with non rooted disk path opened with current directory context cannot have same canonical names`);
Debug.assert(!isDynamic || this.currentDirectory === currentDirectory || this.useInferredProjectPerProjectRoot, "", () => `${JSON.stringify({ fileName, currentDirectory, hostCurrentDirectory: this.currentDirectory, openKeys: arrayFrom(this.openFilesWithNonRootedDiskPath.keys()) })}
Dynamic files must always be opened with service's current directory or service should support inferred project per projectRootPath.`);
if (!openedByClient && !isDynamic && !(hostToQueryFileExistsOn || this.host).fileExists(fileName)) {
return;
}
info = new ScriptInfo(this.host, fileName, scriptKind, !!hasMixedContent, path, this.filenameToScriptInfoVersion.get(path));
this.filenameToScriptInfo.set(info.path, info);
this.filenameToScriptInfoVersion.delete(info.path);
if (!openedByClient) {
this.watchClosedScriptInfo(info);
} else if (!isRootedDiskPath(fileName) && (!isDynamic || this.currentDirectory !== currentDirectory)) {
this.openFilesWithNonRootedDiskPath.set(this.toCanonicalFileName(fileName), info);
}
}
if (openedByClient) {
this.stopWatchingScriptInfo(info);
info.open(fileContent);
if (hasMixedContent) {
info.registerFileUpdate();
}
}
return info;
}
/**
* This gets the script info for the normalized path. If the path is not rooted disk path then the open script info with project root context is preferred
*/
getScriptInfoForNormalizedPath(fileName) {
return !isRootedDiskPath(fileName) && this.openFilesWithNonRootedDiskPath.get(this.toCanonicalFileName(fileName)) || this.getScriptInfoForPath(normalizedPathToPath(fileName, this.currentDirectory, this.toCanonicalFileName));
}
getScriptInfoForPath(fileName) {
return this.filenameToScriptInfo.get(fileName);
}
/** @internal */
getDocumentPositionMapper(project, generatedFileName, sourceFileName) {
const declarationInfo = this.getOrCreateScriptInfoNotOpenedByClient(generatedFileName, project.currentDirectory, this.host);
if (!declarationInfo) {
if (sourceFileName) {
project.addGeneratedFileWatch(generatedFileName, sourceFileName);
}
return void 0;
}
declarationInfo.getSnapshot();
if (isString(declarationInfo.sourceMapFilePath)) {
const sourceMapFileInfo2 = this.getScriptInfoForPath(declarationInfo.sourceMapFilePath);
if (sourceMapFileInfo2) {
sourceMapFileInfo2.getSnapshot();
if (sourceMapFileInfo2.documentPositionMapper !== void 0) {
sourceMapFileInfo2.sourceInfos = this.addSourceInfoToSourceMap(sourceFileName, project, sourceMapFileInfo2.sourceInfos);
return sourceMapFileInfo2.documentPositionMapper ? sourceMapFileInfo2.documentPositionMapper : void 0;
}
}
declarationInfo.sourceMapFilePath = void 0;
} else if (declarationInfo.sourceMapFilePath) {
declarationInfo.sourceMapFilePath.sourceInfos = this.addSourceInfoToSourceMap(sourceFileName, project, declarationInfo.sourceMapFilePath.sourceInfos);
return void 0;
} else if (declarationInfo.sourceMapFilePath !== void 0) {
return void 0;
}
let sourceMapFileInfo;
let mapFileNameFromDeclarationInfo;
let readMapFile = (mapFileName, mapFileNameFromDts) => {
const mapInfo = this.getOrCreateScriptInfoNotOpenedByClient(mapFileName, project.currentDirectory, this.host);
if (!mapInfo) {
mapFileNameFromDeclarationInfo = mapFileNameFromDts;
return void 0;
}
sourceMapFileInfo = mapInfo;
const snap = mapInfo.getSnapshot();
if (mapInfo.documentPositionMapper !== void 0)
return mapInfo.documentPositionMapper;
return getSnapshotText(snap);
};
const projectName = project.projectName;
const documentPositionMapper = getDocumentPositionMapper(
{ getCanonicalFileName: this.toCanonicalFileName, log: (s) => this.logger.info(s), getSourceFileLike: (f) => this.getSourceFileLike(f, projectName, declarationInfo) },
declarationInfo.fileName,
declarationInfo.textStorage.getLineInfo(),
readMapFile
);
readMapFile = void 0;
if (sourceMapFileInfo) {
declarationInfo.sourceMapFilePath = sourceMapFileInfo.path;
sourceMapFileInfo.declarationInfoPath = declarationInfo.path;
sourceMapFileInfo.documentPositionMapper = documentPositionMapper || false;
sourceMapFileInfo.sourceInfos = this.addSourceInfoToSourceMap(sourceFileName, project, sourceMapFileInfo.sourceInfos);
} else if (mapFileNameFromDeclarationInfo) {
declarationInfo.sourceMapFilePath = {
watcher: this.addMissingSourceMapFile(
project.currentDirectory === this.currentDirectory ? mapFileNameFromDeclarationInfo : getNormalizedAbsolutePath(mapFileNameFromDeclarationInfo, project.currentDirectory),
declarationInfo.path
),
sourceInfos: this.addSourceInfoToSourceMap(sourceFileName, project)
};
} else {
declarationInfo.sourceMapFilePath = false;
}
return documentPositionMapper;
}
addSourceInfoToSourceMap(sourceFileName, project, sourceInfos) {
if (sourceFileName) {
const sourceInfo = this.getOrCreateScriptInfoNotOpenedByClient(sourceFileName, project.currentDirectory, project.directoryStructureHost);
(sourceInfos || (sourceInfos = /* @__PURE__ */ new Set())).add(sourceInfo.path);
}
return sourceInfos;
}
addMissingSourceMapFile(mapFileName, declarationInfoPath) {
const fileWatcher = this.watchFactory.watchFile(
mapFileName,
() => {
const declarationInfo = this.getScriptInfoForPath(declarationInfoPath);
if (declarationInfo && declarationInfo.sourceMapFilePath && !isString(declarationInfo.sourceMapFilePath)) {
this.delayUpdateProjectGraphs(
declarationInfo.containingProjects,
/*clearSourceMapperCache*/
true
);
this.delayUpdateSourceInfoProjects(declarationInfo.sourceMapFilePath.sourceInfos);
declarationInfo.closeSourceMapFileWatcher();
}
},
2e3 /* High */,
this.hostConfiguration.watchOptions,
WatchType.MissingSourceMapFile
);
return fileWatcher;
}
/** @internal */
getSourceFileLike(fileName, projectNameOrProject, declarationInfo) {
const project = projectNameOrProject.projectName ? projectNameOrProject : this.findProject(projectNameOrProject);
if (project) {
const path = project.toPath(fileName);
const sourceFile = project.getSourceFile(path);
if (sourceFile && sourceFile.resolvedPath === path)
return sourceFile;
}
const info = this.getOrCreateScriptInfoNotOpenedByClient(fileName, (project || this).currentDirectory, project ? project.directoryStructureHost : this.host);
if (!info)
return void 0;
if (declarationInfo && isString(declarationInfo.sourceMapFilePath) && info !== declarationInfo) {
const sourceMapInfo = this.getScriptInfoForPath(declarationInfo.sourceMapFilePath);
if (sourceMapInfo) {
(sourceMapInfo.sourceInfos || (sourceMapInfo.sourceInfos = /* @__PURE__ */ new Set())).add(info.path);
}
}
if (info.cacheSourceFile)
return info.cacheSourceFile.sourceFile;
if (!info.sourceFileLike) {
info.sourceFileLike = {
get text() {
Debug.fail("shouldnt need text");
return "";
},
getLineAndCharacterOfPosition: (pos) => {
const lineOffset = info.positionToLineOffset(pos);
return { line: lineOffset.line - 1, character: lineOffset.offset - 1 };
},
getPositionOfLineAndCharacter: (line, character, allowEdits) => info.lineOffsetToPosition(line + 1, character + 1, allowEdits)
};
}
return info.sourceFileLike;
}
/** @internal */
setPerformanceEventHandler(performanceEventHandler) {
this.performanceEventHandler = performanceEventHandler;
}
setHostConfiguration(args) {
var _a;
if (args.file) {
const info = this.getScriptInfoForNormalizedPath(toNormalizedPath(args.file));
if (info) {
info.setOptions(convertFormatOptions(args.formatOptions), args.preferences);
this.logger.info(`Host configuration update for file ${args.file}`);
}
} else {
if (args.hostInfo !== void 0) {
this.hostConfiguration.hostInfo = args.hostInfo;
this.logger.info(`Host information ${args.hostInfo}`);
}
if (args.formatOptions) {
this.hostConfiguration.formatCodeOptions = { ...this.hostConfiguration.formatCodeOptions, ...convertFormatOptions(args.formatOptions) };
this.logger.info("Format host information updated");
}
if (args.preferences) {
const {
lazyConfiguredProjectsFromExternalProject,
includePackageJsonAutoImports
} = this.hostConfiguration.preferences;
this.hostConfiguration.preferences = { ...this.hostConfiguration.preferences, ...args.preferences };
if (lazyConfiguredProjectsFromExternalProject && !this.hostConfiguration.preferences.lazyConfiguredProjectsFromExternalProject) {
this.configuredProjects.forEach((project) => {
if (project.hasExternalProjectRef() && project.pendingReload === 2 /* Full */ && !this.pendingProjectUpdates.has(project.getProjectName())) {
project.updateGraph();
}
});
}
if (includePackageJsonAutoImports !== args.preferences.includePackageJsonAutoImports) {
this.invalidateProjectPackageJson(
/*packageJsonPath*/
void 0
);
}
}
if (args.extraFileExtensions) {
this.hostConfiguration.extraFileExtensions = args.extraFileExtensions;
this.reloadProjects();
this.logger.info("Host file extension mappings updated");
}
if (args.watchOptions) {
this.hostConfiguration.watchOptions = (_a = convertWatchOptions(args.watchOptions)) == null ? void 0 : _a.watchOptions;
this.logger.info(`Host watch options changed to ${JSON.stringify(this.hostConfiguration.watchOptions)}, it will be take effect for next watches.`);
}
}
}
/** @internal */
getWatchOptions(project) {
return this.getWatchOptionsFromProjectWatchOptions(project.getWatchOptions());
}
/** @internal */
getWatchOptionsFromProjectWatchOptions(projectOptions) {
return projectOptions && this.hostConfiguration.watchOptions ? { ...this.hostConfiguration.watchOptions, ...projectOptions } : projectOptions || this.hostConfiguration.watchOptions;
}
closeLog() {
this.logger.close();
}
/**
* This function rebuilds the project for every file opened by the client
* This does not reload contents of open files from disk. But we could do that if needed
*/
reloadProjects() {
this.logger.info("reload projects.");
this.filenameToScriptInfo.forEach((info) => {
if (this.openFiles.has(info.path))
return;
if (!info.fileWatcher)
return;
this.onSourceFileChanged(info, this.host.fileExists(info.fileName) ? 1 /* Changed */ : 2 /* Deleted */);
});
this.pendingProjectUpdates.forEach((_project, projectName) => {
this.throttledOperations.cancel(projectName);
this.pendingProjectUpdates.delete(projectName);
});
this.throttledOperations.cancel(ensureProjectForOpenFileSchedule);
this.pendingEnsureProjectForOpenFiles = false;
this.configFileExistenceInfoCache.forEach((info) => {
if (info.config)
info.config.reloadLevel = 2 /* Full */;
});
this.reloadConfiguredProjectForFiles(
this.openFiles,
/*clearSemanticCache*/
true,
/*delayReload*/
false,
returnTrue,
"User requested reload projects"
);
this.externalProjects.forEach((project) => {
this.clearSemanticCache(project);
project.updateGraph();
});
this.inferredProjects.forEach((project) => this.clearSemanticCache(project));
this.ensureProjectForOpenFiles();
}
/**
* This function goes through all the openFiles and tries to file the config file for them.
* If the config file is found and it refers to existing project, it reloads it either immediately
* or schedules it for reload depending on delayReload option
* If there is no existing project it just opens the configured project for the config file
* reloadForInfo provides a way to filter out files to reload configured project for
*/
reloadConfiguredProjectForFiles(openFiles, clearSemanticCache, delayReload, shouldReloadProjectFor, reason) {
const updatedProjects = /* @__PURE__ */ new Map();
const reloadChildProject = (child) => {
if (!updatedProjects.has(child.canonicalConfigFilePath)) {
updatedProjects.set(child.canonicalConfigFilePath, true);
this.reloadConfiguredProject(
child,
reason,
/*isInitialLoad*/
false,
clearSemanticCache
);
}
};
openFiles == null ? void 0 : openFiles.forEach((openFileValue, path) => {
this.configFileForOpenFiles.delete(path);
if (!shouldReloadProjectFor(openFileValue)) {
return;
}
const info = this.getScriptInfoForPath(path);
Debug.assert(info.isScriptOpen());
const configFileName = this.getConfigFileNameForFile(info);
if (configFileName) {
const project = this.findConfiguredProjectByProjectName(configFileName) || this.createConfiguredProject(configFileName);
if (!updatedProjects.has(project.canonicalConfigFilePath)) {
updatedProjects.set(project.canonicalConfigFilePath, true);
if (delayReload) {
project.pendingReload = 2 /* Full */;
project.pendingReloadReason = reason;
if (clearSemanticCache)
this.clearSemanticCache(project);
this.delayUpdateProjectGraph(project);
} else {
this.reloadConfiguredProject(
project,
reason,
/*isInitialLoad*/
false,
clearSemanticCache
);
if (!projectContainsInfoDirectly(project, info)) {
const referencedProject = forEachResolvedProjectReferenceProject(
project,
info.path,
(child) => {
reloadChildProject(child);
return projectContainsInfoDirectly(child, info);
},
1 /* FindCreate */
);
if (referencedProject) {
forEachResolvedProjectReferenceProject(
project,
/*fileName*/
void 0,
reloadChildProject,
0 /* Find */
);
}
}
}
}
}
});
}
/**
* Remove the root of inferred project if script info is part of another project
*/
removeRootOfInferredProjectIfNowPartOfOtherProject(info) {
Debug.assert(info.containingProjects.length > 0);
const firstProject = info.containingProjects[0];
if (!firstProject.isOrphan() && isInferredProject(firstProject) && firstProject.isRoot(info) && forEach(info.containingProjects, (p) => p !== firstProject && !p.isOrphan())) {
firstProject.removeFile(
info,
/*fileExists*/
true,
/*detachFromProject*/
true
);
}
}
/**
* This function is to update the project structure for every inferred project.
* It is called on the premise that all the configured projects are
* up to date.
* This will go through open files and assign them to inferred project if open file is not part of any other project
* After that all the inferred project graphs are updated
*/
ensureProjectForOpenFiles() {
this.logger.info("Before ensureProjectForOpenFiles:");
this.printProjects();
this.openFiles.forEach((projectRootPath, path) => {
const info = this.getScriptInfoForPath(path);
if (info.isOrphan()) {
this.assignOrphanScriptInfoToInferredProject(info, projectRootPath);
} else {
this.removeRootOfInferredProjectIfNowPartOfOtherProject(info);
}
});
this.pendingEnsureProjectForOpenFiles = false;
this.inferredProjects.forEach(updateProjectIfDirty);
this.logger.info("After ensureProjectForOpenFiles:");
this.printProjects();
}
/**
* Open file whose contents is managed by the client
* @param filename is absolute pathname
* @param fileContent is a known version of the file content that is more up to date than the one on disk
*/
openClientFile(fileName, fileContent, scriptKind, projectRootPath) {
return this.openClientFileWithNormalizedPath(
toNormalizedPath(fileName),
fileContent,
scriptKind,
/*hasMixedContent*/
false,
projectRootPath ? toNormalizedPath(projectRootPath) : void 0
);
}
/** @internal */
getOriginalLocationEnsuringConfiguredProject(project, location) {
const isSourceOfProjectReferenceRedirect = project.isSourceOfProjectReferenceRedirect(location.fileName);
const originalLocation = isSourceOfProjectReferenceRedirect ? location : project.getSourceMapper().tryGetSourcePosition(location);
if (!originalLocation)
return void 0;
const { fileName } = originalLocation;
const scriptInfo = this.getScriptInfo(fileName);
if (!scriptInfo && !this.host.fileExists(fileName))
return void 0;
const originalFileInfo = { fileName: toNormalizedPath(fileName), path: this.toPath(fileName) };
const configFileName = this.getConfigFileNameForFile(originalFileInfo);
if (!configFileName)
return void 0;
let configuredProject = this.findConfiguredProjectByProjectName(configFileName);
if (!configuredProject) {
if (project.getCompilerOptions().disableReferencedProjectLoad) {
if (isSourceOfProjectReferenceRedirect) {
return location;
}
return (scriptInfo == null ? void 0 : scriptInfo.containingProjects.length) ? originalLocation : location;
}
configuredProject = this.createAndLoadConfiguredProject(configFileName, `Creating project for original file: ${originalFileInfo.fileName}${location !== originalLocation ? " for location: " + location.fileName : ""}`);
}
updateProjectIfDirty(configuredProject);
const projectContainsOriginalInfo = (project2) => {
const info = this.getScriptInfo(fileName);
return info && projectContainsInfoDirectly(project2, info);
};
if (configuredProject.isSolution() || !projectContainsOriginalInfo(configuredProject)) {
configuredProject = forEachResolvedProjectReferenceProject(
configuredProject,
fileName,
(child) => {
updateProjectIfDirty(child);
return projectContainsOriginalInfo(child) ? child : void 0;
},
2 /* FindCreateLoad */,
`Creating project referenced in solution ${configuredProject.projectName} to find possible configured project for original file: ${originalFileInfo.fileName}${location !== originalLocation ? " for location: " + location.fileName : ""}`
);
if (!configuredProject)
return void 0;
if (configuredProject === project)
return originalLocation;
}
addOriginalConfiguredProject(configuredProject);
const originalScriptInfo = this.getScriptInfo(fileName);
if (!originalScriptInfo || !originalScriptInfo.containingProjects.length)
return void 0;
originalScriptInfo.containingProjects.forEach((project2) => {
if (isConfiguredProject(project2)) {
addOriginalConfiguredProject(project2);
}
});
return originalLocation;
function addOriginalConfiguredProject(originalProject) {
if (!project.originalConfiguredProjects) {
project.originalConfiguredProjects = /* @__PURE__ */ new Set();
}
project.originalConfiguredProjects.add(originalProject.canonicalConfigFilePath);
}
}
/** @internal */
fileExists(fileName) {
return !!this.getScriptInfoForNormalizedPath(fileName) || this.host.fileExists(fileName);
}
findExternalProjectContainingOpenScriptInfo(info) {
return find(this.externalProjects, (proj) => {
updateProjectIfDirty(proj);
return proj.containsScriptInfo(info);
});
}
getOrCreateOpenScriptInfo(fileName, fileContent, scriptKind, hasMixedContent, projectRootPath) {
const info = this.getOrCreateScriptInfoOpenedByClientForNormalizedPath(fileName, projectRootPath ? this.getNormalizedAbsolutePath(projectRootPath) : this.currentDirectory, fileContent, scriptKind, hasMixedContent);
this.openFiles.set(info.path, projectRootPath);
return info;
}
assignProjectToOpenedScriptInfo(info) {
let configFileName;
let configFileErrors;
let project = this.findExternalProjectContainingOpenScriptInfo(info);
let retainProjects;
let projectForConfigFileDiag;
let defaultConfigProjectIsCreated = false;
if (!project && this.serverMode === 0 /* Semantic */) {
configFileName = this.getConfigFileNameForFile(info);
if (configFileName) {
project = this.findConfiguredProjectByProjectName(configFileName);
if (!project) {
project = this.createLoadAndUpdateConfiguredProject(configFileName, `Creating possible configured project for ${info.fileName} to open`);
defaultConfigProjectIsCreated = true;
} else {
updateProjectIfDirty(project);
}
projectForConfigFileDiag = project.containsScriptInfo(info) ? project : void 0;
retainProjects = project;
if (!projectContainsInfoDirectly(project, info)) {
forEachResolvedProjectReferenceProject(
project,
info.path,
(child) => {
updateProjectIfDirty(child);
if (!isArray(retainProjects)) {
retainProjects = [project, child];
} else {
retainProjects.push(child);
}
if (projectContainsInfoDirectly(child, info)) {
projectForConfigFileDiag = child;
return child;
}
if (!projectForConfigFileDiag && child.containsScriptInfo(info)) {
projectForConfigFileDiag = child;
}
},
2 /* FindCreateLoad */,
`Creating project referenced in solution ${project.projectName} to find possible configured project for ${info.fileName} to open`
);
}
if (projectForConfigFileDiag) {
configFileName = projectForConfigFileDiag.getConfigFilePath();
if (projectForConfigFileDiag !== project || defaultConfigProjectIsCreated) {
configFileErrors = projectForConfigFileDiag.getAllProjectErrors();
this.sendConfigFileDiagEvent(projectForConfigFileDiag, info.fileName);
}
} else {
configFileName = void 0;
}
this.createAncestorProjects(info, project);
}
}
info.containingProjects.forEach(updateProjectIfDirty);
if (info.isOrphan()) {
if (isArray(retainProjects)) {
retainProjects.forEach((project2) => this.sendConfigFileDiagEvent(project2, info.fileName));
} else if (retainProjects) {
this.sendConfigFileDiagEvent(retainProjects, info.fileName);
}
Debug.assert(this.openFiles.has(info.path));
this.assignOrphanScriptInfoToInferredProject(info, this.openFiles.get(info.path));
}
Debug.assert(!info.isOrphan());
return { configFileName, configFileErrors, retainProjects };
}
createAncestorProjects(info, project) {
if (!info.isAttached(project))
return;
while (true) {
if (!project.isInitialLoadPending() && (!project.getCompilerOptions().composite || project.getCompilerOptions().disableSolutionSearching))
return;
const configFileName = this.getConfigFileNameForFile({
fileName: project.getConfigFilePath(),
path: info.path,
configFileInfo: true
});
if (!configFileName)
return;
const ancestor = this.findConfiguredProjectByProjectName(configFileName) || this.createConfiguredProjectWithDelayLoad(configFileName, `Creating project possibly referencing default composite project ${project.getProjectName()} of open file ${info.fileName}`);
if (ancestor.isInitialLoadPending()) {
ancestor.setPotentialProjectReference(project.canonicalConfigFilePath);
}
project = ancestor;
}
}
/** @internal */
loadAncestorProjectTree(forProjects) {
forProjects = forProjects || mapDefinedEntries(
this.configuredProjects,
(key, project) => !project.isInitialLoadPending() ? [key, true] : void 0
);
const seenProjects = /* @__PURE__ */ new Set();
for (const project of arrayFrom(this.configuredProjects.values())) {
if (forEachPotentialProjectReference(project, (potentialRefPath) => forProjects.has(potentialRefPath))) {
updateProjectIfDirty(project);
}
this.ensureProjectChildren(project, forProjects, seenProjects);
}
}
ensureProjectChildren(project, forProjects, seenProjects) {
var _a;
if (!tryAddToSet(seenProjects, project.canonicalConfigFilePath))
return;
if (project.getCompilerOptions().disableReferencedProjectLoad)
return;
const children = (_a = project.getCurrentProgram()) == null ? void 0 : _a.getResolvedProjectReferences();
if (!children)
return;
for (const child of children) {
if (!child)
continue;
const referencedProject = forEachResolvedProjectReference(child.references, (ref) => forProjects.has(ref.sourceFile.path) ? ref : void 0);
if (!referencedProject)
continue;
const configFileName = toNormalizedPath(child.sourceFile.fileName);
const childProject = project.projectService.findConfiguredProjectByProjectName(configFileName) || project.projectService.createAndLoadConfiguredProject(configFileName, `Creating project referenced by : ${project.projectName} as it references project ${referencedProject.sourceFile.fileName}`);
updateProjectIfDirty(childProject);
this.ensureProjectChildren(childProject, forProjects, seenProjects);
}
}
cleanupAfterOpeningFile(toRetainConfigProjects) {
this.removeOrphanConfiguredProjects(toRetainConfigProjects);
for (const inferredProject of this.inferredProjects.slice()) {
if (inferredProject.isOrphan()) {
this.removeProject(inferredProject);
}
}
this.removeOrphanScriptInfos();
}
openClientFileWithNormalizedPath(fileName, fileContent, scriptKind, hasMixedContent, projectRootPath) {
const info = this.getOrCreateOpenScriptInfo(fileName, fileContent, scriptKind, hasMixedContent, projectRootPath);
const { retainProjects, ...result } = this.assignProjectToOpenedScriptInfo(info);
this.cleanupAfterOpeningFile(retainProjects);
this.telemetryOnOpenFile(info);
this.printProjects();
return result;
}
removeOrphanConfiguredProjects(toRetainConfiguredProjects) {
const toRemoveConfiguredProjects = new Map(this.configuredProjects);
const markOriginalProjectsAsUsed = (project) => {
if (!project.isOrphan() && project.originalConfiguredProjects) {
project.originalConfiguredProjects.forEach(
(_value, configuredProjectPath) => {
const project2 = this.getConfiguredProjectByCanonicalConfigFilePath(configuredProjectPath);
return project2 && retainConfiguredProject(project2);
}
);
}
};
if (toRetainConfiguredProjects) {
if (isArray(toRetainConfiguredProjects)) {
toRetainConfiguredProjects.forEach(retainConfiguredProject);
} else {
retainConfiguredProject(toRetainConfiguredProjects);
}
}
this.inferredProjects.forEach(markOriginalProjectsAsUsed);
this.externalProjects.forEach(markOriginalProjectsAsUsed);
this.configuredProjects.forEach((project) => {
if (project.hasOpenRef()) {
retainConfiguredProject(project);
} else if (toRemoveConfiguredProjects.has(project.canonicalConfigFilePath)) {
forEachReferencedProject(
project,
(ref) => isRetained(ref) && retainConfiguredProject(project)
);
}
});
toRemoveConfiguredProjects.forEach((project) => this.removeProject(project));
function isRetained(project) {
return project.hasOpenRef() || !toRemoveConfiguredProjects.has(project.canonicalConfigFilePath);
}
function retainConfiguredProject(project) {
if (toRemoveConfiguredProjects.delete(project.canonicalConfigFilePath)) {
markOriginalProjectsAsUsed(project);
forEachReferencedProject(project, retainConfiguredProject);
}
}
}
removeOrphanScriptInfos() {
const toRemoveScriptInfos = new Map(this.filenameToScriptInfo);
this.filenameToScriptInfo.forEach((info) => {
if (!info.isScriptOpen() && info.isOrphan() && !info.isContainedByBackgroundProject()) {
if (!info.sourceMapFilePath)
return;
let sourceInfos;
if (isString(info.sourceMapFilePath)) {
const sourceMapInfo = this.getScriptInfoForPath(info.sourceMapFilePath);
sourceInfos = sourceMapInfo && sourceMapInfo.sourceInfos;
} else {
sourceInfos = info.sourceMapFilePath.sourceInfos;
}
if (!sourceInfos)
return;
if (!forEachKey(sourceInfos, (path) => {
const info2 = this.getScriptInfoForPath(path);
return !!info2 && (info2.isScriptOpen() || !info2.isOrphan());
})) {
return;
}
}
toRemoveScriptInfos.delete(info.path);
if (info.sourceMapFilePath) {
let sourceInfos;
if (isString(info.sourceMapFilePath)) {
toRemoveScriptInfos.delete(info.sourceMapFilePath);
const sourceMapInfo = this.getScriptInfoForPath(info.sourceMapFilePath);
sourceInfos = sourceMapInfo && sourceMapInfo.sourceInfos;
} else {
sourceInfos = info.sourceMapFilePath.sourceInfos;
}
if (sourceInfos) {
sourceInfos.forEach((_value, path) => toRemoveScriptInfos.delete(path));
}
}
});
toRemoveScriptInfos.forEach((info) => {
this.stopWatchingScriptInfo(info);
this.deleteScriptInfo(info);
info.closeSourceMapFileWatcher();
});
}
telemetryOnOpenFile(scriptInfo) {
if (this.serverMode !== 0 /* Semantic */ || !this.eventHandler || !scriptInfo.isJavaScript() || !addToSeen(this.allJsFilesForOpenFileTelemetry, scriptInfo.path)) {
return;
}
const project = this.ensureDefaultProjectForFile(scriptInfo);
if (!project.languageServiceEnabled) {
return;
}
const sourceFile = project.getSourceFile(scriptInfo.path);
const checkJs = !!sourceFile && !!sourceFile.checkJsDirective;
this.eventHandler({ eventName: OpenFileInfoTelemetryEvent, data: { info: { checkJs } } });
}
closeClientFile(uncheckedFileName, skipAssignOrphanScriptInfosToInferredProject) {
const info = this.getScriptInfoForNormalizedPath(toNormalizedPath(uncheckedFileName));
const result = info ? this.closeOpenFile(info, skipAssignOrphanScriptInfosToInferredProject) : false;
if (!skipAssignOrphanScriptInfosToInferredProject) {
this.printProjects();
}
return result;
}
collectChanges(lastKnownProjectVersions, currentProjects, includeProjectReferenceRedirectInfo, result) {
for (const proj of currentProjects) {
const knownProject = find(lastKnownProjectVersions, (p) => p.projectName === proj.getProjectName());
result.push(proj.getChangesSinceVersion(knownProject && knownProject.version, includeProjectReferenceRedirectInfo));
}
}
/** @internal */
synchronizeProjectList(knownProjects, includeProjectReferenceRedirectInfo) {
const files = [];
this.collectChanges(knownProjects, this.externalProjects, includeProjectReferenceRedirectInfo, files);
this.collectChanges(knownProjects, this.configuredProjects.values(), includeProjectReferenceRedirectInfo, files);
this.collectChanges(knownProjects, this.inferredProjects, includeProjectReferenceRedirectInfo, files);
return files;
}
/** @internal */
applyChangesInOpenFiles(openFiles, changedFiles, closedFiles) {
let openScriptInfos;
let assignOrphanScriptInfosToInferredProject = false;
if (openFiles) {
for (const file of openFiles) {
const info = this.getOrCreateOpenScriptInfo(
toNormalizedPath(file.fileName),
file.content,
tryConvertScriptKindName(file.scriptKind),
file.hasMixedContent,
file.projectRootPath ? toNormalizedPath(file.projectRootPath) : void 0
);
(openScriptInfos || (openScriptInfos = [])).push(info);
}
}
if (changedFiles) {
for (const file of changedFiles) {
const scriptInfo = this.getScriptInfo(file.fileName);
Debug.assert(!!scriptInfo);
this.applyChangesToFile(scriptInfo, file.changes);
}
}
if (closedFiles) {
for (const file of closedFiles) {
assignOrphanScriptInfosToInferredProject = this.closeClientFile(
file,
/*skipAssignOrphanScriptInfosToInferredProject*/
true
) || assignOrphanScriptInfosToInferredProject;
}
}
let retainProjects;
if (openScriptInfos) {
retainProjects = flatMap(openScriptInfos, (info) => this.assignProjectToOpenedScriptInfo(info).retainProjects);
}
if (assignOrphanScriptInfosToInferredProject) {
this.assignOrphanScriptInfosToInferredProject();
}
if (openScriptInfos) {
this.cleanupAfterOpeningFile(retainProjects);
openScriptInfos.forEach((info) => this.telemetryOnOpenFile(info));
this.printProjects();
} else if (length(closedFiles)) {
this.printProjects();
}
}
/** @internal */
applyChangesToFile(scriptInfo, changes) {
for (const change of changes) {
scriptInfo.editContent(change.span.start, change.span.start + change.span.length, change.newText);
}
}
closeConfiguredProjectReferencedFromExternalProject(configFile) {
const configuredProject = this.findConfiguredProjectByProjectName(configFile);
if (configuredProject) {
configuredProject.deleteExternalProjectReference();
if (!configuredProject.hasOpenRef()) {
this.removeProject(configuredProject);
return;
}
}
}
closeExternalProject(uncheckedFileName) {
const fileName = toNormalizedPath(uncheckedFileName);
const configFiles = this.externalProjectToConfiguredProjectMap.get(fileName);
if (configFiles) {
for (const configFile of configFiles) {
this.closeConfiguredProjectReferencedFromExternalProject(configFile);
}
this.externalProjectToConfiguredProjectMap.delete(fileName);
} else {
const externalProject = this.findExternalProjectByProjectName(uncheckedFileName);
if (externalProject) {
this.removeProject(externalProject);
}
}
}
openExternalProjects(projects) {
const projectsToClose = arrayToMap(this.externalProjects, (p) => p.getProjectName(), (_) => true);
forEachKey(this.externalProjectToConfiguredProjectMap, (externalProjectName) => {
projectsToClose.set(externalProjectName, true);
});
for (const externalProject of projects) {
this.openExternalProject(externalProject);
projectsToClose.delete(externalProject.projectFileName);
}
forEachKey(projectsToClose, (externalProjectName) => {
this.closeExternalProject(externalProjectName);
});
}
static escapeFilenameForRegex(filename) {
return filename.replace(this.filenameEscapeRegexp, "\\$&");
}
resetSafeList() {
this.safelist = defaultTypeSafeList;
}
applySafeList(proj) {
const { rootFiles } = proj;
const typeAcquisition = proj.typeAcquisition;
Debug.assert(!!typeAcquisition, "proj.typeAcquisition should be set by now");
if (typeAcquisition.enable === false || typeAcquisition.disableFilenameBasedTypeAcquisition) {
return [];
}
const typeAcqInclude = typeAcquisition.include || (typeAcquisition.include = []);
const excludeRules = [];
const normalizedNames = rootFiles.map((f) => normalizeSlashes(f.fileName));
const excludedFiles = [];
for (const name of Object.keys(this.safelist)) {
const rule2 = this.safelist[name];
for (const root of normalizedNames) {
if (rule2.match.test(root)) {
this.logger.info(`Excluding files based on rule ${name} matching file '${root}'`);
if (rule2.types) {
for (const type of rule2.types) {
if (typeAcqInclude.indexOf(type) < 0) {
typeAcqInclude.push(type);
}
}
}
if (rule2.exclude) {
for (const exclude of rule2.exclude) {
const processedRule = root.replace(rule2.match, (...groups) => {
return exclude.map((groupNumberOrString) => {
if (typeof groupNumberOrString === "number") {
if (!isString(groups[groupNumberOrString])) {
this.logger.info(`Incorrect RegExp specification in safelist rule ${name} - not enough groups`);
return "\\*";
}
return _ProjectService.escapeFilenameForRegex(groups[groupNumberOrString]);
}
return groupNumberOrString;
}).join("");
});
if (excludeRules.indexOf(processedRule) === -1) {
excludeRules.push(processedRule);
}
}
} else {
const escaped = _ProjectService.escapeFilenameForRegex(root);
if (excludeRules.indexOf(escaped) < 0) {
excludeRules.push(escaped);
}
}
}
}
}
const excludeRegexes = excludeRules.map((e) => new RegExp(e, "i"));
const filesToKeep = [];
for (let i = 0; i < proj.rootFiles.length; i++) {
if (excludeRegexes.some((re) => re.test(normalizedNames[i]))) {
excludedFiles.push(normalizedNames[i]);
} else {
let exclude = false;
if (typeAcquisition.enable) {
const baseName = getBaseFileName(toFileNameLowerCase(normalizedNames[i]));
if (fileExtensionIs(baseName, "js")) {
const inferredTypingName = removeFileExtension(baseName);
const cleanedTypingName = removeMinAndVersionNumbers(inferredTypingName);
const typeName = this.legacySafelist.get(cleanedTypingName);
if (typeName !== void 0) {
this.logger.info(`Excluded '${normalizedNames[i]}' because it matched ${cleanedTypingName} from the legacy safelist`);
excludedFiles.push(normalizedNames[i]);
exclude = true;
if (typeAcqInclude.indexOf(typeName) < 0) {
typeAcqInclude.push(typeName);
}
}
}
}
if (!exclude) {
if (/^.+[\.-]min\.js$/.test(normalizedNames[i])) {
excludedFiles.push(normalizedNames[i]);
} else {
filesToKeep.push(proj.rootFiles[i]);
}
}
}
}
proj.rootFiles = filesToKeep;
return excludedFiles;
}
openExternalProject(proj) {
proj.typeAcquisition = proj.typeAcquisition || {};
proj.typeAcquisition.include = proj.typeAcquisition.include || [];
proj.typeAcquisition.exclude = proj.typeAcquisition.exclude || [];
if (proj.typeAcquisition.enable === void 0) {
proj.typeAcquisition.enable = hasNoTypeScriptSource(proj.rootFiles.map((f) => f.fileName));
}
const excludedFiles = this.applySafeList(proj);
let tsConfigFiles;
const rootFiles = [];
for (const file of proj.rootFiles) {
const normalized = toNormalizedPath(file.fileName);
if (getBaseConfigFileName(normalized)) {
if (this.serverMode === 0 /* Semantic */ && this.host.fileExists(normalized)) {
(tsConfigFiles || (tsConfigFiles = [])).push(normalized);
}
} else {
rootFiles.push(file);
}
}
if (tsConfigFiles) {
tsConfigFiles.sort();
}
const externalProject = this.findExternalProjectByProjectName(proj.projectFileName);
let exisingConfigFiles;
if (externalProject) {
externalProject.excludedFiles = excludedFiles;
if (!tsConfigFiles) {
const compilerOptions = convertCompilerOptions(proj.options);
const watchOptionsAndErrors = convertWatchOptions(proj.options, externalProject.getCurrentDirectory());
const lastFileExceededProgramSize = this.getFilenameForExceededTotalSizeLimitForNonTsFiles(proj.projectFileName, compilerOptions, proj.rootFiles, externalFilePropertyReader);
if (lastFileExceededProgramSize) {
externalProject.disableLanguageService(lastFileExceededProgramSize);
} else {
externalProject.enableLanguageService();
}
externalProject.setProjectErrors(watchOptionsAndErrors == null ? void 0 : watchOptionsAndErrors.errors);
this.updateRootAndOptionsOfNonInferredProject(externalProject, proj.rootFiles, externalFilePropertyReader, compilerOptions, proj.typeAcquisition, proj.options.compileOnSave, watchOptionsAndErrors == null ? void 0 : watchOptionsAndErrors.watchOptions);
externalProject.updateGraph();
return;
}
this.closeExternalProject(proj.projectFileName);
} else if (this.externalProjectToConfiguredProjectMap.get(proj.projectFileName)) {
if (!tsConfigFiles) {
this.closeExternalProject(proj.projectFileName);
} else {
const oldConfigFiles = this.externalProjectToConfiguredProjectMap.get(proj.projectFileName);
let iNew = 0;
let iOld = 0;
while (iNew < tsConfigFiles.length && iOld < oldConfigFiles.length) {
const newConfig = tsConfigFiles[iNew];
const oldConfig = oldConfigFiles[iOld];
if (oldConfig < newConfig) {
this.closeConfiguredProjectReferencedFromExternalProject(oldConfig);
iOld++;
} else if (oldConfig > newConfig) {
iNew++;
} else {
(exisingConfigFiles || (exisingConfigFiles = [])).push(oldConfig);
iOld++;
iNew++;
}
}
for (let i = iOld; i < oldConfigFiles.length; i++) {
this.closeConfiguredProjectReferencedFromExternalProject(oldConfigFiles[i]);
}
}
}
if (tsConfigFiles) {
this.externalProjectToConfiguredProjectMap.set(proj.projectFileName, tsConfigFiles);
for (const tsconfigFile of tsConfigFiles) {
let project = this.findConfiguredProjectByProjectName(tsconfigFile);
if (!project) {
project = this.getHostPreferences().lazyConfiguredProjectsFromExternalProject ? this.createConfiguredProjectWithDelayLoad(tsconfigFile, `Creating configured project in external project: ${proj.projectFileName}`) : this.createLoadAndUpdateConfiguredProject(tsconfigFile, `Creating configured project in external project: ${proj.projectFileName}`);
}
if (project && !contains(exisingConfigFiles, tsconfigFile)) {
project.addExternalProjectReference();
}
}
} else {
this.externalProjectToConfiguredProjectMap.delete(proj.projectFileName);
const project = this.createExternalProject(proj.projectFileName, rootFiles, proj.options, proj.typeAcquisition, excludedFiles);
project.updateGraph();
}
}
hasDeferredExtension() {
for (const extension of this.hostConfiguration.extraFileExtensions) {
if (extension.scriptKind === 7 /* Deferred */) {
return true;
}
}
return false;
}
/**
* Performs the initial steps of enabling a plugin by finding and instantiating the module for a plugin either asynchronously or synchronously
* @internal
*/
requestEnablePlugin(project, pluginConfigEntry, searchPaths) {
if (!this.host.importPlugin && !this.host.require) {
this.logger.info("Plugins were requested but not running in environment that supports 'require'. Nothing will be loaded");
return;
}
this.logger.info(`Enabling plugin ${pluginConfigEntry.name} from candidate paths: ${searchPaths.join(",")}`);
if (!pluginConfigEntry.name || parsePackageName(pluginConfigEntry.name).rest) {
this.logger.info(`Skipped loading plugin ${pluginConfigEntry.name || JSON.stringify(pluginConfigEntry)} because only package name is allowed plugin name`);
return;
}
if (this.host.importPlugin) {
const importPromise = Project3.importServicePluginAsync(
pluginConfigEntry,
searchPaths,
this.host,
(s) => this.logger.info(s)
);
this.pendingPluginEnablements ?? (this.pendingPluginEnablements = /* @__PURE__ */ new Map());
let promises = this.pendingPluginEnablements.get(project);
if (!promises)
this.pendingPluginEnablements.set(project, promises = []);
promises.push(importPromise);
return;
}
this.endEnablePlugin(project, Project3.importServicePluginSync(
pluginConfigEntry,
searchPaths,
this.host,
(s) => this.logger.info(s)
));
}
/**
* Performs the remaining steps of enabling a plugin after its module has been instantiated.
* @internal
*/
endEnablePlugin(project, { pluginConfigEntry, resolvedModule, errorLogs }) {
var _a;
if (resolvedModule) {
const configurationOverride = (_a = this.currentPluginConfigOverrides) == null ? void 0 : _a.get(pluginConfigEntry.name);
if (configurationOverride) {
const pluginName = pluginConfigEntry.name;
pluginConfigEntry = configurationOverride;
pluginConfigEntry.name = pluginName;
}
project.enableProxy(resolvedModule, pluginConfigEntry);
} else {
forEach(errorLogs, (message) => this.logger.info(message));
this.logger.info(`Couldn't find ${pluginConfigEntry.name}`);
}
}
/** @internal */
hasNewPluginEnablementRequests() {
return !!this.pendingPluginEnablements;
}
/** @internal */
hasPendingPluginEnablements() {
return !!this.currentPluginEnablementPromise;
}
/**
* Waits for any ongoing plugin enablement requests to complete.
*
* @internal
*/
async waitForPendingPlugins() {
while (this.currentPluginEnablementPromise) {
await this.currentPluginEnablementPromise;
}
}
/**
* Starts enabling any requested plugins without waiting for the result.
*
* @internal
*/
enableRequestedPlugins() {
if (this.pendingPluginEnablements) {
void this.enableRequestedPluginsAsync();
}
}
async enableRequestedPluginsAsync() {
if (this.currentPluginEnablementPromise) {
await this.waitForPendingPlugins();
}
if (!this.pendingPluginEnablements) {
return;
}
const entries = arrayFrom(this.pendingPluginEnablements.entries());
this.pendingPluginEnablements = void 0;
this.currentPluginEnablementPromise = this.enableRequestedPluginsWorker(entries);
await this.currentPluginEnablementPromise;
}
async enableRequestedPluginsWorker(pendingPlugins) {
Debug.assert(this.currentPluginEnablementPromise === void 0);
await Promise.all(map(pendingPlugins, ([project, promises]) => this.enableRequestedPluginsForProjectAsync(project, promises)));
this.currentPluginEnablementPromise = void 0;
this.sendProjectsUpdatedInBackgroundEvent();
}
async enableRequestedPluginsForProjectAsync(project, promises) {
const results = await Promise.all(promises);
if (project.isClosed()) {
return;
}
for (const result of results) {
this.endEnablePlugin(project, result);
}
this.delayUpdateProjectGraph(project);
}
configurePlugin(args) {
this.forEachEnabledProject((project) => project.onPluginConfigurationChanged(args.pluginName, args.configuration));
this.currentPluginConfigOverrides = this.currentPluginConfigOverrides || /* @__PURE__ */ new Map();
this.currentPluginConfigOverrides.set(args.pluginName, args.configuration);
}
/** @internal */
getPackageJsonsVisibleToFile(fileName, rootDir) {
const packageJsonCache = this.packageJsonCache;
const rootPath = rootDir && this.toPath(rootDir);
const filePath = this.toPath(fileName);
const result = [];
const processDirectory = (directory) => {
switch (packageJsonCache.directoryHasPackageJson(directory)) {
case 3 /* Maybe */:
packageJsonCache.searchDirectoryAndAncestors(directory);
return processDirectory(directory);
case -1 /* True */:
const packageJsonFileName = combinePaths(directory, "package.json");
this.watchPackageJsonFile(packageJsonFileName);
const info = packageJsonCache.getInDirectory(directory);
if (info)
result.push(info);
}
if (rootPath && rootPath === directory) {
return true;
}
};
forEachAncestorDirectory(getDirectoryPath(filePath), processDirectory);
return result;
}
/** @internal */
getNearestAncestorDirectoryWithPackageJson(fileName) {
return forEachAncestorDirectory(fileName, (directory) => {
switch (this.packageJsonCache.directoryHasPackageJson(this.toPath(directory))) {
case -1 /* True */:
return directory;
case 0 /* False */:
return void 0;
case 3 /* Maybe */:
return this.host.fileExists(combinePaths(directory, "package.json")) ? directory : void 0;
}
});
}
/** @internal */
watchPackageJsonFile(path) {
const watchers = this.packageJsonFilesMap || (this.packageJsonFilesMap = /* @__PURE__ */ new Map());
if (!watchers.has(path)) {
this.invalidateProjectPackageJson(path);
watchers.set(path, this.watchFactory.watchFile(
path,
(fileName, eventKind) => {
const path2 = this.toPath(fileName);
switch (eventKind) {
case 0 /* Created */:
return Debug.fail();
case 1 /* Changed */:
this.packageJsonCache.addOrUpdate(path2);
this.invalidateProjectPackageJson(path2);
break;
case 2 /* Deleted */:
this.packageJsonCache.delete(path2);
this.invalidateProjectPackageJson(path2);
watchers.get(path2).close();
watchers.delete(path2);
}
},
250 /* Low */,
this.hostConfiguration.watchOptions,
WatchType.PackageJson
));
}
}
/** @internal */
onAddPackageJson(path) {
this.packageJsonCache.addOrUpdate(path);
this.watchPackageJsonFile(path);
}
/** @internal */
includePackageJsonAutoImports() {
switch (this.hostConfiguration.preferences.includePackageJsonAutoImports) {
case "on":
return 1 /* On */;
case "off":
return 0 /* Off */;
default:
return 2 /* Auto */;
}
}
/** @internal */
invalidateProjectPackageJson(packageJsonPath) {
this.configuredProjects.forEach(invalidate);
this.inferredProjects.forEach(invalidate);
this.externalProjects.forEach(invalidate);
function invalidate(project) {
if (packageJsonPath) {
project.onPackageJsonChange(packageJsonPath);
} else {
project.onAutoImportProviderSettingsChanged();
}
}
}
/** @internal */
getIncompleteCompletionsCache() {
return this.incompleteCompletionsCache || (this.incompleteCompletionsCache = createIncompleteCompletionsCache());
}
};
var ProjectService3 = _ProjectService;
/** Makes a filename safe to insert in a RegExp */
ProjectService3.filenameEscapeRegexp = /[-\/\\^$*+?.()|[\]{}]/g;
function createIncompleteCompletionsCache() {
let info;
return {
get() {
return info;
},
set(newInfo) {
info = newInfo;
},
clear() {
info = void 0;
}
};
}
function isConfigFile(config) {
return config.kind !== void 0;
}
function printProjectWithoutFileNames(project) {
project.print(
/*writeProjectFileNames*/
false,
/*writeFileExplaination*/
false,
/*writeFileVersionAndText*/
false
);
}
// src/server/moduleSpecifierCache.ts
function createModuleSpecifierCache(host) {
let containedNodeModulesWatchers;
let cache;
let currentKey;
const result = {
get(fromFileName, toFileName2, preferences, options) {
if (!cache || currentKey !== key(fromFileName, preferences, options))
return void 0;
return cache.get(toFileName2);
},
set(fromFileName, toFileName2, preferences, options, modulePaths, moduleSpecifiers) {
ensureCache(fromFileName, preferences, options).set(toFileName2, createInfo(
modulePaths,
moduleSpecifiers,
/*isBlockedByPackageJsonDependencies*/
false
));
if (moduleSpecifiers) {
for (const p of modulePaths) {
if (p.isInNodeModules) {
const nodeModulesPath = p.path.substring(0, p.path.indexOf(nodeModulesPathPart) + nodeModulesPathPart.length - 1);
if (!(containedNodeModulesWatchers == null ? void 0 : containedNodeModulesWatchers.has(nodeModulesPath))) {
(containedNodeModulesWatchers || (containedNodeModulesWatchers = /* @__PURE__ */ new Map())).set(
nodeModulesPath,
host.watchNodeModulesForPackageJsonChanges(nodeModulesPath)
);
}
}
}
}
},
setModulePaths(fromFileName, toFileName2, preferences, options, modulePaths) {
const cache2 = ensureCache(fromFileName, preferences, options);
const info = cache2.get(toFileName2);
if (info) {
info.modulePaths = modulePaths;
} else {
cache2.set(toFileName2, createInfo(
modulePaths,
/*moduleSpecifiers*/
void 0,
/*isBlockedByPackageJsonDependencies*/
void 0
));
}
},
setBlockedByPackageJsonDependencies(fromFileName, toFileName2, preferences, options, isBlockedByPackageJsonDependencies) {
const cache2 = ensureCache(fromFileName, preferences, options);
const info = cache2.get(toFileName2);
if (info) {
info.isBlockedByPackageJsonDependencies = isBlockedByPackageJsonDependencies;
} else {
cache2.set(toFileName2, createInfo(
/*modulePaths*/
void 0,
/*moduleSpecifiers*/
void 0,
isBlockedByPackageJsonDependencies
));
}
},
clear() {
containedNodeModulesWatchers == null ? void 0 : containedNodeModulesWatchers.forEach((watcher) => watcher.close());
cache == null ? void 0 : cache.clear();
containedNodeModulesWatchers == null ? void 0 : containedNodeModulesWatchers.clear();
currentKey = void 0;
},
count() {
return cache ? cache.size : 0;
}
};
if (Debug.isDebugging) {
Object.defineProperty(result, "__cache", { get: () => cache });
}
return result;
function ensureCache(fromFileName, preferences, options) {
const newKey = key(fromFileName, preferences, options);
if (cache && currentKey !== newKey) {
result.clear();
}
currentKey = newKey;
return cache || (cache = /* @__PURE__ */ new Map());
}
function key(fromFileName, preferences, options) {
return `${fromFileName},${preferences.importModuleSpecifierEnding},${preferences.importModuleSpecifierPreference},${options.overrideImportMode}`;
}
function createInfo(modulePaths, moduleSpecifiers, isBlockedByPackageJsonDependencies) {
return { modulePaths, moduleSpecifiers, isBlockedByPackageJsonDependencies };
}
}
// src/server/packageJsonCache.ts
function createPackageJsonCache(host) {
const packageJsons = /* @__PURE__ */ new Map();
const directoriesWithoutPackageJson = /* @__PURE__ */ new Map();
return {
addOrUpdate,
forEach: packageJsons.forEach.bind(packageJsons),
get: packageJsons.get.bind(packageJsons),
delete: (fileName) => {
packageJsons.delete(fileName);
directoriesWithoutPackageJson.set(getDirectoryPath(fileName), true);
},
getInDirectory: (directory) => {
return packageJsons.get(combinePaths(directory, "package.json")) || void 0;
},
directoryHasPackageJson,
searchDirectoryAndAncestors: (directory) => {
forEachAncestorDirectory(directory, (ancestor) => {
if (directoryHasPackageJson(ancestor) !== 3 /* Maybe */) {
return true;
}
const packageJsonFileName = host.toPath(combinePaths(ancestor, "package.json"));
if (tryFileExists(host, packageJsonFileName)) {
addOrUpdate(packageJsonFileName);
} else {
directoriesWithoutPackageJson.set(ancestor, true);
}
});
}
};
function addOrUpdate(fileName) {
const packageJsonInfo = Debug.checkDefined(createPackageJsonInfo(fileName, host.host));
packageJsons.set(fileName, packageJsonInfo);
directoriesWithoutPackageJson.delete(getDirectoryPath(fileName));
}
function directoryHasPackageJson(directory) {
return packageJsons.has(combinePaths(directory, "package.json")) ? -1 /* True */ : directoriesWithoutPackageJson.has(directory) ? 0 /* False */ : 3 /* Maybe */;
}
}
// src/server/session.ts
var nullCancellationToken = {
isCancellationRequested: () => false,
setRequest: () => void 0,
resetRequest: () => void 0
};
function hrTimeToMilliseconds(time) {
const seconds = time[0];
const nanoseconds = time[1];
return (1e9 * seconds + nanoseconds) / 1e6;
}
function isDeclarationFileInJSOnlyNonConfiguredProject(project, file) {
if ((isInferredProject(project) || isExternalProject(project)) && project.isJsOnlyProject()) {
const scriptInfo = project.getScriptInfoForNormalizedPath(file);
return scriptInfo && !scriptInfo.isJavaScript();
}
return false;
}
function dtsChangeCanAffectEmit(compilationSettings) {
return getEmitDeclarations(compilationSettings) || !!compilationSettings.emitDecoratorMetadata;
}
function formatDiag(fileName, project, diag2) {
const scriptInfo = project.getScriptInfoForNormalizedPath(fileName);
return {
start: scriptInfo.positionToLineOffset(diag2.start),
end: scriptInfo.positionToLineOffset(diag2.start + diag2.length),
// TODO: GH#18217
text: flattenDiagnosticMessageText(diag2.messageText, "\n"),
code: diag2.code,
category: diagnosticCategoryName(diag2),
reportsUnnecessary: diag2.reportsUnnecessary,
reportsDeprecated: diag2.reportsDeprecated,
source: diag2.source,
relatedInformation: map(diag2.relatedInformation, formatRelatedInformation)
};
}
function formatRelatedInformation(info) {
if (!info.file) {
return {
message: flattenDiagnosticMessageText(info.messageText, "\n"),
category: diagnosticCategoryName(info),
code: info.code
};
}
return {
span: {
start: convertToLocation(getLineAndCharacterOfPosition(info.file, info.start)),
end: convertToLocation(getLineAndCharacterOfPosition(info.file, info.start + info.length)),
// TODO: GH#18217
file: info.file.fileName
},
message: flattenDiagnosticMessageText(info.messageText, "\n"),
category: diagnosticCategoryName(info),
code: info.code
};
}
function convertToLocation(lineAndCharacter) {
return { line: lineAndCharacter.line + 1, offset: lineAndCharacter.character + 1 };
}
function formatDiagnosticToProtocol(diag2, includeFileName) {
const start2 = diag2.file && convertToLocation(getLineAndCharacterOfPosition(diag2.file, diag2.start));
const end = diag2.file && convertToLocation(getLineAndCharacterOfPosition(diag2.file, diag2.start + diag2.length));
const text = flattenDiagnosticMessageText(diag2.messageText, "\n");
const { code, source } = diag2;
const category = diagnosticCategoryName(diag2);
const common = {
start: start2,
end,
text,
code,
category,
reportsUnnecessary: diag2.reportsUnnecessary,
reportsDeprecated: diag2.reportsDeprecated,
source,
relatedInformation: map(diag2.relatedInformation, formatRelatedInformation)
};
return includeFileName ? { ...common, fileName: diag2.file && diag2.file.fileName } : common;
}
function allEditsBeforePos(edits, pos) {
return edits.every((edit) => textSpanEnd(edit.span) < pos);
}
var CommandNames = CommandTypes;
function formatMessage2(msg, logger, byteLength, newLine) {
const verboseLogging = logger.hasLevel(3 /* verbose */);
const json = JSON.stringify(msg);
if (verboseLogging) {
logger.info(`${msg.type}:${indent2(JSON.stringify(msg, void 0, " "))}`);
}
const len = byteLength(json, "utf8");
return `Content-Length: ${1 + len}\r
\r
${json}${newLine}`;
}
var MultistepOperation = class {
constructor(operationHost) {
this.operationHost = operationHost;
}
startNew(action) {
this.complete();
this.requestId = this.operationHost.getCurrentRequestId();
this.executeAction(action);
}
complete() {
if (this.requestId !== void 0) {
this.operationHost.sendRequestCompletedEvent(this.requestId);
this.requestId = void 0;
}
this.setTimerHandle(void 0);
this.setImmediateId(void 0);
}
immediate(actionType, action) {
const requestId = this.requestId;
Debug.assert(requestId === this.operationHost.getCurrentRequestId(), "immediate: incorrect request id");
this.setImmediateId(this.operationHost.getServerHost().setImmediate(() => {
this.immediateId = void 0;
this.operationHost.executeWithRequestId(requestId, () => this.executeAction(action));
}, actionType));
}
delay(actionType, ms, action) {
const requestId = this.requestId;
Debug.assert(requestId === this.operationHost.getCurrentRequestId(), "delay: incorrect request id");
this.setTimerHandle(this.operationHost.getServerHost().setTimeout(() => {
this.timerHandle = void 0;
this.operationHost.executeWithRequestId(requestId, () => this.executeAction(action));
}, ms, actionType));
}
executeAction(action) {
var _a, _b, _c, _d, _e, _f;
let stop = false;
try {
if (this.operationHost.isCancellationRequested()) {
stop = true;
(_a = tracing) == null ? void 0 : _a.instant(tracing.Phase.Session, "stepCanceled", { seq: this.requestId, early: true });
} else {
(_b = tracing) == null ? void 0 : _b.push(tracing.Phase.Session, "stepAction", { seq: this.requestId });
action(this);
(_c = tracing) == null ? void 0 : _c.pop();
}
} catch (e) {
(_d = tracing) == null ? void 0 : _d.popAll();
stop = true;
if (e instanceof OperationCanceledException) {
(_e = tracing) == null ? void 0 : _e.instant(tracing.Phase.Session, "stepCanceled", { seq: this.requestId });
} else {
(_f = tracing) == null ? void 0 : _f.instant(tracing.Phase.Session, "stepError", { seq: this.requestId, message: e.message });
this.operationHost.logError(e, `delayed processing of request ${this.requestId}`);
}
}
if (stop || !this.hasPendingWork()) {
this.complete();
}
}
setTimerHandle(timerHandle) {
if (this.timerHandle !== void 0) {
this.operationHost.getServerHost().clearTimeout(this.timerHandle);
}
this.timerHandle = timerHandle;
}
setImmediateId(immediateId) {
if (this.immediateId !== void 0) {
this.operationHost.getServerHost().clearImmediate(this.immediateId);
}
this.immediateId = immediateId;
}
hasPendingWork() {
return !!this.timerHandle || !!this.immediateId;
}
};
function toEvent(eventName, body) {
return {
seq: 0,
type: "event",
event: eventName,
body
};
}
function combineProjectOutput(defaultValue, getValue, projects, action) {
const outputs = flatMapToMutable(isArray(projects) ? projects : projects.projects, (project) => action(project, defaultValue));
if (!isArray(projects) && projects.symLinkedProjects) {
projects.symLinkedProjects.forEach((projects2, path) => {
const value = getValue(path);
outputs.push(...flatMap(projects2, (project) => action(project, value)));
});
}
return deduplicate(outputs, equateValues);
}
function createDocumentSpanSet() {
return createSet(({ textSpan }) => textSpan.start + 100003 * textSpan.length, documentSpansEqual);
}
function getRenameLocationsWorker(projects, defaultProject, initialLocation, findInStrings, findInComments, preferences) {
const perProjectResults = getPerProjectReferences(
projects,
defaultProject,
initialLocation,
/*isForRename*/
true,
(project, position) => project.getLanguageService().findRenameLocations(position.fileName, position.pos, findInStrings, findInComments, preferences),
(renameLocation, cb) => cb(documentSpanLocation(renameLocation))
);
if (isArray(perProjectResults)) {
return perProjectResults;
}
const results = [];
const seen = createDocumentSpanSet();
perProjectResults.forEach((projectResults, project) => {
for (const result of projectResults) {
if (!seen.has(result) && !getMappedLocationForProject(documentSpanLocation(result), project)) {
results.push(result);
seen.add(result);
}
}
});
return results;
}
function getDefinitionLocation(defaultProject, initialLocation, isForRename) {
const infos = defaultProject.getLanguageService().getDefinitionAtPosition(
initialLocation.fileName,
initialLocation.pos,
/*searchOtherFilesOnly*/
false,
/*stopAtAlias*/
isForRename
);
const info = infos && firstOrUndefined(infos);
return info && !info.isLocal ? { fileName: info.fileName, pos: info.textSpan.start } : void 0;
}
function getReferencesWorker(projects, defaultProject, initialLocation, logger) {
var _a, _b;
const perProjectResults = getPerProjectReferences(
projects,
defaultProject,
initialLocation,
/*isForRename*/
false,
(project, position) => {
logger.info(`Finding references to ${position.fileName} position ${position.pos} in project ${project.getProjectName()}`);
return project.getLanguageService().findReferences(position.fileName, position.pos);
},
(referencedSymbol, cb) => {
cb(documentSpanLocation(referencedSymbol.definition));
for (const ref of referencedSymbol.references) {
cb(documentSpanLocation(ref));
}
}
);
if (isArray(perProjectResults)) {
return perProjectResults;
}
const defaultProjectResults = perProjectResults.get(defaultProject);
if (((_b = (_a = defaultProjectResults == null ? void 0 : defaultProjectResults[0]) == null ? void 0 : _a.references[0]) == null ? void 0 : _b.isDefinition) === void 0) {
perProjectResults.forEach((projectResults) => {
for (const referencedSymbol of projectResults) {
for (const ref of referencedSymbol.references) {
delete ref.isDefinition;
}
}
});
} else {
const knownSymbolSpans = createDocumentSpanSet();
for (const referencedSymbol of defaultProjectResults) {
for (const ref of referencedSymbol.references) {
if (ref.isDefinition) {
knownSymbolSpans.add(ref);
break;
}
}
}
const updatedProjects = /* @__PURE__ */ new Set();
while (true) {
let progress = false;
perProjectResults.forEach((referencedSymbols, project) => {
if (updatedProjects.has(project))
return;
const updated = project.getLanguageService().updateIsDefinitionOfReferencedSymbols(referencedSymbols, knownSymbolSpans);
if (updated) {
updatedProjects.add(project);
progress = true;
}
});
if (!progress)
break;
}
perProjectResults.forEach((referencedSymbols, project) => {
if (updatedProjects.has(project))
return;
for (const referencedSymbol of referencedSymbols) {
for (const ref of referencedSymbol.references) {
ref.isDefinition = false;
}
}
});
}
const results = [];
const seenRefs = createDocumentSpanSet();
perProjectResults.forEach((projectResults, project) => {
for (const referencedSymbol of projectResults) {
const mappedDefinitionFile = getMappedLocationForProject(documentSpanLocation(referencedSymbol.definition), project);
const definition = mappedDefinitionFile === void 0 ? referencedSymbol.definition : {
...referencedSymbol.definition,
textSpan: createTextSpan(mappedDefinitionFile.pos, referencedSymbol.definition.textSpan.length),
// Why would the length be the same in the original?
fileName: mappedDefinitionFile.fileName,
contextSpan: getMappedContextSpanForProject(referencedSymbol.definition, project)
};
let symbolToAddTo = find(results, (o) => documentSpansEqual(o.definition, definition));
if (!symbolToAddTo) {
symbolToAddTo = { definition, references: [] };
results.push(symbolToAddTo);
}
for (const ref of referencedSymbol.references) {
if (!seenRefs.has(ref) && !getMappedLocationForProject(documentSpanLocation(ref), project)) {
seenRefs.add(ref);
symbolToAddTo.references.push(ref);
}
}
}
});
return results.filter((o) => o.references.length !== 0);
}
function forEachProjectInProjects(projects, path, cb) {
for (const project of isArray(projects) ? projects : projects.projects) {
cb(project, path);
}
if (!isArray(projects) && projects.symLinkedProjects) {
projects.symLinkedProjects.forEach((symlinkedProjects, symlinkedPath) => {
for (const project of symlinkedProjects) {
cb(project, symlinkedPath);
}
});
}
}
function getPerProjectReferences(projects, defaultProject, initialLocation, isForRename, getResultsForPosition, forPositionInResult) {
const resultsMap = /* @__PURE__ */ new Map();
const queue = createQueue();
queue.enqueue({ project: defaultProject, location: initialLocation });
forEachProjectInProjects(projects, initialLocation.fileName, (project, path) => {
const location = { fileName: path, pos: initialLocation.pos };
queue.enqueue({ project, location });
});
const projectService = defaultProject.projectService;
const cancellationToken = defaultProject.getCancellationToken();
const defaultDefinition = getDefinitionLocation(defaultProject, initialLocation, isForRename);
const getGeneratedDefinition = memoize(() => defaultProject.isSourceOfProjectReferenceRedirect(defaultDefinition.fileName) ? defaultDefinition : defaultProject.getLanguageService().getSourceMapper().tryGetGeneratedPosition(defaultDefinition));
const getSourceDefinition = memoize(() => defaultProject.isSourceOfProjectReferenceRedirect(defaultDefinition.fileName) ? defaultDefinition : defaultProject.getLanguageService().getSourceMapper().tryGetSourcePosition(defaultDefinition));
const searchedProjectKeys = /* @__PURE__ */ new Set();
onCancellation:
while (!queue.isEmpty()) {
while (!queue.isEmpty()) {
if (cancellationToken.isCancellationRequested())
break onCancellation;
const { project, location } = queue.dequeue();
if (resultsMap.has(project))
continue;
if (isLocationProjectReferenceRedirect(project, location))
continue;
updateProjectIfDirty(project);
if (!project.containsFile(toNormalizedPath(location.fileName))) {
continue;
}
const projectResults = searchPosition(project, location);
resultsMap.set(project, projectResults ?? emptyArray2);
searchedProjectKeys.add(getProjectKey(project));
}
if (defaultDefinition) {
projectService.loadAncestorProjectTree(searchedProjectKeys);
projectService.forEachEnabledProject((project) => {
if (cancellationToken.isCancellationRequested())
return;
if (resultsMap.has(project))
return;
const location = mapDefinitionInProject(defaultDefinition, project, getGeneratedDefinition, getSourceDefinition);
if (location) {
queue.enqueue({ project, location });
}
});
}
}
if (resultsMap.size === 1) {
return firstIterator(resultsMap.values());
}
return resultsMap;
function searchPosition(project, location) {
const projectResults = getResultsForPosition(project, location);
if (!projectResults)
return void 0;
for (const result of projectResults) {
forPositionInResult(result, (position) => {
const originalLocation = projectService.getOriginalLocationEnsuringConfiguredProject(project, position);
if (!originalLocation)
return;
const originalScriptInfo = projectService.getScriptInfo(originalLocation.fileName);
for (const project2 of originalScriptInfo.containingProjects) {
if (!project2.isOrphan() && !resultsMap.has(project2)) {
queue.enqueue({ project: project2, location: originalLocation });
}
}
const symlinkedProjectsMap = projectService.getSymlinkedProjects(originalScriptInfo);
if (symlinkedProjectsMap) {
symlinkedProjectsMap.forEach((symlinkedProjects, symlinkedPath) => {
for (const symlinkedProject of symlinkedProjects) {
if (!symlinkedProject.isOrphan() && !resultsMap.has(symlinkedProject)) {
queue.enqueue({ project: symlinkedProject, location: { fileName: symlinkedPath, pos: originalLocation.pos } });
}
}
});
}
});
}
return projectResults;
}
}
function mapDefinitionInProject(definition, project, getGeneratedDefinition, getSourceDefinition) {
if (project.containsFile(toNormalizedPath(definition.fileName)) && !isLocationProjectReferenceRedirect(project, definition)) {
return definition;
}
const generatedDefinition = getGeneratedDefinition();
if (generatedDefinition && project.containsFile(toNormalizedPath(generatedDefinition.fileName)))
return generatedDefinition;
const sourceDefinition = getSourceDefinition();
return sourceDefinition && project.containsFile(toNormalizedPath(sourceDefinition.fileName)) ? sourceDefinition : void 0;
}
function isLocationProjectReferenceRedirect(project, location) {
if (!location)
return false;
const program = project.getLanguageService().getProgram();
if (!program)
return false;
const sourceFile = program.getSourceFile(location.fileName);
return !!sourceFile && sourceFile.resolvedPath !== sourceFile.path && sourceFile.resolvedPath !== project.toPath(location.fileName);
}
function getProjectKey(project) {
return isConfiguredProject(project) ? project.canonicalConfigFilePath : project.getProjectName();
}
function documentSpanLocation({ fileName, textSpan }) {
return { fileName, pos: textSpan.start };
}
function getMappedLocationForProject(location, project) {
return getMappedLocation(location, project.getSourceMapper(), (p) => project.projectService.fileExists(p));
}
function getMappedDocumentSpanForProject(documentSpan, project) {
return getMappedDocumentSpan(documentSpan, project.getSourceMapper(), (p) => project.projectService.fileExists(p));
}
function getMappedContextSpanForProject(documentSpan, project) {
return getMappedContextSpan(documentSpan, project.getSourceMapper(), (p) => project.projectService.fileExists(p));
}
var invalidPartialSemanticModeCommands = [
"openExternalProject" /* OpenExternalProject */,
"openExternalProjects" /* OpenExternalProjects */,
"closeExternalProject" /* CloseExternalProject */,
"synchronizeProjectList" /* SynchronizeProjectList */,
"emit-output" /* EmitOutput */,
"compileOnSaveAffectedFileList" /* CompileOnSaveAffectedFileList */,
"compileOnSaveEmitFile" /* CompileOnSaveEmitFile */,
"compilerOptionsDiagnostics-full" /* CompilerOptionsDiagnosticsFull */,
"encodedSemanticClassifications-full" /* EncodedSemanticClassificationsFull */,
"semanticDiagnosticsSync" /* SemanticDiagnosticsSync */,
"suggestionDiagnosticsSync" /* SuggestionDiagnosticsSync */,
"geterrForProject" /* GeterrForProject */,
"reload" /* Reload */,
"reloadProjects" /* ReloadProjects */,
"getCodeFixes" /* GetCodeFixes */,
"getCodeFixes-full" /* GetCodeFixesFull */,
"getCombinedCodeFix" /* GetCombinedCodeFix */,
"getCombinedCodeFix-full" /* GetCombinedCodeFixFull */,
"applyCodeActionCommand" /* ApplyCodeActionCommand */,
"getSupportedCodeFixes" /* GetSupportedCodeFixes */,
"getApplicableRefactors" /* GetApplicableRefactors */,
"getMoveToRefactoringFileSuggestions" /* GetMoveToRefactoringFileSuggestions */,
"getEditsForRefactor" /* GetEditsForRefactor */,
"getEditsForRefactor-full" /* GetEditsForRefactorFull */,
"organizeImports" /* OrganizeImports */,
"organizeImports-full" /* OrganizeImportsFull */,
"getEditsForFileRename" /* GetEditsForFileRename */,
"getEditsForFileRename-full" /* GetEditsForFileRenameFull */,
"prepareCallHierarchy" /* PrepareCallHierarchy */,
"provideCallHierarchyIncomingCalls" /* ProvideCallHierarchyIncomingCalls */,
"provideCallHierarchyOutgoingCalls" /* ProvideCallHierarchyOutgoingCalls */
];
var invalidSyntacticModeCommands = [
...invalidPartialSemanticModeCommands,
"definition" /* Definition */,
"definition-full" /* DefinitionFull */,
"definitionAndBoundSpan" /* DefinitionAndBoundSpan */,
"definitionAndBoundSpan-full" /* DefinitionAndBoundSpanFull */,
"typeDefinition" /* TypeDefinition */,
"implementation" /* Implementation */,
"implementation-full" /* ImplementationFull */,
"references" /* References */,
"references-full" /* ReferencesFull */,
"rename" /* Rename */,
"renameLocations-full" /* RenameLocationsFull */,
"rename-full" /* RenameInfoFull */,
"quickinfo" /* Quickinfo */,
"quickinfo-full" /* QuickinfoFull */,
"completionInfo" /* CompletionInfo */,
"completions" /* Completions */,
"completions-full" /* CompletionsFull */,
"completionEntryDetails" /* CompletionDetails */,
"completionEntryDetails-full" /* CompletionDetailsFull */,
"signatureHelp" /* SignatureHelp */,
"signatureHelp-full" /* SignatureHelpFull */,
"navto" /* Navto */,
"navto-full" /* NavtoFull */,
"documentHighlights" /* DocumentHighlights */,
"documentHighlights-full" /* DocumentHighlightsFull */
];
var Session3 = class {
constructor(opts) {
this.changeSeq = 0;
this.handlers = new Map(Object.entries({
// TODO(jakebailey): correctly type the handlers
["status" /* Status */]: () => {
const response = { version };
return this.requiredResponse(response);
},
["openExternalProject" /* OpenExternalProject */]: (request) => {
this.projectService.openExternalProject(request.arguments);
return this.requiredResponse(
/*response*/
true
);
},
["openExternalProjects" /* OpenExternalProjects */]: (request) => {
this.projectService.openExternalProjects(request.arguments.projects);
return this.requiredResponse(
/*response*/
true
);
},
["closeExternalProject" /* CloseExternalProject */]: (request) => {
this.projectService.closeExternalProject(request.arguments.projectFileName);
return this.requiredResponse(
/*response*/
true
);
},
["synchronizeProjectList" /* SynchronizeProjectList */]: (request) => {
const result = this.projectService.synchronizeProjectList(request.arguments.knownProjects, request.arguments.includeProjectReferenceRedirectInfo);
if (!result.some((p) => p.projectErrors && p.projectErrors.length !== 0)) {
return this.requiredResponse(result);
}
const converted = map(result, (p) => {
if (!p.projectErrors || p.projectErrors.length === 0) {
return p;
}
return {
info: p.info,
changes: p.changes,
files: p.files,
projectErrors: this.convertToDiagnosticsWithLinePosition(
p.projectErrors,
/*scriptInfo*/
void 0
)
};
});
return this.requiredResponse(converted);
},
["updateOpen" /* UpdateOpen */]: (request) => {
this.changeSeq++;
this.projectService.applyChangesInOpenFiles(
request.arguments.openFiles && mapIterator(request.arguments.openFiles, (file) => ({
fileName: file.file,
content: file.fileContent,
scriptKind: file.scriptKindName,
projectRootPath: file.projectRootPath
})),
request.arguments.changedFiles && mapIterator(request.arguments.changedFiles, (file) => ({
fileName: file.fileName,
changes: mapDefinedIterator(arrayReverseIterator(file.textChanges), (change) => {
const scriptInfo = Debug.checkDefined(this.projectService.getScriptInfo(file.fileName));
const start2 = scriptInfo.lineOffsetToPosition(change.start.line, change.start.offset);
const end = scriptInfo.lineOffsetToPosition(change.end.line, change.end.offset);
return start2 >= 0 ? { span: { start: start2, length: end - start2 }, newText: change.newText } : void 0;
})
})),
request.arguments.closedFiles
);
return this.requiredResponse(
/*response*/
true
);
},
["applyChangedToOpenFiles" /* ApplyChangedToOpenFiles */]: (request) => {
this.changeSeq++;
this.projectService.applyChangesInOpenFiles(
request.arguments.openFiles,
request.arguments.changedFiles && mapIterator(request.arguments.changedFiles, (file) => ({
fileName: file.fileName,
// apply changes in reverse order
changes: arrayReverseIterator(file.changes)
})),
request.arguments.closedFiles
);
return this.requiredResponse(
/*response*/
true
);
},
["exit" /* Exit */]: () => {
this.exit();
return this.notRequired();
},
["definition" /* Definition */]: (request) => {
return this.requiredResponse(this.getDefinition(
request.arguments,
/*simplifiedResult*/
true
));
},
["definition-full" /* DefinitionFull */]: (request) => {
return this.requiredResponse(this.getDefinition(
request.arguments,
/*simplifiedResult*/
false
));
},
["definitionAndBoundSpan" /* DefinitionAndBoundSpan */]: (request) => {
return this.requiredResponse(this.getDefinitionAndBoundSpan(
request.arguments,
/*simplifiedResult*/
true
));
},
["definitionAndBoundSpan-full" /* DefinitionAndBoundSpanFull */]: (request) => {
return this.requiredResponse(this.getDefinitionAndBoundSpan(
request.arguments,
/*simplifiedResult*/
false
));
},
["findSourceDefinition" /* FindSourceDefinition */]: (request) => {
return this.requiredResponse(this.findSourceDefinition(request.arguments));
},
["emit-output" /* EmitOutput */]: (request) => {
return this.requiredResponse(this.getEmitOutput(request.arguments));
},
["typeDefinition" /* TypeDefinition */]: (request) => {
return this.requiredResponse(this.getTypeDefinition(request.arguments));
},
["implementation" /* Implementation */]: (request) => {
return this.requiredResponse(this.getImplementation(
request.arguments,
/*simplifiedResult*/
true
));
},
["implementation-full" /* ImplementationFull */]: (request) => {
return this.requiredResponse(this.getImplementation(
request.arguments,
/*simplifiedResult*/
false
));
},
["references" /* References */]: (request) => {
return this.requiredResponse(this.getReferences(
request.arguments,
/*simplifiedResult*/
true
));
},
["references-full" /* ReferencesFull */]: (request) => {
return this.requiredResponse(this.getReferences(
request.arguments,
/*simplifiedResult*/
false
));
},
["rename" /* Rename */]: (request) => {
return this.requiredResponse(this.getRenameLocations(
request.arguments,
/*simplifiedResult*/
true
));
},
["renameLocations-full" /* RenameLocationsFull */]: (request) => {
return this.requiredResponse(this.getRenameLocations(
request.arguments,
/*simplifiedResult*/
false
));
},
["rename-full" /* RenameInfoFull */]: (request) => {
return this.requiredResponse(this.getRenameInfo(request.arguments));
},
["open" /* Open */]: (request) => {
this.openClientFile(
toNormalizedPath(request.arguments.file),
request.arguments.fileContent,
convertScriptKindName(request.arguments.scriptKindName),
// TODO: GH#18217
request.arguments.projectRootPath ? toNormalizedPath(request.arguments.projectRootPath) : void 0
);
return this.notRequired();
},
["quickinfo" /* Quickinfo */]: (request) => {
return this.requiredResponse(this.getQuickInfoWorker(
request.arguments,
/*simplifiedResult*/
true
));
},
["quickinfo-full" /* QuickinfoFull */]: (request) => {
return this.requiredResponse(this.getQuickInfoWorker(
request.arguments,
/*simplifiedResult*/
false
));
},
["getOutliningSpans" /* GetOutliningSpans */]: (request) => {
return this.requiredResponse(this.getOutliningSpans(
request.arguments,
/*simplifiedResult*/
true
));
},
["outliningSpans" /* GetOutliningSpansFull */]: (request) => {
return this.requiredResponse(this.getOutliningSpans(
request.arguments,
/*simplifiedResult*/
false
));
},
["todoComments" /* TodoComments */]: (request) => {
return this.requiredResponse(this.getTodoComments(request.arguments));
},
["indentation" /* Indentation */]: (request) => {
return this.requiredResponse(this.getIndentation(request.arguments));
},
["nameOrDottedNameSpan" /* NameOrDottedNameSpan */]: (request) => {
return this.requiredResponse(this.getNameOrDottedNameSpan(request.arguments));
},
["breakpointStatement" /* BreakpointStatement */]: (request) => {
return this.requiredResponse(this.getBreakpointStatement(request.arguments));
},
["braceCompletion" /* BraceCompletion */]: (request) => {
return this.requiredResponse(this.isValidBraceCompletion(request.arguments));
},
["docCommentTemplate" /* DocCommentTemplate */]: (request) => {
return this.requiredResponse(this.getDocCommentTemplate(request.arguments));
},
["getSpanOfEnclosingComment" /* GetSpanOfEnclosingComment */]: (request) => {
return this.requiredResponse(this.getSpanOfEnclosingComment(request.arguments));
},
["fileReferences" /* FileReferences */]: (request) => {
return this.requiredResponse(this.getFileReferences(
request.arguments,
/*simplifiedResult*/
true
));
},
["fileReferences-full" /* FileReferencesFull */]: (request) => {
return this.requiredResponse(this.getFileReferences(
request.arguments,
/*simplifiedResult*/
false
));
},
["format" /* Format */]: (request) => {
return this.requiredResponse(this.getFormattingEditsForRange(request.arguments));
},
["formatonkey" /* Formatonkey */]: (request) => {
return this.requiredResponse(this.getFormattingEditsAfterKeystroke(request.arguments));
},
["format-full" /* FormatFull */]: (request) => {
return this.requiredResponse(this.getFormattingEditsForDocumentFull(request.arguments));
},
["formatonkey-full" /* FormatonkeyFull */]: (request) => {
return this.requiredResponse(this.getFormattingEditsAfterKeystrokeFull(request.arguments));
},
["formatRange-full" /* FormatRangeFull */]: (request) => {
return this.requiredResponse(this.getFormattingEditsForRangeFull(request.arguments));
},
["completionInfo" /* CompletionInfo */]: (request) => {
return this.requiredResponse(this.getCompletions(request.arguments, "completionInfo" /* CompletionInfo */));
},
["completions" /* Completions */]: (request) => {
return this.requiredResponse(this.getCompletions(request.arguments, "completions" /* Completions */));
},
["completions-full" /* CompletionsFull */]: (request) => {
return this.requiredResponse(this.getCompletions(request.arguments, "completions-full" /* CompletionsFull */));
},
["completionEntryDetails" /* CompletionDetails */]: (request) => {
return this.requiredResponse(this.getCompletionEntryDetails(
request.arguments,
/*fullResult*/
false
));
},
["completionEntryDetails-full" /* CompletionDetailsFull */]: (request) => {
return this.requiredResponse(this.getCompletionEntryDetails(
request.arguments,
/*fullResult*/
true
));
},
["compileOnSaveAffectedFileList" /* CompileOnSaveAffectedFileList */]: (request) => {
return this.requiredResponse(this.getCompileOnSaveAffectedFileList(request.arguments));
},
["compileOnSaveEmitFile" /* CompileOnSaveEmitFile */]: (request) => {
return this.requiredResponse(this.emitFile(request.arguments));
},
["signatureHelp" /* SignatureHelp */]: (request) => {
return this.requiredResponse(this.getSignatureHelpItems(
request.arguments,
/*simplifiedResult*/
true
));
},
["signatureHelp-full" /* SignatureHelpFull */]: (request) => {
return this.requiredResponse(this.getSignatureHelpItems(
request.arguments,
/*simplifiedResult*/
false
));
},
["compilerOptionsDiagnostics-full" /* CompilerOptionsDiagnosticsFull */]: (request) => {
return this.requiredResponse(this.getCompilerOptionsDiagnostics(request.arguments));
},
["encodedSyntacticClassifications-full" /* EncodedSyntacticClassificationsFull */]: (request) => {
return this.requiredResponse(this.getEncodedSyntacticClassifications(request.arguments));
},
["encodedSemanticClassifications-full" /* EncodedSemanticClassificationsFull */]: (request) => {
return this.requiredResponse(this.getEncodedSemanticClassifications(request.arguments));
},
["cleanup" /* Cleanup */]: () => {
this.cleanup();
return this.requiredResponse(
/*response*/
true
);
},
["semanticDiagnosticsSync" /* SemanticDiagnosticsSync */]: (request) => {
return this.requiredResponse(this.getSemanticDiagnosticsSync(request.arguments));
},
["syntacticDiagnosticsSync" /* SyntacticDiagnosticsSync */]: (request) => {
return this.requiredResponse(this.getSyntacticDiagnosticsSync(request.arguments));
},
["suggestionDiagnosticsSync" /* SuggestionDiagnosticsSync */]: (request) => {
return this.requiredResponse(this.getSuggestionDiagnosticsSync(request.arguments));
},
["geterr" /* Geterr */]: (request) => {
this.errorCheck.startNew((next) => this.getDiagnostics(next, request.arguments.delay, request.arguments.files));
return this.notRequired();
},
["geterrForProject" /* GeterrForProject */]: (request) => {
this.errorCheck.startNew((next) => this.getDiagnosticsForProject(next, request.arguments.delay, request.arguments.file));
return this.notRequired();
},
["change" /* Change */]: (request) => {
this.change(request.arguments);
return this.notRequired();
},
["configure" /* Configure */]: (request) => {
this.projectService.setHostConfiguration(request.arguments);
this.doOutput(
/*info*/
void 0,
"configure" /* Configure */,
request.seq,
/*success*/
true
);
return this.notRequired();
},
["reload" /* Reload */]: (request) => {
this.reload(request.arguments, request.seq);
return this.requiredResponse({ reloadFinished: true });
},
["saveto" /* Saveto */]: (request) => {
const savetoArgs = request.arguments;
this.saveToTmp(savetoArgs.file, savetoArgs.tmpfile);
return this.notRequired();
},
["close" /* Close */]: (request) => {
const closeArgs = request.arguments;
this.closeClientFile(closeArgs.file);
return this.notRequired();
},
["navto" /* Navto */]: (request) => {
return this.requiredResponse(this.getNavigateToItems(
request.arguments,
/*simplifiedResult*/
true
));
},
["navto-full" /* NavtoFull */]: (request) => {
return this.requiredResponse(this.getNavigateToItems(
request.arguments,
/*simplifiedResult*/
false
));
},
["brace" /* Brace */]: (request) => {
return this.requiredResponse(this.getBraceMatching(
request.arguments,
/*simplifiedResult*/
true
));
},
["brace-full" /* BraceFull */]: (request) => {
return this.requiredResponse(this.getBraceMatching(
request.arguments,
/*simplifiedResult*/
false
));
},
["navbar" /* NavBar */]: (request) => {
return this.requiredResponse(this.getNavigationBarItems(
request.arguments,
/*simplifiedResult*/
true
));
},
["navbar-full" /* NavBarFull */]: (request) => {
return this.requiredResponse(this.getNavigationBarItems(
request.arguments,
/*simplifiedResult*/
false
));
},
["navtree" /* NavTree */]: (request) => {
return this.requiredResponse(this.getNavigationTree(
request.arguments,
/*simplifiedResult*/
true
));
},
["navtree-full" /* NavTreeFull */]: (request) => {
return this.requiredResponse(this.getNavigationTree(
request.arguments,
/*simplifiedResult*/
false
));
},
["documentHighlights" /* DocumentHighlights */]: (request) => {
return this.requiredResponse(this.getDocumentHighlights(
request.arguments,
/*simplifiedResult*/
true
));
},
["documentHighlights-full" /* DocumentHighlightsFull */]: (request) => {
return this.requiredResponse(this.getDocumentHighlights(
request.arguments,
/*simplifiedResult*/
false
));
},
["compilerOptionsForInferredProjects" /* CompilerOptionsForInferredProjects */]: (request) => {
this.setCompilerOptionsForInferredProjects(request.arguments);
return this.requiredResponse(
/*response*/
true
);
},
["projectInfo" /* ProjectInfo */]: (request) => {
return this.requiredResponse(this.getProjectInfo(request.arguments));
},
["reloadProjects" /* ReloadProjects */]: () => {
this.projectService.reloadProjects();
return this.notRequired();
},
["jsxClosingTag" /* JsxClosingTag */]: (request) => {
return this.requiredResponse(this.getJsxClosingTag(request.arguments));
},
["linkedEditingRange" /* LinkedEditingRange */]: (request) => {
return this.requiredResponse(this.getLinkedEditingRange(request.arguments));
},
["getCodeFixes" /* GetCodeFixes */]: (request) => {
return this.requiredResponse(this.getCodeFixes(
request.arguments,
/*simplifiedResult*/
true
));
},
["getCodeFixes-full" /* GetCodeFixesFull */]: (request) => {
return this.requiredResponse(this.getCodeFixes(
request.arguments,
/*simplifiedResult*/
false
));
},
["getCombinedCodeFix" /* GetCombinedCodeFix */]: (request) => {
return this.requiredResponse(this.getCombinedCodeFix(
request.arguments,
/*simplifiedResult*/
true
));
},
["getCombinedCodeFix-full" /* GetCombinedCodeFixFull */]: (request) => {
return this.requiredResponse(this.getCombinedCodeFix(
request.arguments,
/*simplifiedResult*/
false
));
},
["applyCodeActionCommand" /* ApplyCodeActionCommand */]: (request) => {
return this.requiredResponse(this.applyCodeActionCommand(request.arguments));
},
["getSupportedCodeFixes" /* GetSupportedCodeFixes */]: (request) => {
return this.requiredResponse(this.getSupportedCodeFixes(request.arguments));
},
["getApplicableRefactors" /* GetApplicableRefactors */]: (request) => {
return this.requiredResponse(this.getApplicableRefactors(request.arguments));
},
["getEditsForRefactor" /* GetEditsForRefactor */]: (request) => {
return this.requiredResponse(this.getEditsForRefactor(
request.arguments,
/*simplifiedResult*/
true
));
},
["getMoveToRefactoringFileSuggestions" /* GetMoveToRefactoringFileSuggestions */]: (request) => {
return this.requiredResponse(this.getMoveToRefactoringFileSuggestions(request.arguments));
},
["getEditsForRefactor-full" /* GetEditsForRefactorFull */]: (request) => {
return this.requiredResponse(this.getEditsForRefactor(
request.arguments,
/*simplifiedResult*/
false
));
},
["organizeImports" /* OrganizeImports */]: (request) => {
return this.requiredResponse(this.organizeImports(
request.arguments,
/*simplifiedResult*/
true
));
},
["organizeImports-full" /* OrganizeImportsFull */]: (request) => {
return this.requiredResponse(this.organizeImports(
request.arguments,
/*simplifiedResult*/
false
));
},
["getEditsForFileRename" /* GetEditsForFileRename */]: (request) => {
return this.requiredResponse(this.getEditsForFileRename(
request.arguments,
/*simplifiedResult*/
true
));
},
["getEditsForFileRename-full" /* GetEditsForFileRenameFull */]: (request) => {
return this.requiredResponse(this.getEditsForFileRename(
request.arguments,
/*simplifiedResult*/
false
));
},
["configurePlugin" /* ConfigurePlugin */]: (request) => {
this.configurePlugin(request.arguments);
this.doOutput(
/*info*/
void 0,
"configurePlugin" /* ConfigurePlugin */,
request.seq,
/*success*/
true
);
return this.notRequired();
},
["selectionRange" /* SelectionRange */]: (request) => {
return this.requiredResponse(this.getSmartSelectionRange(
request.arguments,
/*simplifiedResult*/
true
));
},
["selectionRange-full" /* SelectionRangeFull */]: (request) => {
return this.requiredResponse(this.getSmartSelectionRange(
request.arguments,
/*simplifiedResult*/
false
));
},
["prepareCallHierarchy" /* PrepareCallHierarchy */]: (request) => {
return this.requiredResponse(this.prepareCallHierarchy(request.arguments));
},
["provideCallHierarchyIncomingCalls" /* ProvideCallHierarchyIncomingCalls */]: (request) => {
return this.requiredResponse(this.provideCallHierarchyIncomingCalls(request.arguments));
},
["provideCallHierarchyOutgoingCalls" /* ProvideCallHierarchyOutgoingCalls */]: (request) => {
return this.requiredResponse(this.provideCallHierarchyOutgoingCalls(request.arguments));
},
["toggleLineComment" /* ToggleLineComment */]: (request) => {
return this.requiredResponse(this.toggleLineComment(
request.arguments,
/*simplifiedResult*/
true
));
},
["toggleLineComment-full" /* ToggleLineCommentFull */]: (request) => {
return this.requiredResponse(this.toggleLineComment(
request.arguments,
/*simplifiedResult*/
false
));
},
["toggleMultilineComment" /* ToggleMultilineComment */]: (request) => {
return this.requiredResponse(this.toggleMultilineComment(
request.arguments,
/*simplifiedResult*/
true
));
},
["toggleMultilineComment-full" /* ToggleMultilineCommentFull */]: (request) => {
return this.requiredResponse(this.toggleMultilineComment(
request.arguments,
/*simplifiedResult*/
false
));
},
["commentSelection" /* CommentSelection */]: (request) => {
return this.requiredResponse(this.commentSelection(
request.arguments,
/*simplifiedResult*/
true
));
},
["commentSelection-full" /* CommentSelectionFull */]: (request) => {
return this.requiredResponse(this.commentSelection(
request.arguments,
/*simplifiedResult*/
false
));
},
["uncommentSelection" /* UncommentSelection */]: (request) => {
return this.requiredResponse(this.uncommentSelection(
request.arguments,
/*simplifiedResult*/
true
));
},
["uncommentSelection-full" /* UncommentSelectionFull */]: (request) => {
return this.requiredResponse(this.uncommentSelection(
request.arguments,
/*simplifiedResult*/
false
));
},
["provideInlayHints" /* ProvideInlayHints */]: (request) => {
return this.requiredResponse(this.provideInlayHints(request.arguments));
}
}));
this.host = opts.host;
this.cancellationToken = opts.cancellationToken;
this.typingsInstaller = opts.typingsInstaller || nullTypingsInstaller;
this.byteLength = opts.byteLength;
this.hrtime = opts.hrtime;
this.logger = opts.logger;
this.canUseEvents = opts.canUseEvents;
this.suppressDiagnosticEvents = opts.suppressDiagnosticEvents;
this.noGetErrOnBackgroundUpdate = opts.noGetErrOnBackgroundUpdate;
const { throttleWaitMilliseconds } = opts;
this.eventHandler = this.canUseEvents ? opts.eventHandler || ((event) => this.defaultEventHandler(event)) : void 0;
const multistepOperationHost = {
executeWithRequestId: (requestId, action) => this.executeWithRequestId(requestId, action),
getCurrentRequestId: () => this.currentRequestId,
getServerHost: () => this.host,
logError: (err, cmd) => this.logError(err, cmd),
sendRequestCompletedEvent: (requestId) => this.sendRequestCompletedEvent(requestId),
isCancellationRequested: () => this.cancellationToken.isCancellationRequested()
};
this.errorCheck = new MultistepOperation(multistepOperationHost);
const settings = {
host: this.host,
logger: this.logger,
cancellationToken: this.cancellationToken,
useSingleInferredProject: opts.useSingleInferredProject,
useInferredProjectPerProjectRoot: opts.useInferredProjectPerProjectRoot,
typingsInstaller: this.typingsInstaller,
throttleWaitMilliseconds,
eventHandler: this.eventHandler,
suppressDiagnosticEvents: this.suppressDiagnosticEvents,
globalPlugins: opts.globalPlugins,
pluginProbeLocations: opts.pluginProbeLocations,
allowLocalPluginLoads: opts.allowLocalPluginLoads,
typesMapLocation: opts.typesMapLocation,
serverMode: opts.serverMode,
session: this
};
this.projectService = new ProjectService3(settings);
this.projectService.setPerformanceEventHandler(this.performanceEventHandler.bind(this));
this.gcTimer = new GcTimer(
this.host,
/*delay*/
7e3,
this.logger
);
switch (this.projectService.serverMode) {
case 0 /* Semantic */:
break;
case 1 /* PartialSemantic */:
invalidPartialSemanticModeCommands.forEach(
(commandName) => this.handlers.set(commandName, (request) => {
throw new Error(`Request: ${request.command} not allowed in LanguageServiceMode.PartialSemantic`);
})
);
break;
case 2 /* Syntactic */:
invalidSyntacticModeCommands.forEach(
(commandName) => this.handlers.set(commandName, (request) => {
throw new Error(`Request: ${request.command} not allowed in LanguageServiceMode.Syntactic`);
})
);
break;
default:
Debug.assertNever(this.projectService.serverMode);
}
}
sendRequestCompletedEvent(requestId) {
this.event({ request_seq: requestId }, "requestCompleted");
}
addPerformanceData(key, value) {
if (!this.performanceData) {
this.performanceData = {};
}
this.performanceData[key] = (this.performanceData[key] ?? 0) + value;
}
performanceEventHandler(event) {
switch (event.kind) {
case "UpdateGraph":
this.addPerformanceData("updateGraphDurationMs", event.durationMs);
break;
case "CreatePackageJsonAutoImportProvider":
this.addPerformanceData("createAutoImportProviderProgramDurationMs", event.durationMs);
break;
}
}
defaultEventHandler(event) {
switch (event.eventName) {
case ProjectsUpdatedInBackgroundEvent:
const { openFiles } = event.data;
this.projectsUpdatedInBackgroundEvent(openFiles);
break;
case ProjectLoadingStartEvent:
const { project, reason } = event.data;
this.event(
{ projectName: project.getProjectName(), reason },
ProjectLoadingStartEvent
);
break;
case ProjectLoadingFinishEvent:
const { project: finishProject } = event.data;
this.event({ projectName: finishProject.getProjectName() }, ProjectLoadingFinishEvent);
break;
case LargeFileReferencedEvent:
const { file, fileSize, maxFileSize: maxFileSize2 } = event.data;
this.event({ file, fileSize, maxFileSize: maxFileSize2 }, LargeFileReferencedEvent);
break;
case ConfigFileDiagEvent:
const { triggerFile, configFileName: configFile, diagnostics } = event.data;
const bakedDiags = map(diagnostics, (diagnostic) => formatDiagnosticToProtocol(
diagnostic,
/*includeFileName*/
true
));
this.event({
triggerFile,
configFile,
diagnostics: bakedDiags
}, ConfigFileDiagEvent);
break;
case ProjectLanguageServiceStateEvent: {
const eventName = ProjectLanguageServiceStateEvent;
this.event({
projectName: event.data.project.getProjectName(),
languageServiceEnabled: event.data.languageServiceEnabled
}, eventName);
break;
}
case ProjectInfoTelemetryEvent: {
const eventName = "telemetry";
this.event({
telemetryEventName: event.eventName,
payload: event.data
}, eventName);
break;
}
}
}
projectsUpdatedInBackgroundEvent(openFiles) {
this.projectService.logger.info(`got projects updated in background, updating diagnostics for ${openFiles}`);
if (openFiles.length) {
if (!this.suppressDiagnosticEvents && !this.noGetErrOnBackgroundUpdate) {
this.errorCheck.startNew((next) => this.updateErrorCheck(
next,
openFiles,
100,
/*requireOpen*/
true
));
}
this.event({
openFiles
}, ProjectsUpdatedInBackgroundEvent);
}
}
logError(err, cmd) {
this.logErrorWorker(err, cmd);
}
logErrorWorker(err, cmd, fileRequest) {
let msg = "Exception on executing command " + cmd;
if (err.message) {
msg += ":\n" + indent2(err.message);
if (err.stack) {
msg += "\n" + indent2(err.stack);
}
}
if (this.logger.hasLevel(3 /* verbose */)) {
if (fileRequest) {
try {
const { file, project } = this.getFileAndProject(fileRequest);
const scriptInfo = project.getScriptInfoForNormalizedPath(file);
if (scriptInfo) {
const text = getSnapshotText(scriptInfo.getSnapshot());
msg += `
File text of ${fileRequest.file}:${indent2(text)}
`;
}
} catch {
}
}
if (err.ProgramFiles) {
msg += `
Program files: ${JSON.stringify(err.ProgramFiles)}
`;
msg += `
Projects::
`;
let counter = 0;
const addProjectInfo = (project) => {
msg += `
Project '${project.projectName}' (${ProjectKind[project.projectKind]}) ${counter}
`;
msg += project.filesToString(
/*writeProjectFileNames*/
true
);
msg += "\n-----------------------------------------------\n";
counter++;
};
this.projectService.externalProjects.forEach(addProjectInfo);
this.projectService.configuredProjects.forEach(addProjectInfo);
this.projectService.inferredProjects.forEach(addProjectInfo);
}
}
this.logger.msg(msg, "Err" /* Err */);
}
send(msg) {
if (msg.type === "event" && !this.canUseEvents) {
if (this.logger.hasLevel(3 /* verbose */)) {
this.logger.info(`Session does not support events: ignored event: ${JSON.stringify(msg)}`);
}
return;
}
this.writeMessage(msg);
}
writeMessage(msg) {
var _a;
const msgText = formatMessage2(msg, this.logger, this.byteLength, this.host.newLine);
(_a = perfLogger) == null ? void 0 : _a.logEvent(`Response message size: ${msgText.length}`);
this.host.write(msgText);
}
event(body, eventName) {
this.send(toEvent(eventName, body));
}
/** @internal */
doOutput(info, cmdName, reqSeq, success, message) {
const res = {
seq: 0,
type: "response",
command: cmdName,
request_seq: reqSeq,
success,
performanceData: this.performanceData
};
if (success) {
let metadata;
if (isArray(info)) {
res.body = info;
metadata = info.metadata;
delete info.metadata;
} else if (typeof info === "object") {
if (info.metadata) {
const { metadata: infoMetadata, ...body } = info;
res.body = body;
metadata = infoMetadata;
} else {
res.body = info;
}
} else {
res.body = info;
}
if (metadata)
res.metadata = metadata;
} else {
Debug.assert(info === void 0);
}
if (message) {
res.message = message;
}
this.send(res);
}
semanticCheck(file, project) {
var _a, _b;
(_a = tracing) == null ? void 0 : _a.push(tracing.Phase.Session, "semanticCheck", { file, configFilePath: project.canonicalConfigFilePath });
const diags = isDeclarationFileInJSOnlyNonConfiguredProject(project, file) ? emptyArray2 : project.getLanguageService().getSemanticDiagnostics(file).filter((d) => !!d.file);
this.sendDiagnosticsEvent(file, project, diags, "semanticDiag");
(_b = tracing) == null ? void 0 : _b.pop();
}
syntacticCheck(file, project) {
var _a, _b;
(_a = tracing) == null ? void 0 : _a.push(tracing.Phase.Session, "syntacticCheck", { file, configFilePath: project.canonicalConfigFilePath });
this.sendDiagnosticsEvent(file, project, project.getLanguageService().getSyntacticDiagnostics(file), "syntaxDiag");
(_b = tracing) == null ? void 0 : _b.pop();
}
suggestionCheck(file, project) {
var _a, _b;
(_a = tracing) == null ? void 0 : _a.push(tracing.Phase.Session, "suggestionCheck", { file, configFilePath: project.canonicalConfigFilePath });
this.sendDiagnosticsEvent(file, project, project.getLanguageService().getSuggestionDiagnostics(file), "suggestionDiag");
(_b = tracing) == null ? void 0 : _b.pop();
}
sendDiagnosticsEvent(file, project, diagnostics, kind) {
try {
this.event({ file, diagnostics: diagnostics.map((diag2) => formatDiag(file, project, diag2)) }, kind);
} catch (err) {
this.logError(err, kind);
}
}
/** It is the caller's responsibility to verify that `!this.suppressDiagnosticEvents`. */
updateErrorCheck(next, checkList, ms, requireOpen = true) {
Debug.assert(!this.suppressDiagnosticEvents);
const seq = this.changeSeq;
const followMs = Math.min(ms, 200);
let index = 0;
const goNext = () => {
index++;
if (checkList.length > index) {
next.delay("checkOne", followMs, checkOne);
}
};
const checkOne = () => {
if (this.changeSeq !== seq) {
return;
}
let item = checkList[index];
if (isString(item)) {
item = this.toPendingErrorCheck(item);
if (!item) {
goNext();
return;
}
}
const { fileName, project } = item;
updateProjectIfDirty(project);
if (!project.containsFile(fileName, requireOpen)) {
return;
}
this.syntacticCheck(fileName, project);
if (this.changeSeq !== seq) {
return;
}
if (project.projectService.serverMode !== 0 /* Semantic */) {
goNext();
return;
}
next.immediate("semanticCheck", () => {
this.semanticCheck(fileName, project);
if (this.changeSeq !== seq) {
return;
}
if (this.getPreferences(fileName).disableSuggestions) {
goNext();
return;
}
next.immediate("suggestionCheck", () => {
this.suggestionCheck(fileName, project);
goNext();
});
});
};
if (checkList.length > index && this.changeSeq === seq) {
next.delay("checkOne", ms, checkOne);
}
}
cleanProjects(caption, projects) {
if (!projects) {
return;
}
this.logger.info(`cleaning ${caption}`);
for (const p of projects) {
p.getLanguageService(
/*ensureSynchronized*/
false
).cleanupSemanticCache();
}
}
cleanup() {
this.cleanProjects("inferred projects", this.projectService.inferredProjects);
this.cleanProjects("configured projects", arrayFrom(this.projectService.configuredProjects.values()));
this.cleanProjects("external projects", this.projectService.externalProjects);
if (this.host.gc) {
this.logger.info(`host.gc()`);
this.host.gc();
}
}
getEncodedSyntacticClassifications(args) {
const { file, languageService } = this.getFileAndLanguageServiceForSyntacticOperation(args);
return languageService.getEncodedSyntacticClassifications(file, args);
}
getEncodedSemanticClassifications(args) {
const { file, project } = this.getFileAndProject(args);
const format = args.format === "2020" ? "2020" /* TwentyTwenty */ : "original" /* Original */;
return project.getLanguageService().getEncodedSemanticClassifications(file, args, format);
}
getProject(projectFileName) {
return projectFileName === void 0 ? void 0 : this.projectService.findProject(projectFileName);
}
getConfigFileAndProject(args) {
const project = this.getProject(args.projectFileName);
const file = toNormalizedPath(args.file);
return {
configFile: project && project.hasConfigFile(file) ? file : void 0,
project
};
}
getConfigFileDiagnostics(configFile, project, includeLinePosition) {
const projectErrors = project.getAllProjectErrors();
const optionsErrors = project.getLanguageService().getCompilerOptionsDiagnostics();
const diagnosticsForConfigFile = filter(
concatenate(projectErrors, optionsErrors),
(diagnostic) => !!diagnostic.file && diagnostic.file.fileName === configFile
);
return includeLinePosition ? this.convertToDiagnosticsWithLinePositionFromDiagnosticFile(diagnosticsForConfigFile) : map(
diagnosticsForConfigFile,
(diagnostic) => formatDiagnosticToProtocol(
diagnostic,
/*includeFileName*/
false
)
);
}
convertToDiagnosticsWithLinePositionFromDiagnosticFile(diagnostics) {
return diagnostics.map((d) => ({
message: flattenDiagnosticMessageText(d.messageText, this.host.newLine),
start: d.start,
// TODO: GH#18217
length: d.length,
// TODO: GH#18217
category: diagnosticCategoryName(d),
code: d.code,
source: d.source,
startLocation: d.file && convertToLocation(getLineAndCharacterOfPosition(d.file, d.start)),
// TODO: GH#18217
endLocation: d.file && convertToLocation(getLineAndCharacterOfPosition(d.file, d.start + d.length)),
// TODO: GH#18217
reportsUnnecessary: d.reportsUnnecessary,
reportsDeprecated: d.reportsDeprecated,
relatedInformation: map(d.relatedInformation, formatRelatedInformation)
}));
}
getCompilerOptionsDiagnostics(args) {
const project = this.getProject(args.projectFileName);
return this.convertToDiagnosticsWithLinePosition(
filter(
project.getLanguageService().getCompilerOptionsDiagnostics(),
(diagnostic) => !diagnostic.file
),
/*scriptInfo*/
void 0
);
}
convertToDiagnosticsWithLinePosition(diagnostics, scriptInfo) {
return diagnostics.map((d) => ({
message: flattenDiagnosticMessageText(d.messageText, this.host.newLine),
start: d.start,
length: d.length,
category: diagnosticCategoryName(d),
code: d.code,
source: d.source,
startLocation: scriptInfo && scriptInfo.positionToLineOffset(d.start),
// TODO: GH#18217
endLocation: scriptInfo && scriptInfo.positionToLineOffset(d.start + d.length),
reportsUnnecessary: d.reportsUnnecessary,
reportsDeprecated: d.reportsDeprecated,
relatedInformation: map(d.relatedInformation, formatRelatedInformation)
}));
}
getDiagnosticsWorker(args, isSemantic, selector, includeLinePosition) {
const { project, file } = this.getFileAndProject(args);
if (isSemantic && isDeclarationFileInJSOnlyNonConfiguredProject(project, file)) {
return emptyArray2;
}
const scriptInfo = project.getScriptInfoForNormalizedPath(file);
const diagnostics = selector(project, file);
return includeLinePosition ? this.convertToDiagnosticsWithLinePosition(diagnostics, scriptInfo) : diagnostics.map((d) => formatDiag(file, project, d));
}
getDefinition(args, simplifiedResult) {
const { file, project } = this.getFileAndProject(args);
const position = this.getPositionInFile(args, file);
const definitions = this.mapDefinitionInfoLocations(project.getLanguageService().getDefinitionAtPosition(file, position) || emptyArray2, project);
return simplifiedResult ? this.mapDefinitionInfo(definitions, project) : definitions.map(Session3.mapToOriginalLocation);
}
mapDefinitionInfoLocations(definitions, project) {
return definitions.map((info) => {
const newDocumentSpan = getMappedDocumentSpanForProject(info, project);
return !newDocumentSpan ? info : {
...newDocumentSpan,
containerKind: info.containerKind,
containerName: info.containerName,
kind: info.kind,
name: info.name,
failedAliasResolution: info.failedAliasResolution,
...info.unverified && { unverified: info.unverified }
};
});
}
getDefinitionAndBoundSpan(args, simplifiedResult) {
const { file, project } = this.getFileAndProject(args);
const position = this.getPositionInFile(args, file);
const scriptInfo = Debug.checkDefined(project.getScriptInfo(file));
const unmappedDefinitionAndBoundSpan = project.getLanguageService().getDefinitionAndBoundSpan(file, position);
if (!unmappedDefinitionAndBoundSpan || !unmappedDefinitionAndBoundSpan.definitions) {
return {
definitions: emptyArray2,
textSpan: void 0
// TODO: GH#18217
};
}
const definitions = this.mapDefinitionInfoLocations(unmappedDefinitionAndBoundSpan.definitions, project);
const { textSpan } = unmappedDefinitionAndBoundSpan;
if (simplifiedResult) {
return {
definitions: this.mapDefinitionInfo(definitions, project),
textSpan: toProtocolTextSpan(textSpan, scriptInfo)
};
}
return {
definitions: definitions.map(Session3.mapToOriginalLocation),
textSpan
};
}
findSourceDefinition(args) {
var _a;
const { file, project } = this.getFileAndProject(args);
const position = this.getPositionInFile(args, file);
const unmappedDefinitions = project.getLanguageService().getDefinitionAtPosition(file, position);
let definitions = this.mapDefinitionInfoLocations(unmappedDefinitions || emptyArray2, project).slice();
const needsJsResolution = this.projectService.serverMode === 0 /* Semantic */ && (!some(definitions, (d) => toNormalizedPath(d.fileName) !== file && !d.isAmbient) || some(definitions, (d) => !!d.failedAliasResolution));
if (needsJsResolution) {
const definitionSet = createSet((d) => d.textSpan.start, documentSpansEqual);
definitions == null ? void 0 : definitions.forEach((d) => definitionSet.add(d));
const noDtsProject = project.getNoDtsResolutionProject([file]);
const ls = noDtsProject.getLanguageService();
const jsDefinitions = (_a = ls.getDefinitionAtPosition(
file,
position,
/*searchOtherFilesOnly*/
true,
/*stopAtAlias*/
false
)) == null ? void 0 : _a.filter((d) => toNormalizedPath(d.fileName) !== file);
if (some(jsDefinitions)) {
for (const jsDefinition of jsDefinitions) {
if (jsDefinition.unverified) {
const refined = tryRefineDefinition(jsDefinition, project.getLanguageService().getProgram(), ls.getProgram());
if (some(refined)) {
for (const def of refined) {
definitionSet.add(def);
}
continue;
}
}
definitionSet.add(jsDefinition);
}
} else {
const ambientCandidates = definitions.filter((d) => toNormalizedPath(d.fileName) !== file && d.isAmbient);
for (const candidate of some(ambientCandidates) ? ambientCandidates : getAmbientCandidatesByClimbingAccessChain()) {
const fileNameToSearch = findImplementationFileFromDtsFileName(candidate.fileName, file, noDtsProject);
if (!fileNameToSearch || !ensureRoot(noDtsProject, fileNameToSearch)) {
continue;
}
const noDtsProgram = ls.getProgram();
const fileToSearch = Debug.checkDefined(noDtsProgram.getSourceFile(fileNameToSearch));
for (const match of searchForDeclaration(candidate.name, fileToSearch, noDtsProgram)) {
definitionSet.add(match);
}
}
}
definitions = arrayFrom(definitionSet.values());
}
definitions = definitions.filter((d) => !d.isAmbient && !d.failedAliasResolution);
return this.mapDefinitionInfo(definitions, project);
function findImplementationFileFromDtsFileName(fileName, resolveFromFile, auxiliaryProject) {
var _a2, _b, _c;
const nodeModulesPathParts = getNodeModulePathParts(fileName);
if (nodeModulesPathParts && fileName.lastIndexOf(nodeModulesPathPart) === nodeModulesPathParts.topLevelNodeModulesIndex) {
const packageDirectory = fileName.substring(0, nodeModulesPathParts.packageRootIndex);
const packageJsonCache = (_a2 = project.getModuleResolutionCache()) == null ? void 0 : _a2.getPackageJsonInfoCache();
const compilerOptions = project.getCompilationSettings();
const packageJson = getPackageScopeForPath(getNormalizedAbsolutePath(packageDirectory + "/package.json", project.getCurrentDirectory()), getTemporaryModuleResolutionState(packageJsonCache, project, compilerOptions));
if (!packageJson)
return void 0;
const entrypoints = getEntrypointsFromPackageJsonInfo(
packageJson,
{ moduleResolution: 2 /* Node10 */ },
project,
project.getModuleResolutionCache()
);
const packageNamePathPart = fileName.substring(
nodeModulesPathParts.topLevelPackageNameIndex + 1,
nodeModulesPathParts.packageRootIndex
);
const packageName = getPackageNameFromTypesPackageName(unmangleScopedPackageName(packageNamePathPart));
const path = project.toPath(fileName);
if (entrypoints && some(entrypoints, (e) => project.toPath(e) === path)) {
return (_b = auxiliaryProject.resolutionCache.resolveSingleModuleNameWithoutWatching(packageName, resolveFromFile).resolvedModule) == null ? void 0 : _b.resolvedFileName;
} else {
const pathToFileInPackage = fileName.substring(nodeModulesPathParts.packageRootIndex + 1);
const specifier = `${packageName}/${removeFileExtension(pathToFileInPackage)}`;
return (_c = auxiliaryProject.resolutionCache.resolveSingleModuleNameWithoutWatching(specifier, resolveFromFile).resolvedModule) == null ? void 0 : _c.resolvedFileName;
}
}
return void 0;
}
function getAmbientCandidatesByClimbingAccessChain() {
const ls = project.getLanguageService();
const program = ls.getProgram();
const initialNode = getTouchingPropertyName(program.getSourceFile(file), position);
if ((isStringLiteralLike(initialNode) || isIdentifier(initialNode)) && isAccessExpression(initialNode.parent)) {
return forEachNameInAccessChainWalkingLeft(initialNode, (nameInChain) => {
var _a2;
if (nameInChain === initialNode)
return void 0;
const candidates = (_a2 = ls.getDefinitionAtPosition(
file,
nameInChain.getStart(),
/*searchOtherFilesOnly*/
true,
/*stopAtAlias*/
false
)) == null ? void 0 : _a2.filter((d) => toNormalizedPath(d.fileName) !== file && d.isAmbient).map((d) => ({
fileName: d.fileName,
name: getTextOfIdentifierOrLiteral(initialNode)
}));
if (some(candidates)) {
return candidates;
}
}) || emptyArray2;
}
return emptyArray2;
}
function tryRefineDefinition(definition, program, noDtsProgram) {
var _a2;
const fileToSearch = noDtsProgram.getSourceFile(definition.fileName);
if (!fileToSearch) {
return void 0;
}
const initialNode = getTouchingPropertyName(program.getSourceFile(file), position);
const symbol = program.getTypeChecker().getSymbolAtLocation(initialNode);
const importSpecifier = symbol && getDeclarationOfKind(symbol, 275 /* ImportSpecifier */);
if (!importSpecifier)
return void 0;
const nameToSearch = ((_a2 = importSpecifier.propertyName) == null ? void 0 : _a2.text) || importSpecifier.name.text;
return searchForDeclaration(nameToSearch, fileToSearch, noDtsProgram);
}
function searchForDeclaration(declarationName, fileToSearch, noDtsProgram) {
const matches = ts_FindAllReferences_exports.Core.getTopMostDeclarationNamesInFile(declarationName, fileToSearch);
return mapDefined(matches, (match) => {
const symbol = noDtsProgram.getTypeChecker().getSymbolAtLocation(match);
const decl = getDeclarationFromName(match);
if (symbol && decl) {
return ts_GoToDefinition_exports.createDefinitionInfo(
decl,
noDtsProgram.getTypeChecker(),
symbol,
decl,
/*unverified*/
true
);
}
});
}
function ensureRoot(project2, fileName) {
const info = project2.getScriptInfo(fileName);
if (!info)
return false;
if (!project2.containsScriptInfo(info)) {
project2.addRoot(info);
project2.updateGraph();
}
return true;
}
}
getEmitOutput(args) {
const { file, project } = this.getFileAndProject(args);
if (!project.shouldEmitFile(project.getScriptInfo(file))) {
return { emitSkipped: true, outputFiles: [], diagnostics: [] };
}
const result = project.getLanguageService().getEmitOutput(file);
return args.richResponse ? {
...result,
diagnostics: args.includeLinePosition ? this.convertToDiagnosticsWithLinePositionFromDiagnosticFile(result.diagnostics) : result.diagnostics.map((d) => formatDiagnosticToProtocol(
d,
/*includeFileName*/
true
))
} : result;
}
mapJSDocTagInfo(tags, project, richResponse) {
return tags ? tags.map((tag) => {
var _a;
return {
...tag,
text: richResponse ? this.mapDisplayParts(tag.text, project) : (_a = tag.text) == null ? void 0 : _a.map((part) => part.text).join("")
};
}) : [];
}
mapDisplayParts(parts, project) {
if (!parts) {
return [];
}
return parts.map((part) => part.kind !== "linkName" ? part : {
...part,
target: this.toFileSpan(part.target.fileName, part.target.textSpan, project)
});
}
mapSignatureHelpItems(items, project, richResponse) {
return items.map((item) => ({
...item,
documentation: this.mapDisplayParts(item.documentation, project),
parameters: item.parameters.map((p) => ({ ...p, documentation: this.mapDisplayParts(p.documentation, project) })),
tags: this.mapJSDocTagInfo(item.tags, project, richResponse)
}));
}
mapDefinitionInfo(definitions, project) {
return definitions.map((def) => ({ ...this.toFileSpanWithContext(def.fileName, def.textSpan, def.contextSpan, project), ...def.unverified && { unverified: def.unverified } }));
}
/*
* When we map a .d.ts location to .ts, Visual Studio gets confused because there's no associated Roslyn Document in
* the same project which corresponds to the file. VS Code has no problem with this, and luckily we have two protocols.
* This retains the existing behavior for the "simplified" (VS Code) protocol but stores the .d.ts location in a
* set of additional fields, and does the reverse for VS (store the .d.ts location where
* it used to be and stores the .ts location in the additional fields).
*/
static mapToOriginalLocation(def) {
if (def.originalFileName) {
Debug.assert(def.originalTextSpan !== void 0, "originalTextSpan should be present if originalFileName is");
return {
...def,
fileName: def.originalFileName,
textSpan: def.originalTextSpan,
targetFileName: def.fileName,
targetTextSpan: def.textSpan,
contextSpan: def.originalContextSpan,
targetContextSpan: def.contextSpan
};
}
return def;
}
toFileSpan(fileName, textSpan, project) {
const ls = project.getLanguageService();
const start2 = ls.toLineColumnOffset(fileName, textSpan.start);
const end = ls.toLineColumnOffset(fileName, textSpanEnd(textSpan));
return {
file: fileName,
start: { line: start2.line + 1, offset: start2.character + 1 },
end: { line: end.line + 1, offset: end.character + 1 }
};
}
toFileSpanWithContext(fileName, textSpan, contextSpan, project) {
const fileSpan = this.toFileSpan(fileName, textSpan, project);
const context = contextSpan && this.toFileSpan(fileName, contextSpan, project);
return context ? { ...fileSpan, contextStart: context.start, contextEnd: context.end } : fileSpan;
}
getTypeDefinition(args) {
const { file, project } = this.getFileAndProject(args);
const position = this.getPositionInFile(args, file);
const definitions = this.mapDefinitionInfoLocations(project.getLanguageService().getTypeDefinitionAtPosition(file, position) || emptyArray2, project);
return this.mapDefinitionInfo(definitions, project);
}
mapImplementationLocations(implementations, project) {
return implementations.map((info) => {
const newDocumentSpan = getMappedDocumentSpanForProject(info, project);
return !newDocumentSpan ? info : {
...newDocumentSpan,
kind: info.kind,
displayParts: info.displayParts
};
});
}
getImplementation(args, simplifiedResult) {
const { file, project } = this.getFileAndProject(args);
const position = this.getPositionInFile(args, file);
const implementations = this.mapImplementationLocations(project.getLanguageService().getImplementationAtPosition(file, position) || emptyArray2, project);
return simplifiedResult ? implementations.map(({ fileName, textSpan, contextSpan }) => this.toFileSpanWithContext(fileName, textSpan, contextSpan, project)) : implementations.map(Session3.mapToOriginalLocation);
}
getSyntacticDiagnosticsSync(args) {
const { configFile } = this.getConfigFileAndProject(args);
if (configFile) {
return emptyArray2;
}
return this.getDiagnosticsWorker(
args,
/*isSemantic*/
false,
(project, file) => project.getLanguageService().getSyntacticDiagnostics(file),
!!args.includeLinePosition
);
}
getSemanticDiagnosticsSync(args) {
const { configFile, project } = this.getConfigFileAndProject(args);
if (configFile) {
return this.getConfigFileDiagnostics(configFile, project, !!args.includeLinePosition);
}
return this.getDiagnosticsWorker(
args,
/*isSemantic*/
true,
(project2, file) => project2.getLanguageService().getSemanticDiagnostics(file).filter((d) => !!d.file),
!!args.includeLinePosition
);
}
getSuggestionDiagnosticsSync(args) {
const { configFile } = this.getConfigFileAndProject(args);
if (configFile) {
return emptyArray2;
}
return this.getDiagnosticsWorker(
args,
/*isSemantic*/
true,
(project, file) => project.getLanguageService().getSuggestionDiagnostics(file),
!!args.includeLinePosition
);
}
getJsxClosingTag(args) {
const { file, languageService } = this.getFileAndLanguageServiceForSyntacticOperation(args);
const position = this.getPositionInFile(args, file);
const tag = languageService.getJsxClosingTagAtPosition(file, position);
return tag === void 0 ? void 0 : { newText: tag.newText, caretOffset: 0 };
}
getLinkedEditingRange(args) {
const { file, languageService } = this.getFileAndLanguageServiceForSyntacticOperation(args);
const position = this.getPositionInFile(args, file);
const linkedEditInfo = languageService.getLinkedEditingRangeAtPosition(file, position);
const scriptInfo = this.projectService.getScriptInfoForNormalizedPath(file);
if (scriptInfo === void 0 || linkedEditInfo === void 0)
return void 0;
return convertLinkedEditInfoToRanges(linkedEditInfo, scriptInfo);
}
getDocumentHighlights(args, simplifiedResult) {
const { file, project } = this.getFileAndProject(args);
const position = this.getPositionInFile(args, file);
const documentHighlights = project.getLanguageService().getDocumentHighlights(file, position, args.filesToSearch);
if (!documentHighlights)
return emptyArray2;
if (!simplifiedResult)
return documentHighlights;
return documentHighlights.map(({ fileName, highlightSpans }) => {
const scriptInfo = project.getScriptInfo(fileName);
return {
file: fileName,
highlightSpans: highlightSpans.map(({ textSpan, kind, contextSpan }) => ({
...toProtocolTextSpanWithContext(textSpan, contextSpan, scriptInfo),
kind
}))
};
});
}
provideInlayHints(args) {
const { file, project } = this.getFileAndProject(args);
const scriptInfo = this.projectService.getScriptInfoForNormalizedPath(file);
const hints = project.getLanguageService().provideInlayHints(file, args, this.getPreferences(file));
return hints.map((hint) => ({
...hint,
position: scriptInfo.positionToLineOffset(hint.position)
}));
}
setCompilerOptionsForInferredProjects(args) {
this.projectService.setCompilerOptionsForInferredProjects(args.options, args.projectRootPath);
}
getProjectInfo(args) {
return this.getProjectInfoWorker(
args.file,
args.projectFileName,
args.needFileNameList,
/*excludeConfigFiles*/
false
);
}
getProjectInfoWorker(uncheckedFileName, projectFileName, needFileNameList, excludeConfigFiles) {
const { project } = this.getFileAndProjectWorker(uncheckedFileName, projectFileName);
updateProjectIfDirty(project);
const projectInfo = {
configFileName: project.getProjectName(),
languageServiceDisabled: !project.languageServiceEnabled,
fileNames: needFileNameList ? project.getFileNames(
/*excludeFilesFromExternalLibraries*/
false,
excludeConfigFiles
) : void 0
};
return projectInfo;
}
getRenameInfo(args) {
const { file, project } = this.getFileAndProject(args);
const position = this.getPositionInFile(args, file);
const preferences = this.getPreferences(file);
return project.getLanguageService().getRenameInfo(file, position, preferences);
}
getProjects(args, getScriptInfoEnsuringProjectsUptoDate, ignoreNoProjectError) {
let projects;
let symLinkedProjects;
if (args.projectFileName) {
const project = this.getProject(args.projectFileName);
if (project) {
projects = [project];
}
} else {
const scriptInfo = getScriptInfoEnsuringProjectsUptoDate ? this.projectService.getScriptInfoEnsuringProjectsUptoDate(args.file) : this.projectService.getScriptInfo(args.file);
if (!scriptInfo) {
if (ignoreNoProjectError)
return emptyArray2;
this.projectService.logErrorForScriptInfoNotFound(args.file);
return Errors.ThrowNoProject();
} else if (!getScriptInfoEnsuringProjectsUptoDate) {
this.projectService.ensureDefaultProjectForFile(scriptInfo);
}
projects = scriptInfo.containingProjects;
symLinkedProjects = this.projectService.getSymlinkedProjects(scriptInfo);
}
projects = filter(projects, (p) => p.languageServiceEnabled && !p.isOrphan());
if (!ignoreNoProjectError && (!projects || !projects.length) && !symLinkedProjects) {
this.projectService.logErrorForScriptInfoNotFound(args.file ?? args.projectFileName);
return Errors.ThrowNoProject();
}
return symLinkedProjects ? { projects, symLinkedProjects } : projects;
}
getDefaultProject(args) {
if (args.projectFileName) {
const project = this.getProject(args.projectFileName);
if (project) {
return project;
}
if (!args.file) {
return Errors.ThrowNoProject();
}
}
const info = this.projectService.getScriptInfo(args.file);
return info.getDefaultProject();
}
getRenameLocations(args, simplifiedResult) {
const file = toNormalizedPath(args.file);
const position = this.getPositionInFile(args, file);
const projects = this.getProjects(args);
const defaultProject = this.getDefaultProject(args);
const preferences = this.getPreferences(file);
const renameInfo = this.mapRenameInfo(
defaultProject.getLanguageService().getRenameInfo(file, position, preferences),
Debug.checkDefined(this.projectService.getScriptInfo(file))
);
if (!renameInfo.canRename)
return simplifiedResult ? { info: renameInfo, locs: [] } : [];
const locations = getRenameLocationsWorker(
projects,
defaultProject,
{ fileName: args.file, pos: position },
!!args.findInStrings,
!!args.findInComments,
preferences
);
if (!simplifiedResult)
return locations;
return { info: renameInfo, locs: this.toSpanGroups(locations) };
}
mapRenameInfo(info, scriptInfo) {
if (info.canRename) {
const { canRename, fileToRename, displayName, fullDisplayName, kind, kindModifiers, triggerSpan } = info;
return identity(
{ canRename, fileToRename, displayName, fullDisplayName, kind, kindModifiers, triggerSpan: toProtocolTextSpan(triggerSpan, scriptInfo) }
);
} else {
return info;
}
}
toSpanGroups(locations) {
const map2 = /* @__PURE__ */ new Map();
for (const { fileName, textSpan, contextSpan, originalContextSpan: _2, originalTextSpan: _, originalFileName: _1, ...prefixSuffixText } of locations) {
let group2 = map2.get(fileName);
if (!group2)
map2.set(fileName, group2 = { file: fileName, locs: [] });
const scriptInfo = Debug.checkDefined(this.projectService.getScriptInfo(fileName));
group2.locs.push({ ...toProtocolTextSpanWithContext(textSpan, contextSpan, scriptInfo), ...prefixSuffixText });
}
return arrayFrom(map2.values());
}
getReferences(args, simplifiedResult) {
const file = toNormalizedPath(args.file);
const projects = this.getProjects(args);
const position = this.getPositionInFile(args, file);
const references = getReferencesWorker(
projects,
this.getDefaultProject(args),
{ fileName: args.file, pos: position },
this.logger
);
if (!simplifiedResult)
return references;
const preferences = this.getPreferences(file);
const defaultProject = this.getDefaultProject(args);
const scriptInfo = defaultProject.getScriptInfoForNormalizedPath(file);
const nameInfo = defaultProject.getLanguageService().getQuickInfoAtPosition(file, position);
const symbolDisplayString = nameInfo ? displayPartsToString(nameInfo.displayParts) : "";
const nameSpan = nameInfo && nameInfo.textSpan;
const symbolStartOffset = nameSpan ? scriptInfo.positionToLineOffset(nameSpan.start).offset : 0;
const symbolName2 = nameSpan ? scriptInfo.getSnapshot().getText(nameSpan.start, textSpanEnd(nameSpan)) : "";
const refs = flatMap(references, (referencedSymbol) => {
return referencedSymbol.references.map((entry) => referenceEntryToReferencesResponseItem(this.projectService, entry, preferences));
});
return { refs, symbolName: symbolName2, symbolStartOffset, symbolDisplayString };
}
getFileReferences(args, simplifiedResult) {
const projects = this.getProjects(args);
const fileName = args.file;
const preferences = this.getPreferences(toNormalizedPath(fileName));
const references = [];
const seen = createDocumentSpanSet();
forEachProjectInProjects(
projects,
/*path*/
void 0,
(project) => {
if (project.getCancellationToken().isCancellationRequested())
return;
const projectOutputs = project.getLanguageService().getFileReferences(fileName);
if (projectOutputs) {
for (const referenceEntry of projectOutputs) {
if (!seen.has(referenceEntry)) {
references.push(referenceEntry);
seen.add(referenceEntry);
}
}
}
}
);
if (!simplifiedResult)
return references;
const refs = references.map((entry) => referenceEntryToReferencesResponseItem(this.projectService, entry, preferences));
return {
refs,
symbolName: `"${args.file}"`
};
}
/**
* @param fileName is the name of the file to be opened
* @param fileContent is a version of the file content that is known to be more up to date than the one on disk
*/
openClientFile(fileName, fileContent, scriptKind, projectRootPath) {
this.projectService.openClientFileWithNormalizedPath(
fileName,
fileContent,
scriptKind,
/*hasMixedContent*/
false,
projectRootPath
);
}
getPosition(args, scriptInfo) {
return args.position !== void 0 ? args.position : scriptInfo.lineOffsetToPosition(args.line, args.offset);
}
getPositionInFile(args, file) {
const scriptInfo = this.projectService.getScriptInfoForNormalizedPath(file);
return this.getPosition(args, scriptInfo);
}
getFileAndProject(args) {
return this.getFileAndProjectWorker(args.file, args.projectFileName);
}
getFileAndLanguageServiceForSyntacticOperation(args) {
const { file, project } = this.getFileAndProject(args);
return {
file,
languageService: project.getLanguageService(
/*ensureSynchronized*/
false
)
};
}
getFileAndProjectWorker(uncheckedFileName, projectFileName) {
const file = toNormalizedPath(uncheckedFileName);
const project = this.getProject(projectFileName) || this.projectService.ensureDefaultProjectForFile(file);
return { file, project };
}
getOutliningSpans(args, simplifiedResult) {
const { file, languageService } = this.getFileAndLanguageServiceForSyntacticOperation(args);
const spans = languageService.getOutliningSpans(file);
if (simplifiedResult) {
const scriptInfo = this.projectService.getScriptInfoForNormalizedPath(file);
return spans.map((s) => ({
textSpan: toProtocolTextSpan(s.textSpan, scriptInfo),
hintSpan: toProtocolTextSpan(s.hintSpan, scriptInfo),
bannerText: s.bannerText,
autoCollapse: s.autoCollapse,
kind: s.kind
}));
} else {
return spans;
}
}
getTodoComments(args) {
const { file, project } = this.getFileAndProject(args);
return project.getLanguageService().getTodoComments(file, args.descriptors);
}
getDocCommentTemplate(args) {
const { file, languageService } = this.getFileAndLanguageServiceForSyntacticOperation(args);
const position = this.getPositionInFile(args, file);
return languageService.getDocCommentTemplateAtPosition(file, position, this.getPreferences(file), this.getFormatOptions(file));
}
getSpanOfEnclosingComment(args) {
const { file, languageService } = this.getFileAndLanguageServiceForSyntacticOperation(args);
const onlyMultiLine = args.onlyMultiLine;
const position = this.getPositionInFile(args, file);
return languageService.getSpanOfEnclosingComment(file, position, onlyMultiLine);
}
getIndentation(args) {
const { file, languageService } = this.getFileAndLanguageServiceForSyntacticOperation(args);
const position = this.getPositionInFile(args, file);
const options = args.options ? convertFormatOptions(args.options) : this.getFormatOptions(file);
const indentation = languageService.getIndentationAtPosition(file, position, options);
return { position, indentation };
}
getBreakpointStatement(args) {
const { file, languageService } = this.getFileAndLanguageServiceForSyntacticOperation(args);
const position = this.getPositionInFile(args, file);
return languageService.getBreakpointStatementAtPosition(file, position);
}
getNameOrDottedNameSpan(args) {
const { file, languageService } = this.getFileAndLanguageServiceForSyntacticOperation(args);
const position = this.getPositionInFile(args, file);
return languageService.getNameOrDottedNameSpan(file, position, position);
}
isValidBraceCompletion(args) {
const { file, languageService } = this.getFileAndLanguageServiceForSyntacticOperation(args);
const position = this.getPositionInFile(args, file);
return languageService.isValidBraceCompletionAtPosition(file, position, args.openingBrace.charCodeAt(0));
}
getQuickInfoWorker(args, simplifiedResult) {
const { file, project } = this.getFileAndProject(args);
const scriptInfo = this.projectService.getScriptInfoForNormalizedPath(file);
const quickInfo = project.getLanguageService().getQuickInfoAtPosition(file, this.getPosition(args, scriptInfo));
if (!quickInfo) {
return void 0;
}
const useDisplayParts = !!this.getPreferences(file).displayPartsForJSDoc;
if (simplifiedResult) {
const displayString = displayPartsToString(quickInfo.displayParts);
return {
kind: quickInfo.kind,
kindModifiers: quickInfo.kindModifiers,
start: scriptInfo.positionToLineOffset(quickInfo.textSpan.start),
end: scriptInfo.positionToLineOffset(textSpanEnd(quickInfo.textSpan)),
displayString,
documentation: useDisplayParts ? this.mapDisplayParts(quickInfo.documentation, project) : displayPartsToString(quickInfo.documentation),
tags: this.mapJSDocTagInfo(quickInfo.tags, project, useDisplayParts)
};
} else {
return useDisplayParts ? quickInfo : {
...quickInfo,
tags: this.mapJSDocTagInfo(
quickInfo.tags,
project,
/*richResponse*/
false
)
};
}
}
getFormattingEditsForRange(args) {
const { file, languageService } = this.getFileAndLanguageServiceForSyntacticOperation(args);
const scriptInfo = this.projectService.getScriptInfoForNormalizedPath(file);
const startPosition = scriptInfo.lineOffsetToPosition(args.line, args.offset);
const endPosition = scriptInfo.lineOffsetToPosition(args.endLine, args.endOffset);
const edits = languageService.getFormattingEditsForRange(file, startPosition, endPosition, this.getFormatOptions(file));
if (!edits) {
return void 0;
}
return edits.map((edit) => this.convertTextChangeToCodeEdit(edit, scriptInfo));
}
getFormattingEditsForRangeFull(args) {
const { file, languageService } = this.getFileAndLanguageServiceForSyntacticOperation(args);
const options = args.options ? convertFormatOptions(args.options) : this.getFormatOptions(file);
return languageService.getFormattingEditsForRange(file, args.position, args.endPosition, options);
}
getFormattingEditsForDocumentFull(args) {
const { file, languageService } = this.getFileAndLanguageServiceForSyntacticOperation(args);
const options = args.options ? convertFormatOptions(args.options) : this.getFormatOptions(file);
return languageService.getFormattingEditsForDocument(file, options);
}
getFormattingEditsAfterKeystrokeFull(args) {
const { file, languageService } = this.getFileAndLanguageServiceForSyntacticOperation(args);
const options = args.options ? convertFormatOptions(args.options) : this.getFormatOptions(file);
return languageService.getFormattingEditsAfterKeystroke(file, args.position, args.key, options);
}
getFormattingEditsAfterKeystroke(args) {
const { file, languageService } = this.getFileAndLanguageServiceForSyntacticOperation(args);
const scriptInfo = this.projectService.getScriptInfoForNormalizedPath(file);
const position = scriptInfo.lineOffsetToPosition(args.line, args.offset);
const formatOptions = this.getFormatOptions(file);
const edits = languageService.getFormattingEditsAfterKeystroke(
file,
position,
args.key,
formatOptions
);
if (args.key === "\n" && (!edits || edits.length === 0 || allEditsBeforePos(edits, position))) {
const { lineText, absolutePosition } = scriptInfo.textStorage.getAbsolutePositionAndLineText(args.line);
if (lineText && lineText.search("\\S") < 0) {
const preferredIndent = languageService.getIndentationAtPosition(file, position, formatOptions);
let hasIndent = 0;
let i, len;
for (i = 0, len = lineText.length; i < len; i++) {
if (lineText.charAt(i) === " ") {
hasIndent++;
} else if (lineText.charAt(i) === " ") {
hasIndent += formatOptions.tabSize;
} else {
break;
}
}
if (preferredIndent !== hasIndent) {
const firstNoWhiteSpacePosition = absolutePosition + i;
edits.push({
span: createTextSpanFromBounds(absolutePosition, firstNoWhiteSpacePosition),
newText: ts_formatting_exports.getIndentationString(preferredIndent, formatOptions)
});
}
}
}
if (!edits) {
return void 0;
}
return edits.map((edit) => {
return {
start: scriptInfo.positionToLineOffset(edit.span.start),
end: scriptInfo.positionToLineOffset(textSpanEnd(edit.span)),
newText: edit.newText ? edit.newText : ""
};
});
}
getCompletions(args, kind) {
const { file, project } = this.getFileAndProject(args);
const scriptInfo = this.projectService.getScriptInfoForNormalizedPath(file);
const position = this.getPosition(args, scriptInfo);
const completions = project.getLanguageService().getCompletionsAtPosition(
file,
position,
{
...convertUserPreferences(this.getPreferences(file)),
triggerCharacter: args.triggerCharacter,
triggerKind: args.triggerKind,
includeExternalModuleExports: args.includeExternalModuleExports,
includeInsertTextCompletions: args.includeInsertTextCompletions
},
project.projectService.getFormatCodeOptions(file)
);
if (completions === void 0)
return void 0;
if (kind === "completions-full" /* CompletionsFull */)
return completions;
const prefix = args.prefix || "";
const entries = mapDefined(completions.entries, (entry) => {
if (completions.isMemberCompletion || startsWith(entry.name.toLowerCase(), prefix.toLowerCase())) {
const {
name,
kind: kind2,
kindModifiers,
sortText,
insertText,
replacementSpan,
hasAction,
source,
sourceDisplay,
labelDetails,
isSnippet,
isRecommended,
isPackageJsonImport,
isImportStatementCompletion,
data
} = entry;
const convertedSpan = replacementSpan ? toProtocolTextSpan(replacementSpan, scriptInfo) : void 0;
return {
name,
kind: kind2,
kindModifiers,
sortText,
insertText,
replacementSpan: convertedSpan,
isSnippet,
hasAction: hasAction || void 0,
source,
sourceDisplay,
labelDetails,
isRecommended,
isPackageJsonImport,
isImportStatementCompletion,
data
};
}
});
if (kind === "completions" /* Completions */) {
if (completions.metadata)
entries.metadata = completions.metadata;
return entries;
}
const res = {
...completions,
optionalReplacementSpan: completions.optionalReplacementSpan && toProtocolTextSpan(completions.optionalReplacementSpan, scriptInfo),
entries
};
return res;
}
getCompletionEntryDetails(args, fullResult) {
const { file, project } = this.getFileAndProject(args);
const scriptInfo = this.projectService.getScriptInfoForNormalizedPath(file);
const position = this.getPosition(args, scriptInfo);
const formattingOptions = project.projectService.getFormatCodeOptions(file);
const useDisplayParts = !!this.getPreferences(file).displayPartsForJSDoc;
const result = mapDefined(args.entryNames, (entryName) => {
const { name, source, data } = typeof entryName === "string" ? { name: entryName, source: void 0, data: void 0 } : entryName;
return project.getLanguageService().getCompletionEntryDetails(file, position, name, formattingOptions, source, this.getPreferences(file), data ? cast(data, isCompletionEntryData) : void 0);
});
return fullResult ? useDisplayParts ? result : result.map((details) => ({ ...details, tags: this.mapJSDocTagInfo(
details.tags,
project,
/*richResponse*/
false
) })) : result.map((details) => ({
...details,
codeActions: map(details.codeActions, (action) => this.mapCodeAction(action)),
documentation: this.mapDisplayParts(details.documentation, project),
tags: this.mapJSDocTagInfo(details.tags, project, useDisplayParts)
}));
}
getCompileOnSaveAffectedFileList(args) {
const projects = this.getProjects(
args,
/*getScriptInfoEnsuringProjectsUptoDate*/
true,
/*ignoreNoProjectError*/
true
);
const info = this.projectService.getScriptInfo(args.file);
if (!info) {
return emptyArray2;
}
return combineProjectOutput(
info,
(path) => this.projectService.getScriptInfoForPath(path),
projects,
(project, info2) => {
if (!project.compileOnSaveEnabled || !project.languageServiceEnabled || project.isOrphan()) {
return void 0;
}
const compilationSettings = project.getCompilationSettings();
if (!!compilationSettings.noEmit || isDeclarationFileName(info2.fileName) && !dtsChangeCanAffectEmit(compilationSettings)) {
return void 0;
}
return {
projectFileName: project.getProjectName(),
fileNames: project.getCompileOnSaveAffectedFileList(info2),
projectUsesOutFile: !!outFile(compilationSettings)
};
}
);
}
emitFile(args) {
const { file, project } = this.getFileAndProject(args);
if (!project) {
Errors.ThrowNoProject();
}
if (!project.languageServiceEnabled) {
return args.richResponse ? { emitSkipped: true, diagnostics: [] } : false;
}
const scriptInfo = project.getScriptInfo(file);
const { emitSkipped, diagnostics } = project.emitFile(scriptInfo, (path, data, writeByteOrderMark) => this.host.writeFile(path, data, writeByteOrderMark));
return args.richResponse ? {
emitSkipped,
diagnostics: args.includeLinePosition ? this.convertToDiagnosticsWithLinePositionFromDiagnosticFile(diagnostics) : diagnostics.map((d) => formatDiagnosticToProtocol(
d,
/*includeFileName*/
true
))
} : !emitSkipped;
}
getSignatureHelpItems(args, simplifiedResult) {
const { file, project } = this.getFileAndProject(args);
const scriptInfo = this.projectService.getScriptInfoForNormalizedPath(file);
const position = this.getPosition(args, scriptInfo);
const helpItems = project.getLanguageService().getSignatureHelpItems(file, position, args);
const useDisplayParts = !!this.getPreferences(file).displayPartsForJSDoc;
if (helpItems && simplifiedResult) {
const span = helpItems.applicableSpan;
return {
...helpItems,
applicableSpan: {
start: scriptInfo.positionToLineOffset(span.start),
end: scriptInfo.positionToLineOffset(span.start + span.length)
},
items: this.mapSignatureHelpItems(helpItems.items, project, useDisplayParts)
};
} else if (useDisplayParts || !helpItems) {
return helpItems;
} else {
return {
...helpItems,
items: helpItems.items.map((item) => ({ ...item, tags: this.mapJSDocTagInfo(
item.tags,
project,
/*richResponse*/
false
) }))
};
}
}
toPendingErrorCheck(uncheckedFileName) {
const fileName = toNormalizedPath(uncheckedFileName);
const project = this.projectService.tryGetDefaultProjectForFile(fileName);
return project && { fileName, project };
}
getDiagnostics(next, delay, fileNames) {
if (this.suppressDiagnosticEvents) {
return;
}
if (fileNames.length > 0) {
this.updateErrorCheck(next, fileNames, delay);
}
}
change(args) {
const scriptInfo = this.projectService.getScriptInfo(args.file);
Debug.assert(!!scriptInfo);
scriptInfo.textStorage.switchToScriptVersionCache();
const start2 = scriptInfo.lineOffsetToPosition(args.line, args.offset);
const end = scriptInfo.lineOffsetToPosition(args.endLine, args.endOffset);
if (start2 >= 0) {
this.changeSeq++;
this.projectService.applyChangesToFile(scriptInfo, singleIterator({
span: { start: start2, length: end - start2 },
newText: args.insertString
// TODO: GH#18217
}));
}
}
reload(args, reqSeq) {
const file = toNormalizedPath(args.file);
const tempFileName = args.tmpfile === void 0 ? void 0 : toNormalizedPath(args.tmpfile);
const info = this.projectService.getScriptInfoForNormalizedPath(file);
if (info) {
this.changeSeq++;
if (info.reloadFromFile(tempFileName)) {
this.doOutput(
/*info*/
void 0,
"reload" /* Reload */,
reqSeq,
/*success*/
true
);
}
}
}
saveToTmp(fileName, tempFileName) {
const scriptInfo = this.projectService.getScriptInfo(fileName);
if (scriptInfo) {
scriptInfo.saveTo(tempFileName);
}
}
closeClientFile(fileName) {
if (!fileName) {
return;
}
const file = normalizePath(fileName);
this.projectService.closeClientFile(file);
}
mapLocationNavigationBarItems(items, scriptInfo) {
return map(items, (item) => ({
text: item.text,
kind: item.kind,
kindModifiers: item.kindModifiers,
spans: item.spans.map((span) => toProtocolTextSpan(span, scriptInfo)),
childItems: this.mapLocationNavigationBarItems(item.childItems, scriptInfo),
indent: item.indent
}));
}
getNavigationBarItems(args, simplifiedResult) {
const { file, languageService } = this.getFileAndLanguageServiceForSyntacticOperation(args);
const items = languageService.getNavigationBarItems(file);
return !items ? void 0 : simplifiedResult ? this.mapLocationNavigationBarItems(items, this.projectService.getScriptInfoForNormalizedPath(file)) : items;
}
toLocationNavigationTree(tree, scriptInfo) {
return {
text: tree.text,
kind: tree.kind,
kindModifiers: tree.kindModifiers,
spans: tree.spans.map((span) => toProtocolTextSpan(span, scriptInfo)),
nameSpan: tree.nameSpan && toProtocolTextSpan(tree.nameSpan, scriptInfo),
childItems: map(tree.childItems, (item) => this.toLocationNavigationTree(item, scriptInfo))
};
}
getNavigationTree(args, simplifiedResult) {
const { file, languageService } = this.getFileAndLanguageServiceForSyntacticOperation(args);
const tree = languageService.getNavigationTree(file);
return !tree ? void 0 : simplifiedResult ? this.toLocationNavigationTree(tree, this.projectService.getScriptInfoForNormalizedPath(file)) : tree;
}
getNavigateToItems(args, simplifiedResult) {
const full = this.getFullNavigateToItems(args);
return !simplifiedResult ? flatMap(full, ({ navigateToItems }) => navigateToItems) : flatMap(
full,
({ project, navigateToItems }) => navigateToItems.map((navItem) => {
const scriptInfo = project.getScriptInfo(navItem.fileName);
const bakedItem = {
name: navItem.name,
kind: navItem.kind,
kindModifiers: navItem.kindModifiers,
isCaseSensitive: navItem.isCaseSensitive,
matchKind: navItem.matchKind,
file: navItem.fileName,
start: scriptInfo.positionToLineOffset(navItem.textSpan.start),
end: scriptInfo.positionToLineOffset(textSpanEnd(navItem.textSpan))
};
if (navItem.kindModifiers && navItem.kindModifiers !== "") {
bakedItem.kindModifiers = navItem.kindModifiers;
}
if (navItem.containerName && navItem.containerName.length > 0) {
bakedItem.containerName = navItem.containerName;
}
if (navItem.containerKind && navItem.containerKind.length > 0) {
bakedItem.containerKind = navItem.containerKind;
}
return bakedItem;
})
);
}
getFullNavigateToItems(args) {
const { currentFileOnly, searchValue, maxResultCount, projectFileName } = args;
if (currentFileOnly) {
Debug.assertIsDefined(args.file);
const { file, project } = this.getFileAndProject(args);
return [{ project, navigateToItems: project.getLanguageService().getNavigateToItems(searchValue, maxResultCount, file) }];
}
const outputs = [];
const seenItems = /* @__PURE__ */ new Map();
if (!args.file && !projectFileName) {
this.projectService.loadAncestorProjectTree();
this.projectService.forEachEnabledProject((project) => addItemsForProject(project));
} else {
const projects = this.getProjects(args);
forEachProjectInProjects(
projects,
/*path*/
void 0,
(project) => addItemsForProject(project)
);
}
return outputs;
function addItemsForProject(project) {
const projectItems = project.getLanguageService().getNavigateToItems(
searchValue,
maxResultCount,
/*fileName*/
void 0,
/*excludeDts*/
project.isNonTsProject()
);
const unseenItems = filter(projectItems, (item) => tryAddSeenItem(item) && !getMappedLocationForProject(documentSpanLocation(item), project));
if (unseenItems.length) {
outputs.push({ project, navigateToItems: unseenItems });
}
}
function tryAddSeenItem(item) {
const name = item.name;
if (!seenItems.has(name)) {
seenItems.set(name, [item]);
return true;
}
const seen = seenItems.get(name);
for (const seenItem of seen) {
if (navigateToItemIsEqualTo(seenItem, item)) {
return false;
}
}
seen.push(item);
return true;
}
function navigateToItemIsEqualTo(a, b) {
if (a === b) {
return true;
}
if (!a || !b) {
return false;
}
return a.containerKind === b.containerKind && a.containerName === b.containerName && a.fileName === b.fileName && a.isCaseSensitive === b.isCaseSensitive && a.kind === b.kind && a.kindModifiers === b.kindModifiers && a.matchKind === b.matchKind && a.name === b.name && a.textSpan.start === b.textSpan.start && a.textSpan.length === b.textSpan.length;
}
}
getSupportedCodeFixes(args) {
if (!args)
return getSupportedCodeFixes();
if (args.file) {
const { file, project: project2 } = this.getFileAndProject(args);
return project2.getLanguageService().getSupportedCodeFixes(file);
}
const project = this.getProject(args.projectFileName);
if (!project)
Errors.ThrowNoProject();
return project.getLanguageService().getSupportedCodeFixes();
}
isLocation(locationOrSpan) {
return locationOrSpan.line !== void 0;
}
extractPositionOrRange(args, scriptInfo) {
let position;
let textRange;
if (this.isLocation(args)) {
position = getPosition(args);
} else {
textRange = this.getRange(args, scriptInfo);
}
return Debug.checkDefined(position === void 0 ? textRange : position);
function getPosition(loc) {
return loc.position !== void 0 ? loc.position : scriptInfo.lineOffsetToPosition(loc.line, loc.offset);
}
}
getRange(args, scriptInfo) {
const { startPosition, endPosition } = this.getStartAndEndPosition(args, scriptInfo);
return { pos: startPosition, end: endPosition };
}
getApplicableRefactors(args) {
const { file, project } = this.getFileAndProject(args);
const scriptInfo = project.getScriptInfoForNormalizedPath(file);
return project.getLanguageService().getApplicableRefactors(file, this.extractPositionOrRange(args, scriptInfo), this.getPreferences(file), args.triggerReason, args.kind, args.includeInteractiveActions);
}
getEditsForRefactor(args, simplifiedResult) {
const { file, project } = this.getFileAndProject(args);
const scriptInfo = project.getScriptInfoForNormalizedPath(file);
const result = project.getLanguageService().getEditsForRefactor(
file,
this.getFormatOptions(file),
this.extractPositionOrRange(args, scriptInfo),
args.refactor,
args.action,
this.getPreferences(file),
args.interactiveRefactorArguments
);
if (result === void 0) {
return {
edits: []
};
}
if (simplifiedResult) {
const { renameFilename, renameLocation, edits } = result;
let mappedRenameLocation;
if (renameFilename !== void 0 && renameLocation !== void 0) {
const renameScriptInfo = project.getScriptInfoForNormalizedPath(toNormalizedPath(renameFilename));
mappedRenameLocation = getLocationInNewDocument(getSnapshotText(renameScriptInfo.getSnapshot()), renameFilename, renameLocation, edits);
}
return {
renameLocation: mappedRenameLocation,
renameFilename,
edits: this.mapTextChangesToCodeEdits(edits),
notApplicableReason: result.notApplicableReason
};
}
return result;
}
getMoveToRefactoringFileSuggestions(args) {
const { file, project } = this.getFileAndProject(args);
const scriptInfo = project.getScriptInfoForNormalizedPath(file);
return project.getLanguageService().getMoveToRefactoringFileSuggestions(file, this.extractPositionOrRange(args, scriptInfo), this.getPreferences(file));
}
organizeImports(args, simplifiedResult) {
Debug.assert(args.scope.type === "file");
const { file, project } = this.getFileAndProject(args.scope.args);
const changes = project.getLanguageService().organizeImports(
{
fileName: file,
mode: args.mode ?? (args.skipDestructiveCodeActions ? "SortAndCombine" /* SortAndCombine */ : void 0),
type: "file"
},
this.getFormatOptions(file),
this.getPreferences(file)
);
if (simplifiedResult) {
return this.mapTextChangesToCodeEdits(changes);
} else {
return changes;
}
}
getEditsForFileRename(args, simplifiedResult) {
const oldPath = toNormalizedPath(args.oldFilePath);
const newPath = toNormalizedPath(args.newFilePath);
const formatOptions = this.getHostFormatOptions();
const preferences = this.getHostPreferences();
const seenFiles = /* @__PURE__ */ new Set();
const textChanges2 = [];
this.projectService.loadAncestorProjectTree();
this.projectService.forEachEnabledProject((project) => {
const projectTextChanges = project.getLanguageService().getEditsForFileRename(oldPath, newPath, formatOptions, preferences);
const projectFiles = [];
for (const textChange of projectTextChanges) {
if (!seenFiles.has(textChange.fileName)) {
textChanges2.push(textChange);
projectFiles.push(textChange.fileName);
}
}
for (const file of projectFiles) {
seenFiles.add(file);
}
});
return simplifiedResult ? textChanges2.map((c) => this.mapTextChangeToCodeEdit(c)) : textChanges2;
}
getCodeFixes(args, simplifiedResult) {
const { file, project } = this.getFileAndProject(args);
const scriptInfo = project.getScriptInfoForNormalizedPath(file);
const { startPosition, endPosition } = this.getStartAndEndPosition(args, scriptInfo);
let codeActions;
try {
codeActions = project.getLanguageService().getCodeFixesAtPosition(file, startPosition, endPosition, args.errorCodes, this.getFormatOptions(file), this.getPreferences(file));
} catch (e) {
const ls = project.getLanguageService();
const existingDiagCodes = [
...ls.getSyntacticDiagnostics(file),
...ls.getSemanticDiagnostics(file),
...ls.getSuggestionDiagnostics(file)
].map((d) => decodedTextSpanIntersectsWith(startPosition, endPosition - startPosition, d.start, d.length) && d.code);
const badCode = args.errorCodes.find((c) => !existingDiagCodes.includes(c));
if (badCode !== void 0) {
e.message = `BADCLIENT: Bad error code, ${badCode} not found in range ${startPosition}..${endPosition} (found: ${existingDiagCodes.join(", ")}); could have caused this error:
${e.message}`;
}
throw e;
}
return simplifiedResult ? codeActions.map((codeAction) => this.mapCodeFixAction(codeAction)) : codeActions;
}
getCombinedCodeFix({ scope, fixId: fixId52 }, simplifiedResult) {
Debug.assert(scope.type === "file");
const { file, project } = this.getFileAndProject(scope.args);
const res = project.getLanguageService().getCombinedCodeFix({ type: "file", fileName: file }, fixId52, this.getFormatOptions(file), this.getPreferences(file));
if (simplifiedResult) {
return { changes: this.mapTextChangesToCodeEdits(res.changes), commands: res.commands };
} else {
return res;
}
}
applyCodeActionCommand(args) {
const commands = args.command;
for (const command of toArray(commands)) {
const { file, project } = this.getFileAndProject(command);
project.getLanguageService().applyCodeActionCommand(command, this.getFormatOptions(file)).then(
(_result) => {
},
(_error) => {
}
);
}
return {};
}
getStartAndEndPosition(args, scriptInfo) {
let startPosition, endPosition;
if (args.startPosition !== void 0) {
startPosition = args.startPosition;
} else {
startPosition = scriptInfo.lineOffsetToPosition(args.startLine, args.startOffset);
args.startPosition = startPosition;
}
if (args.endPosition !== void 0) {
endPosition = args.endPosition;
} else {
endPosition = scriptInfo.lineOffsetToPosition(args.endLine, args.endOffset);
args.endPosition = endPosition;
}
return { startPosition, endPosition };
}
mapCodeAction({ description: description3, changes, commands }) {
return { description: description3, changes: this.mapTextChangesToCodeEdits(changes), commands };
}
mapCodeFixAction({ fixName: fixName8, description: description3, changes, commands, fixId: fixId52, fixAllDescription }) {
return { fixName: fixName8, description: description3, changes: this.mapTextChangesToCodeEdits(changes), commands, fixId: fixId52, fixAllDescription };
}
mapTextChangesToCodeEdits(textChanges2) {
return textChanges2.map((change) => this.mapTextChangeToCodeEdit(change));
}
mapTextChangeToCodeEdit(textChanges2) {
const scriptInfo = this.projectService.getScriptInfoOrConfig(textChanges2.fileName);
if (!!textChanges2.isNewFile === !!scriptInfo) {
if (!scriptInfo) {
this.projectService.logErrorForScriptInfoNotFound(textChanges2.fileName);
}
Debug.fail("Expected isNewFile for (only) new files. " + JSON.stringify({ isNewFile: !!textChanges2.isNewFile, hasScriptInfo: !!scriptInfo }));
}
return scriptInfo ? { fileName: textChanges2.fileName, textChanges: textChanges2.textChanges.map((textChange) => convertTextChangeToCodeEdit(textChange, scriptInfo)) } : convertNewFileTextChangeToCodeEdit(textChanges2);
}
convertTextChangeToCodeEdit(change, scriptInfo) {
return {
start: scriptInfo.positionToLineOffset(change.span.start),
end: scriptInfo.positionToLineOffset(change.span.start + change.span.length),
newText: change.newText ? change.newText : ""
};
}
getBraceMatching(args, simplifiedResult) {
const { file, languageService } = this.getFileAndLanguageServiceForSyntacticOperation(args);
const scriptInfo = this.projectService.getScriptInfoForNormalizedPath(file);
const position = this.getPosition(args, scriptInfo);
const spans = languageService.getBraceMatchingAtPosition(file, position);
return !spans ? void 0 : simplifiedResult ? spans.map((span) => toProtocolTextSpan(span, scriptInfo)) : spans;
}
getDiagnosticsForProject(next, delay, fileName) {
if (this.suppressDiagnosticEvents) {
return;
}
const { fileNames, languageServiceDisabled } = this.getProjectInfoWorker(
fileName,
/*projectFileName*/
void 0,
/*needFileNameList*/
true,
/*excludeConfigFiles*/
true
);
if (languageServiceDisabled) {
return;
}
const fileNamesInProject = fileNames.filter((value) => !stringContains(value, "lib.d.ts"));
if (fileNamesInProject.length === 0) {
return;
}
const highPriorityFiles = [];
const mediumPriorityFiles = [];
const lowPriorityFiles = [];
const veryLowPriorityFiles = [];
const normalizedFileName = toNormalizedPath(fileName);
const project = this.projectService.ensureDefaultProjectForFile(normalizedFileName);
for (const fileNameInProject of fileNamesInProject) {
if (this.getCanonicalFileName(fileNameInProject) === this.getCanonicalFileName(fileName)) {
highPriorityFiles.push(fileNameInProject);
} else {
const info = this.projectService.getScriptInfo(fileNameInProject);
if (!info.isScriptOpen()) {
if (isDeclarationFileName(fileNameInProject)) {
veryLowPriorityFiles.push(fileNameInProject);
} else {
lowPriorityFiles.push(fileNameInProject);
}
} else {
mediumPriorityFiles.push(fileNameInProject);
}
}
}
const sortedFiles = [...highPriorityFiles, ...mediumPriorityFiles, ...lowPriorityFiles, ...veryLowPriorityFiles];
const checkList = sortedFiles.map((fileName2) => ({ fileName: fileName2, project }));
this.updateErrorCheck(
next,
checkList,
delay,
/*requireOpen*/
false
);
}
configurePlugin(args) {
this.projectService.configurePlugin(args);
}
getSmartSelectionRange(args, simplifiedResult) {
const { locations } = args;
const { file, languageService } = this.getFileAndLanguageServiceForSyntacticOperation(args);
const scriptInfo = Debug.checkDefined(this.projectService.getScriptInfo(file));
return map(locations, (location) => {
const pos = this.getPosition(location, scriptInfo);
const selectionRange = languageService.getSmartSelectionRange(file, pos);
return simplifiedResult ? this.mapSelectionRange(selectionRange, scriptInfo) : selectionRange;
});
}
toggleLineComment(args, simplifiedResult) {
const { file, languageService } = this.getFileAndLanguageServiceForSyntacticOperation(args);
const scriptInfo = this.projectService.getScriptInfo(file);
const textRange = this.getRange(args, scriptInfo);
const textChanges2 = languageService.toggleLineComment(file, textRange);
if (simplifiedResult) {
const scriptInfo2 = this.projectService.getScriptInfoForNormalizedPath(file);
return textChanges2.map((textChange) => this.convertTextChangeToCodeEdit(textChange, scriptInfo2));
}
return textChanges2;
}
toggleMultilineComment(args, simplifiedResult) {
const { file, languageService } = this.getFileAndLanguageServiceForSyntacticOperation(args);
const scriptInfo = this.projectService.getScriptInfoForNormalizedPath(file);
const textRange = this.getRange(args, scriptInfo);
const textChanges2 = languageService.toggleMultilineComment(file, textRange);
if (simplifiedResult) {
const scriptInfo2 = this.projectService.getScriptInfoForNormalizedPath(file);
return textChanges2.map((textChange) => this.convertTextChangeToCodeEdit(textChange, scriptInfo2));
}
return textChanges2;
}
commentSelection(args, simplifiedResult) {
const { file, languageService } = this.getFileAndLanguageServiceForSyntacticOperation(args);
const scriptInfo = this.projectService.getScriptInfoForNormalizedPath(file);
const textRange = this.getRange(args, scriptInfo);
const textChanges2 = languageService.commentSelection(file, textRange);
if (simplifiedResult) {
const scriptInfo2 = this.projectService.getScriptInfoForNormalizedPath(file);
return textChanges2.map((textChange) => this.convertTextChangeToCodeEdit(textChange, scriptInfo2));
}
return textChanges2;
}
uncommentSelection(args, simplifiedResult) {
const { file, languageService } = this.getFileAndLanguageServiceForSyntacticOperation(args);
const scriptInfo = this.projectService.getScriptInfoForNormalizedPath(file);
const textRange = this.getRange(args, scriptInfo);
const textChanges2 = languageService.uncommentSelection(file, textRange);
if (simplifiedResult) {
const scriptInfo2 = this.projectService.getScriptInfoForNormalizedPath(file);
return textChanges2.map((textChange) => this.convertTextChangeToCodeEdit(textChange, scriptInfo2));
}
return textChanges2;
}
mapSelectionRange(selectionRange, scriptInfo) {
const result = {
textSpan: toProtocolTextSpan(selectionRange.textSpan, scriptInfo)
};
if (selectionRange.parent) {
result.parent = this.mapSelectionRange(selectionRange.parent, scriptInfo);
}
return result;
}
getScriptInfoFromProjectService(file) {
const normalizedFile = toNormalizedPath(file);
const scriptInfo = this.projectService.getScriptInfoForNormalizedPath(normalizedFile);
if (!scriptInfo) {
this.projectService.logErrorForScriptInfoNotFound(normalizedFile);
return Errors.ThrowNoProject();
}
return scriptInfo;
}
toProtocolCallHierarchyItem(item) {
const scriptInfo = this.getScriptInfoFromProjectService(item.file);
return {
name: item.name,
kind: item.kind,
kindModifiers: item.kindModifiers,
file: item.file,
containerName: item.containerName,
span: toProtocolTextSpan(item.span, scriptInfo),
selectionSpan: toProtocolTextSpan(item.selectionSpan, scriptInfo)
};
}
toProtocolCallHierarchyIncomingCall(incomingCall) {
const scriptInfo = this.getScriptInfoFromProjectService(incomingCall.from.file);
return {
from: this.toProtocolCallHierarchyItem(incomingCall.from),
fromSpans: incomingCall.fromSpans.map((fromSpan) => toProtocolTextSpan(fromSpan, scriptInfo))
};
}
toProtocolCallHierarchyOutgoingCall(outgoingCall, scriptInfo) {
return {
to: this.toProtocolCallHierarchyItem(outgoingCall.to),
fromSpans: outgoingCall.fromSpans.map((fromSpan) => toProtocolTextSpan(fromSpan, scriptInfo))
};
}
prepareCallHierarchy(args) {
const { file, project } = this.getFileAndProject(args);
const scriptInfo = this.projectService.getScriptInfoForNormalizedPath(file);
if (scriptInfo) {
const position = this.getPosition(args, scriptInfo);
const result = project.getLanguageService().prepareCallHierarchy(file, position);
return result && mapOneOrMany(result, (item) => this.toProtocolCallHierarchyItem(item));
}
return void 0;
}
provideCallHierarchyIncomingCalls(args) {
const { file, project } = this.getFileAndProject(args);
const scriptInfo = this.getScriptInfoFromProjectService(file);
const incomingCalls = project.getLanguageService().provideCallHierarchyIncomingCalls(file, this.getPosition(args, scriptInfo));
return incomingCalls.map((call) => this.toProtocolCallHierarchyIncomingCall(call));
}
provideCallHierarchyOutgoingCalls(args) {
const { file, project } = this.getFileAndProject(args);
const scriptInfo = this.getScriptInfoFromProjectService(file);
const outgoingCalls = project.getLanguageService().provideCallHierarchyOutgoingCalls(file, this.getPosition(args, scriptInfo));
return outgoingCalls.map((call) => this.toProtocolCallHierarchyOutgoingCall(call, scriptInfo));
}
getCanonicalFileName(fileName) {
const name = this.host.useCaseSensitiveFileNames ? fileName : toFileNameLowerCase(fileName);
return normalizePath(name);
}
exit() {
}
notRequired() {
return { responseRequired: false };
}
requiredResponse(response) {
return { response, responseRequired: true };
}
addProtocolHandler(command, handler) {
if (this.handlers.has(command)) {
throw new Error(`Protocol handler already exists for command "${command}"`);
}
this.handlers.set(command, handler);
}
setCurrentRequest(requestId) {
Debug.assert(this.currentRequestId === void 0);
this.currentRequestId = requestId;
this.cancellationToken.setRequest(requestId);
}
resetCurrentRequest(requestId) {
Debug.assert(this.currentRequestId === requestId);
this.currentRequestId = void 0;
this.cancellationToken.resetRequest(requestId);
}
executeWithRequestId(requestId, f) {
try {
this.setCurrentRequest(requestId);
return f();
} finally {
this.resetCurrentRequest(requestId);
}
}
executeCommand(request) {
const handler = this.handlers.get(request.command);
if (handler) {
const response = this.executeWithRequestId(request.seq, () => handler(request));
this.projectService.enableRequestedPlugins();
return response;
} else {
this.logger.msg(`Unrecognized JSON command:${stringifyIndented(request)}`, "Err" /* Err */);
this.doOutput(
/*info*/
void 0,
"unknown" /* Unknown */,
request.seq,
/*success*/
false,
`Unrecognized JSON command: ${request.command}`
);
return { responseRequired: false };
}
}
onMessage(message) {
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
this.gcTimer.scheduleCollect();
this.performanceData = void 0;
let start2;
if (this.logger.hasLevel(2 /* requestTime */)) {
start2 = this.hrtime();
if (this.logger.hasLevel(3 /* verbose */)) {
this.logger.info(`request:${indent2(this.toStringMessage(message))}`);
}
}
let request;
let relevantFile;
try {
request = this.parseMessage(message);
relevantFile = request.arguments && request.arguments.file ? request.arguments : void 0;
(_a = tracing) == null ? void 0 : _a.instant(tracing.Phase.Session, "request", { seq: request.seq, command: request.command });
(_b = perfLogger) == null ? void 0 : _b.logStartCommand("" + request.command, this.toStringMessage(message).substring(0, 100));
(_c = tracing) == null ? void 0 : _c.push(
tracing.Phase.Session,
"executeCommand",
{ seq: request.seq, command: request.command },
/*separateBeginAndEnd*/
true
);
const { response, responseRequired } = this.executeCommand(request);
(_d = tracing) == null ? void 0 : _d.pop();
if (this.logger.hasLevel(2 /* requestTime */)) {
const elapsedTime = hrTimeToMilliseconds(this.hrtime(start2)).toFixed(4);
if (responseRequired) {
this.logger.perftrc(`${request.seq}::${request.command}: elapsed time (in milliseconds) ${elapsedTime}`);
} else {
this.logger.perftrc(`${request.seq}::${request.command}: async elapsed time (in milliseconds) ${elapsedTime}`);
}
}
(_e = perfLogger) == null ? void 0 : _e.logStopCommand("" + request.command, "Success");
(_f = tracing) == null ? void 0 : _f.instant(tracing.Phase.Session, "response", { seq: request.seq, command: request.command, success: !!response });
if (response) {
this.doOutput(
response,
request.command,
request.seq,
/*success*/
true
);
} else if (responseRequired) {
this.doOutput(
/*info*/
void 0,
request.command,
request.seq,
/*success*/
false,
"No content available."
);
}
} catch (err) {
(_g = tracing) == null ? void 0 : _g.popAll();
if (err instanceof OperationCanceledException) {
(_h = perfLogger) == null ? void 0 : _h.logStopCommand("" + (request && request.command), "Canceled: " + err);
(_i = tracing) == null ? void 0 : _i.instant(tracing.Phase.Session, "commandCanceled", { seq: request == null ? void 0 : request.seq, command: request == null ? void 0 : request.command });
this.doOutput(
{ canceled: true },
request.command,
request.seq,
/*success*/
true
);
return;
}
this.logErrorWorker(err, this.toStringMessage(message), relevantFile);
(_j = perfLogger) == null ? void 0 : _j.logStopCommand("" + (request && request.command), "Error: " + err);
(_k = tracing) == null ? void 0 : _k.instant(tracing.Phase.Session, "commandError", { seq: request == null ? void 0 : request.seq, command: request == null ? void 0 : request.command, message: err.message });
this.doOutput(
/*info*/
void 0,
request ? request.command : "unknown" /* Unknown */,
request ? request.seq : 0,
/*success*/
false,
"Error processing request. " + err.message + "\n" + err.stack
);
}
}
parseMessage(message) {
return JSON.parse(message);
}
toStringMessage(message) {
return message;
}
getFormatOptions(file) {
return this.projectService.getFormatCodeOptions(file);
}
getPreferences(file) {
return this.projectService.getPreferences(file);
}
getHostFormatOptions() {
return this.projectService.getHostFormatCodeOptions();
}
getHostPreferences() {
return this.projectService.getHostPreferences();
}
};
function toProtocolTextSpan(textSpan, scriptInfo) {
return {
start: scriptInfo.positionToLineOffset(textSpan.start),
end: scriptInfo.positionToLineOffset(textSpanEnd(textSpan))
};
}
function toProtocolTextSpanWithContext(span, contextSpan, scriptInfo) {
const textSpan = toProtocolTextSpan(span, scriptInfo);
const contextTextSpan = contextSpan && toProtocolTextSpan(contextSpan, scriptInfo);
return contextTextSpan ? { ...textSpan, contextStart: contextTextSpan.start, contextEnd: contextTextSpan.end } : textSpan;
}
function convertTextChangeToCodeEdit(change, scriptInfo) {
return { start: positionToLineOffset(scriptInfo, change.span.start), end: positionToLineOffset(scriptInfo, textSpanEnd(change.span)), newText: change.newText };
}
function positionToLineOffset(info, position) {
return isConfigFile(info) ? locationFromLineAndCharacter(info.getLineAndCharacterOfPosition(position)) : info.positionToLineOffset(position);
}
function convertLinkedEditInfoToRanges(linkedEdit, scriptInfo) {
const ranges = linkedEdit.ranges.map(
(r) => {
return {
start: scriptInfo.positionToLineOffset(r.start),
end: scriptInfo.positionToLineOffset(r.start + r.length)
};
}
);
if (!linkedEdit.wordPattern)
return { ranges };
return { ranges, wordPattern: linkedEdit.wordPattern };
}
function locationFromLineAndCharacter(lc) {
return { line: lc.line + 1, offset: lc.character + 1 };
}
function convertNewFileTextChangeToCodeEdit(textChanges2) {
Debug.assert(textChanges2.textChanges.length === 1);
const change = first(textChanges2.textChanges);
Debug.assert(change.span.start === 0 && change.span.length === 0);
return { fileName: textChanges2.fileName, textChanges: [{ start: { line: 0, offset: 0 }, end: { line: 0, offset: 0 }, newText: change.newText }] };
}
function getLocationInNewDocument(oldText, renameFilename, renameLocation, edits) {
const newText = applyEdits(oldText, renameFilename, edits);
const { line, character } = computeLineAndCharacterOfPosition(computeLineStarts(newText), renameLocation);
return { line: line + 1, offset: character + 1 };
}
function applyEdits(text, textFilename, edits) {
for (const { fileName, textChanges: textChanges2 } of edits) {
if (fileName !== textFilename) {
continue;
}
for (let i = textChanges2.length - 1; i >= 0; i--) {
const { newText, span: { start: start2, length: length2 } } = textChanges2[i];
text = text.slice(0, start2) + newText + text.slice(start2 + length2);
}
}
return text;
}
function referenceEntryToReferencesResponseItem(projectService, { fileName, textSpan, contextSpan, isWriteAccess: isWriteAccess2, isDefinition }, { disableLineTextInReferences }) {
const scriptInfo = Debug.checkDefined(projectService.getScriptInfo(fileName));
const span = toProtocolTextSpanWithContext(textSpan, contextSpan, scriptInfo);
const lineText = disableLineTextInReferences ? void 0 : getLineText(scriptInfo, span);
return {
file: fileName,
...span,
lineText,
isWriteAccess: isWriteAccess2,
isDefinition
};
}
function getLineText(scriptInfo, span) {
const lineSpan = scriptInfo.lineToTextSpan(span.start.line - 1);
return scriptInfo.getSnapshot().getText(lineSpan.start, textSpanEnd(lineSpan)).replace(/\r|\n/g, "");
}
function isCompletionEntryData(data) {
return data === void 0 || data && typeof data === "object" && typeof data.exportName === "string" && (data.fileName === void 0 || typeof data.fileName === "string") && (data.ambientModuleName === void 0 || typeof data.ambientModuleName === "string" && (data.isPackageJsonImport === void 0 || typeof data.isPackageJsonImport === "boolean"));
}
// src/server/scriptVersionCache.ts
var lineCollectionCapacity = 4;
var CharRangeSection = /* @__PURE__ */ ((CharRangeSection2) => {
CharRangeSection2[CharRangeSection2["PreStart"] = 0] = "PreStart";
CharRangeSection2[CharRangeSection2["Start"] = 1] = "Start";
CharRangeSection2[CharRangeSection2["Entire"] = 2] = "Entire";
CharRangeSection2[CharRangeSection2["Mid"] = 3] = "Mid";
CharRangeSection2[CharRangeSection2["End"] = 4] = "End";
CharRangeSection2[CharRangeSection2["PostEnd"] = 5] = "PostEnd";
return CharRangeSection2;
})(CharRangeSection || {});
var EditWalker = class {
constructor() {
this.goSubtree = true;
this.lineIndex = new LineIndex();
this.endBranch = [];
this.state = 2 /* Entire */;
this.initialText = "";
this.trailingText = "";
this.lineIndex.root = new LineNode();
this.startPath = [this.lineIndex.root];
this.stack = [this.lineIndex.root];
}
get done() {
return false;
}
insertLines(insertedText, suppressTrailingText) {
if (suppressTrailingText) {
this.trailingText = "";
}
if (insertedText) {
insertedText = this.initialText + insertedText + this.trailingText;
} else {
insertedText = this.initialText + this.trailingText;
}
const lm = LineIndex.linesFromText(insertedText);
const lines = lm.lines;
if (lines.length > 1 && lines[lines.length - 1] === "") {
lines.pop();
}
let branchParent;
let lastZeroCount;
for (let k = this.endBranch.length - 1; k >= 0; k--) {
this.endBranch[k].updateCounts();
if (this.endBranch[k].charCount() === 0) {
lastZeroCount = this.endBranch[k];
if (k > 0) {
branchParent = this.endBranch[k - 1];
} else {
branchParent = this.branchNode;
}
}
}
if (lastZeroCount) {
branchParent.remove(lastZeroCount);
}
const leafNode = this.startPath[this.startPath.length - 1];
if (lines.length > 0) {
leafNode.text = lines[0];
if (lines.length > 1) {
let insertedNodes = new Array(lines.length - 1);
let startNode2 = leafNode;
for (let i = 1; i < lines.length; i++) {
insertedNodes[i - 1] = new LineLeaf(lines[i]);
}
let pathIndex = this.startPath.length - 2;
while (pathIndex >= 0) {
const insertionNode = this.startPath[pathIndex];
insertedNodes = insertionNode.insertAt(startNode2, insertedNodes);
pathIndex--;
startNode2 = insertionNode;
}
let insertedNodesLen = insertedNodes.length;
while (insertedNodesLen > 0) {
const newRoot = new LineNode();
newRoot.add(this.lineIndex.root);
insertedNodes = newRoot.insertAt(this.lineIndex.root, insertedNodes);
insertedNodesLen = insertedNodes.length;
this.lineIndex.root = newRoot;
}
this.lineIndex.root.updateCounts();
} else {
for (let j = this.startPath.length - 2; j >= 0; j--) {
this.startPath[j].updateCounts();
}
}
} else {
const insertionNode = this.startPath[this.startPath.length - 2];
insertionNode.remove(leafNode);
for (let j = this.startPath.length - 2; j >= 0; j--) {
this.startPath[j].updateCounts();
}
}
return this.lineIndex;
}
post(_relativeStart, _relativeLength, lineCollection) {
if (lineCollection === this.lineCollectionAtBranch) {
this.state = 4 /* End */;
}
this.stack.pop();
}
pre(_relativeStart, _relativeLength, lineCollection, _parent, nodeType) {
const currentNode = this.stack[this.stack.length - 1];
if (this.state === 2 /* Entire */ && nodeType === 1 /* Start */) {
this.state = 1 /* Start */;
this.branchNode = currentNode;
this.lineCollectionAtBranch = lineCollection;
}
let child;
function fresh(node) {
if (node.isLeaf()) {
return new LineLeaf("");
} else
return new LineNode();
}
switch (nodeType) {
case 0 /* PreStart */:
this.goSubtree = false;
if (this.state !== 4 /* End */) {
currentNode.add(lineCollection);
}
break;
case 1 /* Start */:
if (this.state === 4 /* End */) {
this.goSubtree = false;
} else {
child = fresh(lineCollection);
currentNode.add(child);
this.startPath.push(child);
}
break;
case 2 /* Entire */:
if (this.state !== 4 /* End */) {
child = fresh(lineCollection);
currentNode.add(child);
this.startPath.push(child);
} else {
if (!lineCollection.isLeaf()) {
child = fresh(lineCollection);
currentNode.add(child);
this.endBranch.push(child);
}
}
break;
case 3 /* Mid */:
this.goSubtree = false;
break;
case 4 /* End */:
if (this.state !== 4 /* End */) {
this.goSubtree = false;
} else {
if (!lineCollection.isLeaf()) {
child = fresh(lineCollection);
currentNode.add(child);
this.endBranch.push(child);
}
}
break;
case 5 /* PostEnd */:
this.goSubtree = false;
if (this.state !== 1 /* Start */) {
currentNode.add(lineCollection);
}
break;
}
if (this.goSubtree) {
this.stack.push(child);
}
}
// just gather text from the leaves
leaf(relativeStart, relativeLength, ll) {
if (this.state === 1 /* Start */) {
this.initialText = ll.text.substring(0, relativeStart);
} else if (this.state === 2 /* Entire */) {
this.initialText = ll.text.substring(0, relativeStart);
this.trailingText = ll.text.substring(relativeStart + relativeLength);
} else {
this.trailingText = ll.text.substring(relativeStart + relativeLength);
}
}
};
var TextChange9 = class {
constructor(pos, deleteLen, insertedText) {
this.pos = pos;
this.deleteLen = deleteLen;
this.insertedText = insertedText;
}
getTextChangeRange() {
return createTextChangeRange(
createTextSpan(this.pos, this.deleteLen),
this.insertedText ? this.insertedText.length : 0
);
}
};
var _ScriptVersionCache = class {
constructor() {
this.changes = [];
this.versions = new Array(_ScriptVersionCache.maxVersions);
this.minVersion = 0;
// no versions earlier than min version will maintain change history
this.currentVersion = 0;
}
versionToIndex(version2) {
if (version2 < this.minVersion || version2 > this.currentVersion) {
return void 0;
}
return version2 % _ScriptVersionCache.maxVersions;
}
currentVersionToIndex() {
return this.currentVersion % _ScriptVersionCache.maxVersions;
}
// REVIEW: can optimize by coalescing simple edits
edit(pos, deleteLen, insertedText) {
this.changes.push(new TextChange9(pos, deleteLen, insertedText));
if (this.changes.length > _ScriptVersionCache.changeNumberThreshold || deleteLen > _ScriptVersionCache.changeLengthThreshold || insertedText && insertedText.length > _ScriptVersionCache.changeLengthThreshold) {
this.getSnapshot();
}
}
getSnapshot() {
return this._getSnapshot();
}
_getSnapshot() {
let snap = this.versions[this.currentVersionToIndex()];
if (this.changes.length > 0) {
let snapIndex = snap.index;
for (const change of this.changes) {
snapIndex = snapIndex.edit(change.pos, change.deleteLen, change.insertedText);
}
snap = new LineIndexSnapshot(this.currentVersion + 1, this, snapIndex, this.changes);
this.currentVersion = snap.version;
this.versions[this.currentVersionToIndex()] = snap;
this.changes = [];
if (this.currentVersion - this.minVersion >= _ScriptVersionCache.maxVersions) {
this.minVersion = this.currentVersion - _ScriptVersionCache.maxVersions + 1;
}
}
return snap;
}
getSnapshotVersion() {
return this._getSnapshot().version;
}
getAbsolutePositionAndLineText(oneBasedLine) {
return this._getSnapshot().index.lineNumberToInfo(oneBasedLine);
}
lineOffsetToPosition(line, column) {
return this._getSnapshot().index.absolutePositionOfStartOfLine(line) + (column - 1);
}
positionToLineOffset(position) {
return this._getSnapshot().index.positionToLineOffset(position);
}
lineToTextSpan(line) {
const index = this._getSnapshot().index;
const { lineText, absolutePosition } = index.lineNumberToInfo(line + 1);
const len = lineText !== void 0 ? lineText.length : index.absolutePositionOfStartOfLine(line + 2) - absolutePosition;
return createTextSpan(absolutePosition, len);
}
getTextChangesBetweenVersions(oldVersion, newVersion) {
if (oldVersion < newVersion) {
if (oldVersion >= this.minVersion) {
const textChangeRanges = [];
for (let i = oldVersion + 1; i <= newVersion; i++) {
const snap = this.versions[this.versionToIndex(i)];
for (const textChange of snap.changesSincePreviousVersion) {
textChangeRanges.push(textChange.getTextChangeRange());
}
}
return collapseTextChangeRangesAcrossMultipleVersions(textChangeRanges);
} else {
return void 0;
}
} else {
return unchangedTextChangeRange;
}
}
getLineCount() {
return this._getSnapshot().index.getLineCount();
}
static fromString(script) {
const svc = new _ScriptVersionCache();
const snap = new LineIndexSnapshot(0, svc, new LineIndex());
svc.versions[svc.currentVersion] = snap;
const lm = LineIndex.linesFromText(script);
snap.index.load(lm.lines);
return svc;
}
};
var ScriptVersionCache = _ScriptVersionCache;
ScriptVersionCache.changeNumberThreshold = 8;
ScriptVersionCache.changeLengthThreshold = 256;
ScriptVersionCache.maxVersions = 8;
var LineIndexSnapshot = class {
constructor(version2, cache, index, changesSincePreviousVersion = emptyArray2) {
this.version = version2;
this.cache = cache;
this.index = index;
this.changesSincePreviousVersion = changesSincePreviousVersion;
}
getText(rangeStart, rangeEnd) {
return this.index.getText(rangeStart, rangeEnd - rangeStart);
}
getLength() {
return this.index.getLength();
}
getChangeRange(oldSnapshot) {
if (oldSnapshot instanceof LineIndexSnapshot && this.cache === oldSnapshot.cache) {
if (this.version <= oldSnapshot.version) {
return unchangedTextChangeRange;
} else {
return this.cache.getTextChangesBetweenVersions(oldSnapshot.version, this.version);
}
}
}
};
var LineIndex = class {
constructor() {
// set this to true to check each edit for accuracy
this.checkEdits = false;
}
absolutePositionOfStartOfLine(oneBasedLine) {
return this.lineNumberToInfo(oneBasedLine).absolutePosition;
}
positionToLineOffset(position) {
const { oneBasedLine, zeroBasedColumn } = this.root.charOffsetToLineInfo(1, position);
return { line: oneBasedLine, offset: zeroBasedColumn + 1 };
}
positionToColumnAndLineText(position) {
return this.root.charOffsetToLineInfo(1, position);
}
getLineCount() {
return this.root.lineCount();
}
lineNumberToInfo(oneBasedLine) {
const lineCount = this.getLineCount();
if (oneBasedLine <= lineCount) {
const { position, leaf } = this.root.lineNumberToInfo(oneBasedLine, 0);
return { absolutePosition: position, lineText: leaf && leaf.text };
} else {
return { absolutePosition: this.root.charCount(), lineText: void 0 };
}
}
load(lines) {
if (lines.length > 0) {
const leaves = [];
for (let i = 0; i < lines.length; i++) {
leaves[i] = new LineLeaf(lines[i]);
}
this.root = LineIndex.buildTreeFromBottom(leaves);
} else {
this.root = new LineNode();
}
}
walk(rangeStart, rangeLength, walkFns) {
this.root.walk(rangeStart, rangeLength, walkFns);
}
getText(rangeStart, rangeLength) {
let accum = "";
if (rangeLength > 0 && rangeStart < this.root.charCount()) {
this.walk(rangeStart, rangeLength, {
goSubtree: true,
done: false,
leaf: (relativeStart, relativeLength, ll) => {
accum = accum.concat(ll.text.substring(relativeStart, relativeStart + relativeLength));
}
});
}
return accum;
}
getLength() {
return this.root.charCount();
}
every(f, rangeStart, rangeEnd) {
if (!rangeEnd) {
rangeEnd = this.root.charCount();
}
const walkFns = {
goSubtree: true,
done: false,
leaf(relativeStart, relativeLength, ll) {
if (!f(ll, relativeStart, relativeLength)) {
this.done = true;
}
}
};
this.walk(rangeStart, rangeEnd - rangeStart, walkFns);
return !walkFns.done;
}
edit(pos, deleteLength, newText) {
if (this.root.charCount() === 0) {
Debug.assert(deleteLength === 0);
if (newText !== void 0) {
this.load(LineIndex.linesFromText(newText).lines);
return this;
}
return void 0;
} else {
let checkText;
if (this.checkEdits) {
const source = this.getText(0, this.root.charCount());
checkText = source.slice(0, pos) + newText + source.slice(pos + deleteLength);
}
const walker = new EditWalker();
let suppressTrailingText = false;
if (pos >= this.root.charCount()) {
pos = this.root.charCount() - 1;
const endString = this.getText(pos, 1);
if (newText) {
newText = endString + newText;
} else {
newText = endString;
}
deleteLength = 0;
suppressTrailingText = true;
} else if (deleteLength > 0) {
const e = pos + deleteLength;
const { zeroBasedColumn, lineText } = this.positionToColumnAndLineText(e);
if (zeroBasedColumn === 0) {
deleteLength += lineText.length;
newText = newText ? newText + lineText : lineText;
}
}
this.root.walk(pos, deleteLength, walker);
walker.insertLines(newText, suppressTrailingText);
if (this.checkEdits) {
const updatedText = walker.lineIndex.getText(0, walker.lineIndex.getLength());
Debug.assert(checkText === updatedText, "buffer edit mismatch");
}
return walker.lineIndex;
}
}
static buildTreeFromBottom(nodes) {
if (nodes.length < lineCollectionCapacity) {
return new LineNode(nodes);
}
const interiorNodes = new Array(Math.ceil(nodes.length / lineCollectionCapacity));
let nodeIndex = 0;
for (let i = 0; i < interiorNodes.length; i++) {
const end = Math.min(nodeIndex + lineCollectionCapacity, nodes.length);
interiorNodes[i] = new LineNode(nodes.slice(nodeIndex, end));
nodeIndex = end;
}
return this.buildTreeFromBottom(interiorNodes);
}
static linesFromText(text) {
const lineMap = computeLineStarts(text);
if (lineMap.length === 0) {
return { lines: [], lineMap };
}
const lines = new Array(lineMap.length);
const lc = lineMap.length - 1;
for (let lmi = 0; lmi < lc; lmi++) {
lines[lmi] = text.substring(lineMap[lmi], lineMap[lmi + 1]);
}
const endText = text.substring(lineMap[lc]);
if (endText.length > 0) {
lines[lc] = endText;
} else {
lines.pop();
}
return { lines, lineMap };
}
};
var LineNode = class {
constructor(children = []) {
this.children = children;
this.totalChars = 0;
this.totalLines = 0;
if (children.length)
this.updateCounts();
}
isLeaf() {
return false;
}
updateCounts() {
this.totalChars = 0;
this.totalLines = 0;
for (const child of this.children) {
this.totalChars += child.charCount();
this.totalLines += child.lineCount();
}
}
execWalk(rangeStart, rangeLength, walkFns, childIndex, nodeType) {
if (walkFns.pre) {
walkFns.pre(rangeStart, rangeLength, this.children[childIndex], this, nodeType);
}
if (walkFns.goSubtree) {
this.children[childIndex].walk(rangeStart, rangeLength, walkFns);
if (walkFns.post) {
walkFns.post(rangeStart, rangeLength, this.children[childIndex], this, nodeType);
}
} else {
walkFns.goSubtree = true;
}
return walkFns.done;
}
skipChild(relativeStart, relativeLength, childIndex, walkFns, nodeType) {
if (walkFns.pre && !walkFns.done) {
walkFns.pre(relativeStart, relativeLength, this.children[childIndex], this, nodeType);
walkFns.goSubtree = true;
}
}
walk(rangeStart, rangeLength, walkFns) {
let childIndex = 0;
let childCharCount = this.children[childIndex].charCount();
let adjustedStart = rangeStart;
while (adjustedStart >= childCharCount) {
this.skipChild(adjustedStart, rangeLength, childIndex, walkFns, 0 /* PreStart */);
adjustedStart -= childCharCount;
childIndex++;
childCharCount = this.children[childIndex].charCount();
}
if (adjustedStart + rangeLength <= childCharCount) {
if (this.execWalk(adjustedStart, rangeLength, walkFns, childIndex, 2 /* Entire */)) {
return;
}
} else {
if (this.execWalk(adjustedStart, childCharCount - adjustedStart, walkFns, childIndex, 1 /* Start */)) {
return;
}
let adjustedLength = rangeLength - (childCharCount - adjustedStart);
childIndex++;
const child = this.children[childIndex];
childCharCount = child.charCount();
while (adjustedLength > childCharCount) {
if (this.execWalk(0, childCharCount, walkFns, childIndex, 3 /* Mid */)) {
return;
}
adjustedLength -= childCharCount;
childIndex++;
childCharCount = this.children[childIndex].charCount();
}
if (adjustedLength > 0) {
if (this.execWalk(0, adjustedLength, walkFns, childIndex, 4 /* End */)) {
return;
}
}
}
if (walkFns.pre) {
const clen = this.children.length;
if (childIndex < clen - 1) {
for (let ej = childIndex + 1; ej < clen; ej++) {
this.skipChild(0, 0, ej, walkFns, 5 /* PostEnd */);
}
}
}
}
// Input position is relative to the start of this node.
// Output line number is absolute.
charOffsetToLineInfo(lineNumberAccumulator, relativePosition) {
if (this.children.length === 0) {
return { oneBasedLine: lineNumberAccumulator, zeroBasedColumn: relativePosition, lineText: void 0 };
}
for (const child of this.children) {
if (child.charCount() > relativePosition) {
if (child.isLeaf()) {
return { oneBasedLine: lineNumberAccumulator, zeroBasedColumn: relativePosition, lineText: child.text };
} else {
return child.charOffsetToLineInfo(lineNumberAccumulator, relativePosition);
}
} else {
relativePosition -= child.charCount();
lineNumberAccumulator += child.lineCount();
}
}
const lineCount = this.lineCount();
if (lineCount === 0) {
return { oneBasedLine: 1, zeroBasedColumn: 0, lineText: void 0 };
}
const leaf = Debug.checkDefined(this.lineNumberToInfo(lineCount, 0).leaf);
return { oneBasedLine: lineCount, zeroBasedColumn: leaf.charCount(), lineText: void 0 };
}
/**
* Input line number is relative to the start of this node.
* Output line number is relative to the child.
* positionAccumulator will be an absolute position once relativeLineNumber reaches 0.
*/
lineNumberToInfo(relativeOneBasedLine, positionAccumulator) {
for (const child of this.children) {
const childLineCount = child.lineCount();
if (childLineCount >= relativeOneBasedLine) {
return child.isLeaf() ? { position: positionAccumulator, leaf: child } : child.lineNumberToInfo(relativeOneBasedLine, positionAccumulator);
} else {
relativeOneBasedLine -= childLineCount;
positionAccumulator += child.charCount();
}
}
return { position: positionAccumulator, leaf: void 0 };
}
splitAfter(childIndex) {
let splitNode;
const clen = this.children.length;
childIndex++;
const endLength = childIndex;
if (childIndex < clen) {
splitNode = new LineNode();
while (childIndex < clen) {
splitNode.add(this.children[childIndex]);
childIndex++;
}
splitNode.updateCounts();
}
this.children.length = endLength;
return splitNode;
}
remove(child) {
const childIndex = this.findChildIndex(child);
const clen = this.children.length;
if (childIndex < clen - 1) {
for (let i = childIndex; i < clen - 1; i++) {
this.children[i] = this.children[i + 1];
}
}
this.children.pop();
}
findChildIndex(child) {
const childIndex = this.children.indexOf(child);
Debug.assert(childIndex !== -1);
return childIndex;
}
insertAt(child, nodes) {
let childIndex = this.findChildIndex(child);
const clen = this.children.length;
const nodeCount = nodes.length;
if (clen < lineCollectionCapacity && childIndex === clen - 1 && nodeCount === 1) {
this.add(nodes[0]);
this.updateCounts();
return [];
} else {
const shiftNode = this.splitAfter(childIndex);
let nodeIndex = 0;
childIndex++;
while (childIndex < lineCollectionCapacity && nodeIndex < nodeCount) {
this.children[childIndex] = nodes[nodeIndex];
childIndex++;
nodeIndex++;
}
let splitNodes = [];
let splitNodeCount = 0;
if (nodeIndex < nodeCount) {
splitNodeCount = Math.ceil((nodeCount - nodeIndex) / lineCollectionCapacity);
splitNodes = new Array(splitNodeCount);
let splitNodeIndex = 0;
for (let i = 0; i < splitNodeCount; i++) {
splitNodes[i] = new LineNode();
}
let splitNode = splitNodes[0];
while (nodeIndex < nodeCount) {
splitNode.add(nodes[nodeIndex]);
nodeIndex++;
if (splitNode.children.length === lineCollectionCapacity) {
splitNodeIndex++;
splitNode = splitNodes[splitNodeIndex];
}
}
for (let i = splitNodes.length - 1; i >= 0; i--) {
if (splitNodes[i].children.length === 0) {
splitNodes.pop();
}
}
}
if (shiftNode) {
splitNodes.push(shiftNode);
}
this.updateCounts();
for (let i = 0; i < splitNodeCount; i++) {
splitNodes[i].updateCounts();
}
return splitNodes;
}
}
// assume there is room for the item; return true if more room
add(collection) {
this.children.push(collection);
Debug.assert(this.children.length <= lineCollectionCapacity);
}
charCount() {
return this.totalChars;
}
lineCount() {
return this.totalLines;
}
};
var LineLeaf = class {
constructor(text) {
this.text = text;
}
isLeaf() {
return true;
}
walk(rangeStart, rangeLength, walkFns) {
walkFns.leaf(rangeStart, rangeLength, this);
}
charCount() {
return this.text.length;
}
lineCount() {
return 1;
}
};
// src/tsserver/_namespaces/ts.server.ts
var ts_server_exports4 = {};
__export(ts_server_exports4, {
ActionInvalidate: () => ActionInvalidate,
ActionPackageInstalled: () => ActionPackageInstalled,
ActionSet: () => ActionSet,
ActionWatchTypingLocations: () => ActionWatchTypingLocations,
Arguments: () => Arguments,
AutoImportProviderProject: () => AutoImportProviderProject,
CharRangeSection: () => CharRangeSection,
CommandNames: () => CommandNames,
ConfigFileDiagEvent: () => ConfigFileDiagEvent,
ConfiguredProject: () => ConfiguredProject2,
Errors: () => Errors,
EventBeginInstallTypes: () => EventBeginInstallTypes,
EventEndInstallTypes: () => EventEndInstallTypes,
EventInitializationFailed: () => EventInitializationFailed,
EventTypesRegistry: () => EventTypesRegistry,
ExternalProject: () => ExternalProject2,
GcTimer: () => GcTimer,
InferredProject: () => InferredProject2,
LargeFileReferencedEvent: () => LargeFileReferencedEvent,
LineIndex: () => LineIndex,
LineLeaf: () => LineLeaf,
LineNode: () => LineNode,
LogLevel: () => LogLevel2,
Msg: () => Msg,
OpenFileInfoTelemetryEvent: () => OpenFileInfoTelemetryEvent,
Project: () => Project3,
ProjectInfoTelemetryEvent: () => ProjectInfoTelemetryEvent,
ProjectKind: () => ProjectKind,
ProjectLanguageServiceStateEvent: () => ProjectLanguageServiceStateEvent,
ProjectLoadingFinishEvent: () => ProjectLoadingFinishEvent,
ProjectLoadingStartEvent: () => ProjectLoadingStartEvent,
ProjectReferenceProjectLoadKind: () => ProjectReferenceProjectLoadKind,
ProjectService: () => ProjectService3,
ProjectsUpdatedInBackgroundEvent: () => ProjectsUpdatedInBackgroundEvent,
ScriptInfo: () => ScriptInfo,
ScriptVersionCache: () => ScriptVersionCache,
Session: () => Session3,
TextStorage: () => TextStorage,
ThrottledOperations: () => ThrottledOperations,
TypingsCache: () => TypingsCache,
allFilesAreJsOrDts: () => allFilesAreJsOrDts,
allRootFilesAreJsOrDts: () => allRootFilesAreJsOrDts,
asNormalizedPath: () => asNormalizedPath,
convertCompilerOptions: () => convertCompilerOptions,
convertFormatOptions: () => convertFormatOptions,
convertScriptKindName: () => convertScriptKindName,
convertTypeAcquisition: () => convertTypeAcquisition,
convertUserPreferences: () => convertUserPreferences,
convertWatchOptions: () => convertWatchOptions,
countEachFileTypes: () => countEachFileTypes,
createInstallTypingsRequest: () => createInstallTypingsRequest,
createModuleSpecifierCache: () => createModuleSpecifierCache,
createNormalizedPathMap: () => createNormalizedPathMap,
createPackageJsonCache: () => createPackageJsonCache,
createSortedArray: () => createSortedArray2,
emptyArray: () => emptyArray2,
findArgument: () => findArgument,
forEachResolvedProjectReferenceProject: () => forEachResolvedProjectReferenceProject,
formatDiagnosticToProtocol: () => formatDiagnosticToProtocol,
formatMessage: () => formatMessage2,
getBaseConfigFileName: () => getBaseConfigFileName,
getLocationInNewDocument: () => getLocationInNewDocument,
getLogLevel: () => getLogLevel,
hasArgument: () => hasArgument,
hasNoTypeScriptSource: () => hasNoTypeScriptSource,
indent: () => indent2,
initializeNodeSystem: () => initializeNodeSystem,
isConfigFile: () => isConfigFile,
isConfiguredProject: () => isConfiguredProject,
isDynamicFileName: () => isDynamicFileName,
isExternalProject: () => isExternalProject,
isInferredProject: () => isInferredProject,
isInferredProjectName: () => isInferredProjectName,
makeAutoImportProviderProjectName: () => makeAutoImportProviderProjectName,
makeAuxiliaryProjectName: () => makeAuxiliaryProjectName,
makeInferredProjectName: () => makeInferredProjectName,
maxFileSize: () => maxFileSize,
maxProgramSizeForNonTsFiles: () => maxProgramSizeForNonTsFiles,
normalizedPathToPath: () => normalizedPathToPath,
nowString: () => nowString,
nullCancellationToken: () => nullCancellationToken,
nullTypingsInstaller: () => nullTypingsInstaller,
projectContainsInfoDirectly: () => projectContainsInfoDirectly,
protocol: () => ts_server_protocol_exports,
removeSorted: () => removeSorted,
stringifyIndented: () => stringifyIndented,
toEvent: () => toEvent,
toNormalizedPath: () => toNormalizedPath,
tryConvertScriptKindName: () => tryConvertScriptKindName,
typingsInstaller: () => ts_server_typingsInstaller_exports,
updateProjectIfDirty: () => updateProjectIfDirty
});
// src/tsserver/nodeServer.ts
function parseLoggingEnvironmentString(logEnvStr) {
if (!logEnvStr) {
return {};
}
const logEnv = { logToFile: true };
const args = logEnvStr.split(" ");
const len = args.length - 1;
for (let i = 0; i < len; i += 2) {
const option = args[i];
const { value, extraPartCounter } = getEntireValue(i + 1);
i += extraPartCounter;
if (option && value) {
switch (option) {
case "-file":
logEnv.file = value;
break;
case "-level":
const level = getLogLevel(value);
logEnv.detailLevel = level !== void 0 ? level : 1 /* normal */;
break;
case "-traceToConsole":
logEnv.traceToConsole = value.toLowerCase() === "true";
break;
case "-logToFile":
logEnv.logToFile = value.toLowerCase() === "true";
break;
}
}
}
return logEnv;
function getEntireValue(initialIndex) {
let pathStart = args[initialIndex];
let extraPartCounter = 0;
if (pathStart.charCodeAt(0) === 34 /* doubleQuote */ && pathStart.charCodeAt(pathStart.length - 1) !== 34 /* doubleQuote */) {
for (let i = initialIndex + 1; i < args.length; i++) {
pathStart += " ";
pathStart += args[i];
extraPartCounter++;
if (pathStart.charCodeAt(pathStart.length - 1) === 34 /* doubleQuote */)
break;
}
}
return { value: stripQuotes(pathStart), extraPartCounter };
}
}
function parseServerMode() {
const mode = findArgument("--serverMode");
if (!mode)
return void 0;
switch (mode.toLowerCase()) {
case "semantic":
return 0 /* Semantic */;
case "partialsemantic":
return 1 /* PartialSemantic */;
case "syntactic":
return 2 /* Syntactic */;
default:
return mode;
}
}
function initializeNodeSystem() {
const sys2 = Debug.checkDefined(sys);
const childProcess = require("child_process");
const fs = require("fs");
class Logger6 {
constructor(logFilename, traceToConsole, level) {
this.logFilename = logFilename;
this.traceToConsole = traceToConsole;
this.level = level;
this.seq = 0;
this.inGroup = false;
this.firstInGroup = true;
this.fd = -1;
if (this.logFilename) {
try {
this.fd = fs.openSync(this.logFilename, "w");
} catch (_) {
}
}
}
static padStringRight(str, padding) {
return (str + padding).slice(0, padding.length);
}
close() {
if (this.fd >= 0) {
fs.close(this.fd, noop);
}
}
getLogFileName() {
return this.logFilename;
}
perftrc(s) {
this.msg(s, "Perf" /* Perf */);
}
info(s) {
this.msg(s, "Info" /* Info */);
}
err(s) {
this.msg(s, "Err" /* Err */);
}
startGroup() {
this.inGroup = true;
this.firstInGroup = true;
}
endGroup() {
this.inGroup = false;
}
loggingEnabled() {
return !!this.logFilename || this.traceToConsole;
}
hasLevel(level) {
return this.loggingEnabled() && this.level >= level;
}
msg(s, type = "Err" /* Err */) {
var _a, _b, _c;
switch (type) {
case "Info" /* Info */:
(_a = perfLogger) == null ? void 0 : _a.logInfoEvent(s);
break;
case "Perf" /* Perf */:
(_b = perfLogger) == null ? void 0 : _b.logPerfEvent(s);
break;
default:
(_c = perfLogger) == null ? void 0 : _c.logErrEvent(s);
break;
}
if (!this.canWrite())
return;
s = `[${nowString()}] ${s}
`;
if (!this.inGroup || this.firstInGroup) {
const prefix = Logger6.padStringRight(type + " " + this.seq.toString(), " ");
s = prefix + s;
}
this.write(s, type);
if (!this.inGroup) {
this.seq++;
}
}
canWrite() {
return this.fd >= 0 || this.traceToConsole;
}
write(s, _type) {
if (this.fd >= 0) {
const buf = sys2.bufferFrom(s);
fs.writeSync(
this.fd,
buf,
0,
buf.length,
/*position*/
null
);
}
if (this.traceToConsole) {
console.warn(s);
}
}
}
const libDirectory = getDirectoryPath(normalizePath(sys2.getExecutingFilePath()));
const useWatchGuard = process.platform === "win32";
const originalWatchDirectory = sys2.watchDirectory.bind(sys2);
const logger = createLogger();
Debug.loggingHost = {
log(level, s) {
switch (level) {
case 1 /* Error */:
case 2 /* Warning */:
return logger.msg(s, "Err" /* Err */);
case 3 /* Info */:
case 4 /* Verbose */:
return logger.msg(s, "Info" /* Info */);
}
}
};
const pending = createQueue();
let canWrite = true;
if (useWatchGuard) {
const currentDrive = extractWatchDirectoryCacheKey(
sys2.resolvePath(sys2.getCurrentDirectory()),
/*currentDriveKey*/
void 0
);
const statusCache = /* @__PURE__ */ new Map();
sys2.watchDirectory = (path, callback, recursive, options) => {
const cacheKey = extractWatchDirectoryCacheKey(path, currentDrive);
let status = cacheKey && statusCache.get(cacheKey);
if (status === void 0) {
if (logger.hasLevel(3 /* verbose */)) {
logger.info(`${cacheKey} for path ${path} not found in cache...`);
}
try {
const args = [combinePaths(libDirectory, "watchGuard.js"), path];
if (logger.hasLevel(3 /* verbose */)) {
logger.info(`Starting ${process.execPath} with args:${stringifyIndented(args)}`);
}
childProcess.execFileSync(process.execPath, args, { stdio: "ignore", env: { ELECTRON_RUN_AS_NODE: "1" } });
status = true;
if (logger.hasLevel(3 /* verbose */)) {
logger.info(`WatchGuard for path ${path} returned: OK`);
}
} catch (e) {
status = false;
if (logger.hasLevel(3 /* verbose */)) {
logger.info(`WatchGuard for path ${path} returned: ${e.message}`);
}
}
if (cacheKey) {
statusCache.set(cacheKey, status);
}
} else if (logger.hasLevel(3 /* verbose */)) {
logger.info(`watchDirectory for ${path} uses cached drive information.`);
}
if (status) {
return watchDirectorySwallowingException(path, callback, recursive, options);
} else {
return noopFileWatcher;
}
};
} else {
sys2.watchDirectory = watchDirectorySwallowingException;
}
sys2.write = (s) => writeMessage(sys2.bufferFrom(s, "utf8"));
sys2.setTimeout = setTimeout;
sys2.clearTimeout = clearTimeout;
sys2.setImmediate = setImmediate;
sys2.clearImmediate = clearImmediate;
if (typeof global !== "undefined" && global.gc) {
sys2.gc = () => {
var _a;
return (_a = global.gc) == null ? void 0 : _a.call(global);
};
}
let cancellationToken;
try {
const factory2 = require("./cancellationToken");
cancellationToken = factory2(sys2.args);
} catch (e) {
cancellationToken = nullCancellationToken;
}
const localeStr = findArgument("--locale");
if (localeStr) {
validateLocaleAndSetLanguage(localeStr, sys2);
}
const modeOrUnknown = parseServerMode();
let serverMode;
let unknownServerMode;
if (modeOrUnknown !== void 0) {
if (typeof modeOrUnknown === "number")
serverMode = modeOrUnknown;
else
unknownServerMode = modeOrUnknown;
}
return {
args: process.argv,
logger,
cancellationToken,
serverMode,
unknownServerMode,
startSession: startNodeSession
};
function createLogger() {
const cmdLineLogFileName = findArgument("--logFile");
const cmdLineVerbosity = getLogLevel(findArgument("--logVerbosity"));
const envLogOptions = parseLoggingEnvironmentString(process.env.TSS_LOG);
const unsubstitutedLogFileName = cmdLineLogFileName ? stripQuotes(cmdLineLogFileName) : envLogOptions.logToFile ? envLogOptions.file || libDirectory + "/.log" + process.pid.toString() : void 0;
const substitutedLogFileName = unsubstitutedLogFileName ? unsubstitutedLogFileName.replace("PID", process.pid.toString()) : void 0;
const logVerbosity = cmdLineVerbosity || envLogOptions.detailLevel;
return new Logger6(substitutedLogFileName, envLogOptions.traceToConsole, logVerbosity);
}
function writeMessage(buf) {
if (!canWrite) {
pending.enqueue(buf);
} else {
canWrite = false;
process.stdout.write(buf, setCanWriteFlagAndWriteMessageIfNecessary);
}
}
function setCanWriteFlagAndWriteMessageIfNecessary() {
canWrite = true;
if (!pending.isEmpty()) {
writeMessage(pending.dequeue());
}
}
function extractWatchDirectoryCacheKey(path, currentDriveKey) {
path = normalizeSlashes(path);
if (isUNCPath(path)) {
const firstSlash = path.indexOf(directorySeparator, 2);
return firstSlash !== -1 ? toFileNameLowerCase(path.substring(0, firstSlash)) : path;
}
const rootLength = getRootLength(path);
if (rootLength === 0) {
return currentDriveKey;
}
if (path.charCodeAt(1) === 58 /* colon */ && path.charCodeAt(2) === 47 /* slash */) {
return toFileNameLowerCase(path.charAt(0));
}
if (path.charCodeAt(0) === 47 /* slash */ && path.charCodeAt(1) !== 47 /* slash */) {
return currentDriveKey;
}
return void 0;
}
function isUNCPath(s) {
return s.length > 2 && s.charCodeAt(0) === 47 /* slash */ && s.charCodeAt(1) === 47 /* slash */;
}
function watchDirectorySwallowingException(path, callback, recursive, options) {
try {
return originalWatchDirectory(path, callback, recursive, options);
} catch (e) {
logger.info(`Exception when creating directory watcher: ${e.message}`);
return noopFileWatcher;
}
}
}
function parseEventPort(eventPortStr) {
const eventPort = eventPortStr === void 0 ? void 0 : parseInt(eventPortStr);
return eventPort !== void 0 && !isNaN(eventPort) ? eventPort : void 0;
}
function startNodeSession(options, logger, cancellationToken) {
const childProcess = require("child_process");
const os = require("os");
const net = require("net");
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
terminal: false
});
const _NodeTypingsInstaller = class {
constructor(telemetryEnabled2, logger2, host, globalTypingsCacheLocation, typingSafeListLocation2, typesMapLocation2, npmLocation2, validateDefaultNpmLocation2, event) {
this.telemetryEnabled = telemetryEnabled2;
this.logger = logger2;
this.host = host;
this.globalTypingsCacheLocation = globalTypingsCacheLocation;
this.typingSafeListLocation = typingSafeListLocation2;
this.typesMapLocation = typesMapLocation2;
this.npmLocation = npmLocation2;
this.validateDefaultNpmLocation = validateDefaultNpmLocation2;
this.event = event;
this.activeRequestCount = 0;
this.requestQueue = createQueue();
this.requestMap = /* @__PURE__ */ new Map();
// Maps operation ID to newest requestQueue entry with that ID
/** We will lazily request the types registry on the first call to `isKnownTypesPackageName` and store it in `typesRegistryCache`. */
this.requestedRegistry = false;
}
isKnownTypesPackageName(name) {
const validationResult = ts_JsTyping_exports.validatePackageName(name);
if (validationResult !== ts_JsTyping_exports.NameValidationResult.Ok) {
return false;
}
if (this.requestedRegistry) {
return !!this.typesRegistryCache && this.typesRegistryCache.has(name);
}
this.requestedRegistry = true;
this.send({ kind: "typesRegistry" });
return false;
}
installPackage(options2) {
this.send({ kind: "installPackage", ...options2 });
Debug.assert(this.packageInstalledPromise === void 0);
return new Promise((resolve, reject) => {
this.packageInstalledPromise = { resolve, reject };
});
}
attach(projectService) {
this.projectService = projectService;
if (this.logger.hasLevel(2 /* requestTime */)) {
this.logger.info("Binding...");
}
const args = [Arguments.GlobalCacheLocation, this.globalTypingsCacheLocation];
if (this.telemetryEnabled) {
args.push(Arguments.EnableTelemetry);
}
if (this.logger.loggingEnabled() && this.logger.getLogFileName()) {
args.push(Arguments.LogFile, combinePaths(getDirectoryPath(normalizeSlashes(this.logger.getLogFileName())), `ti-${process.pid}.log`));
}
if (this.typingSafeListLocation) {
args.push(Arguments.TypingSafeListLocation, this.typingSafeListLocation);
}
if (this.typesMapLocation) {
args.push(Arguments.TypesMapLocation, this.typesMapLocation);
}
if (this.npmLocation) {
args.push(Arguments.NpmLocation, this.npmLocation);
}
if (this.validateDefaultNpmLocation) {
args.push(Arguments.ValidateDefaultNpmLocation);
}
const execArgv = [];
for (const arg of process.execArgv) {
const match = /^--((?:debug|inspect)(?:-brk)?)(?:=(\d+))?$/.exec(arg);
if (match) {
const currentPort = match[2] !== void 0 ? +match[2] : match[1].charAt(0) === "d" ? 5858 : 9229;
execArgv.push(`--${match[1]}=${currentPort + 1}`);
break;
}
}
const typingsInstaller = combinePaths(getDirectoryPath(sys.getExecutingFilePath()), "typingsInstaller.js");
this.installer = childProcess.fork(typingsInstaller, args, { execArgv });
this.installer.on("message", (m) => this.handleMessage(m));
this.host.setImmediate(() => this.event({ pid: this.installer.pid }, "typingsInstallerPid"));
process.on("exit", () => {
this.installer.kill();
});
}
onProjectClosed(p) {
this.send({ projectName: p.getProjectName(), kind: "closeProject" });
}
send(rq) {
this.installer.send(rq);
}
enqueueInstallTypingsRequest(project, typeAcquisition, unresolvedImports) {
const request = createInstallTypingsRequest(project, typeAcquisition, unresolvedImports);
if (this.logger.hasLevel(3 /* verbose */)) {
if (this.logger.hasLevel(3 /* verbose */)) {
this.logger.info(`Scheduling throttled operation:${stringifyIndented(request)}`);
}
}
const operationId = project.getProjectName();
const operation = () => {
if (this.logger.hasLevel(3 /* verbose */)) {
this.logger.info(`Sending request:${stringifyIndented(request)}`);
}
this.send(request);
};
const queuedRequest = { operationId, operation };
if (this.activeRequestCount < _NodeTypingsInstaller.maxActiveRequestCount) {
this.scheduleRequest(queuedRequest);
} else {
if (this.logger.hasLevel(3 /* verbose */)) {
this.logger.info(`Deferring request for: ${operationId}`);
}
this.requestQueue.enqueue(queuedRequest);
this.requestMap.set(operationId, queuedRequest);
}
}
handleMessage(response) {
if (this.logger.hasLevel(3 /* verbose */)) {
this.logger.info(`Received response:${stringifyIndented(response)}`);
}
switch (response.kind) {
case EventTypesRegistry:
this.typesRegistryCache = new Map(Object.entries(response.typesRegistry));
break;
case ActionPackageInstalled: {
const { success, message } = response;
if (success) {
this.packageInstalledPromise.resolve({ successMessage: message });
} else {
this.packageInstalledPromise.reject(message);
}
this.packageInstalledPromise = void 0;
this.projectService.updateTypingsForProject(response);
this.event(response, "setTypings");
break;
}
case EventInitializationFailed: {
const body = {
message: response.message
};
const eventName = "typesInstallerInitializationFailed";
this.event(body, eventName);
break;
}
case EventBeginInstallTypes: {
const body = {
eventId: response.eventId,
packages: response.packagesToInstall
};
const eventName = "beginInstallTypes";
this.event(body, eventName);
break;
}
case EventEndInstallTypes: {
if (this.telemetryEnabled) {
const body2 = {
telemetryEventName: "typingsInstalled",
payload: {
installedPackages: response.packagesToInstall.join(","),
installSuccess: response.installSuccess,
typingsInstallerVersion: response.typingsInstallerVersion
}
};
const eventName2 = "telemetry";
this.event(body2, eventName2);
}
const body = {
eventId: response.eventId,
packages: response.packagesToInstall,
success: response.installSuccess
};
const eventName = "endInstallTypes";
this.event(body, eventName);
break;
}
case ActionInvalidate: {
this.projectService.updateTypingsForProject(response);
break;
}
case ActionSet: {
if (this.activeRequestCount > 0) {
this.activeRequestCount--;
} else {
Debug.fail("Received too many responses");
}
while (!this.requestQueue.isEmpty()) {
const queuedRequest = this.requestQueue.dequeue();
if (this.requestMap.get(queuedRequest.operationId) === queuedRequest) {
this.requestMap.delete(queuedRequest.operationId);
this.scheduleRequest(queuedRequest);
break;
}
if (this.logger.hasLevel(3 /* verbose */)) {
this.logger.info(`Skipping defunct request for: ${queuedRequest.operationId}`);
}
}
this.projectService.updateTypingsForProject(response);
this.event(response, "setTypings");
break;
}
case ActionWatchTypingLocations:
this.projectService.watchTypingLocations(response);
break;
default:
assertType(response);
}
}
scheduleRequest(request) {
if (this.logger.hasLevel(3 /* verbose */)) {
this.logger.info(`Scheduling request for: ${request.operationId}`);
}
this.activeRequestCount++;
this.host.setTimeout(request.operation, _NodeTypingsInstaller.requestDelayMillis);
}
};
let NodeTypingsInstaller = _NodeTypingsInstaller;
// This number is essentially arbitrary. Processing more than one typings request
// at a time makes sense, but having too many in the pipe results in a hang
// (see https://github.com/nodejs/node/issues/7657).
// It would be preferable to base our limit on the amount of space left in the
// buffer, but we have yet to find a way to retrieve that value.
NodeTypingsInstaller.maxActiveRequestCount = 10;
NodeTypingsInstaller.requestDelayMillis = 100;
class IOSession extends Session3 {
constructor() {
const event = (body, eventName) => {
this.event(body, eventName);
};
const host = sys;
const typingsInstaller = disableAutomaticTypingAcquisition ? void 0 : new NodeTypingsInstaller(telemetryEnabled, logger, host, getGlobalTypingsCacheLocation(), typingSafeListLocation, typesMapLocation, npmLocation, validateDefaultNpmLocation, event);
super({
host,
cancellationToken,
...options,
typingsInstaller: typingsInstaller || nullTypingsInstaller,
byteLength: Buffer.byteLength,
hrtime: process.hrtime,
logger,
canUseEvents: true,
typesMapLocation
});
this.eventPort = eventPort;
if (this.canUseEvents && this.eventPort) {
const s = net.connect({ port: this.eventPort }, () => {
this.eventSocket = s;
if (this.socketEventQueue) {
for (const event2 of this.socketEventQueue) {
this.writeToEventSocket(event2.body, event2.eventName);
}
this.socketEventQueue = void 0;
}
});
}
this.constructed = true;
}
event(body, eventName) {
Debug.assert(!!this.constructed, "Should only call `IOSession.prototype.event` on an initialized IOSession");
if (this.canUseEvents && this.eventPort) {
if (!this.eventSocket) {
if (this.logger.hasLevel(3 /* verbose */)) {
this.logger.info(`eventPort: event "${eventName}" queued, but socket not yet initialized`);
}
(this.socketEventQueue || (this.socketEventQueue = [])).push({ body, eventName });
return;
} else {
Debug.assert(this.socketEventQueue === void 0);
this.writeToEventSocket(body, eventName);
}
} else {
super.event(body, eventName);
}
}
writeToEventSocket(body, eventName) {
this.eventSocket.write(formatMessage2(toEvent(eventName, body), this.logger, this.byteLength, this.host.newLine), "utf8");
}
exit() {
var _a;
this.logger.info("Exiting...");
this.projectService.closeLog();
(_a = tracing) == null ? void 0 : _a.stopTracing();
process.exit(0);
}
listen() {
rl.on("line", (input) => {
const message = input.trim();
this.onMessage(message);
});
rl.on("close", () => {
this.exit();
});
}
}
class IpcIOSession extends IOSession {
writeMessage(msg) {
const verboseLogging = logger.hasLevel(3 /* verbose */);
if (verboseLogging) {
const json = JSON.stringify(msg);
logger.info(`${msg.type}:${indent2(json)}`);
}
process.send(msg);
}
parseMessage(message) {
return message;
}
toStringMessage(message) {
return JSON.stringify(message, void 0, 2);
}
listen() {
process.on("message", (e) => {
this.onMessage(e);
});
process.on("disconnect", () => {
this.exit();
});
}
}
const eventPort = parseEventPort(findArgument("--eventPort"));
const typingSafeListLocation = findArgument(Arguments.TypingSafeListLocation);
const typesMapLocation = findArgument(Arguments.TypesMapLocation) || combinePaths(getDirectoryPath(sys.getExecutingFilePath()), "typesMap.json");
const npmLocation = findArgument(Arguments.NpmLocation);
const validateDefaultNpmLocation = hasArgument(Arguments.ValidateDefaultNpmLocation);
const disableAutomaticTypingAcquisition = hasArgument("--disableAutomaticTypingAcquisition");
const useNodeIpc = hasArgument("--useNodeIpc");
const telemetryEnabled = hasArgument(Arguments.EnableTelemetry);
const commandLineTraceDir = findArgument("--traceDirectory");
const traceDir = commandLineTraceDir ? stripQuotes(commandLineTraceDir) : process.env.TSS_TRACE;
if (traceDir) {
startTracing("server", traceDir);
}
const ioSession = useNodeIpc ? new IpcIOSession() : new IOSession();
process.on("uncaughtException", (err) => {
ioSession.logError(err, "unknown");
});
process.noAsar = true;
ioSession.listen();
function getGlobalTypingsCacheLocation() {
switch (process.platform) {
case "win32": {
const basePath = process.env.LOCALAPPDATA || process.env.APPDATA || os.homedir && os.homedir() || process.env.USERPROFILE || process.env.HOMEDRIVE && process.env.HOMEPATH && normalizeSlashes(process.env.HOMEDRIVE + process.env.HOMEPATH) || os.tmpdir();
return combinePaths(combinePaths(normalizeSlashes(basePath), "Microsoft/TypeScript"), versionMajorMinor);
}
case "openbsd":
case "freebsd":
case "netbsd":
case "darwin":
case "linux":
case "android": {
const cacheLocation = getNonWindowsCacheLocation(process.platform === "darwin");
return combinePaths(combinePaths(cacheLocation, "typescript"), versionMajorMinor);
}
default:
return Debug.fail(`unsupported platform '${process.platform}'`);
}
}
function getNonWindowsCacheLocation(platformIsDarwin) {
if (process.env.XDG_CACHE_HOME) {
return process.env.XDG_CACHE_HOME;
}
const usersDir = platformIsDarwin ? "Users" : "home";
const homePath = os.homedir && os.homedir() || process.env.HOME || (process.env.LOGNAME || process.env.USER) && `/${usersDir}/${process.env.LOGNAME || process.env.USER}` || os.tmpdir();
const cacheFolder = platformIsDarwin ? "Library/Caches" : ".cache";
return combinePaths(normalizeSlashes(homePath), cacheFolder);
}
}
// src/tsserver/common.ts
function getLogLevel(level) {
if (level) {
const l = level.toLowerCase();
for (const name in LogLevel2) {
if (isNaN(+name) && l === name.toLowerCase()) {
return LogLevel2[name];
}
}
}
return void 0;
}
// src/tsserver/server.ts
function findArgumentStringArray(argName) {
const arg = findArgument(argName);
if (arg === void 0) {
return emptyArray2;
}
return arg.split(",").filter((name) => name !== "");
}
function start({ args, logger, cancellationToken, serverMode, unknownServerMode, startSession: startServer }, platform) {
logger.info(`Starting TS Server`);
logger.info(`Version: ${version}`);
logger.info(`Arguments: ${args.join(" ")}`);
logger.info(`Platform: ${platform} NodeVersion: ${process.version} CaseSensitive: ${sys.useCaseSensitiveFileNames}`);
logger.info(`ServerMode: ${serverMode} hasUnknownServerMode: ${unknownServerMode}`);
setStackTraceLimit();
if (Debug.isDebugging) {
Debug.enableDebugInfo();
}
if (sys.tryEnableSourceMapsForHost && /^development$/i.test(sys.getEnvironmentVariable("NODE_ENV"))) {
sys.tryEnableSourceMapsForHost();
}
console.log = (...args2) => logger.msg(args2.length === 1 ? args2[0] : args2.join(", "), "Info" /* Info */);
console.warn = (...args2) => logger.msg(args2.length === 1 ? args2[0] : args2.join(", "), "Err" /* Err */);
console.error = (...args2) => logger.msg(args2.length === 1 ? args2[0] : args2.join(", "), "Err" /* Err */);
startServer(
{
globalPlugins: findArgumentStringArray("--globalPlugins"),
pluginProbeLocations: findArgumentStringArray("--pluginProbeLocations"),
allowLocalPluginLoads: hasArgument("--allowLocalPluginLoads"),
useSingleInferredProject: hasArgument("--useSingleInferredProject"),
useInferredProjectPerProjectRoot: hasArgument("--useInferredProjectPerProjectRoot"),
suppressDiagnosticEvents: hasArgument("--suppressDiagnosticEvents"),
noGetErrOnBackgroundUpdate: hasArgument("--noGetErrOnBackgroundUpdate"),
serverMode
},
logger,
cancellationToken
);
}
setStackTraceLimit();
start(initializeNodeSystem(), require("os").platform());
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
ANONYMOUS,
AccessFlags,
AssertionLevel,
AssignmentDeclarationKind,
AssignmentKind,
Associativity,
BreakpointResolver,
BuilderFileEmit,
BuilderProgramKind,
BuilderState,
BundleFileSectionKind,
CallHierarchy,
CharacterCodes,
CheckFlags,
CheckMode,
ClassificationType,
ClassificationTypeNames,
CommentDirectiveType,
Comparison,
CompletionInfoFlags,
CompletionTriggerKind,
Completions,
ConfigFileProgramReloadLevel,
ContextFlags,
CoreServicesShimHostAdapter,
Debug,
DiagnosticCategory,
Diagnostics,
DocumentHighlights,
ElementFlags,
EmitFlags,
EmitHint,
EmitOnly,
EndOfLineState,
EnumKind,
ExitStatus,
ExportKind,
Extension,
ExternalEmitHelpers,
FileIncludeKind,
FilePreprocessingDiagnosticsKind,
FileSystemEntryKind,
FileWatcherEventKind,
FindAllReferences,
FlattenLevel,
FlowFlags,
ForegroundColorEscapeSequences,
FunctionFlags,
GeneratedIdentifierFlags,
GetLiteralTextFlags,
GoToDefinition,
HighlightSpanKind,
ImportKind,
ImportsNotUsedAsValues,
IndentStyle,
IndexFlags,
IndexKind,
InferenceFlags,
InferencePriority,
InlayHintKind,
InlayHints,
InternalEmitFlags,
InternalSymbolName,
InvalidatedProjectKind,
JsDoc,
JsTyping,
JsxEmit,
JsxFlags,
JsxReferenceKind,
LanguageServiceMode,
LanguageServiceShimHostAdapter,
LanguageVariant,
LexicalEnvironmentFlags,
ListFormat,
LogLevel,
MemberOverrideStatus,
ModifierFlags,
ModuleDetectionKind,
ModuleInstanceState,
ModuleKind,
ModuleResolutionKind,
ModuleSpecifierEnding,
NavigateTo,
NavigationBar,
NewLineKind,
NodeBuilderFlags,
NodeCheckFlags,
NodeFactoryFlags,
NodeFlags,
NodeResolutionFeatures,
ObjectFlags,
OperationCanceledException,
OperatorPrecedence,
OrganizeImports,
OrganizeImportsMode,
OuterExpressionKinds,
OutliningElementsCollector,
OutliningSpanKind,
OutputFileType,
PackageJsonAutoImportPreference,
PackageJsonDependencyGroup,
PatternMatchKind,
PollingInterval,
PollingWatchKind,
PragmaKindFlags,
PrivateIdentifierKind,
ProcessLevel,
QuotePreference,
RelationComparisonResult,
Rename,
ScriptElementKind,
ScriptElementKindModifier,
ScriptKind,
ScriptSnapshot,
ScriptTarget,
SemanticClassificationFormat,
SemanticMeaning,
SemicolonPreference,
SignatureCheckMode,
SignatureFlags,
SignatureHelp,
SignatureKind,
SmartSelectionRange,
SnippetKind,
SortKind,
StructureIsReused,
SymbolAccessibility,
SymbolDisplay,
SymbolDisplayPartKind,
SymbolFlags,
SymbolFormatFlags,
SyntaxKind,
SyntheticSymbolKind,
Ternary,
ThrottledCancellationToken,
TokenClass,
TokenFlags,
TransformFlags,
TypeFacts,
TypeFlags,
TypeFormatFlags,
TypeMapKind,
TypePredicateKind,
TypeReferenceSerializationKind,
TypeScriptServicesFactory,
UnionReduction,
UpToDateStatusType,
VarianceFlags,
Version,
VersionRange,
WatchDirectoryFlags,
WatchDirectoryKind,
WatchFileKind,
WatchLogLevel,
WatchType,
accessPrivateIdentifier,
addEmitFlags,
addEmitHelper,
addEmitHelpers,
addInternalEmitFlags,
addNodeFactoryPatcher,
addObjectAllocatorPatcher,
addRange,
addRelatedInfo,
addSyntheticLeadingComment,
addSyntheticTrailingComment,
addToSeen,
advancedAsyncSuperHelper,
affectsDeclarationPathOptionDeclarations,
affectsEmitOptionDeclarations,
allKeysStartWithDot,
altDirectorySeparator,
and,
append,
appendIfUnique,
arrayFrom,
arrayIsEqualTo,
arrayIsHomogeneous,
arrayIsSorted,
arrayOf,
arrayReverseIterator,
arrayToMap,
arrayToMultiMap,
arrayToNumericMap,
arraysEqual,
assertType,
assign,
assignHelper,
asyncDelegator,
asyncGeneratorHelper,
asyncSuperHelper,
asyncValues,
attachFileToDiagnostics,
awaitHelper,
awaiterHelper,
base64decode,
base64encode,
binarySearch,
binarySearchKey,
bindSourceFile,
breakIntoCharacterSpans,
breakIntoWordSpans,
buildLinkParts,
buildOpts,
buildOverload,
bundlerModuleNameResolver,
canBeConvertedToAsync,
canHaveDecorators,
canHaveExportModifier,
canHaveFlowNode,
canHaveIllegalDecorators,
canHaveIllegalModifiers,
canHaveIllegalType,
canHaveIllegalTypeParameters,
canHaveJSDoc,
canHaveLocals,
canHaveModifiers,
canHaveSymbol,
canJsonReportNoInputFiles,
canProduceDiagnostics,
canUsePropertyAccess,
canWatchAffectingLocation,
canWatchAtTypes,
canWatchDirectoryOrFile,
cartesianProduct,
cast,
chainBundle,
chainDiagnosticMessages,
changeAnyExtension,
changeCompilerHostLikeToUseCache,
changeExtension,
changesAffectModuleResolution,
changesAffectingProgramStructure,
childIsDecorated,
classElementOrClassElementParameterIsDecorated,
classOrConstructorParameterIsDecorated,
classPrivateFieldGetHelper,
classPrivateFieldInHelper,
classPrivateFieldSetHelper,
classicNameResolver,
classifier,
cleanExtendedConfigCache,
clear,
clearMap,
clearSharedExtendedConfigFileWatcher,
climbPastPropertyAccess,
climbPastPropertyOrElementAccess,
clone,
cloneCompilerOptions,
closeFileWatcher,
closeFileWatcherOf,
codefix,
collapseTextChangeRangesAcrossMultipleVersions,
collectExternalModuleInfo,
combine,
combinePaths,
commentPragmas,
commonOptionsWithBuild,
commonPackageFolders,
compact,
compareBooleans,
compareDataObjects,
compareDiagnostics,
compareDiagnosticsSkipRelatedInformation,
compareEmitHelpers,
compareNumberOfDirectorySeparators,
comparePaths,
comparePathsCaseInsensitive,
comparePathsCaseSensitive,
comparePatternKeys,
compareProperties,
compareStringsCaseInsensitive,
compareStringsCaseInsensitiveEslintCompatible,
compareStringsCaseSensitive,
compareStringsCaseSensitiveUI,
compareTextSpans,
compareValues,
compileOnSaveCommandLineOption,
compilerOptionsAffectDeclarationPath,
compilerOptionsAffectEmit,
compilerOptionsAffectSemanticDiagnostics,
compilerOptionsDidYouMeanDiagnostics,
compilerOptionsIndicateEsModules,
compose,
computeCommonSourceDirectoryOfFilenames,
computeLineAndCharacterOfPosition,
computeLineOfPosition,
computeLineStarts,
computePositionOfLineAndCharacter,
computeSignature,
computeSignatureWithDiagnostics,
computeSuggestionDiagnostics,
concatenate,
concatenateDiagnosticMessageChains,
consumesNodeCoreModules,
contains,
containsIgnoredPath,
containsObjectRestOrSpread,
containsParseError,
containsPath,
convertCompilerOptionsForTelemetry,
convertCompilerOptionsFromJson,
convertJsonOption,
convertToBase64,
convertToJson,
convertToObject,
convertToOptionsWithAbsolutePaths,
convertToRelativePath,
convertToTSConfig,
convertTypeAcquisitionFromJson,
copyComments,
copyEntries,
copyLeadingComments,
copyProperties,
copyTrailingAsLeadingComments,
copyTrailingComments,
couldStartTrivia,
countWhere,
createAbstractBuilder,
createAccessorPropertyBackingField,
createAccessorPropertyGetRedirector,
createAccessorPropertySetRedirector,
createBaseNodeFactory,
createBinaryExpressionTrampoline,
createBindingHelper,
createBuildInfo,
createBuilderProgram,
createBuilderProgramUsingProgramBuildInfo,
createBuilderStatusReporter,
createCacheWithRedirects,
createCacheableExportInfoMap,
createCachedDirectoryStructureHost,
createClassifier,
createCommentDirectivesMap,
createCompilerDiagnostic,
createCompilerDiagnosticForInvalidCustomType,
createCompilerDiagnosticFromMessageChain,
createCompilerHost,
createCompilerHostFromProgramHost,
createCompilerHostWorker,
createDetachedDiagnostic,
createDiagnosticCollection,
createDiagnosticForFileFromMessageChain,
createDiagnosticForNode,
createDiagnosticForNodeArray,
createDiagnosticForNodeArrayFromMessageChain,
createDiagnosticForNodeFromMessageChain,
createDiagnosticForNodeInSourceFile,
createDiagnosticForRange,
createDiagnosticMessageChainFromDiagnostic,
createDiagnosticReporter,
createDocumentPositionMapper,
createDocumentRegistry,
createDocumentRegistryInternal,
createEmitAndSemanticDiagnosticsBuilderProgram,
createEmitHelperFactory,
createEmptyExports,
createExpressionForJsxElement,
createExpressionForJsxFragment,
createExpressionForObjectLiteralElementLike,
createExpressionForPropertyName,
createExpressionFromEntityName,
createExternalHelpersImportDeclarationIfNeeded,
createFileDiagnostic,
createFileDiagnosticFromMessageChain,
createForOfBindingStatement,
createGetCanonicalFileName,
createGetSourceFile,
createGetSymbolAccessibilityDiagnosticForNode,
createGetSymbolAccessibilityDiagnosticForNodeName,
createGetSymbolWalker,
createIncrementalCompilerHost,
createIncrementalProgram,
createInputFiles,
createInputFilesWithFilePaths,
createInputFilesWithFileTexts,
createJsxFactoryExpression,
createLanguageService,
createLanguageServiceSourceFile,
createMemberAccessForPropertyName,
createModeAwareCache,
createModeAwareCacheKey,
createModuleNotFoundChain,
createModuleResolutionCache,
createModuleResolutionLoader,
createModuleSpecifierResolutionHost,
createMultiMap,
createNodeConverters,
createNodeFactory,
createOptionNameMap,
createOverload,
createPackageJsonImportFilter,
createPackageJsonInfo,
createParenthesizerRules,
createPatternMatcher,
createPrependNodes,
createPrinter,
createPrinterWithDefaults,
createPrinterWithRemoveComments,
createPrinterWithRemoveCommentsNeverAsciiEscape,
createPrinterWithRemoveCommentsOmitTrailingSemicolon,
createProgram,
createProgramHost,
createPropertyNameNodeForIdentifierOrLiteral,
createQueue,
createRange,
createRedirectedBuilderProgram,
createResolutionCache,
createRuntimeTypeSerializer,
createScanner,
createSemanticDiagnosticsBuilderProgram,
createSet,
createSolutionBuilder,
createSolutionBuilderHost,
createSolutionBuilderWithWatch,
createSolutionBuilderWithWatchHost,
createSortedArray,
createSourceFile,
createSourceMapGenerator,
createSourceMapSource,
createSuperAccessVariableStatement,
createSymbolTable,
createSymlinkCache,
createSystemWatchFunctions,
createTextChange,
createTextChangeFromStartLength,
createTextChangeRange,
createTextRangeFromNode,
createTextRangeFromSpan,
createTextSpan,
createTextSpanFromBounds,
createTextSpanFromNode,
createTextSpanFromRange,
createTextSpanFromStringLiteralLikeContent,
createTextWriter,
createTokenRange,
createTypeChecker,
createTypeReferenceDirectiveResolutionCache,
createTypeReferenceResolutionLoader,
createUnparsedSourceFile,
createWatchCompilerHost,
createWatchCompilerHostOfConfigFile,
createWatchCompilerHostOfFilesAndCompilerOptions,
createWatchFactory,
createWatchHost,
createWatchProgram,
createWatchStatusReporter,
createWriteFileMeasuringIO,
declarationNameToString,
decodeMappings,
decodedTextSpanIntersectsWith,
decorateHelper,
deduplicate,
defaultIncludeSpec,
defaultInitCompilerOptions,
defaultMaximumTruncationLength,
detectSortCaseSensitivity,
diagnosticCategoryName,
diagnosticToString,
directoryProbablyExists,
directorySeparator,
displayPart,
displayPartsToString,
disposeEmitNodes,
documentSpansEqual,
dumpTracingLegend,
elementAt,
elideNodes,
emitComments,
emitDetachedComments,
emitFiles,
emitFilesAndReportErrors,
emitFilesAndReportErrorsAndGetExitStatus,
emitModuleKindIsNonNodeESM,
emitNewLineBeforeLeadingCommentOfPosition,
emitNewLineBeforeLeadingComments,
emitNewLineBeforeLeadingCommentsOfPosition,
emitSkippedWithNoDiagnostics,
emitUsingBuildInfo,
emptyArray,
emptyFileSystemEntries,
emptyMap,
emptyOptions,
emptySet,
endsWith,
ensurePathIsNonModuleName,
ensureScriptKind,
ensureTrailingDirectorySeparator,
entityNameToString,
enumerateInsertsAndDeletes,
equalOwnProperties,
equateStringsCaseInsensitive,
equateStringsCaseSensitive,
equateValues,
esDecorateHelper,
escapeJsxAttributeString,
escapeLeadingUnderscores,
escapeNonAsciiString,
escapeSnippetText,
escapeString,
every,
expandPreOrPostfixIncrementOrDecrementExpression,
explainFiles,
explainIfFileIsRedirectAndImpliedFormat,
exportAssignmentIsAlias,
exportStarHelper,
expressionResultIsUnused,
extend,
extendsHelper,
extensionFromPath,
extensionIsTS,
extensionsNotSupportingExtensionlessResolution,
externalHelpersModuleNameText,
factory,
fileExtensionIs,
fileExtensionIsOneOf,
fileIncludeReasonToDiagnostics,
fileShouldUseJavaScriptRequire,
filter,
filterMutate,
filterSemanticDiagnostics,
find,
findAncestor,
findBestPatternMatch,
findChildOfKind,
findComputedPropertyNameCacheAssignment,
findConfigFile,
findContainingList,
findDiagnosticForNode,
findFirstNonJsxWhitespaceToken,
findIndex,
findLast,
findLastIndex,
findListItemInfo,
findMap,
findModifier,
findNextToken,
findPackageJson,
findPackageJsons,
findPrecedingMatchingToken,
findPrecedingToken,
findSuperStatementIndex,
findTokenOnLeftOfPosition,
findUseStrictPrologue,
first,
firstDefined,
firstDefinedIterator,
firstIterator,
firstOrOnly,
firstOrUndefined,
firstOrUndefinedIterator,
fixupCompilerOptions,
flatMap,
flatMapIterator,
flatMapToMutable,
flatten,
flattenCommaList,
flattenDestructuringAssignment,
flattenDestructuringBinding,
flattenDiagnosticMessageText,
forEach,
forEachAncestor,
forEachAncestorDirectory,
forEachChild,
forEachChildRecursively,
forEachEmittedFile,
forEachEnclosingBlockScopeContainer,
forEachEntry,
forEachExternalModuleToImportFrom,
forEachImportClauseDeclaration,
forEachKey,
forEachLeadingCommentRange,
forEachNameInAccessChainWalkingLeft,
forEachPropertyAssignment,
forEachResolvedProjectReference,
forEachReturnStatement,
forEachRight,
forEachTrailingCommentRange,
forEachTsConfigPropArray,
forEachUnique,
forEachYieldExpression,
forSomeAncestorDirectory,
formatColorAndReset,
formatDiagnostic,
formatDiagnostics,
formatDiagnosticsWithColorAndContext,
formatGeneratedName,
formatGeneratedNamePart,
formatLocation,
formatMessage,
formatStringFromArgs,
formatting,
fullTripleSlashAMDReferencePathRegEx,
fullTripleSlashReferencePathRegEx,
generateDjb2Hash,
generateTSConfig,
generatorHelper,
getAdjustedReferenceLocation,
getAdjustedRenameLocation,
getAliasDeclarationFromName,
getAllAccessorDeclarations,
getAllDecoratorsOfClass,
getAllDecoratorsOfClassElement,
getAllJSDocTags,
getAllJSDocTagsOfKind,
getAllKeys,
getAllProjectOutputs,
getAllSuperTypeNodes,
getAllUnscopedEmitHelpers,
getAllowJSCompilerOption,
getAllowSyntheticDefaultImports,
getAncestor,
getAnyExtensionFromPath,
getAreDeclarationMapsEnabled,
getAssignedExpandoInitializer,
getAssignedName,
getAssignmentDeclarationKind,
getAssignmentDeclarationPropertyAccessKind,
getAssignmentTargetKind,
getAutomaticTypeDirectiveNames,
getBaseFileName,
getBinaryOperatorPrecedence,
getBuildInfo,
getBuildInfoFileVersionMap,
getBuildInfoText,
getBuildOrderFromAnyBuildOrder,
getBuilderCreationParameters,
getBuilderFileEmit,
getCheckFlags,
getClassExtendsHeritageElement,
getClassLikeDeclarationOfSymbol,
getCombinedLocalAndExportSymbolFlags,
getCombinedModifierFlags,
getCombinedNodeFlags,
getCombinedNodeFlagsAlwaysIncludeJSDoc,
getCommentRange,
getCommonSourceDirectory,
getCommonSourceDirectoryOfConfig,
getCompilerOptionValue,
getCompilerOptionsDiffValue,
getConditions,
getConfigFileParsingDiagnostics,
getConstantValue,
getContainerNode,
getContainingClass,
getContainingClassStaticBlock,
getContainingFunction,
getContainingFunctionDeclaration,
getContainingFunctionOrClassStaticBlock,
getContainingNodeArray,
getContainingObjectLiteralElement,
getContextualTypeFromParent,
getContextualTypeFromParentOrAncestorTypeNode,
getCurrentTime,
getDeclarationDiagnostics,
getDeclarationEmitExtensionForPath,
getDeclarationEmitOutputFilePath,
getDeclarationEmitOutputFilePathWorker,
getDeclarationFromName,
getDeclarationModifierFlagsFromSymbol,
getDeclarationOfKind,
getDeclarationsOfKind,
getDeclaredExpandoInitializer,
getDecorators,
getDefaultCompilerOptions,
getDefaultExportInfoWorker,
getDefaultFormatCodeSettings,
getDefaultLibFileName,
getDefaultLibFilePath,
getDefaultLikeExportInfo,
getDiagnosticText,
getDiagnosticsWithinSpan,
getDirectoryPath,
getDirectoryToWatchFailedLookupLocation,
getDirectoryToWatchFailedLookupLocationFromTypeRoot,
getDocumentPositionMapper,
getESModuleInterop,
getEditsForFileRename,
getEffectiveBaseTypeNode,
getEffectiveConstraintOfTypeParameter,
getEffectiveContainerForJSDocTemplateTag,
getEffectiveImplementsTypeNodes,
getEffectiveInitializer,
getEffectiveJSDocHost,
getEffectiveModifierFlags,
getEffectiveModifierFlagsAlwaysIncludeJSDoc,
getEffectiveModifierFlagsNoCache,
getEffectiveReturnTypeNode,
getEffectiveSetAccessorTypeAnnotationNode,
getEffectiveTypeAnnotationNode,
getEffectiveTypeParameterDeclarations,
getEffectiveTypeRoots,
getElementOrPropertyAccessArgumentExpressionOrName,
getElementOrPropertyAccessName,
getElementsOfBindingOrAssignmentPattern,
getEmitDeclarations,
getEmitFlags,
getEmitHelpers,
getEmitModuleDetectionKind,
getEmitModuleKind,
getEmitModuleResolutionKind,
getEmitScriptTarget,
getEnclosingBlockScopeContainer,
getEncodedSemanticClassifications,
getEncodedSyntacticClassifications,
getEndLinePosition,
getEntityNameFromTypeNode,
getEntrypointsFromPackageJsonInfo,
getErrorCountForSummary,
getErrorSpanForNode,
getErrorSummaryText,
getEscapedTextOfIdentifierOrLiteral,
getEscapedTextOfJsxAttributeName,
getEscapedTextOfJsxNamespacedName,
getExpandoInitializer,
getExportAssignmentExpression,
getExportInfoMap,
getExportNeedsImportStarHelper,
getExpressionAssociativity,
getExpressionPrecedence,
getExternalHelpersModuleName,
getExternalModuleImportEqualsDeclarationExpression,
getExternalModuleName,
getExternalModuleNameFromDeclaration,
getExternalModuleNameFromPath,
getExternalModuleNameLiteral,
getExternalModuleRequireArgument,
getFallbackOptions,
getFileEmitOutput,
getFileMatcherPatterns,
getFileNamesFromConfigSpecs,
getFileWatcherEventKind,
getFilesInErrorForSummary,
getFirstConstructorWithBody,
getFirstIdentifier,
getFirstNonSpaceCharacterPosition,
getFirstProjectOutput,
getFixableErrorSpanExpression,
getFormatCodeSettingsForWriting,
getFullWidth,
getFunctionFlags,
getHeritageClause,
getHostSignatureFromJSDoc,
getIdentifierAutoGenerate,
getIdentifierGeneratedImportReference,
getIdentifierTypeArguments,
getImmediatelyInvokedFunctionExpression,
getImpliedNodeFormatForFile,
getImpliedNodeFormatForFileWorker,
getImportNeedsImportDefaultHelper,
getImportNeedsImportStarHelper,
getIndentSize,
getIndentString,
getInferredLibraryNameResolveFrom,
getInitializedVariables,
getInitializerOfBinaryExpression,
getInitializerOfBindingOrAssignmentElement,
getInterfaceBaseTypeNodes,
getInternalEmitFlags,
getInvokedExpression,
getIsolatedModules,
getJSDocAugmentsTag,
getJSDocClassTag,
getJSDocCommentRanges,
getJSDocCommentsAndTags,
getJSDocDeprecatedTag,
getJSDocDeprecatedTagNoCache,
getJSDocEnumTag,
getJSDocHost,
getJSDocImplementsTags,
getJSDocOverrideTagNoCache,
getJSDocParameterTags,
getJSDocParameterTagsNoCache,
getJSDocPrivateTag,
getJSDocPrivateTagNoCache,
getJSDocProtectedTag,
getJSDocProtectedTagNoCache,
getJSDocPublicTag,
getJSDocPublicTagNoCache,
getJSDocReadonlyTag,
getJSDocReadonlyTagNoCache,
getJSDocReturnTag,
getJSDocReturnType,
getJSDocRoot,
getJSDocSatisfiesExpressionType,
getJSDocSatisfiesTag,
getJSDocTags,
getJSDocTagsNoCache,
getJSDocTemplateTag,
getJSDocThisTag,
getJSDocType,
getJSDocTypeAliasName,
getJSDocTypeAssertionType,
getJSDocTypeParameterDeclarations,
getJSDocTypeParameterTags,
getJSDocTypeParameterTagsNoCache,
getJSDocTypeTag,
getJSXImplicitImportBase,
getJSXRuntimeImport,
getJSXTransformEnabled,
getKeyForCompilerOptions,
getLanguageVariant,
getLastChild,
getLeadingCommentRanges,
getLeadingCommentRangesOfNode,
getLeftmostAccessExpression,
getLeftmostExpression,
getLineAndCharacterOfPosition,
getLineInfo,
getLineOfLocalPosition,
getLineOfLocalPositionFromLineMap,
getLineStartPositionForPosition,
getLineStarts,
getLinesBetweenPositionAndNextNonWhitespaceCharacter,
getLinesBetweenPositionAndPrecedingNonWhitespaceCharacter,
getLinesBetweenPositions,
getLinesBetweenRangeEndAndRangeStart,
getLinesBetweenRangeEndPositions,
getLiteralText,
getLocalNameForExternalImport,
getLocalSymbolForExportDefault,
getLocaleSpecificMessage,
getLocaleTimeString,
getMappedContextSpan,
getMappedDocumentSpan,
getMappedLocation,
getMatchedFileSpec,
getMatchedIncludeSpec,
getMeaningFromDeclaration,
getMeaningFromLocation,
getMembersOfDeclaration,
getModeForFileReference,
getModeForResolutionAtIndex,
getModeForUsageLocation,
getModifiedTime,
getModifiers,
getModuleInstanceState,
getModuleNameStringLiteralAt,
getModuleSpecifierEndingPreference,
getModuleSpecifierResolverHost,
getNameForExportedSymbol,
getNameFromIndexInfo,
getNameFromPropertyName,
getNameOfAccessExpression,
getNameOfCompilerOptionValue,
getNameOfDeclaration,
getNameOfExpando,
getNameOfJSDocTypedef,
getNameOrArgument,
getNameTable,
getNamesForExportedSymbol,
getNamespaceDeclarationNode,
getNewLineCharacter,
getNewLineKind,
getNewLineOrDefaultFromHost,
getNewTargetContainer,
getNextJSDocCommentLocation,
getNodeForGeneratedName,
getNodeId,
getNodeKind,
getNodeModifiers,
getNodeModulePathParts,
getNonAssignedNameOfDeclaration,
getNonAssignmentOperatorForCompoundAssignment,
getNonAugmentationDeclaration,
getNonDecoratorTokenPosOfNode,
getNormalizedAbsolutePath,
getNormalizedAbsolutePathWithoutRoot,
getNormalizedPathComponents,
getObjectFlags,
getOperator,
getOperatorAssociativity,
getOperatorPrecedence,
getOptionFromName,
getOptionsForLibraryResolution,
getOptionsNameMap,
getOrCreateEmitNode,
getOrCreateExternalHelpersModuleNameIfNeeded,
getOrUpdate,
getOriginalNode,
getOriginalNodeId,
getOriginalSourceFile,
getOutputDeclarationFileName,
getOutputExtension,
getOutputFileNames,
getOutputPathsFor,
getOutputPathsForBundle,
getOwnEmitOutputFilePath,
getOwnKeys,
getOwnValues,
getPackageJsonInfo,
getPackageJsonTypesVersionsPaths,
getPackageJsonsVisibleToFile,
getPackageNameFromTypesPackageName,
getPackageScopeForPath,
getParameterSymbolFromJSDoc,
getParameterTypeNode,
getParentNodeInSpan,
getParseTreeNode,
getParsedCommandLineOfConfigFile,
getPathComponents,
getPathComponentsRelativeTo,
getPathFromPathComponents,
getPathUpdater,
getPathsBasePath,
getPatternFromSpec,
getPendingEmitKind,
getPositionOfLineAndCharacter,
getPossibleGenericSignatures,
getPossibleOriginalInputExtensionForExtension,
getPossibleTypeArgumentsInfo,
getPreEmitDiagnostics,
getPrecedingNonSpaceCharacterPosition,
getPrivateIdentifier,
getProperties,
getProperty,
getPropertyArrayElementValue,
getPropertyAssignmentAliasLikeExpression,
getPropertyNameForPropertyNameNode,
getPropertyNameForUniqueESSymbol,
getPropertyNameOfBindingOrAssignmentElement,
getPropertySymbolFromBindingElement,
getPropertySymbolsFromContextualType,
getQuoteFromPreference,
getQuotePreference,
getRangesWhere,
getRefactorContextSpan,
getReferencedFileLocation,
getRegexFromPattern,
getRegularExpressionForWildcard,
getRegularExpressionsForWildcards,
getRelativePathFromDirectory,
getRelativePathFromFile,
getRelativePathToDirectoryOrUrl,
getRenameLocation,
getReplacementSpanForContextToken,
getResolutionDiagnostic,
getResolutionModeOverrideForClause,
getResolveJsonModule,
getResolvePackageJsonExports,
getResolvePackageJsonImports,
getResolvedExternalModuleName,
getResolvedModule,
getResolvedTypeReferenceDirective,
getRestIndicatorOfBindingOrAssignmentElement,
getRestParameterElementType,
getRightMostAssignedExpression,
getRootDeclaration,
getRootDirectoryOfResolutionCache,
getRootLength,
getRootPathSplitLength,
getScriptKind,
getScriptKindFromFileName,
getScriptTargetFeatures,
getSelectedEffectiveModifierFlags,
getSelectedSyntacticModifierFlags,
getSemanticClassifications,
getSemanticJsxChildren,
getSetAccessorTypeAnnotationNode,
getSetAccessorValueParameter,
getSetExternalModuleIndicator,
getShebang,
getSingleInitializerOfVariableStatementOrPropertyDeclaration,
getSingleVariableOfVariableStatement,
getSnapshotText,
getSnippetElement,
getSourceFileOfModule,
getSourceFileOfNode,
getSourceFilePathInNewDir,
getSourceFilePathInNewDirWorker,
getSourceFileVersionAsHashFromText,
getSourceFilesToEmit,
getSourceMapRange,
getSourceMapper,
getSourceTextOfNodeFromSourceFile,
getSpanOfTokenAtPosition,
getSpellingSuggestion,
getStartPositionOfLine,
getStartPositionOfRange,
getStartsOnNewLine,
getStaticPropertiesAndClassStaticBlock,
getStrictOptionValue,
getStringComparer,
getSuperCallFromStatement,
getSuperContainer,
getSupportedCodeFixes,
getSupportedExtensions,
getSupportedExtensionsWithJsonIfResolveJsonModule,
getSwitchedType,
getSymbolId,
getSymbolNameForPrivateIdentifier,
getSymbolTarget,
getSyntacticClassifications,
getSyntacticModifierFlags,
getSyntacticModifierFlagsNoCache,
getSynthesizedDeepClone,
getSynthesizedDeepCloneWithReplacements,
getSynthesizedDeepClones,
getSynthesizedDeepClonesWithReplacements,
getSyntheticLeadingComments,
getSyntheticTrailingComments,
getTargetLabel,
getTargetOfBindingOrAssignmentElement,
getTemporaryModuleResolutionState,
getTextOfConstantValue,
getTextOfIdentifierOrLiteral,
getTextOfJSDocComment,
getTextOfJsxAttributeName,
getTextOfJsxNamespacedName,
getTextOfNode,
getTextOfNodeFromSourceText,
getTextOfPropertyName,
getThisContainer,
getThisParameter,
getTokenAtPosition,
getTokenPosOfNode,
getTokenSourceMapRange,
getTouchingPropertyName,
getTouchingToken,
getTrailingCommentRanges,
getTrailingSemicolonDeferringWriter,
getTransformFlagsSubtreeExclusions,
getTransformers,
getTsBuildInfoEmitOutputFilePath,
getTsConfigObjectLiteralExpression,
getTsConfigPropArrayElementValue,
getTypeAnnotationNode,
getTypeArgumentOrTypeParameterList,
getTypeKeywordOfTypeOnlyImport,
getTypeNode,
getTypeNodeIfAccessible,
getTypeParameterFromJsDoc,
getTypeParameterOwner,
getTypesPackageName,
getUILocale,
getUniqueName,
getUniqueSymbolId,
getUseDefineForClassFields,
getWatchErrorSummaryDiagnosticMessage,
getWatchFactory,
group,
groupBy,
guessIndentation,
handleNoEmitOptions,
hasAbstractModifier,
hasAccessorModifier,
hasAmbientModifier,
hasChangesInResolutions,
hasChildOfKind,
hasContextSensitiveParameters,
hasDecorators,
hasDocComment,
hasDynamicName,
hasEffectiveModifier,
hasEffectiveModifiers,
hasEffectiveReadonlyModifier,
hasExtension,
hasIndexSignature,
hasInitializer,
hasInvalidEscape,
hasJSDocNodes,
hasJSDocParameterTags,
hasJSFileExtension,
hasJsonModuleEmitEnabled,
hasOnlyExpressionInitializer,
hasOverrideModifier,
hasPossibleExternalModuleReference,
hasProperty,
hasPropertyAccessExpressionWithName,
hasQuestionToken,
hasRecordedExternalHelpers,
hasRestParameter,
hasScopeMarker,
hasStaticModifier,
hasSyntacticModifier,
hasSyntacticModifiers,
hasTSFileExtension,
hasTabstop,
hasTrailingDirectorySeparator,
hasType,
hasTypeArguments,
hasZeroOrOneAsteriskCharacter,
helperString,
hostGetCanonicalFileName,
hostUsesCaseSensitiveFileNames,
idText,
identifierIsThisKeyword,
identifierToKeywordKind,
identity,
identitySourceMapConsumer,
ignoreSourceNewlines,
ignoredPaths,
importDefaultHelper,
importFromModuleSpecifier,
importNameElisionDisabled,
importStarHelper,
indexOfAnyCharCode,
indexOfNode,
indicesOf,
inferredTypesContainingFile,
insertImports,
insertLeadingStatement,
insertSorted,
insertStatementAfterCustomPrologue,
insertStatementAfterStandardPrologue,
insertStatementsAfterCustomPrologue,
insertStatementsAfterStandardPrologue,
intersperse,
intrinsicTagNameToString,
introducesArgumentsExoticObject,
inverseJsxOptionMap,
isAbstractConstructorSymbol,
isAbstractModifier,
isAccessExpression,
isAccessibilityModifier,
isAccessor,
isAccessorModifier,
isAliasSymbolDeclaration,
isAliasableExpression,
isAmbientModule,
isAmbientPropertyDeclaration,
isAnonymousFunctionDefinition,
isAnyDirectorySeparator,
isAnyImportOrBareOrAccessedRequire,
isAnyImportOrReExport,
isAnyImportSyntax,
isAnySupportedFileExtension,
isApplicableVersionedTypesKey,
isArgumentExpressionOfElementAccess,
isArray,
isArrayBindingElement,
isArrayBindingOrAssignmentElement,
isArrayBindingOrAssignmentPattern,
isArrayBindingPattern,
isArrayLiteralExpression,
isArrayLiteralOrObjectLiteralDestructuringPattern,
isArrayTypeNode,
isArrowFunction,
isAsExpression,
isAssertClause,
isAssertEntry,
isAssertionExpression,
isAssertionKey,
isAssertsKeyword,
isAssignmentDeclaration,
isAssignmentExpression,
isAssignmentOperator,
isAssignmentPattern,
isAssignmentTarget,
isAsteriskToken,
isAsyncFunction,
isAsyncModifier,
isAutoAccessorPropertyDeclaration,
isAwaitExpression,
isAwaitKeyword,
isBigIntLiteral,
isBinaryExpression,
isBinaryOperatorToken,
isBindableObjectDefinePropertyCall,
isBindableStaticAccessExpression,
isBindableStaticElementAccessExpression,
isBindableStaticNameExpression,
isBindingElement,
isBindingElementOfBareOrAccessedRequire,
isBindingName,
isBindingOrAssignmentElement,
isBindingOrAssignmentPattern,
isBindingPattern,
isBlock,
isBlockOrCatchScoped,
isBlockScope,
isBlockScopedContainerTopLevel,
isBooleanLiteral,
isBreakOrContinueStatement,
isBreakStatement,
isBuildInfoFile,
isBuilderProgram,
isBundle,
isBundleFileTextLike,
isCallChain,
isCallExpression,
isCallExpressionTarget,
isCallLikeExpression,
isCallOrNewExpression,
isCallOrNewExpressionTarget,
isCallSignatureDeclaration,
isCallToHelper,
isCaseBlock,
isCaseClause,
isCaseKeyword,
isCaseOrDefaultClause,
isCatchClause,
isCatchClauseVariableDeclaration,
isCatchClauseVariableDeclarationOrBindingElement,
isCheckJsEnabledForFile,
isChildOfNodeWithKind,
isCircularBuildOrder,
isClassDeclaration,
isClassElement,
isClassExpression,
isClassLike,
isClassMemberModifier,
isClassOrTypeElement,
isClassStaticBlockDeclaration,
isCollapsedRange,
isColonToken,
isCommaExpression,
isCommaListExpression,
isCommaSequence,
isCommaToken,
isComment,
isCommonJsExportPropertyAssignment,
isCommonJsExportedExpression,
isCompoundAssignment,
isComputedNonLiteralName,
isComputedPropertyName,
isConciseBody,
isConditionalExpression,
isConditionalTypeNode,
isConstTypeReference,
isConstructSignatureDeclaration,
isConstructorDeclaration,
isConstructorTypeNode,
isContextualKeyword,
isContinueStatement,
isCustomPrologue,
isDebuggerStatement,
isDeclaration,
isDeclarationBindingElement,
isDeclarationFileName,
isDeclarationName,
isDeclarationNameOfEnumOrNamespace,
isDeclarationReadonly,
isDeclarationStatement,
isDeclarationWithTypeParameterChildren,
isDeclarationWithTypeParameters,
isDecorator,
isDecoratorTarget,
isDefaultClause,
isDefaultImport,
isDefaultModifier,
isDefaultedExpandoInitializer,
isDeleteExpression,
isDeleteTarget,
isDeprecatedDeclaration,
isDestructuringAssignment,
isDiagnosticWithLocation,
isDiskPathRoot,
isDoStatement,
isDotDotDotToken,
isDottedName,
isDynamicName,
isESSymbolIdentifier,
isEffectiveExternalModule,
isEffectiveModuleDeclaration,
isEffectiveStrictModeSourceFile,
isElementAccessChain,
isElementAccessExpression,
isEmittedFileOfProgram,
isEmptyArrayLiteral,
isEmptyBindingElement,
isEmptyBindingPattern,
isEmptyObjectLiteral,
isEmptyStatement,
isEmptyStringLiteral,
isEntityName,
isEntityNameExpression,
isEnumConst,
isEnumDeclaration,
isEnumMember,
isEqualityOperatorKind,
isEqualsGreaterThanToken,
isExclamationToken,
isExcludedFile,
isExclusivelyTypeOnlyImportOrExport,
isExportAssignment,
isExportDeclaration,
isExportModifier,
isExportName,
isExportNamespaceAsDefaultDeclaration,
isExportOrDefaultModifier,
isExportSpecifier,
isExportsIdentifier,
isExportsOrModuleExportsOrAlias,
isExpression,
isExpressionNode,
isExpressionOfExternalModuleImportEqualsDeclaration,
isExpressionOfOptionalChainRoot,
isExpressionStatement,
isExpressionWithTypeArguments,
isExpressionWithTypeArgumentsInClassExtendsClause,
isExternalModule,
isExternalModuleAugmentation,
isExternalModuleImportEqualsDeclaration,
isExternalModuleIndicator,
isExternalModuleNameRelative,
isExternalModuleReference,
isExternalModuleSymbol,
isExternalOrCommonJsModule,
isFileLevelUniqueName,
isFileProbablyExternalModule,
isFirstDeclarationOfSymbolParameter,
isFixablePromiseHandler,
isForInOrOfStatement,
isForInStatement,
isForInitializer,
isForOfStatement,
isForStatement,
isFunctionBlock,
isFunctionBody,
isFunctionDeclaration,
isFunctionExpression,
isFunctionExpressionOrArrowFunction,
isFunctionLike,
isFunctionLikeDeclaration,
isFunctionLikeKind,
isFunctionLikeOrClassStaticBlockDeclaration,
isFunctionOrConstructorTypeNode,
isFunctionOrModuleBlock,
isFunctionSymbol,
isFunctionTypeNode,
isFutureReservedKeyword,
isGeneratedIdentifier,
isGeneratedPrivateIdentifier,
isGetAccessor,
isGetAccessorDeclaration,
isGetOrSetAccessorDeclaration,
isGlobalDeclaration,
isGlobalScopeAugmentation,
isGrammarError,
isHeritageClause,
isHoistedFunction,
isHoistedVariableStatement,
isIdentifier,
isIdentifierANonContextualKeyword,
isIdentifierName,
isIdentifierOrThisTypeNode,
isIdentifierPart,
isIdentifierStart,
isIdentifierText,
isIdentifierTypePredicate,
isIdentifierTypeReference,
isIfStatement,
isIgnoredFileFromWildCardWatching,
isImplicitGlob,
isImportCall,
isImportClause,
isImportDeclaration,
isImportEqualsDeclaration,
isImportKeyword,
isImportMeta,
isImportOrExportSpecifier,
isImportOrExportSpecifierName,
isImportSpecifier,
isImportTypeAssertionContainer,
isImportTypeNode,
isImportableFile,
isInComment,
isInExpressionContext,
isInJSDoc,
isInJSFile,
isInJSXText,
isInJsonFile,
isInNonReferenceComment,
isInReferenceComment,
isInRightSideOfInternalImportEqualsDeclaration,
isInString,
isInTemplateString,
isInTopLevelContext,
isIncrementalCompilation,
isIndexSignatureDeclaration,
isIndexedAccessTypeNode,
isInferTypeNode,
isInfinityOrNaNString,
isInitializedProperty,
isInitializedVariable,
isInsideJsxElement,
isInsideJsxElementOrAttribute,
isInsideNodeModules,
isInsideTemplateLiteral,
isInstantiatedModule,
isInterfaceDeclaration,
isInternalDeclaration,
isInternalModuleImportEqualsDeclaration,
isInternalName,
isIntersectionTypeNode,
isIntrinsicJsxName,
isIterationStatement,
isJSDoc,
isJSDocAllType,
isJSDocAugmentsTag,
isJSDocAuthorTag,
isJSDocCallbackTag,
isJSDocClassTag,
isJSDocCommentContainingNode,
isJSDocConstructSignature,
isJSDocDeprecatedTag,
isJSDocEnumTag,
isJSDocFunctionType,
isJSDocImplementsTag,
isJSDocIndexSignature,
isJSDocLikeText,
isJSDocLink,
isJSDocLinkCode,
isJSDocLinkLike,
isJSDocLinkPlain,
isJSDocMemberName,
isJSDocNameReference,
isJSDocNamepathType,
isJSDocNamespaceBody,
isJSDocNode,
isJSDocNonNullableType,
isJSDocNullableType,
isJSDocOptionalParameter,
isJSDocOptionalType,
isJSDocOverloadTag,
isJSDocOverrideTag,
isJSDocParameterTag,
isJSDocPrivateTag,
isJSDocPropertyLikeTag,
isJSDocPropertyTag,
isJSDocProtectedTag,
isJSDocPublicTag,
isJSDocReadonlyTag,
isJSDocReturnTag,
isJSDocSatisfiesExpression,
isJSDocSatisfiesTag,
isJSDocSeeTag,
isJSDocSignature,
isJSDocTag,
isJSDocTemplateTag,
isJSDocThisTag,
isJSDocThrowsTag,
isJSDocTypeAlias,
isJSDocTypeAssertion,
isJSDocTypeExpression,
isJSDocTypeLiteral,
isJSDocTypeTag,
isJSDocTypedefTag,
isJSDocUnknownTag,
isJSDocUnknownType,
isJSDocVariadicType,
isJSXTagName,
isJsonEqual,
isJsonSourceFile,
isJsxAttribute,
isJsxAttributeLike,
isJsxAttributeName,
isJsxAttributes,
isJsxChild,
isJsxClosingElement,
isJsxClosingFragment,
isJsxElement,
isJsxExpression,
isJsxFragment,
isJsxNamespacedName,
isJsxOpeningElement,
isJsxOpeningFragment,
isJsxOpeningLikeElement,
isJsxOpeningLikeElementTagName,
isJsxSelfClosingElement,
isJsxSpreadAttribute,
isJsxTagNameExpression,
isJsxText,
isJumpStatementTarget,
isKeyword,
isKeywordOrPunctuation,
isKnownSymbol,
isLabelName,
isLabelOfLabeledStatement,
isLabeledStatement,
isLateVisibilityPaintedStatement,
isLeftHandSideExpression,
isLeftHandSideOfAssignment,
isLet,
isLineBreak,
isLiteralComputedPropertyDeclarationName,
isLiteralExpression,
isLiteralExpressionOfObject,
isLiteralImportTypeNode,
isLiteralKind,
isLiteralLikeAccess,
isLiteralLikeElementAccess,
isLiteralNameOfPropertyDeclarationOrIndexAccess,
isLiteralTypeLikeExpression,
isLiteralTypeLiteral,
isLiteralTypeNode,
isLocalName,
isLogicalOperator,
isLogicalOrCoalescingAssignmentExpression,
isLogicalOrCoalescingAssignmentOperator,
isLogicalOrCoalescingBinaryExpression,
isLogicalOrCoalescingBinaryOperator,
isMappedTypeNode,
isMemberName,
isMetaProperty,
isMethodDeclaration,
isMethodOrAccessor,
isMethodSignature,
isMinusToken,
isMissingDeclaration,
isModifier,
isModifierKind,
isModifierLike,
isModuleAugmentationExternal,
isModuleBlock,
isModuleBody,
isModuleDeclaration,
isModuleExportsAccessExpression,
isModuleIdentifier,
isModuleName,
isModuleOrEnumDeclaration,
isModuleReference,
isModuleSpecifierLike,
isModuleWithStringLiteralName,
isNameOfFunctionDeclaration,
isNameOfModuleDeclaration,
isNamedClassElement,
isNamedDeclaration,
isNamedEvaluation,
isNamedEvaluationSource,
isNamedExportBindings,
isNamedExports,
isNamedImportBindings,
isNamedImports,
isNamedImportsOrExports,
isNamedTupleMember,
isNamespaceBody,
isNamespaceExport,
isNamespaceExportDeclaration,
isNamespaceImport,
isNamespaceReexportDeclaration,
isNewExpression,
isNewExpressionTarget,
isNightly,
isNoSubstitutionTemplateLiteral,
isNode,
isNodeArray,
isNodeArrayMultiLine,
isNodeDescendantOf,
isNodeKind,
isNodeLikeSystem,
isNodeModulesDirectory,
isNodeWithPossibleHoistedDeclaration,
isNonContextualKeyword,
isNonExportDefaultModifier,
isNonGlobalAmbientModule,
isNonGlobalDeclaration,
isNonNullAccess,
isNonNullChain,
isNonNullExpression,
isNonStaticMethodOrAccessorWithPrivateName,
isNotEmittedOrPartiallyEmittedNode,
isNotEmittedStatement,
isNullishCoalesce,
isNumber,
isNumericLiteral,
isNumericLiteralName,
isObjectBindingElementWithoutPropertyName,
isObjectBindingOrAssignmentElement,
isObjectBindingOrAssignmentPattern,
isObjectBindingPattern,
isObjectLiteralElement,
isObjectLiteralElementLike,
isObjectLiteralExpression,
isObjectLiteralMethod,
isObjectLiteralOrClassExpressionMethodOrAccessor,
isObjectTypeDeclaration,
isOctalDigit,
isOmittedExpression,
isOptionalChain,
isOptionalChainRoot,
isOptionalDeclaration,
isOptionalJSDocPropertyLikeTag,
isOptionalTypeNode,
isOuterExpression,
isOutermostOptionalChain,
isOverrideModifier,
isPackedArrayLiteral,
isParameter,
isParameterDeclaration,
isParameterOrCatchClauseVariable,
isParameterPropertyDeclaration,
isParameterPropertyModifier,
isParenthesizedExpression,
isParenthesizedTypeNode,
isParseTreeNode,
isPartOfTypeNode,
isPartOfTypeQuery,
isPartiallyEmittedExpression,
isPatternMatch,
isPinnedComment,
isPlainJsFile,
isPlusToken,
isPossiblyTypeArgumentPosition,
isPostfixUnaryExpression,
isPrefixUnaryExpression,
isPrivateIdentifier,
isPrivateIdentifierClassElementDeclaration,
isPrivateIdentifierPropertyAccessExpression,
isPrivateIdentifierSymbol,
isProgramBundleEmitBuildInfo,
isProgramUptoDate,
isPrologueDirective,
isPropertyAccessChain,
isPropertyAccessEntityNameExpression,
isPropertyAccessExpression,
isPropertyAccessOrQualifiedName,
isPropertyAccessOrQualifiedNameOrImportTypeNode,
isPropertyAssignment,
isPropertyDeclaration,
isPropertyName,
isPropertyNameLiteral,
isPropertySignature,
isProtoSetter,
isPrototypeAccess,
isPrototypePropertyAssignment,
isPunctuation,
isPushOrUnshiftIdentifier,
isQualifiedName,
isQuestionDotToken,
isQuestionOrExclamationToken,
isQuestionOrPlusOrMinusToken,
isQuestionToken,
isRawSourceMap,
isReadonlyKeyword,
isReadonlyKeywordOrPlusOrMinusToken,
isRecognizedTripleSlashComment,
isReferenceFileLocation,
isReferencedFile,
isRegularExpressionLiteral,
isRequireCall,
isRequireVariableStatement,
isRestParameter,
isRestTypeNode,
isReturnStatement,
isReturnStatementWithFixablePromiseHandler,
isRightSideOfAccessExpression,
isRightSideOfPropertyAccess,
isRightSideOfQualifiedName,
isRightSideOfQualifiedNameOrPropertyAccess,
isRightSideOfQualifiedNameOrPropertyAccessOrJSDocMemberName,
isRootedDiskPath,
isSameEntityName,
isSatisfiesExpression,
isScopeMarker,
isSemicolonClassElement,
isSetAccessor,
isSetAccessorDeclaration,
isShebangTrivia,
isShorthandAmbientModuleSymbol,
isShorthandPropertyAssignment,
isSignedNumericLiteral,
isSimpleCopiableExpression,
isSimpleInlineableExpression,
isSingleOrDoubleQuote,
isSourceFile,
isSourceFileFromLibrary,
isSourceFileJS,
isSourceFileNotJS,
isSourceFileNotJson,
isSourceMapping,
isSpecialPropertyDeclaration,
isSpreadAssignment,
isSpreadElement,
isStatement,
isStatementButNotDeclaration,
isStatementOrBlock,
isStatementWithLocals,
isStatic,
isStaticModifier,
isString,
isStringAKeyword,
isStringANonContextualKeyword,
isStringAndEmptyAnonymousObjectIntersection,
isStringDoubleQuoted,
isStringLiteral,
isStringLiteralLike,
isStringLiteralOrJsxExpression,
isStringLiteralOrTemplate,
isStringOrNumericLiteralLike,
isStringOrRegularExpressionOrTemplateLiteral,
isStringTextContainingNode,
isSuperCall,
isSuperKeyword,
isSuperOrSuperProperty,
isSuperProperty,
isSupportedSourceFileName,
isSwitchStatement,
isSyntaxList,
isSyntheticExpression,
isSyntheticReference,
isTagName,
isTaggedTemplateExpression,
isTaggedTemplateTag,
isTemplateExpression,
isTemplateHead,
isTemplateLiteral,
isTemplateLiteralKind,
isTemplateLiteralToken,
isTemplateLiteralTypeNode,
isTemplateLiteralTypeSpan,
isTemplateMiddle,
isTemplateMiddleOrTemplateTail,
isTemplateSpan,
isTemplateTail,
isTextWhiteSpaceLike,
isThis,
isThisContainerOrFunctionBlock,
isThisIdentifier,
isThisInTypeQuery,
isThisInitializedDeclaration,
isThisInitializedObjectBindingExpression,
isThisProperty,
isThisTypeNode,
isThisTypeParameter,
isThisTypePredicate,
isThrowStatement,
isToken,
isTokenKind,
isTraceEnabled,
isTransientSymbol,
isTrivia,
isTryStatement,
isTupleTypeNode,
isTypeAlias,
isTypeAliasDeclaration,
isTypeAssertionExpression,
isTypeDeclaration,
isTypeElement,
isTypeKeyword,
isTypeKeywordToken,
isTypeKeywordTokenOrIdentifier,
isTypeLiteralNode,
isTypeNode,
isTypeNodeKind,
isTypeOfExpression,
isTypeOnlyExportDeclaration,
isTypeOnlyImportDeclaration,
isTypeOnlyImportOrExportDeclaration,
isTypeOperatorNode,
isTypeParameterDeclaration,
isTypePredicateNode,
isTypeQueryNode,
isTypeReferenceNode,
isTypeReferenceType,
isUMDExportSymbol,
isUnaryExpression,
isUnaryExpressionWithWrite,
isUnicodeIdentifierStart,
isUnionTypeNode,
isUnparsedNode,
isUnparsedPrepend,
isUnparsedSource,
isUnparsedTextLike,
isUrl,
isValidBigIntString,
isValidESSymbolDeclaration,
isValidTypeOnlyAliasUseSite,
isValueSignatureDeclaration,
isVarConst,
isVariableDeclaration,
isVariableDeclarationInVariableStatement,
isVariableDeclarationInitializedToBareOrAccessedRequire,
isVariableDeclarationInitializedToRequire,
isVariableDeclarationList,
isVariableLike,
isVariableLikeOrAccessor,
isVariableStatement,
isVoidExpression,
isWatchSet,
isWhileStatement,
isWhiteSpaceLike,
isWhiteSpaceSingleLine,
isWithStatement,
isWriteAccess,
isWriteOnlyAccess,
isYieldExpression,
jsxModeNeedsExplicitImport,
keywordPart,
last,
lastOrUndefined,
length,
libMap,
libs,
lineBreakPart,
linkNamePart,
linkPart,
linkTextPart,
listFiles,
loadModuleFromGlobalCache,
loadWithModeAwareCache,
makeIdentifierFromModuleName,
makeImport,
makeImportIfNecessary,
makeStringLiteral,
mangleScopedPackageName,
map,
mapAllOrFail,
mapDefined,
mapDefinedEntries,
mapDefinedIterator,
mapEntries,
mapIterator,
mapOneOrMany,
mapToDisplayParts,
matchFiles,
matchPatternOrExact,
matchedText,
matchesExclude,
maybeBind,
maybeSetLocalizedDiagnosticMessages,
memoize,
memoizeCached,
memoizeOne,
memoizeWeak,
metadataHelper,
min,
minAndMax,
missingFileModifiedTime,
modifierToFlag,
modifiersToFlags,
moduleOptionDeclaration,
moduleResolutionIsEqualTo,
moduleResolutionNameAndModeGetter,
moduleResolutionOptionDeclarations,
moduleResolutionSupportsPackageJsonExportsAndImports,
moduleResolutionUsesNodeModules,
moduleSpecifiers,
moveEmitHelpers,
moveRangeEnd,
moveRangePastDecorators,
moveRangePastModifiers,
moveRangePos,
moveSyntheticComments,
mutateMap,
mutateMapSkippingNewValues,
needsParentheses,
needsScopeMarker,
newCaseClauseTracker,
newPrivateEnvironment,
noEmitNotification,
noEmitSubstitution,
noTransformers,
noTruncationMaximumTruncationLength,
nodeCanBeDecorated,
nodeHasName,
nodeIsDecorated,
nodeIsMissing,
nodeIsPresent,
nodeIsSynthesized,
nodeModuleNameResolver,
nodeModulesPathPart,
nodeNextJsonConfigResolver,
nodeOrChildIsDecorated,
nodeOverlapsWithStartEnd,
nodePosToString,
nodeSeenTracker,
nodeStartsNewLexicalEnvironment,
nodeToDisplayParts,
noop,
noopFileWatcher,
normalizePath,
normalizeSlashes,
not,
notImplemented,
notImplementedResolver,
nullNodeConverters,
nullParenthesizerRules,
nullTransformationContext,
objectAllocator,
operatorPart,
optionDeclarations,
optionMapToObject,
optionsAffectingProgramStructure,
optionsForBuild,
optionsForWatch,
optionsHaveChanges,
optionsHaveModuleResolutionChanges,
or,
orderedRemoveItem,
orderedRemoveItemAt,
outFile,
packageIdToPackageName,
packageIdToString,
padLeft,
padRight,
paramHelper,
parameterIsThisKeyword,
parameterNamePart,
parseBaseNodeFactory,
parseBigInt,
parseBuildCommand,
parseCommandLine,
parseCommandLineWorker,
parseConfigFileTextToJson,
parseConfigFileWithSystem,
parseConfigHostFromCompilerHostLike,
parseCustomTypeOption,
parseIsolatedEntityName,
parseIsolatedJSDocComment,
parseJSDocTypeExpressionForTests,
parseJsonConfigFileContent,
parseJsonSourceFileConfigFileContent,
parseJsonText,
parseListTypeOption,
parseNodeFactory,
parseNodeModuleFromPath,
parsePackageName,
parsePseudoBigInt,
parseValidBigInt,
patchWriteFileEnsuringDirectory,
pathContainsNodeModules,
pathIsAbsolute,
pathIsBareSpecifier,
pathIsRelative,
patternText,
perfLogger,
performIncrementalCompilation,
performance,
plainJSErrors,
positionBelongsToNode,
positionIsASICandidate,
positionIsSynthesized,
positionsAreOnSameLine,
preProcessFile,
probablyUsesSemicolons,
processCommentPragmas,
processPragmasIntoFields,
processTaggedTemplateExpression,
programContainsEsModules,
programContainsModules,
projectReferenceIsEqualTo,
propKeyHelper,
propertyNamePart,
pseudoBigIntToString,
punctuationPart,
pushIfUnique,
quote,
quotePreferenceFromString,
rangeContainsPosition,
rangeContainsPositionExclusive,
rangeContainsRange,
rangeContainsRangeExclusive,
rangeContainsStartEnd,
rangeEndIsOnSameLineAsRangeStart,
rangeEndPositionsAreOnSameLine,
rangeEquals,
rangeIsOnSingleLine,
rangeOfNode,
rangeOfTypeParameters,
rangeOverlapsWithStartEnd,
rangeStartIsOnSameLineAsRangeEnd,
rangeStartPositionsAreOnSameLine,
readBuilderProgram,
readConfigFile,
readHelper,
readJson,
readJsonConfigFile,
readJsonOrUndefined,
realizeDiagnostics,
reduceEachLeadingCommentRange,
reduceEachTrailingCommentRange,
reduceLeft,
reduceLeftIterator,
reducePathComponents,
refactor,
regExpEscape,
relativeComplement,
removeAllComments,
removeEmitHelper,
removeExtension,
removeFileExtension,
removeIgnoredPath,
removeMinAndVersionNumbers,
removeOptionality,
removePrefix,
removeSuffix,
removeTrailingDirectorySeparator,
repeatString,
replaceElement,
resolutionExtensionIsTSOrJson,
resolveConfigFileProjectName,
resolveJSModule,
resolveLibrary,
resolveModuleName,
resolveModuleNameFromCache,
resolvePackageNameToPackageJson,
resolvePath,
resolveProjectReferencePath,
resolveTripleslashReference,
resolveTypeReferenceDirective,
resolvingEmptyArray,
restHelper,
returnFalse,
returnNoopFileWatcher,
returnTrue,
returnUndefined,
returnsPromise,
runInitializersHelper,
sameFlatMap,
sameMap,
sameMapping,
scanShebangTrivia,
scanTokenAtPosition,
scanner,
screenStartingMessageCodes,
semanticDiagnosticsOptionDeclarations,
serializeCompilerOptions,
server,
servicesVersion,
setCommentRange,
setConfigFileInOptions,
setConstantValue,
setEachParent,
setEmitFlags,
setFunctionNameHelper,
setGetSourceFileAsHashVersioned,
setIdentifierAutoGenerate,
setIdentifierGeneratedImportReference,
setIdentifierTypeArguments,
setInternalEmitFlags,
setLocalizedDiagnosticMessages,
setModuleDefaultHelper,
setNodeFlags,
setObjectAllocator,
setOriginalNode,
setParent,
setParentRecursive,
setPrivateIdentifier,
setResolvedModule,
setResolvedTypeReferenceDirective,
setSnippetElement,
setSourceMapRange,
setStackTraceLimit,
setStartsOnNewLine,
setSyntheticLeadingComments,
setSyntheticTrailingComments,
setSys,
setSysLog,
setTextRange,
setTextRangeEnd,
setTextRangePos,
setTextRangePosEnd,
setTextRangePosWidth,
setTokenSourceMapRange,
setTypeNode,
setUILocale,
setValueDeclaration,
shouldAllowImportingTsExtension,
shouldPreserveConstEnums,
shouldResolveJsRequire,
shouldUseUriStyleNodeCoreModules,
showModuleSpecifier,
signatureHasLiteralTypes,
signatureHasRestParameter,
signatureToDisplayParts,
single,
singleElementArray,
singleIterator,
singleOrMany,
singleOrUndefined,
skipAlias,
skipAssertions,
skipConstraint,
skipOuterExpressions,
skipParentheses,
skipPartiallyEmittedExpressions,
skipTrivia,
skipTypeChecking,
skipTypeParentheses,
skipWhile,
sliceAfter,
some,
sort,
sortAndDeduplicate,
sortAndDeduplicateDiagnostics,
sourceFileAffectingCompilerOptions,
sourceFileMayBeEmitted,
sourceMapCommentRegExp,
sourceMapCommentRegExpDontCareLineStart,
spacePart,
spanMap,
spreadArrayHelper,
stableSort,
startEndContainsRange,
startEndOverlapsWithStartEnd,
startOnNewLine,
startTracing,
startsWith,
startsWithDirectory,
startsWithUnderscore,
startsWithUseStrict,
stringContains,
stringContainsAt,
stringToToken,
stripQuotes,
supportedDeclarationExtensions,
supportedJSExtensions,
supportedJSExtensionsFlat,
supportedLocaleDirectories,
supportedTSExtensions,
supportedTSExtensionsFlat,
supportedTSImplementationExtensions,
suppressLeadingAndTrailingTrivia,
suppressLeadingTrivia,
suppressTrailingTrivia,
symbolEscapedNameNoDefault,
symbolName,
symbolNameNoDefault,
symbolPart,
symbolToDisplayParts,
syntaxMayBeASICandidate,
syntaxRequiresTrailingSemicolonOrASI,
sys,
sysLog,
tagNamesAreEquivalent,
takeWhile,
targetOptionDeclaration,
templateObjectHelper,
testFormatSettings,
textChangeRangeIsUnchanged,
textChangeRangeNewSpan,
textChanges,
textOrKeywordPart,
textPart,
textRangeContainsPositionInclusive,
textSpanContainsPosition,
textSpanContainsTextSpan,
textSpanEnd,
textSpanIntersection,
textSpanIntersectsWith,
textSpanIntersectsWithPosition,
textSpanIntersectsWithTextSpan,
textSpanIsEmpty,
textSpanOverlap,
textSpanOverlapsWith,
textSpansEqual,
textToKeywordObj,
timestamp,
toArray,
toBuilderFileEmit,
toBuilderStateFileInfoForMultiEmit,
toEditorSettings,
toFileNameLowerCase,
toLowerCase,
toPath,
toProgramEmitPending,
tokenIsIdentifierOrKeyword,
tokenIsIdentifierOrKeywordOrGreaterThan,
tokenToString,
trace,
tracing,
tracingEnabled,
transform,
transformClassFields,
transformDeclarations,
transformECMAScriptModule,
transformES2015,
transformES2016,
transformES2017,
transformES2018,
transformES2019,
transformES2020,
transformES2021,
transformES5,
transformESDecorators,
transformESNext,
transformGenerators,
transformJsx,
transformLegacyDecorators,
transformModule,
transformNodeModule,
transformNodes,
transformSystemModule,
transformTypeScript,
transpile,
transpileModule,
transpileOptionValueCompilerOptions,
trimString,
trimStringEnd,
trimStringStart,
tryAddToSet,
tryAndIgnoreErrors,
tryCast,
tryDirectoryExists,
tryExtractTSExtension,
tryFileExists,
tryGetClassExtendingExpressionWithTypeArguments,
tryGetClassImplementingOrExtendingExpressionWithTypeArguments,
tryGetDirectories,
tryGetExtensionFromPath,
tryGetImportFromModuleSpecifier,
tryGetJSDocSatisfiesTypeNode,
tryGetModuleNameFromFile,
tryGetModuleSpecifierFromDeclaration,
tryGetNativePerformanceHooks,
tryGetPropertyAccessOrIdentifierToString,
tryGetPropertyNameOfBindingOrAssignmentElement,
tryGetSourceMappingURL,
tryGetTextOfPropertyName,
tryIOAndConsumeErrors,
tryParsePattern,
tryParsePatterns,
tryParseRawSourceMap,
tryReadDirectory,
tryReadFile,
tryRemoveDirectoryPrefix,
tryRemoveExtension,
tryRemovePrefix,
tryRemoveSuffix,
typeAcquisitionDeclarations,
typeAliasNamePart,
typeDirectiveIsEqualTo,
typeKeywords,
typeParameterNamePart,
typeReferenceResolutionNameAndModeGetter,
typeToDisplayParts,
unchangedPollThresholds,
unchangedTextChangeRange,
unescapeLeadingUnderscores,
unmangleScopedPackageName,
unorderedRemoveItem,
unorderedRemoveItemAt,
unreachableCodeIsError,
unusedLabelIsError,
unwrapInnermostStatementOfLabel,
updateErrorForNoInputFiles,
updateLanguageServiceSourceFile,
updateMissingFilePathsWatch,
updatePackageJsonWatch,
updateResolutionField,
updateSharedExtendedConfigFileWatcher,
updateSourceFile,
updateWatchingWildcardDirectories,
usesExtensionsOnImports,
usingSingleLineStringWriter,
utf16EncodeAsString,
validateLocaleAndSetLanguage,
valuesHelper,
version,
versionMajorMinor,
visitArray,
visitCommaListElements,
visitEachChild,
visitFunctionBody,
visitIterationBody,
visitLexicalEnvironment,
visitNode,
visitNodes,
visitParameterList,
walkUpBindingElementsAndPatterns,
walkUpLexicalEnvironments,
walkUpOuterExpressions,
walkUpParenthesizedExpressions,
walkUpParenthesizedTypes,
walkUpParenthesizedTypesAndGetParentAndChild,
whitespaceOrMapCommentRegExp,
writeCommentRange,
writeFile,
writeFileEnsuringDirectories,
zipToModeAwareCache,
zipWith
});
//# sourceMappingURL=tsserver.js.map