Remove @JvmDefault members from delegation

This commit is contained in:
Mikhael Bogdanov
2018-03-01 13:11:57 +01:00
parent d84a15c0f6
commit f290b325ee
13 changed files with 116 additions and 32 deletions
@@ -24,6 +24,8 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.deserialization.PLATFORM_DEPENDENT_ANNOTATION_FQ_NAME
import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.jvm.annotations.hasJvmDefaultAnnotation
import org.jetbrains.kotlin.resolve.jvm.annotations.hasJvmFieldAnnotation
import org.jetbrains.kotlin.resolve.lazy.DelegationFilter
object JvmDelegationFilter : DelegationFilter {
@@ -33,7 +35,9 @@ object JvmDelegationFilter : DelegationFilter {
//We always have only one implementation otherwise it's an error in kotlin and java
val realMember = DescriptorUtils.unwrapFakeOverride(interfaceMember)
return !isJavaDefaultMethod(realMember) && !isBuiltInMemberMappedToJavaDefault(realMember)
return !isJavaDefaultMethod(realMember) &&
!realMember.hasJvmDefaultAnnotation() &&
!isBuiltInMemberMappedToJavaDefault(realMember)
}
private fun isJavaDefaultMethod(interfaceMember: CallableMemberDescriptor): Boolean {
@@ -16,9 +16,11 @@
package org.jetbrains.kotlin.resolve.jvm.annotations
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.jvm.checkers.JvmDefaultChecker
fun DeclarationDescriptor.findJvmOverloadsAnnotation() = annotations.findAnnotation(FqName("kotlin.jvm.JvmOverloads"))
@@ -26,4 +28,11 @@ fun DeclarationDescriptor.findJvmFieldAnnotation() = DescriptorUtils.getAnnotati
fun DeclarationDescriptor.hasJvmFieldAnnotation(): Boolean {
return findJvmFieldAnnotation() != null
}
}
fun CallableMemberDescriptor.hasJvmDefaultAnnotation() =
DescriptorUtils.getDirectMember(this).annotations.hasAnnotation(JvmDefaultChecker.JVM_DEFAULT_FQ_NAME)
fun DeclarationDescriptor.isCallableMemberWithJvmDefaultAnnotation() =
(this as? CallableMemberDescriptor)?.hasJvmDefaultAnnotation() ?: false