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
+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"
}