OverrideMemberChooserObject refactoring: introduce MemberGenerateMode
This commit is contained in:
+44
-28
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user