diff --git a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/sizeFromKotlinOverriddenInJava.kt b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/sizeFromKotlinOverriddenInJava.kt new file mode 100644 index 00000000000..bd214138ce0 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/sizeFromKotlinOverriddenInJava.kt @@ -0,0 +1,13 @@ +// FILE: A.java + +abstract public class A extends MyList { + int getSize() { return 0; } +} + +// FILE: main.kt + +abstract class MyList : Collection {} + +fun main(a: A) { + a.size +} diff --git a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/sizeFromKotlinOverriddenInJava.txt b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/sizeFromKotlinOverriddenInJava.txt new file mode 100644 index 00000000000..a4c9bcde85d --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/sizeFromKotlinOverriddenInJava.txt @@ -0,0 +1,27 @@ +package + +public fun main(/*0*/ a: A): kotlin.Unit + +public abstract class A : MyList { + public constructor A() + public/*package*/ open override /*1*/ val size: kotlin.Int + public abstract override /*1*/ /*fake_override*/ fun contains(/*0*/ element: F!): kotlin.Boolean + public abstract override /*1*/ /*fake_override*/ fun containsAll(/*0*/ elements: kotlin.Collection): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public abstract override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean + public abstract override /*1*/ /*fake_override*/ fun iterator(): kotlin.Iterator + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public abstract class MyList : kotlin.Collection { + public constructor MyList() + public abstract override /*1*/ /*fake_override*/ val size: kotlin.Int + public abstract override /*1*/ /*fake_override*/ fun contains(/*0*/ element: G): kotlin.Boolean + public abstract override /*1*/ /*fake_override*/ fun containsAll(/*0*/ elements: kotlin.Collection): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public abstract override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean + public abstract override /*1*/ /*fake_override*/ fun iterator(): kotlin.Iterator + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index 86ba0d3d555..5e3eb477c04 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -9319,6 +9319,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/j+k/collectionOverrides/removeAtInt.kt"); doTest(fileName); } + + @TestMetadata("sizeFromKotlinOverriddenInJava.kt") + public void testSizeFromKotlinOverriddenInJava() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/j+k/collectionOverrides/sizeFromKotlinOverriddenInJava.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/diagnostics/tests/j+k/properties") diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt index ef381a13f4c..f3ba0be1075 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt @@ -151,8 +151,12 @@ public class LazyJavaClassMemberScope( } private fun PropertyDescriptor.findGetterOverride(): JavaMethodDescriptor? { - val specialGetterName = getter?.getOverriddenBuiltinWithDifferentJvmName()?.getBuiltinSpecialPropertyGetterName() - if (specialGetterName != null) { + val overriddenBuiltinProperty = getter?.getOverriddenBuiltinWithDifferentJvmName() + val specialGetterName = overriddenBuiltinProperty?.getBuiltinSpecialPropertyGetterName() + if (specialGetterName != null + && !this@LazyJavaClassMemberScope.getContainingDeclaration().hasRealKotlinSuperClassWithOverrideOf( + overriddenBuiltinProperty!!) + ) { return findGetterByName(specialGetterName) }