diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java index 34d0d744d35..5e0b36edb67 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java @@ -51,7 +51,6 @@ import java.io.File; import static org.jetbrains.kotlin.codegen.coroutines.CoroutineCodegenUtilKt.SUSPEND_FUNCTION_CREATE_METHOD_NAME; import static org.jetbrains.kotlin.descriptors.ClassKind.ANNOTATION_CLASS; import static org.jetbrains.kotlin.descriptors.ClassKind.INTERFACE; -import static org.jetbrains.kotlin.descriptors.Modality.ABSTRACT; import static org.jetbrains.kotlin.descriptors.Modality.FINAL; import static org.jetbrains.kotlin.resolve.BindingContext.DELEGATED_PROPERTY_CALL; import static org.jetbrains.kotlin.resolve.DescriptorUtils.isCompanionObject; @@ -147,14 +146,6 @@ public class JvmCodegenUtil { } } - public static boolean hasAbstractMembers(@NotNull ClassDescriptor classDescriptor) { - return CollectionsKt.any( - DescriptorUtils.getAllDescriptors(classDescriptor.getDefaultType().getMemberScope()), - descriptor -> descriptor instanceof CallableMemberDescriptor && - ((CallableMemberDescriptor) descriptor).getModality() == ABSTRACT - ); - } - public static boolean isConstOrHasJvmFieldAnnotation(@NotNull PropertyDescriptor propertyDescriptor) { return propertyDescriptor.isConst() || hasJvmFieldAnnotation(propertyDescriptor); } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt index 8cde1a46879..01c0f8eeba3 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt @@ -291,7 +291,7 @@ private fun MemberDescriptor.calcModalityFlag(): Int { private val MemberDescriptor.effectiveModality: Modality get() { if (this is ClassDescriptor && kind == ClassKind.ENUM_CLASS) { - if (JvmCodegenUtil.hasAbstractMembers(this)) { + if (DescriptorUtils.hasAbstractMembers(this)) { return Modality.ABSTRACT } } diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt index 3430dd64e16..0339a8a4ebe 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt @@ -58,7 +58,8 @@ class ClassGenerator( val endOffset = ktClassOrObject.pureEndOffset return context.symbolTable.declareClass( - startOffset, endOffset, IrDeclarationOrigin.DEFINED, classDescriptor + startOffset, endOffset, IrDeclarationOrigin.DEFINED, classDescriptor, + getEffectiveModality(ktClassOrObject, classDescriptor) ).buildWithScope { irClass -> declarationGenerator.generateGlobalTypeParametersDeclarations(irClass, classDescriptor.declaredTypeParameters) @@ -99,6 +100,25 @@ class ClassGenerator( } } + private fun getEffectiveModality(ktClassOrObject: KtPureClassOrObject, classDescriptor: ClassDescriptor): Modality = + when { + !DescriptorUtils.isEnumClass(classDescriptor) -> + classDescriptor.modality + DescriptorUtils.hasAbstractMembers(classDescriptor) -> + Modality.ABSTRACT + ktClassOrObject.hasEnumEntriesWithClassMembers() -> + Modality.OPEN + else -> + Modality.FINAL + } + + private fun KtPureClassOrObject.hasEnumEntriesWithClassMembers(): Boolean { + val body = this.body ?: return false + return body.enumEntries.any { it.hasMemberDeclarations() } + } + + private fun KtEnumEntry.hasMemberDeclarations() = declarations.isNotEmpty() + private fun generateFakeOverrideMemberDeclarations(irClass: IrClass, ktClassOrObject: KtPureClassOrObject) { irClass.descriptor.unsubstitutedMemberScope.getContributedDescriptors() .mapNotNull { @@ -252,20 +272,20 @@ class ClassGenerator( val dispatchReceiverParameter = irDelegatedFunction.dispatchReceiverParameter!! val dispatchReceiverType = dispatchReceiverParameter.type irCall.dispatchReceiver = - IrGetFieldImpl( + IrGetFieldImpl( + startOffset, endOffset, + irDelegate.symbol, + irDelegate.type, + IrGetValueImpl( startOffset, endOffset, - irDelegate.symbol, - irDelegate.type, - IrGetValueImpl( - startOffset, endOffset, - dispatchReceiverType, - dispatchReceiverParameter.symbol - ) + dispatchReceiverType, + dispatchReceiverParameter.symbol ) + ) irCall.extensionReceiver = - irDelegatedFunction.extensionReceiverParameter?.let { extensionReceiver -> - IrGetValueImpl(startOffset, endOffset, extensionReceiver.type, extensionReceiver.symbol) - } + irDelegatedFunction.extensionReceiverParameter?.let { extensionReceiver -> + IrGetValueImpl(startOffset, endOffset, extensionReceiver.type, extensionReceiver.symbol) + } irCall.mapValueParameters { overriddenValueParameter -> val delegatedValueParameter = delegated.valueParameters[overriddenValueParameter.index] val irDelegatedValueParameter = irDelegatedFunction.getIrValueParameter(delegatedValueParameter) @@ -400,11 +420,11 @@ class ClassGenerator( if (!enumEntryDescriptor.isExpect) { irEnumEntry.initializerExpression = - createBodyGenerator(irEnumEntry.symbol) - .generateEnumEntryInitializer(ktEnumEntry, enumEntryDescriptor) + createBodyGenerator(irEnumEntry.symbol) + .generateEnumEntryInitializer(ktEnumEntry, enumEntryDescriptor) } - if (ktEnumEntry.declarations.isNotEmpty()) { + if (ktEnumEntry.hasMemberDeclarations()) { irEnumEntry.correspondingClass = generateClass(ktEnumEntry) } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrClassImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrClassImpl.kt index 9f488cd01d9..1c326c29a45 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrClassImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrClassImpl.kt @@ -53,12 +53,14 @@ class IrClassImpl( startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, - symbol: IrClassSymbol + symbol: IrClassSymbol, + modality: Modality = symbol.descriptor.modality ) : this( startOffset, endOffset, origin, symbol, symbol.descriptor.name, symbol.descriptor.kind, - symbol.descriptor.visibility, symbol.descriptor.modality, + symbol.descriptor.visibility, + modality = modality, isCompanion = symbol.descriptor.isCompanionObject, isInner = symbol.descriptor.isInner, isData = symbol.descriptor.isData, @@ -70,17 +72,19 @@ class IrClassImpl( startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, - descriptor: ClassDescriptor + descriptor: ClassDescriptor, + modality: Modality = descriptor.modality ) : - this(startOffset, endOffset, origin, IrClassSymbolImpl(descriptor)) + this(startOffset, endOffset, origin, IrClassSymbolImpl(descriptor), modality) constructor( startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, descriptor: ClassDescriptor, - members: List - ) : this(startOffset, endOffset, origin, descriptor) { + modality: Modality = descriptor.modality, + members: List = emptyList() + ) : this(startOffset, endOffset, origin, descriptor, modality) { addAll(members) } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt index cad83d6cc33..53f832b207c 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt @@ -92,6 +92,7 @@ open class DeepCopyIrTree : IrElementTransformerVoid() { declaration.startOffset, declaration.endOffset, mapDeclarationOrigin(declaration.origin), mapClassDeclaration(declaration.descriptor), + declaration.modality, declaration.declarations.map { it.transform() } ).apply { transformAnnotations(declaration) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt index 79653045d11..f3532b16bf1 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt @@ -232,7 +232,8 @@ open class SymbolTable : ReferenceSymbolTable { fun declareClass( startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, descriptor: ClassDescriptor, - classFactory: (IrClassSymbol) -> IrClass = { IrClassImpl(startOffset, endOffset, origin, it) } + modality: Modality = descriptor.modality, + classFactory: (IrClassSymbol) -> IrClass = { IrClassImpl(startOffset, endOffset, origin, it, modality) } ): IrClass { return classSymbolTable.declare( descriptor, diff --git a/compiler/testData/ir/irText/classes/enum.txt b/compiler/testData/ir/irText/classes/enum.txt index 91235f0dce7..644245ade40 100644 --- a/compiler/testData/ir/irText/classes/enum.txt +++ b/compiler/testData/ir/irText/classes/enum.txt @@ -132,7 +132,7 @@ FILE fqName: fileName:/enum.kt FUN ENUM_CLASS_SPECIAL_MEMBER name:valueOf visibility:public modality:FINAL <> (value:kotlin.String) returnType:TestEnum2 flags: VALUE_PARAMETER name:value index:0 type:kotlin.String flags: SYNTHETIC_BODY kind=ENUM_VALUEOF - CLASS ENUM_CLASS name:TestEnum3 modality:FINAL visibility:public flags: superTypes:[kotlin.Enum] + CLASS ENUM_CLASS name:TestEnum3 modality:ABSTRACT visibility:public flags: superTypes:[kotlin.Enum] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:TestEnum3 flags: CONSTRUCTOR visibility:private <> () returnType:TestEnum3 flags:primary BLOCK_BODY @@ -247,7 +247,7 @@ FILE fqName: fileName:/enum.kt FUN ENUM_CLASS_SPECIAL_MEMBER name:valueOf visibility:public modality:FINAL <> (value:kotlin.String) returnType:TestEnum3 flags: VALUE_PARAMETER name:value index:0 type:kotlin.String flags: SYNTHETIC_BODY kind=ENUM_VALUEOF - CLASS ENUM_CLASS name:TestEnum4 modality:FINAL visibility:public flags: superTypes:[kotlin.Enum] + CLASS ENUM_CLASS name:TestEnum4 modality:ABSTRACT visibility:public flags: superTypes:[kotlin.Enum] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:TestEnum4 flags: CONSTRUCTOR visibility:private <> (x:kotlin.Int) returnType:TestEnum4 flags:primary VALUE_PARAMETER name:x index:0 type:kotlin.Int flags: diff --git a/compiler/testData/ir/irText/classes/enumClassModality.kt b/compiler/testData/ir/irText/classes/enumClassModality.kt new file mode 100644 index 00000000000..7096f0638fd --- /dev/null +++ b/compiler/testData/ir/irText/classes/enumClassModality.kt @@ -0,0 +1,46 @@ +enum class TestFinalEnum1 { + X1 +} + +enum class TestFinalEnum2(val x: Int) { + X1(1) +} + +enum class TestFinalEnum3 { + X1 + ; + + fun doStuff() {} +} + +enum class TestOpenEnum1 { + X1 { + override fun toString() = "X1" + } +} + +enum class TestOpenEnum2 { + X1 { + override fun foo() {} + }; + + open fun foo() {} +} + +enum class TestAbstractEnum1 { + X1 { + override fun foo() {} + }; + + abstract fun foo() +} + +interface IFoo { + fun foo() +} + +enum class TestAbstractEnum2 : IFoo { + X1 { + override fun foo() {} + } +} diff --git a/compiler/testData/ir/irText/classes/enumClassModality.txt b/compiler/testData/ir/irText/classes/enumClassModality.txt new file mode 100644 index 00000000000..774c6db0348 --- /dev/null +++ b/compiler/testData/ir/irText/classes/enumClassModality.txt @@ -0,0 +1,656 @@ +FILE fqName: fileName:/enumClassModality.kt + CLASS ENUM_CLASS name:TestFinalEnum1 modality:FINAL visibility:public flags: superTypes:[kotlin.Enum] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:TestFinalEnum1 flags: + CONSTRUCTOR visibility:private <> () returnType:TestFinalEnum1 flags:primary + BLOCK_BODY + ENUM_CONSTRUCTOR_CALL 'constructor Enum(String, Int)' + >: TestFinalEnum1 + INSTANCE_INITIALIZER_CALL classDescriptor='TestFinalEnum1' + ENUM_ENTRY name:X1 + init: ENUM_CONSTRUCTOR_CALL 'constructor TestFinalEnum1()' + FUN FAKE_OVERRIDE name:clone visibility:protected modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Any flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:clone visibility:protected modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Any flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:finalize visibility:protected/*protected and package*/ modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Unit flags: + overridden: + FUN IR_EXTERNAL_JAVA_DECLARATION_STUB name:finalize visibility:protected/*protected and package*/ modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Unit flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:getDeclaringClass visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:java.lang.Class? flags: + overridden: + FUN IR_EXTERNAL_JAVA_DECLARATION_STUB name:getDeclaringClass visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:java.lang.Class? flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:compareTo visibility:public modality:FINAL <> ($this:kotlin.Enum, other:TestFinalEnum1) returnType:kotlin.Int flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:compareTo visibility:public modality:FINAL <> ($this:kotlin.Enum, other:E) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + VALUE_PARAMETER name:other index:0 type:TestFinalEnum1 flags: + FUN FAKE_OVERRIDE name:equals visibility:public modality:FINAL <> ($this:kotlin.Enum, other:kotlin.Any?) returnType:kotlin.Boolean flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:equals visibility:public modality:FINAL <> ($this:kotlin.Enum, other:kotlin.Any?) returnType:kotlin.Boolean flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags: + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:hashCode visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL flags:val + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.String flags: + correspondingProperty: PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL flags:val + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.String flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL flags:val + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + correspondingProperty: PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL flags:val + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Enum) returnType:kotlin.String flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:toString visibility:public modality:OPEN <> ($this:kotlin.Enum) returnType:kotlin.String flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN ENUM_CLASS_SPECIAL_MEMBER name:values visibility:public modality:FINAL <> () returnType:kotlin.Array flags: + SYNTHETIC_BODY kind=ENUM_VALUES + FUN ENUM_CLASS_SPECIAL_MEMBER name:valueOf visibility:public modality:FINAL <> (value:kotlin.String) returnType:TestFinalEnum1 flags: + VALUE_PARAMETER name:value index:0 type:kotlin.String flags: + SYNTHETIC_BODY kind=ENUM_VALUEOF + CLASS ENUM_CLASS name:TestFinalEnum2 modality:FINAL visibility:public flags: superTypes:[kotlin.Enum] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:TestFinalEnum2 flags: + CONSTRUCTOR visibility:private <> (x:kotlin.Int) returnType:TestFinalEnum2 flags:primary + VALUE_PARAMETER name:x index:0 type:kotlin.Int flags: + BLOCK_BODY + ENUM_CONSTRUCTOR_CALL 'constructor Enum(String, Int)' + >: TestFinalEnum2 + INSTANCE_INITIALIZER_CALL classDescriptor='TestFinalEnum2' + PROPERTY name:x visibility:public modality:FINAL flags:val + FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:public flags:final + EXPRESSION_BODY + GET_VAR 'value-parameter x: Int' type=kotlin.Int origin=INITIALIZE_PROPERTY_FROM_PARAMETER + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:TestFinalEnum2) returnType:kotlin.Int flags: + correspondingProperty: PROPERTY name:x visibility:public modality:FINAL flags:val + $this: VALUE_PARAMETER name: type:TestFinalEnum2 flags: + BLOCK_BODY + RETURN type=kotlin.Nothing from='(): Int' + GET_FIELD 'x: Int' type=kotlin.Int origin=null + receiver: GET_VAR 'this@TestFinalEnum2: TestFinalEnum2' type=TestFinalEnum2 origin=null + ENUM_ENTRY name:X1 + init: ENUM_CONSTRUCTOR_CALL 'constructor TestFinalEnum2(Int)' + x: CONST Int type=kotlin.Int value=1 + FUN FAKE_OVERRIDE name:clone visibility:protected modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Any flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:clone visibility:protected modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Any flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:finalize visibility:protected/*protected and package*/ modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Unit flags: + overridden: + FUN IR_EXTERNAL_JAVA_DECLARATION_STUB name:finalize visibility:protected/*protected and package*/ modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Unit flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:getDeclaringClass visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:java.lang.Class? flags: + overridden: + FUN IR_EXTERNAL_JAVA_DECLARATION_STUB name:getDeclaringClass visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:java.lang.Class? flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:compareTo visibility:public modality:FINAL <> ($this:kotlin.Enum, other:TestFinalEnum2) returnType:kotlin.Int flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:compareTo visibility:public modality:FINAL <> ($this:kotlin.Enum, other:E) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + VALUE_PARAMETER name:other index:0 type:TestFinalEnum2 flags: + FUN FAKE_OVERRIDE name:equals visibility:public modality:FINAL <> ($this:kotlin.Enum, other:kotlin.Any?) returnType:kotlin.Boolean flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:equals visibility:public modality:FINAL <> ($this:kotlin.Enum, other:kotlin.Any?) returnType:kotlin.Boolean flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags: + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:hashCode visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL flags:val + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.String flags: + correspondingProperty: PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL flags:val + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.String flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL flags:val + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + correspondingProperty: PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL flags:val + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Enum) returnType:kotlin.String flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:toString visibility:public modality:OPEN <> ($this:kotlin.Enum) returnType:kotlin.String flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN ENUM_CLASS_SPECIAL_MEMBER name:values visibility:public modality:FINAL <> () returnType:kotlin.Array flags: + SYNTHETIC_BODY kind=ENUM_VALUES + FUN ENUM_CLASS_SPECIAL_MEMBER name:valueOf visibility:public modality:FINAL <> (value:kotlin.String) returnType:TestFinalEnum2 flags: + VALUE_PARAMETER name:value index:0 type:kotlin.String flags: + SYNTHETIC_BODY kind=ENUM_VALUEOF + CLASS ENUM_CLASS name:TestFinalEnum3 modality:FINAL visibility:public flags: superTypes:[kotlin.Enum] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:TestFinalEnum3 flags: + CONSTRUCTOR visibility:private <> () returnType:TestFinalEnum3 flags:primary + BLOCK_BODY + ENUM_CONSTRUCTOR_CALL 'constructor Enum(String, Int)' + >: TestFinalEnum3 + INSTANCE_INITIALIZER_CALL classDescriptor='TestFinalEnum3' + ENUM_ENTRY name:X1 + init: ENUM_CONSTRUCTOR_CALL 'constructor TestFinalEnum3()' + FUN name:doStuff visibility:public modality:FINAL <> ($this:TestFinalEnum3) returnType:kotlin.Unit flags: + $this: VALUE_PARAMETER name: type:TestFinalEnum3 flags: + BLOCK_BODY + FUN FAKE_OVERRIDE name:clone visibility:protected modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Any flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:clone visibility:protected modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Any flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:finalize visibility:protected/*protected and package*/ modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Unit flags: + overridden: + FUN IR_EXTERNAL_JAVA_DECLARATION_STUB name:finalize visibility:protected/*protected and package*/ modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Unit flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:getDeclaringClass visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:java.lang.Class? flags: + overridden: + FUN IR_EXTERNAL_JAVA_DECLARATION_STUB name:getDeclaringClass visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:java.lang.Class? flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:compareTo visibility:public modality:FINAL <> ($this:kotlin.Enum, other:TestFinalEnum3) returnType:kotlin.Int flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:compareTo visibility:public modality:FINAL <> ($this:kotlin.Enum, other:E) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + VALUE_PARAMETER name:other index:0 type:TestFinalEnum3 flags: + FUN FAKE_OVERRIDE name:equals visibility:public modality:FINAL <> ($this:kotlin.Enum, other:kotlin.Any?) returnType:kotlin.Boolean flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:equals visibility:public modality:FINAL <> ($this:kotlin.Enum, other:kotlin.Any?) returnType:kotlin.Boolean flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags: + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:hashCode visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL flags:val + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.String flags: + correspondingProperty: PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL flags:val + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.String flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL flags:val + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + correspondingProperty: PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL flags:val + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Enum) returnType:kotlin.String flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:toString visibility:public modality:OPEN <> ($this:kotlin.Enum) returnType:kotlin.String flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN ENUM_CLASS_SPECIAL_MEMBER name:values visibility:public modality:FINAL <> () returnType:kotlin.Array flags: + SYNTHETIC_BODY kind=ENUM_VALUES + FUN ENUM_CLASS_SPECIAL_MEMBER name:valueOf visibility:public modality:FINAL <> (value:kotlin.String) returnType:TestFinalEnum3 flags: + VALUE_PARAMETER name:value index:0 type:kotlin.String flags: + SYNTHETIC_BODY kind=ENUM_VALUEOF + CLASS ENUM_CLASS name:TestOpenEnum1 modality:OPEN visibility:public flags: superTypes:[kotlin.Enum] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:TestOpenEnum1 flags: + CONSTRUCTOR visibility:private <> () returnType:TestOpenEnum1 flags:primary + BLOCK_BODY + ENUM_CONSTRUCTOR_CALL 'constructor Enum(String, Int)' + >: TestOpenEnum1 + INSTANCE_INITIALIZER_CALL classDescriptor='TestOpenEnum1' + ENUM_ENTRY name:X1 + init: ENUM_CONSTRUCTOR_CALL 'constructor X1()' + class: CLASS ENUM_ENTRY name:X1 modality:FINAL visibility:public flags: superTypes:[TestOpenEnum1] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:TestOpenEnum1.X1 flags: + CONSTRUCTOR visibility:private <> () returnType:TestOpenEnum1.X1 flags:primary + BLOCK_BODY + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + typeOperand: CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public flags: superTypes:[kotlin.Any] + ENUM_CONSTRUCTOR_CALL 'constructor TestOpenEnum1()' + INSTANCE_INITIALIZER_CALL classDescriptor='X1' + FUN name:toString visibility:public modality:OPEN <> ($this:TestOpenEnum1.X1) returnType:kotlin.String flags: + overridden: + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Enum) returnType:kotlin.String flags: + $this: VALUE_PARAMETER name: type:TestOpenEnum1.X1 flags: + BLOCK_BODY + RETURN type=kotlin.Nothing from='toString(): String' + CONST String type=kotlin.String value="X1" + FUN FAKE_OVERRIDE name:clone visibility:protected modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Any flags: + overridden: + FUN FAKE_OVERRIDE name:clone visibility:protected modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Any flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:finalize visibility:protected/*protected and package*/ modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Unit flags: + overridden: + FUN FAKE_OVERRIDE name:finalize visibility:protected/*protected and package*/ modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Unit flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:getDeclaringClass visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:java.lang.Class? flags: + overridden: + FUN FAKE_OVERRIDE name:getDeclaringClass visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:java.lang.Class? flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:compareTo visibility:public modality:FINAL <> ($this:kotlin.Enum, other:TestOpenEnum1) returnType:kotlin.Int flags: + overridden: + FUN FAKE_OVERRIDE name:compareTo visibility:public modality:FINAL <> ($this:kotlin.Enum, other:TestOpenEnum1) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + VALUE_PARAMETER name:other index:0 type:TestOpenEnum1 flags: + FUN FAKE_OVERRIDE name:equals visibility:public modality:FINAL <> ($this:kotlin.Enum, other:kotlin.Any?) returnType:kotlin.Boolean flags: + overridden: + FUN FAKE_OVERRIDE name:equals visibility:public modality:FINAL <> ($this:kotlin.Enum, other:kotlin.Any?) returnType:kotlin.Boolean flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags: + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + overridden: + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL flags:val + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.String flags: + correspondingProperty: PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL flags:val + overridden: + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.String flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL flags:val + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + correspondingProperty: PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL flags:val + overridden: + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:clone visibility:protected modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Any flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:clone visibility:protected modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Any flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:finalize visibility:protected/*protected and package*/ modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Unit flags: + overridden: + FUN IR_EXTERNAL_JAVA_DECLARATION_STUB name:finalize visibility:protected/*protected and package*/ modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Unit flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:getDeclaringClass visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:java.lang.Class? flags: + overridden: + FUN IR_EXTERNAL_JAVA_DECLARATION_STUB name:getDeclaringClass visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:java.lang.Class? flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:compareTo visibility:public modality:FINAL <> ($this:kotlin.Enum, other:TestOpenEnum1) returnType:kotlin.Int flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:compareTo visibility:public modality:FINAL <> ($this:kotlin.Enum, other:E) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + VALUE_PARAMETER name:other index:0 type:TestOpenEnum1 flags: + FUN FAKE_OVERRIDE name:equals visibility:public modality:FINAL <> ($this:kotlin.Enum, other:kotlin.Any?) returnType:kotlin.Boolean flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:equals visibility:public modality:FINAL <> ($this:kotlin.Enum, other:kotlin.Any?) returnType:kotlin.Boolean flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags: + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:hashCode visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL flags:val + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.String flags: + correspondingProperty: PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL flags:val + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.String flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL flags:val + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + correspondingProperty: PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL flags:val + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Enum) returnType:kotlin.String flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:toString visibility:public modality:OPEN <> ($this:kotlin.Enum) returnType:kotlin.String flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN ENUM_CLASS_SPECIAL_MEMBER name:values visibility:public modality:FINAL <> () returnType:kotlin.Array flags: + SYNTHETIC_BODY kind=ENUM_VALUES + FUN ENUM_CLASS_SPECIAL_MEMBER name:valueOf visibility:public modality:FINAL <> (value:kotlin.String) returnType:TestOpenEnum1 flags: + VALUE_PARAMETER name:value index:0 type:kotlin.String flags: + SYNTHETIC_BODY kind=ENUM_VALUEOF + CLASS ENUM_CLASS name:TestOpenEnum2 modality:OPEN visibility:public flags: superTypes:[kotlin.Enum] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:TestOpenEnum2 flags: + CONSTRUCTOR visibility:private <> () returnType:TestOpenEnum2 flags:primary + BLOCK_BODY + ENUM_CONSTRUCTOR_CALL 'constructor Enum(String, Int)' + >: TestOpenEnum2 + INSTANCE_INITIALIZER_CALL classDescriptor='TestOpenEnum2' + ENUM_ENTRY name:X1 + init: ENUM_CONSTRUCTOR_CALL 'constructor X1()' + class: CLASS ENUM_ENTRY name:X1 modality:FINAL visibility:public flags: superTypes:[TestOpenEnum2] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:TestOpenEnum2.X1 flags: + CONSTRUCTOR visibility:private <> () returnType:TestOpenEnum2.X1 flags:primary + BLOCK_BODY + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + typeOperand: CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public flags: superTypes:[kotlin.Any] + ENUM_CONSTRUCTOR_CALL 'constructor TestOpenEnum2()' + INSTANCE_INITIALIZER_CALL classDescriptor='X1' + FUN name:foo visibility:public modality:OPEN <> ($this:TestOpenEnum2.X1) returnType:kotlin.Unit flags: + overridden: + FUN name:foo visibility:public modality:OPEN <> ($this:TestOpenEnum2) returnType:kotlin.Unit flags: + $this: VALUE_PARAMETER name: type:TestOpenEnum2.X1 flags: + BLOCK_BODY + FUN FAKE_OVERRIDE name:clone visibility:protected modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Any flags: + overridden: + FUN FAKE_OVERRIDE name:clone visibility:protected modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Any flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:finalize visibility:protected/*protected and package*/ modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Unit flags: + overridden: + FUN FAKE_OVERRIDE name:finalize visibility:protected/*protected and package*/ modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Unit flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:getDeclaringClass visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:java.lang.Class? flags: + overridden: + FUN FAKE_OVERRIDE name:getDeclaringClass visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:java.lang.Class? flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:compareTo visibility:public modality:FINAL <> ($this:kotlin.Enum, other:TestOpenEnum2) returnType:kotlin.Int flags: + overridden: + FUN FAKE_OVERRIDE name:compareTo visibility:public modality:FINAL <> ($this:kotlin.Enum, other:TestOpenEnum2) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + VALUE_PARAMETER name:other index:0 type:TestOpenEnum2 flags: + FUN FAKE_OVERRIDE name:equals visibility:public modality:FINAL <> ($this:kotlin.Enum, other:kotlin.Any?) returnType:kotlin.Boolean flags: + overridden: + FUN FAKE_OVERRIDE name:equals visibility:public modality:FINAL <> ($this:kotlin.Enum, other:kotlin.Any?) returnType:kotlin.Boolean flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags: + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + overridden: + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL flags:val + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.String flags: + correspondingProperty: PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL flags:val + overridden: + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.String flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL flags:val + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + correspondingProperty: PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL flags:val + overridden: + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Enum) returnType:kotlin.String flags: + overridden: + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Enum) returnType:kotlin.String flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN name:foo visibility:public modality:OPEN <> ($this:TestOpenEnum2) returnType:kotlin.Unit flags: + $this: VALUE_PARAMETER name: type:TestOpenEnum2 flags: + BLOCK_BODY + FUN FAKE_OVERRIDE name:clone visibility:protected modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Any flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:clone visibility:protected modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Any flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:finalize visibility:protected/*protected and package*/ modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Unit flags: + overridden: + FUN IR_EXTERNAL_JAVA_DECLARATION_STUB name:finalize visibility:protected/*protected and package*/ modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Unit flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:getDeclaringClass visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:java.lang.Class? flags: + overridden: + FUN IR_EXTERNAL_JAVA_DECLARATION_STUB name:getDeclaringClass visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:java.lang.Class? flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:compareTo visibility:public modality:FINAL <> ($this:kotlin.Enum, other:TestOpenEnum2) returnType:kotlin.Int flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:compareTo visibility:public modality:FINAL <> ($this:kotlin.Enum, other:E) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + VALUE_PARAMETER name:other index:0 type:TestOpenEnum2 flags: + FUN FAKE_OVERRIDE name:equals visibility:public modality:FINAL <> ($this:kotlin.Enum, other:kotlin.Any?) returnType:kotlin.Boolean flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:equals visibility:public modality:FINAL <> ($this:kotlin.Enum, other:kotlin.Any?) returnType:kotlin.Boolean flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags: + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:hashCode visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL flags:val + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.String flags: + correspondingProperty: PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL flags:val + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.String flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL flags:val + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + correspondingProperty: PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL flags:val + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Enum) returnType:kotlin.String flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:toString visibility:public modality:OPEN <> ($this:kotlin.Enum) returnType:kotlin.String flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN ENUM_CLASS_SPECIAL_MEMBER name:values visibility:public modality:FINAL <> () returnType:kotlin.Array flags: + SYNTHETIC_BODY kind=ENUM_VALUES + FUN ENUM_CLASS_SPECIAL_MEMBER name:valueOf visibility:public modality:FINAL <> (value:kotlin.String) returnType:TestOpenEnum2 flags: + VALUE_PARAMETER name:value index:0 type:kotlin.String flags: + SYNTHETIC_BODY kind=ENUM_VALUEOF + CLASS ENUM_CLASS name:TestAbstractEnum1 modality:ABSTRACT visibility:public flags: superTypes:[kotlin.Enum] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:TestAbstractEnum1 flags: + CONSTRUCTOR visibility:private <> () returnType:TestAbstractEnum1 flags:primary + BLOCK_BODY + ENUM_CONSTRUCTOR_CALL 'constructor Enum(String, Int)' + >: TestAbstractEnum1 + INSTANCE_INITIALIZER_CALL classDescriptor='TestAbstractEnum1' + ENUM_ENTRY name:X1 + init: ENUM_CONSTRUCTOR_CALL 'constructor X1()' + class: CLASS ENUM_ENTRY name:X1 modality:FINAL visibility:public flags: superTypes:[TestAbstractEnum1] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:TestAbstractEnum1.X1 flags: + CONSTRUCTOR visibility:private <> () returnType:TestAbstractEnum1.X1 flags:primary + BLOCK_BODY + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + typeOperand: CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public flags: superTypes:[kotlin.Any] + ENUM_CONSTRUCTOR_CALL 'constructor TestAbstractEnum1()' + INSTANCE_INITIALIZER_CALL classDescriptor='X1' + FUN name:foo visibility:public modality:OPEN <> ($this:TestAbstractEnum1.X1) returnType:kotlin.Unit flags: + overridden: + FUN name:foo visibility:public modality:ABSTRACT <> ($this:TestAbstractEnum1) returnType:kotlin.Unit flags: + $this: VALUE_PARAMETER name: type:TestAbstractEnum1.X1 flags: + BLOCK_BODY + FUN FAKE_OVERRIDE name:clone visibility:protected modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Any flags: + overridden: + FUN FAKE_OVERRIDE name:clone visibility:protected modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Any flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:finalize visibility:protected/*protected and package*/ modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Unit flags: + overridden: + FUN FAKE_OVERRIDE name:finalize visibility:protected/*protected and package*/ modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Unit flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:getDeclaringClass visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:java.lang.Class? flags: + overridden: + FUN FAKE_OVERRIDE name:getDeclaringClass visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:java.lang.Class? flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:compareTo visibility:public modality:FINAL <> ($this:kotlin.Enum, other:TestAbstractEnum1) returnType:kotlin.Int flags: + overridden: + FUN FAKE_OVERRIDE name:compareTo visibility:public modality:FINAL <> ($this:kotlin.Enum, other:TestAbstractEnum1) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + VALUE_PARAMETER name:other index:0 type:TestAbstractEnum1 flags: + FUN FAKE_OVERRIDE name:equals visibility:public modality:FINAL <> ($this:kotlin.Enum, other:kotlin.Any?) returnType:kotlin.Boolean flags: + overridden: + FUN FAKE_OVERRIDE name:equals visibility:public modality:FINAL <> ($this:kotlin.Enum, other:kotlin.Any?) returnType:kotlin.Boolean flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags: + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + overridden: + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL flags:val + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.String flags: + correspondingProperty: PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL flags:val + overridden: + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.String flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL flags:val + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + correspondingProperty: PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL flags:val + overridden: + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Enum) returnType:kotlin.String flags: + overridden: + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Enum) returnType:kotlin.String flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN name:foo visibility:public modality:ABSTRACT <> ($this:TestAbstractEnum1) returnType:kotlin.Unit flags: + $this: VALUE_PARAMETER name: type:TestAbstractEnum1 flags: + FUN FAKE_OVERRIDE name:clone visibility:protected modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Any flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:clone visibility:protected modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Any flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:finalize visibility:protected/*protected and package*/ modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Unit flags: + overridden: + FUN IR_EXTERNAL_JAVA_DECLARATION_STUB name:finalize visibility:protected/*protected and package*/ modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Unit flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:getDeclaringClass visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:java.lang.Class? flags: + overridden: + FUN IR_EXTERNAL_JAVA_DECLARATION_STUB name:getDeclaringClass visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:java.lang.Class? flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:compareTo visibility:public modality:FINAL <> ($this:kotlin.Enum, other:TestAbstractEnum1) returnType:kotlin.Int flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:compareTo visibility:public modality:FINAL <> ($this:kotlin.Enum, other:E) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + VALUE_PARAMETER name:other index:0 type:TestAbstractEnum1 flags: + FUN FAKE_OVERRIDE name:equals visibility:public modality:FINAL <> ($this:kotlin.Enum, other:kotlin.Any?) returnType:kotlin.Boolean flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:equals visibility:public modality:FINAL <> ($this:kotlin.Enum, other:kotlin.Any?) returnType:kotlin.Boolean flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags: + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:hashCode visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL flags:val + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.String flags: + correspondingProperty: PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL flags:val + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.String flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL flags:val + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + correspondingProperty: PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL flags:val + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Enum) returnType:kotlin.String flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:toString visibility:public modality:OPEN <> ($this:kotlin.Enum) returnType:kotlin.String flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN ENUM_CLASS_SPECIAL_MEMBER name:values visibility:public modality:FINAL <> () returnType:kotlin.Array flags: + SYNTHETIC_BODY kind=ENUM_VALUES + FUN ENUM_CLASS_SPECIAL_MEMBER name:valueOf visibility:public modality:FINAL <> (value:kotlin.String) returnType:TestAbstractEnum1 flags: + VALUE_PARAMETER name:value index:0 type:kotlin.String flags: + SYNTHETIC_BODY kind=ENUM_VALUEOF + CLASS INTERFACE name:IFoo modality:ABSTRACT visibility:public flags: superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:IFoo flags: + FUN name:foo visibility:public modality:ABSTRACT <> ($this:IFoo) returnType:kotlin.Unit flags: + $this: VALUE_PARAMETER name: type:IFoo flags: + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags: + $this: VALUE_PARAMETER name: type:kotlin.Any flags: + VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags: + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Any flags: + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags: + $this: VALUE_PARAMETER name: type:kotlin.Any flags: + CLASS ENUM_CLASS name:TestAbstractEnum2 modality:ABSTRACT visibility:public flags: superTypes:[kotlin.Enum; IFoo] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:TestAbstractEnum2 flags: + CONSTRUCTOR visibility:private <> () returnType:TestAbstractEnum2 flags:primary + BLOCK_BODY + ENUM_CONSTRUCTOR_CALL 'constructor Enum(String, Int)' + >: TestAbstractEnum2 + INSTANCE_INITIALIZER_CALL classDescriptor='TestAbstractEnum2' + ENUM_ENTRY name:X1 + init: ENUM_CONSTRUCTOR_CALL 'constructor X1()' + class: CLASS ENUM_ENTRY name:X1 modality:FINAL visibility:public flags: superTypes:[TestAbstractEnum2] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:TestAbstractEnum2.X1 flags: + CONSTRUCTOR visibility:private <> () returnType:TestAbstractEnum2.X1 flags:primary + BLOCK_BODY + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + typeOperand: CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public flags: superTypes:[kotlin.Any] + ENUM_CONSTRUCTOR_CALL 'constructor TestAbstractEnum2()' + INSTANCE_INITIALIZER_CALL classDescriptor='X1' + FUN name:foo visibility:public modality:OPEN <> ($this:TestAbstractEnum2.X1) returnType:kotlin.Unit flags: + overridden: + FUN FAKE_OVERRIDE name:foo visibility:public modality:ABSTRACT <> ($this:IFoo) returnType:kotlin.Unit flags: + $this: VALUE_PARAMETER name: type:TestAbstractEnum2.X1 flags: + BLOCK_BODY + FUN FAKE_OVERRIDE name:clone visibility:protected modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Any flags: + overridden: + FUN FAKE_OVERRIDE name:clone visibility:protected modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Any flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:finalize visibility:protected/*protected and package*/ modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Unit flags: + overridden: + FUN FAKE_OVERRIDE name:finalize visibility:protected/*protected and package*/ modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Unit flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:getDeclaringClass visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:java.lang.Class? flags: + overridden: + FUN FAKE_OVERRIDE name:getDeclaringClass visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:java.lang.Class? flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:compareTo visibility:public modality:FINAL <> ($this:kotlin.Enum, other:TestAbstractEnum2) returnType:kotlin.Int flags: + overridden: + FUN FAKE_OVERRIDE name:compareTo visibility:public modality:FINAL <> ($this:kotlin.Enum, other:TestAbstractEnum2) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + VALUE_PARAMETER name:other index:0 type:TestAbstractEnum2 flags: + FUN FAKE_OVERRIDE name:equals visibility:public modality:FINAL <> ($this:kotlin.Enum, other:kotlin.Any?) returnType:kotlin.Boolean flags: + overridden: + FUN FAKE_OVERRIDE name:equals visibility:public modality:FINAL <> ($this:kotlin.Enum, other:kotlin.Any?) returnType:kotlin.Boolean flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags: + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + overridden: + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL flags:val + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.String flags: + correspondingProperty: PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL flags:val + overridden: + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.String flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL flags:val + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + correspondingProperty: PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL flags:val + overridden: + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Enum) returnType:kotlin.String flags: + overridden: + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Enum) returnType:kotlin.String flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:clone visibility:protected modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Any flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:clone visibility:protected modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Any flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:finalize visibility:protected/*protected and package*/ modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Unit flags: + overridden: + FUN IR_EXTERNAL_JAVA_DECLARATION_STUB name:finalize visibility:protected/*protected and package*/ modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Unit flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:foo visibility:public modality:ABSTRACT <> ($this:IFoo) returnType:kotlin.Unit flags: + overridden: + FUN name:foo visibility:public modality:ABSTRACT <> ($this:IFoo) returnType:kotlin.Unit flags: + $this: VALUE_PARAMETER name: type:IFoo flags: + FUN FAKE_OVERRIDE name:getDeclaringClass visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:java.lang.Class? flags: + overridden: + FUN IR_EXTERNAL_JAVA_DECLARATION_STUB name:getDeclaringClass visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:java.lang.Class? flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:compareTo visibility:public modality:FINAL <> ($this:kotlin.Enum, other:TestAbstractEnum2) returnType:kotlin.Int flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:compareTo visibility:public modality:FINAL <> ($this:kotlin.Enum, other:E) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + VALUE_PARAMETER name:other index:0 type:TestAbstractEnum2 flags: + PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL flags:val + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.String flags: + correspondingProperty: PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL flags:val + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.String flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL flags:val + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + correspondingProperty: PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL flags:val + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:equals visibility:public modality:FINAL <> ($this:kotlin.Enum, other:kotlin.Any?) returnType:kotlin.Boolean flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:equals visibility:public modality:FINAL <> ($this:kotlin.Enum, other:kotlin.Any?) returnType:kotlin.Boolean flags: + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags: + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:hashCode visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Enum) returnType:kotlin.String flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:toString visibility:public modality:OPEN <> ($this:kotlin.Enum) returnType:kotlin.String flags: + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags: + $this: VALUE_PARAMETER name: type:kotlin.Enum flags: + FUN ENUM_CLASS_SPECIAL_MEMBER name:values visibility:public modality:FINAL <> () returnType:kotlin.Array flags: + SYNTHETIC_BODY kind=ENUM_VALUES + FUN ENUM_CLASS_SPECIAL_MEMBER name:valueOf visibility:public modality:FINAL <> (value:kotlin.String) returnType:TestAbstractEnum2 flags: + VALUE_PARAMETER name:value index:0 type:kotlin.String flags: + SYNTHETIC_BODY kind=ENUM_VALUEOF diff --git a/compiler/testData/ir/irText/classes/enumWithSecondaryCtor.txt b/compiler/testData/ir/irText/classes/enumWithSecondaryCtor.txt index 3d62407f02d..132dca3750d 100644 --- a/compiler/testData/ir/irText/classes/enumWithSecondaryCtor.txt +++ b/compiler/testData/ir/irText/classes/enumWithSecondaryCtor.txt @@ -146,7 +146,7 @@ FILE fqName: fileName:/enumWithSecondaryCtor.kt FUN ENUM_CLASS_SPECIAL_MEMBER name:valueOf visibility:public modality:FINAL <> (value:kotlin.String) returnType:Test1 flags: VALUE_PARAMETER name:value index:0 type:kotlin.String flags: SYNTHETIC_BODY kind=ENUM_VALUEOF - CLASS ENUM_CLASS name:Test2 modality:FINAL visibility:public flags: superTypes:[kotlin.Enum] + CLASS ENUM_CLASS name:Test2 modality:ABSTRACT visibility:public flags: superTypes:[kotlin.Enum] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:Test2 flags: CONSTRUCTOR visibility:private <> (x:kotlin.Int) returnType:Test2 flags:primary VALUE_PARAMETER name:x index:0 type:kotlin.Int flags: diff --git a/compiler/testData/ir/irText/declarations/annotations/enumEntriesWithAnnotations.txt b/compiler/testData/ir/irText/declarations/annotations/enumEntriesWithAnnotations.txt index b12e0786a23..65475aab69d 100644 --- a/compiler/testData/ir/irText/declarations/annotations/enumEntriesWithAnnotations.txt +++ b/compiler/testData/ir/irText/declarations/annotations/enumEntriesWithAnnotations.txt @@ -27,7 +27,7 @@ FILE fqName: fileName:/enumEntriesWithAnnotations.kt overridden: FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags: $this: VALUE_PARAMETER name: type:kotlin.Any flags: - CLASS ENUM_CLASS name:TestEnum modality:FINAL visibility:public flags: superTypes:[kotlin.Enum] + CLASS ENUM_CLASS name:TestEnum modality:OPEN visibility:public flags: superTypes:[kotlin.Enum] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:TestEnum flags: CONSTRUCTOR visibility:private <> () returnType:TestEnum flags:primary BLOCK_BODY diff --git a/compiler/testData/ir/irText/expressions/enumEntryAsReceiver.txt b/compiler/testData/ir/irText/expressions/enumEntryAsReceiver.txt index 2ed9d04640c..219055bc9fe 100644 --- a/compiler/testData/ir/irText/expressions/enumEntryAsReceiver.txt +++ b/compiler/testData/ir/irText/expressions/enumEntryAsReceiver.txt @@ -1,5 +1,5 @@ FILE fqName: fileName:/enumEntryAsReceiver.kt - CLASS ENUM_CLASS name:X modality:FINAL visibility:public flags: superTypes:[kotlin.Enum] + CLASS ENUM_CLASS name:X modality:ABSTRACT visibility:public flags: superTypes:[kotlin.Enum] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:X flags: CONSTRUCTOR visibility:private <> () returnType:X flags:primary BLOCK_BODY diff --git a/compiler/testData/ir/irText/expressions/enumEntryReferenceFromEnumEntryClass.txt b/compiler/testData/ir/irText/expressions/enumEntryReferenceFromEnumEntryClass.txt index db358b71ad7..d4e91fadb63 100644 --- a/compiler/testData/ir/irText/expressions/enumEntryReferenceFromEnumEntryClass.txt +++ b/compiler/testData/ir/irText/expressions/enumEntryReferenceFromEnumEntryClass.txt @@ -1,5 +1,5 @@ FILE fqName: fileName:/enumEntryReferenceFromEnumEntryClass.kt - CLASS ENUM_CLASS name:MyEnum modality:FINAL visibility:public flags: superTypes:[kotlin.Enum] + CLASS ENUM_CLASS name:MyEnum modality:OPEN visibility:public flags: superTypes:[kotlin.Enum] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:MyEnum flags: CONSTRUCTOR visibility:private <> () returnType:MyEnum flags:primary BLOCK_BODY diff --git a/compiler/testData/ir/irText/singletons/enumEntry.txt b/compiler/testData/ir/irText/singletons/enumEntry.txt index c35c17ee0f1..8304a262eda 100644 --- a/compiler/testData/ir/irText/singletons/enumEntry.txt +++ b/compiler/testData/ir/irText/singletons/enumEntry.txt @@ -1,5 +1,5 @@ FILE fqName: fileName:/enumEntry.kt - CLASS ENUM_CLASS name:Z modality:FINAL visibility:public flags: superTypes:[kotlin.Enum] + CLASS ENUM_CLASS name:Z modality:OPEN visibility:public flags: superTypes:[kotlin.Enum] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:Z flags: CONSTRUCTOR visibility:private <> () returnType:Z flags:primary BLOCK_BODY diff --git a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java index bbe0d0cb24c..d01a4ec89eb 100644 --- a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java @@ -111,6 +111,11 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase { runTest("compiler/testData/ir/irText/classes/enum.kt"); } + @TestMetadata("enumClassModality.kt") + public void testEnumClassModality() throws Exception { + runTest("compiler/testData/ir/irText/classes/enumClassModality.kt"); + } + @TestMetadata("enumWithSecondaryCtor.kt") public void testEnumWithSecondaryCtor() throws Exception { runTest("compiler/testData/ir/irText/classes/enumWithSecondaryCtor.kt"); diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.java b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.java index 837e4816565..0b057530255 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.java +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.java @@ -5,6 +5,8 @@ package org.jetbrains.kotlin.resolve; +import kotlin.collections.CollectionsKt; +import kotlin.jvm.functions.Function1; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; @@ -30,6 +32,7 @@ import java.util.*; import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.isAny; import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.isNullableAny; import static org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.*; +import static org.jetbrains.kotlin.descriptors.Modality.ABSTRACT; import static org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt.getBuiltIns; public class DescriptorUtils { @@ -331,6 +334,16 @@ public class DescriptorUtils { return descriptor instanceof ClassDescriptor && ((ClassDescriptor) descriptor).getKind() == classKind; } + public static boolean hasAbstractMembers(@NotNull ClassDescriptor classDescriptor) { + for (DeclarationDescriptor member : getAllDescriptors(classDescriptor.getDefaultType().getMemberScope())) { + if (member instanceof CallableMemberDescriptor && + ((CallableMemberDescriptor) member).getModality() == ABSTRACT) { + return true; + } + } + return false; + } + @NotNull public static List getSuperclassDescriptors(@NotNull ClassDescriptor classDescriptor) { Collection superclassTypes = classDescriptor.getTypeConstructor().getSupertypes();