IR: fix thisReceiver parameter type for function classes
Incorrect builder was used at line 269, which led to non-sensible type in `IrClass.thisReceiver` for function types, such as `SuspendFunction1<SuspendFunction1, SuspendFunction1>` in the linked issue. Avoid creating types manually completely to simplify this code and fix the bug. #KT-49168 Fixed
This commit is contained in:
+5
-2
@@ -32,7 +32,10 @@ import org.jetbrains.kotlin.ir.types.*
|
||||
import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeBuilder
|
||||
import org.jetbrains.kotlin.ir.types.impl.buildSimpleType
|
||||
import org.jetbrains.kotlin.ir.types.impl.originalKotlinType
|
||||
import org.jetbrains.kotlin.ir.util.*
|
||||
import org.jetbrains.kotlin.ir.util.SymbolTable
|
||||
import org.jetbrains.kotlin.ir.util.TypeTranslator
|
||||
import org.jetbrains.kotlin.ir.util.functions
|
||||
import org.jetbrains.kotlin.ir.util.referenceClassifier
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
||||
@@ -54,7 +57,7 @@ class IrBuiltInsOverDescriptors(
|
||||
get() =
|
||||
synchronized(this) {
|
||||
if (_functionFactory == null) {
|
||||
_functionFactory = IrDescriptorBasedFunctionFactory(this, symbolTable)
|
||||
_functionFactory = IrDescriptorBasedFunctionFactory(this, symbolTable, typeTranslator)
|
||||
}
|
||||
_functionFactory!!
|
||||
}
|
||||
|
||||
+7
-19
@@ -85,6 +85,7 @@ abstract class IrAbstractDescriptorBasedFunctionFactory {
|
||||
class IrDescriptorBasedFunctionFactory(
|
||||
private val irBuiltIns: IrBuiltInsOverDescriptors,
|
||||
private val symbolTable: SymbolTable,
|
||||
private val typeTranslator: TypeTranslator,
|
||||
getPackageFragment: ((PackageFragmentDescriptor) -> IrPackageFragment)? = null,
|
||||
// Needed for JS and Wasm backends to "preload" interfaces that can referenced during lowerings
|
||||
private val referenceFunctionsWhenKFunctionAreReferenced: Boolean = false,
|
||||
@@ -257,29 +258,16 @@ class IrDescriptorBasedFunctionFactory(
|
||||
}
|
||||
}
|
||||
|
||||
private fun IrClass.createThisReceiver(descriptorFactory: FunctionDescriptorFactory): IrValueParameter {
|
||||
val vDescriptor = descriptorFactory.classReceiverParameterDescriptor()
|
||||
val vSymbol = IrValueParameterSymbolImpl(vDescriptor)
|
||||
val type = with(IrSimpleTypeBuilder()) {
|
||||
classifier = symbol
|
||||
arguments = typeParameters.run {
|
||||
val builder = IrSimpleTypeBuilder()
|
||||
mapTo(ArrayList(size)) {
|
||||
builder.classifier = it.symbol
|
||||
buildTypeProjection()
|
||||
}
|
||||
}
|
||||
buildSimpleType()
|
||||
}
|
||||
val vDeclaration = irFactory.createValueParameter(
|
||||
offset, offset, classOrigin, vSymbol, SpecialNames.THIS, -1, type, null,
|
||||
private fun createThisReceiver(descriptorFactory: FunctionDescriptorFactory): IrValueParameter {
|
||||
val descriptor = descriptorFactory.classReceiverParameterDescriptor()
|
||||
return irFactory.createValueParameter(
|
||||
offset, offset, classOrigin, IrValueParameterSymbolImpl(descriptor), SpecialNames.THIS, -1,
|
||||
typeTranslator.translateType(descriptor.type), null,
|
||||
isCrossinline = false,
|
||||
isNoinline = false,
|
||||
isHidden = false,
|
||||
isAssignable = false
|
||||
)
|
||||
|
||||
return vDeclaration
|
||||
}
|
||||
|
||||
private fun IrClass.createMembers(isK: Boolean, isSuspend: Boolean, descriptorFactory: FunctionDescriptorFactory) {
|
||||
@@ -435,7 +423,7 @@ class IrDescriptorBasedFunctionFactory(
|
||||
|
||||
val r = klass.createTypeParameters(n, descriptorFactory)
|
||||
|
||||
klass.thisReceiver = klass.createThisReceiver(descriptorFactory).also { it.parent = klass }
|
||||
klass.thisReceiver = createThisReceiver(descriptorFactory).also { it.parent = klass }
|
||||
|
||||
klass.superTypes = listOf(with(IrSimpleTypeBuilder()) {
|
||||
classifier = baseClass
|
||||
|
||||
Reference in New Issue
Block a user