From 91ce8cc6129871c62d67d6ae98d0def4edfdc4a4 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 27 May 2016 18:31:25 +0300 Subject: [PATCH] "Make abstract" is no longer applicable to object / enum entry members #KT-3797 Fixed --- .../kotlin/idea/quickfix/AddModifierFix.kt | 11 ++++++++++- .../quickfix/abstract/makeEnumEntryAbstract.kt | 9 +++++++++ .../abstract/makeObjectMemberAbstract.kt | 10 ++++++++++ .../quickfix/abstract/makeTopLevelAbstract.kt | 8 ++++++++ .../idea/quickfix/QuickFixTestGenerated.java | 18 ++++++++++++++++++ 5 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 idea/testData/quickfix/abstract/makeEnumEntryAbstract.kt create mode 100644 idea/testData/quickfix/abstract/makeObjectMemberAbstract.kt create mode 100644 idea/testData/quickfix/abstract/makeTopLevelAbstract.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddModifierFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddModifierFix.kt index 9e4f1420afc..35614fb36b5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddModifierFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddModifierFix.kt @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode @@ -85,7 +86,15 @@ open class AddModifierFix( public override fun createAction(diagnostic: Diagnostic): IntentionAction? { val modifierListOwner = QuickFixUtil.getParentElementOfType(diagnostic, modifierOwnerClass) ?: return null - if (modifier == KtTokens.ABSTRACT_KEYWORD && modifierListOwner is KtObjectDeclaration) return null + if (modifier == KtTokens.ABSTRACT_KEYWORD) { + if (modifierListOwner is KtObjectDeclaration) return null + if (modifierListOwner is KtEnumEntry) return null + if (modifierListOwner is KtDeclaration && modifierListOwner !is KtClass) { + val parentClassOrObject = modifierListOwner.containingClassOrObject ?: return null + if (parentClassOrObject is KtObjectDeclaration) return null + if (parentClassOrObject is KtEnumEntry) return null + } + } return AddModifierFix(modifierListOwner, modifier) } diff --git a/idea/testData/quickfix/abstract/makeEnumEntryAbstract.kt b/idea/testData/quickfix/abstract/makeEnumEntryAbstract.kt new file mode 100644 index 00000000000..b3a12edc7df --- /dev/null +++ b/idea/testData/quickfix/abstract/makeEnumEntryAbstract.kt @@ -0,0 +1,9 @@ +// "Make 'A' abstract" "false" +// ACTION: Implement members +// ERROR: Class 'A' must be declared abstract or implement abstract member public abstract fun foo(): Unit defined in E + +enum class E { + A; + + abstract fun foo() +} \ No newline at end of file diff --git a/idea/testData/quickfix/abstract/makeObjectMemberAbstract.kt b/idea/testData/quickfix/abstract/makeObjectMemberAbstract.kt new file mode 100644 index 00000000000..a701c99abf5 --- /dev/null +++ b/idea/testData/quickfix/abstract/makeObjectMemberAbstract.kt @@ -0,0 +1,10 @@ +// "Make 'foo' abstract" "false" +// ACTION: Add function body +// ACTION: Make internal +// ACTION: Make private +// ERROR: Function 'foo' without a body must be abstract + + +object O { + fun foo() +} \ No newline at end of file diff --git a/idea/testData/quickfix/abstract/makeTopLevelAbstract.kt b/idea/testData/quickfix/abstract/makeTopLevelAbstract.kt new file mode 100644 index 00000000000..fd7ed1eb26d --- /dev/null +++ b/idea/testData/quickfix/abstract/makeTopLevelAbstract.kt @@ -0,0 +1,8 @@ +// "Make 'foo' abstract" "false" +// ACTION: Add function body +// ACTION: Create test +// ACTION: Make internal +// ACTION: Make private +// ERROR: Function 'foo' must have a body + +fun foo() \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 903776ca2ae..293be8e6524 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -151,6 +151,24 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/abstract"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true); } + @TestMetadata("makeEnumEntryAbstract.kt") + public void testMakeEnumEntryAbstract() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/abstract/makeEnumEntryAbstract.kt"); + doTest(fileName); + } + + @TestMetadata("makeObjectMemberAbstract.kt") + public void testMakeObjectMemberAbstract() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/abstract/makeObjectMemberAbstract.kt"); + doTest(fileName); + } + + @TestMetadata("makeTopLevelAbstract.kt") + public void testMakeTopLevelAbstract() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/abstract/makeTopLevelAbstract.kt"); + doTest(fileName); + } + @TestMetadata("manyImpl.kt") public void testManyImpl() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/abstract/manyImpl.kt");