Implement Members: Do not generate 'header' keyword

#KT-18466 Fixed
This commit is contained in:
Alexey Sedunov
2017-07-04 16:09:20 +03:00
parent 26d6088c82
commit 216b28ec55
4 changed files with 49 additions and 12 deletions
@@ -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 <R : Any?, D : Any?> accept(visitor: DeclarationDescriptorVisitor<R, D>, 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 <R : Any?, D : Any?> accept(visitor: DeclarationDescriptorVisitor<R, D>, data: D) = visitor.visitFunctionDescriptor(this, data)
}
val newDescriptor = descriptor.wrap()
val returnType = descriptor.returnType
val returnsNotUnit = returnType != null && !KotlinBuiltIns.isUnit(returnType)
+9
View File
@@ -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 <caret>ChildOfInterface : InterfaceWithFuns{
}
@@ -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.
}
}
@@ -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");