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.
|
// Using hackyAllowRunningOnEdt here because we don't want to pre-populate all possible textual overrides before user selection.
|
||||||
val (commands, insertedBlocks) = hackyAllowRunningOnEdt {
|
val (commands, insertedBlocks) = hackyAllowRunningOnEdt {
|
||||||
val insertedBlocks = analyse(classOrObject) {
|
val entryMembers = analyse(classOrObject) {
|
||||||
this.generateMembers(editor, classOrObject, selectedElements, copyDoc)
|
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
|
// Reference shortening is done in a separate analysis session because the session need to be aware of the newly generated
|
||||||
// members.
|
// members.
|
||||||
val commands = analyse(classOrObject) {
|
val commands = analyse(classOrObject) {
|
||||||
@@ -81,7 +82,7 @@ internal abstract class KtGenerateMembersHandler : AbstractGenerateMembersHandle
|
|||||||
currentClass: KtClassOrObject,
|
currentClass: KtClassOrObject,
|
||||||
selectedElements: Collection<KtClassMember>,
|
selectedElements: Collection<KtClassMember>,
|
||||||
copyDoc: Boolean
|
copyDoc: Boolean
|
||||||
): List<InsertedBlock> {
|
): List<MemberEntry> {
|
||||||
if (selectedElements.isEmpty()) return emptyList()
|
if (selectedElements.isEmpty()) return emptyList()
|
||||||
val selectedMemberSymbolsAndGeneratedPsi: Map<KtCallableSymbol, KtCallableDeclaration> = selectedElements.associate {
|
val selectedMemberSymbolsAndGeneratedPsi: Map<KtCallableSymbol, KtCallableDeclaration> = selectedElements.associate {
|
||||||
it.symbol to generateMember(currentClass.project, it, currentClass, copyDoc)
|
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
|
// 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.
|
// stuff in it.
|
||||||
if (classBody == null || isCursorInsideClassBodyExcludingBraces(classBody, offset)) {
|
if (classBody == null || isCursorInsideClassBodyExcludingBraces(classBody, offset)) {
|
||||||
return runWriteAction {
|
return selectedMemberSymbolsAndGeneratedPsi.values.map { MemberEntry.NewEntry(it) }
|
||||||
listOf(InsertedBlock(insertMembersAfter(editor, currentClass, selectedMemberSymbolsAndGeneratedPsi.values)))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Insert members at positions such that the result aligns with ordering of members in super types.
|
// Insert members at positions such that the result aligns with ordering of members in super types.
|
||||||
val orderedMembers = getMembersOrderedByRelativePositionsInSuperTypes(currentClass, selectedMemberSymbolsAndGeneratedPsi)
|
return getMembersOrderedByRelativePositionsInSuperTypes(currentClass, selectedMemberSymbolsAndGeneratedPsi)
|
||||||
return insertMembersAccordingToPreferredOrder(orderedMembers, classBody.lBrace, editor, currentClass)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun isCursorInsideClassBodyExcludingBraces(classBody: KtClassBody, offset: Int): Boolean {
|
private fun isCursorInsideClassBodyExcludingBraces(classBody: KtClassBody, offset: Int): Boolean {
|
||||||
@@ -222,16 +220,15 @@ internal abstract class KtGenerateMembersHandler : AbstractGenerateMembersHandle
|
|||||||
@OptIn(ExperimentalStdlibApi::class)
|
@OptIn(ExperimentalStdlibApi::class)
|
||||||
private fun insertMembersAccordingToPreferredOrder(
|
private fun insertMembersAccordingToPreferredOrder(
|
||||||
symbolsInPreferredOrder: List<MemberEntry>,
|
symbolsInPreferredOrder: List<MemberEntry>,
|
||||||
classLeftBrace: PsiElement?,
|
|
||||||
editor: Editor,
|
editor: Editor,
|
||||||
currentClass: KtClassOrObject
|
currentClass: KtClassOrObject
|
||||||
): List<InsertedBlock> {
|
): List<InsertedBlock> {
|
||||||
require(symbolsInPreferredOrder.isNotEmpty()) { "symbolsInPreferredOrder must not be empty" }
|
if (symbolsInPreferredOrder.isEmpty()) return emptyList()
|
||||||
var firstAnchor: PsiElement? = null
|
var firstAnchor: PsiElement? = null
|
||||||
if (symbolsInPreferredOrder.first() is MemberEntry.NewEntry) {
|
if (symbolsInPreferredOrder.first() is MemberEntry.NewEntry) {
|
||||||
val firstExistingEntry = symbolsInPreferredOrder.firstIsInstanceOrNull<MemberEntry.ExistingEntry>()
|
val firstExistingEntry = symbolsInPreferredOrder.firstIsInstanceOrNull<MemberEntry.ExistingEntry>()
|
||||||
if (firstExistingEntry != null) {
|
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.KtClassKind
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol
|
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.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.symbols.markers.KtSymbolWithModality
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.tokens.HackToForceAllowRunningAnalyzeOnEDT
|
import org.jetbrains.kotlin.idea.frontend.api.tokens.HackToForceAllowRunningAnalyzeOnEDT
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.tokens.hackyAllowRunningOnEdt
|
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.KotlinWithJdkAndRuntimeLightProjectDescriptor
|
||||||
import org.jetbrains.kotlin.idea.test.dumpErrorLines
|
import org.jetbrains.kotlin.idea.test.dumpErrorLines
|
||||||
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
|
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.KtClassOrObject
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
import org.jetbrains.kotlin.test.InTextDirectivesUtils
|
import org.jetbrains.kotlin.test.InTextDirectivesUtils
|
||||||
|
|||||||
Reference in New Issue
Block a user