KAPT+IR: Support data classes
This commit is contained in:
@@ -421,15 +421,15 @@ class ClassGenerator(
|
||||
}
|
||||
|
||||
private fun generateAdditionalMembersForSingleFieldValueClasses(irClass: IrClass, ktClassOrObject: KtClassOrObject) {
|
||||
DataClassMembersGenerator(declarationGenerator).generateSingleFieldValueClassMembers(ktClassOrObject, irClass)
|
||||
DataClassMembersGenerator(declarationGenerator, context.configuration.generateBodies).generateSingleFieldValueClassMembers(ktClassOrObject, irClass)
|
||||
}
|
||||
|
||||
private fun generateAdditionalMembersForMultiFieldValueClasses(irClass: IrClass, ktClassOrObject: KtClassOrObject) {
|
||||
DataClassMembersGenerator(declarationGenerator).generateMultiFieldValueClassMembers(ktClassOrObject, irClass)
|
||||
DataClassMembersGenerator(declarationGenerator, context.configuration.generateBodies).generateMultiFieldValueClassMembers(ktClassOrObject, irClass)
|
||||
}
|
||||
|
||||
private fun generateAdditionalMembersForDataClass(irClass: IrClass, ktClassOrObject: KtClassOrObject) {
|
||||
DataClassMembersGenerator(declarationGenerator).generateDataClassMembers(ktClassOrObject, irClass)
|
||||
DataClassMembersGenerator(declarationGenerator, context.configuration.generateBodies).generateDataClassMembers(ktClassOrObject, irClass)
|
||||
}
|
||||
|
||||
private fun generateAdditionalMembersForEnumClass(irClass: IrClass) {
|
||||
|
||||
+4
-2
@@ -42,7 +42,8 @@ import org.jetbrains.kotlin.types.typeUtil.representativeUpperBound
|
||||
* function bodies; and provides ways to declare functions or parameters based on descriptors and binding context.
|
||||
*/
|
||||
class DataClassMembersGenerator(
|
||||
declarationGenerator: DeclarationGenerator
|
||||
declarationGenerator: DeclarationGenerator,
|
||||
private val generateBodies: Boolean
|
||||
) : DeclarationGeneratorExtension(declarationGenerator) {
|
||||
|
||||
fun generateSingleFieldValueClassMembers(ktClassOrObject: KtClassOrObject, irClass: IrClass) {
|
||||
@@ -73,7 +74,8 @@ class DataClassMembersGenerator(
|
||||
val origin: IrDeclarationOrigin
|
||||
) : DataClassMethodGenerator(ktClassOrObject, declarationGenerator.context.bindingContext) {
|
||||
|
||||
private val irDataClassMembersGenerator = object : DataClassMembersGenerator(context, context.symbolTable, irClass, origin) {
|
||||
private val irDataClassMembersGenerator =
|
||||
object : DataClassMembersGenerator(context, context.symbolTable, irClass, origin, generateBodies = generateBodies) {
|
||||
override fun declareSimpleFunction(startOffset: Int, endOffset: Int, functionDescriptor: FunctionDescriptor): IrFunction =
|
||||
declareSimpleFunction(startOffset, endOffset, origin, functionDescriptor)
|
||||
|
||||
|
||||
@@ -33,7 +33,8 @@ abstract class DataClassMembersGenerator(
|
||||
val symbolTable: ReferenceSymbolTable,
|
||||
val irClass: IrClass,
|
||||
val origin: IrDeclarationOrigin,
|
||||
val forbidDirectFieldAccess: Boolean = false
|
||||
val forbidDirectFieldAccess: Boolean = false,
|
||||
val generateBodies: Boolean = false
|
||||
) {
|
||||
private val irPropertiesByDescriptor: Map<PropertyDescriptor, IrProperty> =
|
||||
irClass.properties.associateBy { it.descriptor }
|
||||
@@ -300,10 +301,12 @@ abstract class DataClassMembersGenerator(
|
||||
// Entry for psi2ir
|
||||
fun generateCopyFunction(function: FunctionDescriptor, constructorSymbol: IrConstructorSymbol) {
|
||||
buildMember(function) {
|
||||
function.valueParameters.forEach { parameter ->
|
||||
putDefault(parameter, irGetProperty(irThis(), getProperty(parameter, null)!!))
|
||||
if (generateBodies) {
|
||||
function.valueParameters.forEach { parameter ->
|
||||
putDefault(parameter, irGetProperty(irThis(), getProperty(parameter, null)!!))
|
||||
}
|
||||
generateCopyFunction(constructorSymbol)
|
||||
}
|
||||
generateCopyFunction(constructorSymbol)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user