Delegates to java defaults methods in compatibility mode

This commit is contained in:
Mikhael Bogdanov
2017-01-25 17:32:44 +01:00
parent 0006a04b01
commit 25d75bcd8b
6 changed files with 44 additions and 8 deletions
@@ -17,6 +17,8 @@
package org.jetbrains.kotlin.resolve.jvm
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor
@@ -26,7 +28,8 @@ import org.jetbrains.kotlin.serialization.deserialization.PLATFORM_DEPENDENT_ANN
object JvmDelegationFilter : DelegationFilter {
override fun filter(interfaceMember: CallableMemberDescriptor): Boolean {
override fun filter(interfaceMember: CallableMemberDescriptor, languageVersionSettings: LanguageVersionSettings): Boolean {
if (languageVersionSettings.languageVersion == LanguageVersion.KOTLIN_1_0) return true
//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)
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.resolve
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DELEGATION
import org.jetbrains.kotlin.diagnostics.Errors.MANY_IMPL_MEMBER_NOT_IMPLEMENTED
@@ -38,7 +39,8 @@ class DelegationResolver<T : CallableMemberDescriptor> private constructor(
private val trace: BindingTrace,
private val memberExtractor: MemberExtractor<T>,
private val typeResolver: TypeResolver,
private val delegationFilter: DelegationFilter
private val delegationFilter: DelegationFilter,
private val languageVersionSettings: LanguageVersionSettings
) {
private fun generateDelegatedMembers(): Collection<T> {
@@ -93,7 +95,7 @@ class DelegationResolver<T : CallableMemberDescriptor> private constructor(
return memberExtractor.getMembersByType(interfaceType).filter { descriptor ->
descriptor.isOverridable &&
!classSupertypeMembers.any { isOverridableBy(it, descriptor) } &&
delegationFilter.filter(descriptor)
delegationFilter.filter(descriptor, languageVersionSettings)
}
}
@@ -113,9 +115,10 @@ class DelegationResolver<T : CallableMemberDescriptor> private constructor(
trace: BindingTrace,
memberExtractor: MemberExtractor<T>,
typeResolver: TypeResolver,
delegationFilter: DelegationFilter
delegationFilter: DelegationFilter,
languageVersionSettings: LanguageVersionSettings
): Collection<T> =
DelegationResolver(classOrObject, ownerDescriptor, existingMembers, trace, memberExtractor, typeResolver, delegationFilter)
DelegationResolver(classOrObject, ownerDescriptor, existingMembers, trace, memberExtractor, typeResolver, delegationFilter, languageVersionSettings)
.generateDelegatedMembers()
private fun isOverridingAnyOf(
@@ -16,13 +16,14 @@
package org.jetbrains.kotlin.resolve.lazy
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
interface DelegationFilter {
fun filter(interfaceMember: CallableMemberDescriptor): Boolean
fun filter(interfaceMember: CallableMemberDescriptor, languageVersionSettings: LanguageVersionSettings): Boolean
object DEFAULT : DelegationFilter {
override fun filter(interfaceMember: CallableMemberDescriptor) = true
override fun filter(interfaceMember: CallableMemberDescriptor, languageVersionSettings: LanguageVersionSettings) = true
}
}
@@ -295,7 +295,8 @@ open class LazyClassMemberScope(
extractor.extract(type, name)
}
return DelegationResolver.generateDelegatedMembers(
classOrObject, thisDescriptor, existingDescriptors, trace, lazyMemberExtractor, lazyTypeResolver, c.delegationFilter
classOrObject, thisDescriptor, existingDescriptors, trace, lazyMemberExtractor,
lazyTypeResolver, c.delegationFilter, c.languageVersionSettings
)
}
@@ -0,0 +1,22 @@
// LANGUAGE_VERSION: 1.0
// FILE: Base.java
public interface Base {
String getValue();
default String test() {
return getValue();
}
}
// FILE: main.kt
class OK : Base {
override fun getValue() = "OK"
}
fun box(): String {
val z = object : Base by OK() {
override fun getValue() = "Fail"
}
return z.test()
}
@@ -181,6 +181,12 @@ public class BlackBoxWithJava8CodegenTestGenerated extends AbstractBlackBoxCodeg
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/java8/box/delegationBy/simple.kt");
doTest(fileName);
}
@TestMetadata("simple1.0.kt")
public void testSimple1_0() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/java8/box/delegationBy/simple1.0.kt");
doTest(fileName);
}
}
@TestMetadata("compiler/testData/codegen/java8/box/jvm8")