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.elements.KtLightField
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.descriptors.Visibility
import org.jetbrains.kotlin.light.classes.symbol.classes.*
import org.jetbrains.kotlin.load.java.JvmAbi
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.DataClassResolver
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind
import org.jetbrains.kotlin.util.OperatorNameConventions.EQUALS
import org.jetbrains.kotlin.util.OperatorNameConventions.TO_STRING
@@ -162,7 +162,7 @@ internal class FirLightClassForSymbol(
classOrObjectSymbol.getMemberScope().getCallableSymbols().forEach { symbol ->
if (symbol is KtFunctionSymbol) {
val name = symbol.name
if (name.isCopy || name.isComponentN) {
if (DataClassResolver.isCopy(name) || DataClassResolver.isComponentLike(name)) {
componentAndCopyFunctions.add(symbol)
}
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
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.isSetter
import org.jetbrains.kotlin.ir.util.parentAsClass
import org.jetbrains.kotlin.resolve.DataClassResolver
internal class ClassMemberGenerator(
private val components: Fir2IrComponents,
@@ -128,10 +129,10 @@ internal class ClassMemberGenerator(
irFunction.parent is IrClass && irFunction.parentAsClass.isData -> {
val lookupTag = firFunction?.symbol?.dispatchReceiverClassOrNull()
when {
DataClassMembersGenerator.isComponentN(irFunction) ->
DataClassResolver.isComponentLike(irFunction.name) ->
firFunction?.body?.let { irFunction.body = visitor.convertToIrBlockBody(it) }
?: DataClassMembersGenerator(components).generateDataClassComponentBody(irFunction, lookupTag!!)
DataClassMembersGenerator.isCopy(irFunction) ->
DataClassResolver.isCopy(irFunction.name) ->
firFunction?.body?.let { irFunction.body = visitor.convertToIrBlockBody(it) }
?: DataClassMembersGenerator(components).generateDataClassCopyBody(irFunction, lookupTag!!)
else ->
@@ -5,7 +5,6 @@
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.descriptors.*
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.name.CallableId
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.TO_STRING
@@ -246,7 +246,7 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) {
}
fun generateComponentBody(irFunction: IrFunction) {
val index = getComponentIndex(irFunction)!!
val index = DataClassResolver.getComponentIndex(irFunction.name.asString())
val valueParameter = irClass.primaryConstructor!!.valueParameters[index - 1]
val irProperty = irDataClassMembersGenerator.getProperty(null, valueParameter)!!
irDataClassMembersGenerator.generateComponentFunction(irFunction, irProperty)
@@ -327,24 +327,4 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) {
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
import org.jetbrains.kotlin.builtins.StandardNames.DATA_CLASS_COPY
import org.jetbrains.kotlin.name.Name
object DataClassResolver {
@@ -27,4 +28,6 @@ object DataClassResolver {
return true
}
}
fun isCopy(name: Name): Boolean = name == DATA_CLASS_COPY
}