FIR/LC: use DataClassResolver when determining componentN/copy

This commit is contained in:
Jinseong Jeon
2021-09-24 11:53:58 -07:00
committed by Ilya Kirillov
parent ac53166960
commit 5af24dc6ce
4 changed files with 11 additions and 38 deletions
@@ -15,12 +15,12 @@ import org.jetbrains.kotlin.asJava.classes.METHOD_INDEX_BASE
import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.asJava.elements.KtLightField import org.jetbrains.kotlin.asJava.elements.KtLightField
import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.asJava.elements.KtLightMethod
import org.jetbrains.kotlin.builtins.StandardNames.DATA_CLASS_COPY
import org.jetbrains.kotlin.builtins.StandardNames.HASHCODE_NAME import org.jetbrains.kotlin.builtins.StandardNames.HASHCODE_NAME
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.light.classes.symbol.classes.* import org.jetbrains.kotlin.light.classes.symbol.classes.*
import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.java.JvmAbi
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.DataClassResolver
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind
import org.jetbrains.kotlin.util.OperatorNameConventions.EQUALS import org.jetbrains.kotlin.util.OperatorNameConventions.EQUALS
import org.jetbrains.kotlin.util.OperatorNameConventions.TO_STRING import org.jetbrains.kotlin.util.OperatorNameConventions.TO_STRING
@@ -162,7 +162,7 @@ internal class FirLightClassForSymbol(
classOrObjectSymbol.getMemberScope().getCallableSymbols().forEach { symbol -> classOrObjectSymbol.getMemberScope().getCallableSymbols().forEach { symbol ->
if (symbol is KtFunctionSymbol) { if (symbol is KtFunctionSymbol) {
val name = symbol.name val name = symbol.name
if (name.isCopy || name.isComponentN) { if (DataClassResolver.isCopy(name) || DataClassResolver.isComponentLike(name)) {
componentAndCopyFunctions.add(symbol) componentAndCopyFunctions.add(symbol)
} }
if (name.isFromAny) { if (name.isFromAny) {
@@ -178,17 +178,6 @@ internal class FirLightClassForSymbol(
} }
} }
private val Name.isCopy: Boolean
get() = this == DATA_CLASS_COPY
private val Name.isComponentN: Boolean
get() {
if (isSpecial) return false
if (!identifier.startsWith("component")) return false
val n = identifier.substring("component".length).toIntOrNull()
return n != null && n > 0
}
private val Name.isFromAny: Boolean private val Name.isFromAny: Boolean
get() = this == EQUALS || this == HASHCODE_NAME || this == TO_STRING get() = this == EQUALS || this == HASHCODE_NAME || this == TO_STRING
@@ -31,6 +31,7 @@ import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.constructedClassType import org.jetbrains.kotlin.ir.util.constructedClassType
import org.jetbrains.kotlin.ir.util.isSetter import org.jetbrains.kotlin.ir.util.isSetter
import org.jetbrains.kotlin.ir.util.parentAsClass import org.jetbrains.kotlin.ir.util.parentAsClass
import org.jetbrains.kotlin.resolve.DataClassResolver
internal class ClassMemberGenerator( internal class ClassMemberGenerator(
private val components: Fir2IrComponents, private val components: Fir2IrComponents,
@@ -128,10 +129,10 @@ internal class ClassMemberGenerator(
irFunction.parent is IrClass && irFunction.parentAsClass.isData -> { irFunction.parent is IrClass && irFunction.parentAsClass.isData -> {
val lookupTag = firFunction?.symbol?.dispatchReceiverClassOrNull() val lookupTag = firFunction?.symbol?.dispatchReceiverClassOrNull()
when { when {
DataClassMembersGenerator.isComponentN(irFunction) -> DataClassResolver.isComponentLike(irFunction.name) ->
firFunction?.body?.let { irFunction.body = visitor.convertToIrBlockBody(it) } firFunction?.body?.let { irFunction.body = visitor.convertToIrBlockBody(it) }
?: DataClassMembersGenerator(components).generateDataClassComponentBody(irFunction, lookupTag!!) ?: DataClassMembersGenerator(components).generateDataClassComponentBody(irFunction, lookupTag!!)
DataClassMembersGenerator.isCopy(irFunction) -> DataClassResolver.isCopy(irFunction.name) ->
firFunction?.body?.let { irFunction.body = visitor.convertToIrBlockBody(it) } firFunction?.body?.let { irFunction.body = visitor.convertToIrBlockBody(it) }
?: DataClassMembersGenerator(components).generateDataClassCopyBody(irFunction, lookupTag!!) ?: DataClassMembersGenerator(components).generateDataClassCopyBody(irFunction, lookupTag!!)
else -> else ->
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.fir.backend.generators package org.jetbrains.kotlin.fir.backend.generators
import org.jetbrains.kotlin.builtins.StandardNames.DATA_CLASS_COPY
import org.jetbrains.kotlin.builtins.StandardNames.HASHCODE_NAME import org.jetbrains.kotlin.builtins.StandardNames.HASHCODE_NAME
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
@@ -46,6 +45,7 @@ import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.util.DataClassMembersGenerator import org.jetbrains.kotlin.ir.util.DataClassMembersGenerator
import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.DataClassResolver
import org.jetbrains.kotlin.util.OperatorNameConventions.EQUALS import org.jetbrains.kotlin.util.OperatorNameConventions.EQUALS
import org.jetbrains.kotlin.util.OperatorNameConventions.TO_STRING import org.jetbrains.kotlin.util.OperatorNameConventions.TO_STRING
@@ -246,7 +246,7 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) {
} }
fun generateComponentBody(irFunction: IrFunction) { fun generateComponentBody(irFunction: IrFunction) {
val index = getComponentIndex(irFunction)!! val index = DataClassResolver.getComponentIndex(irFunction.name.asString())
val valueParameter = irClass.primaryConstructor!!.valueParameters[index - 1] val valueParameter = irClass.primaryConstructor!!.valueParameters[index - 1]
val irProperty = irDataClassMembersGenerator.getProperty(null, valueParameter)!! val irProperty = irDataClassMembersGenerator.getProperty(null, valueParameter)!!
irDataClassMembersGenerator.generateComponentFunction(irFunction, irProperty) irDataClassMembersGenerator.generateComponentFunction(irFunction, irProperty)
@@ -327,24 +327,4 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) {
parent = irFunction parent = irFunction
} }
} }
companion object {
fun isCopy(irFunction: IrFunction): Boolean =
irFunction.name == DATA_CLASS_COPY
fun isComponentN(irFunction: IrFunction): Boolean {
if (irFunction.name.isSpecial) {
return false
}
val name = irFunction.name.identifier
if (!name.startsWith("component")) {
return false
}
val n = getComponentIndex(irFunction)
return n != null && n > 0
}
fun getComponentIndex(irFunction: IrFunction): Int? =
irFunction.name.identifier.substring("component".length).toIntOrNull()
}
} }
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.resolve package org.jetbrains.kotlin.resolve
import org.jetbrains.kotlin.builtins.StandardNames.DATA_CLASS_COPY
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
object DataClassResolver { object DataClassResolver {
@@ -27,4 +28,6 @@ object DataClassResolver {
return true return true
} }
}
fun isCopy(name: Name): Boolean = name == DATA_CLASS_COPY
}