[IR] Get rid of substituted descriptor from IrMemberAccessExpression interface
This commit is contained in:
@@ -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
|
||||
|
||||
+2
@@ -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)
|
||||
}
|
||||
|
||||
+5
-1
@@ -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() }
|
||||
}
|
||||
}
|
||||
+6
-4
@@ -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()
|
||||
|
||||
+29
-13
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user