[FIR2IR] Use proper lookup tags in data class member generator
This commit is contained in:
+3
-3
@@ -125,14 +125,14 @@ internal class ClassMemberGenerator(
|
||||
irFunction.body = IrSyntheticBodyImpl(startOffset, endOffset, kind)
|
||||
}
|
||||
irFunction.parent is IrClass && irFunction.parentAsClass.isData -> {
|
||||
val classId = firFunction?.symbol?.dispatchReceiverClassOrNull()?.classId
|
||||
val lookupTag = firFunction?.symbol?.dispatchReceiverClassOrNull()
|
||||
when {
|
||||
DataClassMembersGenerator.isComponentN(irFunction) ->
|
||||
firFunction?.body?.let { irFunction.body = visitor.convertToIrBlockBody(it) }
|
||||
?: DataClassMembersGenerator(components).generateDataClassComponentBody(irFunction, classId!!)
|
||||
?: DataClassMembersGenerator(components).generateDataClassComponentBody(irFunction, lookupTag!!)
|
||||
DataClassMembersGenerator.isCopy(irFunction) ->
|
||||
firFunction?.body?.let { irFunction.body = visitor.convertToIrBlockBody(it) }
|
||||
?: DataClassMembersGenerator(components).generateDataClassCopyBody(irFunction, classId!!)
|
||||
?: DataClassMembersGenerator(components).generateDataClassCopyBody(irFunction, lookupTag!!)
|
||||
else ->
|
||||
irFunction.body = firFunction?.body?.let { visitor.convertToIrBlockBody(it) }
|
||||
}
|
||||
|
||||
+18
-14
@@ -16,7 +16,9 @@ import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
|
||||
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.types.ConeStarProjection
|
||||
@@ -50,20 +52,24 @@ import org.jetbrains.kotlin.name.Name
|
||||
class DataClassMembersGenerator(val components: Fir2IrComponents) {
|
||||
|
||||
fun generateInlineClassMembers(klass: FirClass<*>, irClass: IrClass): List<FirDeclaration> =
|
||||
MyDataClassMethodsGenerator(irClass, klass.symbol.classId, IrDeclarationOrigin.GENERATED_INLINE_CLASS_MEMBER).generate(klass)
|
||||
MyDataClassMethodsGenerator(irClass, klass.symbol.toLookupTag(), IrDeclarationOrigin.GENERATED_INLINE_CLASS_MEMBER).generate(klass)
|
||||
|
||||
fun generateDataClassMembers(klass: FirClass<*>, irClass: IrClass): List<FirDeclaration> =
|
||||
MyDataClassMethodsGenerator(irClass, klass.symbol.classId, IrDeclarationOrigin.GENERATED_DATA_CLASS_MEMBER).generate(klass)
|
||||
MyDataClassMethodsGenerator(irClass, klass.symbol.toLookupTag(), IrDeclarationOrigin.GENERATED_DATA_CLASS_MEMBER).generate(klass)
|
||||
|
||||
fun generateDataClassComponentBody(irFunction: IrFunction, classId: ClassId) =
|
||||
MyDataClassMethodsGenerator(irFunction.parentAsClass, classId, IrDeclarationOrigin.GENERATED_DATA_CLASS_MEMBER)
|
||||
fun generateDataClassComponentBody(irFunction: IrFunction, lookupTag: ConeClassLikeLookupTag) =
|
||||
MyDataClassMethodsGenerator(irFunction.parentAsClass, lookupTag, IrDeclarationOrigin.GENERATED_DATA_CLASS_MEMBER)
|
||||
.generateComponentBody(irFunction)
|
||||
|
||||
fun generateDataClassCopyBody(irFunction: IrFunction, classId: ClassId) =
|
||||
MyDataClassMethodsGenerator(irFunction.parentAsClass, classId, IrDeclarationOrigin.GENERATED_DATA_CLASS_MEMBER)
|
||||
fun generateDataClassCopyBody(irFunction: IrFunction, lookupTag: ConeClassLikeLookupTag) =
|
||||
MyDataClassMethodsGenerator(irFunction.parentAsClass, lookupTag, IrDeclarationOrigin.GENERATED_DATA_CLASS_MEMBER)
|
||||
.generateCopyBody(irFunction)
|
||||
|
||||
private inner class MyDataClassMethodsGenerator(val irClass: IrClass, val classId: ClassId, val origin: IrDeclarationOrigin) {
|
||||
private inner class MyDataClassMethodsGenerator(
|
||||
val irClass: IrClass,
|
||||
val lookupTag: ConeClassLikeLookupTag,
|
||||
val origin: IrDeclarationOrigin
|
||||
) {
|
||||
private val irDataClassMembersGenerator = object : DataClassMembersGenerator(
|
||||
IrGeneratorContextBase(components.irBuiltIns),
|
||||
components.symbolTable,
|
||||
@@ -226,7 +232,7 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) {
|
||||
val firFunction = buildSimpleFunction {
|
||||
origin = FirDeclarationOrigin.Synthetic
|
||||
this.name = name
|
||||
this.symbol = FirNamedFunctionSymbol(CallableId(classId, name))
|
||||
this.symbol = FirNamedFunctionSymbol(CallableId(lookupTag.classId, name))
|
||||
this.status = FirDeclarationStatusImpl(Visibilities.Public, Modality.FINAL)
|
||||
this.session = components.session
|
||||
this.returnTypeRef = when (returnType) {
|
||||
@@ -249,13 +255,11 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) {
|
||||
}
|
||||
)
|
||||
}
|
||||
dispatchReceiverType =
|
||||
ConeClassLikeLookupTagImpl(classId)
|
||||
.constructType(
|
||||
(1..irClass.typeParameters.size).map { ConeStarProjection }.toTypedArray(), isNullable = false
|
||||
)
|
||||
dispatchReceiverType = lookupTag.constructType(
|
||||
(1..irClass.typeParameters.size).map { ConeStarProjection }.toTypedArray(), isNullable = false
|
||||
)
|
||||
}
|
||||
val signature = if (classId.isLocal) null else components.signatureComposer.composeSignature(firFunction)
|
||||
val signature = if (lookupTag.classId.isLocal) null else components.signatureComposer.composeSignature(firFunction)
|
||||
return components.declarationStorage.declareIrSimpleFunction(signature, null) { symbol ->
|
||||
components.irFactory.createFunction(
|
||||
UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, symbol, name, DescriptorVisibilities.PUBLIC, Modality.OPEN, returnType,
|
||||
|
||||
Reference in New Issue
Block a user