From e16bdd4287e73e65b98cdc5f3d12f58e90ada567 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Wed, 31 May 2017 12:03:10 +0200 Subject: [PATCH] Switch JvmBackendContext to CommonBackendContext (cherry picked from commit 5d4736c) --- .../backend/common/CommonBackendContext.kt | 2 + .../kotlin/backend/jvm/JvmBackendContext.kt | 103 +++++++++++++++++- .../kotlin/backend/jvm/JvmBackendFacade.kt | 4 +- 3 files changed, 104 insertions(+), 5 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/CommonBackendContext.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/CommonBackendContext.kt index 42f9b3ed7d9..e83804a5d1d 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/CommonBackendContext.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/CommonBackendContext.kt @@ -28,6 +28,8 @@ interface CommonBackendContext : BackendContext { //TODO move to builtins fun getInternalClass(name: String): ClassDescriptor + fun getClass(fqName: FqName): ClassDescriptor + //TODO move to builtins fun getInternalFunctions(name: String): List 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 bc8f2246390..937f299df74 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 @@ -16,19 +16,114 @@ package org.jetbrains.kotlin.backend.jvm -import org.jetbrains.kotlin.backend.common.BackendContext +import org.jetbrains.kotlin.backend.common.CommonBackendContext +import org.jetbrains.kotlin.backend.common.ReflectionTypes +import org.jetbrains.kotlin.backend.common.ir.Ir +import org.jetbrains.kotlin.backend.common.ir.Symbols import org.jetbrains.kotlin.backend.jvm.descriptors.JvmSharedVariablesManager import org.jetbrains.kotlin.backend.jvm.descriptors.SpecialDescriptorsFactory import org.jetbrains.kotlin.codegen.state.GenerationState +import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.incremental.components.NoLookupLocation +import org.jetbrains.kotlin.ir.IrElement +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.symbols.IrFunctionSymbol +import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol +import org.jetbrains.kotlin.ir.util.SymbolTable +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi2ir.PsiSourceManager +import org.jetbrains.kotlin.resolve.scopes.MemberScope class JvmBackendContext( val state: GenerationState, - val psiSourceManager: PsiSourceManager, - override val irBuiltIns: IrBuiltIns -) : BackendContext { + psiSourceManager: PsiSourceManager, + override val irBuiltIns: IrBuiltIns, + irModuleFragment: IrModuleFragment, symbolTable: SymbolTable +) : CommonBackendContext { override val builtIns = state.module.builtIns val specialDescriptorsFactory = SpecialDescriptorsFactory(psiSourceManager, builtIns) override val sharedVariablesManager = JvmSharedVariablesManager(builtIns) + + override val reflectionTypes: ReflectionTypes by lazy(LazyThreadSafetyMode.PUBLICATION) { + ReflectionTypes(state.module, FqName("kotlin.reflect.jvm.internal")) + } + + override val ir: Ir = object : Ir(this, irModuleFragment) { + override val symbols: Symbols = object: Symbols(this@JvmBackendContext, symbolTable) { + + override val areEqual + get () = symbolTable.referenceSimpleFunction(context.getInternalFunctions("areEqual").single()) + + override val ThrowNullPointerException + get () = symbolTable.referenceSimpleFunction( + context.getInternalFunctions("ThrowNullPointerException").single()) + + override val ThrowNoWhenBranchMatchedException + get () = symbolTable.referenceSimpleFunction( + context.getInternalFunctions("ThrowNoWhenBranchMatchedException").single()) + + override val ThrowTypeCastException + get () = symbolTable.referenceSimpleFunction( + context.getInternalFunctions("ThrowTypeCastException").single()) + + override val ThrowUninitializedPropertyAccessException + get () = symbolTable.referenceSimpleFunction( + context.getInternalFunctions("ThrowUninitializedPropertyAccessException").single() + ) + + override val stringBuilder + get() = symbolTable.referenceClass( + context.getClass(FqName("java.lang.StringBuilder")) + ) + + override val copyRangeTo: Map + get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates. + override val coroutineImpl: IrClassSymbol + get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates. + override val coroutineSuspendedGetter: IrSimpleFunctionSymbol + get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates. + } + + override fun shouldGenerateHandlerParameterForDefaultBodyFun() = true + } + + private fun find(memberScope: MemberScope, className: String): ClassDescriptor { + return find(memberScope, Name.identifier(className)) + } + + private fun find(memberScope: MemberScope, name: Name): ClassDescriptor { + return memberScope.getContributedClassifier(name, NoLookupLocation.FROM_BACKEND) as ClassDescriptor + } + + override fun getInternalClass(name: String): ClassDescriptor { + return find(state.module.getPackage(FqName("kotlin.jvm.internal")).memberScope, name) + } + + override fun getClass(fqName: FqName): ClassDescriptor { + return find(state.module.getPackage(fqName.parent()).memberScope, fqName.shortName()) + } + + override fun getInternalFunctions(name: String): List { + return when (name) { + "ThrowUninitializedPropertyAccessException" -> + getInternalClass("Intrinsics").staticScope. + getContributedFunctions(Name.identifier("throwUninitializedPropertyAccessException"), NoLookupLocation.FROM_BACKEND).toList() + else -> TODO(name) + } + } + + override fun log(message: () -> String) { + /*TODO*/ + print(message()) + } + + override fun report(element: IrElement?, irFile: IrFile?, message: String, isError: Boolean) { + /*TODO*/ + print(message) + } } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt index ffdd4985f59..42a0cba96ed 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt @@ -37,7 +37,9 @@ object JvmBackendFacade { val psi2irContext = psi2ir.createGeneratorContext(state.module, state.bindingContext) val irModuleFragment = psi2ir.generateModuleFragment(psi2irContext, files) - val jvmBackendContext = JvmBackendContext(state, psi2irContext.sourceManager, psi2irContext.irBuiltIns) + val jvmBackendContext = JvmBackendContext( + state, psi2irContext.sourceManager, psi2irContext.irBuiltIns, irModuleFragment, psi2irContext.symbolTable + ) val jvmBackend = JvmBackend(jvmBackendContext) for (irFile in irModuleFragment.files) {