From 25d75bcd8bae2a0b3df545331cbff924a3fd1f97 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Wed, 25 Jan 2017 17:32:44 +0100 Subject: [PATCH] Delegates to java defaults methods in compatibility mode --- .../kotlin/resolve/jvm/JvmDelegationFilter.kt | 5 ++++- .../kotlin/resolve/DelegationResolver.kt | 11 ++++++---- .../kotlin/resolve/lazy/DelegationFilter.kt | 5 +++-- .../lazy/descriptors/LazyClassMemberScope.kt | 3 ++- .../java8/box/delegationBy/simple1.0.kt | 22 +++++++++++++++++++ ...BlackBoxWithJava8CodegenTestGenerated.java | 6 +++++ 6 files changed, 44 insertions(+), 8 deletions(-) create mode 100644 compiler/testData/codegen/java8/box/delegationBy/simple1.0.kt diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JvmDelegationFilter.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JvmDelegationFilter.kt index 11d08480873..07fa2fe4fc0 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JvmDelegationFilter.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JvmDelegationFilter.kt @@ -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) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegationResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegationResolver.kt index 323e78344e4..78915ba888a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegationResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegationResolver.kt @@ -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 private constructor( private val trace: BindingTrace, private val memberExtractor: MemberExtractor, private val typeResolver: TypeResolver, - private val delegationFilter: DelegationFilter + private val delegationFilter: DelegationFilter, + private val languageVersionSettings: LanguageVersionSettings ) { private fun generateDelegatedMembers(): Collection { @@ -93,7 +95,7 @@ class DelegationResolver 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 private constructor( trace: BindingTrace, memberExtractor: MemberExtractor, typeResolver: TypeResolver, - delegationFilter: DelegationFilter + delegationFilter: DelegationFilter, + languageVersionSettings: LanguageVersionSettings ): Collection = - DelegationResolver(classOrObject, ownerDescriptor, existingMembers, trace, memberExtractor, typeResolver, delegationFilter) + DelegationResolver(classOrObject, ownerDescriptor, existingMembers, trace, memberExtractor, typeResolver, delegationFilter, languageVersionSettings) .generateDelegatedMembers() private fun isOverridingAnyOf( diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/DelegationFilter.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/DelegationFilter.kt index ba8ca3d315d..c81f48219a9 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/DelegationFilter.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/DelegationFilter.kt @@ -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 } } \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt index bd6d04f8a45..37a560bb6ae 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt @@ -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 ) } diff --git a/compiler/testData/codegen/java8/box/delegationBy/simple1.0.kt b/compiler/testData/codegen/java8/box/delegationBy/simple1.0.kt new file mode 100644 index 00000000000..b9c160e7ab9 --- /dev/null +++ b/compiler/testData/codegen/java8/box/delegationBy/simple1.0.kt @@ -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() +} diff --git a/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/BlackBoxWithJava8CodegenTestGenerated.java b/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/BlackBoxWithJava8CodegenTestGenerated.java index 63364a783bd..12312667208 100644 --- a/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/BlackBoxWithJava8CodegenTestGenerated.java +++ b/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/BlackBoxWithJava8CodegenTestGenerated.java @@ -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")