diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/symbols/CallableId.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/symbols/CallableId.kt index b797bc48897..25afe928499 100644 --- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/symbols/CallableId.kt +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/symbols/CallableId.kt @@ -13,6 +13,8 @@ import org.jetbrains.kotlin.name.Name data class CallableId(val packageName: FqName, val className: FqName?, val callableName: Name) { val classId: ClassId? get() = className?.let { ClassId(packageName, it, false) } + constructor(classId: ClassId, callableName: Name) : this(classId.packageFqName, classId.relativeClassName, callableName) + constructor(packageName: FqName, callableName: Name) : this(packageName, null, callableName) @Deprecated("TODO: Better solution for local callables?") diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt index 7cf8062270d..a050ae51e81 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt @@ -10,7 +10,6 @@ import com.intellij.openapi.project.Project import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.* -import org.jetbrains.kotlin.fir.declarations.impl.FirEnumEntryImpl import org.jetbrains.kotlin.fir.declarations.impl.FirSimpleFunctionImpl import org.jetbrains.kotlin.fir.declarations.impl.FirPropertyImpl import org.jetbrains.kotlin.fir.deserialization.FirDeserializationContext @@ -212,11 +211,6 @@ class KotlinDeserializedJvmSymbolsProvider( ).firstOrNull() this.calleeReference = when { - entryClassSymbol != null && (entryClassSymbol as? FirClassSymbol)?.fir is FirEnumEntry -> { - FirResolvedNamedReferenceImpl( - null, name, entryClassSymbol - ) - } entryCallableSymbol != null -> { FirResolvedNamedReferenceImpl( null, name, entryCallableSymbol @@ -340,9 +334,7 @@ class KotlinDeserializedJvmSymbolsProvider( kotlinScopeProvider, parentContext, this::findAndDeserializeClass ) - symbol.fir.declarations.filterIsInstance().forEach { - classesCache[it.symbol.classId] = it.symbol - } + classesCache[classId] = symbol val annotations = mutableListOf() kotlinJvmBinaryClass.loadClassAnnotations(object : KotlinJvmBinaryClass.AnnotationVisitor { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/javaTypeUtils.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/javaTypeUtils.kt index 76288f1b24a..8cc3ed2ccf8 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/javaTypeUtils.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/javaTypeUtils.kt @@ -365,11 +365,11 @@ internal fun ConeKotlinType.lexicalCastFrom(session: FirSession, value: String): val firElement = lookupTag.toSymbol(session)?.fir if (firElement is FirRegularClass && firElement.classKind == ClassKind.ENUM_CLASS) { val name = Name.identifier(value) - val firEnumEntry = firElement.declarations.filterIsInstance().find { it.name == name } + val firEnumEntry = firElement.collectEnumEntries().find { it.callableId.callableName == name } return if (firEnumEntry != null) FirQualifiedAccessExpressionImpl(null).apply { - calleeReference = FirSimpleNamedReference( - null, name, null // TODO: , firEnumEntry.symbol + calleeReference = FirResolvedNamedReferenceImpl( + null, name, firEnumEntry ) } else if (firElement is FirJavaClass) { val firStaticProperty = firElement.declarations.filterIsInstance().find { diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index 368abd0eef6..e71f4a56ef8 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -489,7 +489,7 @@ class DeclarationsConverter( val delegatedType = delegatedSuperTypeRef ?: implicitAnyType return withChildClassName(ANONYMOUS_OBJECT_NAME) { - FirAnonymousObjectImpl(null, session, scopeProvider, FirAnonymousObjectSymbol()).apply { + FirAnonymousObjectImpl(null, session, ClassKind.OBJECT, scopeProvider, FirAnonymousObjectSymbol()).apply { annotations += modifiers.annotations this.superTypeRefs += superTypeRefs this.typeRef = superTypeRefs.first() @@ -515,12 +515,11 @@ class DeclarationsConverter( /** * @see org.jetbrains.kotlin.parsing.KotlinParsing.parseEnumEntry */ - private fun convertEnumEntry(enumEntry: LighterASTNode, classWrapper: ClassWrapper): FirEnumEntryImpl { + private fun convertEnumEntry(enumEntry: LighterASTNode, classWrapper: ClassWrapper): FirProperty { var modifiers = Modifier() lateinit var identifier: String var hasInitializerList = false val enumSuperTypeCallEntry = mutableListOf() - val firDeclarations = mutableListOf() var classBodyNode: LighterASTNode? = null enumEntry.forEachChildren { when (it.tokenType) { @@ -535,32 +534,46 @@ class DeclarationsConverter( } val enumEntryName = identifier.nameAsSafeName() - return withChildClassName(enumEntryName) { - val firEnumEntry = FirEnumEntryImpl( + return FirPropertyImpl( + null, + session, + classWrapper.delegatedSelfTypeRef, + receiverTypeRef = null, + name = enumEntryName, + initializer = FirAnonymousObjectImpl( null, session, - enumEntryName, + ClassKind.ENUM_ENTRY, scopeProvider, - FirRegularClassSymbol(context.currentClassId) - ) - firEnumEntry.annotations += modifiers.annotations - - val defaultDelegatedSuperTypeRef = implicitAnyType - - val enumClassWrapper = ClassWrapper( - enumEntryName, modifiers, ClassKind.ENUM_ENTRY, hasPrimaryConstructor = true, - hasSecondaryConstructor = classBodyNode.getChildNodesByType(SECONDARY_CONSTRUCTOR).isNotEmpty(), - delegatedSelfTypeRef = null.toDelegatedSelfType(firEnumEntry), - delegatedSuperTypeRef = if (hasInitializerList) classWrapper.getFirUserTypeFromClassName() else defaultDelegatedSuperTypeRef, - superTypeCallEntry = enumSuperTypeCallEntry - ) - firEnumEntry.superTypeRefs += enumClassWrapper.delegatedSuperTypeRef - convertPrimaryConstructor(null, enumClassWrapper)?.let { firEnumEntry.addDeclaration(it.firConstructor) } - classBodyNode?.also { firDeclarations += convertClassBody(it, enumClassWrapper) } - firDeclarations.forEach { firEnumEntry.addDeclaration(it) } - - return@withChildClassName firEnumEntry - } + FirAnonymousObjectSymbol() + ).apply { + annotations += modifiers.annotations + val enumClassWrapper = ClassWrapper( + enumEntryName, modifiers, ClassKind.ENUM_ENTRY, hasPrimaryConstructor = true, + hasSecondaryConstructor = classBodyNode.getChildNodesByType(SECONDARY_CONSTRUCTOR).isNotEmpty(), + delegatedSelfTypeRef = FirResolvedTypeRefImpl( + null, + ConeClassLikeTypeImpl( + symbol.toLookupTag(), + emptyArray(), + isNullable = false + ) + ), + delegatedSuperTypeRef = classWrapper.delegatedSelfTypeRef, + superTypeCallEntry = enumSuperTypeCallEntry + ) + superTypeRefs += enumClassWrapper.delegatedSuperTypeRef + convertPrimaryConstructor(null, enumClassWrapper)?.let { declarations += it.firConstructor } + classBodyNode?.also { declarations += convertClassBody(it, enumClassWrapper) } + }, + delegate = null, + isVar = false, + symbol = FirPropertySymbol(CallableId(context.currentClassId, enumEntryName)), + isLocal = false, + status = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.FINAL).apply { + isStatic = true + } + ) } /** @@ -686,7 +699,13 @@ class DeclarationsConverter( } val delegatedSelfTypeRef = - if (classWrapper.isObjectLiteral()) FirErrorTypeRefImpl(null, FirSimpleDiagnostic("Constructor in object", DiagnosticKind.ConstructorInObject)) + if (classWrapper.isObjectLiteral()) FirErrorTypeRefImpl( + null, + FirSimpleDiagnostic( + "Constructor in object", + DiagnosticKind.ConstructorInObject + ) + ) else classWrapper.delegatedSelfTypeRef val status = FirDeclarationStatusImpl(modifiers.getVisibility(), Modality.FINAL).apply { @@ -827,7 +846,8 @@ class DeclarationsConverter( val parentNode = property.getParent() val isLocal = !(parentNode?.tokenType == KT_FILE || parentNode?.tokenType == CLASS_BODY) return if (isLocal) { - val receiver = delegateExpression?.let { expressionConverter.getAsFirExpression(it, "Incorrect delegate expression") } + val receiver = + delegateExpression?.let { expressionConverter.getAsFirExpression(it, "Incorrect delegate expression") } FirPropertyImpl( null, session, @@ -895,7 +915,8 @@ class DeclarationsConverter( private fun convertDestructingDeclaration(destructingDeclaration: LighterASTNode): DestructuringDeclaration { var isVar = false val entries = mutableListOf>() - var firExpression: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("Destructuring declaration without initializer", DiagnosticKind.Syntax)) + var firExpression: FirExpression = + FirErrorExpressionImpl(null, FirSimpleDiagnostic("Destructuring declaration without initializer", DiagnosticKind.Syntax)) destructingDeclaration.forEachChildren { when (it.tokenType) { VAR_KEYWORD -> isVar = true @@ -1297,7 +1318,8 @@ class DeclarationsConverter( NULLABLE_TYPE -> firType = convertNullableType(it) FUNCTION_TYPE -> firType = convertFunctionType(it) DYNAMIC_TYPE -> firType = FirDynamicTypeRefImpl(null, false) - TokenType.ERROR_ELEMENT -> firType = FirErrorTypeRefImpl(null, FirSimpleDiagnostic("Unwrapped type is null", DiagnosticKind.Syntax)) + TokenType.ERROR_ELEMENT -> firType = + FirErrorTypeRefImpl(null, FirSimpleDiagnostic("Unwrapped type is null", DiagnosticKind.Syntax)) } } diff --git a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 066d5b79830..f21a5f16fb7 100644 --- a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -137,6 +137,7 @@ class RawFirBuilder(session: FirSession, val scopeProvider: FirScopeProvider, va owner, hasPrimaryConstructor ) + is KtEnumEntry -> toFirEnumEntry(delegatedSelfType!!) else -> convert() } } @@ -321,7 +322,10 @@ class RawFirBuilder(session: FirSession, val scopeProvider: FirScopeProvider, va } private fun KtClassOrObject.extractSuperTypeListEntriesTo( - container: FirModifiableClass<*>, delegatedSelfTypeRef: FirTypeRef?, classKind: ClassKind + container: FirModifiableClass<*>, + delegatedSelfTypeRef: FirTypeRef?, + delegatedEnumSuperTypeRef: FirTypeRef?, + classKind: ClassKind ): FirTypeRef? { var superTypeCallEntry: KtSuperTypeCallEntry? = null var delegatedSuperTypeRef: FirTypeRef? = null @@ -367,7 +371,13 @@ class RawFirBuilder(session: FirSession, val scopeProvider: FirScopeProvider, va } } - val defaultDelegatedSuperTypeRef = implicitAnyType + val defaultDelegatedSuperTypeRef = + when { + classKind == ClassKind.ENUM_ENTRY && this is KtClass -> delegatedEnumSuperTypeRef ?: implicitAnyType + else -> implicitAnyType + } + + if (container.superTypeRefs.isEmpty()) { container.superTypeRefs += defaultDelegatedSuperTypeRef } @@ -454,27 +464,45 @@ class RawFirBuilder(session: FirSession, val scopeProvider: FirScopeProvider, va return firFile } - override fun visitEnumEntry(enumEntry: KtEnumEntry, data: Unit): FirElement { - return withChildClassName(enumEntry.nameAsSafeName) { - val firEnumEntry = FirEnumEntryImpl( - enumEntry.toFirSourceElement(), - session, - enumEntry.nameAsSafeName, - scopeProvider, - FirRegularClassSymbol(context.currentClassId) + private fun KtEnumEntry.toFirEnumEntry(delegatedEnumSelfTypeRef: FirTypeRef): FirDeclaration { + val obj = FirAnonymousObjectImpl( + source = toFirSourceElement(), + session, + ClassKind.ENUM_ENTRY, + scopeProvider, + FirAnonymousObjectSymbol() + ) + val delegatedEntrySelfType = + FirResolvedTypeRefImpl(source = null, ConeClassLikeTypeImpl(obj.symbol.toLookupTag(), emptyArray(), isNullable = false)) + + extractSuperTypeListEntriesTo(obj, delegatedEntrySelfType, delegatedEnumSelfTypeRef, ClassKind.ENUM_ENTRY) + + for (declaration in declarations) { + obj.declarations += declaration.toFirDeclaration( + delegatedEnumSelfTypeRef, + delegatedSelfType = null, + this, + hasPrimaryConstructor = false ) - enumEntry.extractAnnotationsTo(firEnumEntry) - val delegatedSelfType = enumEntry.toDelegatedSelfType(firEnumEntry) - val delegatedSuperType = enumEntry.extractSuperTypeListEntriesTo(firEnumEntry, delegatedSelfType, ClassKind.ENUM_ENTRY) - for (declaration in enumEntry.declarations) { - firEnumEntry.addDeclaration( - declaration.toFirDeclaration( - delegatedSuperType, delegatedSelfType, enumEntry, hasPrimaryConstructor = true - ) - ) - } - firEnumEntry } + + return FirPropertyImpl( + source = toFirSourceElement(), + session, + delegatedEnumSelfTypeRef, + receiverTypeRef = null, + name = nameAsSafeName, + initializer = obj, + delegate = null, + isVar = false, + isLocal = false, + status = FirDeclarationStatusImpl( + Visibilities.PUBLIC, Modality.FINAL + ).apply { + isStatic = true + }, + symbol = FirPropertySymbol(callableIdForName(nameAsSafeName)) + ) } override fun visitClassOrObject(classOrObject: KtClassOrObject, data: Unit): FirElement { @@ -525,7 +553,7 @@ class RawFirBuilder(session: FirSession, val scopeProvider: FirScopeProvider, va classOrObject.extractAnnotationsTo(firClass) classOrObject.extractTypeParametersTo(firClass) val delegatedSelfType = classOrObject.toDelegatedSelfType(firClass) - val delegatedSuperType = classOrObject.extractSuperTypeListEntriesTo(firClass, delegatedSelfType, classKind) + val delegatedSuperType = classOrObject.extractSuperTypeListEntriesTo(firClass, delegatedSelfType, null, classKind) val primaryConstructor = classOrObject.primaryConstructor val firPrimaryConstructor = firClass.declarations.firstOrNull() as? FirConstructor if (primaryConstructor != null && firPrimaryConstructor != null) { @@ -568,9 +596,11 @@ class RawFirBuilder(session: FirSession, val scopeProvider: FirScopeProvider, va override fun visitObjectLiteralExpression(expression: KtObjectLiteralExpression, data: Unit): FirElement { val objectDeclaration = expression.objectDeclaration return withChildClassName(ANONYMOUS_OBJECT_NAME) { - FirAnonymousObjectImpl(expression.toFirSourceElement(), session, scopeProvider, FirAnonymousObjectSymbol()).apply { + FirAnonymousObjectImpl( + expression.toFirSourceElement(), session, ClassKind.OBJECT, scopeProvider, FirAnonymousObjectSymbol() + ).apply { objectDeclaration.extractAnnotationsTo(this) - objectDeclaration.extractSuperTypeListEntriesTo(this, null, ClassKind.CLASS) + objectDeclaration.extractSuperTypeListEntriesTo(this, null, null, ClassKind.CLASS) this.typeRef = superTypeRefs.first() // TODO for (declaration in objectDeclaration.declarations) { diff --git a/compiler/fir/psi2fir/testData/rawBuilder/declarations/enums.txt b/compiler/fir/psi2fir/testData/rawBuilder/declarations/enums.txt index 2ea8aa1b2ec..b157b30d4c2 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/declarations/enums.txt +++ b/compiler/fir/psi2fir/testData/rawBuilder/declarations/enums.txt @@ -4,27 +4,33 @@ FILE: enums.kt super() } - public? final enum entry FIRST : R|kotlin/Any| { - public? constructor(): R|Order.FIRST| { - super() + public final static val FIRST: R|Order| = object : R|Order| { + public? constructor(): R|Order| { + super() } } - public? final enum entry SECOND : R|kotlin/Any| { - public? constructor(): R|Order.SECOND| { - super() + + + public final static val SECOND: R|Order| = object : R|Order| { + public? constructor(): R|Order| { + super() } } - public? final enum entry THIRD : R|kotlin/Any| { - public? constructor(): R|Order.THIRD| { - super() + + + public final static val THIRD: R|Order| = object : R|Order| { + public? constructor(): R|Order| { + super() } } + + public final static fun values(): R|kotlin/Array| { } @@ -43,8 +49,8 @@ FILE: enums.kt internal final? val r: Double = R|/r| internal get(): Double - public? final enum entry MERCURY : Planet { - public? constructor(): R|Planet.MERCURY| { + public final static val MERCURY: R|Planet| = object : Planet { + public? constructor(): Planet { super(Double(1.0), Double(2.0)) } @@ -54,8 +60,10 @@ FILE: enums.kt } - public? final enum entry VENERA : Planet { - public? constructor(): R|Planet.VENERA| { + + + public final static val VENERA: R|Planet| = object : Planet { + public? constructor(): Planet { super(Double(3.0), Double(4.0)) } @@ -65,8 +73,10 @@ FILE: enums.kt } - public? final enum entry EARTH : Planet { - public? constructor(): R|Planet.EARTH| { + + + public final static val EARTH: R|Planet| = object : Planet { + public? constructor(): Planet { super(Double(5.0), Double(6.0)) } @@ -76,6 +86,8 @@ FILE: enums.kt } + + public? final? val g: Double = G#.times#(m#).div#(r#.times#(r#)) public? get(): Double diff --git a/compiler/fir/psi2fir/testData/rawBuilder/declarations/enums2.txt b/compiler/fir/psi2fir/testData/rawBuilder/declarations/enums2.txt index 08874233cd5..94134c6576b 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/declarations/enums2.txt +++ b/compiler/fir/psi2fir/testData/rawBuilder/declarations/enums2.txt @@ -21,8 +21,8 @@ FILE: enums2.kt public? final? val x: Some = R|/x| public? get(): Some - public? final enum entry FIRST : SomeEnum { - public? constructor(): R|SomeEnum.FIRST| { + public final static val FIRST: R|SomeEnum| = object : SomeEnum { + public? constructor(): SomeEnum { super(O1#) } @@ -32,8 +32,10 @@ FILE: enums2.kt } - public? final enum entry SECOND : SomeEnum { - public? constructor(): R|SomeEnum.SECOND| { + + + public final static val SECOND: R|SomeEnum| = object : SomeEnum { + public? constructor(): SomeEnum { super(O2#) } @@ -43,6 +45,8 @@ FILE: enums2.kt } + + public? abstract fun check(y: Some): Boolean public final static fun values(): R|kotlin/Array| { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/AbstractAnnotationDeserializer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/AbstractAnnotationDeserializer.kt index 2dd00d92514..a68d6f3fa4c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/AbstractAnnotationDeserializer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/AbstractAnnotationDeserializer.kt @@ -8,6 +8,8 @@ package org.jetbrains.kotlin.fir.deserialization import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirConstructor +import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.declarations.collectEnumEntries import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall @@ -19,7 +21,6 @@ import org.jetbrains.kotlin.fir.resolve.constructType import org.jetbrains.kotlin.fir.resolve.diagnostics.FirUnresolvedSymbolError import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl -import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.impl.FirErrorTypeRefImpl @@ -133,10 +134,14 @@ abstract class AbstractAnnotationDeserializer( ENUM -> FirFunctionCallImpl(null).apply { val classId = nameResolver.getClassId(value.classId) val entryName = nameResolver.getName(value.enumValueId) - val entryClassId = classId.createNestedClassId(entryName) - val entryLookupTag = ConeClassLikeLookupTagImpl(entryClassId) - val entrySymbol = entryLookupTag.toSymbol(this@AbstractAnnotationDeserializer.session) - this.calleeReference = entrySymbol?.let { + + + val enumLookupTag = ConeClassLikeLookupTagImpl(classId) + val enumSymbol = enumLookupTag.toSymbol(this@AbstractAnnotationDeserializer.session) + val firClass = enumSymbol?.fir as? FirRegularClass + val enumEntries = firClass?.collectEnumEntries() ?: emptyList() + val enumEntrySymbol = enumEntries.find { it.callableId.callableName == entryName } + this.calleeReference = enumEntrySymbol?.let { FirResolvedNamedReferenceImpl(null, entryName, it) } ?: FirErrorNamedReferenceImpl( null, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt index 5d7ed07c622..e2bc4ad9dad 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt @@ -5,7 +5,9 @@ package org.jetbrains.kotlin.fir.deserialization +import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.addDeclarations @@ -14,7 +16,11 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl import org.jetbrains.kotlin.fir.declarations.impl.FirEnumEntryImpl import org.jetbrains.kotlin.fir.declarations.impl.FirSealedClassImpl import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider +import org.jetbrains.kotlin.fir.declarations.impl.* +import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl +import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousObjectSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl @@ -121,19 +127,34 @@ fun deserializeClassToSymbol( addDeclarations( classProto.enumEntryList.mapNotNull { enumEntryProto -> val enumEntryName = nameResolver.getName(enumEntryProto.name) - val enumEntryId = classId.createNestedClassId(enumEntryName) - val symbol = FirRegularClassSymbol(enumEntryId) - FirEnumEntryImpl(null, session, enumEntryId.shortClassName, scopeProvider, symbol).apply { - resolvePhase = FirResolvePhase.DECLARATIONS - superTypeRefs += FirResolvedTypeRefImpl( + val enumType = ConeClassLikeTypeImpl(symbol.toLookupTag(), emptyArray(), false) + val property = FirPropertyImpl( + null, + session, + FirResolvedTypeRefImpl(null, enumType), + null, + enumEntryName, + initializer = FirAnonymousObjectImpl( null, - ConeClassLikeTypeImpl(ConeClassLikeLookupTagImpl(classId), emptyArray(), false) - ) + session, + classKind = ClassKind.ENUM_ENTRY, + symbol = FirAnonymousObjectSymbol() + ).apply { + superTypeRefs += FirResolvedTypeRefImpl(source = null, type = enumType) + }, + delegate = null, + isVar = false, + symbol = FirPropertySymbol(CallableId(classId, enumEntryName)), + isLocal = false, + status = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.FINAL).apply { + isStatic = true + } + ).apply { + resolvePhase = FirResolvePhase.DECLARATIONS } - - symbol.fir + property } ) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt index 852ed786f1f..0c119fccfd5 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt @@ -317,19 +317,14 @@ fun BodyResolveComponents.typeForQualifier(resolvedQualifier: FirResolvedQualifi val classId = resolvedQualifier.classId val resultType = resolvedQualifier.resultType if (classId != null) { - val classSymbol = symbolProvider.getClassLikeSymbolByFqName(classId)!! + val classSymbol = symbolProvider.getClassLikeSymbolByFqName(classId) + ?: return FirErrorTypeRefImpl(source = null, diagnostic = FirSimpleDiagnostic("No type for qualifier", DiagnosticKind.Other)) val declaration = classSymbol.phasedFir typeForQualifierByDeclaration(declaration, resultType)?.let { return it } - if (declaration is FirRegularClass && declaration.classKind == ClassKind.ENUM_ENTRY) { - val enumClassSymbol = symbolProvider.getClassLikeSymbolByFqName(classSymbol.classId.outerClassId!!)!! - return resultType.resolvedTypeFromPrototype( - enumClassSymbol.constructType(emptyArray(), false) - ) - } } // TODO: Handle no value type here return resultType.resolvedTypeFromPrototype( - session.builtinTypes.unitType.type//StandardClassIds.Unit(symbolProvider).constructType(emptyArray(), isNullable = false) + session.builtinTypes.unitType.type ) } @@ -408,15 +403,9 @@ private fun BodyResolveComponents.typeFromSymbol(symbol: AbstractFirBasedSymbol< is FirClassifierSymbol<*> -> { val fir = (symbol as? AbstractFirBasedSymbol<*>)?.phasedFir // TODO: unhack - if (fir is FirEnumEntry) { - (fir.superTypeRefs.firstOrNull() as? FirResolvedTypeRef) ?: FirErrorTypeRefImpl( - null, - FirSimpleDiagnostic("No enum item supertype", DiagnosticKind.EnumAsSupertype) - ) - } else - FirResolvedTypeRefImpl( - null, symbol.constructType(emptyArray(), isNullable = false) - ) + FirResolvedTypeRefImpl( + null, symbol.constructType(emptyArray(), isNullable = false) + ) } else -> error("WTF ! $symbol") } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt index bfce95fe743..767c6408985 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt @@ -85,30 +85,16 @@ class FirLibrarySymbolProviderImpl(val session: FirSession, val kotlinScopeProvi parentContext: FirDeserializationContext? = null ): FirRegularClassSymbol? { val classIdExists = classId in classDataFinder.allClassIds - val shouldBeEnumEntry = !classIdExists && classId.outerClassId in classDataFinder.allClassIds - if (!classIdExists && !shouldBeEnumEntry) return null - if (shouldBeEnumEntry) { - val outerClassData = classDataFinder.findClassData(classId.outerClassId!!)!! - val outerClassProto = outerClassData.classProto - if (outerClassProto.enumEntryList.none { nameResolver.getName(it.name) == classId.shortClassName }) { - return null - } - } + if (!classIdExists) return null return lookup.getOrPut(classId, { FirRegularClassSymbol(classId) }) { symbol -> - if (shouldBeEnumEntry) { - FirEnumEntryImpl(null, session, classId.shortClassName, kotlinScopeProvider, symbol).apply { - resolvePhase = FirResolvePhase.DECLARATIONS - } - } else { - val classData = classDataFinder.findClassData(classId)!! - val classProto = classData.classProto + val classData = classDataFinder.findClassData(classId)!! + val classProto = classData.classProto - deserializeClassToSymbol( - classId, classProto, symbol, nameResolver, session, - null, kotlinScopeProvider, parentContext, - this::findAndDeserializeClass - ) - } + deserializeClassToSymbol( + classId, classProto, symbol, nameResolver, session, + null, kotlinScopeProvider, parentContext, + this::findAndDeserializeClass + ) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt index 0f685509acc..f8737fe0465 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt @@ -133,7 +133,6 @@ class FirStatusResolveTransformer : FirAbstractTreeTransformer Modality.FINAL is FirRegularClass -> if (classKind == ClassKind.INTERFACE) Modality.ABSTRACT else Modality.FINAL is FirCallableMemberDeclaration<*> -> { when { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirWhenExhaustivenessTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirWhenExhaustivenessTransformer.kt index 77e82b5fd48..88131348da9 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirWhenExhaustivenessTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirWhenExhaustivenessTransformer.kt @@ -11,12 +11,14 @@ import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.impl.FirElseIfTrueCondition +import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.firSymbolProvider import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.types.ConeLookupTagBasedType import org.jetbrains.kotlin.fir.types.ConeNullability import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef @@ -72,16 +74,16 @@ class FirWhenExhaustivenessTransformer(private val bodyResolveComponents: BodyRe private fun checkEnumExhaustiveness(whenExpression: FirWhenExpression, enum: FirRegularClass, nullable: Boolean): Boolean { val data = EnumExhaustivenessData( - enum.collectEnumEntries().associateByTo(mutableMapOf(), { it.classId }, { false }), + enum.collectEnumEntries().toMutableSet(), !nullable ) for (branch in whenExpression.branches) { branch.condition.accept(EnumExhaustivenessVisitor, data) } - return data.containsNull && data.visitedEntries.values.all { it } + return data.containsNull && data.remainingEntries.isEmpty() } - private class EnumExhaustivenessData(val visitedEntries: MutableMap, var containsNull: Boolean) + private class EnumExhaustivenessData(val remainingEntries: MutableSet, var containsNull: Boolean) private object EnumExhaustivenessVisitor : FirVisitor() { override fun visitElement(element: FirElement, data: EnumExhaustivenessData) {} @@ -94,9 +96,11 @@ class FirWhenExhaustivenessTransformer(private val bodyResolveComponents: BodyRe data.containsNull = true } } - is FirResolvedQualifier -> { - val classId = argument.classId ?: return - data.visitedEntries.replace(classId, true) + is FirQualifiedAccessExpression -> { + val reference = argument.calleeReference as? FirResolvedNamedReference ?: return + val symbol = reference.resolvedSymbol + if (symbol is FirPropertySymbol) + data.remainingEntries.remove(symbol) } } } @@ -115,18 +119,18 @@ class FirWhenExhaustivenessTransformer(private val bodyResolveComponents: BodyRe if (sealedClass.inheritors.isEmpty()) return true val data = SealedExhaustivenessData( sealedClass.session.firSymbolProvider, - sealedClass.inheritors.associateByTo(mutableMapOf(), { it }, { false }), + sealedClass.inheritors.toMutableSet(), !nullable ) for (branch in whenExpression.branches) { branch.condition.accept(SealedExhaustivenessVisitor, data) } - return data.containsNull && data.visitedInheritors.values.all { it } + return data.containsNull && data.remainingInheritors.isEmpty() } private class SealedExhaustivenessData( val symbolProvider: FirSymbolProvider, - val visitedInheritors: MutableMap, + val remainingInheritors: MutableSet, var containsNull: Boolean ) @@ -151,7 +155,7 @@ class FirWhenExhaustivenessTransformer(private val bodyResolveComponents: BodyRe override fun visitResolvedTypeRef(resolvedTypeRef: FirResolvedTypeRef, data: SealedExhaustivenessData) { val lookupTag = (resolvedTypeRef.type as? ConeLookupTagBasedType)?.lookupTag ?: return val symbol = data.symbolProvider.getSymbolByLookupTag(lookupTag) as? FirClassSymbol ?: return - data.visitedInheritors.replace(symbol.classId, true) + data.remainingInheritors.remove(symbol.classId) } override fun visitBinaryLogicExpression(binaryLogicExpression: FirBinaryLogicExpression, data: SealedExhaustivenessData) { diff --git a/compiler/fir/resolve/testData/builtIns/kotlin.txt b/compiler/fir/resolve/testData/builtIns/kotlin.txt index f4b7d93065d..abc9a3b0d0c 100644 --- a/compiler/fir/resolve/testData/builtIns/kotlin.txt +++ b/compiler/fir/resolve/testData/builtIns/kotlin.txt @@ -365,15 +365,21 @@ public abstract interface Comparable : R|kotlin/Any| { public final enum class DeprecationLevel : R|kotlin/Enum| { private constructor(): R|kotlin/DeprecationLevel| - public? final enum entry WARNING : R|kotlin/DeprecationLevel| { + public final static val WARNING: R|kotlin/DeprecationLevel| = object : R|kotlin/DeprecationLevel| { } - public? final enum entry ERROR : R|kotlin/DeprecationLevel| { + + + public final static val ERROR: R|kotlin/DeprecationLevel| = object : R|kotlin/DeprecationLevel| { } - public? final enum entry HIDDEN : R|kotlin/DeprecationLevel| { + + + public final static val HIDDEN: R|kotlin/DeprecationLevel| = object : R|kotlin/DeprecationLevel| { } + + } public final class Double : R|kotlin/Number|, R|kotlin/Comparable| { diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/AnnotationInAnnotationArguments.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/AnnotationInAnnotationArguments.txt index a5750a385a4..05e3b95d06a 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/AnnotationInAnnotationArguments.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/AnnotationInAnnotationArguments.txt @@ -6,9 +6,11 @@ public final enum class E : R|kotlin/Enum| { private constructor(): R|test/E| - public? final enum entry ENTRY : R|test/E| { + public final static val ENTRY: R|test/E| = object : R|test/E| { } + + } public final annotation class EnumOption : R|kotlin/Annotation| { @@ -37,3 +39,4 @@ public final annotation class StringOptions : R|kotlin/Annotation| { public constructor(vararg option: R|kotlin/Array|): R|test/StringOptions| } + diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/EnumArgumentWithCustomToString.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/EnumArgumentWithCustomToString.txt index ecec0b40234..6a6166e6cd6 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/EnumArgumentWithCustomToString.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/EnumArgumentWithCustomToString.txt @@ -1,9 +1,11 @@ public final enum class E : R|kotlin/Enum| { private constructor(): R|test/E| - public? final enum entry CAKE : R|test/E| { + public final static val CAKE: R|test/E| = object : R|test/E| { } + + } public final annotation class EnumAnno : R|kotlin/Annotation| { @@ -28,3 +30,4 @@ public final annotation class EnumArrayAnno : R|kotlin/Annotation| { public constructor(vararg value: R|kotlin/Array|): R|test/EnumArrayAnno| } + diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/classMembers/EnumEntry.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/classMembers/EnumEntry.txt index 67ceddcfedd..02acb2f9b3f 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/classMembers/EnumEntry.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/classMembers/EnumEntry.txt @@ -17,17 +17,25 @@ public final annotation class Bnno : R|kotlin/Annotation| { public final enum class Eee : R|kotlin/Enum| { private constructor(): R|test/Eee| - public? final enum entry Entry1 : R|test/Eee| { + public final static val Entry1: R|test/Eee| = object : R|test/Eee| { } - public? final enum entry Entry2 : R|test/Eee| { + + + public final static val Entry2: R|test/Eee| = object : R|test/Eee| { } - public? final enum entry Entry3 : R|test/Eee| { + + + public final static val Entry3: R|test/Eee| = object : R|test/Eee| { } - public? final enum entry Entry4 : R|test/Eee| { + + + public final static val Entry4: R|test/Eee| = object : R|test/Eee| { } + + } diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/enum/EnumVisibility.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/enum/EnumVisibility.txt index 7c7e4c48359..d5a2f7a1611 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/enum/EnumVisibility.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/enum/EnumVisibility.txt @@ -1,24 +1,30 @@ internal final enum class In : R|kotlin/Enum| { private constructor(): R|test/In| - public? final enum entry A : R|test/In| { + public final static val A: R|test/In| = object : R|test/In| { } + + } private final enum class Pr : R|kotlin/Enum| { private constructor(): R|test/Pr| - public? final enum entry A : R|test/Pr| { + public final static val A: R|test/Pr| = object : R|test/Pr| { } + + } public final enum class Pu : R|kotlin/Enum| { private constructor(): R|test/Pu| - public? final enum entry A : R|test/Pu| { + public final static val A: R|test/Pu| = object : R|test/Pu| { } + + } diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/enum/EnumWithConstuctor.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/enum/EnumWithConstuctor.txt index eecfb153297..eb33e62efc9 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/enum/EnumWithConstuctor.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/enum/EnumWithConstuctor.txt @@ -7,14 +7,20 @@ public final enum class En : R|kotlin/Enum| { private constructor(b: R|kotlin/Boolean| = STUB, i: R|kotlin/Int| = STUB): R|test/En| - public? final enum entry E1 : R|test/En| { + public final static val E1: R|test/En| = object : R|test/En| { } - public? final enum entry E2 : R|test/En| { + + + public final static val E2: R|test/En| = object : R|test/En| { } - public? final enum entry E3 : R|test/En| { + + + public final static val E3: R|test/En| = object : R|test/En| { } + + } diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/enum/EnumWithInnerClasses.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/enum/EnumWithInnerClasses.txt index c8df448f338..5ddb2d18ffb 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/enum/EnumWithInnerClasses.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/enum/EnumWithInnerClasses.txt @@ -19,11 +19,15 @@ public final enum class Enum : R|kotlin/Enum| { public abstract interface Trait : R|kotlin/Any| { } - public? final enum entry ENTRY1 : R|test/Enum| { + public final static val ENTRY1: R|test/Enum| = object : R|test/Enum| { } - public? final enum entry ENTRY2 : R|test/Enum| { + + + public final static val ENTRY2: R|test/Enum| = object : R|test/Enum| { } + + } diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/enum/InnerEnum.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/enum/InnerEnum.txt index 5918a71c59c..6dd1c2dcee2 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/enum/InnerEnum.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/enum/InnerEnum.txt @@ -4,9 +4,11 @@ public final class A : R|kotlin/Any| { public final enum class E : R|kotlin/Enum| { private constructor(): R|test/A.E| - public? final enum entry ENTRY : R|test/A.E| { + public final static val ENTRY: R|test/A.E| = object : R|test/A.E| { } + + } } diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/enum/InnerEnumExistingClassObject.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/enum/InnerEnumExistingClassObject.txt index 900d10f73a4..e9c23c1a12b 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/enum/InnerEnumExistingClassObject.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/enum/InnerEnumExistingClassObject.txt @@ -9,9 +9,11 @@ public final class A : R|kotlin/Any| { public final enum class E : R|kotlin/Enum| { private constructor(): R|test/A.E| - public? final enum entry ENTRY : R|test/A.E| { + public final static val ENTRY: R|test/A.E| = object : R|test/A.E| { } + + } } diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/enum/SimpleEnum.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/enum/SimpleEnum.txt index 9b3524871ce..1dd253b5e3a 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/enum/SimpleEnum.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/enum/SimpleEnum.txt @@ -1,8 +1,10 @@ public final enum class MyEnum : R|kotlin/Enum| { private constructor(): R|test/MyEnum| - public? final enum entry ENTRY : R|test/MyEnum| { + public final static val ENTRY: R|test/MyEnum| = object : R|test/MyEnum| { } + + } diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/fromLoadJava/Enum.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/fromLoadJava/Enum.txt index 3d88643fec0..3349d028408 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/fromLoadJava/Enum.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/fromLoadJava/Enum.txt @@ -1,11 +1,15 @@ public final enum class Test : R|kotlin/Enum| { private constructor(a: R|kotlin/Int|): R|test/Test| - public? final enum entry A : R|test/Test| { + public final static val A: R|test/Test| = object : R|test/Test| { } - public? final enum entry B : R|test/Test| { + + + public final static val B: R|test/Test| = object : R|test/Test| { } + + } diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/memberOrder/EnumEntries.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/memberOrder/EnumEntries.txt index 6f7d7629a23..3fc79999b53 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/memberOrder/EnumEntries.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/memberOrder/EnumEntries.txt @@ -1,29 +1,45 @@ public final enum class E : R|kotlin/Enum| { private constructor(): R|test/E| - public? final enum entry ONE : R|test/E| { + public final static val ONE: R|test/E| = object : R|test/E| { } - public? final enum entry TWO : R|test/E| { + + + public final static val TWO: R|test/E| = object : R|test/E| { } - public? final enum entry THREE : R|test/E| { + + + public final static val THREE: R|test/E| = object : R|test/E| { } - public? final enum entry FOUR : R|test/E| { + + + public final static val FOUR: R|test/E| = object : R|test/E| { } - public? final enum entry FIVE : R|test/E| { + + + public final static val FIVE: R|test/E| = object : R|test/E| { } - public? final enum entry SIX : R|test/E| { + + + public final static val SIX: R|test/E| = object : R|test/E| { } - public? final enum entry SEVEN : R|test/E| { + + + public final static val SEVEN: R|test/E| = object : R|test/E| { } - public? final enum entry EIGHT : R|test/E| { + + + public final static val EIGHT: R|test/E| = object : R|test/E| { } + + } diff --git a/compiler/fir/resolve/testData/resolve/enum.txt b/compiler/fir/resolve/testData/resolve/enum.txt index da37e08aa07..4f1c6bb8d40 100644 --- a/compiler/fir/resolve/testData/resolve/enum.txt +++ b/compiler/fir/resolve/testData/resolve/enum.txt @@ -21,8 +21,8 @@ FILE: enum.kt public final val x: R|Some| = R|/x| public get(): R|Some| - public final enum entry FIRST : R|SomeEnum| { - public constructor(): R|SomeEnum.FIRST| { + public final static val FIRST: R|SomeEnum| = object : R|SomeEnum| { + private constructor(): R|anonymous| { super(Q|O1|) } @@ -32,8 +32,10 @@ FILE: enum.kt } - public final enum entry SECOND : R|SomeEnum| { - public constructor(): R|SomeEnum.SECOND| { + + + public final static val SECOND: R|SomeEnum| = object : R|SomeEnum| { + private constructor(): R|anonymous| { super(Q|O2|) } @@ -43,6 +45,8 @@ FILE: enum.kt } + + public abstract fun check(y: R|Some|): R|kotlin/Boolean| public final static fun values(): R|kotlin/Array| { diff --git a/compiler/fir/resolve/testData/resolve/enumWithCompanion.txt b/compiler/fir/resolve/testData/resolve/enumWithCompanion.txt index 6d631b9347d..d7ee5170e39 100644 --- a/compiler/fir/resolve/testData/resolve/enumWithCompanion.txt +++ b/compiler/fir/resolve/testData/resolve/enumWithCompanion.txt @@ -4,20 +4,24 @@ FILE: enumWithCompanion.kt super() } - public final enum entry A : R|kotlin/Any| { - public constructor(): R|EC.A| { - super() + public final static val A: R|EC| = object : R|EC| { + private constructor(): R|anonymous| { + super() } } - public final enum entry B : R|kotlin/Any| { - public constructor(): R|EC.B| { - super() + + + public final static val B: R|EC| = object : R|EC| { + private constructor(): R|anonymous| { + super() } } + + public final companion object Companion : R|kotlin/Any| { private constructor(): R|EC.Companion| { super() @@ -25,10 +29,10 @@ FILE: enumWithCompanion.kt public final fun u(ec: R|EC|): R|kotlin/Boolean| { ^u when (R|/ec|) { - ==($subj$, Q|EC.A|) -> { + ==($subj$, R|/EC.A|) -> { Boolean(true) } - ==($subj$, Q|EC.B|) -> { + ==($subj$, R|/EC.B|) -> { Boolean(false) } } diff --git a/compiler/fir/resolve/testData/resolve/exhaustiveness_enum.txt b/compiler/fir/resolve/testData/resolve/exhaustiveness_enum.txt index eba42512082..c91623738d7 100644 --- a/compiler/fir/resolve/testData/resolve/exhaustiveness_enum.txt +++ b/compiler/fir/resolve/testData/resolve/exhaustiveness_enum.txt @@ -4,27 +4,33 @@ FILE: exhaustiveness_enum.kt super() } - public final enum entry A : R|kotlin/Any| { - public constructor(): R|Enum.A| { - super() + public final static val A: R|Enum| = object : R|Enum| { + private constructor(): R|anonymous| { + super() } } - public final enum entry B : R|kotlin/Any| { - public constructor(): R|Enum.B| { - super() + + + public final static val B: R|Enum| = object : R|Enum| { + private constructor(): R|anonymous| { + super() } } - public final enum entry C : R|kotlin/Any| { - public constructor(): R|Enum.C| { - super() + + + public final static val C: R|Enum| = object : R|Enum| { + private constructor(): R|anonymous| { + super() } } + + public final static fun values(): R|kotlin/Array| { } @@ -34,19 +40,19 @@ FILE: exhaustiveness_enum.kt } public final fun test_1(e: R|Enum|): R|kotlin/Unit| { lval a: R|kotlin/Unit| = when (R|/e|) { - ==($subj$, Q|Enum.A|) -> { + ==($subj$, Q|Enum|.R|/Enum.A|) -> { Int(1) } - ==($subj$, Q|Enum.B|) -> { + ==($subj$, Q|Enum|.R|/Enum.B|) -> { Int(2) } } lval b: R|kotlin/Unit| = when (R|/e|) { - ==($subj$, Q|Enum.A|) -> { + ==($subj$, Q|Enum|.R|/Enum.A|) -> { Int(1) } - ==($subj$, Q|Enum.B|) -> { + ==($subj$, Q|Enum|.R|/Enum.B|) -> { Int(2) } ($subj$ is R|kotlin/String|) -> { @@ -55,19 +61,19 @@ FILE: exhaustiveness_enum.kt } lval c: R|kotlin/Int| = when (R|/e|) { - ==($subj$, Q|Enum.A|) -> { + ==($subj$, Q|Enum|.R|/Enum.A|) -> { Int(1) } - ==($subj$, Q|Enum.B|) -> { + ==($subj$, Q|Enum|.R|/Enum.B|) -> { Int(2) } - ==($subj$, Q|Enum.C|) -> { + ==($subj$, Q|Enum|.R|/Enum.C|) -> { Int(3) } } lval d: R|kotlin/Int| = when (R|/e|) { - ==($subj$, Q|Enum.A|) -> { + ==($subj$, Q|Enum|.R|/Enum.A|) -> { Int(1) } else -> { @@ -78,25 +84,25 @@ FILE: exhaustiveness_enum.kt } public final fun test_2(e: R|Enum?|): R|kotlin/Unit| { lval a: R|kotlin/Unit| = when (R|/e|) { - ==($subj$, Q|Enum.A|) -> { + ==($subj$, Q|Enum|.R|/Enum.A|) -> { Int(1) } - ==($subj$, Q|Enum.B|) -> { + ==($subj$, Q|Enum|.R|/Enum.B|) -> { Int(2) } - ==($subj$, Q|Enum.C|) -> { + ==($subj$, Q|Enum|.R|/Enum.C|) -> { Int(3) } } lval a: R|kotlin/Int| = when (R|/e|) { - ==($subj$, Q|Enum.A|) -> { + ==($subj$, Q|Enum|.R|/Enum.A|) -> { Int(1) } - ==($subj$, Q|Enum.B|) -> { + ==($subj$, Q|Enum|.R|/Enum.B|) -> { Int(2) } - ==($subj$, Q|Enum.C|) -> { + ==($subj$, Q|Enum|.R|/Enum.C|) -> { Int(3) } ==($subj$, Null(null)) -> { @@ -105,13 +111,13 @@ FILE: exhaustiveness_enum.kt } lval a: R|kotlin/Int| = when (R|/e|) { - ==($subj$, Q|Enum.A|) -> { + ==($subj$, Q|Enum|.R|/Enum.A|) -> { Int(1) } - ==($subj$, Q|Enum.B|) -> { + ==($subj$, Q|Enum|.R|/Enum.B|) -> { Int(2) } - ==($subj$, Q|Enum.C|) -> { + ==($subj$, Q|Enum|.R|/Enum.C|) -> { Int(3) } else -> { @@ -122,10 +128,10 @@ FILE: exhaustiveness_enum.kt } public final fun test_3(e: R|Enum|): R|kotlin/Unit| { lval a: R|kotlin/Int| = when (R|/e|) { - ==($subj$, Q|Enum.A|) || ==($subj$, Q|Enum.B|) -> { + ==($subj$, Q|Enum|.R|/Enum.A|) || ==($subj$, Q|Enum|.R|/Enum.B|) -> { Int(1) } - ==($subj$, Q|Enum.C|) -> { + ==($subj$, Q|Enum|.R|/Enum.C|) -> { Int(2) } } diff --git a/compiler/fir/resolve/testData/resolve/expresssions/enumValues.txt b/compiler/fir/resolve/testData/resolve/expresssions/enumValues.txt index 20074e81a63..2e4547f5a34 100644 --- a/compiler/fir/resolve/testData/resolve/expresssions/enumValues.txt +++ b/compiler/fir/resolve/testData/resolve/expresssions/enumValues.txt @@ -4,27 +4,33 @@ FILE: enumValues.kt super() } - public final enum entry FIRST : R|kotlin/Any| { - public constructor(): R|MyEnum.FIRST| { - super() + public final static val FIRST: R|MyEnum| = object : R|MyEnum| { + private constructor(): R|anonymous| { + super() } } - public final enum entry SECOND : R|kotlin/Any| { - public constructor(): R|MyEnum.SECOND| { - super() + + + public final static val SECOND: R|MyEnum| = object : R|MyEnum| { + private constructor(): R|anonymous| { + super() } } - public final enum entry LAST : R|kotlin/Any| { - public constructor(): R|MyEnum.LAST| { - super() + + + public final static val LAST: R|MyEnum| = object : R|MyEnum| { + private constructor(): R|anonymous| { + super() } } + + public final fun bar(): R|kotlin/Int| { ^bar Int(42) } diff --git a/compiler/fir/resolve/testData/resolve/expresssions/qualifiedExpressions.txt b/compiler/fir/resolve/testData/resolve/expresssions/qualifiedExpressions.txt index 87f9923057e..efc6a8e5d3a 100644 --- a/compiler/fir/resolve/testData/resolve/expresssions/qualifiedExpressions.txt +++ b/compiler/fir/resolve/testData/resolve/expresssions/qualifiedExpressions.txt @@ -33,13 +33,15 @@ FILE: qualifiedExpressions.kt super() } - public final enum entry entry : R|kotlin/Any| { - public constructor(): R|a/b/E.entry| { - super() + public final static val entry: R|a/b/E| = object : R|a/b/E| { + private constructor(): R|anonymous| { + super() } } + + public final static fun values(): R|kotlin/Array| { } @@ -58,6 +60,6 @@ FILE: qualifiedExpressions.kt lval x: R|kotlin/Int| = Q|a/b|.R|a/b/f| Q|a/b/C|.R|a/b/C.Companion.foo|() R|a/b/C.C|().R|a/b/C.foo|() - lval e: R|a/b/E| = Q|a/b/E.entry| - lval e1: R|a/b/E| = Q|a/b/E.entry| + lval e: R|a/b/E| = Q|a/b/E|.R|a/b/E.entry| + lval e1: R|a/b/E| = Q|a/b/E|.R|a/b/E.entry| } diff --git a/compiler/fir/resolve/testData/resolve/fromBuilder/enums.txt b/compiler/fir/resolve/testData/resolve/fromBuilder/enums.txt index fc5c658517b..1c990484ca6 100644 --- a/compiler/fir/resolve/testData/resolve/fromBuilder/enums.txt +++ b/compiler/fir/resolve/testData/resolve/fromBuilder/enums.txt @@ -4,27 +4,33 @@ FILE: enums.kt super() } - public final enum entry FIRST : R|kotlin/Any| { - public constructor(): R|Order.FIRST| { - super() + public final static val FIRST: R|Order| = object : R|Order| { + private constructor(): R|anonymous| { + super() } } - public final enum entry SECOND : R|kotlin/Any| { - public constructor(): R|Order.SECOND| { - super() + + + public final static val SECOND: R|Order| = object : R|Order| { + private constructor(): R|anonymous| { + super() } } - public final enum entry THIRD : R|kotlin/Any| { - public constructor(): R|Order.THIRD| { - super() + + + public final static val THIRD: R|Order| = object : R|Order| { + private constructor(): R|anonymous| { + super() } } + + public final static fun values(): R|kotlin/Array| { } @@ -43,8 +49,8 @@ FILE: enums.kt internal final val r: R|kotlin/Double| = R|/r| internal get(): R|kotlin/Double| - public final enum entry MERCURY : R|Planet| { - public constructor(): R|Planet.MERCURY| { + public final static val MERCURY: R|Planet| = object : R|Planet| { + private constructor(): R|anonymous| { super(Double(1.0), Double(2.0)) } @@ -54,8 +60,10 @@ FILE: enums.kt } - public final enum entry VENERA : R|Planet| { - public constructor(): R|Planet.VENERA| { + + + public final static val VENERA: R|Planet| = object : R|Planet| { + private constructor(): R|anonymous| { super(Double(3.0), Double(4.0)) } @@ -65,8 +73,10 @@ FILE: enums.kt } - public final enum entry EARTH : R|Planet| { - public constructor(): R|Planet.EARTH| { + + + public final static val EARTH: R|Planet| = object : R|Planet| { + private constructor(): R|anonymous| { super(Double(5.0), Double(6.0)) } @@ -76,6 +86,8 @@ FILE: enums.kt } + + public final val g: R|kotlin/Double| = R|/Planet.Companion.G|.R|kotlin/Double.times|(R|/m|).R|kotlin/Double.div|(R|/r|.R|kotlin/Double.times|(R|/r|)) public get(): R|kotlin/Double| diff --git a/compiler/fir/resolve/testData/resolve/multifile/Annotations.txt b/compiler/fir/resolve/testData/resolve/multifile/Annotations.txt index 9be8f2fbed9..59d328481ac 100644 --- a/compiler/fir/resolve/testData/resolve/multifile/Annotations.txt +++ b/compiler/fir/resolve/testData/resolve/multifile/Annotations.txt @@ -1,5 +1,5 @@ FILE: annotations.kt - @R|kotlin/annotation/Target|(Q|kotlin/annotation/AnnotationTarget.FILE|, Q|kotlin/annotation/AnnotationTarget.FUNCTION|, Q|kotlin/annotation/AnnotationTarget.TYPE|, Q|kotlin/annotation/AnnotationTarget.PROPERTY_GETTER|) public final annotation class Simple : R|kotlin/Annotation| { + @R|kotlin/annotation/Target|(Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.FILE|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.FUNCTION|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.TYPE|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.PROPERTY_GETTER|) public final annotation class Simple : R|kotlin/Annotation| { public constructor(): R|annotations/Simple| { super() } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirEnumEntry.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirEnumEntry.kt deleted file mode 100644 index 07d269354d6..00000000000 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirEnumEntry.kt +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.fir.declarations - -import org.jetbrains.kotlin.descriptors.ClassKind -import org.jetbrains.kotlin.fir.FirPureAbstractElement -import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.FirSourceElement -import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall -import org.jetbrains.kotlin.fir.expressions.FirExpression -import org.jetbrains.kotlin.fir.scopes.FirScopeProvider -import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol -import org.jetbrains.kotlin.fir.types.FirTypeRef -import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.fir.visitors.* - -/* - * This file was generated automatically - * DO NOT MODIFY IT MANUALLY - */ - -abstract class FirEnumEntry : FirPureAbstractElement(), FirRegularClass { - abstract override val source: FirSourceElement? - abstract override val session: FirSession - abstract override val resolvePhase: FirResolvePhase - abstract override val name: Name - abstract override val annotations: List - abstract override val typeParameters: List - abstract override val status: FirDeclarationStatus - abstract override val classKind: ClassKind - abstract override val declarations: List - abstract override val scopeProvider: FirScopeProvider - abstract override val symbol: FirRegularClassSymbol - abstract override val companionObject: FirRegularClass? - abstract override val superTypeRefs: List - abstract val arguments: List - abstract val typeRef: FirTypeRef - - override fun accept(visitor: FirVisitor, data: D): R = visitor.visitEnumEntry(this, data) - - abstract override fun transformStatus(transformer: FirTransformer, data: D): FirEnumEntry - - abstract fun transformArguments(transformer: FirTransformer, data: D): FirEnumEntry -} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousObjectImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousObjectImpl.kt index 1b1daa48d4e..311a411ea69 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousObjectImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousObjectImpl.kt @@ -27,11 +27,11 @@ import org.jetbrains.kotlin.fir.visitors.* class FirAnonymousObjectImpl( override val source: FirSourceElement?, override val session: FirSession, + override val classKind: ClassKind, override val scopeProvider: FirScopeProvider, override val symbol: FirAnonymousObjectSymbol ) : FirAnonymousObject(), FirModifiableClass, FirAbstractAnnotatedElement { override var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR - override val classKind: ClassKind get() = ClassKind.OBJECT override val superTypeRefs: MutableList = mutableListOf() override val declarations: MutableList = mutableListOf() override val annotations: MutableList = mutableListOf() diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirEnumEntryImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirEnumEntryImpl.kt deleted file mode 100644 index e60e2a0c25c..00000000000 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirEnumEntryImpl.kt +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.fir.declarations.impl - -import org.jetbrains.kotlin.descriptors.ClassKind -import org.jetbrains.kotlin.descriptors.Modality -import org.jetbrains.kotlin.descriptors.Visibilities -import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.FirSourceElement -import org.jetbrains.kotlin.fir.declarations.FirDeclaration -import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus -import org.jetbrains.kotlin.fir.declarations.FirEnumEntry -import org.jetbrains.kotlin.fir.declarations.FirRegularClass -import org.jetbrains.kotlin.fir.declarations.FirResolvePhase -import org.jetbrains.kotlin.fir.declarations.FirTypeParameter -import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall -import org.jetbrains.kotlin.fir.expressions.FirExpression -import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement -import org.jetbrains.kotlin.fir.scopes.FirScopeProvider -import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol -import org.jetbrains.kotlin.fir.types.FirTypeRef -import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.fir.visitors.* - -/* - * This file was generated automatically - * DO NOT MODIFY IT MANUALLY - */ - -class FirEnumEntryImpl( - override val source: FirSourceElement?, - override val session: FirSession, - override val name: Name, - override val scopeProvider: FirScopeProvider, - override val symbol: FirRegularClassSymbol -) : FirEnumEntry(), FirModifiableClass, FirModifiableTypeParametersOwner, FirAbstractAnnotatedElement { - override var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR - override val annotations: MutableList = mutableListOf() - override val typeParameters: MutableList = mutableListOf() - override var status: FirDeclarationStatus = FirDeclarationStatusImpl(Visibilities.UNKNOWN, Modality.FINAL) - override val classKind: ClassKind get() = ClassKind.ENUM_ENTRY - override val declarations: MutableList = mutableListOf() - override val companionObject: FirRegularClass? get() = null - override val superTypeRefs: MutableList = mutableListOf() - override val arguments: MutableList = mutableListOf() - override var typeRef: FirTypeRef = session.builtinTypes.enumType - - init { - symbol.bind(this) - } - - override fun acceptChildren(visitor: FirVisitor, data: D) { - annotations.forEach { it.accept(visitor, data) } - typeParameters.forEach { it.accept(visitor, data) } - status.accept(visitor, data) - declarations.forEach { it.accept(visitor, data) } - superTypeRefs.forEach { it.accept(visitor, data) } - arguments.forEach { it.accept(visitor, data) } - typeRef.accept(visitor, data) - } - - override fun transformChildren(transformer: FirTransformer, data: D): FirEnumEntryImpl { - annotations.transformInplace(transformer, data) - typeParameters.transformInplace(transformer, data) - transformStatus(transformer, data) - declarations.transformInplace(transformer, data) - superTypeRefs.transformInplace(transformer, data) - transformArguments(transformer, data) - typeRef = typeRef.transformSingle(transformer, data) - return this - } - - override fun transformStatus(transformer: FirTransformer, data: D): FirEnumEntryImpl { - status = status.transformSingle(transformer, data) - return this - } - - override fun transformArguments(transformer: FirTransformer, data: D): FirEnumEntryImpl { - arguments.transformInplace(transformer, data) - return this - } - - override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) { - resolvePhase = newResolvePhase - } - - override fun replaceSuperTypeRefs(newSuperTypeRefs: List) { - superTypeRefs.clear() - superTypeRefs.addAll(newSuperTypeRefs) - } -} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt index 84f80dd7907..c5be21b0d7b 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt @@ -38,7 +38,6 @@ import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirSealedClass import org.jetbrains.kotlin.fir.declarations.FirTypeAlias -import org.jetbrains.kotlin.fir.declarations.FirEnumEntry import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirContractDescriptionOwner import org.jetbrains.kotlin.fir.declarations.FirMemberFunction @@ -258,10 +257,6 @@ abstract class FirTransformer : FirVisitor { - return transformElement(enumEntry, data) - } - open fun > transformFunction(function: FirFunction, data: D): CompositeTransformResult { return transformElement(function, data) } @@ -714,10 +709,6 @@ abstract class FirTransformer : FirVisitor { - return transformEnumEntry(enumEntry, data) - } - final override fun > visitFunction(function: FirFunction, data: D): CompositeTransformResult { return transformFunction(function, data) } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt index 6ab6f4bc12d..381ef012219 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt @@ -38,7 +38,6 @@ import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirSealedClass import org.jetbrains.kotlin.fir.declarations.FirTypeAlias -import org.jetbrains.kotlin.fir.declarations.FirEnumEntry import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirContractDescriptionOwner import org.jetbrains.kotlin.fir.declarations.FirMemberFunction @@ -192,8 +191,6 @@ abstract class FirVisitor { open fun visitTypeAlias(typeAlias: FirTypeAlias, data: D): R = visitElement(typeAlias, data) - open fun visitEnumEntry(enumEntry: FirEnumEntry, data: D): R = visitElement(enumEntry, data) - open fun > visitFunction(function: FirFunction, data: D): R = visitElement(function, data) open fun visitContractDescriptionOwner(contractDescriptionOwner: FirContractDescriptionOwner, data: D): R = visitElement(contractDescriptionOwner, data) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt index ad851bacd7a..134a57e19bc 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt @@ -38,7 +38,6 @@ import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirSealedClass import org.jetbrains.kotlin.fir.declarations.FirTypeAlias -import org.jetbrains.kotlin.fir.declarations.FirEnumEntry import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirContractDescriptionOwner import org.jetbrains.kotlin.fir.declarations.FirMemberFunction @@ -256,10 +255,6 @@ abstract class FirVisitorVoid : FirVisitor() { visitElement(typeAlias) } - open fun visitEnumEntry(enumEntry: FirEnumEntry) { - visitElement(enumEntry) - } - open fun > visitFunction(function: FirFunction) { visitElement(function) } @@ -712,10 +707,6 @@ abstract class FirVisitorVoid : FirVisitor() { visitTypeAlias(typeAlias) } - final override fun visitEnumEntry(enumEntry: FirEnumEntry, data: Nothing?) { - visitEnumEntry(enumEntry) - } - final override fun > visitFunction(function: FirFunction, data: Nothing?) { visitFunction(function) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt index c9c19729c55..fadf7521424 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -272,9 +272,6 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() { ) } - override fun visitEnumEntry(enumEntry: FirEnumEntry) { - visitRegularClass(enumEntry) - } private fun List.renderDeclarations() { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt index 62598d37c7d..8036b0132ef 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt @@ -6,11 +6,11 @@ package org.jetbrains.kotlin.fir.declarations import org.jetbrains.kotlin.descriptors.ClassKind -import org.jetbrains.kotlin.fir.declarations.impl.FirEnumEntryImpl import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableRegularClass import org.jetbrains.kotlin.fir.declarations.impl.FirTypeParameterImpl import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousObjectSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.coneTypeSafe @@ -55,9 +55,6 @@ fun FirModifiableRegularClass.addDeclarations(declarations: Collection.superConeTypes val FirClass<*>.superConeTypes get() = superTypeRefs.mapNotNull { it.coneTypeSafe() } -fun FirRegularClass.collectEnumEntries(): Collection { +fun FirRegularClass.collectEnumEntries(): Collection { assert(classKind == ClassKind.ENUM_CLASS) - return declarations.filterIsInstance() + return declarations + .mapNotNull { + if (it !is FirProperty) return@mapNotNull null + val initializer = it.initializer + if (initializer == null || initializer !is FirAnonymousObject || initializer.classKind != ClassKind.ENUM_ENTRY) + return@mapNotNull null + return@mapNotNull it.symbol + } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirDefaultTransformer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirDefaultTransformer.kt index 1873761ae5d..e0ef9e8d536 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirDefaultTransformer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirDefaultTransformer.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.fir.visitors -import org.jetbrains.kotlin.fir.declarations.FirEnumEntry import org.jetbrains.kotlin.fir.declarations.FirErrorFunction import org.jetbrains.kotlin.fir.declarations.FirSealedClass import org.jetbrains.kotlin.fir.expressions.* @@ -73,9 +72,6 @@ abstract class FirDefaultTransformer : FirTransformer() { return transformJump(breakExpression, data) } - override fun transformEnumEntry(enumEntry: FirEnumEntry, data: D): CompositeTransformResult { - return transformRegularClass(enumEntry, data) - } override fun transformLambdaArgumentExpression(lambdaArgumentExpression: FirLambdaArgumentExpression, data: D): CompositeTransformResult { return transformWrappedArgumentExpression(lambdaArgumentExpression, data) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt index 27ad53b61cf..01f85029e28 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.fir.visitors -import org.jetbrains.kotlin.fir.declarations.FirEnumEntry import org.jetbrains.kotlin.fir.declarations.FirErrorFunction import org.jetbrains.kotlin.fir.declarations.FirSealedClass import org.jetbrains.kotlin.fir.expressions.* @@ -69,9 +68,6 @@ abstract class FirDefaultVisitor : FirVisitor() { return visitJump(breakExpression, data) } - override fun visitEnumEntry(enumEntry: FirEnumEntry, data: D): R { - return visitRegularClass(enumEntry, data) - } override fun visitLambdaArgumentExpression(lambdaArgumentExpression: FirLambdaArgumentExpression, data: D): R { return visitWrappedArgumentExpression(lambdaArgumentExpression, data) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt index d1194462382..9182a442946 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.fir.visitors -import org.jetbrains.kotlin.fir.declarations.FirEnumEntry import org.jetbrains.kotlin.fir.declarations.FirErrorFunction import org.jetbrains.kotlin.fir.declarations.FirSealedClass import org.jetbrains.kotlin.fir.expressions.* @@ -69,9 +68,6 @@ abstract class FirDefaultVisitorVoid : FirVisitorVoid() { return visitJump(breakExpression) } - override fun visitEnumEntry(enumEntry: FirEnumEntry) { - return visitRegularClass(enumEntry) - } override fun visitLambdaArgumentExpression(lambdaArgumentExpression: FirLambdaArgumentExpression) { return visitWrappedArgumentExpression(lambdaArgumentExpression) diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt index 35405265dc6..637f216747f 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt @@ -45,7 +45,6 @@ object FirTreeBuilder : AbstractFirTreeBuilder() { val regularClass = element("RegularClass", Declaration, memberDeclaration, typeParametersOwner, klass) val sealedClass = element("SealedClass", Declaration, regularClass) val typeAlias = element("TypeAlias", Declaration, classLikeDeclaration, memberDeclaration, typeParametersOwner) - val enumEntry = element("EnumEntry", Declaration, regularClass) val function = element("Function", Declaration, callableDeclaration, controlFlowGraphOwner, targetElement, annotationContainer, typeParametersOwner, statement) diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt index 83af6ed5e43..be7d47afcd8 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt @@ -67,27 +67,8 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() impl(anonymousObject) { parents += modifiableClass.withArg(anonymousObject) - default("classKind") { - value = "ClassKind.OBJECT" - withGetter = true - } } - impl(enumEntry) { - parents += modifiableClass.withArg(regularClass) - parents += modifiableTypeParametersOwner - default("status", "FirDeclarationStatusImpl(Visibilities.UNKNOWN, Modality.FINAL)") - default("classKind") { - value = "ClassKind.ENUM_ENTRY" - withGetter = true - } - default("companionObject") { - value = "null" - withGetter = true - } - default("typeRef", "session.builtinTypes.enumType") - useTypes(visibilitiesType, modalityType) - } impl(typeAlias) { parents += modifiableTypeParametersOwner diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt index add06098ce2..01551f900f0 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt @@ -243,11 +243,6 @@ object NodeConfigurator : AbstractFieldConfigurator() { +annotations } - enumEntry.configure { - +arguments.withTransform() - +field(typeRef) - } - anonymousFunction.configure { parentArg(function, "F", anonymousFunction) +symbol("FirAnonymousFunctionSymbol") diff --git a/compiler/testData/diagnostics/tests/EnumEntryAsType.fir.kt b/compiler/testData/diagnostics/tests/EnumEntryAsType.fir.kt index cf9bf545942..17172e59b82 100644 --- a/compiler/testData/diagnostics/tests/EnumEntryAsType.fir.kt +++ b/compiler/testData/diagnostics/tests/EnumEntryAsType.fir.kt @@ -49,7 +49,7 @@ fun bar(a: Any): T = a as T fun foo() { foo() foo() - bar(Color.RED) + bar(Color.RED) } fun Array.foo(entries: Array): Array = null!! \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/classObjects/InnerClassAccessThroughEnum_after.fir.kt b/compiler/testData/diagnostics/tests/classObjects/InnerClassAccessThroughEnum_after.fir.kt index 999da4bb935..3ae1e157093 100644 --- a/compiler/testData/diagnostics/tests/classObjects/InnerClassAccessThroughEnum_after.fir.kt +++ b/compiler/testData/diagnostics/tests/classObjects/InnerClassAccessThroughEnum_after.fir.kt @@ -16,12 +16,12 @@ enum class C { E4 { fun c() { - this.B() + this.B() C.A() A() //TODO: should be resolved with error - this.A() + this.A() } }; @@ -45,6 +45,6 @@ fun f() { C.A() C.B() - C.E3.O_O - C.E3.G() + C.E3.O_O + C.E3.G() } diff --git a/compiler/testData/diagnostics/tests/classObjects/InnerClassAccessThroughEnum_before.fir.kt b/compiler/testData/diagnostics/tests/classObjects/InnerClassAccessThroughEnum_before.fir.kt index 278924145be..a4acf6fb5d0 100644 --- a/compiler/testData/diagnostics/tests/classObjects/InnerClassAccessThroughEnum_before.fir.kt +++ b/compiler/testData/diagnostics/tests/classObjects/InnerClassAccessThroughEnum_before.fir.kt @@ -16,12 +16,12 @@ enum class C { E4 { fun c() { - this.B() + this.B() C.A() A() //TODO: should be resolved with error - this.A() + this.A() } }; @@ -45,6 +45,6 @@ fun f() { C.A() C.B() - C.E3.O_O - C.E3.G() + C.E3.O_O + C.E3.G() } diff --git a/compiler/testData/diagnostics/tests/declarationChecks/kt1193.fir.kt b/compiler/testData/diagnostics/tests/declarationChecks/kt1193.fir.kt index b26f7fcbaf5..60dc7517f13 100644 --- a/compiler/testData/diagnostics/tests/declarationChecks/kt1193.fir.kt +++ b/compiler/testData/diagnostics/tests/declarationChecks/kt1193.fir.kt @@ -5,7 +5,7 @@ package kt1193 enum class MyEnum(val i: Int) { A(12), - B //no error + B //no error } open class A(x: Int = 1) diff --git a/compiler/testData/diagnostics/tests/enum/constructorWithDefaultParametersOnly.fir.kt b/compiler/testData/diagnostics/tests/enum/constructorWithDefaultParametersOnly.fir.kt index 3d010151b8d..0923425dd69 100644 --- a/compiler/testData/diagnostics/tests/enum/constructorWithDefaultParametersOnly.fir.kt +++ b/compiler/testData/diagnostics/tests/enum/constructorWithDefaultParametersOnly.fir.kt @@ -5,7 +5,7 @@ enum class TestOk(val x: String = "OK") { } enum class TestErrors(val x: String) { - TEST1, + TEST1, TEST2(), TEST3("Hello") } diff --git a/compiler/testData/diagnostics/tests/enum/dontCreatePackageTypeForEnumEntry_after.fir.kt b/compiler/testData/diagnostics/tests/enum/dontCreatePackageTypeForEnumEntry_after.fir.kt index 8df7a9447ca..a312890267b 100644 --- a/compiler/testData/diagnostics/tests/enum/dontCreatePackageTypeForEnumEntry_after.fir.kt +++ b/compiler/testData/diagnostics/tests/enum/dontCreatePackageTypeForEnumEntry_after.fir.kt @@ -13,4 +13,4 @@ fun f1() = E.FIRST.foo() fun f2() = E.FIRST.(foo)() fun f3() = E.SECOND.foo() fun f4() = E.SECOND.(foo)() -fun f5() = E.SECOND.A() +fun f5() = E.SECOND.A() diff --git a/compiler/testData/diagnostics/tests/enum/dontCreatePackageTypeForEnumEntry_before.fir.kt b/compiler/testData/diagnostics/tests/enum/dontCreatePackageTypeForEnumEntry_before.fir.kt index c3119941ccc..90a415dcc12 100644 --- a/compiler/testData/diagnostics/tests/enum/dontCreatePackageTypeForEnumEntry_before.fir.kt +++ b/compiler/testData/diagnostics/tests/enum/dontCreatePackageTypeForEnumEntry_before.fir.kt @@ -13,4 +13,4 @@ fun f1() = E.FIRST.foo() fun f2() = E.FIRST.(foo)() fun f3() = E.SECOND.foo() fun f4() = E.SECOND.(foo)() -fun f5() = E.SECOND.A() +fun f5() = E.SECOND.A() diff --git a/compiler/testData/diagnostics/tests/enum/interfaceWithEnumKeyword.fir.kt b/compiler/testData/diagnostics/tests/enum/interfaceWithEnumKeyword.fir.kt index 8db080692bf..880df713f12 100644 --- a/compiler/testData/diagnostics/tests/enum/interfaceWithEnumKeyword.fir.kt +++ b/compiler/testData/diagnostics/tests/enum/interfaceWithEnumKeyword.fir.kt @@ -1,6 +1,6 @@ enum interface Some { // Enum part - D; + D; // Interface like part fun test() diff --git a/compiler/testData/diagnostics/tests/inner/enumEntries.fir.kt b/compiler/testData/diagnostics/tests/inner/enumEntries.fir.kt index 7ff898c415a..713d8c9af1d 100644 --- a/compiler/testData/diagnostics/tests/inner/enumEntries.fir.kt +++ b/compiler/testData/diagnostics/tests/inner/enumEntries.fir.kt @@ -1,6 +1,6 @@ enum class E { E1 { - override fun foo() = outerFun() + super.outerFun() + override fun foo() = outerFun() + super.outerFun() }, E2 { override fun foo() = E1.foo() diff --git a/compiler/testData/diagnostics/tests/multiplatform/enum/constructorInHeaderEnum.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/enum/constructorInHeaderEnum.fir.kt index 635e8e827d5..6f5ed38c95b 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/enum/constructorInHeaderEnum.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/enum/constructorInHeaderEnum.fir.kt @@ -3,7 +3,7 @@ // FILE: common.kt expect enum class En(x: Int) { - E1, + E1, E2(42), ; diff --git a/compiler/testData/diagnostics/tests/redeclarations/SingletonAndFunctionSameName.fir.kt b/compiler/testData/diagnostics/tests/redeclarations/SingletonAndFunctionSameName.fir.kt index ee0f5f28a01..612aac4f372 100644 --- a/compiler/testData/diagnostics/tests/redeclarations/SingletonAndFunctionSameName.fir.kt +++ b/compiler/testData/diagnostics/tests/redeclarations/SingletonAndFunctionSameName.fir.kt @@ -17,5 +17,5 @@ enum class En { fun ENTRY() = 42 - fun SUBCLASS() = ENTRY() + fun SUBCLASS() = ENTRY() } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/constructorInObject.fir.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/constructorInObject.fir.kt index 6ed018c439c..d82fd198544 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/constructorInObject.fir.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/constructorInObject.fir.kt @@ -5,7 +5,7 @@ object A { enum class B { X() { - constructor() + constructor() } } diff --git a/compiler/testData/diagnostics/tests/typealias/enumEntryQualifier.fir.kt b/compiler/testData/diagnostics/tests/typealias/enumEntryQualifier.fir.kt index 95a0fd48338..cc49eb2ad50 100644 --- a/compiler/testData/diagnostics/tests/typealias/enumEntryQualifier.fir.kt +++ b/compiler/testData/diagnostics/tests/typealias/enumEntryQualifier.fir.kt @@ -3,4 +3,4 @@ enum class MyEnum { A } typealias TestAlias = MyEnum val test1 = MyEnum.A -val test2 = TestAlias.A \ No newline at end of file +val test2 = TestAlias.A \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/typealias/starImportOnTypeAlias.fir.kt b/compiler/testData/diagnostics/tests/typealias/starImportOnTypeAlias.fir.kt index 6634ae21081..373869f845c 100644 --- a/compiler/testData/diagnostics/tests/typealias/starImportOnTypeAlias.fir.kt +++ b/compiler/testData/diagnostics/tests/typealias/starImportOnTypeAlias.fir.kt @@ -25,6 +25,6 @@ import test.EnumAlias fun bar() { - Entry - EnumAlias.Entry + Entry + EnumAlias.Entry } \ No newline at end of file