• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/* @internal */
2namespace ts.refactor.generateGetAccessorAndSetAccessor {
3    const actionName = "Generate 'get' and 'set' accessors";
4    const actionDescription = Diagnostics.Generate_get_and_set_accessors.message;
5
6    const generateGetSetAction = {
7        name: actionName,
8        description: actionDescription,
9        kind: "refactor.rewrite.property.generateAccessors",
10    };
11    registerRefactor(actionName, {
12        kinds: [generateGetSetAction.kind],
13        getEditsForAction: function getRefactorActionsToGenerateGetAndSetAccessors(context, actionName) {
14            if (!context.endPosition) return undefined;
15            const info = codefix.getAccessorConvertiblePropertyAtPosition(context.file, context.program, context.startPosition, context.endPosition);
16            Debug.assert(info && !isRefactorErrorInfo(info), "Expected applicable refactor info");
17            const edits = codefix.generateAccessorFromProperty(context.file, context.program, context.startPosition, context.endPosition, context, actionName);
18            if (!edits) return undefined;
19
20            const renameFilename = context.file.fileName;
21            const nameNeedRename = info.renameAccessor ? info.accessorName : info.fieldName;
22            const renameLocationOffset = isIdentifier(nameNeedRename) ? 0 : -1;
23            const renameLocation = renameLocationOffset + getRenameLocation(edits, renameFilename, nameNeedRename.text, /*preferLastLocation*/ isParameter(info.declaration));
24
25            return { renameFilename, renameLocation, edits };
26        },
27        getAvailableActions(context: RefactorContext): readonly ApplicableRefactorInfo[] {
28            if (!context.endPosition) return emptyArray;
29            const info = codefix.getAccessorConvertiblePropertyAtPosition(context.file, context.program, context.startPosition, context.endPosition, context.triggerReason === "invoked");
30            if (!info) return emptyArray;
31
32            if (!isRefactorErrorInfo(info)) {
33                return [{
34                    name: actionName,
35                    description: actionDescription,
36                    actions: [generateGetSetAction],
37                }];
38            }
39
40            if (context.preferences.provideRefactorNotApplicableReason) {
41                return [{
42                    name: actionName,
43                    description: actionDescription,
44                    actions: [{ ...generateGetSetAction, notApplicableReason: info.error }],
45                }];
46            }
47
48            return emptyArray;
49        }
50    });
51}
52