diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java index 051a85750c9..26b165cbd94 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java @@ -36,12 +36,13 @@ import org.jetbrains.kotlin.fileClasses.FileClasses; import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil; import org.jetbrains.kotlin.fileClasses.JvmFileClassesProvider; import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature; -import org.jetbrains.kotlin.load.java.SpecialBuiltinMembers; -import org.jetbrains.kotlin.load.java.JvmAbi; import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature.SpecialSignatureInfo; +import org.jetbrains.kotlin.load.java.JvmAbi; +import org.jetbrains.kotlin.load.java.SpecialBuiltinMembers; import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor; import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor; import org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaPackageScope; +import org.jetbrains.kotlin.load.java.sources.JavaSourceElement; import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackageFragmentProvider; import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache; import org.jetbrains.kotlin.name.*; @@ -782,7 +783,7 @@ public class JetTypeMapper { FunctionDescriptor overriddenSpecialBuiltinFunction = SpecialBuiltinMembers.getOverriddenBuiltinWithDifferentJvmDescriptor(functionDescriptor.getOriginal()); - FunctionDescriptor functionToCall = overriddenSpecialBuiltinFunction != null + FunctionDescriptor functionToCall = overriddenSpecialBuiltinFunction != null && !superCall ? overriddenSpecialBuiltinFunction.getOriginal() : functionDescriptor.getOriginal(); @@ -943,6 +944,15 @@ public class JetTypeMapper { @NotNull public JvmMethodSignature mapSignature(@NotNull FunctionDescriptor f, @NotNull OwnerKind kind) { + if (f.getOriginal().getSource() instanceof JavaSourceElement) { + FunctionDescriptor overridden = SpecialBuiltinMembers.getOverriddenBuiltinWithDifferentJvmDescriptor(f); + if (overridden != null + && !SpecialBuiltinMembers.hasRealKotlinSuperClassWithOverrideOf( + (ClassDescriptor) f.getContainingDeclaration(), overridden) + ) { + return mapSignature(overridden, kind, overridden.getValueParameters()); + } + } if (f instanceof ConstructorDescriptor) { return mapSignature(f, kind, f.getOriginal().getValueParameters()); } diff --git a/compiler/testData/codegen/boxWithJava/collections/implementCollectionThroughKotlin/J.java b/compiler/testData/codegen/boxWithJava/collections/implementCollectionThroughKotlin/J.java new file mode 100644 index 00000000000..632b22f68a3 --- /dev/null +++ b/compiler/testData/codegen/boxWithJava/collections/implementCollectionThroughKotlin/J.java @@ -0,0 +1,64 @@ +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; + +public class J extends MyList { + @Override + public int getSize() { + return 55; + } + + @Override + public int lastIndexOf(String s) { + return 0; + } + + @Override + public int indexOf(String s) { + return 0; + } + + @Override + public boolean contains(String s) { + return true; + } + + @Override + public boolean isEmpty() { + return false; + } + + @NotNull + @Override + public Iterator iterator() { + return null; + } + + @Override + public boolean containsAll(Collection c) { + return false; + } + + @Override + public String get(int index) { + return null; + } + + @Override + public List subList(int i, int i1) { + return super.subList(i, i1); + } + + @Override + public ListIterator listIterator(int i) { + return super.listIterator(i); + } + + @Override + public ListIterator listIterator() { + return super.listIterator(); + } +} diff --git a/compiler/testData/codegen/boxWithJava/collections/implementCollectionThroughKotlin/implementCollectionThroughKotlin.kt b/compiler/testData/codegen/boxWithJava/collections/implementCollectionThroughKotlin/implementCollectionThroughKotlin.kt new file mode 100644 index 00000000000..499ac0043b0 --- /dev/null +++ b/compiler/testData/codegen/boxWithJava/collections/implementCollectionThroughKotlin/implementCollectionThroughKotlin.kt @@ -0,0 +1,26 @@ +abstract class MyList : List + +class ListImpl : J() { + override val size: Int get() = super.size + 1 +} + +fun box(): String { + val impl = ListImpl() + if (impl.size != 56) return "fail 1" + if (!impl.contains("abc")) return "fail 2" + + val l: List = impl + + if (l.size != 56) return "fail 3" + if (!l.contains("abc")) return "fail 4" + + val anyList: List = impl as List + + if (anyList.size != 56) return "fail 5" + if (!anyList.contains("abc")) return "fail 6" + + if (anyList.contains(1)) return "fail 7" + if (anyList.contains(null)) return "fail 8" + + return "OK" +} diff --git a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/mapGetOverride.txt b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/mapGetOverride.txt index 2dbd31c11eb..622bd8572f7 100644 --- a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/mapGetOverride.txt +++ b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/mapGetOverride.txt @@ -15,7 +15,7 @@ public abstract class MyMap : java.util.AbstractMap