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