Delegates to java defaults methods in compatibility mode
This commit is contained in:
@@ -17,6 +17,8 @@
|
|||||||
package org.jetbrains.kotlin.resolve.jvm
|
package org.jetbrains.kotlin.resolve.jvm
|
||||||
|
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
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.CallableMemberDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor
|
import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor
|
||||||
@@ -26,7 +28,8 @@ import org.jetbrains.kotlin.serialization.deserialization.PLATFORM_DEPENDENT_ANN
|
|||||||
|
|
||||||
object JvmDelegationFilter : DelegationFilter {
|
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
|
//We always have only one implementation otherwise it's an error in kotlin and java
|
||||||
val realMember = DescriptorUtils.unwrapFakeOverride(interfaceMember)
|
val realMember = DescriptorUtils.unwrapFakeOverride(interfaceMember)
|
||||||
return !isJavaDefaultMethod(realMember) && !isBuiltInMemberMappedToJavaDefault(realMember)
|
return !isJavaDefaultMethod(realMember) && !isBuiltInMemberMappedToJavaDefault(realMember)
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.resolve
|
package org.jetbrains.kotlin.resolve
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DELEGATION
|
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DELEGATION
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors.MANY_IMPL_MEMBER_NOT_IMPLEMENTED
|
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 trace: BindingTrace,
|
||||||
private val memberExtractor: MemberExtractor<T>,
|
private val memberExtractor: MemberExtractor<T>,
|
||||||
private val typeResolver: TypeResolver,
|
private val typeResolver: TypeResolver,
|
||||||
private val delegationFilter: DelegationFilter
|
private val delegationFilter: DelegationFilter,
|
||||||
|
private val languageVersionSettings: LanguageVersionSettings
|
||||||
) {
|
) {
|
||||||
|
|
||||||
private fun generateDelegatedMembers(): Collection<T> {
|
private fun generateDelegatedMembers(): Collection<T> {
|
||||||
@@ -93,7 +95,7 @@ class DelegationResolver<T : CallableMemberDescriptor> private constructor(
|
|||||||
return memberExtractor.getMembersByType(interfaceType).filter { descriptor ->
|
return memberExtractor.getMembersByType(interfaceType).filter { descriptor ->
|
||||||
descriptor.isOverridable &&
|
descriptor.isOverridable &&
|
||||||
!classSupertypeMembers.any { isOverridableBy(it, descriptor) } &&
|
!classSupertypeMembers.any { isOverridableBy(it, descriptor) } &&
|
||||||
delegationFilter.filter(descriptor)
|
delegationFilter.filter(descriptor, languageVersionSettings)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -113,9 +115,10 @@ class DelegationResolver<T : CallableMemberDescriptor> private constructor(
|
|||||||
trace: BindingTrace,
|
trace: BindingTrace,
|
||||||
memberExtractor: MemberExtractor<T>,
|
memberExtractor: MemberExtractor<T>,
|
||||||
typeResolver: TypeResolver,
|
typeResolver: TypeResolver,
|
||||||
delegationFilter: DelegationFilter
|
delegationFilter: DelegationFilter,
|
||||||
|
languageVersionSettings: LanguageVersionSettings
|
||||||
): Collection<T> =
|
): Collection<T> =
|
||||||
DelegationResolver(classOrObject, ownerDescriptor, existingMembers, trace, memberExtractor, typeResolver, delegationFilter)
|
DelegationResolver(classOrObject, ownerDescriptor, existingMembers, trace, memberExtractor, typeResolver, delegationFilter, languageVersionSettings)
|
||||||
.generateDelegatedMembers()
|
.generateDelegatedMembers()
|
||||||
|
|
||||||
private fun isOverridingAnyOf(
|
private fun isOverridingAnyOf(
|
||||||
|
|||||||
@@ -16,13 +16,14 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.resolve.lazy
|
package org.jetbrains.kotlin.resolve.lazy
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
||||||
|
|
||||||
interface DelegationFilter {
|
interface DelegationFilter {
|
||||||
|
|
||||||
fun filter(interfaceMember: CallableMemberDescriptor): Boolean
|
fun filter(interfaceMember: CallableMemberDescriptor, languageVersionSettings: LanguageVersionSettings): Boolean
|
||||||
|
|
||||||
object DEFAULT : DelegationFilter {
|
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)
|
extractor.extract(type, name)
|
||||||
}
|
}
|
||||||
return DelegationResolver.generateDelegatedMembers(
|
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");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/java8/box/delegationBy/simple.kt");
|
||||||
doTest(fileName);
|
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")
|
@TestMetadata("compiler/testData/codegen/java8/box/jvm8")
|
||||||
|
|||||||
Reference in New Issue
Block a user