From 216b28ec552623a523438e2f298654c297041e30 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 4 Jul 2017 16:09:20 +0300 Subject: [PATCH] Implement Members: Do not generate 'header' keyword #KT-18466 Fixed --- .../OverrideMemberChooserObject.kt | 34 ++++++++++++------- .../quickfix/implement/doNotAddHeader.kt | 9 +++++ .../implement/doNotAddHeader.kt.after | 12 +++++++ .../idea/quickfix/QuickFixTestGenerated.java | 6 ++++ 4 files changed, 49 insertions(+), 12 deletions(-) create mode 100644 idea/testData/quickfix/implement/doNotAddHeader.kt create mode 100644 idea/testData/quickfix/implement/doNotAddHeader.kt.after 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 526672dab6a..bdbc2cfa5e1 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 @@ -135,11 +135,27 @@ private val OVERRIDE_RENDERER = DescriptorRenderer.withOptions { renderUnabbreviatedType = false } -private fun generateProperty(project: Project, descriptor: PropertyDescriptor, bodyType: OverrideMemberChooserObject.BodyType): KtProperty { - val newDescriptor = descriptor.copy(descriptor.containingDeclaration, Modality.OPEN, descriptor.visibility, - descriptor.kind, /* copyOverrides = */ true) as PropertyDescriptor - newDescriptor.setSingleOverridden(descriptor) +private fun PropertyDescriptor.wrap(): PropertyDescriptor { + val newDescriptor = object : PropertyDescriptor by this { + override fun isHeader() = false + override fun getModality() = Modality.OPEN + } + newDescriptor.setSingleOverridden(this) + return newDescriptor +} +private fun FunctionDescriptor.wrap(): FunctionDescriptor { + return object : FunctionDescriptor by this { + override fun isHeader() = false + override fun getModality() = Modality.OPEN + override fun getReturnType() = this@wrap.returnType?.approximateFlexibleTypes(preferNotNull = true, preferStarForRaw = true) + override fun getOverriddenDescriptors() = listOf(this@wrap) + override fun accept(visitor: DeclarationDescriptorVisitor, data: D) = visitor.visitFunctionDescriptor(this, data) + } +} + +private fun generateProperty(project: Project, descriptor: PropertyDescriptor, bodyType: OverrideMemberChooserObject.BodyType): KtProperty { + val newDescriptor = descriptor.wrap() val body = buildString { append("\nget()") append(" = ") @@ -152,19 +168,13 @@ private fun generateProperty(project: Project, descriptor: PropertyDescriptor, b } private fun generateConstructorParameter(project: Project, descriptor: PropertyDescriptor): KtParameter { - val newDescriptor = descriptor.copy(descriptor.containingDeclaration, Modality.OPEN, descriptor.visibility, - descriptor.kind, /* copyOverrides = */ true) as PropertyDescriptor + val newDescriptor = descriptor.wrap() newDescriptor.setSingleOverridden(descriptor) return KtPsiFactory(project).createParameter(OVERRIDE_RENDERER.render(newDescriptor)) } private fun generateFunction(project: Project, descriptor: FunctionDescriptor, bodyType: OverrideMemberChooserObject.BodyType): KtNamedFunction { - val newDescriptor = object : FunctionDescriptor by descriptor { - override fun getModality() = Modality.OPEN - override fun getReturnType() = descriptor.returnType?.approximateFlexibleTypes(preferNotNull = true, preferStarForRaw = true) - override fun getOverriddenDescriptors() = listOf(descriptor) - override fun accept(visitor: DeclarationDescriptorVisitor, data: D) = visitor.visitFunctionDescriptor(this, data) - } + val newDescriptor = descriptor.wrap() val returnType = descriptor.returnType val returnsNotUnit = returnType != null && !KotlinBuiltIns.isUnit(returnType) diff --git a/idea/testData/quickfix/implement/doNotAddHeader.kt b/idea/testData/quickfix/implement/doNotAddHeader.kt new file mode 100644 index 00000000000..d7ac9b414bd --- /dev/null +++ b/idea/testData/quickfix/implement/doNotAddHeader.kt @@ -0,0 +1,9 @@ +// "Implement members" "true" +// WITH_RUNTIME +// ERROR: Header declaration 'InterfaceWithFuns' has no implementation in module light_idea_test_case for JVM +header interface InterfaceWithFuns { + fun funInInterface() +} + +class ChildOfInterface : InterfaceWithFuns{ +} \ No newline at end of file diff --git a/idea/testData/quickfix/implement/doNotAddHeader.kt.after b/idea/testData/quickfix/implement/doNotAddHeader.kt.after new file mode 100644 index 00000000000..13a9b2e9135 --- /dev/null +++ b/idea/testData/quickfix/implement/doNotAddHeader.kt.after @@ -0,0 +1,12 @@ +// "Implement members" "true" +// WITH_RUNTIME +// ERROR: Header declaration 'InterfaceWithFuns' has no implementation in module light_idea_test_case for JVM +header interface InterfaceWithFuns { + fun funInInterface() +} + +class ChildOfInterface : InterfaceWithFuns{ + override fun funInInterface() { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index adfaa679965..75eb3bbba4e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -5768,6 +5768,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("doNotAddHeader.kt") + public void testDoNotAddHeader() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/implement/doNotAddHeader.kt"); + doTest(fileName); + } + @TestMetadata("enum.kt") public void testEnum() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/implement/enum.kt");