Use representative upper bound in JetTypeMapper instead of just the first
This commit is contained in:
@@ -509,10 +509,9 @@ public class JetTypeMapper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (descriptor instanceof TypeParameterDescriptor) {
|
if (descriptor instanceof TypeParameterDescriptor) {
|
||||||
TypeParameterDescriptor typeParameterDescriptor = (TypeParameterDescriptor) descriptor;
|
Type type = mapType(getRepresentativeUpperBound((TypeParameterDescriptor) descriptor), kind);
|
||||||
Type type = mapType(typeParameterDescriptor.getUpperBounds().iterator().next(), kind);
|
|
||||||
if (signatureVisitor != null) {
|
if (signatureVisitor != null) {
|
||||||
signatureVisitor.writeTypeVariable(typeParameterDescriptor.getName(), type);
|
signatureVisitor.writeTypeVariable(descriptor.getName(), type);
|
||||||
}
|
}
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
@@ -520,6 +519,18 @@ public class JetTypeMapper {
|
|||||||
throw new UnsupportedOperationException("Unknown type " + jetType);
|
throw new UnsupportedOperationException("Unknown type " + jetType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private static KotlinType getRepresentativeUpperBound(@NotNull TypeParameterDescriptor descriptor) {
|
||||||
|
List<KotlinType> upperBounds = descriptor.getUpperBounds();
|
||||||
|
assert !upperBounds.isEmpty() : "Upper bounds should not be empty: " + descriptor;
|
||||||
|
for (KotlinType upperBound : upperBounds) {
|
||||||
|
if (!isJvmInterface(upperBound)) {
|
||||||
|
return upperBound;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return CollectionsKt.first(upperBounds);
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private static Type mapBuiltinType(@NotNull KotlinType type) {
|
private static Type mapBuiltinType(@NotNull KotlinType type) {
|
||||||
DeclarationDescriptor descriptor = type.getConstructor().getDeclarationDescriptor();
|
DeclarationDescriptor descriptor = type.getConstructor().getDeclarationDescriptor();
|
||||||
|
|||||||
+29
@@ -0,0 +1,29 @@
|
|||||||
|
interface I1
|
||||||
|
interface I2
|
||||||
|
open class C
|
||||||
|
|
||||||
|
interface K {
|
||||||
|
// Erasure of a type parameter with multiple bounds should be the class bound, or the first bound if there's no class bound
|
||||||
|
|
||||||
|
fun <T> c1(t: T) where T : C, T : I1, T : I2
|
||||||
|
fun <T> c2(t: T) where T : I1, T : C, T : I2
|
||||||
|
fun <T> c3(t: T) where T : I2, T : C, T : I1
|
||||||
|
fun <T> c4(t: T) where T : I2, T : I1, T : C
|
||||||
|
|
||||||
|
fun <T> i1(t: T) where T : I1, T : I2
|
||||||
|
fun <T> i2(t: T) where T : I2, T : I1
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val k = K::class.java
|
||||||
|
|
||||||
|
k.getDeclaredMethod("c1", C::class.java)
|
||||||
|
k.getDeclaredMethod("c2", C::class.java)
|
||||||
|
k.getDeclaredMethod("c3", C::class.java)
|
||||||
|
k.getDeclaredMethod("c4", C::class.java)
|
||||||
|
|
||||||
|
k.getDeclaredMethod("i1", I1::class.java)
|
||||||
|
k.getDeclaredMethod("i2", I2::class.java)
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+6
@@ -4740,6 +4740,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode
|
|||||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/typeMapping/genericTypeWithNothing.kt");
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/typeMapping/genericTypeWithNothing.kt");
|
||||||
doTestWithStdlib(fileName);
|
doTestWithStdlib(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("typeParameterMultipleBounds.kt")
|
||||||
|
public void testTypeParameterMultipleBounds() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/typeMapping/typeParameterMultipleBounds.kt");
|
||||||
|
doTestWithStdlib(fileName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("compiler/testData/codegen/boxWithStdlib/vararg")
|
@TestMetadata("compiler/testData/codegen/boxWithStdlib/vararg")
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.resolve;
|
package org.jetbrains.kotlin.resolve;
|
||||||
|
|
||||||
|
import kotlin.CollectionsKt;
|
||||||
import kotlin.jvm.functions.Function1;
|
import kotlin.jvm.functions.Function1;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|||||||
Reference in New Issue
Block a user