From 4bebfd33b9359bd60520beecba32b60ce4dda89d Mon Sep 17 00:00:00 2001 From: Roman Artemev Date: Thu, 26 Mar 2020 16:48:46 +0300 Subject: [PATCH] [IR] Fix unbound type parameter symbol for jvm corner cases --- .../psi2ir/generators/AssignmentGenerator.kt | 1 + .../kotlin/psi2ir/generators/CallGenerator.kt | 2 +- .../kotlin/psi2ir/generators/GeneratorContext.kt | 6 +++--- .../kotlin/psi2ir/intermediate/PropertyLValue.kt | 7 +++++-- .../transformations/InsertImplicitCasts.kt | 16 +++++++--------- .../kotlin/ir/util/ConstantValueGenerator.kt | 2 +- .../smartCastOnFieldReceiverOfGenericType.txt | 6 +++--- 7 files changed, 21 insertions(+), 19 deletions(-) diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/AssignmentGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/AssignmentGenerator.kt index 79c57510eab..8cca831e5fa 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/AssignmentGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/AssignmentGenerator.kt @@ -343,6 +343,7 @@ class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGen scope, ktExpression.startOffsetSkippingComments, ktExpression.endOffset, origin, context.symbolTable.referenceField(unwrappedPropertyDescriptor.original), + unwrappedPropertyDescriptor, propertyIrType, propertyReceiver, superQualifierSymbol diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/CallGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/CallGenerator.kt index 98e3a77c7e2..2c9482843c0 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/CallGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/CallGenerator.kt @@ -187,7 +187,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator dispatchReceiverValue?.load(), IrStatementOrigin.GET_PROPERTY, superQualifierSymbol - ) + ).also { context.callToSubstitutedDescriptorMap[it] = descriptor } } } else { call.callReceiver.adjustForCallee(getMethodDescriptor).call { dispatchReceiverValue, extensionReceiverValue -> diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/GeneratorContext.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/GeneratorContext.kt index 9fff8b18d3f..e8eebdb0fe5 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/GeneratorContext.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/GeneratorContext.kt @@ -12,7 +12,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.NotFoundClasses import org.jetbrains.kotlin.ir.builders.IrGeneratorContext import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns -import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression +import org.jetbrains.kotlin.ir.expressions.IrDeclarationReference import org.jetbrains.kotlin.ir.util.ConstantValueGenerator import org.jetbrains.kotlin.ir.util.IdSignatureComposer import org.jetbrains.kotlin.ir.util.SymbolTable @@ -60,14 +60,14 @@ class GeneratorContext( override val irBuiltIns: IrBuiltIns ) : IrGeneratorContext() { - val callToSubstitutedDescriptorMap = mutableMapOf() + val callToSubstitutedDescriptorMap = mutableMapOf() val sourceManager = PsiSourceManager() // TODO: inject a correct StorageManager instance, or store NotFoundClasses inside ModuleDescriptor val reflectionTypes = ReflectionTypes(moduleDescriptor, NotFoundClasses(LockBasedStorageManager.NO_LOCKS, moduleDescriptor)) - fun IrMemberAccessExpression.commitSubstituted(descriptor: CallableDescriptor) { + fun IrDeclarationReference.commitSubstituted(descriptor: CallableDescriptor) { callToSubstitutedDescriptorMap[this] = descriptor } } diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/intermediate/PropertyLValue.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/intermediate/PropertyLValue.kt index 8dc523b0e23..cea0bd7441a 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/intermediate/PropertyLValue.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/intermediate/PropertyLValue.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.psi2ir.intermediate import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.ir.builders.Scope import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression @@ -72,6 +73,7 @@ class FieldPropertyLValue( endOffset: Int, origin: IrStatementOrigin?, val field: IrFieldSymbol, + val descriptor: PropertyDescriptor, type: IrType, callReceiver: CallReceiver, superQualifier: IrClassSymbol? @@ -88,7 +90,7 @@ class FieldPropertyLValue( dispatchReceiverValue?.load(), origin, superQualifier - ) + ).also { context.callToSubstitutedDescriptorMap[it] = descriptor } } override fun store(irExpression: IrExpression) = @@ -102,7 +104,7 @@ class FieldPropertyLValue( context.irBuiltIns.unitType, origin, superQualifier - ) + ).also { context.callToSubstitutedDescriptorMap[it] = descriptor } } override fun withReceiver(dispatchReceiver: VariableLValue?, extensionReceiver: VariableLValue?): PropertyLValueBase = @@ -110,6 +112,7 @@ class FieldPropertyLValue( context, scope, startOffset, endOffset, origin, field, + descriptor, type, SimpleCallReceiver(dispatchReceiver, extensionReceiver), superQualifier diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt index 0dc5952fd5c..4f3d6297395 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt @@ -19,10 +19,7 @@ package org.jetbrains.kotlin.psi2ir.transformations import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.isFunctionType import org.jetbrains.kotlin.builtins.isSuspendFunctionType -import org.jetbrains.kotlin.descriptors.CallableDescriptor -import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor -import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement @@ -62,7 +59,7 @@ internal class InsertImplicitCasts( private val builtIns: KotlinBuiltIns, private val irBuiltIns: IrBuiltIns, private val typeTranslator: TypeTranslator, - private val callToSubstitutedDescriptorMap: Map, + private val callToSubstitutedDescriptorMap: Map, private val generatorExtensions: GeneratorExtensions ) : IrElementTransformerVoid() { @@ -84,7 +81,7 @@ internal class InsertImplicitCasts( private fun KotlinType.toIrType() = typeTranslator.translateType(this) - private val IrMemberAccessExpression.substitutedDescriptor + private val IrDeclarationReference.substitutedDescriptor get() = callToSubstitutedDescriptorMap[this] ?: symbol.descriptor as CallableDescriptor override fun visitCallableReference(expression: IrCallableReference): IrExpression { @@ -189,13 +186,14 @@ internal class InsertImplicitCasts( override fun visitGetField(expression: IrGetField): IrExpression = expression.transformPostfix { - receiver = receiver?.cast(getEffectiveDispatchReceiverType(expression.symbol.descriptor)) + receiver = receiver?.cast(getEffectiveDispatchReceiverType(expression.substitutedDescriptor)) } override fun visitSetField(expression: IrSetField): IrExpression = expression.transformPostfix { - receiver = receiver?.cast(getEffectiveDispatchReceiverType(expression.symbol.descriptor)) - value = value.cast(expression.symbol.descriptor.type) + val substituted = expression.substitutedDescriptor as PropertyDescriptor + receiver = receiver?.cast(getEffectiveDispatchReceiverType(substituted)) + value = value.cast(substituted.type) } override fun visitVariable(declaration: IrVariable): IrVariable = diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/ConstantValueGenerator.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/ConstantValueGenerator.kt index a86d0ea0087..1f6b6540e0f 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/ConstantValueGenerator.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/ConstantValueGenerator.kt @@ -117,7 +117,7 @@ class ConstantValueGenerator( IrClassReferenceImpl( startOffset, endOffset, constantValue.getType(moduleDescriptor).toIrType(), - classifierDescriptor.defaultType.toIrType().classifierOrFail, + symbolTable.referenceClassifier(classifierDescriptor), classifierKtType.toIrType() ) } diff --git a/compiler/testData/ir/irText/types/smartCastOnFieldReceiverOfGenericType.txt b/compiler/testData/ir/irText/types/smartCastOnFieldReceiverOfGenericType.txt index 553eb17833e..8c9701788ee 100644 --- a/compiler/testData/ir/irText/types/smartCastOnFieldReceiverOfGenericType.txt +++ b/compiler/testData/ir/irText/types/smartCastOnFieldReceiverOfGenericType.txt @@ -10,9 +10,9 @@ FILE fqName: fileName:/smartCastOnFieldReceiverOfGenericType.kt TYPE_OP type=kotlin.String origin=CAST typeOperand=kotlin.String GET_VAR 'b: kotlin.Any declared in .testSetField' type=kotlin.Any origin=null SET_FIELD 'FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:value type:T of .JCell? visibility:public' type=kotlin.Unit origin=EQ - receiver: TYPE_OP type=.JCell.JCell> origin=IMPLICIT_CAST typeOperand=.JCell.JCell> + receiver: TYPE_OP type=.JCell origin=IMPLICIT_CAST typeOperand=.JCell GET_VAR 'a: kotlin.Any declared in .testSetField' type=kotlin.Any origin=null - value: TYPE_OP type=T of .JCell origin=IMPLICIT_CAST typeOperand=T of .JCell + value: TYPE_OP type=kotlin.String origin=IMPLICIT_CAST typeOperand=kotlin.String GET_VAR 'b: kotlin.Any declared in .testSetField' type=kotlin.Any origin=null FUN name:testGetField visibility:public modality:FINAL <> (a:kotlin.Any) returnType:kotlin.String VALUE_PARAMETER name:a index:0 type:kotlin.Any @@ -23,5 +23,5 @@ FILE fqName: fileName:/smartCastOnFieldReceiverOfGenericType.kt RETURN type=kotlin.Nothing from='public final fun testGetField (a: kotlin.Any): kotlin.String declared in ' TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String GET_FIELD 'FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:value type:T of .JCell? visibility:public' type=kotlin.String? origin=GET_PROPERTY - receiver: TYPE_OP type=.JCell.JCell> origin=IMPLICIT_CAST typeOperand=.JCell.JCell> + receiver: TYPE_OP type=.JCell origin=IMPLICIT_CAST typeOperand=.JCell GET_VAR 'a: kotlin.Any declared in .testGetField' type=kotlin.Any origin=null