psi2ir: ersatz type approximation for intersection types

Emulate old JVM back-end behavior for intersection type mapping.

IrType renderer should render the IR type, not the original Kotlin type.
This commit is contained in:
Dmitry Petrov
2018-12-06 16:54:35 +03:00
parent 0e4908087c
commit f8582c1929
11 changed files with 599 additions and 71 deletions
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
// IGNORE_BACKEND: JS_IR
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
+15
View File
@@ -0,0 +1,15 @@
class In<in I>
fun <S> select(x: S, y: S): S = x
fun <T> foo(a: Array<In<T>>, b: Array<In<String>>) =
select(a, b)[0].ofType(true)
inline fun <reified K> In<K>.ofType(y: Any?) =
y is K
fun test() {
val a1 = arrayOf(In<Int>())
val a2 = arrayOf(In<String>())
foo(a1, a2)
}
+72
View File
@@ -0,0 +1,72 @@
FILE fqName:<root> fileName:/intersectionType1.kt
CLASS CLASS name:In modality:FINAL visibility:public flags: superTypes:[kotlin.Any]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:In<I> flags:
TYPE_PARAMETER name:I index:0 variance:in superTypes:[kotlin.Any?]
CONSTRUCTOR visibility:public <> () returnType:In<I> flags:primary
BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'constructor Any()'
INSTANCE_INITIALIZER_CALL classDescriptor='In'
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
overridden:
FUN IR_EXTERNAL_DECLARATION_STUB name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags:
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
overridden:
FUN IR_EXTERNAL_DECLARATION_STUB name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
overridden:
FUN IR_EXTERNAL_DECLARATION_STUB name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
FUN name:select visibility:public modality:FINAL <S> (x:S, y:S) returnType:S flags:
TYPE_PARAMETER name:S index:0 variance: superTypes:[kotlin.Any?]
VALUE_PARAMETER name:x index:0 type:S flags:
VALUE_PARAMETER name:y index:1 type:S flags:
BLOCK_BODY
RETURN type=kotlin.Nothing from='select(S, S): S'
GET_VAR 'value-parameter x: S' type=S origin=null
FUN name:foo visibility:public modality:FINAL <T> (a:kotlin.Array<In<T>>, b:kotlin.Array<In<kotlin.String>>) returnType:kotlin.Boolean flags:
TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?]
VALUE_PARAMETER name:a index:0 type:kotlin.Array<In<T>> flags:
VALUE_PARAMETER name:b index:1 type:kotlin.Array<In<kotlin.String>> flags:
BLOCK_BODY
RETURN type=kotlin.Nothing from='foo(Array<In<T>>, Array<In<String>>): Boolean'
CALL 'ofType(Any?) on In<K>: Boolean' type=kotlin.Boolean origin=null
<reified K>: kotlin.Any?
$receiver: CALL 'get(Int): T' type=In<kotlin.Any?> origin=GET_ARRAY_ELEMENT
$this: CALL 'select(S, S): S' type=kotlin.Array<out In<kotlin.Any?>> origin=null
<S>: kotlin.Array<out In<kotlin.Any?>>
x: GET_VAR 'value-parameter a: Array<In<T>>' type=kotlin.Array<In<T>> origin=null
y: GET_VAR 'value-parameter b: Array<In<String>>' type=kotlin.Array<In<kotlin.String>> origin=null
index: CONST Int type=kotlin.Int value=0
y: CONST Boolean type=kotlin.Boolean value=true
FUN name:ofType visibility:public modality:FINAL <K> ($receiver:In<K>, y:kotlin.Any?) returnType:kotlin.Boolean flags:inline
TYPE_PARAMETER name:K index:0 variance: superTypes:[kotlin.Any?]
$receiver: VALUE_PARAMETER name:<this> type:In<K> flags:
VALUE_PARAMETER name:y index:0 type:kotlin.Any? flags:
BLOCK_BODY
RETURN type=kotlin.Nothing from='ofType(Any?) on In<K>: Boolean'
TYPE_OP type=kotlin.Boolean origin=INSTANCEOF typeOperand=K
typeOperand: TYPE_PARAMETER name:K index:0 variance: superTypes:[kotlin.Any?]
GET_VAR 'value-parameter y: Any?' type=kotlin.Any? origin=null
FUN name:test visibility:public modality:FINAL <> () returnType:kotlin.Unit flags:
BLOCK_BODY
VAR name:a1 type:kotlin.Array<In<kotlin.Int>> flags:val
CALL 'arrayOf(vararg T): Array<T>' type=kotlin.Array<In<kotlin.Int>> origin=null
<reified T>: In<kotlin.Int>
elements: VARARG type=kotlin.Array<out In<kotlin.Int>> varargElementType=In<kotlin.Int>
CALL 'constructor In()' type=In<kotlin.Int> origin=null
<in I>: kotlin.Int
VAR name:a2 type:kotlin.Array<In<kotlin.String>> flags:val
CALL 'arrayOf(vararg T): Array<T>' type=kotlin.Array<In<kotlin.String>> origin=null
<reified T>: In<kotlin.String>
elements: VARARG type=kotlin.Array<out In<kotlin.String>> varargElementType=In<kotlin.String>
CALL 'constructor In()' type=In<kotlin.String> origin=null
<in I>: kotlin.String
TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit
typeOperand: CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public flags: superTypes:[kotlin.Any]
CALL 'foo(Array<In<T>>, Array<In<String>>): Boolean' type=kotlin.Boolean origin=null
<T>: kotlin.Int
a: GET_VAR 'a1: Array<In<Int>>' type=kotlin.Array<In<kotlin.Int>> origin=null
b: GET_VAR 'a2: Array<In<String>>' type=kotlin.Array<In<kotlin.String>> origin=null
+16
View File
@@ -0,0 +1,16 @@
interface A<out T>
interface Foo
open class B : Foo, A<B>
open class C : Foo, A<C>
fun <T> run(fn: () -> T) = fn()
fun foo() = run {
val mm = B()
val nn = C()
val c = if (true) mm else nn
c
}
+106
View File
@@ -0,0 +1,106 @@
FILE fqName:<root> fileName:/intersectionType2.kt
CLASS INTERFACE name:A modality:ABSTRACT visibility:public flags: superTypes:[kotlin.Any]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:A<T> flags:
TYPE_PARAMETER name:T index:0 variance:out superTypes:[kotlin.Any?]
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
overridden:
FUN IR_EXTERNAL_DECLARATION_STUB name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags:
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
overridden:
FUN IR_EXTERNAL_DECLARATION_STUB name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
overridden:
FUN IR_EXTERNAL_DECLARATION_STUB name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
CLASS INTERFACE name:Foo modality:ABSTRACT visibility:public flags: superTypes:[kotlin.Any]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:Foo flags:
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
overridden:
FUN IR_EXTERNAL_DECLARATION_STUB name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags:
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
overridden:
FUN IR_EXTERNAL_DECLARATION_STUB name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
overridden:
FUN IR_EXTERNAL_DECLARATION_STUB name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
CLASS CLASS name:B modality:OPEN visibility:public flags: superTypes:[Foo; A<B>]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:B flags:
CONSTRUCTOR visibility:public <> () returnType:B flags:primary
BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'constructor Any()'
INSTANCE_INITIALIZER_CALL classDescriptor='B'
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
overridden:
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags:
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
overridden:
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
overridden:
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
CLASS CLASS name:C modality:OPEN visibility:public flags: superTypes:[Foo; A<C>]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:C flags:
CONSTRUCTOR visibility:public <> () returnType:C flags:primary
BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'constructor Any()'
INSTANCE_INITIALIZER_CALL classDescriptor='C'
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
overridden:
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags:
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
overridden:
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
overridden:
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
FUN name:run visibility:public modality:FINAL <T> (fn:kotlin.Function0<T>) returnType:T flags:
TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?]
VALUE_PARAMETER name:fn index:0 type:kotlin.Function0<T> flags:
BLOCK_BODY
RETURN type=kotlin.Nothing from='run(() -> T): T'
CALL 'invoke(): R' type=T origin=INVOKE
$this: GET_VAR 'value-parameter fn: () -> T' type=kotlin.Function0<T> origin=VARIABLE_AS_FUNCTION
FUN name:foo visibility:public modality:FINAL <> () returnType:kotlin.Any flags:
BLOCK_BODY
RETURN type=kotlin.Nothing from='foo(): Any'
CALL 'run(() -> T): T' type=kotlin.Any origin=null
<T>: kotlin.Any
fn: BLOCK type=kotlin.Function0<kotlin.Any> origin=LAMBDA
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> () returnType:kotlin.Any flags:
BLOCK_BODY
VAR name:mm type:B flags:val
CALL 'constructor B()' type=B origin=null
VAR name:nn type:C flags:val
CALL 'constructor C()' type=C origin=null
VAR name:c type:kotlin.Any flags:val
WHEN type=kotlin.Any origin=null
BRANCH
if: CONST Boolean type=kotlin.Boolean value=true
then: GET_VAR 'mm: B' type=B origin=null
BRANCH
if: CONST Boolean type=kotlin.Boolean value=true
then: GET_VAR 'nn: C' type=C origin=null
RETURN type=kotlin.Nothing from='<anonymous>(): Any'
GET_VAR 'c: Any' type=kotlin.Any origin=null
FUNCTION_REFERENCE '<anonymous>(): Any' type=kotlin.Function0<kotlin.Any> origin=LAMBDA
+30
View File
@@ -0,0 +1,30 @@
interface In<in T>
inline fun <reified T> In<T>.isT(): Boolean =
this is T
inline fun <reified T> In<T>.asT() { this as T }
fun <S> sel(x: S, y: S): S = x
interface A
interface B
interface A1 : A
interface A2 : A
interface Z1 : A, B
interface Z2 : A, B
fun testInIs1(x: In<A>, y: In<B>) = sel(x, y).isT()
fun testInIs2(x: In<Z1>, y: In<Z2>) = sel(x, y).isT()
fun testInIs3(x: In<A1>, y: In<A2>) = sel(x, y).isT()
fun testInAs1(x: In<A>, y: In<B>) = sel(x, y).asT()
fun testInAs2(x: In<Z1>, y: In<Z2>) = sel(x, y).asT()
fun testInAs3(x: In<A1>, y: In<A2>) = sel(x, y).asT()
+203
View File
@@ -0,0 +1,203 @@
FILE fqName:<root> fileName:/intersectionType3.kt
CLASS INTERFACE name:In modality:ABSTRACT visibility:public flags: superTypes:[kotlin.Any]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:In<T> flags:
TYPE_PARAMETER name:T index:0 variance:in superTypes:[kotlin.Any?]
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
overridden:
FUN IR_EXTERNAL_DECLARATION_STUB name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags:
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
overridden:
FUN IR_EXTERNAL_DECLARATION_STUB name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
overridden:
FUN IR_EXTERNAL_DECLARATION_STUB name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
FUN name:isT visibility:public modality:FINAL <T> ($receiver:In<T>) returnType:kotlin.Boolean flags:inline
TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?]
$receiver: VALUE_PARAMETER name:<this> type:In<T> flags:
BLOCK_BODY
RETURN type=kotlin.Nothing from='isT() on In<T>: Boolean'
TYPE_OP type=kotlin.Boolean origin=INSTANCEOF typeOperand=T
typeOperand: TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?]
GET_VAR 'this@isT: In<T>' type=In<T> origin=null
FUN name:asT visibility:public modality:FINAL <T> ($receiver:In<T>) returnType:kotlin.Unit flags:inline
TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?]
$receiver: VALUE_PARAMETER name:<this> type:In<T> flags:
BLOCK_BODY
TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit
typeOperand: CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public flags: superTypes:[kotlin.Any]
TYPE_OP type=T origin=CAST typeOperand=T
typeOperand: TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?]
GET_VAR 'this@asT: In<T>' type=In<T> origin=null
FUN name:sel visibility:public modality:FINAL <S> (x:S, y:S) returnType:S flags:
TYPE_PARAMETER name:S index:0 variance: superTypes:[kotlin.Any?]
VALUE_PARAMETER name:x index:0 type:S flags:
VALUE_PARAMETER name:y index:1 type:S flags:
BLOCK_BODY
RETURN type=kotlin.Nothing from='sel(S, S): S'
GET_VAR 'value-parameter x: S' type=S origin=null
CLASS INTERFACE name:A modality:ABSTRACT visibility:public flags: superTypes:[kotlin.Any]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:A flags:
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
overridden:
FUN IR_EXTERNAL_DECLARATION_STUB name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags:
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
overridden:
FUN IR_EXTERNAL_DECLARATION_STUB name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
overridden:
FUN IR_EXTERNAL_DECLARATION_STUB name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
CLASS INTERFACE name:B modality:ABSTRACT visibility:public flags: superTypes:[kotlin.Any]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:B flags:
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
overridden:
FUN IR_EXTERNAL_DECLARATION_STUB name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags:
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
overridden:
FUN IR_EXTERNAL_DECLARATION_STUB name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
overridden:
FUN IR_EXTERNAL_DECLARATION_STUB name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
CLASS INTERFACE name:A1 modality:ABSTRACT visibility:public flags: superTypes:[A]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:A1 flags:
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
overridden:
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags:
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
overridden:
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
overridden:
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
CLASS INTERFACE name:A2 modality:ABSTRACT visibility:public flags: superTypes:[A]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:A2 flags:
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
overridden:
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags:
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
overridden:
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
overridden:
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
CLASS INTERFACE name:Z1 modality:ABSTRACT visibility:public flags: superTypes:[A; B]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:Z1 flags:
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
overridden:
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags:
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
overridden:
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
overridden:
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
CLASS INTERFACE name:Z2 modality:ABSTRACT visibility:public flags: superTypes:[A; B]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:Z2 flags:
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
overridden:
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags:
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
overridden:
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
overridden:
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
FUN name:testInIs1 visibility:public modality:FINAL <> (x:In<A>, y:In<B>) returnType:kotlin.Boolean flags:
VALUE_PARAMETER name:x index:0 type:In<A> flags:
VALUE_PARAMETER name:y index:1 type:In<B> flags:
BLOCK_BODY
RETURN type=kotlin.Nothing from='testInIs1(In<A>, In<B>): Boolean'
CALL 'isT() on In<T>: Boolean' type=kotlin.Boolean origin=null
<reified T>: kotlin.Any
$receiver: CALL 'sel(S, S): S' type=In<kotlin.Any> origin=null
<S>: In<kotlin.Any>
x: GET_VAR 'value-parameter x: In<A>' type=In<A> origin=null
y: GET_VAR 'value-parameter y: In<B>' type=In<B> origin=null
FUN name:testInIs2 visibility:public modality:FINAL <> (x:In<Z1>, y:In<Z2>) returnType:kotlin.Boolean flags:
VALUE_PARAMETER name:x index:0 type:In<Z1> flags:
VALUE_PARAMETER name:y index:1 type:In<Z2> flags:
BLOCK_BODY
RETURN type=kotlin.Nothing from='testInIs2(In<Z1>, In<Z2>): Boolean'
CALL 'isT() on In<T>: Boolean' type=kotlin.Boolean origin=null
<reified T>: kotlin.Any
$receiver: CALL 'sel(S, S): S' type=In<kotlin.Any> origin=null
<S>: In<kotlin.Any>
x: GET_VAR 'value-parameter x: In<Z1>' type=In<Z1> origin=null
y: GET_VAR 'value-parameter y: In<Z2>' type=In<Z2> origin=null
FUN name:testInIs3 visibility:public modality:FINAL <> (x:In<A1>, y:In<A2>) returnType:kotlin.Boolean flags:
VALUE_PARAMETER name:x index:0 type:In<A1> flags:
VALUE_PARAMETER name:y index:1 type:In<A2> flags:
BLOCK_BODY
RETURN type=kotlin.Nothing from='testInIs3(In<A1>, In<A2>): Boolean'
CALL 'isT() on In<T>: Boolean' type=kotlin.Boolean origin=null
<reified T>: A
$receiver: CALL 'sel(S, S): S' type=In<A> origin=null
<S>: In<A>
x: GET_VAR 'value-parameter x: In<A1>' type=In<A1> origin=null
y: GET_VAR 'value-parameter y: In<A2>' type=In<A2> origin=null
FUN name:testInAs1 visibility:public modality:FINAL <> (x:In<A>, y:In<B>) returnType:kotlin.Unit flags:
VALUE_PARAMETER name:x index:0 type:In<A> flags:
VALUE_PARAMETER name:y index:1 type:In<B> flags:
BLOCK_BODY
RETURN type=kotlin.Nothing from='testInAs1(In<A>, In<B>): Unit'
CALL 'asT() on In<T>: Unit' type=kotlin.Unit origin=null
<reified T>: kotlin.Any
$receiver: CALL 'sel(S, S): S' type=In<kotlin.Any> origin=null
<S>: In<kotlin.Any>
x: GET_VAR 'value-parameter x: In<A>' type=In<A> origin=null
y: GET_VAR 'value-parameter y: In<B>' type=In<B> origin=null
FUN name:testInAs2 visibility:public modality:FINAL <> (x:In<Z1>, y:In<Z2>) returnType:kotlin.Unit flags:
VALUE_PARAMETER name:x index:0 type:In<Z1> flags:
VALUE_PARAMETER name:y index:1 type:In<Z2> flags:
BLOCK_BODY
RETURN type=kotlin.Nothing from='testInAs2(In<Z1>, In<Z2>): Unit'
CALL 'asT() on In<T>: Unit' type=kotlin.Unit origin=null
<reified T>: kotlin.Any
$receiver: CALL 'sel(S, S): S' type=In<kotlin.Any> origin=null
<S>: In<kotlin.Any>
x: GET_VAR 'value-parameter x: In<Z1>' type=In<Z1> origin=null
y: GET_VAR 'value-parameter y: In<Z2>' type=In<Z2> origin=null
FUN name:testInAs3 visibility:public modality:FINAL <> (x:In<A1>, y:In<A2>) returnType:kotlin.Unit flags:
VALUE_PARAMETER name:x index:0 type:In<A1> flags:
VALUE_PARAMETER name:y index:1 type:In<A2> flags:
BLOCK_BODY
RETURN type=kotlin.Nothing from='testInAs3(In<A1>, In<A2>): Unit'
CALL 'asT() on In<T>: Unit' type=kotlin.Unit origin=null
<reified T>: A
$receiver: CALL 'sel(S, S): S' type=In<A> origin=null
<S>: In<A>
x: GET_VAR 'value-parameter x: In<A1>' type=In<A1> origin=null
y: GET_VAR 'value-parameter y: In<A2>' type=In<A2> origin=null