"Make abstract" is no longer applicable to object / enum entry members #KT-3797 Fixed

This commit is contained in:
Mikhail Glukhikh
2016-05-27 18:31:25 +03:00
parent bce96baf20
commit 91ce8cc612
5 changed files with 55 additions and 1 deletions
@@ -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)
}
@@ -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 {
<caret>A;
abstract fun foo()
}
@@ -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 {
<caret>fun foo()
}
@@ -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
<caret>fun foo()
@@ -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");