From f05c8ad95306a8f92dff8a87957d238e8060456f Mon Sep 17 00:00:00 2001 From: Roman Artemev Date: Mon, 27 Sep 2021 21:52:00 +0300 Subject: [PATCH] [JS IR] Fix `js("...")` call checker in frontend. Call mather relies on that BuiltIn package fragment implement specific interface `BuiltInsPackageFragment` which was missed. Make sure that BuiltIn module's package fragments implement that interface. Fix progression optimizer symbols resolve in JS & WASM IR BE --- .../jetbrains/kotlin/backend/common/ir/Ir.kt | 4 +-- .../ir/backend/js/JsIrBackendContext.kt | 31 ++++++++++++++++--- .../kotlin/backend/wasm/WasmSymbols.kt | 29 ++++++++++++++++- .../metadata/KlibMetadataPackageFragment.kt | 17 +++++++++- ...DeserializedPackageFragmentsFactoryImpl.kt | 21 +++++++++---- 5 files changed, 88 insertions(+), 14 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt index 9c15cc87b5d..00ab95378a7 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt @@ -98,10 +98,10 @@ open class BuiltinSymbolsBase(val irBuiltIns: IrBuiltIns, private val symbolTabl open val getProgressionLastElementByReturnType: Map = irBuiltIns.getNonBuiltinFunctionsByReturnType(Name.identifier("getProgressionLastElement"), "kotlin", "internal") - val toUIntByExtensionReceiver: Map = + open val toUIntByExtensionReceiver: Map = irBuiltIns.getNonBuiltInFunctionsByExtensionReceiver(Name.identifier("toUInt"), "kotlin") - val toULongByExtensionReceiver: Map = + open val toULongByExtensionReceiver: Map = irBuiltIns.getNonBuiltInFunctionsByExtensionReceiver(Name.identifier("toULong"), "kotlin") val any get() = irBuiltIns.anyClass diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt index cdfa4a49415..e1add8f4ea1 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt @@ -33,10 +33,7 @@ import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.symbols.impl.DescriptorlessExternalPackageFragmentSymbol import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.types.impl.IrDynamicTypeImpl -import org.jetbrains.kotlin.ir.util.SymbolTable -import org.jetbrains.kotlin.ir.util.getPropertyGetter -import org.jetbrains.kotlin.ir.util.getPropertySetter -import org.jetbrains.kotlin.ir.util.kotlinPackageFqn +import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.js.config.ErrorTolerancePolicy import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.js.config.RuntimeDiagnostic @@ -261,6 +258,32 @@ class JsIrBackendContext( override fun suspendFunctionN(n: Int): IrClassSymbol { return irFactory.stageController.withInitialIr { super.suspendFunctionN(n) } } + + + private val getProgressionLastElementSymbols = + irBuiltIns.findFunctions(Name.identifier("getProgressionLastElement"), "kotlin", "internal") + + override val getProgressionLastElementByReturnType: Map by lazy { + getProgressionLastElementSymbols.associateBy { it.owner.returnType.classifierOrFail } + } + + private val toUIntSymbols = irBuiltIns.findFunctions(Name.identifier("toUInt"), "kotlin") + + override val toUIntByExtensionReceiver: Map by lazy { + toUIntSymbols.associateBy { + it.owner.extensionReceiverParameter?.type?.classifierOrFail + ?: error("Expected extension receiver for ${it.owner.render()}") + } + } + + private val toULongSymbols = irBuiltIns.findFunctions(Name.identifier("toULong"), "kotlin") + + override val toULongByExtensionReceiver: Map by lazy { + toULongSymbols.associateBy { + it.owner.extensionReceiverParameter?.type?.classifierOrFail + ?: error("Expected extension receiver for ${it.owner.render()}") + } + } } override fun unfoldInlineClassType(irType: IrType): IrType? { diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmSymbols.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmSymbols.kt index 16310ae7dea..1088e664b9f 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmSymbols.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmSymbols.kt @@ -17,10 +17,12 @@ import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol -import org.jetbrains.kotlin.ir.types.defaultType import org.jetbrains.kotlin.ir.types.IrType +import org.jetbrains.kotlin.ir.types.classifierOrFail +import org.jetbrains.kotlin.ir.types.defaultType import org.jetbrains.kotlin.ir.types.typeWith import org.jetbrains.kotlin.ir.util.SymbolTable +import org.jetbrains.kotlin.ir.util.render import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.scopes.MemberScope @@ -178,6 +180,31 @@ class WasmSymbols( val arraysCopyInto = findFunctions(collectionsPackage.memberScope, Name.identifier("copyInto")) .map { symbolTable.referenceSimpleFunction(it) } + private val getProgressionLastElementSymbols = + irBuiltIns.findFunctions(Name.identifier("getProgressionLastElement"), "kotlin", "internal") + + override val getProgressionLastElementByReturnType: Map by lazy { + getProgressionLastElementSymbols.associateBy { it.owner.returnType.classifierOrFail } + } + + private val toUIntSymbols = irBuiltIns.findFunctions(Name.identifier("toUInt"), "kotlin") + + override val toUIntByExtensionReceiver: Map by lazy { + toUIntSymbols.associateBy { + it.owner.extensionReceiverParameter?.type?.classifierOrFail + ?: error("Expected extension receiver for ${it.owner.render()}") + } + } + + private val toULongSymbols = irBuiltIns.findFunctions(Name.identifier("toULong"), "kotlin") + + override val toULongByExtensionReceiver: Map by lazy { + toULongSymbols.associateBy { + it.owner.extensionReceiverParameter?.type?.classifierOrFail + ?: error("Expected extension receiver for ${it.owner.render()}") + } + } + override fun functionN(n: Int): IrClassSymbol = functionNInterfaces[n] diff --git a/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibMetadataPackageFragment.kt b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibMetadataPackageFragment.kt index d83275bd35c..4b265522209 100644 --- a/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibMetadataPackageFragment.kt +++ b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibMetadataPackageFragment.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.library.metadata import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataVersion +import org.jetbrains.kotlin.builtins.BuiltInsPackageFragment import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.metadata.ProtoBuf @@ -20,7 +21,7 @@ import org.jetbrains.kotlin.serialization.deserialization.getName import org.jetbrains.kotlin.storage.StorageManager import java.lang.ref.SoftReference -class KlibMetadataDeserializedPackageFragment( +open class KlibMetadataDeserializedPackageFragment( fqName: FqName, private val library: KotlinLibrary, private val packageAccessHandler: PackageAccessHandler?, @@ -51,6 +52,20 @@ class KlibMetadataDeserializedPackageFragment( } } +class BuiltInKlibMetadataDeserializedPackageFragment( + fqName: FqName, + library: KotlinLibrary, + packageAccessHandler: PackageAccessHandler?, + storageManager: StorageManager, + module: ModuleDescriptor, + partName: String +) : KlibMetadataDeserializedPackageFragment(fqName, library, packageAccessHandler, storageManager, module, partName), + BuiltInsPackageFragment { + + override val isFallback: Boolean + get() = false +} + class KlibMetadataCachedPackageFragment( byteArray: ByteArray, storageManager: StorageManager, diff --git a/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/impl/KlibMetadataDeserializedPackageFragmentsFactoryImpl.kt b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/impl/KlibMetadataDeserializedPackageFragmentsFactoryImpl.kt index bb65e7971c6..16388173b8c 100644 --- a/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/impl/KlibMetadataDeserializedPackageFragmentsFactoryImpl.kt +++ b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/impl/KlibMetadataDeserializedPackageFragmentsFactoryImpl.kt @@ -6,11 +6,10 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl import org.jetbrains.kotlin.incremental.components.LookupLocation -import org.jetbrains.kotlin.library.* -import org.jetbrains.kotlin.library.metadata.KlibMetadataCachedPackageFragment -import org.jetbrains.kotlin.library.metadata.KlibMetadataDeserializedPackageFragment -import org.jetbrains.kotlin.library.metadata.KlibMetadataPackageFragment -import org.jetbrains.kotlin.library.metadata.PackageAccessHandler +import org.jetbrains.kotlin.library.KotlinLibrary +import org.jetbrains.kotlin.library.exportForwardDeclarations +import org.jetbrains.kotlin.library.isInterop +import org.jetbrains.kotlin.library.metadata.* import org.jetbrains.kotlin.library.packageFqName import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -32,8 +31,18 @@ open class KlibMetadataDeserializedPackageFragmentsFactoryImpl : KlibMetadataDes ) = packageFragmentNames.flatMap { val fqName = FqName(it) val parts = library.packageMetadataParts(fqName.asString()) + val isBuiltInModule = moduleDescriptor.builtIns.builtInsModule === moduleDescriptor parts.map { partName -> - KlibMetadataDeserializedPackageFragment(fqName, library, packageAccessedHandler, storageManager, moduleDescriptor, partName) + if (isBuiltInModule) + BuiltInKlibMetadataDeserializedPackageFragment( + fqName, + library, + packageAccessedHandler, + storageManager, + moduleDescriptor, + partName + ) else + KlibMetadataDeserializedPackageFragment(fqName, library, packageAccessedHandler, storageManager, moduleDescriptor, partName) } }