[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.types.IrDynamicType
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.render
import org.jetbrains.kotlin.psi.KtElement
@@ -127,6 +126,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
IrCallImpl(
startOffset, endOffset, descriptor.type.toIrType(), getterSymbol, origin ?: IrStatementOrigin.GET_LOCAL_PROPERTY
).apply {
context.callToSubstitutedDescriptorMap[this] = getterDescriptor
putTypeArguments(typeArguments) { it.toIrType() }
}
} else
@@ -142,6 +142,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
context.irBuiltIns.unitType,
constructorSymbol
).apply {
context.callToSubstitutedDescriptorMap[this] = descriptor
putTypeArguments(call.typeArguments) { it.toIrType() }
this.dispatchReceiver = dispatchReceiver?.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")
val constructorSymbol = context.symbolTable.referenceConstructor(constructorDescriptor.original)
val irCall = IrEnumConstructorCallImpl(startOffset, endOffset, context.irBuiltIns.unitType, constructorSymbol)
context.callToSubstitutedDescriptorMap[irCall] = constructorDescriptor
addParametersToCall(startOffset, endOffset, call, irCall, context.irBuiltIns.unitType)
}
}
@@ -208,6 +210,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
IrStatementOrigin.GET_PROPERTY,
superQualifierSymbol
).apply {
context.callToSubstitutedDescriptorMap[this] = getMethodDescriptor
putTypeArguments(call.typeArguments) { it.toIrType() }
dispatchReceiver = dispatchReceiverValue?.load()
extensionReceiver = extensionReceiverValue?.load()
@@ -254,6 +257,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
originalSymbol,
origin
).run {
context.callToSubstitutedDescriptorMap[this] = constructorDescriptor
putTypeArguments(call.typeArguments) { it.toIrType() }
dispatchReceiver = dispatchReceiverValue?.load()
extensionReceiver = extensionReceiverValue?.load()
@@ -328,6 +332,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
origin,
call.superQualifier?.let { context.symbolTable.referenceClass(it) }
).run {
context.callToSubstitutedDescriptorMap[this] = functionDescriptor
putTypeArguments(call.typeArguments) { it.toIrType() }
dispatchReceiver = dispatchReceiverValue?.load()
extensionReceiver = extensionReceiverValue?.load()
@@ -285,6 +285,7 @@ class ClassGenerator(
originalSymbol,
substitutedOverridden.typeParametersCount
).apply {
context.callToSubstitutedDescriptorMap[this] = substitutedOverridden
val typeArguments = getTypeArgumentsForOverriddenDescriptorDelegatingCall(delegated, overridden)
putTypeArguments(typeArguments) { it.toIrType() }
}
@@ -18,10 +18,12 @@ package org.jetbrains.kotlin.psi2ir.generators
import org.jetbrains.kotlin.builtins.ReflectionTypes
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.CallableDescriptor
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.util.ConstantValueGenerator
import org.jetbrains.kotlin.ir.util.SymbolTable
import org.jetbrains.kotlin.ir.util.TypeTranslator
@@ -41,6 +43,7 @@ class GeneratorContext(
val constantValueGenerator: ConstantValueGenerator = ConstantValueGenerator(moduleDescriptor, symbolTable)
val typeTranslator: TypeTranslator = TypeTranslator(symbolTable, languageVersionSettings, builtIns = moduleDescriptor.builtIns)
val callToSubstitutedDescriptorMap = mutableMapOf<IrMemberAccessExpression, CallableDescriptor>()
init {
typeTranslator.constantValueGenerator = constantValueGenerator
@@ -422,6 +422,7 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat
origin = null,
superQualifierSymbol = null
).apply {
context.callToSubstitutedDescriptorMap[this] = functionDescriptor
dispatchReceiver = receiver
}
}
@@ -506,6 +507,7 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat
checkNotNullSymbol,
origin
).apply {
context.callToSubstitutedDescriptorMap[this] = checkNotNullSubstituted
putTypeArgument(0, argumentType.toIrType().makeNotNull())
putValueArgument(0, irArgument)
}
@@ -122,7 +122,9 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
context.symbolTable.referenceLocalDelegatedProperty(variableDescriptor),
irDelegateSymbol, getterSymbol, setterSymbol,
origin
)
).apply {
context.callToSubstitutedDescriptorMap[this] = variableDescriptor
}
}
private fun generatePropertyReference(
@@ -148,6 +150,7 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
originalSetter?.let { context.symbolTable.referenceSimpleFunction(it) },
origin
).apply {
context.callToSubstitutedDescriptorMap[this] = propertyDescriptor
putTypeArguments(typeArguments) { it.toIrType() }
}
}
@@ -174,6 +177,7 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
startOffset, endOffset, type.toIrType(),
symbol, descriptor.typeParametersCount, origin
).apply {
context.callToSubstitutedDescriptorMap[this] = descriptor
putTypeArguments(typeArguments) { it.toIrType() }
}
}
@@ -17,7 +17,6 @@
package org.jetbrains.kotlin.psi2ir.intermediate
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.expressions.IrExpression
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.IrFunctionSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
abstract class PropertyLValueBase(
protected val context: IrGeneratorContext,
protected val context: GeneratorContext,
val scope: Scope,
val startOffset: Int,
val endOffset: Int,
@@ -66,7 +66,7 @@ abstract class PropertyLValueBase(
}
class FieldPropertyLValue(
context: IrGeneratorContext,
context: GeneratorContext,
scope: Scope,
startOffset: Int,
endOffset: Int,
@@ -117,7 +117,7 @@ class FieldPropertyLValue(
}
class AccessorPropertyLValue(
context: IrGeneratorContext,
context: GeneratorContext,
scope: Scope,
startOffset: Int,
endOffset: Int,
@@ -150,6 +150,7 @@ class AccessorPropertyLValue(
origin,
superQualifier
).apply {
context.callToSubstitutedDescriptorMap[this] = getterDescriptor
putTypeArguments()
dispatchReceiver = dispatchReceiverValue?.load()
extensionReceiver = extensionReceiverValue?.load()
@@ -166,6 +167,7 @@ class AccessorPropertyLValue(
origin,
superQualifier
).apply {
context.callToSubstitutedDescriptorMap[this] = setterDescriptor
putTypeArguments()
dispatchReceiver = dispatchReceiverValue?.load()
extensionReceiver = extensionReceiverValue?.load()
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.psi2ir.transformations
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement
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.util.TypeTranslator
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.psi2ir.containsNull
import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
@@ -44,7 +46,13 @@ import org.jetbrains.kotlin.types.typeUtil.makeNullable
fun insertImplicitCasts(element: IrElement, context: GeneratorContext) {
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
)
}
@@ -53,30 +61,38 @@ open class InsertImplicitCasts(
private val builtIns: KotlinBuiltIns,
private val irBuiltIns: IrBuiltIns,
private val typeTranslator: TypeTranslator,
private val callToSubstitutedDescriptorMap: Map<IrMemberAccessExpression, CallableDescriptor>,
private val samConversion: GeneratorExtensions.SamConversion
) : IrElementTransformerVoid() {
private fun KotlinType.toIrType() = typeTranslator.translateType(this)
override fun visitCallableReference(expression: IrCallableReference): IrExpression =
expression.transformPostfix {
transformReceiverArguments()
}
private val IrMemberAccessExpression.substitutedDescriptor
get() = callToSubstitutedDescriptorMap[this] ?: symbol.descriptor as CallableDescriptor
private fun IrMemberAccessExpression.transformReceiverArguments() {
dispatchReceiver = dispatchReceiver?.cast(descriptor.dispatchReceiverParameter?.type)
extensionReceiver = extensionReceiver?.cast(descriptor.extensionReceiverParameter?.type)
override fun visitCallableReference(expression: IrCallableReference): IrExpression {
val substitutedDescriptor = expression.substitutedDescriptor
return expression.transformPostfix {
transformReceiverArguments(substitutedDescriptor)
}
}
override fun visitMemberAccess(expression: IrMemberAccessExpression): IrExpression =
expression.transformPostfix {
transformReceiverArguments()
for (index in descriptor.valueParameters.indices) {
private fun IrMemberAccessExpression.transformReceiverArguments(substitutedDescriptor: CallableDescriptor) {
dispatchReceiver = dispatchReceiver?.cast(substitutedDescriptor.dispatchReceiverParameter?.type)
extensionReceiver = extensionReceiver?.cast(substitutedDescriptor.extensionReceiverParameter?.type)
}
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 parameterType = descriptor.valueParameters[index].type
val parameterType = substitutedDescriptor.valueParameters[index].type
putValueArgument(index, argument.cast(parameterType))
}
}
}
override fun visitBlockBody(body: IrBlockBody): IrBody =
body.transformPostfix {