提交 af522320 编写于 作者: M Mikhail Glukhikh

[FIR2IR] Use proper lookup tags in data class member generator

上级 7905bc86
......@@ -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) }
}
......
......@@ -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,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册