[Psi2Ir, Fir2Ir] Generate toString, hashCode, equals methods for MF VC
This commit is contained in:
committed by
Space
parent
c7edc353d3
commit
e97ca2ada4
+5
-2
@@ -15,7 +15,10 @@ import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.*
|
||||
import org.jetbrains.kotlin.fir.declarations.comparators.FirMemberDeclarationComparator
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.*
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.addDeclarations
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isCompanion
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.moduleName
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.sourceElement
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag
|
||||
@@ -65,7 +68,7 @@ fun deserializeClassToSymbol(
|
||||
isCompanion = kind == ProtoBuf.Class.Kind.COMPANION_OBJECT
|
||||
isInner = Flags.IS_INNER.get(flags)
|
||||
isData = Flags.IS_DATA.get(classProto.flags)
|
||||
isInline = Flags.IS_INLINE_CLASS.get(classProto.flags)
|
||||
isInline = Flags.IS_VALUE_CLASS.get(classProto.flags)
|
||||
isExternal = Flags.IS_EXTERNAL_CLASS.get(classProto.flags)
|
||||
isFun = Flags.IS_FUN_INTERFACE.get(classProto.flags)
|
||||
}
|
||||
|
||||
@@ -287,7 +287,7 @@ class Fir2IrClassifierStorage(
|
||||
isInner = regularClass.isInner,
|
||||
isData = regularClass.isData,
|
||||
isExternal = regularClass.isExternal,
|
||||
isInline = regularClass.isInline && regularClass.primaryConstructorIfAny(session)?.valueParameterSymbols?.size == 1,
|
||||
isValue = regularClass.isInline,
|
||||
isExpect = regularClass.isExpect,
|
||||
isFun = regularClass.isFun
|
||||
).apply {
|
||||
|
||||
@@ -18,7 +18,6 @@ import org.jetbrains.kotlin.fir.backend.generators.DataClassMembersGenerator
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isLocal
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isSynthetic
|
||||
import org.jetbrains.kotlin.fir.declarations.primaryConstructorIfAny
|
||||
import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor
|
||||
import org.jetbrains.kotlin.fir.extensions.declarationGenerators
|
||||
import org.jetbrains.kotlin.fir.extensions.extensionService
|
||||
@@ -30,7 +29,9 @@ import org.jetbrains.kotlin.fir.psi
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.signaturer.FirBasedSignatureComposer
|
||||
import org.jetbrains.kotlin.fir.signaturer.FirMangler
|
||||
import org.jetbrains.kotlin.ir.*
|
||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.PsiIrFileEntry
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl
|
||||
import org.jetbrains.kotlin.ir.declarations.impl.IrModuleFragmentImpl
|
||||
@@ -250,11 +251,14 @@ class Fir2IrConverter(
|
||||
allDeclarations += delegatedMembers(irClass)
|
||||
// Add synthetic members *before* fake override generations.
|
||||
// Otherwise, redundant members, e.g., synthetic toString _and_ fake override toString, will be added.
|
||||
if (irConstructor != null && (irClass.isInline || irClass.isData)) {
|
||||
if (irConstructor != null && (irClass.isValue || irClass.isData)) {
|
||||
declarationStorage.enterScope(irConstructor)
|
||||
val dataClassMembersGenerator = DataClassMembersGenerator(components)
|
||||
if (irClass.isInline) {
|
||||
allDeclarations += dataClassMembersGenerator.generateInlineClassMembers(regularClass, irClass)
|
||||
if (irClass.isSingleFieldValueClass) {
|
||||
allDeclarations += dataClassMembersGenerator.generateSingleFieldValueClassMembers(regularClass, irClass)
|
||||
}
|
||||
if (irClass.isMultiFieldValueClass) {
|
||||
allDeclarations += dataClassMembersGenerator.generateMultiFieldValueClassMembers(regularClass, irClass)
|
||||
}
|
||||
if (irClass.isData) {
|
||||
allDeclarations += dataClassMembersGenerator.generateDataClassMembers(regularClass, irClass)
|
||||
|
||||
@@ -666,7 +666,7 @@ class IrBuiltInsOverFir(
|
||||
build()
|
||||
irFactory.createClass(
|
||||
startOffset, endOffset, origin, symbol, name, kind, visibility, modality,
|
||||
isCompanion, isInner, isData, isExternal, isInline, isExpect, isFun
|
||||
isCompanion, isInner, isData, isExternal, isValue, isExpect, isFun
|
||||
)
|
||||
}.also {
|
||||
it.parent = parent
|
||||
@@ -701,7 +701,7 @@ class IrBuiltInsOverFir(
|
||||
vararg supertypes: IrType,
|
||||
classKind: ClassKind = ClassKind.CLASS,
|
||||
classModality: Modality = Modality.OPEN,
|
||||
classIsInline: Boolean = false,
|
||||
classIsValue: Boolean = false,
|
||||
builderBlock: IrClassBuilder.() -> Unit = {},
|
||||
block: IrClass.() -> Unit = {}
|
||||
): IrClassSymbol {
|
||||
@@ -709,7 +709,7 @@ class IrBuiltInsOverFir(
|
||||
|
||||
return this.createClass(
|
||||
signature, *supertypes,
|
||||
classKind = classKind, classModality = classModality, classIsInline = classIsInline, builderBlock = builderBlock, block = block
|
||||
classKind = classKind, classModality = classModality, classIsValue = classIsValue, builderBlock = builderBlock, block = block
|
||||
)
|
||||
}
|
||||
|
||||
@@ -718,7 +718,7 @@ class IrBuiltInsOverFir(
|
||||
vararg supertypes: IrType,
|
||||
classKind: ClassKind = ClassKind.CLASS,
|
||||
classModality: Modality = Modality.OPEN,
|
||||
classIsInline: Boolean = false,
|
||||
classIsValue: Boolean = false,
|
||||
builderBlock: IrClassBuilder.() -> Unit = {},
|
||||
block: IrClass.() -> Unit = {}
|
||||
): IrClassSymbol = components.symbolTable.declareClass(
|
||||
@@ -729,12 +729,12 @@ class IrBuiltInsOverFir(
|
||||
name = Name.identifier(signature.shortName)
|
||||
kind = classKind
|
||||
modality = classModality
|
||||
isInline = classIsInline
|
||||
isValue = classIsValue
|
||||
origin = IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB
|
||||
builderBlock()
|
||||
irFactory.createClass(
|
||||
startOffset, endOffset, origin, symbol, name, kind, visibility, modality,
|
||||
isCompanion, isInner, isData, isExternal, isInline, isExpect, isFun
|
||||
isCompanion, isInner, isData, isExternal, isValue, isExpect, isFun
|
||||
)
|
||||
}.also {
|
||||
it.parent = this
|
||||
|
||||
+7
-2
@@ -59,8 +59,13 @@ import org.jetbrains.kotlin.util.OperatorNameConventions.TO_STRING
|
||||
*/
|
||||
class DataClassMembersGenerator(val components: Fir2IrComponents) {
|
||||
|
||||
fun generateInlineClassMembers(klass: FirClass, irClass: IrClass): List<FirDeclaration> =
|
||||
MyDataClassMethodsGenerator(irClass, klass.symbol.toLookupTag(), IrDeclarationOrigin.GENERATED_INLINE_CLASS_MEMBER).generate(klass)
|
||||
fun generateSingleFieldValueClassMembers(klass: FirClass, irClass: IrClass): List<FirDeclaration> =
|
||||
MyDataClassMethodsGenerator(irClass, klass.symbol.toLookupTag(), IrDeclarationOrigin.GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER)
|
||||
.generate(klass)
|
||||
|
||||
fun generateMultiFieldValueClassMembers(klass: FirClass, irClass: IrClass): List<FirDeclaration> =
|
||||
MyDataClassMethodsGenerator(irClass, klass.symbol.toLookupTag(), IrDeclarationOrigin.GENERATED_MULTI_FIELD_VALUE_CLASS_MEMBER)
|
||||
.generate(klass)
|
||||
|
||||
fun generateDataClassMembers(klass: FirClass, irClass: IrClass): List<FirDeclaration> =
|
||||
MyDataClassMethodsGenerator(irClass, klass.symbol.toLookupTag(), IrDeclarationOrigin.GENERATED_DATA_CLASS_MEMBER).generate(klass)
|
||||
|
||||
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.fir.backend.*
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.primaryConstructorIfAny
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.*
|
||||
import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull
|
||||
import org.jetbrains.kotlin.fir.isNewPlaceForBodyGeneration
|
||||
@@ -94,8 +93,8 @@ class Fir2IrLazyClass(
|
||||
override val isExternal: Boolean
|
||||
get() = fir.isExternal
|
||||
|
||||
override val isInline: Boolean
|
||||
get() = fir.isInline && fir.primaryConstructorIfAny(session)?.valueParameterSymbols?.size == 1
|
||||
override val isValue: Boolean
|
||||
get() = fir.isInline
|
||||
|
||||
override val isExpect: Boolean
|
||||
get() = fir.isExpect
|
||||
|
||||
Reference in New Issue
Block a user