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

This commit is contained in:
Mikhail Glukhikh
2020-11-11 09:38:43 +03:00
parent 7905bc8632
commit af52232058
2 changed files with 21 additions and 17 deletions
@@ -125,14 +125,14 @@ internal class ClassMemberGenerator(
irFunction.body = IrSyntheticBodyImpl(startOffset, endOffset, kind) irFunction.body = IrSyntheticBodyImpl(startOffset, endOffset, kind)
} }
irFunction.parent is IrClass && irFunction.parentAsClass.isData -> { irFunction.parent is IrClass && irFunction.parentAsClass.isData -> {
val classId = firFunction?.symbol?.dispatchReceiverClassOrNull()?.classId val lookupTag = firFunction?.symbol?.dispatchReceiverClassOrNull()
when { when {
DataClassMembersGenerator.isComponentN(irFunction) -> DataClassMembersGenerator.isComponentN(irFunction) ->
firFunction?.body?.let { irFunction.body = visitor.convertToIrBlockBody(it) } firFunction?.body?.let { irFunction.body = visitor.convertToIrBlockBody(it) }
?: DataClassMembersGenerator(components).generateDataClassComponentBody(irFunction, classId!!) ?: DataClassMembersGenerator(components).generateDataClassComponentBody(irFunction, lookupTag!!)
DataClassMembersGenerator.isCopy(irFunction) -> DataClassMembersGenerator.isCopy(irFunction) ->
firFunction?.body?.let { irFunction.body = visitor.convertToIrBlockBody(it) } firFunction?.body?.let { irFunction.body = visitor.convertToIrBlockBody(it) }
?: DataClassMembersGenerator(components).generateDataClassCopyBody(irFunction, classId!!) ?: DataClassMembersGenerator(components).generateDataClassCopyBody(irFunction, lookupTag!!)
else -> else ->
irFunction.body = firFunction?.body?.let { visitor.convertToIrBlockBody(it) } 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.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
import org.jetbrains.kotlin.fir.symbols.CallableId 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.ConeClassLikeLookupTagImpl
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.types.ConeStarProjection import org.jetbrains.kotlin.fir.types.ConeStarProjection
@@ -50,20 +52,24 @@ import org.jetbrains.kotlin.name.Name
class DataClassMembersGenerator(val components: Fir2IrComponents) { class DataClassMembersGenerator(val components: Fir2IrComponents) {
fun generateInlineClassMembers(klass: FirClass<*>, irClass: IrClass): List<FirDeclaration> = 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> = 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) = fun generateDataClassComponentBody(irFunction: IrFunction, lookupTag: ConeClassLikeLookupTag) =
MyDataClassMethodsGenerator(irFunction.parentAsClass, classId, IrDeclarationOrigin.GENERATED_DATA_CLASS_MEMBER) MyDataClassMethodsGenerator(irFunction.parentAsClass, lookupTag, IrDeclarationOrigin.GENERATED_DATA_CLASS_MEMBER)
.generateComponentBody(irFunction) .generateComponentBody(irFunction)
fun generateDataClassCopyBody(irFunction: IrFunction, classId: ClassId) = fun generateDataClassCopyBody(irFunction: IrFunction, lookupTag: ConeClassLikeLookupTag) =
MyDataClassMethodsGenerator(irFunction.parentAsClass, classId, IrDeclarationOrigin.GENERATED_DATA_CLASS_MEMBER) MyDataClassMethodsGenerator(irFunction.parentAsClass, lookupTag, IrDeclarationOrigin.GENERATED_DATA_CLASS_MEMBER)
.generateCopyBody(irFunction) .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( private val irDataClassMembersGenerator = object : DataClassMembersGenerator(
IrGeneratorContextBase(components.irBuiltIns), IrGeneratorContextBase(components.irBuiltIns),
components.symbolTable, components.symbolTable,
@@ -226,7 +232,7 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) {
val firFunction = buildSimpleFunction { val firFunction = buildSimpleFunction {
origin = FirDeclarationOrigin.Synthetic origin = FirDeclarationOrigin.Synthetic
this.name = name this.name = name
this.symbol = FirNamedFunctionSymbol(CallableId(classId, name)) this.symbol = FirNamedFunctionSymbol(CallableId(lookupTag.classId, name))
this.status = FirDeclarationStatusImpl(Visibilities.Public, Modality.FINAL) this.status = FirDeclarationStatusImpl(Visibilities.Public, Modality.FINAL)
this.session = components.session this.session = components.session
this.returnTypeRef = when (returnType) { this.returnTypeRef = when (returnType) {
@@ -249,13 +255,11 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) {
} }
) )
} }
dispatchReceiverType = dispatchReceiverType = lookupTag.constructType(
ConeClassLikeLookupTagImpl(classId) (1..irClass.typeParameters.size).map { ConeStarProjection }.toTypedArray(), isNullable = false
.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 -> return components.declarationStorage.declareIrSimpleFunction(signature, null) { symbol ->
components.irFactory.createFunction( components.irFactory.createFunction(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, symbol, name, DescriptorVisibilities.PUBLIC, Modality.OPEN, returnType, UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, symbol, name, DescriptorVisibilities.PUBLIC, Modality.OPEN, returnType,