• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/* @internal */
2namespace ts.codefix {
3    const fixId = "addNameToNamelessParameter";
4    const errorCodes = [Diagnostics.Parameter_has_a_name_but_no_type_Did_you_mean_0_Colon_1.code];
5    registerCodeFix({
6        errorCodes,
7        getCodeActions: function getCodeActionsToAddNameToNamelessParameter(context) {
8            const changes = textChanges.ChangeTracker.with(context, t => makeChange(t, context.sourceFile, context.span.start));
9            return [createCodeFixAction(fixId, changes, Diagnostics.Add_parameter_name, fixId, Diagnostics.Add_names_to_all_parameters_without_names)];
10        },
11        fixIds: [fixId],
12        getAllCodeActions: context => codeFixAll(context, errorCodes, (changes, diag) => makeChange(changes, diag.file, diag.start)),
13    });
14
15    function makeChange(changeTracker: textChanges.ChangeTracker, sourceFile: SourceFile, pos: number) {
16        const token = getTokenAtPosition(sourceFile, pos);
17        const param = token.parent;
18        if (!isParameter(param)) {
19            return Debug.fail("Tried to add a parameter name to a non-parameter: " + Debug.formatSyntaxKind(token.kind));
20        }
21
22        const i = param.parent.parameters.indexOf(param);
23        Debug.assert(!param.type, "Tried to add a parameter name to a parameter that already had one.");
24        Debug.assert(i > -1, "Parameter not found in parent parameter list.");
25
26        const typeNode = factory.createTypeReferenceNode(param.name as Identifier, /*typeArguments*/ undefined);
27        const replacement = factory.createParameterDeclaration(
28            param.modifiers,
29            param.dotDotDotToken,
30            "arg" + i,
31            param.questionToken,
32            param.dotDotDotToken ? factory.createArrayTypeNode(typeNode) : typeNode,
33            param.initializer);
34        changeTracker.replaceNode(sourceFile, param, replacement);
35    }
36}
37