• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/* @internal */
2namespace ts.codefix {
3    const fixId = "addMissingNewOperator";
4    const errorCodes = [Diagnostics.Value_of_type_0_is_not_callable_Did_you_mean_to_include_new.code];
5    registerCodeFix({
6        errorCodes,
7        getCodeActions(context) {
8            const { sourceFile, span } = context;
9            const changes = textChanges.ChangeTracker.with(context, t => addMissingNewOperator(t, sourceFile, span));
10            return [createCodeFixAction(fixId, changes, Diagnostics.Add_missing_new_operator_to_call, fixId, Diagnostics.Add_missing_new_operator_to_all_calls)];
11        },
12        fixIds: [fixId],
13        getAllCodeActions: context => codeFixAll(context, errorCodes, (changes, diag) =>
14            addMissingNewOperator(changes, context.sourceFile, diag)),
15    });
16
17    function addMissingNewOperator(changes: textChanges.ChangeTracker, sourceFile: SourceFile, span: TextSpan): void {
18        const call = cast(findAncestorMatchingSpan(sourceFile, span), isCallExpression);
19        const newExpression = factory.createNewExpression(call.expression, call.typeArguments, call.arguments);
20
21        changes.replaceNode(sourceFile, call, newExpression);
22    }
23
24    function findAncestorMatchingSpan(sourceFile: SourceFile, span: TextSpan): Node {
25        let token = getTokenAtPosition(sourceFile, span.start);
26        const end = textSpanEnd(span);
27        while (token.end < end) {
28            token = token.parent;
29        }
30        return token;
31    }
32}
33