[JS] Fix more JS intrinsics not to fail with unbound expect duplicates
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt
index 6433ac0..0b0ec15 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt
@@ -14,6 +14,7 @@
import org.jetbrains.kotlin.ir.declarations.IrProperty
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
+import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.IrType
@@ -189,11 +190,11 @@
val jsYieldFunctionSymbol = getInternalFunction("jsYield")
val jsInvokeSuspendSuperType: IrSimpleFunctionSymbol =
- getCoroutineIntrinsic("invokeSuspendSuperType").single()
+ getCoroutineIntrinsic("invokeSuspendSuperType").single(IrFunctionSymbol::isUnboundOrNotExpect)
val jsInvokeSuspendSuperTypeWithReceiver: IrSimpleFunctionSymbol =
- getCoroutineIntrinsic("invokeSuspendSuperTypeWithReceiver").single()
+ getCoroutineIntrinsic("invokeSuspendSuperTypeWithReceiver").single(IrFunctionSymbol::isUnboundOrNotExpect)
val jsInvokeSuspendSuperTypeWithReceiverAndParam: IrSimpleFunctionSymbol =
- getCoroutineIntrinsic("invokeSuspendSuperTypeWithReceiverAndParam").single()
+ getCoroutineIntrinsic("invokeSuspendSuperTypeWithReceiverAndParam").single(IrFunctionSymbol::isUnboundOrNotExpect)
val createCoroutineUnintercepted: Set<IrSimpleFunctionSymbol> =
getCoroutineIntrinsic("createCoroutineUnintercepted").toHashSet()
@@ -212,7 +213,8 @@
startCoroutineUninterceptedOrReturnGeneratorVersion.single { it.owner.hasShape(extensionReceiver = true, regularParameters = 2) }
}
- val suspendOrReturnFunctionSymbol: IrSimpleFunctionSymbol = getCoroutineIntrinsic("suspendOrReturn").single()
+ val suspendOrReturnFunctionSymbol: IrSimpleFunctionSymbol = getCoroutineIntrinsic("suspendOrReturn")
+ .single(IrFunctionSymbol::isUnboundOrNotExpect)
val jsNumberRangeToNumber = getInternalFunction("numberRangeToNumber")
val jsNumberRangeToLong = getInternalFunction("numberRangeToLong")
@@ -231,10 +233,12 @@
}
val longToDouble: IrSimpleFunctionSymbol =
- symbolFinder.findBuiltInClassMemberFunctions(longClassSymbol, OperatorNameConventions.TO_DOUBLE).single()
+ symbolFinder.findBuiltInClassMemberFunctions(longClassSymbol, OperatorNameConventions.TO_DOUBLE)
+ .single(IrFunctionSymbol::isUnboundOrNotExpect)
val longToFloat: IrSimpleFunctionSymbol =
- symbolFinder.findBuiltInClassMemberFunctions(longClassSymbol, OperatorNameConventions.TO_FLOAT).single()
+ symbolFinder.findBuiltInClassMemberFunctions(longClassSymbol, OperatorNameConventions.TO_FLOAT)
+ .single(IrFunctionSymbol::isUnboundOrNotExpect)
val longCompareToLong: IrSimpleFunction = longClassSymbol.owner.findDeclaration<IrSimpleFunction> {
it.name == Name.identifier("compareTo") && it.parameters[1].type.isLong()
@@ -243,13 +247,15 @@
val charClassSymbol = irBuiltIns.charClass
val stringClassSymbol = irBuiltIns.stringClass
- val stringConstructorSymbol = stringClassSymbol.constructors.single()
+ val stringConstructorSymbol = stringClassSymbol.constructors.single(IrFunctionSymbol::isUnboundOrNotExpect)
val anyClassSymbol = irBuiltIns.anyClass
- val anyConstructorSymbol = anyClassSymbol.constructors.single()
+ val anyConstructorSymbol = anyClassSymbol.constructors.single(IrFunctionSymbol::isUnboundOrNotExpect)
val jsObjectClassSymbol = symbolFinder.topLevelClass(JsStandardClassIds.JsObject)
- val jsObjectConstructorSymbol by lazy(LazyThreadSafetyMode.NONE) { jsObjectClassSymbol.constructors.single() }
+ val jsObjectConstructorSymbol by lazy(LazyThreadSafetyMode.NONE) {
+ jsObjectClassSymbol.constructors.single(IrFunctionSymbol::isUnboundOrNotExpect)
+ }
val uByteClassSymbol: IrClassSymbol by lazy(LazyThreadSafetyMode.NONE) { symbolFinder.topLevelClass(StandardClassIds.UByte) }
val uShortClassSymbol: IrClassSymbol by lazy(LazyThreadSafetyMode.NONE) { symbolFinder.topLevelClass(StandardClassIds.UShort) }
@@ -403,13 +409,16 @@
// Helpers:
private fun getInternalFunction(name: String): IrSimpleFunctionSymbol =
- symbolFinder.findFunctions(Name.identifier(name), JsStandardClassIds.BASE_JS_PACKAGE).single()
+ symbolFinder.findFunctions(Name.identifier(name), JsStandardClassIds.BASE_JS_PACKAGE)
+ .single(IrFunctionSymbol::isUnboundOrNotExpect)
private fun getInternalCollectionFunction(name: String): IrSimpleFunctionSymbol =
- symbolFinder.findFunctions(Name.identifier(name), StandardClassIds.BASE_COLLECTIONS_PACKAGE).single()
+ symbolFinder.findFunctions(Name.identifier(name), StandardClassIds.BASE_COLLECTIONS_PACKAGE)
+ .single(IrFunctionSymbol::isUnboundOrNotExpect)
private fun getInternalProperty(name: String): IrPropertySymbol =
- symbolFinder.findProperties(Name.identifier(name), JsStandardClassIds.BASE_JS_PACKAGE).single()
+ symbolFinder.findProperties(Name.identifier(name), JsStandardClassIds.BASE_JS_PACKAGE)
+ .single(IrPropertySymbol::isUnboundOrNotExpect)
private fun getInternalInRootPackage(name: String): IrSimpleFunctionSymbol? =
symbolFinder.findFunctions(Name.identifier(name), FqName.ROOT).singleOrNull()
@@ -424,8 +433,12 @@
// - SymbolFinder finds in FIR both expect and actual for `enumEntriesIntrinsic`, and only actual one must remain
private fun getFunctionInEnumPackage(name: String): IrSimpleFunctionSymbol =
symbolFinder.findFunctions(Name.identifier(name), StandardClassIds.BASE_ENUMS_PACKAGE)
- .single { !it.isBound || !it.owner.isExpect }
+ .single(IrFunctionSymbol::isUnboundOrNotExpect)
private fun getFunctionInKotlinPackage(name: String): IrSimpleFunctionSymbol =
- symbolFinder.findFunctions(Name.identifier(name), StandardClassIds.BASE_KOTLIN_PACKAGE).single()
+ symbolFinder.findFunctions(Name.identifier(name), StandardClassIds.BASE_KOTLIN_PACKAGE)
+ .single(IrFunctionSymbol::isUnboundOrNotExpect)
}
+
+fun IrFunctionSymbol.isUnboundOrNotExpect() = !isBound || !owner.isExpect
+fun IrPropertySymbol.isUnboundOrNotExpect() = !isBound || !owner.isExpect