mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-03-22 15:19:59 +07:00
[kotlin] explicitly execute potentially slow override/implement search under progress (KTIJ-24371)
GitOrigin-RevId: 9a47fa8a9a622353e34cfd0e9ca0d04bb07429a0
This commit is contained in:
committed by
intellij-monorepo-bot
parent
fd5710e37e
commit
6bdb09bae5
@@ -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...
|
||||
@@ -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) }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user