diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt index d0b46cee003..1becf2645ab 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.symbols.IrClassSymbol +import org.jetbrains.kotlin.ir.util.ReferenceSymbolTable import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi2ir.PsiSourceManager @@ -34,16 +35,18 @@ class JvmBackendContext( override val declarationFactory: JvmDeclarationFactory = JvmDeclarationFactory(state) override val sharedVariablesManager = JvmSharedVariablesManager(state.module, builtIns, irBuiltIns) - override val ir = JvmIr(irModuleFragment, symbolTable) + private val symbolTable = symbolTable.lazyWrapper + override val ir = JvmIr(irModuleFragment, this.symbolTable) override var inVerbosePhase: Boolean = false override val configuration get() = state.configuration - internal fun getClass(fqName: FqName): ClassDescriptor { - return state.module.getPackage(fqName.parent()).memberScope.getContributedClassifier( + internal fun getTopLevelClass(fqName: FqName): IrClassSymbol { + val descriptor = state.module.getPackage(fqName.parent()).memberScope.getContributedClassifier( fqName.shortName(), NoLookupLocation.FROM_BACKEND ) as ClassDescriptor? ?: error("Class is not found: $fqName") + return symbolTable.referenceClass(descriptor) } override fun log(message: () -> String) { @@ -58,8 +61,11 @@ class JvmBackendContext( print(message) } - inner class JvmIr(irModuleFragment: IrModuleFragment, symbolTable: SymbolTable) : Ir(this, irModuleFragment) { - override val symbols = JvmSymbols(this@JvmBackendContext, symbolTable.lazyWrapper) + inner class JvmIr( + irModuleFragment: IrModuleFragment, + symbolTable: ReferenceSymbolTable + ) : Ir(this, irModuleFragment) { + override val symbols = JvmSymbols(this@JvmBackendContext, symbolTable) override fun shouldGenerateHandlerParameterForDefaultBodyFun() = true } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmSymbols.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmSymbols.kt index efa612cf66b..92454eff899 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmSymbols.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmSymbols.kt @@ -76,7 +76,7 @@ class JvmSymbols( intrinsicsClass.functions.single { it.owner.name.asString() == "throwUninitializedPropertyAccessException" } override val stringBuilder: IrClassSymbol - get() = symbolTable.referenceClass(context.getClass(FqName("java.lang.StringBuilder"))) + get() = context.getTopLevelClass(FqName("java.lang.StringBuilder")) override val defaultConstructorMarker: IrClassSymbol = createClass(FqName("kotlin.jvm.internal.DefaultConstructorMarker")) { }.symbol @@ -91,7 +91,7 @@ class JvmSymbols( get() = TODO("not implemented") val javaLangClass: IrClassSymbol = - symbolTable.referenceClass(context.getClass(FqName("java.lang.Class"))) + context.getTopLevelClass(FqName("java.lang.Class")) val lambdaClass: IrClassSymbol = createClass(FqName("kotlin.jvm.internal.Lambda")) { klass -> klass.addConstructor().apply { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt index d30822a36a3..0a995385075 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt @@ -211,8 +211,7 @@ internal class CallableReferenceLowering(val context: JvmBackendContext) : FileL lastParameterType.classOrNull?.owner?.fqNameWhenAvailable?.asString() == "kotlin.coroutines.experimental.Continuation" ) { // If the last parameter is Continuation<> inherit from SuspendFunction. - val suspendFunctionDescriptor = context.getClass(FqName("kotlin.coroutines.SuspendFunction${numberOfParameters - 1}")) - suspendFunctionClass = context.ir.symbols.externalSymbolTable.referenceClass(suspendFunctionDescriptor).owner + suspendFunctionClass = context.getTopLevelClass(FqName("kotlin.coroutines.SuspendFunction${numberOfParameters - 1}")).owner val suspendFunctionClassTypeParameters = functionParameterTypes.dropLast(1) + (lastParameterType.arguments.single() as IrTypeProjection).type functionReferenceClassSuperTypes += IrSimpleTypeImpl(