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 72e54abc3c8..8d8544fa5d9 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 @@ -14,27 +14,28 @@ import org.jetbrains.kotlin.backend.jvm.codegen.ClassCodegen import org.jetbrains.kotlin.backend.jvm.lower.MultifileFacadeFileEntry import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor import org.jetbrains.kotlin.codegen.state.GenerationState +import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.konan.DeserializedKlibModuleOrigin import org.jetbrains.kotlin.descriptors.konan.KlibModuleOrigin import org.jetbrains.kotlin.idea.MainFunctionDetector import org.jetbrains.kotlin.ir.backend.jvm.serialization.EmptyLoggingContext import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrLinker import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmManglerDesc +import org.jetbrains.kotlin.ir.builders.TranslationPluginContext import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl +import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.descriptors.IrFunctionFactory import org.jetbrains.kotlin.ir.linkage.IrProvider import org.jetbrains.kotlin.ir.types.defaultType -import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator -import org.jetbrains.kotlin.ir.util.ExternalDependenciesGenerator -import org.jetbrains.kotlin.ir.util.SymbolTable -import org.jetbrains.kotlin.ir.util.render +import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator import org.jetbrains.kotlin.psi2ir.PsiSourceManager +import org.jetbrains.kotlin.resolve.BindingContext object JvmBackendFacade { fun doGenerateFiles(files: Collection, state: GenerationState, phaseConfig: PhaseConfig) { @@ -50,12 +51,25 @@ object JvmBackendFacade { val stubGenerator = DeclarationStubGenerator( psi2irContext.moduleDescriptor, symbolTable, psi2irContext.irBuiltIns.languageVersionSettings, extensions ) + val frontEndContext = object : TranslationPluginContext { + override val moduleDescriptor: ModuleDescriptor + get() = psi2irContext.moduleDescriptor + override val bindingContext: BindingContext + get() = psi2irContext.bindingContext + override val symbolTable: ReferenceSymbolTable + get() = symbolTable + override val typeTranslator: TypeTranslator + get() = psi2irContext.typeTranslator + override val irBuiltIns: IrBuiltIns + get() = psi2irContext.irBuiltIns + } val irLinker = JvmIrLinker( psi2irContext.moduleDescriptor, EmptyLoggingContext, psi2irContext.irBuiltIns, symbolTable, functionFactory, + frontEndContext, stubGenerator, mangler ) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/TranslationPluginContext.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/TranslationPluginContext.kt new file mode 100644 index 00000000000..42ff586fbfa --- /dev/null +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/TranslationPluginContext.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.ir.builders + +import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.ir.util.ReferenceSymbolTable +import org.jetbrains.kotlin.ir.util.TypeTranslator +import org.jetbrains.kotlin.resolve.BindingContext + +interface TranslationPluginContext : IrGeneratorContext { + + val moduleDescriptor: ModuleDescriptor + val bindingContext: BindingContext + val symbolTable: ReferenceSymbolTable + val typeTranslator: TypeTranslator +} \ No newline at end of file diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/linkage/IrDeserializer.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/linkage/IrDeserializer.kt index 3a11bd0c812..c6a4407ef6b 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/linkage/IrDeserializer.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/linkage/IrDeserializer.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.ir.linkage +import org.jetbrains.kotlin.ir.builders.TranslationPluginContext import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.symbols.IrSymbol @@ -12,7 +13,7 @@ import org.jetbrains.kotlin.ir.symbols.IrSymbol interface IrDeserializer : IrProvider { interface IrLinkerExtension { - fun resolveSymbol(symbol: IrSymbol): IrDeclaration? = null + fun resolveSymbol(symbol: IrSymbol, context: TranslationPluginContext): IrDeclaration? = null } fun init(moduleFragment: IrModuleFragment?, extensions: Collection) {} diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt index fe148f8a439..eebf197b36f 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.impl.EmptyPackageFragmentDescriptor import org.jetbrains.kotlin.ir.IrElement +import org.jetbrains.kotlin.ir.builders.TranslationPluginContext import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrFile @@ -69,6 +70,8 @@ abstract class KotlinIrLinker( abstract val fakeOverrideBuilder: FakeOverrideBuilder + abstract val translationPluginContext: TranslationPluginContext? + private val haveSeen = mutableSetOf() private val fakeOverrideClassQueue = mutableListOf() @@ -540,8 +543,12 @@ abstract class KotlinIrLinker( } } - return linkerExtensions.firstNotNullResult { it.resolveSymbol(symbol) }?.also { - require(symbol.owner == it) + return translationPluginContext?.let { ctx -> + linkerExtensions.firstNotNullResult { + it.resolveSymbol(symbol, ctx) + }?.also { + require(symbol.owner == it) + } } } diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt index 6bb42a09432..2132a116acd 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt @@ -147,13 +147,16 @@ fun generateKLib( val expectDescriptorToSymbol = mutableMapOf() val deserializeFakeOverrides = configuration.getBoolean(CommonConfigurationKeys.DESERIALIZE_FAKE_OVERRIDES) - + val feContext = psi2IrContext.run { + JsIrLinker.JsFePluginContext(moduleDescriptor, bindingContext, symbolTable, typeTranslator, irBuiltIns) + } val irLinker = JsIrLinker( psi2IrContext.moduleDescriptor, emptyLoggingContext, psi2IrContext.irBuiltIns, psi2IrContext.symbolTable, functionFactory, + feContext, serializedIrFiles, deserializeFakeOverrides ) @@ -227,7 +230,10 @@ fun loadIr( val symbolTable = psi2IrContext.symbolTable val functionFactory = IrFunctionFactory(irBuiltIns, symbolTable) irBuiltIns.functionFactory = functionFactory - val irLinker = JsIrLinker(psi2IrContext.moduleDescriptor, emptyLoggingContext, irBuiltIns, symbolTable, functionFactory, null, deserializeFakeOverrides) + val feContext = psi2IrContext.run { + JsIrLinker.JsFePluginContext(moduleDescriptor, bindingContext, symbolTable, typeTranslator, irBuiltIns) + } + val irLinker = JsIrLinker(psi2IrContext.moduleDescriptor, emptyLoggingContext, irBuiltIns, symbolTable, functionFactory, feContext, null, deserializeFakeOverrides) val deserializedModuleFragments = sortDependencies(allDependencies.getFullList(), depsDescriptors.descriptors).map { irLinker.deserializeIrModuleHeader(depsDescriptors.getModuleDescriptor(it), it) } @@ -263,7 +269,8 @@ fun loadIr( constantValueGenerator.typeTranslator = typeTranslator val irBuiltIns = IrBuiltIns(moduleDescriptor.builtIns, typeTranslator, symbolTable) val functionFactory = IrFunctionFactory(irBuiltIns, symbolTable) - val irLinker = JsIrLinker(null, emptyLoggingContext, irBuiltIns, symbolTable, functionFactory, null, deserializeFakeOverrides) + val irLinker = + JsIrLinker(null, emptyLoggingContext, irBuiltIns, symbolTable, functionFactory, null, null, deserializeFakeOverrides) val deserializedModuleFragments = sortDependencies(allDependencies.getFullList(), depsDescriptors.descriptors).map { val strategy = diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrLinker.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrLinker.kt index 9072b59ddee..7f08e62a42b 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrLinker.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrLinker.kt @@ -11,16 +11,21 @@ import org.jetbrains.kotlin.backend.common.overrides.FakeOverrideControl import org.jetbrains.kotlin.backend.common.serialization.* import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.ir.builders.TranslationPluginContext import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.descriptors.IrAbstractFunctionFactory import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns +import org.jetbrains.kotlin.ir.util.ReferenceSymbolTable import org.jetbrains.kotlin.ir.util.SymbolTable +import org.jetbrains.kotlin.ir.util.TypeTranslator import org.jetbrains.kotlin.library.IrLibrary import org.jetbrains.kotlin.library.SerializedIrFile +import org.jetbrains.kotlin.resolve.BindingContext class JsIrLinker( private val currentModule: ModuleDescriptor?, logger: LoggingContext, builtIns: IrBuiltIns, symbolTable: SymbolTable, override val functionalInterfaceFactory: IrAbstractFunctionFactory, + override val translationPluginContext: TranslationPluginContext?, private val icData: List? = null, deserializeFakeOverrides: Boolean = FakeOverrideControl.deserializeFakeOverrides ) : KotlinIrLinker(currentModule, logger, builtIns, symbolTable, emptyList(), deserializeFakeOverrides) { @@ -45,8 +50,17 @@ class JsIrLinker( } return currentModuleDeserializer } + val modules get() = deserializersForModules.values .map { it.moduleFragment } .filter { it.descriptor !== currentModule } + + class JsFePluginContext( + override val moduleDescriptor: ModuleDescriptor, + override val bindingContext: BindingContext, + override val symbolTable: ReferenceSymbolTable, + override val typeTranslator: TypeTranslator, + override val irBuiltIns: IrBuiltIns, + ) : TranslationPluginContext } diff --git a/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/ir/backend/jvm/serialization/JvmIrLinker.kt b/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/ir/backend/jvm/serialization/JvmIrLinker.kt index fd75240bbd7..8a7de99cea7 100644 --- a/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/ir/backend/jvm/serialization/JvmIrLinker.kt +++ b/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/ir/backend/jvm/serialization/JvmIrLinker.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSe import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.konan.KlibModuleOrigin import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI +import org.jetbrains.kotlin.ir.builders.TranslationPluginContext import org.jetbrains.kotlin.ir.declarations.IrField import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.impl.IrModuleFragmentImpl @@ -37,6 +38,7 @@ class JvmIrLinker( builtIns: IrBuiltIns, symbolTable: SymbolTable, override val functionalInterfaceFactory: IrAbstractFunctionFactory, + override val translationPluginContext: TranslationPluginContext?, private val stubGenerator: DeclarationStubGenerator, private val manglerDesc: JvmManglerDesc, deserializeFakeOverrides: Boolean = FakeOverrideControl.deserializeFakeOverrides