From 3b967017f6a152cf6fb9cd21ce6097f03842f9ec Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Mon, 26 Mar 2018 18:03:54 +0300 Subject: [PATCH] Render type arguments by index --- .../jetbrains/kotlin/ir/util/DumpIrTree.kt | 28 ++++++++++++++----- .../ir/irText/expressions/classReference.txt | 2 ++ .../expressions/genericPropertyCall.txt | 1 + .../expressions/objectClassReference.txt | 1 + .../irText/expressions/useImportedMember.txt | 2 ++ .../irText/regressions/integerCoercionToT.txt | 1 + 6 files changed, 28 insertions(+), 7 deletions(-) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DumpIrTree.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DumpIrTree.kt index 86bbc532252..17bb3553d8b 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DumpIrTree.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DumpIrTree.kt @@ -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 { } 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 + "" + } + override fun visitGetField(expression: IrGetField, data: String) { expression.dumpLabeledElementWith(data) { expression.receiver?.accept(this, "receiver") diff --git a/compiler/testData/ir/irText/expressions/classReference.txt b/compiler/testData/ir/irText/expressions/classReference.txt index 33b293c22ca..701afca4181 100644 --- a/compiler/testData/ir/irText/expressions/classReference.txt +++ b/compiler/testData/ir/irText/expressions/classReference.txt @@ -32,10 +32,12 @@ FILE fqName: 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 '() on KClass: Class' type=java.lang.Class origin=GET_PROPERTY + <`0>: A $receiver: CLASS_REFERENCE 'A' type=kotlin.reflect.KClass 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 '() on KClass: Class' type=java.lang.Class origin=GET_PROPERTY + <`0>: CapturedTypeConstructor(out A) $receiver: GET_CLASS type=kotlin.reflect.KClass CALL 'constructor A()' type=A origin=null diff --git a/compiler/testData/ir/irText/expressions/genericPropertyCall.txt b/compiler/testData/ir/irText/expressions/genericPropertyCall.txt index bd0a49143d9..a67517c9eb5 100644 --- a/compiler/testData/ir/irText/expressions/genericPropertyCall.txt +++ b/compiler/testData/ir/irText/expressions/genericPropertyCall.txt @@ -12,6 +12,7 @@ FILE fqName: fileName:/genericPropertyCall.kt FIELD PROPERTY_BACKING_FIELD name:test type:kotlin.String visibility:public EXPRESSION_BODY CALL '() on String: String' type=kotlin.String origin=GET_PROPERTY + <`0>: String $receiver: CONST String type=kotlin.String value=abc FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:String flags: BLOCK_BODY diff --git a/compiler/testData/ir/irText/expressions/objectClassReference.txt b/compiler/testData/ir/irText/expressions/objectClassReference.txt index da0f5ba85ff..55286c730a8 100644 --- a/compiler/testData/ir/irText/expressions/objectClassReference.txt +++ b/compiler/testData/ir/irText/expressions/objectClassReference.txt @@ -28,5 +28,6 @@ FILE fqName: 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 '() on KClass: Class' type=java.lang.Class origin=GET_PROPERTY + <`0>: A $receiver: CLASS_REFERENCE 'A' type=kotlin.reflect.KClass diff --git a/compiler/testData/ir/irText/expressions/useImportedMember.txt b/compiler/testData/ir/irText/expressions/useImportedMember.txt index 26cf2926d2e..85f316c9da4 100644 --- a/compiler/testData/ir/irText/expressions/useImportedMember.txt +++ b/compiler/testData/ir/irText/expressions/useImportedMember.txt @@ -249,6 +249,7 @@ FILE fqName: 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 '() 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: 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 '() 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 diff --git a/compiler/testData/ir/irText/regressions/integerCoercionToT.txt b/compiler/testData/ir/irText/regressions/integerCoercionToT.txt index a4191669533..320546c74b9 100644 --- a/compiler/testData/ir/irText/regressions/integerCoercionToT.txt +++ b/compiler/testData/ir/irText/regressions/integerCoercionToT.txt @@ -102,6 +102,7 @@ FILE fqName: fileName:/integerCoercionToT.kt VALUE_PARAMETER name:cv index:1 type:CInt32Var /* = CInt32VarX */ flags: BLOCK_BODY CALL '(Int) on CInt32VarX: Unit' type=kotlin.Unit origin=EQ + <`0>: Int $receiver: GET_VAR 'value-parameter cv: CInt32Var /* = CInt32VarX */' type=CInt32Var /* = CInt32VarX */ origin=null value: CALL '(): Int' type=kotlin.Int origin=GET_PROPERTY $this: GET_VAR 'value-parameter value: IdType' type=IdType origin=null