OverrideMemberChooserObject refactoring: introduce MemberGenerateMode

This commit is contained in:
Mikhail Glukhikh
2018-12-19 16:26:14 +03:00
parent ca3d758fba
commit 93882736ed
2 changed files with 46 additions and 32 deletions
@@ -119,30 +119,37 @@ interface OverrideMemberChooserObject : ClassMember {
} }
} }
enum class MemberGenerateMode {
OVERRIDE,
ACTUAL,
EXPECT
}
fun OverrideMemberChooserObject.generateMember( fun OverrideMemberChooserObject.generateMember(
targetClass: KtClassOrObject, targetClass: KtClassOrObject,
copyDoc: Boolean copyDoc: Boolean
) = generateMember(targetClass, copyDoc, targetClass.project, forceActual = false, forceExpect = false) ) = generateMember(targetClass, copyDoc, targetClass.project, mode = MemberGenerateMode.OVERRIDE)
fun OverrideMemberChooserObject.generateMember( fun OverrideMemberChooserObject.generateMember(
targetClass: KtClassOrObject?, targetClass: KtClassOrObject?,
copyDoc: Boolean, copyDoc: Boolean,
project: Project, project: Project,
forceActual: Boolean, mode: MemberGenerateMode
forceExpect: Boolean
): KtCallableDeclaration { ): KtCallableDeclaration {
val descriptor = immediateSuper val descriptor = immediateSuper
val bodyType = when { val bodyType = when {
targetClass?.hasExpectModifier() == true -> NO_BODY targetClass?.hasExpectModifier() == true -> NO_BODY
descriptor.extensionReceiverParameter != null && !forceActual && !forceExpect -> FROM_TEMPLATE descriptor.extensionReceiverParameter != null && mode == MemberGenerateMode.OVERRIDE -> FROM_TEMPLATE
else -> bodyType else -> bodyType
} }
val renderer = if (!forceActual && !forceExpect) OVERRIDE_RENDERER else when { val baseRenderer = when (mode) {
forceActual -> ACTUAL_RENDERER MemberGenerateMode.OVERRIDE -> OVERRIDE_RENDERER
else -> EXPECT_RENDERER MemberGenerateMode.ACTUAL -> ACTUAL_RENDERER
}.withOptions { MemberGenerateMode.EXPECT -> EXPECT_RENDERER
}
val renderer = baseRenderer.withOptions {
if (descriptor is ClassConstructorDescriptor && descriptor.isPrimary) { if (descriptor is ClassConstructorDescriptor && descriptor.isPrimary) {
val containingClass = descriptor.containingDeclaration val containingClass = descriptor.containingDeclaration
if (containingClass.kind == ClassKind.ANNOTATION_CLASS || containingClass.isInline) { if (containingClass.kind == ClassKind.ANNOTATION_CLASS || containingClass.isInline) {
@@ -152,29 +159,31 @@ fun OverrideMemberChooserObject.generateMember(
} }
if (preferConstructorParameter && descriptor is PropertyDescriptor) { if (preferConstructorParameter && descriptor is PropertyDescriptor) {
return generateConstructorParameter(project, descriptor, renderer) return generateConstructorParameter(project, descriptor, renderer, mode == MemberGenerateMode.OVERRIDE)
} }
val newMember: KtCallableDeclaration = when (descriptor) { val newMember: KtCallableDeclaration = when (descriptor) {
is FunctionDescriptor -> generateFunction(project, descriptor, renderer, bodyType) is FunctionDescriptor -> generateFunction(project, descriptor, renderer, bodyType, mode == MemberGenerateMode.OVERRIDE)
is PropertyDescriptor -> generateProperty(project, descriptor, renderer, bodyType) is PropertyDescriptor -> generateProperty(project, descriptor, renderer, bodyType, mode == MemberGenerateMode.OVERRIDE)
else -> error("Unknown member to override: $descriptor") else -> error("Unknown member to override: $descriptor")
} }
when { when (mode) {
forceActual -> newMember.addModifier(KtTokens.ACTUAL_KEYWORD) MemberGenerateMode.ACTUAL -> newMember.addModifier(KtTokens.ACTUAL_KEYWORD)
forceExpect -> if (targetClass == null) { MemberGenerateMode.EXPECT -> if (targetClass == null) {
newMember.addModifier(KtTokens.EXPECT_KEYWORD) newMember.addModifier(KtTokens.EXPECT_KEYWORD)
} }
targetClass?.hasActualModifier() == true -> { MemberGenerateMode.OVERRIDE -> {
val expectClassDescriptors = if (targetClass?.hasActualModifier() == true) {
targetClass.resolveToDescriptorIfAny()?.expectedDescriptors()?.filterIsInstance<ClassDescriptor>().orEmpty() val expectClassDescriptors =
if (expectClassDescriptors.any { expectClassDescriptor -> targetClass.resolveToDescriptorIfAny()?.expectedDescriptors()?.filterIsInstance<ClassDescriptor>().orEmpty()
val expectMemberDescriptor = expectClassDescriptor.findCallableMemberBySignature(immediateSuper) if (expectClassDescriptors.any { expectClassDescriptor ->
expectMemberDescriptor?.isExpect == true && expectMemberDescriptor.kind != CallableMemberDescriptor.Kind.FAKE_OVERRIDE 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, project: Project,
descriptor: PropertyDescriptor, descriptor: PropertyDescriptor,
renderer: DescriptorRenderer, renderer: DescriptorRenderer,
bodyType: OverrideMemberChooserObject.BodyType bodyType: OverrideMemberChooserObject.BodyType,
forceOverride: Boolean
): KtProperty { ): KtProperty {
val newDescriptor = descriptor.wrap(forceOverride = renderer === OVERRIDE_RENDERER) val newDescriptor = descriptor.wrap(forceOverride)
val returnType = descriptor.returnType val returnType = descriptor.returnType
val returnsNotUnit = returnType != null && !KotlinBuiltIns.isUnit(returnType) val returnsNotUnit = returnType != null && !KotlinBuiltIns.isUnit(returnType)
@@ -289,8 +299,13 @@ private fun generateProperty(
return KtPsiFactory(project).createProperty(renderer.render(newDescriptor) + body) return KtPsiFactory(project).createProperty(renderer.render(newDescriptor) + body)
} }
private fun generateConstructorParameter(project: Project, descriptor: PropertyDescriptor, renderer: DescriptorRenderer): KtParameter { private fun generateConstructorParameter(
val newDescriptor = descriptor.wrap(forceOverride = renderer === OVERRIDE_RENDERER) project: Project,
descriptor: PropertyDescriptor,
renderer: DescriptorRenderer,
forceOverride: Boolean
): KtParameter {
val newDescriptor = descriptor.wrap(forceOverride)
newDescriptor.setSingleOverridden(descriptor) newDescriptor.setSingleOverridden(descriptor)
return KtPsiFactory(project).createParameter(renderer.render(newDescriptor)) return KtPsiFactory(project).createParameter(renderer.render(newDescriptor))
} }
@@ -299,9 +314,10 @@ private fun generateFunction(
project: Project, project: Project,
descriptor: FunctionDescriptor, descriptor: FunctionDescriptor,
renderer: DescriptorRenderer, renderer: DescriptorRenderer,
bodyType: OverrideMemberChooserObject.BodyType bodyType: OverrideMemberChooserObject.BodyType,
forceOverride: Boolean
): KtFunction { ): KtFunction {
val newDescriptor = descriptor.wrap(forceOverride = renderer === OVERRIDE_RENDERER) val newDescriptor = descriptor.wrap(forceOverride)
val returnType = descriptor.returnType val returnType = descriptor.returnType
val returnsNotUnit = returnType != null && !KotlinBuiltIns.isUnit(returnType) val returnsNotUnit = returnType != null && !KotlinBuiltIns.isUnit(returnType)
@@ -244,8 +244,7 @@ internal fun generateFunction(
targetClass = generatedClass, targetClass = generatedClass,
copyDoc = true, copyDoc = true,
project = project, project = project,
forceActual = !generateExpect, mode = if (generateExpect) MemberGenerateMode.EXPECT else MemberGenerateMode.ACTUAL
forceExpect = generateExpect
) as KtFunction ) as KtFunction
} }
@@ -270,8 +269,7 @@ internal fun generateProperty(
targetClass = generatedClass, targetClass = generatedClass,
copyDoc = true, copyDoc = true,
project = project, project = project,
forceActual = !generateExpect, mode = if (generateExpect) MemberGenerateMode.EXPECT else MemberGenerateMode.ACTUAL
forceExpect = generateExpect
) as KtProperty ) as KtProperty
} }