[IR] Get rid of substituted descriptor from IrMemberAccessExpression interface

This commit is contained in:
Roman Artemev
2019-10-22 18:23:45 +03:00
committed by romanart
parent b391c066d6
commit d4fc7fcd96
7 changed files with 52 additions and 19 deletions
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.types.IrDynamicType import org.jetbrains.kotlin.ir.types.IrDynamicType
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.classifierOrFail
import org.jetbrains.kotlin.ir.util.referenceFunction import org.jetbrains.kotlin.ir.util.referenceFunction
import org.jetbrains.kotlin.ir.util.render import org.jetbrains.kotlin.ir.util.render
import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtElement
@@ -127,6 +126,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
IrCallImpl( IrCallImpl(
startOffset, endOffset, descriptor.type.toIrType(), getterSymbol, origin ?: IrStatementOrigin.GET_LOCAL_PROPERTY startOffset, endOffset, descriptor.type.toIrType(), getterSymbol, origin ?: IrStatementOrigin.GET_LOCAL_PROPERTY
).apply { ).apply {
context.callToSubstitutedDescriptorMap[this] = getterDescriptor
putTypeArguments(typeArguments) { it.toIrType() } putTypeArguments(typeArguments) { it.toIrType() }
} }
} else } else
@@ -142,6 +142,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
context.irBuiltIns.unitType, context.irBuiltIns.unitType,
constructorSymbol constructorSymbol
).apply { ).apply {
context.callToSubstitutedDescriptorMap[this] = descriptor
putTypeArguments(call.typeArguments) { it.toIrType() } putTypeArguments(call.typeArguments) { it.toIrType() }
this.dispatchReceiver = dispatchReceiver?.load() this.dispatchReceiver = dispatchReceiver?.load()
this.extensionReceiver = extensionReceiver?.load() this.extensionReceiver = extensionReceiver?.load()
@@ -160,6 +161,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
if (extensionReceiver != null) throw AssertionError("Extension receiver should be null: $extensionReceiver") if (extensionReceiver != null) throw AssertionError("Extension receiver should be null: $extensionReceiver")
val constructorSymbol = context.symbolTable.referenceConstructor(constructorDescriptor.original) val constructorSymbol = context.symbolTable.referenceConstructor(constructorDescriptor.original)
val irCall = IrEnumConstructorCallImpl(startOffset, endOffset, context.irBuiltIns.unitType, constructorSymbol) val irCall = IrEnumConstructorCallImpl(startOffset, endOffset, context.irBuiltIns.unitType, constructorSymbol)
context.callToSubstitutedDescriptorMap[irCall] = constructorDescriptor
addParametersToCall(startOffset, endOffset, call, irCall, context.irBuiltIns.unitType) addParametersToCall(startOffset, endOffset, call, irCall, context.irBuiltIns.unitType)
} }
} }
@@ -208,6 +210,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
IrStatementOrigin.GET_PROPERTY, IrStatementOrigin.GET_PROPERTY,
superQualifierSymbol superQualifierSymbol
).apply { ).apply {
context.callToSubstitutedDescriptorMap[this] = getMethodDescriptor
putTypeArguments(call.typeArguments) { it.toIrType() } putTypeArguments(call.typeArguments) { it.toIrType() }
dispatchReceiver = dispatchReceiverValue?.load() dispatchReceiver = dispatchReceiverValue?.load()
extensionReceiver = extensionReceiverValue?.load() extensionReceiver = extensionReceiverValue?.load()
@@ -254,6 +257,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
originalSymbol, originalSymbol,
origin origin
).run { ).run {
context.callToSubstitutedDescriptorMap[this] = constructorDescriptor
putTypeArguments(call.typeArguments) { it.toIrType() } putTypeArguments(call.typeArguments) { it.toIrType() }
dispatchReceiver = dispatchReceiverValue?.load() dispatchReceiver = dispatchReceiverValue?.load()
extensionReceiver = extensionReceiverValue?.load() extensionReceiver = extensionReceiverValue?.load()
@@ -328,6 +332,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
origin, origin,
call.superQualifier?.let { context.symbolTable.referenceClass(it) } call.superQualifier?.let { context.symbolTable.referenceClass(it) }
).run { ).run {
context.callToSubstitutedDescriptorMap[this] = functionDescriptor
putTypeArguments(call.typeArguments) { it.toIrType() } putTypeArguments(call.typeArguments) { it.toIrType() }
dispatchReceiver = dispatchReceiverValue?.load() dispatchReceiver = dispatchReceiverValue?.load()
extensionReceiver = extensionReceiverValue?.load() extensionReceiver = extensionReceiverValue?.load()
@@ -285,6 +285,7 @@ class ClassGenerator(
originalSymbol, originalSymbol,
substitutedOverridden.typeParametersCount substitutedOverridden.typeParametersCount
).apply { ).apply {
context.callToSubstitutedDescriptorMap[this] = substitutedOverridden
val typeArguments = getTypeArgumentsForOverriddenDescriptorDelegatingCall(delegated, overridden) val typeArguments = getTypeArgumentsForOverriddenDescriptorDelegatingCall(delegated, overridden)
putTypeArguments(typeArguments) { it.toIrType() } putTypeArguments(typeArguments) { it.toIrType() }
} }
@@ -18,10 +18,12 @@ package org.jetbrains.kotlin.psi2ir.generators
import org.jetbrains.kotlin.builtins.ReflectionTypes import org.jetbrains.kotlin.builtins.ReflectionTypes
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.NotFoundClasses import org.jetbrains.kotlin.descriptors.NotFoundClasses
import org.jetbrains.kotlin.ir.builders.IrGeneratorContext import org.jetbrains.kotlin.ir.builders.IrGeneratorContext
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
import org.jetbrains.kotlin.ir.util.ConstantValueGenerator import org.jetbrains.kotlin.ir.util.ConstantValueGenerator
import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.ir.util.SymbolTable
import org.jetbrains.kotlin.ir.util.TypeTranslator import org.jetbrains.kotlin.ir.util.TypeTranslator
@@ -41,6 +43,7 @@ class GeneratorContext(
val constantValueGenerator: ConstantValueGenerator = ConstantValueGenerator(moduleDescriptor, symbolTable) val constantValueGenerator: ConstantValueGenerator = ConstantValueGenerator(moduleDescriptor, symbolTable)
val typeTranslator: TypeTranslator = TypeTranslator(symbolTable, languageVersionSettings, builtIns = moduleDescriptor.builtIns) val typeTranslator: TypeTranslator = TypeTranslator(symbolTable, languageVersionSettings, builtIns = moduleDescriptor.builtIns)
val callToSubstitutedDescriptorMap = mutableMapOf<IrMemberAccessExpression, CallableDescriptor>()
init { init {
typeTranslator.constantValueGenerator = constantValueGenerator typeTranslator.constantValueGenerator = constantValueGenerator
@@ -422,6 +422,7 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat
origin = null, origin = null,
superQualifierSymbol = null superQualifierSymbol = null
).apply { ).apply {
context.callToSubstitutedDescriptorMap[this] = functionDescriptor
dispatchReceiver = receiver dispatchReceiver = receiver
} }
} }
@@ -506,6 +507,7 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat
checkNotNullSymbol, checkNotNullSymbol,
origin origin
).apply { ).apply {
context.callToSubstitutedDescriptorMap[this] = checkNotNullSubstituted
putTypeArgument(0, argumentType.toIrType().makeNotNull()) putTypeArgument(0, argumentType.toIrType().makeNotNull())
putValueArgument(0, irArgument) putValueArgument(0, irArgument)
} }
@@ -122,7 +122,9 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
context.symbolTable.referenceLocalDelegatedProperty(variableDescriptor), context.symbolTable.referenceLocalDelegatedProperty(variableDescriptor),
irDelegateSymbol, getterSymbol, setterSymbol, irDelegateSymbol, getterSymbol, setterSymbol,
origin origin
) ).apply {
context.callToSubstitutedDescriptorMap[this] = variableDescriptor
}
} }
private fun generatePropertyReference( private fun generatePropertyReference(
@@ -148,6 +150,7 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
originalSetter?.let { context.symbolTable.referenceSimpleFunction(it) }, originalSetter?.let { context.symbolTable.referenceSimpleFunction(it) },
origin origin
).apply { ).apply {
context.callToSubstitutedDescriptorMap[this] = propertyDescriptor
putTypeArguments(typeArguments) { it.toIrType() } putTypeArguments(typeArguments) { it.toIrType() }
} }
} }
@@ -174,6 +177,7 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
startOffset, endOffset, type.toIrType(), startOffset, endOffset, type.toIrType(),
symbol, descriptor.typeParametersCount, origin symbol, descriptor.typeParametersCount, origin
).apply { ).apply {
context.callToSubstitutedDescriptorMap[this] = descriptor
putTypeArguments(typeArguments) { it.toIrType() } putTypeArguments(typeArguments) { it.toIrType() }
} }
} }
@@ -17,7 +17,6 @@
package org.jetbrains.kotlin.psi2ir.intermediate package org.jetbrains.kotlin.psi2ir.intermediate
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.ir.builders.IrGeneratorContext
import org.jetbrains.kotlin.ir.builders.Scope import org.jetbrains.kotlin.ir.builders.Scope
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
@@ -27,9 +26,10 @@ import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
abstract class PropertyLValueBase( abstract class PropertyLValueBase(
protected val context: IrGeneratorContext, protected val context: GeneratorContext,
val scope: Scope, val scope: Scope,
val startOffset: Int, val startOffset: Int,
val endOffset: Int, val endOffset: Int,
@@ -66,7 +66,7 @@ abstract class PropertyLValueBase(
} }
class FieldPropertyLValue( class FieldPropertyLValue(
context: IrGeneratorContext, context: GeneratorContext,
scope: Scope, scope: Scope,
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
@@ -117,7 +117,7 @@ class FieldPropertyLValue(
} }
class AccessorPropertyLValue( class AccessorPropertyLValue(
context: IrGeneratorContext, context: GeneratorContext,
scope: Scope, scope: Scope,
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
@@ -150,6 +150,7 @@ class AccessorPropertyLValue(
origin, origin,
superQualifier superQualifier
).apply { ).apply {
context.callToSubstitutedDescriptorMap[this] = getterDescriptor
putTypeArguments() putTypeArguments()
dispatchReceiver = dispatchReceiverValue?.load() dispatchReceiver = dispatchReceiverValue?.load()
extensionReceiver = extensionReceiverValue?.load() extensionReceiver = extensionReceiverValue?.load()
@@ -166,6 +167,7 @@ class AccessorPropertyLValue(
origin, origin,
superQualifier superQualifier
).apply { ).apply {
context.callToSubstitutedDescriptorMap[this] = setterDescriptor
putTypeArguments() putTypeArguments()
dispatchReceiver = dispatchReceiverValue?.load() dispatchReceiver = dispatchReceiverValue?.load()
extensionReceiver = extensionReceiverValue?.load() extensionReceiver = extensionReceiverValue?.load()
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.psi2ir.transformations package org.jetbrains.kotlin.psi2ir.transformations
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrClass
@@ -31,6 +32,7 @@ import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.impl.originalKotlinType import org.jetbrains.kotlin.ir.types.impl.originalKotlinType
import org.jetbrains.kotlin.ir.util.TypeTranslator import org.jetbrains.kotlin.ir.util.TypeTranslator
import org.jetbrains.kotlin.ir.util.coerceToUnitIfNeeded import org.jetbrains.kotlin.ir.util.coerceToUnitIfNeeded
import org.jetbrains.kotlin.ir.util.render
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
import org.jetbrains.kotlin.psi2ir.containsNull import org.jetbrains.kotlin.psi2ir.containsNull
import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
@@ -44,7 +46,13 @@ import org.jetbrains.kotlin.types.typeUtil.makeNullable
fun insertImplicitCasts(element: IrElement, context: GeneratorContext) { fun insertImplicitCasts(element: IrElement, context: GeneratorContext) {
element.transformChildren( element.transformChildren(
InsertImplicitCasts(context.builtIns, context.irBuiltIns, context.typeTranslator, context.extensions.samConversion), InsertImplicitCasts(
context.builtIns,
context.irBuiltIns,
context.typeTranslator,
context.callToSubstitutedDescriptorMap,
context.extensions.samConversion
),
null null
) )
} }
@@ -53,30 +61,38 @@ open class InsertImplicitCasts(
private val builtIns: KotlinBuiltIns, private val builtIns: KotlinBuiltIns,
private val irBuiltIns: IrBuiltIns, private val irBuiltIns: IrBuiltIns,
private val typeTranslator: TypeTranslator, private val typeTranslator: TypeTranslator,
private val callToSubstitutedDescriptorMap: Map<IrMemberAccessExpression, CallableDescriptor>,
private val samConversion: GeneratorExtensions.SamConversion private val samConversion: GeneratorExtensions.SamConversion
) : IrElementTransformerVoid() { ) : IrElementTransformerVoid() {
private fun KotlinType.toIrType() = typeTranslator.translateType(this) private fun KotlinType.toIrType() = typeTranslator.translateType(this)
override fun visitCallableReference(expression: IrCallableReference): IrExpression = private val IrMemberAccessExpression.substitutedDescriptor
expression.transformPostfix { get() = callToSubstitutedDescriptorMap[this] ?: symbol.descriptor as CallableDescriptor
transformReceiverArguments()
}
private fun IrMemberAccessExpression.transformReceiverArguments() { override fun visitCallableReference(expression: IrCallableReference): IrExpression {
dispatchReceiver = dispatchReceiver?.cast(descriptor.dispatchReceiverParameter?.type) val substitutedDescriptor = expression.substitutedDescriptor
extensionReceiver = extensionReceiver?.cast(descriptor.extensionReceiverParameter?.type) return expression.transformPostfix {
transformReceiverArguments(substitutedDescriptor)
}
} }
override fun visitMemberAccess(expression: IrMemberAccessExpression): IrExpression = private fun IrMemberAccessExpression.transformReceiverArguments(substitutedDescriptor: CallableDescriptor) {
expression.transformPostfix { dispatchReceiver = dispatchReceiver?.cast(substitutedDescriptor.dispatchReceiverParameter?.type)
transformReceiverArguments() extensionReceiver = extensionReceiver?.cast(substitutedDescriptor.extensionReceiverParameter?.type)
for (index in descriptor.valueParameters.indices) { }
override fun visitMemberAccess(expression: IrMemberAccessExpression): IrExpression {
val substitutedDescriptor = expression.substitutedDescriptor
return expression.transformPostfix {
transformReceiverArguments(substitutedDescriptor)
for (index in substitutedDescriptor.valueParameters.indices) {
val argument = getValueArgument(index) ?: continue val argument = getValueArgument(index) ?: continue
val parameterType = descriptor.valueParameters[index].type val parameterType = substitutedDescriptor.valueParameters[index].type
putValueArgument(index, argument.cast(parameterType)) putValueArgument(index, argument.cast(parameterType))
} }
} }
}
override fun visitBlockBody(body: IrBlockBody): IrBody = override fun visitBlockBody(body: IrBlockBody): IrBody =
body.transformPostfix { body.transformPostfix {