From 1e360d9c91191f106e45b1adaa85d0eb189fcf1c Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 31 Aug 2020 14:04:11 +0300 Subject: [PATCH] [FIR2IR] Pass type context for type argument conversion properly --- .../fir/backend/Fir2IrClassifierStorage.kt | 5 ++- .../kotlin/fir/backend/Fir2IrTypeConverter.kt | 10 ++--- .../delegatedGenericImplementation.fir.txt | 44 ++++++++++++------- .../genericDelegatedProperty.fir.txt | 6 +-- .../regressions/integerCoercionToT.fir.txt | 4 +- .../genericPropertyReferenceType.fir.txt | 6 +-- 6 files changed, 45 insertions(+), 30 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt index cd033602b08..cdd974e2548 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt @@ -471,7 +471,10 @@ class Fir2IrClassifierStorage( firTypeParameterSymbol: FirTypeParameterSymbol, typeContext: ConversionTypeContext ): IrTypeParameterSymbol { - return getCachedIrTypeParameter(firTypeParameterSymbol.fir, typeContext = typeContext)?.symbol + val firTypeParameter = firTypeParameterSymbol.fir + return getCachedIrTypeParameter(firTypeParameter, typeContext = typeContext)?.symbol + // We can try to use default cache because setter can use parent type parameters + ?: typeParameterCache[firTypeParameter]?.symbol ?: error("Cannot find cached type parameter by FIR symbol: ${firTypeParameterSymbol.name}") } } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrTypeConverter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrTypeConverter.kt index e48c1ce6b66..a904717d734 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrTypeConverter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrTypeConverter.kt @@ -92,7 +92,7 @@ class Fir2IrTypeConverter( typeAnnotations += with(annotationGenerator) { annotations.toIrAnnotations() } IrSimpleTypeImpl( irSymbol, !typeContext.definitelyNotNull && this.isMarkedNullable, - fullyExpandedType(session).typeArguments.map { it.toIrTypeArgument() }, + fullyExpandedType(session).typeArguments.map { it.toIrTypeArgument(typeContext) }, typeAnnotations ) } @@ -115,19 +115,19 @@ class Fir2IrTypeConverter( } } - private fun ConeTypeProjection.toIrTypeArgument(): IrTypeArgument { + private fun ConeTypeProjection.toIrTypeArgument(typeContext: ConversionTypeContext): IrTypeArgument { return when (this) { ConeStarProjection -> IrStarProjectionImpl is ConeKotlinTypeProjectionIn -> { - val irType = this.type.toIrType() + val irType = this.type.toIrType(typeContext) makeTypeProjection(irType, Variance.IN_VARIANCE) } is ConeKotlinTypeProjectionOut -> { - val irType = this.type.toIrType() + val irType = this.type.toIrType(typeContext) makeTypeProjection(irType, Variance.OUT_VARIANCE) } is ConeKotlinType -> { - val irType = toIrType() + val irType = toIrType(typeContext) makeTypeProjection(irType, Variance.INVARIANT) } } diff --git a/compiler/testData/ir/irText/classes/delegatedGenericImplementation.fir.txt b/compiler/testData/ir/irText/classes/delegatedGenericImplementation.fir.txt index 1ff535b0d78..c06b8aea954 100644 --- a/compiler/testData/ir/irText/classes/delegatedGenericImplementation.fir.txt +++ b/compiler/testData/ir/irText/classes/delegatedGenericImplementation.fir.txt @@ -19,11 +19,11 @@ FILE fqName: fileName:/delegatedGenericImplementation.kt TYPE_PARAMETER name:D index:0 variance: superTypes:[kotlin.Any?] $this: VALUE_PARAMETER name: type:.IBase.IBase> $receiver: VALUE_PARAMETER name: type:kotlin.collections.List.IBase.> - FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:ABSTRACT ($this:.IBase.IBase>, $receiver:kotlin.collections.List.IBase.>, :D of .IBase.?) returnType:kotlin.Unit + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:ABSTRACT ($this:.IBase.IBase>, $receiver:kotlin.collections.List.IBase.>, :D of .IBase.?) returnType:kotlin.Unit correspondingProperty: PROPERTY name:x visibility:public modality:ABSTRACT [var] TYPE_PARAMETER name:D index:0 variance: superTypes:[kotlin.Any?] $this: VALUE_PARAMETER name: type:.IBase.IBase> - $receiver: VALUE_PARAMETER name: type:kotlin.collections.List.IBase.> + $receiver: VALUE_PARAMETER name: type:kotlin.collections.List.IBase.> VALUE_PARAMETER name: index:0 type:D of .IBase.? FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] overridden: @@ -52,7 +52,7 @@ FILE fqName: fileName:/delegatedGenericImplementation.kt FUN DELEGATED_MEMBER name:foo visibility:public modality:OPEN ($this:.Test1.Test1>, a:E of .Test1, b:B of .Test1.foo) returnType:kotlin.Unit overridden: public abstract fun foo (a: A of .IBase, b: B of .IBase.foo): kotlin.Unit declared in .IBase - TYPE_PARAMETER DELEGATED_MEMBER name:B index:0 variance: superTypes:[] + TYPE_PARAMETER DELEGATED_MEMBER name:B index:0 variance: superTypes:[kotlin.Any?] $this: VALUE_PARAMETER DELEGATED_MEMBER name: type:.Test1.Test1> VALUE_PARAMETER DELEGATED_MEMBER name:a index:0 type:E of .Test1 VALUE_PARAMETER DELEGATED_MEMBER name:b index:1 type:B of .Test1.foo @@ -64,43 +64,49 @@ FILE fqName: fileName:/delegatedGenericImplementation.kt a: GET_VAR 'a: E of .Test1 declared in .Test1.foo' type=E of .Test1 origin=null b: GET_VAR 'b: B of .Test1.foo declared in .Test1.foo' type=B of .Test1.foo origin=null PROPERTY DELEGATED_MEMBER name:id visibility:public modality:OPEN [val] - FUN DELEGATED_MEMBER name: visibility:public modality:OPEN ($this:.Test1.Test1>) returnType:kotlin.collections.Map.IBase, C of .IBase.>? + FUN DELEGATED_MEMBER name: visibility:public modality:OPEN ($this:.Test1.Test1>, $receiver:C of .Test1.) returnType:kotlin.collections.Map.IBase, C of .IBase.>? correspondingProperty: PROPERTY DELEGATED_MEMBER name:id visibility:public modality:OPEN [val] overridden: public abstract fun (): kotlin.collections.Map.IBase, C of .IBase.>? declared in .IBase - TYPE_PARAMETER DELEGATED_MEMBER name:C index:0 variance: superTypes:[] + TYPE_PARAMETER DELEGATED_MEMBER name:C index:0 variance: superTypes:[kotlin.Any?] $this: VALUE_PARAMETER DELEGATED_MEMBER name: type:.Test1.Test1> + $receiver: VALUE_PARAMETER DELEGATED_MEMBER name: type:C of .Test1. BLOCK_BODY RETURN type=kotlin.Nothing from='public open fun (): kotlin.collections.Map.IBase, C of .IBase.>? declared in .Test1' CALL 'public abstract fun (): kotlin.collections.Map.IBase, C of .IBase.>? declared in .IBase' type=kotlin.collections.Map.Test1, C of .Test1.>? origin=null : $this: GET_FIELD 'FIELD DELEGATE name:<$$delegate_0> type:.IBase.Test1> visibility:local [final]' type=.IBase.Test1> origin=null receiver: GET_VAR ': .Test1.Test1> declared in .Test1.' type=.Test1.Test1> origin=null + $receiver: GET_VAR ': C of .Test1. declared in .Test1.' type=C of .Test1. origin=null PROPERTY DELEGATED_MEMBER name:x visibility:public modality:OPEN [var] - FUN DELEGATED_MEMBER name: visibility:public modality:OPEN ($this:.Test1.Test1>) returnType:D of .IBase.? + FUN DELEGATED_MEMBER name: visibility:public modality:OPEN ($this:.Test1.Test1>, $receiver:kotlin.collections.List.Test1.>) returnType:D of .IBase.? correspondingProperty: PROPERTY DELEGATED_MEMBER name:x visibility:public modality:OPEN [var] overridden: public abstract fun (): D of .IBase.? declared in .IBase - TYPE_PARAMETER DELEGATED_MEMBER name:D index:0 variance: superTypes:[] + TYPE_PARAMETER DELEGATED_MEMBER name:D index:0 variance: superTypes:[kotlin.Any?] $this: VALUE_PARAMETER DELEGATED_MEMBER name: type:.Test1.Test1> + $receiver: VALUE_PARAMETER DELEGATED_MEMBER name: type:kotlin.collections.List.Test1.> BLOCK_BODY RETURN type=kotlin.Nothing from='public open fun (): D of .IBase.? declared in .Test1' CALL 'public abstract fun (): D of .IBase.? declared in .IBase' type=D of .Test1.? origin=null : $this: GET_FIELD 'FIELD DELEGATE name:<$$delegate_0> type:.IBase.Test1> visibility:local [final]' type=.IBase.Test1> origin=null receiver: GET_VAR ': .Test1.Test1> declared in .Test1.' type=.Test1.Test1> origin=null - FUN DELEGATED_MEMBER name: visibility:public modality:OPEN ($this:.Test1.Test1>, :D of .Test1.?) returnType:kotlin.Unit + $receiver: GET_VAR ': kotlin.collections.List.Test1.> declared in .Test1.' type=kotlin.collections.List.Test1.> origin=null + FUN DELEGATED_MEMBER name: visibility:public modality:OPEN ($this:.Test1.Test1>, $receiver:kotlin.collections.List.Test1.>, :D of .Test1.?) returnType:kotlin.Unit correspondingProperty: PROPERTY DELEGATED_MEMBER name:x visibility:public modality:OPEN [var] overridden: public abstract fun (: D of .IBase.?): kotlin.Unit declared in .IBase - TYPE_PARAMETER DELEGATED_MEMBER name:D index:0 variance: superTypes:[] + TYPE_PARAMETER DELEGATED_MEMBER name:D index:0 variance: superTypes:[kotlin.Any?] $this: VALUE_PARAMETER DELEGATED_MEMBER name: type:.Test1.Test1> + $receiver: VALUE_PARAMETER DELEGATED_MEMBER name: type:kotlin.collections.List.Test1.> VALUE_PARAMETER DELEGATED_MEMBER name: index:0 type:D of .Test1.? BLOCK_BODY CALL 'public abstract fun (: D of .IBase.?): kotlin.Unit declared in .IBase' type=kotlin.Unit origin=null : $this: GET_FIELD 'FIELD DELEGATE name:<$$delegate_0> type:.IBase.Test1> visibility:local [final]' type=.IBase.Test1> origin=null receiver: GET_VAR ': .Test1.Test1> declared in .Test1.' type=.Test1.Test1> origin=null + $receiver: GET_VAR ': kotlin.collections.List.Test1.> declared in .Test1.' type=kotlin.collections.List.Test1.> origin=null : GET_VAR ': D of .Test1.? declared in .Test1.' type=D of .Test1.? origin=null FIELD DELEGATE name:<$$delegate_0> type:.IBase.Test1> visibility:local [final] FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] @@ -148,7 +154,7 @@ FILE fqName: fileName:/delegatedGenericImplementation.kt FUN DELEGATED_MEMBER name:foo visibility:public modality:OPEN ($this:.Test2, a:kotlin.String, b:B of .Test2.foo) returnType:kotlin.Unit overridden: public abstract fun foo (a: A of .IBase, b: B of .IBase.foo): kotlin.Unit declared in .IBase - TYPE_PARAMETER DELEGATED_MEMBER name:B index:0 variance: superTypes:[] + TYPE_PARAMETER DELEGATED_MEMBER name:B index:0 variance: superTypes:[kotlin.Any?] $this: VALUE_PARAMETER DELEGATED_MEMBER name: type:.Test2 VALUE_PARAMETER DELEGATED_MEMBER name:a index:0 type:kotlin.String VALUE_PARAMETER DELEGATED_MEMBER name:b index:1 type:B of .Test2.foo @@ -160,43 +166,49 @@ FILE fqName: fileName:/delegatedGenericImplementation.kt a: GET_VAR 'a: kotlin.String declared in .Test2.foo' type=kotlin.String origin=null b: GET_VAR 'b: B of .Test2.foo declared in .Test2.foo' type=B of .Test2.foo origin=null PROPERTY DELEGATED_MEMBER name:id visibility:public modality:OPEN [val] - FUN DELEGATED_MEMBER name: visibility:public modality:OPEN ($this:.Test2) returnType:kotlin.collections.Map.IBase, C of .IBase.>? + FUN DELEGATED_MEMBER name: visibility:public modality:OPEN ($this:.Test2, $receiver:C of .Test2.) returnType:kotlin.collections.Map.IBase, C of .IBase.>? correspondingProperty: PROPERTY DELEGATED_MEMBER name:id visibility:public modality:OPEN [val] overridden: public abstract fun (): kotlin.collections.Map.IBase, C of .IBase.>? declared in .IBase - TYPE_PARAMETER DELEGATED_MEMBER name:C index:0 variance: superTypes:[] + TYPE_PARAMETER DELEGATED_MEMBER name:C index:0 variance: superTypes:[kotlin.Any?] $this: VALUE_PARAMETER DELEGATED_MEMBER name: type:.Test2 + $receiver: VALUE_PARAMETER DELEGATED_MEMBER name: type:C of .Test2. BLOCK_BODY RETURN type=kotlin.Nothing from='public open fun (): kotlin.collections.Map.IBase, C of .IBase.>? declared in .Test2' CALL 'public abstract fun (): kotlin.collections.Map.IBase, C of .IBase.>? declared in .IBase' type=kotlin.collections.Map.Test2.>? origin=null : $this: GET_FIELD 'FIELD DELEGATE name:<$$delegate_0> type:.IBase visibility:local [final]' type=.IBase origin=null receiver: GET_VAR ': .Test2 declared in .Test2.' type=.Test2 origin=null + $receiver: GET_VAR ': C of .Test2. declared in .Test2.' type=C of .Test2. origin=null PROPERTY DELEGATED_MEMBER name:x visibility:public modality:OPEN [var] - FUN DELEGATED_MEMBER name: visibility:public modality:OPEN ($this:.Test2) returnType:D of .IBase.? + FUN DELEGATED_MEMBER name: visibility:public modality:OPEN ($this:.Test2, $receiver:kotlin.collections.List.Test2.>) returnType:D of .IBase.? correspondingProperty: PROPERTY DELEGATED_MEMBER name:x visibility:public modality:OPEN [var] overridden: public abstract fun (): D of .IBase.? declared in .IBase - TYPE_PARAMETER DELEGATED_MEMBER name:D index:0 variance: superTypes:[] + TYPE_PARAMETER DELEGATED_MEMBER name:D index:0 variance: superTypes:[kotlin.Any?] $this: VALUE_PARAMETER DELEGATED_MEMBER name: type:.Test2 + $receiver: VALUE_PARAMETER DELEGATED_MEMBER name: type:kotlin.collections.List.Test2.> BLOCK_BODY RETURN type=kotlin.Nothing from='public open fun (): D of .IBase.? declared in .Test2' CALL 'public abstract fun (): D of .IBase.? declared in .IBase' type=D of .Test2.? origin=null : $this: GET_FIELD 'FIELD DELEGATE name:<$$delegate_0> type:.IBase visibility:local [final]' type=.IBase origin=null receiver: GET_VAR ': .Test2 declared in .Test2.' type=.Test2 origin=null - FUN DELEGATED_MEMBER name: visibility:public modality:OPEN ($this:.Test2, :D of .Test2.?) returnType:kotlin.Unit + $receiver: GET_VAR ': kotlin.collections.List.Test2.> declared in .Test2.' type=kotlin.collections.List.Test2.> origin=null + FUN DELEGATED_MEMBER name: visibility:public modality:OPEN ($this:.Test2, $receiver:kotlin.collections.List.Test2.>, :D of .Test2.?) returnType:kotlin.Unit correspondingProperty: PROPERTY DELEGATED_MEMBER name:x visibility:public modality:OPEN [var] overridden: public abstract fun (: D of .IBase.?): kotlin.Unit declared in .IBase - TYPE_PARAMETER DELEGATED_MEMBER name:D index:0 variance: superTypes:[] + TYPE_PARAMETER DELEGATED_MEMBER name:D index:0 variance: superTypes:[kotlin.Any?] $this: VALUE_PARAMETER DELEGATED_MEMBER name: type:.Test2 + $receiver: VALUE_PARAMETER DELEGATED_MEMBER name: type:kotlin.collections.List.Test2.> VALUE_PARAMETER DELEGATED_MEMBER name: index:0 type:D of .Test2.? BLOCK_BODY CALL 'public abstract fun (: D of .IBase.?): kotlin.Unit declared in .IBase' type=kotlin.Unit origin=null : $this: GET_FIELD 'FIELD DELEGATE name:<$$delegate_0> type:.IBase visibility:local [final]' type=.IBase origin=null receiver: GET_VAR ': .Test2 declared in .Test2.' type=.Test2 origin=null + $receiver: GET_VAR ': kotlin.collections.List.Test2.> declared in .Test2.' type=kotlin.collections.List.Test2.> origin=null : GET_VAR ': D of .Test2.? declared in .Test2.' type=D of .Test2.? origin=null FIELD DELEGATE name:<$$delegate_0> type:.IBase visibility:local [final] FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] diff --git a/compiler/testData/ir/irText/declarations/genericDelegatedProperty.fir.txt b/compiler/testData/ir/irText/declarations/genericDelegatedProperty.fir.txt index ef60d86f2f4..4a2e50bf8e8 100644 --- a/compiler/testData/ir/irText/declarations/genericDelegatedProperty.fir.txt +++ b/compiler/testData/ir/irText/declarations/genericDelegatedProperty.fir.txt @@ -66,15 +66,15 @@ FILE fqName: fileName:/genericDelegatedProperty.kt thisRef: GET_VAR ': .C.> declared in .' type=.C.> origin=null kProp: PROPERTY_REFERENCE 'public final genericDelegatedProperty: kotlin.Int [delegated,var]' field=null getter='public final fun (): kotlin.Int declared in ' setter='public final fun (: kotlin.Int): kotlin.Unit declared in ' type=kotlin.reflect.KMutableProperty1<.C.>, kotlin.Int> origin=PROPERTY_REFERENCE_FOR_DELEGATE <1>: - FUN DELEGATED_PROPERTY_ACCESSOR name: visibility:public modality:FINAL ($receiver:.C.>, :kotlin.Int) returnType:kotlin.Unit + FUN DELEGATED_PROPERTY_ACCESSOR name: visibility:public modality:FINAL ($receiver:.C.>, :kotlin.Int) returnType:kotlin.Unit correspondingProperty: PROPERTY name:genericDelegatedProperty visibility:public modality:FINAL [delegated,var] TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?] - $receiver: VALUE_PARAMETER name: type:.C.> + $receiver: VALUE_PARAMETER name: type:.C.> VALUE_PARAMETER name: index:0 type:kotlin.Int BLOCK_BODY CALL 'public final fun setValue (thisRef: kotlin.Any?, kProp: kotlin.Any?, newValue: kotlin.Int): kotlin.Unit [operator] declared in .Delegate' type=kotlin.Unit origin=null $this: GET_FIELD 'FIELD PROPERTY_DELEGATE name:genericDelegatedProperty$delegate type:.Delegate visibility:private [final,static]' type=.Delegate origin=null - thisRef: GET_VAR ': .C.> declared in .' type=.C.> origin=null + thisRef: GET_VAR ': .C.> declared in .' type=.C.> origin=null kProp: PROPERTY_REFERENCE 'public final genericDelegatedProperty: kotlin.Int [delegated,var]' field=null getter='public final fun (): kotlin.Int declared in ' setter='public final fun (: kotlin.Int): kotlin.Unit declared in ' type=kotlin.reflect.KMutableProperty1<.C.>, kotlin.Int> origin=PROPERTY_REFERENCE_FOR_DELEGATE <1>: newValue: GET_VAR ': kotlin.Int declared in .' type=kotlin.Int origin=null diff --git a/compiler/testData/ir/irText/regressions/integerCoercionToT.fir.txt b/compiler/testData/ir/irText/regressions/integerCoercionToT.fir.txt index 23c3febedca..7a3c773ed34 100644 --- a/compiler/testData/ir/irText/regressions/integerCoercionToT.fir.txt +++ b/compiler/testData/ir/irText/regressions/integerCoercionToT.fir.txt @@ -49,10 +49,10 @@ FILE fqName: fileName:/integerCoercionToT.kt BLOCK_BODY RETURN type=kotlin.Nothing from='public final fun (): T_INT of . declared in ' CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin' type=kotlin.Nothing origin=null - FUN name: visibility:public modality:FINAL ($receiver:.CInt32VarX.>, value:T_INT of .) returnType:kotlin.Unit + FUN name: visibility:public modality:FINAL ($receiver:.CInt32VarX.>, value:T_INT of .) returnType:kotlin.Unit correspondingProperty: PROPERTY name:value visibility:public modality:FINAL [var] TYPE_PARAMETER name:T_INT index:0 variance: superTypes:[kotlin.Int] - $receiver: VALUE_PARAMETER name: type:.CInt32VarX.> + $receiver: VALUE_PARAMETER name: type:.CInt32VarX.> VALUE_PARAMETER name:value index:0 type:T_INT of . BLOCK_BODY CLASS CLASS name:IdType modality:FINAL visibility:public superTypes:[.CPointed] diff --git a/compiler/testData/ir/irText/types/genericPropertyReferenceType.fir.txt b/compiler/testData/ir/irText/types/genericPropertyReferenceType.fir.txt index 34648e202b5..7471e9924c6 100644 --- a/compiler/testData/ir/irText/types/genericPropertyReferenceType.fir.txt +++ b/compiler/testData/ir/irText/types/genericPropertyReferenceType.fir.txt @@ -48,14 +48,14 @@ FILE fqName: fileName:/genericPropertyReferenceType.kt RETURN type=kotlin.Nothing from='public final fun (): T of . declared in ' CALL 'public final fun (): T of .C declared in .C' type=T of . origin=GET_PROPERTY $this: GET_VAR ': .C.> declared in .' type=.C.> origin=null - FUN name: visibility:public modality:FINAL ($receiver:.C.>, v:T of .) returnType:kotlin.Unit + FUN name: visibility:public modality:FINAL ($receiver:.C.>, v:T of .) returnType:kotlin.Unit correspondingProperty: PROPERTY name:y visibility:public modality:FINAL [var] TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?] - $receiver: VALUE_PARAMETER name: type:.C.> + $receiver: VALUE_PARAMETER name: type:.C.> VALUE_PARAMETER name:v index:0 type:T of . BLOCK_BODY CALL 'public final fun (: T of .C): kotlin.Unit declared in .C' type=kotlin.Unit origin=EQ - $this: GET_VAR ': .C.> declared in .' type=.C.> origin=null + $this: GET_VAR ': .C.> declared in .' type=.C.> origin=null : GET_VAR 'v: T of . declared in .' type=T of . origin=null FUN name:use visibility:public modality:FINAL <> (p:kotlin.reflect.KMutableProperty) returnType:kotlin.Unit VALUE_PARAMETER name:p index:0 type:kotlin.reflect.KMutableProperty