IR: only require all type parameter references to be local with new inference
This commit is contained in:
@@ -186,7 +186,7 @@ class Fir2IrConverter(
|
|||||||
}
|
}
|
||||||
val irModuleFragment = IrModuleFragmentImpl(moduleDescriptor, builtIns, irFiles)
|
val irModuleFragment = IrModuleFragmentImpl(moduleDescriptor, builtIns, irFiles)
|
||||||
val externalDependenciesGenerator = ExternalDependenciesGenerator(
|
val externalDependenciesGenerator = ExternalDependenciesGenerator(
|
||||||
symbolTable, generateTypicalIrProviderList(irModuleFragment.descriptor, builtIns, symbolTable)
|
symbolTable, generateTypicalIrProviderList(irModuleFragment.descriptor, builtIns, symbolTable), languageVersionSettings
|
||||||
)
|
)
|
||||||
// Necessary call to generate built-in IR classes
|
// Necessary call to generate built-in IR classes
|
||||||
externalDependenciesGenerator.generateUnboundSymbolsAsDependencies()
|
externalDependenciesGenerator.generateUnboundSymbolsAsDependencies()
|
||||||
|
|||||||
@@ -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.PhaseConfig
|
||||||
import org.jetbrains.kotlin.backend.common.phaser.invokeToplevel
|
import org.jetbrains.kotlin.backend.common.phaser.invokeToplevel
|
||||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
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.generateTests
|
||||||
import org.jetbrains.kotlin.ir.backend.js.lower.moveBodilessDeclarationsToSeparatePlace
|
import org.jetbrains.kotlin.ir.backend.js.lower.moveBodilessDeclarationsToSeparatePlace
|
||||||
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformer
|
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformer
|
||||||
@@ -59,7 +60,8 @@ fun compile(
|
|||||||
// Load declarations referenced during `context` initialization
|
// Load declarations referenced during `context` initialization
|
||||||
dependencyModules.forEach {
|
dependencyModules.forEach {
|
||||||
val irProviders = generateTypicalIrProviderList(it.descriptor, irBuiltIns, symbolTable, deserializer)
|
val irProviders = generateTypicalIrProviderList(it.descriptor, irBuiltIns, symbolTable, deserializer)
|
||||||
ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies()
|
ExternalDependenciesGenerator(symbolTable, irProviders, configuration.languageVersionSettings)
|
||||||
|
.generateUnboundSymbolsAsDependencies()
|
||||||
}
|
}
|
||||||
|
|
||||||
val allModules = when (mainModule) {
|
val allModules = when (mainModule) {
|
||||||
@@ -74,7 +76,8 @@ fun compile(
|
|||||||
|
|
||||||
val irProvidersWithoutDeserializer = generateTypicalIrProviderList(moduleDescriptor, irBuiltIns, symbolTable)
|
val irProvidersWithoutDeserializer = generateTypicalIrProviderList(moduleDescriptor, irBuiltIns, symbolTable)
|
||||||
// Create stubs
|
// Create stubs
|
||||||
ExternalDependenciesGenerator(symbolTable, irProvidersWithoutDeserializer).generateUnboundSymbolsAsDependencies()
|
ExternalDependenciesGenerator(symbolTable, irProvidersWithoutDeserializer, configuration.languageVersionSettings)
|
||||||
|
.generateUnboundSymbolsAsDependencies()
|
||||||
moduleFragment.patchDeclarationParents()
|
moduleFragment.patchDeclarationParents()
|
||||||
|
|
||||||
deserializer.finalizeExpectActualLinker()
|
deserializer.finalizeExpectActualLinker()
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ object JvmBackendFacade {
|
|||||||
state, sourceManager, irModuleFragment.irBuiltins, irModuleFragment, symbolTable, phaseConfig, extensions.classNameOverride
|
state, sourceManager, irModuleFragment.irBuiltins, irModuleFragment, symbolTable, phaseConfig, extensions.classNameOverride
|
||||||
)
|
)
|
||||||
/* JvmBackendContext creates new unbound symbols, have to resolve them. */
|
/* JvmBackendContext creates new unbound symbols, have to resolve them. */
|
||||||
ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies()
|
ExternalDependenciesGenerator(symbolTable, irProviders, state.languageVersionSettings).generateUnboundSymbolsAsDependencies()
|
||||||
|
|
||||||
state.irBasedMapAsmMethod = { descriptor ->
|
state.irBasedMapAsmMethod = { descriptor ->
|
||||||
context.methodSignatureMapper.mapAsmMethod(context.referenceFunction(descriptor).owner)
|
context.methodSignatureMapper.mapAsmMethod(context.referenceFunction(descriptor).owner)
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ class JvmIrCodegenFactory(private val phaseConfig: PhaseConfig) : CodegenFactory
|
|||||||
val irProviders = generateTypicalIrProviderList(
|
val irProviders = generateTypicalIrProviderList(
|
||||||
irModuleFragment.descriptor, irModuleFragment.irBuiltins, symbolTable, extensions = extensions
|
irModuleFragment.descriptor, irModuleFragment.irBuiltins, symbolTable, extensions = extensions
|
||||||
)
|
)
|
||||||
ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies()
|
ExternalDependenciesGenerator(symbolTable, irProviders, state.languageVersionSettings).generateUnboundSymbolsAsDependencies()
|
||||||
|
|
||||||
val stubGenerator = irProviders.filterIsInstance<DeclarationStubGenerator>().first()
|
val stubGenerator = irProviders.filterIsInstance<DeclarationStubGenerator>().first()
|
||||||
for (descriptor in symbolTable.wrappedTopLevelCallableDescriptors()) {
|
for (descriptor in symbolTable.wrappedTopLevelCallableDescriptors()) {
|
||||||
|
|||||||
@@ -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.common.phaser.invokeToplevel
|
||||||
import org.jetbrains.kotlin.backend.wasm.codegen.IrModuleToWasm
|
import org.jetbrains.kotlin.backend.wasm.codegen.IrModuleToWasm
|
||||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
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.MainModule
|
||||||
import org.jetbrains.kotlin.ir.backend.js.loadIr
|
import org.jetbrains.kotlin.ir.backend.js.loadIr
|
||||||
import org.jetbrains.kotlin.ir.util.ExternalDependenciesGenerator
|
import org.jetbrains.kotlin.ir.util.ExternalDependenciesGenerator
|
||||||
@@ -42,7 +43,8 @@ fun compileWasm(
|
|||||||
// Load declarations referenced during `context` initialization
|
// Load declarations referenced during `context` initialization
|
||||||
dependencyModules.forEach {
|
dependencyModules.forEach {
|
||||||
val irProviders = generateTypicalIrProviderList(it.descriptor, irBuiltIns, symbolTable, deserializer)
|
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
|
val irFiles = dependencyModules.flatMap { it.files } + moduleFragment.files
|
||||||
@@ -52,7 +54,7 @@ fun compileWasm(
|
|||||||
|
|
||||||
// Create stubs
|
// Create stubs
|
||||||
val irProviders = generateTypicalIrProviderList(moduleDescriptor, irBuiltIns, symbolTable, deserializer)
|
val irProviders = generateTypicalIrProviderList(moduleDescriptor, irBuiltIns, symbolTable, deserializer)
|
||||||
ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies()
|
ExternalDependenciesGenerator(symbolTable, irProviders, configuration.languageVersionSettings).generateUnboundSymbolsAsDependencies()
|
||||||
moduleFragment.patchDeclarationParents()
|
moduleFragment.patchDeclarationParents()
|
||||||
deserializer.finalizeExpectActualLinker()
|
deserializer.finalizeExpectActualLinker()
|
||||||
|
|
||||||
|
|||||||
@@ -51,11 +51,13 @@ class ModuleGenerator(override val context: GeneratorContext) : Generator {
|
|||||||
irModule.descriptor, context.irBuiltIns, context.symbolTable, deserializer,
|
irModule.descriptor, context.irBuiltIns, context.symbolTable, deserializer,
|
||||||
extensions
|
extensions
|
||||||
)
|
)
|
||||||
ExternalDependenciesGenerator(context.symbolTable, fullIrProvidersList).generateUnboundSymbolsAsDependencies()
|
ExternalDependenciesGenerator(context.symbolTable, fullIrProvidersList, context.languageVersionSettings)
|
||||||
|
.generateUnboundSymbolsAsDependencies()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun generateUnboundSymbolsAsDependencies(irProviders: List<IrProvider>) {
|
fun generateUnboundSymbolsAsDependencies(irProviders: List<IrProvider>) {
|
||||||
ExternalDependenciesGenerator(context.symbolTable, irProviders).generateUnboundSymbolsAsDependencies()
|
ExternalDependenciesGenerator(context.symbolTable, irProviders, context.languageVersionSettings)
|
||||||
|
.generateUnboundSymbolsAsDependencies()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun generateFiles(ktFiles: Collection<KtFile>): List<IrFile> {
|
private fun generateFiles(ktFiles: Collection<KtFile>): List<IrFile> {
|
||||||
|
|||||||
+10
-3
@@ -16,14 +16,23 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.ir.util
|
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.descriptors.ModuleDescriptor
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
||||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrSymbol
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
|
import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
|
||||||
|
|
||||||
class ExternalDependenciesGenerator(val symbolTable: SymbolTable, private val irProviders: List<IrProvider>) {
|
class ExternalDependenciesGenerator(
|
||||||
|
val symbolTable: SymbolTable,
|
||||||
|
private val irProviders: List<IrProvider>,
|
||||||
|
private val languageVersionSettings: LanguageVersionSettings
|
||||||
|
) {
|
||||||
fun generateUnboundSymbolsAsDependencies() {
|
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?)
|
// There should be at most one DeclarationStubGenerator (none in closed world?)
|
||||||
irProviders.singleOrNull { it is DeclarationStubGenerator }?.let {
|
irProviders.singleOrNull { it is DeclarationStubGenerator }?.let {
|
||||||
(it as DeclarationStubGenerator).unboundSymbolGeneration = true
|
(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.
|
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<IrSymbol>
|
lateinit var unbound: List<IrSymbol>
|
||||||
do {
|
do {
|
||||||
unbound = symbolTable.allUnbound
|
unbound = symbolTable.allUnbound
|
||||||
|
|||||||
@@ -239,7 +239,8 @@ fun loadIr(
|
|||||||
val moduleFragment = deserializedModuleFragments.last()
|
val moduleFragment = deserializedModuleFragments.last()
|
||||||
|
|
||||||
val irProviders = generateTypicalIrProviderList(moduleDescriptor, irBuiltIns, symbolTable, deserializer)
|
val irProviders = generateTypicalIrProviderList(moduleDescriptor, irBuiltIns, symbolTable, deserializer)
|
||||||
ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies()
|
ExternalDependenciesGenerator(symbolTable, irProviders, configuration.languageVersionSettings)
|
||||||
|
.generateUnboundSymbolsAsDependencies()
|
||||||
|
|
||||||
return IrModuleInfo(moduleFragment, deserializedModuleFragments, irBuiltIns, symbolTable, deserializer)
|
return IrModuleInfo(moduleFragment, deserializedModuleFragments, irBuiltIns, symbolTable, deserializer)
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -83,7 +83,8 @@ class JsCoreScriptingCompiler(
|
|||||||
irModuleFragment.descriptor,
|
irModuleFragment.descriptor,
|
||||||
psi2irContext.irBuiltIns,
|
psi2irContext.irBuiltIns,
|
||||||
psi2irContext.symbolTable
|
psi2irContext.symbolTable
|
||||||
)
|
),
|
||||||
|
environment.configuration.languageVersionSettings
|
||||||
).generateUnboundSymbolsAsDependencies()
|
).generateUnboundSymbolsAsDependencies()
|
||||||
|
|
||||||
environment.configuration.put(JSConfigurationKeys.MODULE_KIND, ModuleKind.PLAIN)
|
environment.configuration.put(JSConfigurationKeys.MODULE_KIND, ModuleKind.PLAIN)
|
||||||
|
|||||||
+5
-2
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureDe
|
|||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||||
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
|
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
|
||||||
|
import org.jetbrains.kotlin.config.languageVersionSettings
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.PackageFragmentProvider
|
import org.jetbrains.kotlin.descriptors.PackageFragmentProvider
|
||||||
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
||||||
@@ -54,7 +55,8 @@ class JsScriptDependencyCompiler(
|
|||||||
val irDependencies = dependencies.map { jsLinker.deserializeFullModule(it) }
|
val irDependencies = dependencies.map { jsLinker.deserializeFullModule(it) }
|
||||||
val irProviders = generateTypicalIrProviderList(moduleDescriptor, irBuiltIns, symbolTable, deserializer = jsLinker)
|
val irProviders = generateTypicalIrProviderList(moduleDescriptor, irBuiltIns, symbolTable, deserializer = jsLinker)
|
||||||
|
|
||||||
ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies()
|
ExternalDependenciesGenerator(symbolTable, irProviders, configuration.languageVersionSettings)
|
||||||
|
.generateUnboundSymbolsAsDependencies()
|
||||||
moduleFragment.patchDeclarationParents()
|
moduleFragment.patchDeclarationParents()
|
||||||
|
|
||||||
val backendContext = JsIrBackendContext(
|
val backendContext = JsIrBackendContext(
|
||||||
@@ -67,7 +69,8 @@ class JsScriptDependencyCompiler(
|
|||||||
true
|
true
|
||||||
)
|
)
|
||||||
|
|
||||||
ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies()
|
ExternalDependenciesGenerator(symbolTable, irProviders, configuration.languageVersionSettings)
|
||||||
|
.generateUnboundSymbolsAsDependencies()
|
||||||
moduleFragment.patchDeclarationParents()
|
moduleFragment.patchDeclarationParents()
|
||||||
|
|
||||||
moduleFragment.files += irDependencies.flatMap { it.files }
|
moduleFragment.files += irDependencies.flatMap { it.files }
|
||||||
|
|||||||
Reference in New Issue
Block a user