JVM IR: do not use misleading names for callable reference classes

The real JVM name is invented in InventNamesForLocalClasses and will be
used by the codegen when generating the actual class
This commit is contained in:
Alexander Udalov
2019-06-25 18:21:32 +02:00
parent 29fa1793d3
commit 59ce76e9fd
2 changed files with 8 additions and 16 deletions
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.backend.jvm.lower
import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.FileLoweringPass
import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext
import org.jetbrains.kotlin.backend.common.descriptors.isFunctionOrKFunctionType import org.jetbrains.kotlin.backend.common.descriptors.isFunctionOrKFunctionType
import org.jetbrains.kotlin.backend.common.descriptors.synthesizedName
import org.jetbrains.kotlin.backend.common.ir.copyTo import org.jetbrains.kotlin.backend.common.ir.copyTo
import org.jetbrains.kotlin.backend.common.ir.createImplicitParameterDeclarationWithWrappedDescriptor import org.jetbrains.kotlin.backend.common.ir.createImplicitParameterDeclarationWithWrappedDescriptor
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
@@ -73,9 +72,6 @@ internal val callableReferencePhase = makeIrFilePhase(
//Originally was copied from K/Native //Originally was copied from K/Native
internal class CallableReferenceLowering(val context: JvmBackendContext) : FileLoweringPass { internal class CallableReferenceLowering(val context: JvmBackendContext) : FileLoweringPass {
private var functionReferenceCount = 0
private val inlineLambdaReferences = mutableSetOf<IrFunctionReference>() private val inlineLambdaReferences = mutableSetOf<IrFunctionReference>()
override fun lower(irFile: IrFile) { override fun lower(irFile: IrFile) {
@@ -194,7 +190,7 @@ internal class CallableReferenceLowering(val context: JvmBackendContext) : FileL
private val functionReferenceClass = buildClass { private val functionReferenceClass = buildClass {
setSourceRange(irFunctionReference) setSourceRange(irFunctionReference)
origin = JvmLoweredDeclarationOrigin.FUNCTION_REFERENCE_IMPL origin = JvmLoweredDeclarationOrigin.FUNCTION_REFERENCE_IMPL
name = "${callee.name.safeName()}\$${functionReferenceCount++}".synthesizedName name = Name.special("<function reference to ${callee.fqNameWhenAvailable}>")
}.apply { }.apply {
parent = referenceParent parent = referenceParent
superTypes += functionReferenceOrLambda.owner.defaultType superTypes += functionReferenceOrLambda.owner.defaultType
@@ -202,8 +198,12 @@ internal class CallableReferenceLowering(val context: JvmBackendContext) : FileL
copyAttributes(irFunctionReference) copyAttributes(irFunctionReference)
} }
private val argumentToFieldMap = boundCalleeParameters.associate { private val argumentToFieldMap = boundCalleeParameters.associateWith { parameter ->
it to buildField(it.name.safeName(), it.type) // TODO: do not store receivers to fields and get rid of this
val safeName = parameter.name.takeUnless(Name::isSpecial) ?: parameter.name.asString().let { name ->
Name.identifier("$${name.substring(1, name.length - 1)}")
}
buildField(safeName, parameter.type)
} }
fun build(): BuiltFunctionReference { fun build(): BuiltFunctionReference {
@@ -449,12 +449,4 @@ internal class CallableReferenceLowering(val context: JvmBackendContext) : FileL
} }
} }
} }
//TODO rewrite
private fun Name.safeName(): Name {
return if (isSpecial) {
val name = asString()
Name.identifier("$${name.substring(1, name.length - 1)}")
} else this
}
} }
@@ -270,7 +270,7 @@ internal class PropertyReferenceLowering(val context: JvmBackendContext) : Class
val superClass = propertyReferenceKindFor(expression).interfaceSymbol.owner val superClass = propertyReferenceKindFor(expression).interfaceSymbol.owner
val referenceClass = buildClass { val referenceClass = buildClass {
setSourceRange(expression) setSourceRange(expression)
name = Name.identifier("${expression.descriptor.name}\$${kPropertyClasses.size}") name = Name.special("<property reference to ${(expression.symbol.owner as IrDeclarationWithName).fqNameWhenAvailable}>")
origin = JvmLoweredDeclarationOrigin.GENERATED_PROPERTY_REFERENCE origin = JvmLoweredDeclarationOrigin.GENERATED_PROPERTY_REFERENCE
}.apply { }.apply {
parent = irClass parent = irClass