implement new parameter creation

This commit is contained in:
Gabriela Britto 2019-01-16 16:32:32 -08:00
parent 705ac60a59
commit 23fc65a60c

View File

@ -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<ValidParameterDeclaration>, 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,