[IR] [Refactoring] Add toString and String::plus to IrBuiltins
Also use `OperatorNameConventions` constants instead of magic strings
This commit is contained in:
@@ -454,15 +454,31 @@ class IrBuiltInsOverFir(
|
||||
}
|
||||
|
||||
override val extensionToString: IrSimpleFunctionSymbol by lazy {
|
||||
findFunctions(kotlinPackage, Name.identifier("toString")).first { function ->
|
||||
findFunctions(kotlinPackage, OperatorNameConventions.TO_STRING).single { function ->
|
||||
function.owner.extensionReceiverParameter?.let { receiver -> receiver.type == anyNType } ?: false
|
||||
}
|
||||
}
|
||||
|
||||
override val stringPlus: IrSimpleFunctionSymbol
|
||||
get() = intClass.functions.single {
|
||||
it.owner.name == OperatorNameConventions.PLUS && it.owner.valueParameters[0].type == stringType
|
||||
override val memberToString: IrSimpleFunctionSymbol by lazy {
|
||||
findBuiltInClassMemberFunctions(anyClass, OperatorNameConventions.TO_STRING).single { function ->
|
||||
function.owner.valueParameters.isEmpty()
|
||||
}
|
||||
}
|
||||
|
||||
override val extensionStringPlus: IrSimpleFunctionSymbol by lazy {
|
||||
findFunctions(kotlinPackage, OperatorNameConventions.PLUS).single { function ->
|
||||
val isStringExtension =
|
||||
function.owner.extensionReceiverParameter?.let { receiver -> receiver.type == stringType.withHasQuestionMark(true) }
|
||||
?: false
|
||||
isStringExtension && function.owner.valueParameters.size == 1 && function.owner.valueParameters[0].type == anyNType
|
||||
}
|
||||
}
|
||||
|
||||
override val memberStringPlus: IrSimpleFunctionSymbol by lazy {
|
||||
findBuiltInClassMemberFunctions(stringClass, OperatorNameConventions.PLUS).single { function ->
|
||||
function.owner.valueParameters.size == 1 && function.owner.valueParameters[0].type == anyNType
|
||||
}
|
||||
}
|
||||
|
||||
private class KotlinPackageFuns(
|
||||
val arrayOf: IrSimpleFunctionSymbol,
|
||||
|
||||
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.ir.types.IrSimpleType
|
||||
import org.jetbrains.kotlin.ir.types.IrType
|
||||
import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
|
||||
class Fir2IrLazyClass(
|
||||
components: Fir2IrComponents,
|
||||
@@ -214,9 +215,9 @@ class Fir2IrLazyClass(
|
||||
private fun FirNamedFunctionSymbol.isAbstractMethodOfAny(): Boolean {
|
||||
val fir = fir
|
||||
if (fir.modality != Modality.ABSTRACT) return false
|
||||
return when (fir.name.asString()) {
|
||||
"equals" -> fir.valueParameters.singleOrNull()?.returnTypeRef?.isNullableAny == true
|
||||
"hashCode", "toString" -> fir.valueParameters.isEmpty()
|
||||
return when (fir.name) {
|
||||
OperatorNameConventions.EQUALS -> fir.valueParameters.singleOrNull()?.returnTypeRef?.isNullableAny == true
|
||||
OperatorNameConventions.HASH_CODE, OperatorNameConventions.TO_STRING -> fir.valueParameters.isEmpty()
|
||||
else -> false
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user