[IR] [Refactoring] Add toString and String::plus to IrBuiltins

Also use `OperatorNameConventions` constants instead of magic strings
This commit is contained in:
Sergej Jaskiewicz
2021-10-28 08:35:11 +00:00
committed by Space
parent f8dd1b3512
commit a367b91aa1
10 changed files with 80 additions and 36 deletions
@@ -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
}
}