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:
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user