diff --git a/src/services/refactors/convertToNamedParameters.ts b/src/services/refactors/convertToNamedParameters.ts index 0b5d3d265ff..aa3bf14a137 100644 --- a/src/services/refactors/convertToNamedParameters.ts +++ b/src/services/refactors/convertToNamedParameters.ts @@ -5,7 +5,6 @@ namespace ts.refactor.convertToNamedParameters { const actionNameNamedParameters = "Convert to named parameters"; const actionDescriptionNamedParameters = "Convert to named parameters"; const minimumParameterLength = 3; - const paramTypeNamePostfix = "Param"; registerRefactor(refactorName, { getEditsForAction, getAvailableActions }); @@ -30,15 +29,15 @@ namespace ts.refactor.convertToNamedParameters { const func = getFunctionDeclarationAtPosition(file, startPosition); if (!func) return undefined; - const paramTypeDeclaration = createParamTypeDeclaration(func); - const edits = textChanges.ChangeTracker.with(context, t => t.replaceNode(file, func, paramTypeDeclaration)); - // return undefined; + const newParamDeclaration = createObjectParameter(func); + const edits = textChanges.ChangeTracker.with(context, t => t.replaceNodeRangeWithNodes(file, first(func.parameters), last(func.parameters), createNodeArray([newParamDeclaration]))); return { renameFilename: undefined, renameLocation: undefined, edits }; } function getFunctionDeclarationAtPosition(file: SourceFile, startPosition: number): ValidFunctionDeclaration | undefined { const node = getTokenAtPosition(file, startPosition); const func = getContainingFunction(node); + // TODO: check range if (!func || !isValidFunctionDeclaration(func)) return undefined; return func; } @@ -62,21 +61,9 @@ namespace ts.refactor.convertToNamedParameters { return !paramDecl.modifiers && !paramDecl.dotDotDotToken && isIdentifier(paramDecl.name) && !paramDecl.initializer; } - function createParamTypeDeclaration(func: ValidFunctionDeclaration): InterfaceDeclaration { - const paramTypeName = getFunctionName(func); - const paramTypeMembers = ts.map(func.parameters, createPropertySignatureFromParameterDeclaration); - - return createInterfaceDeclaration( - /* decorators */ undefined, - /* modifiers */ undefined, - createIdentifier(paramTypeName), - func.typeParameters, - /* heritageClauses */ undefined, - createNodeArray(paramTypeMembers)); - } - - function getFunctionName(func: ValidFunctionDeclaration): string { - return declarationNameToString(func.name) + paramTypeNamePostfix; + function createParamTypeNode(func: ValidFunctionDeclaration): TypeLiteralNode { + const members = ts.map(func.parameters, createPropertySignatureFromParameterDeclaration); + return createTypeLiteralNode(members); } function createPropertySignatureFromParameterDeclaration(paramDeclaration: ValidParameterDeclaration): PropertySignature { @@ -88,9 +75,10 @@ namespace ts.refactor.convertToNamedParameters { paramDeclaration.initializer); } - function createParameterObjectBindingPattern(parameters: NodeArray, paramType: TypeNode): ParameterDeclaration { - const bindingElements = ts.map(parameters, param => createBindingElement(/* dotDotDotToken */ undefined, /* propertyName */ undefined, param.name)); + function createObjectParameter(func: ValidFunctionDeclaration): ParameterDeclaration { + const bindingElements = ts.map(func.parameters, param => createBindingElement(/* dotDotDotToken */ undefined, /* propertyName */ undefined, param.name)); const paramName = createObjectBindingPattern(bindingElements); + const paramType = createParamTypeNode(func); return createParameter( /* decorators */ undefined,