From 39863edd0e4cf7861e35c114e5a01569711453fd Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Fri, 28 Sep 2018 21:06:44 +0300 Subject: [PATCH] Kapt: Use correct type mapping mode while mapping super types (KT-27126) --- .../kotlin/kapt3/stubs/ErrorTypeCorrector.kt | 2 +- ...ileToSourceStubConverterTestGenerated.java | 10 ++ .../errorSuperclassCorrectErrorTypes.kt | 6 +- .../errorSuperclassCorrectErrorTypes.txt | 56 +++++++++- .../testData/converter/genericParameters.kt | 7 ++ .../testData/converter/genericParameters.txt | 29 +++++ .../testData/converter/kt27126.kt | 40 +++++++ .../testData/converter/kt27126.txt | 104 ++++++++++++++++++ 8 files changed, 251 insertions(+), 3 deletions(-) create mode 100644 plugins/kapt3/kapt3-compiler/testData/converter/genericParameters.kt create mode 100644 plugins/kapt3/kapt3-compiler/testData/converter/genericParameters.txt create mode 100644 plugins/kapt3/kapt3-compiler/testData/converter/kt27126.kt create mode 100644 plugins/kapt3/kapt3-compiler/testData/converter/kt27126.txt diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ErrorTypeCorrector.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ErrorTypeCorrector.kt index dc29ccd03de..2a8ad05addf 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ErrorTypeCorrector.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ErrorTypeCorrector.kt @@ -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 diff --git a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java index 065fcf1f769..7aef1fe2833 100644 --- a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java +++ b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java @@ -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"); diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/errorSuperclassCorrectErrorTypes.kt b/plugins/kapt3/kapt3-compiler/testData/converter/errorSuperclassCorrectErrorTypes.kt index 8f1d2b4e631..d540458aef5 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/errorSuperclassCorrectErrorTypes.kt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/errorSuperclassCorrectErrorTypes.kt @@ -48,4 +48,8 @@ class Generics3 : Foo>, String> class MappedList() : AbstractList(), List { override fun get(index: Int) = throw RuntimeException() override val size get() = 0 -} \ No newline at end of file +} + +interface Parent + +class Child : AbstractList(), Parent, List \ No newline at end of file diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/errorSuperclassCorrectErrorTypes.txt b/plugins/kapt3/kapt3-compiler/testData/converter/errorSuperclassCorrectErrorTypes.txt index fdc99fa453f..b8e5c740f46 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/errorSuperclassCorrectErrorTypes.txt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/errorSuperclassCorrectErrorTypes.txt @@ -2,6 +2,50 @@ package test; import java.lang.System; +@kotlin.Metadata() +public final class Child extends kotlin.collections.AbstractList implements test.Parent, java.util.List { + + 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 extends kotlin.collections.AbstractList implements java.util.List { +public final class MappedList extends kotlin.collections.AbstractList implements java.util.List { @org.jetbrains.annotations.NotNull() @java.lang.Override() @@ -93,6 +137,16 @@ package test; import java.lang.System; +@kotlin.Metadata() +public abstract interface Parent { +} + +//////////////////// + +package test; + +import java.lang.System; + @kotlin.Metadata() public final class TBarBazCl extends test.Cl implements Bar, Baz { diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/genericParameters.kt b/plugins/kapt3/kapt3-compiler/testData/converter/genericParameters.kt new file mode 100644 index 00000000000..05c99abd2b4 --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/genericParameters.kt @@ -0,0 +1,7 @@ +// CORRECT_ERROR_TYPES +// WITH_RUNTIME + +class MappedList(val list: List, private val function: (T) -> R) : AbstractList(), List { + override fun get(index: Int) = function(list[index]) + override val size get() = list.size +} \ No newline at end of file diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/genericParameters.txt b/plugins/kapt3/kapt3-compiler/testData/converter/genericParameters.txt new file mode 100644 index 00000000000..3124b0ba9ac --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/genericParameters.txt @@ -0,0 +1,29 @@ +import java.lang.System; + +@kotlin.Metadata() +public final class MappedList extends kotlin.collections.AbstractList implements java.util.List { + @org.jetbrains.annotations.NotNull() + private final java.util.List list = null; + private final kotlin.jvm.functions.Function1 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 getList() { + return null; + } + + public MappedList(@org.jetbrains.annotations.NotNull() + java.util.List list, @org.jetbrains.annotations.NotNull() + kotlin.jvm.functions.Function1 function) { + super(); + } +} diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/kt27126.kt b/plugins/kapt3/kapt3-compiler/testData/converter/kt27126.kt new file mode 100644 index 00000000000..56469093d84 --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/kt27126.kt @@ -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(key) { + override fun getValue(bundle: Any, key: String): CharSequence? = TODO() + override fun setValue(bundle: Any, key: String, value: CharSequence) {} +} + +abstract class NullableBundleProperty(private val key: String?) : ReadWriteProperty { + 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(key: String?) : NullableBundleProperty(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) +} \ No newline at end of file diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/kt27126.txt b/plugins/kapt3/kapt3-compiler/testData/converter/kt27126.txt new file mode 100644 index 00000000000..aab52436822 --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/kt27126.txt @@ -0,0 +1,104 @@ +package test; + +import java.lang.System; + +@kotlin.Metadata() +public abstract class BundleProperty extends test.NullableBundleProperty { + + @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 charSequence(@org.jetbrains.annotations.Nullable() + java.lang.String key) { + return null; + } +} + +//////////////////// + +package test; + +import java.lang.System; + +@kotlin.Metadata() +public abstract class NullableBundleProperty implements kotlin.properties.ReadWriteProperty { + 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(); + } +}