Render type arguments by index
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.ir.util
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.SourceManager
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
@@ -172,16 +173,29 @@ class DumpIrTreeVisitor(out: Appendable) : IrElementVisitor<Unit, String> {
|
||||
}
|
||||
|
||||
private fun dumpTypeArguments(expression: IrMemberAccessExpression) {
|
||||
for (typeParameter in expression.descriptor.original.typeParameters) {
|
||||
val renderedParameter = DescriptorRenderer.ONLY_NAMES_WITH_SHORT_TYPES.render(typeParameter)
|
||||
val typeArgument = expression.getTypeArgument(typeParameter)
|
||||
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")
|
||||
for (index in 0 until expression.typeArgumentsCount) {
|
||||
printer.println(
|
||||
"${expression.descriptor.renderTypeParameter(index)}: ${expression.renderTypeArgument(index)}"
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
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) {
|
||||
expression.dumpLabeledElementWith(data) {
|
||||
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
|
||||
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
|
||||
<`0>: A
|
||||
$receiver: CLASS_REFERENCE 'A' type=kotlin.reflect.KClass<A>
|
||||
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:
|
||||
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>
|
||||
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
|
||||
EXPRESSION_BODY
|
||||
CALL '<get-id>() on String: String' type=kotlin.String origin=GET_PROPERTY
|
||||
<`0>: String
|
||||
$receiver: CONST String type=kotlin.String value=abc
|
||||
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test> visibility:public modality:FINAL <> () returnType:String flags:
|
||||
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
|
||||
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
|
||||
<`0>: 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
|
||||
arg0: CALL 'EQEQ(Any?, Any?): Boolean' type=kotlin.Boolean origin=EXCLEQ
|
||||
arg0: CALL '<get-g2>() on String: String' type=kotlin.String origin=GET_PROPERTY
|
||||
<`0>: String
|
||||
$this: GET_OBJECT 'C' type=C
|
||||
$receiver: 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
|
||||
arg0: CALL 'EQEQ(Any?, Any?): Boolean' type=kotlin.Boolean origin=EXCLEQ
|
||||
arg0: CALL '<get-fromClass>() on String: String' type=kotlin.String origin=GET_PROPERTY
|
||||
<`0>: String
|
||||
$this: GET_OBJECT 'C' type=C
|
||||
$receiver: 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:
|
||||
BLOCK_BODY
|
||||
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
|
||||
value: CALL '<get-value>(): Int' type=kotlin.Int origin=GET_PROPERTY
|
||||
$this: GET_VAR 'value-parameter value: IdType' type=IdType origin=null
|
||||
|
||||
Reference in New Issue
Block a user