[Psi2Ir, Fir2Ir] Generate toString, hashCode, equals methods for MF VC

This commit is contained in:
Evgeniy.Zhelenskiy
2021-12-31 02:27:17 +03:00
committed by Space
parent c7edc353d3
commit e97ca2ada4
91 changed files with 465 additions and 426 deletions
@@ -139,62 +139,62 @@ internal class EnumSpecialDeclarationsFactory(val context: Context) {
val endOffset = enumClass.endOffset
val implObject =
IrClassImpl(
startOffset, endOffset,
DECLARATION_ORIGIN_ENUM,
IrClassSymbolImpl(),
"OBJECT".synthesizedName,
ClassKind.OBJECT,
DescriptorVisibilities.PUBLIC,
Modality.FINAL,
isCompanion = false,
isInner = false,
isData = false,
isExternal = false,
isInline = false,
isExpect = false,
isFun = false
).apply {
parent = enumClass
createParameterDeclarations()
}
IrClassImpl(
startOffset, endOffset,
DECLARATION_ORIGIN_ENUM,
IrClassSymbolImpl(),
"OBJECT".synthesizedName,
ClassKind.OBJECT,
DescriptorVisibilities.PUBLIC,
Modality.FINAL,
isCompanion = false,
isInner = false,
isData = false,
isExternal = false,
isValue = false,
isExpect = false,
isFun = false
).apply {
parent = enumClass
createParameterDeclarations()
}
val valuesType = valuesArrayType(enumClass)
val valuesField =
IrFieldImpl(
startOffset, endOffset,
DECLARATION_ORIGIN_ENUM,
IrFieldSymbolImpl(),
"VALUES".synthesizedName,
valuesType,
DescriptorVisibilities.PRIVATE,
isFinal = true,
isExternal = false,
isStatic = false,
).apply {
parent = implObject
}
IrFieldImpl(
startOffset, endOffset,
DECLARATION_ORIGIN_ENUM,
IrFieldSymbolImpl(),
"VALUES".synthesizedName,
valuesType,
DescriptorVisibilities.PRIVATE,
isFinal = true,
isExternal = false,
isStatic = false,
).apply {
parent = implObject
}
val valuesGetter =
IrFunctionImpl(
startOffset, endOffset,
DECLARATION_ORIGIN_ENUM,
IrSimpleFunctionSymbolImpl(),
"get-VALUES".synthesizedName,
DescriptorVisibilities.PUBLIC,
Modality.FINAL,
valuesType,
isInline = false,
isExternal = false,
isTailrec = false,
isSuspend = false,
isExpect = false,
isFakeOverride = false,
isOperator = false,
isInfix = false
).apply {
parent = implObject
}
IrFunctionImpl(
startOffset, endOffset,
DECLARATION_ORIGIN_ENUM,
IrSimpleFunctionSymbolImpl(),
"get-VALUES".synthesizedName,
DescriptorVisibilities.PUBLIC,
Modality.FINAL,
valuesType,
isInline = false,
isExternal = false,
isTailrec = false,
isSuspend = false,
isExpect = false,
isFakeOverride = false,
isOperator = false,
isInfix = false
).apply {
parent = implObject
}
val constructorOfAny = context.irBuiltIns.anyClass.owner.constructors.first()
implObject.addSimpleDelegatingConstructor(
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrProperty
import org.jetbrains.kotlin.ir.declarations.isSingleFieldValueClass
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
import org.jetbrains.kotlin.ir.types.IrType
@@ -293,7 +294,7 @@ internal object IrTypeInlineClassesSupport : InlineClassesSupport<IrClass, IrTyp
}
}
override fun hasInlineModifier(clazz: IrClass): Boolean = clazz.isInline
override fun hasInlineModifier(clazz: IrClass): Boolean = clazz.isSingleFieldValueClass
override fun getNativePointedSuperclass(clazz: IrClass): IrClass? {
var superClass: IrClass? = clazz
@@ -9,7 +9,10 @@ import org.jetbrains.kotlin.backend.common.lower.irNot
import org.jetbrains.kotlin.backend.konan.PrimitiveBinaryType
import org.jetbrains.kotlin.backend.konan.RuntimeNames
import org.jetbrains.kotlin.backend.konan.getObjCMethodInfo
import org.jetbrains.kotlin.backend.konan.ir.*
import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols
import org.jetbrains.kotlin.backend.konan.ir.buildSimpleAnnotation
import org.jetbrains.kotlin.backend.konan.ir.getAnnotationArgumentValue
import org.jetbrains.kotlin.backend.konan.ir.konanLibrary
import org.jetbrains.kotlin.backend.konan.isObjCMetaClass
import org.jetbrains.kotlin.backend.konan.lower.FunctionReferenceLowering
import org.jetbrains.kotlin.descriptors.ClassKind
@@ -1106,7 +1109,7 @@ private class ObjCBlockPointerValuePassing(
Name.identifier(stubs.getUniqueKotlinFunctionReferenceClassName("BlockFunctionImpl")),
ClassKind.CLASS, DescriptorVisibilities.PRIVATE, Modality.FINAL,
isCompanion = false, isInner = false, isData = false, isExternal = false,
isInline = false, isExpect = false, isFun = false
isValue = false, isExpect = false, isFun = false
)
irClass.createParameterDeclarations()
@@ -7,8 +7,10 @@ package org.jetbrains.kotlin.backend.konan.ir
import org.jetbrains.kotlin.backend.common.ir.copyTo
import org.jetbrains.kotlin.backend.common.ir.createDispatchReceiverParameter
import org.jetbrains.kotlin.backend.konan.*
import org.jetbrains.kotlin.backend.konan.BinaryType
import org.jetbrains.kotlin.backend.konan.KonanBackendContext
import org.jetbrains.kotlin.backend.konan.KonanFqNames
import org.jetbrains.kotlin.backend.konan.computeBinaryType
import org.jetbrains.kotlin.backend.konan.descriptors.getAnnotationStringValue
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.descriptors.Modality
@@ -16,10 +18,13 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.declarations.addMember
import org.jetbrains.kotlin.ir.declarations.isSingleFieldValueClass
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
import org.jetbrains.kotlin.ir.types.defaultType
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
import org.jetbrains.kotlin.ir.util.functions
import org.jetbrains.kotlin.ir.util.isAnnotationWithEqualFqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.util.OperatorNameConventions
@@ -64,7 +69,7 @@ internal class FunctionsWithoutBoundCheckGenerator(val context: KonanBackendCont
fun generate() {
symbols.arrays.forEach { classSymbol ->
val underlyingClass = (classSymbol.defaultType.computeBinaryType() as BinaryType.Reference)
.types.single().takeIf { classSymbol.owner.isInline }
.types.single().takeIf { classSymbol.owner.isSingleFieldValueClass }
val setFunction = classSymbol.owner.functions.single { it.name == OperatorNameConventions.SET }
val setDelegatingToFunction = underlyingClass?.functions?.single { it.name == OperatorNameConventions.SET }
classSymbol.owner.addMember(generateFunction(setFunction, setDelegatingToFunction, KonanNameConventions.setWithoutBoundCheck))
@@ -13,21 +13,19 @@ import org.jetbrains.kotlin.backend.common.lower.at
import org.jetbrains.kotlin.backend.common.lower.irNot
import org.jetbrains.kotlin.backend.konan.*
import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.isSingleFieldValueClass
import org.jetbrains.kotlin.ir.descriptors.IrBuiltinOperatorDescriptor
import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrTypeOperatorCall
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.builders.irGet
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.util.defaultOrNullableType
import org.jetbrains.kotlin.ir.util.isNullConst
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
/**
@@ -125,7 +123,7 @@ internal class BuiltinOperatorLowering(val context: Context) : FileLoweringPass,
}
private fun inlinedClassHasDefaultEquals(irClass: IrClass): Boolean {
if (!irClass.isInline) {
if (!irClass.isSingleFieldValueClass) {
// Implicitly-inlined class, e.g. primitive one.
return true
}
@@ -133,7 +131,7 @@ internal class BuiltinOperatorLowering(val context: Context) : FileLoweringPass,
val equals = irClass.simpleFunctions()
.single { it.name.asString() == "equals" && it.valueParameters.size == 1 && it.overrides(anyEquals) }
return equals.origin == IrDeclarationOrigin.GENERATED_INLINE_CLASS_MEMBER
return equals.origin == IrDeclarationOrigin.GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER
}
fun IrBuilderWithScope.genInlineClassEquals(
@@ -14,7 +14,9 @@ import org.jetbrains.kotlin.backend.common.push
import org.jetbrains.kotlin.backend.konan.Context
import org.jetbrains.kotlin.backend.konan.descriptors.synthesizedName
import org.jetbrains.kotlin.backend.konan.llvm.computeFullName
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.builders.*
@@ -35,7 +37,7 @@ import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
internal class FunctionReferenceLowering(val context: Context): FileLoweringPass {
internal class FunctionReferenceLowering(val context: Context) : FileLoweringPass {
private object DECLARATION_ORIGIN_FUNCTION_REFERENCE_IMPL : IrDeclarationOriginImpl("FUNCTION_REFERENCE_IMPL")
@@ -46,7 +48,7 @@ internal class FunctionReferenceLowering(val context: Context): FileLoweringPass
override fun lower(irFile: IrFile) {
var generatedClasses = mutableListOf<IrClass>()
irFile.transform(object: IrElementTransformerVoidWithContext() {
irFile.transform(object : IrElementTransformerVoidWithContext() {
private val stack = mutableListOf<IrElement>()
@@ -167,6 +169,7 @@ internal class FunctionReferenceLowering(val context: Context): FileLoweringPass
val samSuperType: IrType? = null,
) {
data class BuiltFunctionReference(val functionReferenceClass: IrClass, val functionReferenceExpression: IrExpression)
private val irBuiltIns = context.irBuiltIns
private val symbols = context.ir.symbols
private val getContinuationSymbol = symbols.getContinuation
@@ -193,28 +196,28 @@ internal class FunctionReferenceLowering(val context: Context): FileLoweringPass
private val functionReferenceTarget = adaptedReferenceOriginalTarget ?: referencedFunction
private val functionReferenceClass: IrClass =
IrClassImpl(
startOffset,endOffset,
DECLARATION_ORIGIN_FUNCTION_REFERENCE_IMPL,
IrClassSymbolImpl(),
"${functionReferenceTarget.name}\$FUNCTION_REFERENCE\$${context.functionReferenceCount++}".synthesizedName,
ClassKind.CLASS,
DescriptorVisibilities.PRIVATE,
Modality.FINAL,
isCompanion = false,
isInner = false,
isData = false,
isExternal = false,
isInline = false,
isExpect = false,
isFun = false
).apply {
parent = this@FunctionReferenceBuilder.parent
createParameterDeclarations()
IrClassImpl(
startOffset, endOffset,
DECLARATION_ORIGIN_FUNCTION_REFERENCE_IMPL,
IrClassSymbolImpl(),
"${functionReferenceTarget.name}\$FUNCTION_REFERENCE\$${context.functionReferenceCount++}".synthesizedName,
ClassKind.CLASS,
DescriptorVisibilities.PRIVATE,
Modality.FINAL,
isCompanion = false,
isInner = false,
isData = false,
isExternal = false,
isValue = false,
isExpect = false,
isFun = false
).apply {
parent = this@FunctionReferenceBuilder.parent
createParameterDeclarations()
// copy the generated name for IrClass, partially solves KT-47194
context.copyLocalClassName(functionReference, this)
}
// copy the generated name for IrClass, partially solves KT-47194
context.copyLocalClassName(functionReference, this)
}
private val functionReferenceThis = functionReferenceClass.thisReceiver!!
@@ -7,13 +7,16 @@ package org.jetbrains.kotlin.backend.konan.lower
import org.jetbrains.kotlin.backend.common.FileLoweringPass
import org.jetbrains.kotlin.backend.common.lower.*
import org.jetbrains.kotlin.backend.konan.*
import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.visitors.*
import org.jetbrains.kotlin.backend.common.lower.IrBuildingTransformer
import org.jetbrains.kotlin.backend.common.lower.at
import org.jetbrains.kotlin.backend.konan.Context
import org.jetbrains.kotlin.ir.builders.irCall
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.isSingleFieldValueClass
import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
/**
@@ -39,7 +42,7 @@ private class InlineClassAccessorsTransformer(private val context: Context) : Ir
val property = expression.symbol.owner.correspondingPropertySymbol?.owner ?: return expression
property.parent.let {
if (it is IrClass && it.isInline && property.backingField != null) {
if (it is IrClass && it.isSingleFieldValueClass && property.backingField != null) {
expression.dispatchReceiver?.let { receiver ->
return builder.at(expression)
.irCall(symbols.reinterpret, expression.type, listOf(receiver.type, expression.type))
@@ -491,7 +491,7 @@ internal class TestProcessor (val context: Context) {
isInner = false,
isData = false,
isExternal = false,
isInline = false,
isValue = false,
isExpect = false,
isFun = false
).apply {