[FIR] Support static getters along with fake Enum.entries declaration in FIR
#KT-48872
This commit is contained in:
committed by
Space
parent
45b89de9f4
commit
93f17a2b86
@@ -7,22 +7,24 @@ package org.jetbrains.kotlin.fir
|
||||
|
||||
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
||||
import org.jetbrains.kotlin.builtins.StandardNames.DEFAULT_VALUE_PARAMETER
|
||||
import org.jetbrains.kotlin.builtins.StandardNames.ENUM_ENTRIES
|
||||
import org.jetbrains.kotlin.builtins.StandardNames.ENUM_VALUES
|
||||
import org.jetbrains.kotlin.builtins.StandardNames.ENUM_VALUE_OF
|
||||
import org.jetbrains.kotlin.config.LanguageFeature
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.fakeElement
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirRegularClassBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.*
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildEmptyExpressionBlock
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
|
||||
@@ -114,6 +116,49 @@ fun FirRegularClassBuilder.generateValueOfFunction(
|
||||
}
|
||||
}
|
||||
|
||||
fun FirRegularClassBuilder.generateEntriesGetter(
|
||||
moduleData: FirModuleData, packageFqName: FqName, classFqName: FqName, makeExpect: Boolean = false
|
||||
) {
|
||||
if (!moduleData.session.languageVersionSettings.supportsFeature(LanguageFeature.EnumEntries)) {
|
||||
return
|
||||
}
|
||||
|
||||
val sourceElement = source?.fakeElement(KtFakeSourceElementKind.EnumGeneratedDeclaration)
|
||||
declarations += buildProperty {
|
||||
source = sourceElement
|
||||
isVar = false
|
||||
isLocal = false
|
||||
origin = FirDeclarationOrigin.Source
|
||||
this.moduleData = moduleData
|
||||
returnTypeRef = buildResolvedTypeRef {
|
||||
source = sourceElement
|
||||
type = ConeClassLikeTypeImpl(
|
||||
ConeClassLikeLookupTagImpl(StandardClassIds.EnumEntries),
|
||||
arrayOf(
|
||||
ConeClassLikeTypeImpl(this@generateEntriesGetter.symbol.toLookupTag(), emptyArray(), isNullable = false)
|
||||
),
|
||||
isNullable = false
|
||||
)
|
||||
}
|
||||
name = ENUM_ENTRIES
|
||||
this.status = createStatus(this@generateEntriesGetter.status).apply {
|
||||
isStatic = true
|
||||
isExpect = makeExpect
|
||||
}
|
||||
symbol = FirPropertySymbol(CallableId(packageFqName, classFqName, ENUM_ENTRIES))
|
||||
resolvePhase = FirResolvePhase.BODY_RESOLVE
|
||||
getter = FirDefaultPropertyGetter(
|
||||
sourceElement?.fakeElement(KtFakeSourceElementKind.EnumGeneratedDeclaration),
|
||||
moduleData, FirDeclarationOrigin.Source, returnTypeRef.copyWithNewSourceKind(KtFakeSourceElementKind.EnumGeneratedDeclaration),
|
||||
Visibilities.Public, symbol
|
||||
).apply {
|
||||
(status as FirDeclarationStatusImpl).isStatic = true
|
||||
}
|
||||
}.apply {
|
||||
containingClassForStaticMemberAttr = this@generateEntriesGetter.symbol.toLookupTag()
|
||||
}
|
||||
}
|
||||
|
||||
private fun createStatus(parentStatus: FirDeclarationStatus): FirDeclarationStatusImpl {
|
||||
val parentEffectiveVisibility = (parentStatus as? FirResolvedDeclarationStatusImpl)?.effectiveVisibility
|
||||
return if (parentEffectiveVisibility != null) {
|
||||
|
||||
+1
@@ -77,6 +77,7 @@ val FirProperty.hasBackingField: Boolean
|
||||
if (isAbstract) return false
|
||||
if (delegate != null) return false
|
||||
if (hasExplicitBackingField) return true
|
||||
if (isStatic) return false // For Enum.entries
|
||||
when (origin) {
|
||||
FirDeclarationOrigin.SubstitutionOverride -> return false
|
||||
FirDeclarationOrigin.IntersectionOverride -> return false
|
||||
|
||||
Reference in New Issue
Block a user