Use FQ names for string plus intrinsic in FlattenStringConcatenationLowering

This commit is contained in:
Steven Schäfer
2019-05-15 13:59:51 +02:00
committed by Alexander Udalov
parent 43bf962d79
commit cf13293363
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrStringConcatenation import org.jetbrains.kotlin.ir.expressions.IrStringConcatenation
import org.jetbrains.kotlin.ir.expressions.impl.IrStringConcatenationImpl import org.jetbrains.kotlin.ir.expressions.impl.IrStringConcatenationImpl
import org.jetbrains.kotlin.ir.types.isStringClassType import org.jetbrains.kotlin.ir.types.isStringClassType
import org.jetbrains.kotlin.ir.util.getPackageFragment import org.jetbrains.kotlin.ir.util.fqNameSafe
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
@@ -68,6 +68,13 @@ val flattenStringConcatenationPhase = makeIrFilePhase(
class FlattenStringConcatenationLowering(val context: CommonBackendContext) : FileLoweringPass, IrElementTransformerVoid() { class FlattenStringConcatenationLowering(val context: CommonBackendContext) : FileLoweringPass, IrElementTransformerVoid() {
companion object { companion object {
// There are two versions of String.plus in the library. One for nullable and one for non-nullable strings.
// The version for nullable strings has FqName kotlin.plus, the version for non-nullable strings
// is a member function of kotlin.String (with FqName kotlin.String.plus)
private val PARENT_NAMES = setOf(
KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME,
KotlinBuiltIns.FQ_NAMES.string.toSafe()
)
private val PLUS_NAME = Name.identifier("plus") private val PLUS_NAME = Name.identifier("plus")
/** @return true if the given expression is a [IrStringConcatenation] or [String.plus] [IrCall]. */ /** @return true if the given expression is a [IrStringConcatenation] or [String.plus] [IrCall]. */
@@ -79,10 +86,10 @@ class FlattenStringConcatenationLowering(val context: CommonBackendContext) : Fi
val receiver = expression.dispatchReceiver ?: expression.extensionReceiver val receiver = expression.dispatchReceiver ?: expression.extensionReceiver
receiver != null && receiver != null &&
receiver.type.isStringClassType() && receiver.type.isStringClassType() &&
function.getPackageFragment()?.fqName == KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME &&
function.name == PLUS_NAME &&
expression.type.isStringClassType() && expression.type.isStringClassType() &&
expression.valueArgumentsCount == 1 expression.valueArgumentsCount == 1 &&
function.name == PLUS_NAME &&
function.parent.fqNameSafe in PARENT_NAMES
} }
else -> false else -> false
} }