FIR/LC: use DataClassResolver when determining componentN/copy
This commit is contained in:
committed by
Ilya Kirillov
parent
ac53166960
commit
5af24dc6ce
+2
-13
@@ -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
|
||||
|
||||
|
||||
+3
-2
@@ -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 ->
|
||||
|
||||
+2
-22
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user