From dac2430b1a5bf548fa7b4f7ff6c7ffde36e3389e Mon Sep 17 00:00:00 2001 From: "Victoria.Petrakovich" Date: Mon, 2 Sep 2024 14:03:48 +0200 Subject: [PATCH] [kotlin] Support NOT_A_LOOP_LABEL diagnostic when creating CreateLabel fix KTIJ-29594 K2 IDE: Port CreateLabelFix GitOrigin-RevId: d40f019fdc3cd5a309b02f672b99bcea52b86e2c --- ...xFactory.kt => CreateLabelFixFactories.kt} | 20 +++++++++++++++---- .../fixes/KotlinK2QuickFixRegistrar.kt | 3 ++- .../quickfix/createLabel/breakInLoop.kt | 3 --- .../quickfix/createLabel/breakInLoop.kt.after | 3 --- .../quickfix/createLabel/breakInOuterLoop.kt | 3 --- .../createLabel/breakInOuterLoop.kt.after | 3 --- .../quickfix/createLabel/continueInLoop.kt | 3 --- .../createLabel/continueInLoop.kt.after | 3 --- 8 files changed, 18 insertions(+), 23 deletions(-) rename plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/{CreateLabelFixFactory.kt => CreateLabelFixFactories.kt} (62%) diff --git a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/CreateLabelFixFactory.kt b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/CreateLabelFixFactories.kt similarity index 62% rename from plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/CreateLabelFixFactory.kt rename to plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/CreateLabelFixFactories.kt index c84bce6be51e..094b27b0d78e 100644 --- a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/CreateLabelFixFactory.kt +++ b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/CreateLabelFixFactories.kt @@ -8,11 +8,23 @@ import org.jetbrains.kotlin.idea.quickfix.CreateLabelFix.Companion.getContaining import org.jetbrains.kotlin.idea.quickfix.CreateLabelFix.Companion.getContainingLoops import org.jetbrains.kotlin.psi.* -internal object CreateLabelFixFactory { - - val createLabelFixFactory = KotlinQuickFixFactory.IntentionBased { diagnostic: KaFirDiagnostic.UnresolvedLabel -> +internal object CreateLabelFixFactories { + val unresolvedLabelFactory = KotlinQuickFixFactory.IntentionBased { diagnostic: KaFirDiagnostic.UnresolvedLabel -> val labelReferenceExpression = diagnostic.psi as? KtLabelReferenceExpression ?: return@IntentionBased emptyList() + return@IntentionBased getFixes(labelReferenceExpression) + } + + val notALoopLabelFactory = KotlinQuickFixFactory.IntentionBased { diagnostic: KaFirDiagnostic.NotALoopLabel -> + val breakOrContinueExpression = + diagnostic.psi as? KtBreakExpression ?: diagnostic.psi as? KtContinueExpression ?: return@IntentionBased emptyList() + + val labelReferenceExpression = + breakOrContinueExpression.getTargetLabel() as? KtLabelReferenceExpression ?: return@IntentionBased emptyList() + return@IntentionBased getFixes(labelReferenceExpression) + } + + private fun getFixes(labelReferenceExpression: KtLabelReferenceExpression): List { val fixes = when ((labelReferenceExpression.parent as? KtContainerNode)?.parent) { is KtBreakExpression, is KtContinueExpression -> { if (labelReferenceExpression.getContainingLoops().any()) { @@ -32,7 +44,7 @@ internal object CreateLabelFixFactory { else -> emptyList() } - return@IntentionBased fixes + return fixes } } diff --git a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/KotlinK2QuickFixRegistrar.kt b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/KotlinK2QuickFixRegistrar.kt index 7e0b5aaf1871..eb464872f447 100644 --- a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/KotlinK2QuickFixRegistrar.kt +++ b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/KotlinK2QuickFixRegistrar.kt @@ -124,7 +124,8 @@ class KotlinK2QuickFixRegistrar : KotlinQuickFixRegistrar() { registerFactory(RenameModToRemFixFactory.deprecatedBinaryModFactory) registerFactory(RenameModToRemFixFactory.forbiddenBinaryModFactory) registerFactory(AddEmptyArgumentListFixFactory.addEmptyArgumentListFixFactory) - registerFactory(KaFirDiagnostic.UnresolvedLabel::class, CreateLabelFixFactory.createLabelFixFactory) + registerFactory(KaFirDiagnostic.UnresolvedLabel::class, CreateLabelFixFactories.unresolvedLabelFactory) + registerFactory(KaFirDiagnostic.NotALoopLabel::class, CreateLabelFixFactories.notALoopLabelFactory) registerFactory(AddDefaultConstructorFixFactory.addDefaultConstructorFixFactory) registerFactory(MakeClassAnAnnotationClassFixFactory.makeClassAnAnnotationClassFixFactory) registerFactory(WrongLongSuffixFixFactory.changeToCorrectLongSuffix) diff --git a/plugins/kotlin/idea/tests/testData/quickfix/createLabel/breakInLoop.kt b/plugins/kotlin/idea/tests/testData/quickfix/createLabel/breakInLoop.kt index efe3f864ca51..dd68a98307fa 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/createLabel/breakInLoop.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/createLabel/breakInLoop.kt @@ -1,6 +1,3 @@ -/* IGNORE_K2 */ -// Remove this ignoring after KT-69829 is fixed - // "Create label foo@" "true" fun test() { diff --git a/plugins/kotlin/idea/tests/testData/quickfix/createLabel/breakInLoop.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/createLabel/breakInLoop.kt.after index 884b21fec49d..e9cdac0bea2a 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/createLabel/breakInLoop.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/createLabel/breakInLoop.kt.after @@ -1,6 +1,3 @@ -/* IGNORE_K2 */ -// Remove this ignoring after KT-69829 is fixed - // "Create label foo@" "true" fun test() { diff --git a/plugins/kotlin/idea/tests/testData/quickfix/createLabel/breakInOuterLoop.kt b/plugins/kotlin/idea/tests/testData/quickfix/createLabel/breakInOuterLoop.kt index 0404c6bda2e7..6409b444f906 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/createLabel/breakInOuterLoop.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/createLabel/breakInOuterLoop.kt @@ -1,6 +1,3 @@ -/* IGNORE_K2 */ -// Remove this ignoring after KT-69829 is fixed - // "Create label foo@" "true" fun test() { diff --git a/plugins/kotlin/idea/tests/testData/quickfix/createLabel/breakInOuterLoop.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/createLabel/breakInOuterLoop.kt.after index ebe1143ec924..cf730b5f3b8b 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/createLabel/breakInOuterLoop.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/createLabel/breakInOuterLoop.kt.after @@ -1,6 +1,3 @@ -/* IGNORE_K2 */ -// Remove this ignoring after KT-69829 is fixed - // "Create label foo@" "true" fun test() { diff --git a/plugins/kotlin/idea/tests/testData/quickfix/createLabel/continueInLoop.kt b/plugins/kotlin/idea/tests/testData/quickfix/createLabel/continueInLoop.kt index 3abc1560d778..86836952ecf1 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/createLabel/continueInLoop.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/createLabel/continueInLoop.kt @@ -1,6 +1,3 @@ -/* IGNORE_K2 */ -// Remove this ignoring after KT-69829 is fixed - // "Create label foo@" "true" fun test() { diff --git a/plugins/kotlin/idea/tests/testData/quickfix/createLabel/continueInLoop.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/createLabel/continueInLoop.kt.after index f7df6a208bf7..c8da74914761 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/createLabel/continueInLoop.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/createLabel/continueInLoop.kt.after @@ -1,6 +1,3 @@ -/* IGNORE_K2 */ -// Remove this ignoring after KT-69829 is fixed - // "Create label foo@" "true" fun test() {