[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.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
|
||||||
|
|||||||
+2
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-1
@@ -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() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+6
-4
@@ -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()
|
||||||
|
|||||||
+29
-13
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user