From 608368997ca748b04ec64667132ead8e8b5fb3cb Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 13 Sep 2016 20:16:50 +0300 Subject: [PATCH] Add function to supertype immediately removes redundant modifiers #KT-12297 Fixed --- .../kotlin/idea/quickfix/AddFunctionToSupertypeFix.kt | 10 +++++++++- .../override/nothingToOverride/addFunctionNoBody.kt | 2 +- .../nothingToOverride/addFunctionNoBody.kt.after | 4 ++-- .../override/nothingToOverride/addFunctionTrait.kt | 2 +- .../nothingToOverride/addFunctionTrait.kt.after | 4 ++-- .../nothingToOverride/addFunctionTwoTraits.kt.after | 2 +- 6 files changed, 16 insertions(+), 8 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddFunctionToSupertypeFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddFunctionToSupertypeFix.kt index 044449ebd49..c6b92298208 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddFunctionToSupertypeFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddFunctionToSupertypeFix.kt @@ -35,9 +35,12 @@ import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.core.ShortenReferences import org.jetbrains.kotlin.idea.core.TemplateKind import org.jetbrains.kotlin.idea.core.getFunctionBodyTextFromTemplate +import org.jetbrains.kotlin.idea.core.implicitModality import org.jetbrains.kotlin.idea.imports.importableFqName import org.jetbrains.kotlin.idea.util.application.executeWriteCommand +import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.modalityModifier import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.checker.KotlinTypeChecker import org.jetbrains.kotlin.types.typeUtil.supertypes @@ -87,6 +90,11 @@ class AddFunctionToSupertypeFix private constructor( val insertedFunctionElement = classBody.addBefore(functionElement, classBody.rBrace) as KtNamedFunction ShortenReferences.DEFAULT.process(insertedFunctionElement) + val modifierToken = insertedFunctionElement.modalityModifier()?.node?.elementType as? KtModifierKeywordToken + ?: return@executeWriteCommand + if (insertedFunctionElement.implicitModality() == modifierToken) { + RemoveModifierFix(insertedFunctionElement, modifierToken, true).invoke() + } } } @@ -180,7 +188,7 @@ class AddFunctionToSupertypeFix private constructor( private fun generateFunctionSignatureForType(functionDescriptor: FunctionDescriptor, typeDescriptor: ClassDescriptor): FunctionDescriptor { // TODO: support for generics. - val modality = if (typeDescriptor.kind == ClassKind.INTERFACE) Modality.OPEN else typeDescriptor.modality + val modality = if (typeDescriptor.kind == ClassKind.INTERFACE) Modality.ABSTRACT else typeDescriptor.modality return functionDescriptor.copy( typeDescriptor, diff --git a/idea/testData/quickfix/override/nothingToOverride/addFunctionNoBody.kt b/idea/testData/quickfix/override/nothingToOverride/addFunctionNoBody.kt index 50648ae6a97..8d86b734dcb 100644 --- a/idea/testData/quickfix/override/nothingToOverride/addFunctionNoBody.kt +++ b/idea/testData/quickfix/override/nothingToOverride/addFunctionNoBody.kt @@ -1,4 +1,4 @@ -// "Add 'open fun f()' to 'A'" "true" +// "Add 'abstract fun f()' to 'A'" "true" interface A class B : A { override fun f() {} diff --git a/idea/testData/quickfix/override/nothingToOverride/addFunctionNoBody.kt.after b/idea/testData/quickfix/override/nothingToOverride/addFunctionNoBody.kt.after index dbc3bfa628a..b18e60e29ae 100644 --- a/idea/testData/quickfix/override/nothingToOverride/addFunctionNoBody.kt.after +++ b/idea/testData/quickfix/override/nothingToOverride/addFunctionNoBody.kt.after @@ -1,6 +1,6 @@ -// "Add 'open fun f()' to 'A'" "true" +// "Add 'abstract fun f()' to 'A'" "true" interface A { - open fun f() + fun f() } class B : A { diff --git a/idea/testData/quickfix/override/nothingToOverride/addFunctionTrait.kt b/idea/testData/quickfix/override/nothingToOverride/addFunctionTrait.kt index 0da59f6e865..e217845f5c7 100644 --- a/idea/testData/quickfix/override/nothingToOverride/addFunctionTrait.kt +++ b/idea/testData/quickfix/override/nothingToOverride/addFunctionTrait.kt @@ -1,4 +1,4 @@ -// "Add 'open fun f()' to 'A'" "true" +// "Add 'abstract fun f()' to 'A'" "true" interface A { } class B : A { diff --git a/idea/testData/quickfix/override/nothingToOverride/addFunctionTrait.kt.after b/idea/testData/quickfix/override/nothingToOverride/addFunctionTrait.kt.after index 6ec12ff8e04..ab66090dca8 100644 --- a/idea/testData/quickfix/override/nothingToOverride/addFunctionTrait.kt.after +++ b/idea/testData/quickfix/override/nothingToOverride/addFunctionTrait.kt.after @@ -1,6 +1,6 @@ -// "Add 'open fun f()' to 'A'" "true" +// "Add 'abstract fun f()' to 'A'" "true" interface A { - open fun f() + fun f() } class B : A { override fun f() {} diff --git a/idea/testData/quickfix/override/nothingToOverride/addFunctionTwoTraits.kt.after b/idea/testData/quickfix/override/nothingToOverride/addFunctionTwoTraits.kt.after index 34f9addb525..6b6d438b3b1 100644 --- a/idea/testData/quickfix/override/nothingToOverride/addFunctionTwoTraits.kt.after +++ b/idea/testData/quickfix/override/nothingToOverride/addFunctionTwoTraits.kt.after @@ -1,6 +1,6 @@ // "Add function to supertype..." "true" interface A { - open fun foo() + fun foo() } interface B {} class C: A, B {