Make abstract both member and class while applying "Make abstract"

So #KT-12613 Fixed
This commit is contained in:
Toshiaki Kameyama
2017-07-26 18:32:34 +09:00
committed by Mikhail Glukhikh
parent 0a9e0ddba9
commit dbaec43e4d
8 changed files with 51 additions and 0 deletions
@@ -33,6 +33,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.containingClass
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
@@ -56,6 +57,14 @@ open class AddModifierFix(
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
element?.addModifier(modifier)
if (modifier == KtTokens.ABSTRACT_KEYWORD && (element is KtProperty || element is KtNamedFunction)) {
element?.containingClass()?.run {
if (!hasModifier(KtTokens.ABSTRACT_KEYWORD) && !hasModifier(KtTokens.SEALED_KEYWORD)) {
addModifier(KtTokens.ABSTRACT_KEYWORD)
}
}
}
}
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
@@ -0,0 +1,4 @@
// "Make 'i' abstract" "true"
class A() {
var <caret>i : Int
}
@@ -0,0 +1,4 @@
// "Make 'i' abstract" "true"
abstract class A() {
abstract var <caret>i : Int
}
@@ -0,0 +1,4 @@
// "Make 'i' abstract" "true"
open class A() {
var <caret>i : Int
}
@@ -0,0 +1,4 @@
// "Make 'i' abstract" "true"
abstract class A() {
abstract var <caret>i : Int
}
@@ -0,0 +1,4 @@
// "Make 'i' abstract" "true"
sealed class A() {
fun <caret>i() : Int
}
@@ -0,0 +1,4 @@
// "Make 'i' abstract" "true"
sealed class A() {
abstract fun <caret>i() : Int
}
@@ -182,6 +182,24 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
doTest(fileName);
}
@TestMetadata("mustBeInitializedOrBeAbstractInFinalClass.kt")
public void testMustBeInitializedOrBeAbstractInFinalClass() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/abstract/mustBeInitializedOrBeAbstractInFinalClass.kt");
doTest(fileName);
}
@TestMetadata("mustBeInitializedOrBeAbstractInOpenClass.kt")
public void testMustBeInitializedOrBeAbstractInOpenClass() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/abstract/mustBeInitializedOrBeAbstractInOpenClass.kt");
doTest(fileName);
}
@TestMetadata("mustBeInitializedOrBeAbstractInSealedClass.kt")
public void testMustBeInitializedOrBeAbstractInSealedClass() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/abstract/mustBeInitializedOrBeAbstractInSealedClass.kt");
doTest(fileName);
}
@TestMetadata("nonAbstractFunctionWithNoBody.kt")
public void testNonAbstractFunctionWithNoBody() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/abstract/nonAbstractFunctionWithNoBody.kt");