Skip to content

Commit 72b8b85

Browse files
committed
Create kotlin sub class: run write action manually to avoid AWT events inside
1 parent 9664a06 commit 72b8b85

File tree

1 file changed

+23
-13
lines changed

1 file changed

+23
-13
lines changed

idea/src/org/jetbrains/kotlin/idea/intentions/CreateKotlinSubClassIntention.kt

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.idea.core.KotlinNameSuggester
3333
import org.jetbrains.kotlin.idea.core.ShortenReferences
3434
import org.jetbrains.kotlin.idea.core.overrideImplement.ImplementMembersHandler
3535
import org.jetbrains.kotlin.idea.refactoring.getOrCreateKotlinFile
36+
import org.jetbrains.kotlin.idea.util.application.runWriteAction
3637
import org.jetbrains.kotlin.lexer.KtTokens
3738
import org.jetbrains.kotlin.psi.*
3839
import org.jetbrains.kotlin.psi.KtPsiFactory.ClassHeaderBuilder
@@ -78,6 +79,8 @@ class CreateKotlinSubClassIntention : SelfTargetingRangeIntention<KtClass>(KtCla
7879
else /* open class */ -> "Create subclass"
7980
}
8081

82+
override fun startInWriteAction() = false
83+
8184
override fun applyTo(element: KtClass, editor: Editor?) {
8285
if (editor == null) throw IllegalArgumentException("This intention requires an editor")
8386

@@ -100,10 +103,12 @@ class CreateKotlinSubClassIntention : SelfTargetingRangeIntention<KtClass>(KtCla
100103

101104
private fun createSealedSubclass(sealedClass: KtClass, sealedName: String, editor: Editor) {
102105
val project = sealedClass.project
103-
val builder = buildClassHeader(targetNameWithoutConflicts(sealedName, sealedClass), sealedClass, sealedName)
104-
val classFromText = KtPsiFactory(project).createClass(builder.asString())
105-
val body = sealedClass.getOrCreateBody()
106-
val klass = body.addBefore(classFromText, body.rBrace) as KtClass
106+
val klass = runWriteAction {
107+
val builder = buildClassHeader(targetNameWithoutConflicts(sealedName, sealedClass), sealedClass, sealedName)
108+
val classFromText = KtPsiFactory(project).createClass(builder.asString())
109+
val body = sealedClass.getOrCreateBody()
110+
body.addBefore(classFromText, body.rBrace) as KtClass
111+
}
107112
runInteractiveRename(klass, project, sealedClass, editor)
108113
chooseAndImplementMethods(project, klass, editor)
109114
}
@@ -134,18 +139,23 @@ class CreateKotlinSubClassIntention : SelfTargetingRangeIntention<KtClass>(KtCla
134139
if (container.containingClassOrObject == null && !ApplicationManager.getApplication().isUnitTestMode) {
135140
val dlg = chooseSubclassToCreate(baseClass, baseName) ?: return
136141
val targetName = dlg.className
137-
val file = getOrCreateKotlinFile("$targetName.kt", dlg.targetDirectory)!!
138-
val builder = buildClassHeader(targetName, baseClass, baseClass.fqName!!.asString())
139-
file.add(factory.createClass(builder.asString()))
140-
val klass = file.getChildOfType<KtClass>()!!
141-
ShortenReferences.DEFAULT.process(klass)
142+
val (file, klass) = runWriteAction {
143+
val file = getOrCreateKotlinFile("$targetName.kt", dlg.targetDirectory)!!
144+
val builder = buildClassHeader(targetName, baseClass, baseClass.fqName!!.asString())
145+
file.add(factory.createClass(builder.asString()))
146+
val klass = file.getChildOfType<KtClass>()!!
147+
ShortenReferences.DEFAULT.process(klass)
148+
file to klass
149+
}
142150
chooseAndImplementMethods(project, klass, CodeInsightUtil.positionCursor(project, file, klass) ?: editor)
143151
}
144152
else {
145-
val builder = buildClassHeader(targetNameWithoutConflicts(baseName, baseClass.containingClassOrObject),
146-
baseClass, name, visibility)
147-
val classFromText = factory.createClass(builder.asString())
148-
val klass = container.parent.addAfter(classFromText, container) as KtClass
153+
val klass = runWriteAction {
154+
val builder = buildClassHeader(targetNameWithoutConflicts(baseName, baseClass.containingClassOrObject),
155+
baseClass, name, visibility)
156+
val classFromText = factory.createClass(builder.asString())
157+
container.parent.addAfter(classFromText, container) as KtClass
158+
}
149159
runInteractiveRename(klass, project, container, editor)
150160
chooseAndImplementMethods(project, klass, editor)
151161
}

0 commit comments

Comments
 (0)