From 77b93ab7ad7c4273a797a0ba9516d32470c6a6d2 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Mon, 8 Jan 2018 12:45:25 +0100 Subject: [PATCH] Add classType property in IrClassReference, support class references in codegen --- .../backend/jvm/codegen/ExpressionCodegen.kt | 26 +++++++++++-------- .../ReflectionReferencesGenerator.kt | 3 +-- .../kotlin/ir/expressions/IrClassReference.kt | 2 ++ .../expressions/impl/IrClassReferenceImpl.kt | 8 +++--- .../kotlin/ir/util/DeepCopyIrTree.kt | 3 ++- .../ir/util/DeepCopyIrTreeWithSymbols.kt | 3 ++- 6 files changed, 27 insertions(+), 18 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt index 1ac3e954ca4..4aed850c54e 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt @@ -21,8 +21,10 @@ import org.jetbrains.kotlin.backend.jvm.intrinsics.IrIntrinsicMethods import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.codegen.* import org.jetbrains.kotlin.codegen.AsmUtil.* +import org.jetbrains.kotlin.codegen.ExpressionCodegen.putReifiedOperationMarkerIfTypeIsReifiedParameter import org.jetbrains.kotlin.codegen.StackValue.* import org.jetbrains.kotlin.codegen.inline.NameGenerator +import org.jetbrains.kotlin.codegen.inline.ReifiedTypeInliner import org.jetbrains.kotlin.codegen.inline.ReifiedTypeParametersUsages import org.jetbrains.kotlin.codegen.inline.TypeParameterMappings import org.jetbrains.kotlin.codegen.intrinsics.JavaClassProperty @@ -46,6 +48,7 @@ import org.jetbrains.kotlin.resolve.jvm.AsmTypes.JAVA_THROWABLE_TYPE import org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.typesApproximation.approximateCapturedTypes import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull import org.jetbrains.kotlin.utils.keysToMap @@ -889,21 +892,22 @@ class ExpressionCodegen( } fun generateClassLiteralReference( - receiverExpression: IrExpression, - wrapIntoKClass: Boolean, - data: BlockInfo + classReference: IrExpression, + wrapIntoKClass: Boolean, + data: BlockInfo ) { - if (receiverExpression !is IrClassReference /* && DescriptorUtils.isObjectQualifier(receiverExpression.descriptor)*/) { - assert(receiverExpression is IrGetClass) - JavaClassProperty.generateImpl(mv, gen((receiverExpression as IrGetClass).argument, data)) + if (classReference !is IrClassReference /* && DescriptorUtils.isObjectQualifier(classReference.descriptor)*/) { + assert(classReference is IrGetClass) + JavaClassProperty.generateImpl(mv, gen((classReference as IrGetClass).argument, data)) } else { -// if (TypeUtils.isTypeParameter(type)) { -// assert(TypeUtils.isReifiedTypeParameter(type)) { "Non-reified type parameter under ::class should be rejected by type checker: " + type } -// putReifiedOperationMarkerIfTypeIsReifiedParameter(type, ReifiedTypeInliner.OperationKind.JAVA_CLASS) -// } + val type = classReference.classType + if (TypeUtils.isTypeParameter(type)) { + assert(TypeUtils.isReifiedTypeParameter(type)) { "Non-reified type parameter under ::class should be rejected by type checker: " + type } + putReifiedOperationMarkerIfTypeIsReifiedParameter(type, ReifiedTypeInliner.OperationKind.JAVA_CLASS, mv, this) + } - putJavaLangClassInstance(mv, typeMapper.mapType(receiverExpression.descriptor.defaultType)) + putJavaLangClassInstance(mv, typeMapper.mapType(type)) } if (wrapIntoKClass) { diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt index 7e579c34d19..1013acc4faa 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt @@ -25,7 +25,6 @@ import org.jetbrains.kotlin.psi.KtCallableReferenceExpression import org.jetbrains.kotlin.psi.KtClassLiteralExpression import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.startOffset -import org.jetbrains.kotlin.psi2ir.intermediate.TransientReceiverValue import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.ImportedFromObjectCallableDescriptor import org.jetbrains.kotlin.types.KotlinType @@ -46,7 +45,7 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St val typeClass = typeConstructorDeclaration ?: throw AssertionError("Unexpected type constructor for ${lhs.type}: $typeConstructorDeclaration") IrClassReferenceImpl(ktClassLiteral.startOffset, ktClassLiteral.endOffset, resultType, - context.symbolTable.referenceClassifier(typeClass)) + context.symbolTable.referenceClassifier(typeClass), lhs.type) } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrClassReference.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrClassReference.kt index 14213b88316..35675b14711 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrClassReference.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrClassReference.kt @@ -18,10 +18,12 @@ package org.jetbrains.kotlin.ir.expressions import org.jetbrains.kotlin.descriptors.ClassifierDescriptor import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol +import org.jetbrains.kotlin.types.KotlinType interface IrClassReference : IrDeclarationReference { override val descriptor: ClassifierDescriptor override val symbol: IrClassifierSymbol + val classType: KotlinType } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrClassReferenceImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrClassReferenceImpl.kt index 8d20edf5b25..c7c6b7b330d 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrClassReferenceImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrClassReferenceImpl.kt @@ -30,7 +30,8 @@ class IrClassReferenceImpl( startOffset: Int, endOffset: Int, type: KotlinType, - symbol: IrClassifierSymbol + symbol: IrClassifierSymbol, + override val classType: KotlinType ) : IrClassReference, IrTerminalDeclarationReferenceBase( startOffset, endOffset, type, @@ -42,8 +43,9 @@ class IrClassReferenceImpl( startOffset: Int, endOffset: Int, type: KotlinType, - descriptor: ClassifierDescriptor - ) : this(startOffset, endOffset, type, createClassifierSymbolForClassReference(descriptor)) + descriptor: ClassifierDescriptor, + classType: KotlinType + ) : this(startOffset, endOffset, type, createClassifierSymbolForClassReference(descriptor), classType) override val descriptor: ClassifierDescriptor get() = symbol.descriptor diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt index 40263f42060..db613096691 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt @@ -446,7 +446,8 @@ open class DeepCopyIrTree : IrElementTransformerVoid() { IrClassReferenceImpl( expression.startOffset, expression.endOffset, expression.type, - mapClassifierReference(expression.descriptor) + mapClassifierReference(expression.descriptor), + expression.classType ) override fun visitInstanceInitializerCall(expression: IrInstanceInitializerCall): IrInstanceInitializerCall = diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt index 0e611a120dd..26fafbc6797 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt @@ -410,7 +410,8 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper) IrClassReferenceImpl( expression.startOffset, expression.endOffset, expression.type, - symbolRemapper.getReferencedClassifier(expression.symbol) + symbolRemapper.getReferencedClassifier(expression.symbol), + expression.classType ) override fun visitInstanceInitializerCall(expression: IrInstanceInitializerCall): IrInstanceInitializerCall =