From 93882736eddba61aeffae81ae9af2a71999ab442 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 19 Dec 2018 16:26:14 +0300 Subject: [PATCH] OverrideMemberChooserObject refactoring: introduce MemberGenerateMode --- .../OverrideMemberChooserObject.kt | 72 +++++++++++-------- .../expectactual/ExpectActualUtils.kt | 6 +- 2 files changed, 46 insertions(+), 32 deletions(-) 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 09d9f96f4cc..0ce8a2e39d1 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 @@ -119,30 +119,37 @@ interface OverrideMemberChooserObject : ClassMember { } } +enum class MemberGenerateMode { + OVERRIDE, + ACTUAL, + EXPECT +} + fun OverrideMemberChooserObject.generateMember( targetClass: KtClassOrObject, copyDoc: Boolean -) = generateMember(targetClass, copyDoc, targetClass.project, forceActual = false, forceExpect = false) +) = generateMember(targetClass, copyDoc, targetClass.project, mode = MemberGenerateMode.OVERRIDE) fun OverrideMemberChooserObject.generateMember( targetClass: KtClassOrObject?, copyDoc: Boolean, project: Project, - forceActual: Boolean, - forceExpect: Boolean + mode: MemberGenerateMode ): KtCallableDeclaration { val descriptor = immediateSuper val bodyType = when { targetClass?.hasExpectModifier() == true -> NO_BODY - descriptor.extensionReceiverParameter != null && !forceActual && !forceExpect -> FROM_TEMPLATE + descriptor.extensionReceiverParameter != null && mode == MemberGenerateMode.OVERRIDE -> FROM_TEMPLATE else -> bodyType } - val renderer = if (!forceActual && !forceExpect) OVERRIDE_RENDERER else when { - forceActual -> ACTUAL_RENDERER - else -> EXPECT_RENDERER - }.withOptions { + val baseRenderer = when (mode) { + MemberGenerateMode.OVERRIDE -> OVERRIDE_RENDERER + MemberGenerateMode.ACTUAL -> ACTUAL_RENDERER + MemberGenerateMode.EXPECT -> EXPECT_RENDERER + } + val renderer = baseRenderer.withOptions { if (descriptor is ClassConstructorDescriptor && descriptor.isPrimary) { val containingClass = descriptor.containingDeclaration if (containingClass.kind == ClassKind.ANNOTATION_CLASS || containingClass.isInline) { @@ -152,29 +159,31 @@ fun OverrideMemberChooserObject.generateMember( } if (preferConstructorParameter && descriptor is PropertyDescriptor) { - return generateConstructorParameter(project, descriptor, renderer) + return generateConstructorParameter(project, descriptor, renderer, mode == MemberGenerateMode.OVERRIDE) } val newMember: KtCallableDeclaration = when (descriptor) { - is FunctionDescriptor -> generateFunction(project, descriptor, renderer, bodyType) - is PropertyDescriptor -> generateProperty(project, descriptor, renderer, bodyType) + is FunctionDescriptor -> generateFunction(project, descriptor, renderer, bodyType, mode == MemberGenerateMode.OVERRIDE) + is PropertyDescriptor -> generateProperty(project, descriptor, renderer, bodyType, mode == MemberGenerateMode.OVERRIDE) else -> error("Unknown member to override: $descriptor") } - when { - forceActual -> newMember.addModifier(KtTokens.ACTUAL_KEYWORD) - forceExpect -> if (targetClass == null) { + when (mode) { + MemberGenerateMode.ACTUAL -> newMember.addModifier(KtTokens.ACTUAL_KEYWORD) + MemberGenerateMode.EXPECT -> if (targetClass == null) { newMember.addModifier(KtTokens.EXPECT_KEYWORD) } - targetClass?.hasActualModifier() == true -> { - val expectClassDescriptors = - targetClass.resolveToDescriptorIfAny()?.expectedDescriptors()?.filterIsInstance().orEmpty() - if (expectClassDescriptors.any { expectClassDescriptor -> - val expectMemberDescriptor = expectClassDescriptor.findCallableMemberBySignature(immediateSuper) - expectMemberDescriptor?.isExpect == true && expectMemberDescriptor.kind != CallableMemberDescriptor.Kind.FAKE_OVERRIDE + MemberGenerateMode.OVERRIDE -> { + if (targetClass?.hasActualModifier() == true) { + val expectClassDescriptors = + targetClass.resolveToDescriptorIfAny()?.expectedDescriptors()?.filterIsInstance().orEmpty() + if (expectClassDescriptors.any { expectClassDescriptor -> + val expectMemberDescriptor = expectClassDescriptor.findCallableMemberBySignature(immediateSuper) + expectMemberDescriptor?.isExpect == true && expectMemberDescriptor.kind != CallableMemberDescriptor.Kind.FAKE_OVERRIDE + } + ) { + newMember.addModifier(KtTokens.ACTUAL_KEYWORD) } - ) { - newMember.addModifier(KtTokens.ACTUAL_KEYWORD) } } } @@ -268,9 +277,10 @@ private fun generateProperty( project: Project, descriptor: PropertyDescriptor, renderer: DescriptorRenderer, - bodyType: OverrideMemberChooserObject.BodyType + bodyType: OverrideMemberChooserObject.BodyType, + forceOverride: Boolean ): KtProperty { - val newDescriptor = descriptor.wrap(forceOverride = renderer === OVERRIDE_RENDERER) + val newDescriptor = descriptor.wrap(forceOverride) val returnType = descriptor.returnType val returnsNotUnit = returnType != null && !KotlinBuiltIns.isUnit(returnType) @@ -289,8 +299,13 @@ private fun generateProperty( return KtPsiFactory(project).createProperty(renderer.render(newDescriptor) + body) } -private fun generateConstructorParameter(project: Project, descriptor: PropertyDescriptor, renderer: DescriptorRenderer): KtParameter { - val newDescriptor = descriptor.wrap(forceOverride = renderer === OVERRIDE_RENDERER) +private fun generateConstructorParameter( + project: Project, + descriptor: PropertyDescriptor, + renderer: DescriptorRenderer, + forceOverride: Boolean +): KtParameter { + val newDescriptor = descriptor.wrap(forceOverride) newDescriptor.setSingleOverridden(descriptor) return KtPsiFactory(project).createParameter(renderer.render(newDescriptor)) } @@ -299,9 +314,10 @@ private fun generateFunction( project: Project, descriptor: FunctionDescriptor, renderer: DescriptorRenderer, - bodyType: OverrideMemberChooserObject.BodyType + bodyType: OverrideMemberChooserObject.BodyType, + forceOverride: Boolean ): KtFunction { - val newDescriptor = descriptor.wrap(forceOverride = renderer === OVERRIDE_RENDERER) + val newDescriptor = descriptor.wrap(forceOverride) val returnType = descriptor.returnType val returnsNotUnit = returnType != null && !KotlinBuiltIns.isUnit(returnType) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt index 7afce9755be..f52171f0809 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt @@ -244,8 +244,7 @@ internal fun generateFunction( targetClass = generatedClass, copyDoc = true, project = project, - forceActual = !generateExpect, - forceExpect = generateExpect + mode = if (generateExpect) MemberGenerateMode.EXPECT else MemberGenerateMode.ACTUAL ) as KtFunction } @@ -270,8 +269,7 @@ internal fun generateProperty( targetClass = generatedClass, copyDoc = true, project = project, - forceActual = !generateExpect, - forceExpect = generateExpect + mode = if (generateExpect) MemberGenerateMode.EXPECT else MemberGenerateMode.ACTUAL ) as KtProperty }