Render type arguments by index
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.ir.util
|
package org.jetbrains.kotlin.ir.util
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.SourceManager
|
import org.jetbrains.kotlin.ir.SourceManager
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
@@ -172,16 +173,29 @@ class DumpIrTreeVisitor(out: Appendable) : IrElementVisitor<Unit, String> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun dumpTypeArguments(expression: IrMemberAccessExpression) {
|
private fun dumpTypeArguments(expression: IrMemberAccessExpression) {
|
||||||
for (typeParameter in expression.descriptor.original.typeParameters) {
|
for (index in 0 until expression.typeArgumentsCount) {
|
||||||
val renderedParameter = DescriptorRenderer.ONLY_NAMES_WITH_SHORT_TYPES.render(typeParameter)
|
printer.println(
|
||||||
val typeArgument = expression.getTypeArgument(typeParameter)
|
"${expression.descriptor.renderTypeParameter(index)}: ${expression.renderTypeArgument(index)}"
|
||||||
val renderedType = typeArgument?.let {
|
)
|
||||||
DescriptorRenderer.ONLY_NAMES_WITH_SHORT_TYPES.renderType(typeArgument)
|
|
||||||
} ?: "--- No type argument for $typeParameter declared in ${typeParameter.containingDeclaration}"
|
|
||||||
printer.println("$renderedParameter: $renderedType")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun CallableDescriptor.renderTypeParameter(index: Int): String {
|
||||||
|
val typeParameter = original.typeParameters.getOrNull(index)
|
||||||
|
return if (typeParameter != null)
|
||||||
|
DescriptorRenderer.ONLY_NAMES_WITH_SHORT_TYPES.render(typeParameter)
|
||||||
|
else
|
||||||
|
"<`$index>"
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun IrMemberAccessExpression.renderTypeArgument(index: Int): String {
|
||||||
|
val typeArgument = getTypeArgument(index)
|
||||||
|
return if (typeArgument != null)
|
||||||
|
DescriptorRenderer.ONLY_NAMES_WITH_SHORT_TYPES.renderType(typeArgument)
|
||||||
|
else
|
||||||
|
"<none>"
|
||||||
|
}
|
||||||
|
|
||||||
override fun visitGetField(expression: IrGetField, data: String) {
|
override fun visitGetField(expression: IrGetField, data: String) {
|
||||||
expression.dumpLabeledElementWith(data) {
|
expression.dumpLabeledElementWith(data) {
|
||||||
expression.receiver?.accept(this, "receiver")
|
expression.receiver?.accept(this, "receiver")
|
||||||
|
|||||||
@@ -32,10 +32,12 @@ FILE fqName:<root> fileName:/classReference.kt
|
|||||||
TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit
|
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:
|
typeOperand: CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public flags:
|
||||||
CALL '<get-java>() on KClass<A>: Class<A>' type=java.lang.Class<A> origin=GET_PROPERTY
|
CALL '<get-java>() on KClass<A>: Class<A>' type=java.lang.Class<A> origin=GET_PROPERTY
|
||||||
|
<`0>: A
|
||||||
$receiver: CLASS_REFERENCE 'A' type=kotlin.reflect.KClass<A>
|
$receiver: CLASS_REFERENCE 'A' type=kotlin.reflect.KClass<A>
|
||||||
TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit
|
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:
|
typeOperand: CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public flags:
|
||||||
CALL '<get-java>() on KClass<out A>: Class<out A>' type=java.lang.Class<out A> origin=GET_PROPERTY
|
CALL '<get-java>() on KClass<out A>: Class<out A>' type=java.lang.Class<out A> origin=GET_PROPERTY
|
||||||
|
<`0>: CapturedTypeConstructor(out A)
|
||||||
$receiver: GET_CLASS type=kotlin.reflect.KClass<out A>
|
$receiver: GET_CLASS type=kotlin.reflect.KClass<out A>
|
||||||
CALL 'constructor A()' type=A origin=null
|
CALL 'constructor A()' type=A origin=null
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ FILE fqName:<root> fileName:/genericPropertyCall.kt
|
|||||||
FIELD PROPERTY_BACKING_FIELD name:test type:kotlin.String visibility:public
|
FIELD PROPERTY_BACKING_FIELD name:test type:kotlin.String visibility:public
|
||||||
EXPRESSION_BODY
|
EXPRESSION_BODY
|
||||||
CALL '<get-id>() on String: String' type=kotlin.String origin=GET_PROPERTY
|
CALL '<get-id>() on String: String' type=kotlin.String origin=GET_PROPERTY
|
||||||
|
<`0>: String
|
||||||
$receiver: CONST String type=kotlin.String value=abc
|
$receiver: CONST String type=kotlin.String value=abc
|
||||||
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test> visibility:public modality:FINAL <> () returnType:String flags:
|
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test> visibility:public modality:FINAL <> () returnType:String flags:
|
||||||
BLOCK_BODY
|
BLOCK_BODY
|
||||||
|
|||||||
@@ -28,5 +28,6 @@ FILE fqName:<root> fileName:/objectClassReference.kt
|
|||||||
TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit
|
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:
|
typeOperand: CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public flags:
|
||||||
CALL '<get-java>() on KClass<A>: Class<A>' type=java.lang.Class<A> origin=GET_PROPERTY
|
CALL '<get-java>() on KClass<A>: Class<A>' type=java.lang.Class<A> origin=GET_PROPERTY
|
||||||
|
<`0>: A
|
||||||
$receiver: CLASS_REFERENCE 'A' type=kotlin.reflect.KClass<A>
|
$receiver: CLASS_REFERENCE 'A' type=kotlin.reflect.KClass<A>
|
||||||
|
|
||||||
|
|||||||
@@ -249,6 +249,7 @@ FILE fqName:<root> fileName:/useImportedMember.kt
|
|||||||
if: CALL 'NOT(Boolean): Boolean' type=kotlin.Boolean origin=EXCLEQ
|
if: CALL 'NOT(Boolean): Boolean' type=kotlin.Boolean origin=EXCLEQ
|
||||||
arg0: CALL 'EQEQ(Any?, Any?): Boolean' type=kotlin.Boolean origin=EXCLEQ
|
arg0: CALL 'EQEQ(Any?, Any?): Boolean' type=kotlin.Boolean origin=EXCLEQ
|
||||||
arg0: CALL '<get-g2>() on String: String' type=kotlin.String origin=GET_PROPERTY
|
arg0: CALL '<get-g2>() on String: String' type=kotlin.String origin=GET_PROPERTY
|
||||||
|
<`0>: String
|
||||||
$this: GET_OBJECT 'C' type=C
|
$this: GET_OBJECT 'C' type=C
|
||||||
$receiver: CONST String type=kotlin.String value=8
|
$receiver: CONST String type=kotlin.String value=8
|
||||||
arg1: CONST String type=kotlin.String value=8
|
arg1: CONST String type=kotlin.String value=8
|
||||||
@@ -270,6 +271,7 @@ FILE fqName:<root> fileName:/useImportedMember.kt
|
|||||||
if: CALL 'NOT(Boolean): Boolean' type=kotlin.Boolean origin=EXCLEQ
|
if: CALL 'NOT(Boolean): Boolean' type=kotlin.Boolean origin=EXCLEQ
|
||||||
arg0: CALL 'EQEQ(Any?, Any?): Boolean' type=kotlin.Boolean origin=EXCLEQ
|
arg0: CALL 'EQEQ(Any?, Any?): Boolean' type=kotlin.Boolean origin=EXCLEQ
|
||||||
arg0: CALL '<get-fromClass>() on String: String' type=kotlin.String origin=GET_PROPERTY
|
arg0: CALL '<get-fromClass>() on String: String' type=kotlin.String origin=GET_PROPERTY
|
||||||
|
<`0>: String
|
||||||
$this: GET_OBJECT 'C' type=C
|
$this: GET_OBJECT 'C' type=C
|
||||||
$receiver: CONST String type=kotlin.String value=10
|
$receiver: CONST String type=kotlin.String value=10
|
||||||
arg1: CONST String type=kotlin.String value=10
|
arg1: CONST String type=kotlin.String value=10
|
||||||
|
|||||||
@@ -102,6 +102,7 @@ FILE fqName:<root> fileName:/integerCoercionToT.kt
|
|||||||
VALUE_PARAMETER name:cv index:1 type:CInt32Var /* = CInt32VarX<kotlin.Int> */ flags:
|
VALUE_PARAMETER name:cv index:1 type:CInt32Var /* = CInt32VarX<kotlin.Int> */ flags:
|
||||||
BLOCK_BODY
|
BLOCK_BODY
|
||||||
CALL '<set-value>(Int) on CInt32VarX<Int>: Unit' type=kotlin.Unit origin=EQ
|
CALL '<set-value>(Int) on CInt32VarX<Int>: Unit' type=kotlin.Unit origin=EQ
|
||||||
|
<`0>: Int
|
||||||
$receiver: GET_VAR 'value-parameter cv: CInt32Var /* = CInt32VarX<Int> */' type=CInt32Var /* = CInt32VarX<kotlin.Int> */ origin=null
|
$receiver: GET_VAR 'value-parameter cv: CInt32Var /* = CInt32VarX<Int> */' type=CInt32Var /* = CInt32VarX<kotlin.Int> */ origin=null
|
||||||
value: CALL '<get-value>(): Int' type=kotlin.Int origin=GET_PROPERTY
|
value: CALL '<get-value>(): Int' type=kotlin.Int origin=GET_PROPERTY
|
||||||
$this: GET_VAR 'value-parameter value: IdType' type=IdType origin=null
|
$this: GET_VAR 'value-parameter value: IdType' type=IdType origin=null
|
||||||
|
|||||||
Reference in New Issue
Block a user