Introduce TypeParameterUpperBoundEraser to memorize results of type parameters erasion computation

^KT-47785 Fixed
This commit is contained in:
Victor Petukhov
2021-07-21 13:29:44 +03:00
committed by teamcityserver
parent f9cb0d61a8
commit 6706ee87ad
13 changed files with 309 additions and 74 deletions
@@ -28078,6 +28078,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/platformTypes/kt14989.kt");
}
@Test
@TestMetadata("kt47785.kt")
public void testKt47785() throws Exception {
runTest("compiler/testData/codegen/box/platformTypes/kt47785.kt");
}
@Test
@TestMetadata("rawTypeWithNestedClass.kt")
public void testRawTypeWithNestedClass() throws Exception {
+127
View File
@@ -0,0 +1,127 @@
// DONT_TARGET_EXACT_BACKEND: WASM
// FULL_JDK
// FILE: AbstractAssert.java
public abstract class AbstractAssert<E extends AbstractAssert<E>> { }
// FILE: AbstractAssertWithOriginWithColumnsAndRows.java
public abstract class AbstractAssertWithOriginWithColumnsAndRows<E extends AbstractAssertWithOriginWithColumnsAndRows<E, O, D, A, C, CV, R, RV>, O extends OriginWithColumnsAndRows<C, R>, D extends AbstractDbData<D>, A extends AbstractDbAssert<D, A, C, CV, R, RV>, C extends AbstractColumnAssert<D, A, C, CV, R, RV>, CV extends AbstractColumnValueAssert<D, A, C, CV, R, RV>, R extends AbstractRowAssert<D, A, C, CV, R, RV>, RV extends AbstractRowValueAssert<D, A, C, CV, R, RV>> {}
// FILE: AbstractColumnAssert.java
public abstract class AbstractColumnAssert<D extends AbstractDbData<D>, A extends AbstractDbAssert<D, A, C, CV, R, RV>, C extends AbstractColumnAssert<D, A, C, CV, R, RV>, CV extends AbstractColumnValueAssert<D, A, C, CV, R, RV>, R extends AbstractRowAssert<D, A, C, CV, R, RV>, RV extends AbstractRowValueAssert<D, A, C, CV, R, RV>>
extends AbstractSubAssert<D, A, C, CV, C, CV, R, RV> implements ColumnElement {
}
// FILE: AbstractColumnValueAssert.java
public abstract class AbstractColumnValueAssert<D extends AbstractDbData<D>, A extends AbstractDbAssert<D, A, C, CV, R, RV>, C extends AbstractColumnAssert<D, A, C, CV, R, RV>, CV extends AbstractColumnValueAssert<D, A, C, CV, R, RV>, R extends AbstractRowAssert<D, A, C, CV, R, RV>, RV extends AbstractRowValueAssert<D, A, C, CV, R, RV>>
extends AbstractValueAssert<D, A, C, CV, C, CV, R, RV> {
}
// FILE: AbstractDbAssert.java
public abstract class AbstractDbAssert<D extends AbstractDbData<D>, A extends AbstractDbAssert<D, A, C, CV, R, RV>, C extends AbstractColumnAssert<D, A, C, CV, R, RV>, CV extends AbstractColumnValueAssert<D, A, C, CV, R, RV>, R extends AbstractRowAssert<D, A, C, CV, R, RV>, RV extends AbstractRowValueAssert<D, A, C, CV, R, RV>>
extends AbstractAssert<A> implements OriginWithColumnsAndRows<C, R> {
public A hasNumberOfRows(int expected) {
return (A) new RequestAssert();
}
public R row() {
return (R) new RequestRowAssert();
}
}
// FILE: AbstractDbData.java
public abstract class AbstractDbData<D extends AbstractDbData<D>> extends AbstractDbElement<D> {
}
// FILE: AbstractDbElement.java
public abstract class AbstractDbElement<D extends AbstractDbElement<D>> {
}
// FILE: AbstractRowAssert.java
public abstract class AbstractRowAssert<D extends AbstractDbData<D>, A extends AbstractDbAssert<D, A, C, CV, R, RV>, C extends AbstractColumnAssert<D, A, C, CV, R, RV>, CV extends AbstractColumnValueAssert<D, A, C, CV, R, RV>, R extends AbstractRowAssert<D, A, C, CV, R, RV>, RV extends AbstractRowValueAssert<D, A, C, CV, R, RV>>
extends AbstractSubAssert<D, A, R, RV, C, CV, R, RV> implements RowElement {
public RV value(String columnName) {
return (RV) new RequestRowValueAssert();
}
}
// FILE: AbstractRowValueAssert.java
public abstract class AbstractRowValueAssert<D extends AbstractDbData<D>, A extends AbstractDbAssert<D, A, C, CV, R, RV>, C extends AbstractColumnAssert<D, A, C, CV, R, RV>, CV extends AbstractColumnValueAssert<D, A, C, CV, R, RV>, R extends AbstractRowAssert<D, A, C, CV, R, RV>, RV extends AbstractRowValueAssert<D, A, C, CV, R, RV>>
extends AbstractValueAssert<D, A, R, RV, C, CV, R, RV> {
}
// FILE: AbstractSubAssert.java
public abstract class AbstractSubAssert<D extends AbstractDbData<D>, A extends AbstractDbAssert<D, A, C, CV, R, RV>, S extends AbstractSubAssert<D, A, S, V, C, CV, R, RV>, V extends AbstractValueAssert<D, A, S, V, C, CV, R, RV>, C extends AbstractColumnAssert<D, A, C, CV, R, RV>, CV extends AbstractColumnValueAssert<D, A, C, CV, R, RV>, R extends AbstractRowAssert<D, A, C, CV, R, RV>, RV extends AbstractRowValueAssert<D, A, C, CV, R, RV>>
extends AbstractAssertWithOriginWithColumnsAndRows<S, A, D, A, C, CV, R, RV> implements OriginWithColumnsAndRows<C, R> {
}
// FILE: AbstractValueAssert.java
import java.time.LocalDateTime;
public abstract class AbstractValueAssert<D extends AbstractDbData<D>, A extends AbstractDbAssert<D, A, C, CV, R, RV>, S extends AbstractSubAssert<D, A, S, V, C, CV, R, RV>, V extends AbstractValueAssert<D, A, S, V, C, CV, R, RV>, C extends AbstractColumnAssert<D, A, C, CV, R, RV>, CV extends AbstractColumnValueAssert<D, A, C, CV, R, RV>, R extends AbstractRowAssert<D, A, C, CV, R, RV>, RV extends AbstractRowValueAssert<D, A, C, CV, R, RV>>
extends AbstractAssertWithOriginWithColumnsAndRows<V, S, D, A, C, CV, R, RV> {
public V isEqualTo(LocalDateTime expected) {
return (V) new RequestRowValueAssert();
}
}
// FILE: ColumnElement.java
public interface ColumnElement { }
// FILE: OriginWithColumnsAndRows.java
public interface OriginWithColumnsAndRows<C extends ColumnElement, R extends RowElement> {}
// FILE: Request.java
public class Request extends AbstractDbData<Request> {}
// FILE: RequestAssert.java
public class RequestAssert
extends AbstractDbAssert<Request, RequestAssert, RequestColumnAssert, RequestColumnValueAssert, RequestRowAssert, RequestRowValueAssert> {
}
// FILE: RequestColumnAssert.java
public class RequestColumnAssert
extends AbstractColumnAssert<Request, RequestAssert, RequestColumnAssert, RequestColumnValueAssert, RequestRowAssert, RequestRowValueAssert> {
}
// FILE: RequestColumnValueAssert.java
public class RequestColumnValueAssert
extends AbstractColumnValueAssert<Request, RequestAssert, RequestColumnAssert, RequestColumnValueAssert, RequestRowAssert, RequestRowValueAssert> {
}
// FILE: RequestRowAssert.java
public class RequestRowAssert
extends AbstractRowAssert<Request, RequestAssert, RequestColumnAssert, RequestColumnValueAssert, RequestRowAssert, RequestRowValueAssert> {
}
// FILE: RequestRowValueAssert.java
public class RequestRowValueAssert
extends AbstractRowValueAssert<Request, RequestAssert, RequestColumnAssert, RequestColumnValueAssert, RequestRowAssert, RequestRowValueAssert> {
}
// FILE: RowElement.java
public interface RowElement {}
// FILE: main.kt
import java.time.LocalDateTime
fun test(x: RequestAssert) {
val timestamp = LocalDateTime.now()
x.hasNumberOfRows(1)
.row()
.value("message_time").isEqualTo(timestamp)
}
fun box(): String {
test(RequestAssert())
return "OK"
}
@@ -17,5 +17,5 @@ public open class Foo</*0*/ T : Boo<K!>!, /*1*/ K : Boo<X!>!, /*2*/ X : Boo<K!>!
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public/*package*/ open fun test1(): (Foo<(raw) Boo<Boo<Boo<*>!>!>!, (raw) Boo<Boo<*>!>!, (raw) Boo<Boo<*>!>!>..Foo<out Boo<out Boo<out Boo<*>!>!>!, out Boo<out Boo<*>!>!, out Boo<out Boo<*>!>!>?)
public/*package*/ open fun test1(): (Foo<(raw) Boo<Boo<Boo<*>!>!>!, (raw) Boo<Boo<*>!>!, (raw) Boo<*>!>..Foo<out Boo<out Boo<out Boo<*>!>!>!, out Boo<out Boo<*>!>!, out Boo<*>!>?)
}
@@ -27976,6 +27976,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/platformTypes/kt14989.kt");
}
@Test
@TestMetadata("kt47785.kt")
public void testKt47785() throws Exception {
runTest("compiler/testData/codegen/box/platformTypes/kt47785.kt");
}
@Test
@TestMetadata("rawTypeWithNestedClass.kt")
public void testRawTypeWithNestedClass() throws Exception {
@@ -28078,6 +28078,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/platformTypes/kt14989.kt");
}
@Test
@TestMetadata("kt47785.kt")
public void testKt47785() throws Exception {
runTest("compiler/testData/codegen/box/platformTypes/kt47785.kt");
}
@Test
@TestMetadata("rawTypeWithNestedClass.kt")
public void testRawTypeWithNestedClass() throws Exception {
@@ -23755,6 +23755,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/platformTypes/kt14989.kt");
}
@TestMetadata("kt47785.kt")
public void testKt47785() throws Exception {
runTest("compiler/testData/codegen/box/platformTypes/kt47785.kt");
}
@TestMetadata("rawTypeWithNestedClass.kt")
public void testRawTypeWithNestedClass() throws Exception {
runTest("compiler/testData/codegen/box/platformTypes/rawTypeWithNestedClass.kt");