From 166b506f633fbc3ca129d9147a1203d74f29bd53 Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Sun, 5 Apr 2020 12:47:26 +0300 Subject: [PATCH] IR: only require all type parameter references to be local with new inference --- .../jetbrains/kotlin/fir/backend/Fir2IrConverter.kt | 2 +- .../org/jetbrains/kotlin/ir/backend/js/compiler.kt | 7 +++++-- .../kotlin/backend/jvm/JvmBackendFacade.kt | 2 +- .../kotlin/backend/jvm/JvmIrCodegenFactory.kt | 2 +- .../org/jetbrains/kotlin/backend/wasm/compiler.kt | 6 ++++-- .../kotlin/psi2ir/generators/ModuleGenerator.kt | 6 ++++-- .../kotlin/ir/util/ExternalDependenciesGenerator.kt | 13 ++++++++++--- .../src/org/jetbrains/kotlin/ir/backend/js/klib.kt | 3 ++- .../scripting/repl/js/JsCoreScriptingCompiler.kt | 3 ++- .../scripting/repl/js/JsScriptDependencyCompiler.kt | 7 +++++-- 10 files changed, 35 insertions(+), 16 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt index ae5025ba896..265cb15cb14 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt @@ -186,7 +186,7 @@ class Fir2IrConverter( } val irModuleFragment = IrModuleFragmentImpl(moduleDescriptor, builtIns, irFiles) val externalDependenciesGenerator = ExternalDependenciesGenerator( - symbolTable, generateTypicalIrProviderList(irModuleFragment.descriptor, builtIns, symbolTable) + symbolTable, generateTypicalIrProviderList(irModuleFragment.descriptor, builtIns, symbolTable), languageVersionSettings ) // Necessary call to generate built-in IR classes externalDependenciesGenerator.generateUnboundSymbolsAsDependencies() diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt index 2e244c20eb3..e0e6185c348 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.analyzer.AbstractAnalyzerWithCompilerReport import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig import org.jetbrains.kotlin.backend.common.phaser.invokeToplevel import org.jetbrains.kotlin.config.CompilerConfiguration +import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.ir.backend.js.lower.generateTests import org.jetbrains.kotlin.ir.backend.js.lower.moveBodilessDeclarationsToSeparatePlace import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformer @@ -59,7 +60,8 @@ fun compile( // Load declarations referenced during `context` initialization dependencyModules.forEach { val irProviders = generateTypicalIrProviderList(it.descriptor, irBuiltIns, symbolTable, deserializer) - ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies() + ExternalDependenciesGenerator(symbolTable, irProviders, configuration.languageVersionSettings) + .generateUnboundSymbolsAsDependencies() } val allModules = when (mainModule) { @@ -74,7 +76,8 @@ fun compile( val irProvidersWithoutDeserializer = generateTypicalIrProviderList(moduleDescriptor, irBuiltIns, symbolTable) // Create stubs - ExternalDependenciesGenerator(symbolTable, irProvidersWithoutDeserializer).generateUnboundSymbolsAsDependencies() + ExternalDependenciesGenerator(symbolTable, irProvidersWithoutDeserializer, configuration.languageVersionSettings) + .generateUnboundSymbolsAsDependencies() moduleFragment.patchDeclarationParents() deserializer.finalizeExpectActualLinker() 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 fa7b3a6e922..22603f6dc75 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 @@ -88,7 +88,7 @@ object JvmBackendFacade { state, sourceManager, irModuleFragment.irBuiltins, irModuleFragment, symbolTable, phaseConfig, extensions.classNameOverride ) /* JvmBackendContext creates new unbound symbols, have to resolve them. */ - ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies() + ExternalDependenciesGenerator(symbolTable, irProviders, state.languageVersionSettings).generateUnboundSymbolsAsDependencies() state.irBasedMapAsmMethod = { descriptor -> context.methodSignatureMapper.mapAsmMethod(context.referenceFunction(descriptor).owner) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt index 0d64263789f..54e438e5046 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt @@ -46,7 +46,7 @@ class JvmIrCodegenFactory(private val phaseConfig: PhaseConfig) : CodegenFactory val irProviders = generateTypicalIrProviderList( irModuleFragment.descriptor, irModuleFragment.irBuiltins, symbolTable, extensions = extensions ) - ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies() + ExternalDependenciesGenerator(symbolTable, irProviders, state.languageVersionSettings).generateUnboundSymbolsAsDependencies() val stubGenerator = irProviders.filterIsInstance().first() for (descriptor in symbolTable.wrappedTopLevelCallableDescriptors()) { diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/compiler.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/compiler.kt index 7e4b784b236..dc3bd82804b 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/compiler.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/compiler.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig import org.jetbrains.kotlin.backend.common.phaser.invokeToplevel import org.jetbrains.kotlin.backend.wasm.codegen.IrModuleToWasm import org.jetbrains.kotlin.config.CompilerConfiguration +import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.ir.backend.js.MainModule import org.jetbrains.kotlin.ir.backend.js.loadIr import org.jetbrains.kotlin.ir.util.ExternalDependenciesGenerator @@ -42,7 +43,8 @@ fun compileWasm( // Load declarations referenced during `context` initialization dependencyModules.forEach { val irProviders = generateTypicalIrProviderList(it.descriptor, irBuiltIns, symbolTable, deserializer) - ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies() + ExternalDependenciesGenerator(symbolTable, irProviders, configuration.languageVersionSettings) + .generateUnboundSymbolsAsDependencies() } val irFiles = dependencyModules.flatMap { it.files } + moduleFragment.files @@ -52,7 +54,7 @@ fun compileWasm( // Create stubs val irProviders = generateTypicalIrProviderList(moduleDescriptor, irBuiltIns, symbolTable, deserializer) - ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies() + ExternalDependenciesGenerator(symbolTable, irProviders, configuration.languageVersionSettings).generateUnboundSymbolsAsDependencies() moduleFragment.patchDeclarationParents() deserializer.finalizeExpectActualLinker() diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ModuleGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ModuleGenerator.kt index 87b7b50bdb8..82c97c7f642 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ModuleGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ModuleGenerator.kt @@ -51,11 +51,13 @@ class ModuleGenerator(override val context: GeneratorContext) : Generator { irModule.descriptor, context.irBuiltIns, context.symbolTable, deserializer, extensions ) - ExternalDependenciesGenerator(context.symbolTable, fullIrProvidersList).generateUnboundSymbolsAsDependencies() + ExternalDependenciesGenerator(context.symbolTable, fullIrProvidersList, context.languageVersionSettings) + .generateUnboundSymbolsAsDependencies() } fun generateUnboundSymbolsAsDependencies(irProviders: List) { - ExternalDependenciesGenerator(context.symbolTable, irProviders).generateUnboundSymbolsAsDependencies() + ExternalDependenciesGenerator(context.symbolTable, irProviders, context.languageVersionSettings) + .generateUnboundSymbolsAsDependencies() } private fun generateFiles(ktFiles: Collection): List { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/ExternalDependenciesGenerator.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/ExternalDependenciesGenerator.kt index 525cceaa561..fcf298ca343 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/ExternalDependenciesGenerator.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/ExternalDependenciesGenerator.kt @@ -16,14 +16,23 @@ package org.jetbrains.kotlin.ir.util +import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult -class ExternalDependenciesGenerator(val symbolTable: SymbolTable, private val irProviders: List) { +class ExternalDependenciesGenerator( + val symbolTable: SymbolTable, + private val irProviders: List, + private val languageVersionSettings: LanguageVersionSettings +) { fun generateUnboundSymbolsAsDependencies() { + if (languageVersionSettings.supportsFeature(LanguageFeature.NewInference)) { + require(symbolTable.unboundTypeParameters.isEmpty()) { "Unbound type parameters are forbidden" } + } // There should be at most one DeclarationStubGenerator (none in closed world?) irProviders.singleOrNull { it is DeclarationStubGenerator }?.let { (it as DeclarationStubGenerator).unboundSymbolGeneration = true @@ -31,8 +40,6 @@ class ExternalDependenciesGenerator(val symbolTable: SymbolTable, private val ir /* Deserializing a reference may lead to new unbound references, so we loop until none are left. */ - require(symbolTable.unboundTypeParameters.isEmpty()) { "Unbound type parameters are forbidden" } - lateinit var unbound: List do { unbound = symbolTable.allUnbound 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 641b0788fac..30e0bf498c3 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 @@ -239,7 +239,8 @@ fun loadIr( val moduleFragment = deserializedModuleFragments.last() val irProviders = generateTypicalIrProviderList(moduleDescriptor, irBuiltIns, symbolTable, deserializer) - ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies() + ExternalDependenciesGenerator(symbolTable, irProviders, configuration.languageVersionSettings) + .generateUnboundSymbolsAsDependencies() return IrModuleInfo(moduleFragment, deserializedModuleFragments, irBuiltIns, symbolTable, deserializer) } diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/repl/js/JsCoreScriptingCompiler.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/repl/js/JsCoreScriptingCompiler.kt index cf4bcabba8e..8a4158cc7f4 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/repl/js/JsCoreScriptingCompiler.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/repl/js/JsCoreScriptingCompiler.kt @@ -83,7 +83,8 @@ class JsCoreScriptingCompiler( irModuleFragment.descriptor, psi2irContext.irBuiltIns, psi2irContext.symbolTable - ) + ), + environment.configuration.languageVersionSettings ).generateUnboundSymbolsAsDependencies() environment.configuration.put(JSConfigurationKeys.MODULE_KIND, ModuleKind.PLAIN) diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/repl/js/JsScriptDependencyCompiler.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/repl/js/JsScriptDependencyCompiler.kt index a3c205636a3..39809b9b011 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/repl/js/JsScriptDependencyCompiler.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/repl/js/JsScriptDependencyCompiler.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureDe import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl +import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentProvider import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl @@ -54,7 +55,8 @@ class JsScriptDependencyCompiler( val irDependencies = dependencies.map { jsLinker.deserializeFullModule(it) } val irProviders = generateTypicalIrProviderList(moduleDescriptor, irBuiltIns, symbolTable, deserializer = jsLinker) - ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies() + ExternalDependenciesGenerator(symbolTable, irProviders, configuration.languageVersionSettings) + .generateUnboundSymbolsAsDependencies() moduleFragment.patchDeclarationParents() val backendContext = JsIrBackendContext( @@ -67,7 +69,8 @@ class JsScriptDependencyCompiler( true ) - ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies() + ExternalDependenciesGenerator(symbolTable, irProviders, configuration.languageVersionSettings) + .generateUnboundSymbolsAsDependencies() moduleFragment.patchDeclarationParents() moduleFragment.files += irDependencies.flatMap { it.files }