[kotlin] explicitly execute potentially slow override/implement search under progress (KTIJ-24371)

GitOrigin-RevId: 9a47fa8a9a622353e34cfd0e9ca0d04bb07429a0
This commit is contained in:
Anna Kozlova
2023-01-23 17:02:04 +01:00
committed by intellij-monorepo-bot
parent fd5710e37e
commit 6bdb09bae5
6 changed files with 22 additions and 25 deletions

View File

@@ -629,4 +629,5 @@ intention.name.remove.repeating.call=Remove repeating call ''{0}()''
intention.family.name.replace.with.expression=Replace with expression
intention.name.make.variable.effectively.final=Make variable effectively final
uast.language.display.name=JVM languages
uast.language.display.name=JVM languages
dialog.progress.collect.members.to.generate=Collect Members...

View File

@@ -15,11 +15,9 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithModality
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.idea.KtIconProvider.getIcon
import org.jetbrains.kotlin.idea.codeinsight.api.applicators.fixes.diagnosticFixFactoryFromIntentionActions
import org.jetbrains.kotlin.idea.core.overrideImplement.KtImplementMembersHandler.Companion.getUnimplementedMembers
import org.jetbrains.kotlin.idea.core.util.KotlinIdeaCoreBundle
import org.jetbrains.kotlin.idea.codeinsight.api.applicators.fixes.diagnosticFixFactoryFromIntentionActions
import org.jetbrains.kotlin.analysis.api.KtAllowAnalysisOnEdt
import org.jetbrains.kotlin.analysis.api.lifetime.allowAnalysisOnEdt
import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtEnumEntry
@@ -31,12 +29,9 @@ open class KtImplementMembersHandler : KtGenerateMembersHandler(true) {
override fun getNoMembersFoundHint() = KotlinIdeaCoreBundle.message("implement.members.handler.no.members.hint")
@OptIn(KtAllowAnalysisOnEdt::class)
override fun collectMembersToGenerate(classOrObject: KtClassOrObject): Collection<KtClassMember> {
return allowAnalysisOnEdt {
analyze(classOrObject) {
getUnimplementedMembers(classOrObject).map { createKtClassMember(it, BodyType.FromTemplate, false) }
}
return analyze(classOrObject) {
getUnimplementedMembers(classOrObject).map { createKtClassMember(it, BodyType.FromTemplate, false) }
}
}

View File

@@ -3,12 +3,10 @@
package org.jetbrains.kotlin.idea.core.overrideImplement
import org.jetbrains.annotations.ApiStatus
import org.jetbrains.kotlin.analysis.api.KtAllowAnalysisOnEdt
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.analyze
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.analysis.api.lifetime.allowAnalysisOnEdt
import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithModality
import org.jetbrains.kotlin.descriptors.Modality
@@ -19,12 +17,9 @@ import org.jetbrains.kotlin.psi.KtClassOrObject
@ApiStatus.Internal
open class KtOverrideMembersHandler : KtGenerateMembersHandler(false) {
@OptIn(KtAllowAnalysisOnEdt::class)
override fun collectMembersToGenerate(classOrObject: KtClassOrObject): Collection<KtClassMember> {
return allowAnalysisOnEdt {
analyze(classOrObject) {
collectMembers(classOrObject)
}
return analyze(classOrObject) {
collectMembers(classOrObject)
}
}

View File

@@ -6,8 +6,11 @@ import com.intellij.codeInsight.FileModificationService
import com.intellij.codeInsight.generation.ClassMember
import com.intellij.codeInsight.hint.HintManager
import com.intellij.ide.util.MemberChooser
import com.intellij.java.analysis.JavaAnalysisBundle
import com.intellij.lang.LanguageCodeInsightActionHandler
import com.intellij.openapi.application.runReadAction
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.progress.ProgressManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.DialogWrapper
import com.intellij.openapi.util.NlsContexts
@@ -23,6 +26,13 @@ import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
abstract class AbstractGenerateMembersHandler<T : ClassMember> : LanguageCodeInsightActionHandler {
abstract val toImplement: Boolean
fun collectMembersToGenerateUnderProgress(classOrObject: KtClassOrObject): Collection<T> {
return ProgressManager.getInstance().runProcessWithProgressSynchronously<Collection<T>, RuntimeException>(
{ runReadAction { collectMembersToGenerate(classOrObject) } },
JavaAnalysisBundle.message("dialog.progress.collect.members.to.generate"), true, classOrObject.project
)
}
abstract fun collectMembersToGenerate(classOrObject: KtClassOrObject): Collection<T>
abstract fun generateMembers(editor: Editor, classOrObject: KtClassOrObject, selectedElements: Collection<T>, copyDoc: Boolean)
@@ -66,7 +76,7 @@ abstract class AbstractGenerateMembersHandler<T : ClassMember> : LanguageCodeIns
if (!FileModificationService.getInstance().prepareFileForWrite(file)) return
val members = collectMembersToGenerate(classOrObject)
val members = collectMembersToGenerateUnderProgress(classOrObject)
if (members.isEmpty() && !implementAll) {
HintManager.getInstance().showErrorHint(editor, getNoMembersFoundHint())
return

View File

@@ -75,7 +75,7 @@ class LetImplementInterfaceFix(
val newElement = point.element ?: return
val implementMembersHandler = ImplementMembersHandler()
if (implementMembersHandler.collectMembersToGenerate(newElement).isEmpty()) return
if (implementMembersHandler.collectMembersToGenerateUnderProgress(newElement).isEmpty()) return
if (editor != null) {
editor.caretModel.moveToOffset(element.textRange.startOffset)

View File

@@ -15,14 +15,10 @@ import com.intellij.psi.util.PsiTreeUtil
import com.intellij.testFramework.LightProjectDescriptor
import com.intellij.util.SmartList
import org.jetbrains.kotlin.idea.core.overrideImplement.AbstractGenerateMembersHandler
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.test.*
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.idea.test.InTextDirectivesUtils
import org.jetbrains.kotlin.idea.test.KotlinTestUtils
import org.jetbrains.kotlin.test.utils.IgnoreTests
import org.jetbrains.kotlin.utils.rethrow
import org.junit.Assert
@@ -114,7 +110,7 @@ abstract class AbstractOverrideImplementTest<T : ClassMember> : KotlinLightCodeI
val classOrObject = PsiTreeUtil.getParentOfType(elementAtCaret, KtClassOrObject::class.java)
?: error("Caret should be inside class or object")
val chooserObjects = handler.collectMembersToGenerate(classOrObject)
val chooserObjects = handler.collectMembersToGenerateUnderProgress(classOrObject)
val singleToOverride = if (memberToOverride == null) {
val filtered = chooserObjects.filter { !isMemberOfAny(classOrObject, it) }
@@ -137,7 +133,7 @@ abstract class AbstractOverrideImplementTest<T : ClassMember> : KotlinLightCodeI
val classOrObject = PsiTreeUtil.getParentOfType(elementAtCaret, KtClassOrObject::class.java)
?: error("Caret should be inside class or object")
val chooserObjects = handler.collectMembersToGenerate(classOrObject)
val chooserObjects = handler.collectMembersToGenerateUnderProgress(classOrObject)
.sortedBy { getMemberName(classOrObject, it) + " in " + getContainingClassName(classOrObject, it) }
performGenerateCommand(handler, classOrObject, chooserObjects)
}