[JS IC] Properly handle type parameters of Functional interfaces

- drop redundant `IrSymbolTable` and `IrIcModuleDeserializerWithBuiltIns`
This commit is contained in:
Roman Artemev
2021-07-27 13:42:23 +03:00
committed by teamcityserver
parent 6aed492703
commit 3d3c70141c
7 changed files with 39 additions and 140 deletions
@@ -1,46 +0,0 @@
/*
* Copyright 2010-2021 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.backend.js.ic
import org.jetbrains.kotlin.ir.declarations.IrFactory
import org.jetbrains.kotlin.ir.declarations.IrTypeParameter
import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldPublicSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrTypeParameterPublicSymbolImpl
import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.ir.util.IdSignatureComposer
import org.jetbrains.kotlin.ir.util.NameProvider
import org.jetbrains.kotlin.ir.util.SymbolTable
class IcSymbolTable(
signaturer: IdSignatureComposer,
irFactory: IrFactory,
nameProvider: NameProvider = NameProvider.DEFAULT,
) : SymbolTable(
signaturer,
irFactory,
nameProvider,
) {
override fun referenceFieldFromLinker(sig: IdSignature): IrFieldSymbol =
fieldSymbolTable.run {
fieldSymbolTable.referenced(sig) { IrFieldPublicSymbolImpl(sig) }
}
override fun declareGlobalTypeParameter(
sig: IdSignature,
symbolFactory: () -> IrTypeParameterSymbol,
typeParameterFactory: (IrTypeParameterSymbol) -> IrTypeParameter
): IrTypeParameter {
return globalTypeParameterSymbolTable.declare(sig, symbolFactory, typeParameterFactory)
}
override fun referenceTypeParameterFromLinker(sig: IdSignature): IrTypeParameterSymbol {
return scopedTypeParameterSymbolTable.get(sig) ?: globalTypeParameterSymbolTable.referenced(sig) {
IrTypeParameterPublicSymbolImpl(sig)
}
}
}
@@ -30,7 +30,6 @@ import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.backend.js.ic.IcSymbolTable
import org.jetbrains.kotlin.ir.backend.js.ic.SerializedIcData
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsIrLinker
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsIrModuleSerializer
@@ -273,7 +272,7 @@ fun loadIr(
val allDependencies = depsDescriptors.allDependencies
val signaturer = IdSignatureDescriptor(JsManglerDesc)
val symbolTable = if (loweringsCacheProvider == null) SymbolTable(signaturer, irFactory) else IcSymbolTable(signaturer, irFactory)
val symbolTable = SymbolTable(signaturer, irFactory)
when (mainModule) {
is MainModule.SourceFiles -> {
@@ -1,64 +0,0 @@
/*
* Copyright 2010-2021 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.backend.js.lower.serialization.ir
import org.jetbrains.kotlin.backend.common.serialization.IrModuleDeserializer
import org.jetbrains.kotlin.backend.common.serialization.IrModuleDeserializerWithBuiltIns
import org.jetbrains.kotlin.backend.common.serialization.encodings.BinarySymbolData
import org.jetbrains.kotlin.backend.common.serialization.knownBuiltins
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.declarations.IrSymbolOwner
import org.jetbrains.kotlin.ir.declarations.IrTypeParametersContainer
import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.util.IdSignature
class IrIcModuleDeserializerWithBuiltIns(
builtIns: IrBuiltIns,
delegate: IrModuleDeserializer,
) : IrModuleDeserializerWithBuiltIns(builtIns, delegate) {
override fun additionalBuiltIns(builtIns: IrBuiltIns): Map<IdSignature, IrSymbol> {
val result = mutableMapOf<IdSignature, IrSymbol>()
builtIns.knownBuiltins.forEach {
val symbol = (it as IrSymbolOwner).symbol
val declaration = symbol.owner
if (declaration is IrSimpleFunction) {
declaration.typeParameters.forEachIndexed { i, tp ->
result[IdSignature.GlobalFileLocalSignature(symbol.signature!!, 1000_000_000_000L + i, "")] = tp.symbol
}
}
}
return result
}
override fun checkIsFunctionInterface(idSig: IdSignature): Boolean {
if (idSig is IdSignature.GlobalFileLocalSignature) return checkIsFunctionInterface(idSig.container)
return super.checkIsFunctionInterface(idSig)
}
override fun contains(idSig: IdSignature): Boolean {
return super.contains(idSig) || idSig is IdSignature.GlobalFileLocalSignature && checkIsFunctionInterface(idSig.container)
}
override fun resolveFunctionalInterface(idSig: IdSignature, symbolKind: BinarySymbolData.SymbolKind): IrSymbol {
if (idSig is IdSignature.GlobalFileLocalSignature) {
val containerSymbolKind = when (idSig.container.asPublic()!!.nameSegments.size) {
1 -> BinarySymbolData.SymbolKind.CLASS_SYMBOL
3 -> BinarySymbolData.SymbolKind.FUNCTION_SYMBOL
else -> error("Cannot infer symbolKind")
}
val declaration = resolveFunctionalInterface(idSig.container, containerSymbolKind).owner as IrTypeParametersContainer
return declaration.typeParameters[(idSig.id - 1000_000_000_000L).toInt()].symbol
}
return super.resolveFunctionalInterface(idSig, symbolKind)
}
}
@@ -78,11 +78,7 @@ class JsIrLinker(
moduleDeserializer: IrModuleDeserializer
): IrModuleDeserializer {
return if (isBuiltInModule(moduleDescriptor)) {
if (useGlobalSignatures) {
IrIcModuleDeserializerWithBuiltIns(builtIns, moduleDeserializer)
} else {
IrModuleDeserializerWithBuiltIns(builtIns, moduleDeserializer)
}
IrModuleDeserializerWithBuiltIns(builtIns, moduleDeserializer)
} else moduleDeserializer
}