Render type arguments by index

This commit is contained in:
Dmitry Petrov
2018-03-26 18:03:54 +03:00
parent b5607e4b3d
commit 3b967017f6
6 changed files with 28 additions and 7 deletions
@@ -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