Exclude builtins members mapped to java default methods from delegation

This commit is contained in:
Mikhael Bogdanov
2017-01-19 16:48:22 +01:00
parent 03a697a707
commit da1b8a02ed
3 changed files with 39 additions and 1 deletions
@@ -16,20 +16,29 @@
package org.jetbrains.kotlin.resolve.jvm
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.lazy.DelegationFilter
import org.jetbrains.kotlin.serialization.deserialization.PLATFORM_DEPENDENT_ANNOTATION_FQ_NAME
object JvmDelegationFilter : DelegationFilter {
override fun filter(interfaceMember: CallableMemberDescriptor): Boolean {
//We always have only one implementation otherwise it's an error in kotlin and java
return !isJavaDefaultMethod(DescriptorUtils.unwrapFakeOverride(interfaceMember))
val realMember = DescriptorUtils.unwrapFakeOverride(interfaceMember)
return !isJavaDefaultMethod(realMember) && !isBuiltInMemberMappedToJavaDefault(realMember)
}
private fun isJavaDefaultMethod(interfaceMember: CallableMemberDescriptor): Boolean {
return interfaceMember is JavaMethodDescriptor && interfaceMember.modality != Modality.ABSTRACT
}
private fun isBuiltInMemberMappedToJavaDefault(interfaceMember: CallableMemberDescriptor): Boolean {
return interfaceMember.modality != Modality.ABSTRACT &&
KotlinBuiltIns.isBuiltIn(interfaceMember) &&
interfaceMember.annotations.hasAnnotation(PLATFORM_DEPENDENT_ANNOTATION_FQ_NAME)
}
}