Kapt3: Do not check type for star projection, it causes the infinite recursion. Also limit recursion depth to 10. (KT-15841)

This commit is contained in:
Yan Zhulanow
2017-01-21 13:41:11 +09:00
parent 48a66c9d41
commit e28b4dfbc7
3 changed files with 45 additions and 3 deletions
@@ -107,8 +107,13 @@ private fun convertFunctionType(type: KtFunctionType, converter: ClassFileToSour
return treeMaker.TypeApply(treeMaker.SimpleName("Function" + (parameterTypes.size - 1)), parameterTypes)
}
fun KotlinType.containsErrorTypes(): Boolean {
fun KotlinType.containsErrorTypes(allowedDepth: Int = 10): Boolean {
// Need to limit recursion depth in case of complex recursive generics
if (allowedDepth <= 0) {
return false
}
if (this.isError) return true
if (this.arguments.any { it.type.containsErrorTypes() }) return true
if (this.arguments.any { !it.isStarProjection && it.type.containsErrorTypes(allowedDepth - 1) }) return true
return false
}
@@ -20,6 +20,9 @@ class Test {
val m = ABC()
val n = "".toString()
lateinit var o11: List<List<List<List<List<List<List<List<List<List<ABC>>>>>>>>>>
lateinit var o10: List<List<List<List<List<List<List<List<List<ABC>>>>>>>>>
fun f1(a: ABC): BCD? {
return null
}
@@ -31,4 +34,8 @@ class Test {
}
fun f4() = ABC()
}
fun <T> MyType<T>.f5(): java.lang.Class<Enum<*>>? = null
}
class MyType<T>
@@ -1,3 +1,13 @@
public final class MyType<T extends java.lang.Object> {
public MyType() {
super();
}
}
////////////////////
@kotlin.Suppress(names = {"UNRESOLVED_REFERENCE"})
public final class Test {
public ABC a;
@@ -14,6 +24,8 @@ public final class Test {
public ABC.BCD.EFG l;
private final error.NonExistentClass m = null;
private final java.lang.String n = "";
public java.util.List<? extends java.util.List<? extends java.util.List<? extends java.util.List<? extends java.util.List<? extends java.util.List<? extends java.util.List<? extends java.util.List<? extends java.util.List<? extends java.util.List<? extends error.NonExistentClass>>>>>>>>>> o11;
public List<List<List<List<List<List<List<List<List<ABC>>>>>>>>> o10;
public final ABC getA() {
return null;
@@ -98,6 +110,20 @@ public final class Test {
return null;
}
public final java.util.List<java.util.List<java.util.List<java.util.List<java.util.List<java.util.List<java.util.List<java.util.List<java.util.List<java.util.List<error.NonExistentClass>>>>>>>>>> getO11() {
return null;
}
public final void setO11(java.util.List<? extends java.util.List<? extends java.util.List<? extends java.util.List<? extends java.util.List<? extends java.util.List<? extends java.util.List<? extends java.util.List<? extends java.util.List<? extends java.util.List<? extends error.NonExistentClass>>>>>>>>>> p0) {
}
public final List<List<List<List<List<List<List<List<List<ABC>>>>>>>>> getO10() {
return null;
}
public final void setO10(List<List<List<List<List<List<List<List<List<ABC>>>>>>>>> p0) {
}
public final BCD f1(ABC a) {
return null;
}
@@ -113,6 +139,10 @@ public final class Test {
return null;
}
public final <T extends java.lang.Object>java.lang.Class<java.lang.Enum<?>> f5(MyType<T> $receiver) {
return null;
}
public Test() {
super();
}