[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
@@ -16,8 +16,6 @@ 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.IrType
import org.jetbrains.kotlin.ir.types.classifierOrNull
import org.jetbrains.kotlin.ir.util.SymbolTable
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
@@ -142,7 +140,10 @@ abstract class IrBuiltIns {
abstract val intXorSymbol: IrSimpleFunctionSymbol
abstract val extensionToString: IrSimpleFunctionSymbol
abstract val stringPlus: IrSimpleFunctionSymbol
abstract val memberToString: IrSimpleFunctionSymbol
abstract val extensionStringPlus: IrSimpleFunctionSymbol
abstract val memberStringPlus: IrSimpleFunctionSymbol
abstract val arrayOf: IrSimpleFunctionSymbol
abstract val arrayOfNulls: IrSimpleFunctionSymbol
@@ -39,6 +39,7 @@ import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.storage.LockBasedStorageManager
import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.checker.KotlinTypeChecker
import org.jetbrains.kotlin.util.OperatorNameConventions
@ObsoleteDescriptorBasedAPI
class IrBuiltInsOverDescriptors(
@@ -502,14 +503,22 @@ class IrBuiltInsOverDescriptors(
} else null
}
override val extensionToString: IrSimpleFunctionSymbol = findFunctions(Name.identifier("toString"), "kotlin").first {
override val extensionToString: IrSimpleFunctionSymbol = findFunctions(OperatorNameConventions.TO_STRING, "kotlin").first {
val descriptor = it.descriptor
descriptor is SimpleFunctionDescriptor && descriptor.dispatchReceiverParameter == null &&
descriptor.extensionReceiverParameter != null &&
KotlinBuiltIns.isNullableAny(descriptor.extensionReceiverParameter!!.type) && descriptor.valueParameters.size == 0
KotlinBuiltIns.isNullableAny(descriptor.extensionReceiverParameter!!.type) && descriptor.valueParameters.isEmpty()
}
override val stringPlus: IrSimpleFunctionSymbol = findFunctions(Name.identifier("plus"), "kotlin").first {
override val memberToString: IrSimpleFunctionSymbol = findBuiltInClassMemberFunctions(
anyClass,
OperatorNameConventions.TO_STRING
).single {
val descriptor = it.descriptor
descriptor is SimpleFunctionDescriptor && descriptor.valueParameters.isEmpty()
}
override val extensionStringPlus: IrSimpleFunctionSymbol = findFunctions(OperatorNameConventions.PLUS, "kotlin").first {
val descriptor = it.descriptor
descriptor is SimpleFunctionDescriptor && descriptor.dispatchReceiverParameter == null &&
descriptor.extensionReceiverParameter != null &&
@@ -518,6 +527,16 @@ class IrBuiltInsOverDescriptors(
KotlinBuiltIns.isNullableAny(descriptor.valueParameters.first().type)
}
override val memberStringPlus: IrSimpleFunctionSymbol = findBuiltInClassMemberFunctions(
stringClass,
OperatorNameConventions.PLUS
).single {
val descriptor = it.descriptor
descriptor is SimpleFunctionDescriptor &&
descriptor.valueParameters.size == 1 &&
KotlinBuiltIns.isNullableAny(descriptor.valueParameters.first().type)
}
override fun functionN(arity: Int): IrClass = functionFactory.functionN(arity)
override fun kFunctionN(arity: Int): IrClass = functionFactory.kFunctionN(arity)
override fun suspendFunctionN(arity: Int): IrClass = functionFactory.suspendFunctionN(arity)