From 6f8503a178573ea42e6a23f35ee779154059aec8 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 15 Aug 2017 17:32:50 +0300 Subject: [PATCH] Override/Implement: Do not generate bodies for header class members #KT-15659 Fixed --- .../kotlin/idea/completion/OverridesCompletion.kt | 2 +- .../OverrideImplementMembersHandler.kt | 3 +-- .../overrideImplement/OverrideMemberChooserObject.kt | 7 ++++++- .../generate/KotlinGenerateEqualsAndHashcodeAction.kt | 4 ++-- .../actions/generate/KotlinGenerateToStringAction.kt | 8 ++++---- .../jetbrains/kotlin/idea/actions/generate/utils.kt | 6 +++--- .../idea/quickfix/SpecifyOverrideExplicitlyFix.kt | 2 +- .../implementMembersInHeaderClass/header/header.kt | 8 ++++++++ .../header/header.kt.after | 10 ++++++++++ .../kotlin/idea/quickfix/QuickFixMultiModuleTest.kt | 3 +++ 10 files changed, 39 insertions(+), 14 deletions(-) create mode 100644 idea/testData/multiModuleQuickFix/implementMembersInHeaderClass/header/header.kt create mode 100644 idea/testData/multiModuleQuickFix/implementMembersInHeaderClass/header/header.kt.after diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/OverridesCompletion.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/OverridesCompletion.kt index f87329b46b0..57071cc00f3 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/OverridesCompletion.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/OverridesCompletion.kt @@ -119,7 +119,7 @@ class OverridesCompletion( // keep original modifiers val modifierList = KtPsiFactory(context.project).createModifierList(dummyMember.modifierList!!.text) - val prototype = memberObject.generateMember(context.project, false) + val prototype = memberObject.generateMember(classOrObject, false) prototype.modifierList!!.replace(modifierList) val insertedMember = dummyMember.replaced(prototype) diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideImplementMembersHandler.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideImplementMembersHandler.kt index e9a2eaa35dd..15955b2bf0d 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideImplementMembersHandler.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideImplementMembersHandler.kt @@ -106,8 +106,7 @@ abstract class OverrideImplementMembersHandler : LanguageCodeInsightActionHandle selectedElements: Collection, copyDoc: Boolean ) { - val project = classOrObject.project - insertMembersAfter(editor, classOrObject, selectedElements.map { it.generateMember(project, copyDoc) }) + insertMembersAfter(editor, classOrObject, selectedElements.map { it.generateMember(classOrObject, copyDoc) }) } } } diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt index ccaf52333ea..1cde67d73ff 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt @@ -32,6 +32,7 @@ import org.jetbrains.kotlin.idea.j2k.IdeaDocCommentConverter import org.jetbrains.kotlin.idea.kdoc.KDocElementFactory import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.util.approximateFlexibleTypes +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.findDocComment.findDocComment import org.jetbrains.kotlin.renderer.* @@ -95,7 +96,11 @@ interface OverrideMemberChooserObject : ClassMember { } } -fun OverrideMemberChooserObject.generateMember(project: Project, copyDoc: Boolean): KtCallableDeclaration { +fun OverrideMemberChooserObject.generateMember(targetClass: KtClassOrObject, copyDoc: Boolean): KtCallableDeclaration { + val project = targetClass.project + + val bodyType = if (targetClass.hasModifier(KtTokens.HEADER_KEYWORD)) OverrideMemberChooserObject.BodyType.NO_BODY else bodyType + val descriptor = immediateSuper if (preferConstructorParameter && descriptor is PropertyDescriptor) return generateConstructorParameter(project, descriptor) diff --git a/idea/src/org/jetbrains/kotlin/idea/actions/generate/KotlinGenerateEqualsAndHashcodeAction.kt b/idea/src/org/jetbrains/kotlin/idea/actions/generate/KotlinGenerateEqualsAndHashcodeAction.kt index b714282bba8..de350334e0a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/actions/generate/KotlinGenerateEqualsAndHashcodeAction.kt +++ b/idea/src/org/jetbrains/kotlin/idea/actions/generate/KotlinGenerateEqualsAndHashcodeAction.kt @@ -164,7 +164,7 @@ class KotlinGenerateEqualsAndHashcodeAction : KotlinGenerateMemberActionBase { val targetClass = info.classDescriptor.source.getPsi() as KtClass - val prototype = generateToString(project, info) ?: return emptyList() + val prototype = generateToString(targetClass, info) ?: return emptyList() val anchor = with(targetClass.declarations) { lastIsInstanceOrNull() ?: lastOrNull() } return insertMembersAfter(editor, targetClass, listOf(prototype), anchor) } diff --git a/idea/src/org/jetbrains/kotlin/idea/actions/generate/utils.kt b/idea/src/org/jetbrains/kotlin/idea/actions/generate/utils.kt index 05206c99eb4..9e26947bba8 100644 --- a/idea/src/org/jetbrains/kotlin/idea/actions/generate/utils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/actions/generate/utils.kt @@ -79,8 +79,8 @@ fun confirmMemberRewrite(targetClass: KtClass, vararg descriptors: FunctionDescr Messages.getQuestionIcon()) == Messages.YES } -fun generateFunctionSkeleton(descriptor: FunctionDescriptor, project: Project): KtNamedFunction { +fun generateFunctionSkeleton(descriptor: FunctionDescriptor, targetClass: KtClassOrObject): KtNamedFunction { return OverrideMemberChooserObject - .create(project, descriptor, descriptor, OverrideMemberChooserObject.BodyType.EMPTY) - .generateMember(project, false) as KtNamedFunction + .create(targetClass.project, descriptor, descriptor, OverrideMemberChooserObject.BodyType.EMPTY) + .generateMember(targetClass, false) as KtNamedFunction } \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/SpecifyOverrideExplicitlyFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/SpecifyOverrideExplicitlyFix.kt index 1badf4bac41..5d096f75101 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/SpecifyOverrideExplicitlyFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/SpecifyOverrideExplicitlyFix.kt @@ -82,7 +82,7 @@ class SpecifyOverrideExplicitlyFix( project, delegatedDescriptor, overriddenDescriptor, OverrideMemberChooserObject.BodyType.Delegate(delegateTargetDescriptor.name.asString()) ) - val member = overrideMemberChooserObject.generateMember(project, copyDoc = false) + val member = overrideMemberChooserObject.generateMember(element, copyDoc = false) val insertedMember = element.addDeclaration(member) ShortenReferences.DEFAULT.process(insertedMember) return diff --git a/idea/testData/multiModuleQuickFix/implementMembersInHeaderClass/header/header.kt b/idea/testData/multiModuleQuickFix/implementMembersInHeaderClass/header/header.kt new file mode 100644 index 00000000000..86abe4f20aa --- /dev/null +++ b/idea/testData/multiModuleQuickFix/implementMembersInHeaderClass/header/header.kt @@ -0,0 +1,8 @@ +// "Implement members" "true" +// DISABLE-ERRORS + +interface I { + fun foo() +} + +header class Bar : I \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/implementMembersInHeaderClass/header/header.kt.after b/idea/testData/multiModuleQuickFix/implementMembersInHeaderClass/header/header.kt.after new file mode 100644 index 00000000000..8eedefe5450 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/implementMembersInHeaderClass/header/header.kt.after @@ -0,0 +1,10 @@ +// "Implement members" "true" +// DISABLE-ERRORS + +interface I { + fun foo() +} + +header class Bar : I { + override fun foo() +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTest.kt b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTest.kt index 92167091cc8..edb6a6ba854 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTest.kt @@ -153,4 +153,7 @@ class QuickFixMultiModuleTest : AbstractQuickFixMultiModuleTest() { @Test fun testFunctionTypeReceiverToParameterByImpl() = doTestHeaderWithJvmAndJs() + + @Test + fun testImplementMembersInHeaderClass() = doMultiPlatformTest(impls = *arrayOf()) } \ No newline at end of file