Kapt: Use correct type mapping mode while mapping super types (KT-27126)

This commit is contained in:
Yan Zhulanow
2018-09-28 21:06:44 +03:00
parent f6bf35c1f5
commit 39863edd0e
8 changed files with 251 additions and 3 deletions
@@ -137,7 +137,7 @@ class ErrorTypeCorrector(
//TODO figure out if the containing method is an annotation method
RETURN_TYPE -> TypeMappingMode.getOptimalModeForReturnType(kotlinType, false)
METHOD_PARAMETER_TYPE -> TypeMappingMode.getOptimalModeForValueParameter(kotlinType)
SUPER_TYPE -> TypeMappingMode.getOptimalModeForValueParameter(kotlinType)
SUPER_TYPE -> TypeMappingMode.SUPER_TYPE
}.updateArgumentModeFromAnnotations(kotlinType)
val typeParameters = (target as? ClassifierDescriptor)?.typeConstructor?.parameters
@@ -109,6 +109,11 @@ public class ClassFileToSourceStubConverterTestGenerated extends AbstractClassFi
runTest("plugins/kapt3/kapt3-compiler/testData/converter/functions.kt");
}
@TestMetadata("genericParameters.kt")
public void testGenericParameters() throws Exception {
runTest("plugins/kapt3/kapt3-compiler/testData/converter/genericParameters.kt");
}
@TestMetadata("genericRawSignatures.kt")
public void testGenericRawSignatures() throws Exception {
runTest("plugins/kapt3/kapt3-compiler/testData/converter/genericRawSignatures.kt");
@@ -239,6 +244,11 @@ public class ClassFileToSourceStubConverterTestGenerated extends AbstractClassFi
runTest("plugins/kapt3/kapt3-compiler/testData/converter/kt25071.kt");
}
@TestMetadata("kt27126.kt")
public void testKt27126() throws Exception {
runTest("plugins/kapt3/kapt3-compiler/testData/converter/kt27126.kt");
}
@TestMetadata("leadingDollars.kt")
public void testLeadingDollars() throws Exception {
runTest("plugins/kapt3/kapt3-compiler/testData/converter/leadingDollars.kt");
@@ -48,4 +48,8 @@ class Generics3 : Foo<Bar, Baz, Boo<Baz, List<*>>, String>
class MappedList<R>() : AbstractList<R>(), List<R> {
override fun get(index: Int) = throw RuntimeException()
override val size get() = 0
}
}
interface Parent<A : CharSequence?, B>
class Child : AbstractList<String>(), Parent<String, Int>, List<String>
@@ -2,6 +2,50 @@ package test;
import java.lang.System;
@kotlin.Metadata()
public final class Child extends kotlin.collections.AbstractList<java.lang.String> implements test.Parent<java.lang.String, java.lang.Integer>, java.util.List<java.lang.String> {
public Child() {
super();
}
@java.lang.Override()
public boolean contains(java.lang.String p0) {
return false;
}
@java.lang.Override()
public final boolean contains(java.lang.Object p0) {
return false;
}
@java.lang.Override()
public int indexOf(java.lang.String p0) {
return 0;
}
@java.lang.Override()
public final int indexOf(java.lang.Object p0) {
return 0;
}
@java.lang.Override()
public int lastIndexOf(java.lang.String p0) {
return 0;
}
@java.lang.Override()
public final int lastIndexOf(java.lang.Object p0) {
return 0;
}
}
////////////////////
package test;
import java.lang.System;
@kotlin.Metadata()
public class Cl {
@@ -69,7 +113,7 @@ package test;
import java.lang.System;
@kotlin.Metadata()
public final class MappedList<R extends java.lang.Object> extends kotlin.collections.AbstractList<R> implements java.util.List<? extends R> {
public final class MappedList<R extends java.lang.Object> extends kotlin.collections.AbstractList<R> implements java.util.List<R> {
@org.jetbrains.annotations.NotNull()
@java.lang.Override()
@@ -93,6 +137,16 @@ package test;
import java.lang.System;
@kotlin.Metadata()
public abstract interface Parent<A extends java.lang.CharSequence, B extends java.lang.Object> {
}
////////////////////
package test;
import java.lang.System;
@kotlin.Metadata()
public final class TBarBazCl extends test.Cl implements Bar, Baz {
@@ -0,0 +1,7 @@
// CORRECT_ERROR_TYPES
// WITH_RUNTIME
class MappedList<out T, R>(val list: List<T>, private val function: (T) -> R) : AbstractList<R>(), List<R> {
override fun get(index: Int) = function(list[index])
override val size get() = list.size
}
@@ -0,0 +1,29 @@
import java.lang.System;
@kotlin.Metadata()
public final class MappedList<T extends java.lang.Object, R extends java.lang.Object> extends kotlin.collections.AbstractList<R> implements java.util.List<R> {
@org.jetbrains.annotations.NotNull()
private final java.util.List<T> list = null;
private final kotlin.jvm.functions.Function1<T, R> function = null;
@java.lang.Override()
public R get(int index) {
return null;
}
@java.lang.Override()
public int getSize() {
return 0;
}
@org.jetbrains.annotations.NotNull()
public final java.util.List<T> getList() {
return null;
}
public MappedList(@org.jetbrains.annotations.NotNull()
java.util.List<? extends T> list, @org.jetbrains.annotations.NotNull()
kotlin.jvm.functions.Function1<? super T, ? extends R> function) {
super();
}
}
@@ -0,0 +1,40 @@
// WITH_RUNTIME
@file:Suppress("NOTHING_TO_INLINE")
package test
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
inline fun charSequence(key: String? = null) = object : BundleProperty<CharSequence>(key) {
override fun getValue(bundle: Any, key: String): CharSequence? = TODO()
override fun setValue(bundle: Any, key: String, value: CharSequence) {}
}
abstract class NullableBundleProperty<EE>(private val key: String?) : ReadWriteProperty<Any, EE?> {
private inline fun KProperty<*>.toKey(): String {
return toString()
}
override fun getValue(thisRef: Any, property: KProperty<*>): EE? = getValue(thisRef, key ?: property.toKey())
override fun setValue(thisRef: Any, property: KProperty<*>, value: EE?) {
setNullableValue(thisRef, key ?: property.toKey(), value)
}
abstract fun getValue(bundle: Any, key: String): EE?
abstract fun setNullableValue(bundle: Any, key: String, value: EE?)
}
abstract class BundleProperty<AA>(key: String?) : NullableBundleProperty<AA>(key) {
final override fun setValue(thisRef: Any, property: KProperty<*>, value: AA?) {
super.setValue(thisRef, property, value)
}
final override fun getValue(thisRef: Any, property: KProperty<*>): AA = super.getValue(thisRef, property)!!
final override fun setNullableValue(bundle: Any, key: String, value: AA?) {
setValue(bundle, key, value!!)
}
abstract fun setValue(bundle: Any, key: String, value: AA)
}
@@ -0,0 +1,104 @@
package test;
import java.lang.System;
@kotlin.Metadata()
public abstract class BundleProperty<AA extends java.lang.Object> extends test.NullableBundleProperty<AA> {
@java.lang.Override()
public final void setValue(@org.jetbrains.annotations.NotNull()
java.lang.Object thisRef, @org.jetbrains.annotations.NotNull()
kotlin.reflect.KProperty<?> property, @org.jetbrains.annotations.Nullable()
AA value) {
}
@java.lang.Override()
public final AA getValue(@org.jetbrains.annotations.NotNull()
java.lang.Object thisRef, @org.jetbrains.annotations.NotNull()
kotlin.reflect.KProperty<?> property) {
return null;
}
@java.lang.Override()
public final void setNullableValue(@org.jetbrains.annotations.NotNull()
java.lang.Object bundle, @org.jetbrains.annotations.NotNull()
java.lang.String key, @org.jetbrains.annotations.Nullable()
AA value) {
}
public abstract void setValue(@org.jetbrains.annotations.NotNull()
java.lang.Object bundle, @org.jetbrains.annotations.NotNull()
java.lang.String key, AA value);
public BundleProperty(@org.jetbrains.annotations.Nullable()
java.lang.String key) {
super(null);
}
}
////////////////////
package test;
import java.lang.System;
@kotlin.Suppress(names = {"NOTHING_TO_INLINE"})
@kotlin.Metadata()
public final class Kt27126Kt {
public Kt27126Kt() {
super();
}
@org.jetbrains.annotations.NotNull()
public static final test.BundleProperty<java.lang.CharSequence> charSequence(@org.jetbrains.annotations.Nullable()
java.lang.String key) {
return null;
}
}
////////////////////
package test;
import java.lang.System;
@kotlin.Metadata()
public abstract class NullableBundleProperty<EE extends java.lang.Object> implements kotlin.properties.ReadWriteProperty<java.lang.Object, EE> {
private final java.lang.String key = null;
private final java.lang.String toKey(@org.jetbrains.annotations.NotNull()
kotlin.reflect.KProperty<?> $receiver) {
return null;
}
@org.jetbrains.annotations.Nullable()
@java.lang.Override()
public EE getValue(@org.jetbrains.annotations.NotNull()
java.lang.Object thisRef, @org.jetbrains.annotations.NotNull()
kotlin.reflect.KProperty<?> property) {
return null;
}
@java.lang.Override()
public void setValue(@org.jetbrains.annotations.NotNull()
java.lang.Object thisRef, @org.jetbrains.annotations.NotNull()
kotlin.reflect.KProperty<?> property, @org.jetbrains.annotations.Nullable()
EE value) {
}
@org.jetbrains.annotations.Nullable()
public abstract EE getValue(@org.jetbrains.annotations.NotNull()
java.lang.Object bundle, @org.jetbrains.annotations.NotNull()
java.lang.String key);
public abstract void setNullableValue(@org.jetbrains.annotations.NotNull()
java.lang.Object bundle, @org.jetbrains.annotations.NotNull()
java.lang.String key, @org.jetbrains.annotations.Nullable()
EE value);
public NullableBundleProperty(@org.jetbrains.annotations.Nullable()
java.lang.String key) {
super();
}
}