Delegates to java defaults methods in compatibility mode
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -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()
|
||||
}
|
||||
+6
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user