"Make abstract" is no longer applicable to object / enum entry members #KT-3797 Fixed
This commit is contained in:
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user