FIR IDE: Move write actions out of analyze block
This commit is contained in:
committed by
TeamCityServer
parent
e56b39bbd8
commit
417c841f77
+7
-10
@@ -41,9 +41,10 @@ internal abstract class KtGenerateMembersHandler : AbstractGenerateMembersHandle
|
||||
) {
|
||||
// Using hackyAllowRunningOnEdt here because we don't want to pre-populate all possible textual overrides before user selection.
|
||||
val (commands, insertedBlocks) = hackyAllowRunningOnEdt {
|
||||
val insertedBlocks = analyse(classOrObject) {
|
||||
val entryMembers = analyse(classOrObject) {
|
||||
this.generateMembers(editor, classOrObject, selectedElements, copyDoc)
|
||||
}
|
||||
val insertedBlocks = insertMembersAccordingToPreferredOrder(entryMembers, editor, classOrObject)
|
||||
// Reference shortening is done in a separate analysis session because the session need to be aware of the newly generated
|
||||
// members.
|
||||
val commands = analyse(classOrObject) {
|
||||
@@ -81,7 +82,7 @@ internal abstract class KtGenerateMembersHandler : AbstractGenerateMembersHandle
|
||||
currentClass: KtClassOrObject,
|
||||
selectedElements: Collection<KtClassMember>,
|
||||
copyDoc: Boolean
|
||||
): List<InsertedBlock> {
|
||||
): List<MemberEntry> {
|
||||
if (selectedElements.isEmpty()) return emptyList()
|
||||
val selectedMemberSymbolsAndGeneratedPsi: Map<KtCallableSymbol, KtCallableDeclaration> = selectedElements.associate {
|
||||
it.symbol to generateMember(currentClass.project, it, currentClass, copyDoc)
|
||||
@@ -93,14 +94,11 @@ internal abstract class KtGenerateMembersHandler : AbstractGenerateMembersHandle
|
||||
// Insert members at the cursor position if the cursor is within the class body. Or, if there is no body, generate the body and put
|
||||
// stuff in it.
|
||||
if (classBody == null || isCursorInsideClassBodyExcludingBraces(classBody, offset)) {
|
||||
return runWriteAction {
|
||||
listOf(InsertedBlock(insertMembersAfter(editor, currentClass, selectedMemberSymbolsAndGeneratedPsi.values)))
|
||||
}
|
||||
return selectedMemberSymbolsAndGeneratedPsi.values.map { MemberEntry.NewEntry(it) }
|
||||
}
|
||||
|
||||
// Insert members at positions such that the result aligns with ordering of members in super types.
|
||||
val orderedMembers = getMembersOrderedByRelativePositionsInSuperTypes(currentClass, selectedMemberSymbolsAndGeneratedPsi)
|
||||
return insertMembersAccordingToPreferredOrder(orderedMembers, classBody.lBrace, editor, currentClass)
|
||||
return getMembersOrderedByRelativePositionsInSuperTypes(currentClass, selectedMemberSymbolsAndGeneratedPsi)
|
||||
}
|
||||
|
||||
private fun isCursorInsideClassBodyExcludingBraces(classBody: KtClassBody, offset: Int): Boolean {
|
||||
@@ -222,16 +220,15 @@ internal abstract class KtGenerateMembersHandler : AbstractGenerateMembersHandle
|
||||
@OptIn(ExperimentalStdlibApi::class)
|
||||
private fun insertMembersAccordingToPreferredOrder(
|
||||
symbolsInPreferredOrder: List<MemberEntry>,
|
||||
classLeftBrace: PsiElement?,
|
||||
editor: Editor,
|
||||
currentClass: KtClassOrObject
|
||||
): List<InsertedBlock> {
|
||||
require(symbolsInPreferredOrder.isNotEmpty()) { "symbolsInPreferredOrder must not be empty" }
|
||||
if (symbolsInPreferredOrder.isEmpty()) return emptyList()
|
||||
var firstAnchor: PsiElement? = null
|
||||
if (symbolsInPreferredOrder.first() is MemberEntry.NewEntry) {
|
||||
val firstExistingEntry = symbolsInPreferredOrder.firstIsInstanceOrNull<MemberEntry.ExistingEntry>()
|
||||
if (firstExistingEntry != null) {
|
||||
firstAnchor = firstExistingEntry.psi.prevSiblingOfSameType() ?: classLeftBrace
|
||||
firstAnchor = firstExistingEntry.psi.prevSiblingOfSameType() ?: currentClass.body?.lBrace
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
-1
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassKind
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtIconProvider.getIcon
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPropertySymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithModality
|
||||
import org.jetbrains.kotlin.idea.frontend.api.tokens.HackToForceAllowRunningAnalyzeOnEDT
|
||||
import org.jetbrains.kotlin.idea.frontend.api.tokens.hackyAllowRunningOnEdt
|
||||
|
||||
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
|
||||
import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor
|
||||
import org.jetbrains.kotlin.idea.test.dumpErrorLines
|
||||
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
|
||||
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.test.InTextDirectivesUtils
|
||||
|
||||
Reference in New Issue
Block a user