• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/* @internal */
2namespace ts.codefix {
3    const fixId = "fixMissingCallParentheses";
4    const errorCodes = [
5        Diagnostics.This_condition_will_always_return_true_since_the_function_is_always_defined_Did_you_mean_to_call_it_instead.code,
6    ];
7
8    registerCodeFix({
9        errorCodes,
10        fixIds: [fixId],
11        getCodeActions(context) {
12            const { sourceFile, span } = context;
13            const callName = getCallName(sourceFile, span.start);
14            if (!callName) return;
15
16            const changes = textChanges.ChangeTracker.with(context, t => doChange(t, context.sourceFile, callName));
17            return [createCodeFixAction(fixId, changes, Diagnostics.Add_missing_call_parentheses, fixId, Diagnostics.Add_all_missing_call_parentheses)];
18        },
19        getAllCodeActions: context => codeFixAll(context, errorCodes, (changes, diag) => {
20            const callName = getCallName(diag.file, diag.start);
21            if (callName) doChange(changes, diag.file, callName);
22        })
23    });
24
25    function doChange(changes: textChanges.ChangeTracker, sourceFile: SourceFile, name: Identifier | PrivateIdentifier): void {
26        changes.replaceNodeWithText(sourceFile, name, `${ name.text }()`);
27    }
28
29    function getCallName(sourceFile: SourceFile, start: number): Identifier | PrivateIdentifier | undefined {
30        const token = getTokenAtPosition(sourceFile, start);
31        if (isPropertyAccessExpression(token.parent)) {
32            let current: PropertyAccessExpression = token.parent;
33            while (isPropertyAccessExpression(current.parent)) {
34                current = current.parent;
35            }
36            return current.name;
37        }
38
39        if (isIdentifier(token)) {
40            return token;
41        }
42
43        return undefined;
44    }
45}
46