From 1f89c0f7302b48f8bf03e1eaf1c66c97dcdd39b8 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Tue, 2 Jul 2019 20:16:07 +0900 Subject: [PATCH] "Convert to sealed class" intention: don't suggest when no "class" keyword #KT-32365 Fixed --- compiler/psi/src/org/jetbrains/kotlin/psi/KtClass.kt | 2 ++ .../idea/intentions/ConvertEnumToSealedClassIntention.kt | 1 + .../intentions/convertEnumToSealedClass/noClassKeyword.kt | 4 ++++ .../kotlin/idea/intentions/IntentionTestGenerated.java | 5 +++++ 4 files changed, 12 insertions(+) create mode 100644 idea/testData/intentions/convertEnumToSealedClass/noClassKeyword.kt diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/KtClass.kt b/compiler/psi/src/org/jetbrains/kotlin/psi/KtClass.kt index 2d29b4d7dab..e4c2cea6293 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/KtClass.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/KtClass.kt @@ -52,6 +52,8 @@ open class KtClass : KtClassOrObject { override fun getCompanionObjects(): List = getBody()?.allCompanionObjects.orEmpty() fun getClassOrInterfaceKeyword(): PsiElement? = findChildByType(TokenSet.create(KtTokens.CLASS_KEYWORD, KtTokens.INTERFACE_KEYWORD)) + + fun getClassKeyword(): PsiElement? = findChildByType(KtTokens.CLASS_KEYWORD) } fun KtClass.createPrimaryConstructorIfAbsent(): KtPrimaryConstructor { diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertEnumToSealedClassIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertEnumToSealedClassIntention.kt index b9c19f8b855..c8af1cc52b0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertEnumToSealedClassIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertEnumToSealedClassIntention.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.psi.psiUtil.startOffset class ConvertEnumToSealedClassIntention : SelfTargetingRangeIntention(KtClass::class.java, "Convert to sealed class") { override fun applicabilityRange(element: KtClass): TextRange? { + if (element.getClassKeyword() == null) return null val nameIdentifier = element.nameIdentifier ?: return null val enumKeyword = element.modifierList?.getModifier(KtTokens.ENUM_KEYWORD) ?: return null return TextRange(enumKeyword.startOffset, nameIdentifier.endOffset) diff --git a/idea/testData/intentions/convertEnumToSealedClass/noClassKeyword.kt b/idea/testData/intentions/convertEnumToSealedClass/noClassKeyword.kt new file mode 100644 index 00000000000..547cc1fef83 --- /dev/null +++ b/idea/testData/intentions/convertEnumToSealedClass/noClassKeyword.kt @@ -0,0 +1,4 @@ +// IS_APPLICABLE: false +enum Foo { + A, B, C +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index 8305e7d7e78..b884b84f510 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -4275,6 +4275,11 @@ public class IntentionTestGenerated extends AbstractIntentionTest { runTest("idea/testData/intentions/convertEnumToSealedClass/membersOnly.kt"); } + @TestMetadata("noClassKeyword.kt") + public void testNoClassKeyword() throws Exception { + runTest("idea/testData/intentions/convertEnumToSealedClass/noClassKeyword.kt"); + } + @TestMetadata("notEnum.kt") public void testNotEnum() throws Exception { runTest("idea/testData/intentions/convertEnumToSealedClass/notEnum.kt");