Minor: Allow running member generation actions without editor
This commit is contained in:
@@ -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 <T : JetDeclaration> insertMembersAfter(
|
||||
editor: Editor,
|
||||
editor: Editor?,
|
||||
classOrObject: JetClassOrObject,
|
||||
members: Collection<T>,
|
||||
anchor: PsiElement? = null
|
||||
@@ -161,7 +162,9 @@ public fun <T : JetDeclaration> insertMembersAfter(
|
||||
|
||||
ShortenReferences.DEFAULT.process(insertedMembers)
|
||||
|
||||
moveCaretIntoGeneratedElement(editor, insertedMembers.first())
|
||||
if (editor != null) {
|
||||
moveCaretIntoGeneratedElement(editor, insertedMembers.first())
|
||||
}
|
||||
|
||||
insertedMembers
|
||||
}
|
||||
|
||||
+2
-2
@@ -125,7 +125,7 @@ class KotlinGenerateEqualsAndHashcodeAction : KotlinGenerateMemberActionBase<Kot
|
||||
Messages.getQuestionIcon()) == Messages.YES
|
||||
}
|
||||
|
||||
override fun prepareMembersInfo(klass: JetClassOrObject, project: Project, editor: Editor): Info? {
|
||||
override fun prepareMembersInfo(klass: JetClassOrObject, project: Project, editor: Editor?): Info? {
|
||||
if (klass !is JetClass) throw AssertionError("Not a class: ${klass.getElementTextWithContext()}")
|
||||
|
||||
val context = klass.analyzeFully()
|
||||
@@ -273,7 +273,7 @@ class KotlinGenerateEqualsAndHashcodeAction : KotlinGenerateMemberActionBase<Kot
|
||||
}
|
||||
}
|
||||
|
||||
override fun generateMembers(project: Project, editor: Editor, info: Info): List<JetDeclaration> {
|
||||
override fun generateMembers(project: Project, editor: Editor?, info: Info): List<JetDeclaration> {
|
||||
val targetClass = info.classDescriptor.source.getPsi() as JetClass
|
||||
val prototypes = ArrayList<JetDeclaration>(2)
|
||||
.apply {
|
||||
|
||||
+11
-5
@@ -28,20 +28,26 @@ import org.jetbrains.kotlin.psi.JetClassOrObject
|
||||
import org.jetbrains.kotlin.psi.JetDeclaration
|
||||
|
||||
abstract class KotlinGenerateMemberActionBase<Info : Any> : 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<JetDeclaration>
|
||||
protected abstract fun generateMembers(project: Project, editor: Editor?, info: Info): List<JetDeclaration>
|
||||
|
||||
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) }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -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<JetDeclaration> {
|
||||
override fun generateMembers(project: Project, editor: Editor?, info: Info): List<JetDeclaration> {
|
||||
val targetClass = info.classDescriptor.source.getPsi() as? JetClass ?: return emptyList()
|
||||
|
||||
fun Info.findAnchor(): PsiElement? {
|
||||
|
||||
Reference in New Issue
Block a user