From 127cb366026570a86cbaac65f9b313a7a19f3a9f Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Thu, 15 Oct 2015 12:24:30 +0300 Subject: [PATCH] Minor: Allow running member generation actions without editor --- .../kotlin/idea/quickfix/generateUtil.kt | 11 +++++++---- .../KotlinGenerateEqualsAndHashcodeAction.kt | 4 ++-- .../generate/KotlinGenerateMemberActionBase.kt | 16 +++++++++++----- .../KotlinGenerateSecondaryConstructorAction.kt | 4 ++-- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/quickfix/generateUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/quickfix/generateUtil.kt index 3da13c6070e..12a05139f8c 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/quickfix/generateUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/quickfix/generateUtil.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.idea.util.ShortenReferences import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.siblings +import org.jetbrains.kotlin.psi.psiUtil.startOffset import org.jetbrains.kotlin.utils.ifEmpty public fun moveCaretIntoGeneratedElement(editor: Editor, element: PsiElement) { @@ -100,10 +101,10 @@ public fun Editor.moveCaret(offset: Int, scrollType: ScrollType = ScrollType.REL getScrollingModel().scrollToCaret(scrollType) } -private fun findInsertAfterAnchor(editor: Editor, body: JetClassBody): PsiElement? { +private fun findInsertAfterAnchor(editor: Editor?, body: JetClassBody): PsiElement? { val afterAnchor = body.lBrace ?: return null - val offset = editor.caretModel.offset + val offset = editor?.caretModel?.offset ?: body.startOffset val offsetCursorElement = PsiTreeUtil.findFirstParent(body.containingFile.findElementAt(offset)) { it.parent == body } @@ -143,7 +144,7 @@ private fun removeAfterOffset(offset: Int, whiteSpace: PsiWhiteSpace): PsiElemen } public fun insertMembersAfter( - editor: Editor, + editor: Editor?, classOrObject: JetClassOrObject, members: Collection, anchor: PsiElement? = null @@ -161,7 +162,9 @@ public fun insertMembersAfter( ShortenReferences.DEFAULT.process(insertedMembers) - moveCaretIntoGeneratedElement(editor, insertedMembers.first()) + if (editor != null) { + moveCaretIntoGeneratedElement(editor, insertedMembers.first()) + } insertedMembers } diff --git a/idea/src/org/jetbrains/kotlin/idea/actions/generate/KotlinGenerateEqualsAndHashcodeAction.kt b/idea/src/org/jetbrains/kotlin/idea/actions/generate/KotlinGenerateEqualsAndHashcodeAction.kt index 3b47c3df178..239aabbf7f1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/actions/generate/KotlinGenerateEqualsAndHashcodeAction.kt +++ b/idea/src/org/jetbrains/kotlin/idea/actions/generate/KotlinGenerateEqualsAndHashcodeAction.kt @@ -125,7 +125,7 @@ class KotlinGenerateEqualsAndHashcodeAction : KotlinGenerateMemberActionBase { + override fun generateMembers(project: Project, editor: Editor?, info: Info): List { val targetClass = info.classDescriptor.source.getPsi() as JetClass val prototypes = ArrayList(2) .apply { diff --git a/idea/src/org/jetbrains/kotlin/idea/actions/generate/KotlinGenerateMemberActionBase.kt b/idea/src/org/jetbrains/kotlin/idea/actions/generate/KotlinGenerateMemberActionBase.kt index 5e607448729..8ac603e22c6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/actions/generate/KotlinGenerateMemberActionBase.kt +++ b/idea/src/org/jetbrains/kotlin/idea/actions/generate/KotlinGenerateMemberActionBase.kt @@ -28,20 +28,26 @@ import org.jetbrains.kotlin.psi.JetClassOrObject import org.jetbrains.kotlin.psi.JetDeclaration abstract class KotlinGenerateMemberActionBase : KotlinGenerateActionBase() { - protected abstract fun prepareMembersInfo(klass: JetClassOrObject, project: Project, editor: Editor): Info? + protected abstract fun prepareMembersInfo(klass: JetClassOrObject, project: Project, editor: Editor?): Info? - protected abstract fun generateMembers(project: Project, editor: Editor, info: Info): List + protected abstract fun generateMembers(project: Project, editor: Editor?, info: Info): List override fun invoke(project: Project, editor: Editor, file: PsiFile) { if (!CodeInsightUtilBase.prepareEditorForWrite(editor)) return if (!FileDocumentManager.getInstance().requestWriting(editor.document, project)) return - val klass = getTargetClass(editor, file) ?: return - val membersInfo = prepareMembersInfo(klass, project, editor) ?: return + val targetClass = getTargetClass(editor, file) ?: return + doInvoke(project, editor, targetClass) + } + + fun doInvoke(project: Project, editor: Editor?, targetClass: JetClassOrObject) { + val membersInfo = prepareMembersInfo(targetClass, project, editor) ?: return project.executeWriteCommand(commandName, this) { val newMembers = generateMembers(project, editor, membersInfo) GlobalInspectionContextBase.cleanupElements(project, null, *newMembers.toTypedArray()) - newMembers.firstOrNull()?.let { GenerateMembersUtil.positionCaret(editor, it, false) } + if (editor != null) { + newMembers.firstOrNull()?.let { GenerateMembersUtil.positionCaret(editor, it, false) } + } } } } diff --git a/idea/src/org/jetbrains/kotlin/idea/actions/generate/KotlinGenerateSecondaryConstructorAction.kt b/idea/src/org/jetbrains/kotlin/idea/actions/generate/KotlinGenerateSecondaryConstructorAction.kt index c39f76ee03c..55a39e8514a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/actions/generate/KotlinGenerateSecondaryConstructorAction.kt +++ b/idea/src/org/jetbrains/kotlin/idea/actions/generate/KotlinGenerateSecondaryConstructorAction.kt @@ -100,7 +100,7 @@ class KotlinGenerateSecondaryConstructorAction : KotlinGenerateMemberActionBase< } } - override fun prepareMembersInfo(klass: JetClassOrObject, project: Project, editor: Editor): Info? { + override fun prepareMembersInfo(klass: JetClassOrObject, project: Project, editor: Editor?): Info? { val context = klass.analyzeFully() val classDescriptor = context.get(BindingContext.CLASS, klass) ?: return null val superConstructors = chooseSuperConstructors(klass, classDescriptor).map { it.descriptor as ConstructorDescriptor } @@ -108,7 +108,7 @@ class KotlinGenerateSecondaryConstructorAction : KotlinGenerateMemberActionBase< return Info(propertiesToInitialize, superConstructors, classDescriptor) } - override fun generateMembers(project: Project, editor: Editor, info: Info): List { + override fun generateMembers(project: Project, editor: Editor?, info: Info): List { val targetClass = info.classDescriptor.source.getPsi() as? JetClass ?: return emptyList() fun Info.findAnchor(): PsiElement? {