mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-24 11:43:18 -05:00
fix(38177): add auto-import for missing argument type in new functions/methods (#38213)
This commit is contained in:
@@ -226,18 +226,8 @@ namespace ts.codefix {
|
||||
const scriptTarget = getEmitScriptTarget(context.program.getCompilerOptions());
|
||||
const checker = context.program.getTypeChecker();
|
||||
const tracker = getNoopSymbolTrackerWithResolver(context);
|
||||
const types = map(args, arg => {
|
||||
const type = checker.getBaseTypeOfLiteralType(checker.getTypeAtLocation(arg));
|
||||
const typeNode = checker.typeToTypeNode(type, contextNode, /*flags*/ undefined, tracker);
|
||||
if (typeNode?.kind === SyntaxKind.ImportType) {
|
||||
const importableReference = tryGetAutoImportableReferenceFromImportTypeNode(typeNode, type, scriptTarget);
|
||||
if (importableReference) {
|
||||
importSymbols(importAdder, importableReference.symbols);
|
||||
return importableReference.typeReference;
|
||||
}
|
||||
}
|
||||
return typeNode;
|
||||
});
|
||||
const types = map(args, arg =>
|
||||
typeToAutoImportableTypeNode(checker, importAdder, checker.getBaseTypeOfLiteralType(checker.getTypeAtLocation(arg)), contextNode, scriptTarget, /*flags*/ undefined, tracker));
|
||||
const names = map(args, arg =>
|
||||
isIdentifier(arg) ? arg.text : isPropertyAccessExpression(arg) && isIdentifier(arg.name) ? arg.name.text : undefined);
|
||||
const contextualType = checker.getContextualType(call);
|
||||
@@ -255,6 +245,18 @@ namespace ts.codefix {
|
||||
body ? createStubbedMethodBody(context.preferences) : undefined);
|
||||
}
|
||||
|
||||
export function typeToAutoImportableTypeNode(checker: TypeChecker, importAdder: ImportAdder, type: Type, contextNode: Node, scriptTarget: ScriptTarget, flags?: NodeBuilderFlags, tracker?: SymbolTracker): TypeNode | undefined {
|
||||
const typeNode = checker.typeToTypeNode(type, contextNode, flags, tracker);
|
||||
if (typeNode && isImportTypeNode(typeNode)) {
|
||||
const importableReference = tryGetAutoImportableReferenceFromImportTypeNode(typeNode, type, scriptTarget);
|
||||
if (importableReference) {
|
||||
importSymbols(importAdder, importableReference.symbols);
|
||||
return importableReference.typeReference;
|
||||
}
|
||||
}
|
||||
return typeNode;
|
||||
}
|
||||
|
||||
function createDummyParameters(argCount: number, names: (string | undefined)[] | undefined, types: (TypeNode | undefined)[] | undefined, minArgumentCount: number | undefined, inJs: boolean): ParameterDeclaration[] {
|
||||
const parameters: ParameterDeclaration[] = [];
|
||||
for (let i = 0; i < argCount; i++) {
|
||||
@@ -456,7 +458,7 @@ namespace ts.codefix {
|
||||
return createQualifiedName(replaceFirstIdentifierOfEntityName(name.left, newIdentifier), name.right);
|
||||
}
|
||||
|
||||
function importSymbols(importAdder: ImportAdder, symbols: readonly Symbol[]) {
|
||||
export function importSymbols(importAdder: ImportAdder, symbols: readonly Symbol[]) {
|
||||
symbols.forEach(s => importAdder.addImportFromExportedSymbol(s, /*usageIsTypeOnly*/ true));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -719,6 +719,8 @@ namespace ts.refactor.extractSymbol {
|
||||
context: RefactorContext): RefactorEditInfo {
|
||||
|
||||
const checker = context.program.getTypeChecker();
|
||||
const scriptTarget = getEmitScriptTarget(context.program.getCompilerOptions());
|
||||
const importAdder = codefix.createImportAdder(context.file, context.program, context.preferences, context.host);
|
||||
|
||||
// Make a unique name for the extracted function
|
||||
const file = scope.getSourceFile();
|
||||
@@ -737,7 +739,7 @@ namespace ts.refactor.extractSymbol {
|
||||
let type = checker.getTypeOfSymbolAtLocation(usage.symbol, usage.node);
|
||||
// Widen the type so we don't emit nonsense annotations like "function fn(x: 3) {"
|
||||
type = checker.getBaseTypeOfLiteralType(type);
|
||||
typeNode = checker.typeToTypeNode(type, scope, NodeBuilderFlags.NoTruncation);
|
||||
typeNode = codefix.typeToAutoImportableTypeNode(checker, importAdder, type, scope, scriptTarget, NodeBuilderFlags.NoTruncation);
|
||||
}
|
||||
|
||||
const paramDecl = createParameter(
|
||||
@@ -823,6 +825,7 @@ namespace ts.refactor.extractSymbol {
|
||||
else {
|
||||
changeTracker.insertNodeAtEndOfScope(context.file, scope, newFunction);
|
||||
}
|
||||
importAdder.writeFixes(changeTracker);
|
||||
|
||||
const newNodes: Node[] = [];
|
||||
// replace range with function call
|
||||
|
||||
Reference in New Issue
Block a user